diff --git a/.Rbuildignore b/.Rbuildignore index 90264787..eaf615e4 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -5,18 +5,23 @@ ^cran-comments\.md$ ^README\.md$ ^README\.Rmd$ -^\.travis\.yml$ ^appveyor\.yml$ ^\_pkgdown\.yaml$ ^docs$ ^CODE_OF_CONDUCT\.md$ -^node_modules/$ -^node_modules/ -^node_modules/.* -^newfeatures/$ -^newfeatures/ -^newfeatures/.* +^node_modules$ +^bower_components$ +^newfeatures$ ^package\.json$ ^package-lock\.json$ +^data-raw$ +^codecov\.yml$ +^_pkgdown\.yml$ +^pkgdown$ +^\.github$ +^CRAN-RELEASE$ ^revdep$ -^bower_components$ +^HowTo\.html$ +^HowTo\.md$ +^HowTo\.rmd$ +^CRAN-SUBMISSION$ diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 00000000..2d19fc76 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +*.html diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md new file mode 100644 index 00000000..898687a4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_template.md @@ -0,0 +1,14 @@ +--- +name: Bug report or feature request +about: Describe a bug you've seen or make a case for a new feature +--- + +Please briefly describe your problem and what output you expect. If you have a question, please don't use this form. Instead, ask on or . + +Please include a minimal reproducible example (AKA a reprex). If you've never heard of a [reprex](http://reprex.tidyverse.org/) before, start by reading . + +Brief description of the problem + +```r +# insert reprex here +``` diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 00000000..6c979ff2 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,56 @@ +# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. +# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions +on: + push: + branches: + - main + - master + pull_request: + branches: + - main + - master + +name: R-CMD-check + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: windows-latest, r: 'release'} + - {os: macOS-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + args: 'c("--no-manual", "--as-cran")' + upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' + diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml new file mode 100644 index 00000000..57aba397 --- /dev/null +++ b/.github/workflows/pkgdown.yaml @@ -0,0 +1,48 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + release: + types: [published] + workflow_dispatch: + +name: pkgdown + +jobs: + pkgdown: + runs-on: ubuntu-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::pkgdown, local::. + needs: website + + - name: Build site + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) + shell: Rscript {0} + + - name: Deploy to GitHub pages ๐Ÿš€ + if: github.event_name != 'pull_request' + uses: JamesIves/github-pages-deploy-action@v4.4.1 + with: + clean: false + branch: gh-pages + folder: docs diff --git a/.gitignore b/.gitignore index fa032286..1c055fc8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ .Rproj.user newfeatures/ node_modules/ +docs/ +bower_components/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f633f265..00000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -# R for travis: see documentation at https://docs.travis-ci.com/user/languages/r - -language: R -cache: packages -sudo: required -dist: trusty - -r_packages: - - leaflet - -before_install: - - sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable --yes - - sudo apt-get --yes --force-yes update -qq - - sudo apt-get install --yes libudunits2-dev libproj-dev libgeos-dev libgdal-dev - - sudo ldconfig diff --git a/DESCRIPTION b/DESCRIPTION index 14a00fca..3e420059 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,29 +1,34 @@ Package: leaflet.extras2 Type: Package Title: Extra Functionality for 'leaflet' Package -Version: 1.0.0 +Version: 1.2.2.9000 Authors@R: c( - person("Gatscha", "Sebastian", email = "sebastian_gatscha@gmax.at", role = c("aut", "cre")) + person("Gatscha", "Sebastian", email = "sebastian_gatscha@gmx.at", role = c("aut", "cre")), + person("Ricardo Rodrigo", "Basa", email = "radbasa@gmail.com", role = c("ctb")), + person(c("Jeffrey", "O"), "Hanson", email = "jeffrey.hanson@uqconnect.edu.au", role = c("ctb"), comment = c(ORCID = "0000-0002-4716-6134")) ) -Description: This package serves as an add-on to the 'leaflet' package by - providing extra functionality via 'leaflet' plugins. +Description: Several 'leaflet' plugins are integrated, which are available as extension to the 'leaflet' package. License: GPL-3 | file LICENSE Encoding: UTF-8 LazyData: true Depends: - R (>= 3.1.0), + R (>= 3.5.0), leaflet (>= 2.0.0) Imports: - htmlwidgets, htmltools, - shiny, - jsonlite, - magrittr + magrittr, + utils Suggests: + jsonlite, + shiny, sf, + geojsonsf, sp, - testthat (>= 3.0.0) -URL: https://github.com/trafficonese/leaflet.extras2 + testthat (>= 2.1.0), + fontawesome, + htmlwidgets, + covr, + curl +URL: https://trafficonese.github.io/leaflet.extras2/, https://github.com/trafficonese/leaflet.extras2 BugReports: https://github.com/trafficonese/leaflet.extras2/issues RoxygenNote: 7.3.1 -Config/testthat/edition: 3 diff --git a/HowTo.md b/HowTo.md new file mode 100644 index 00000000..105e9fbe --- /dev/null +++ b/HowTo.md @@ -0,0 +1,42 @@ +## How to include a new plugin โ“ + +------ + +Fork this repo on your computer and create a **new branch** with the plugin name. + +The plugin [leaflet-arrowheads](https://github.com/slutske22/leaflet-arrowheads) will serve as example for this tutorial. + +1. Create a **new directory** in `./inst/htmlwidgets/` with the prefix `lfx-` and the plugin name. This snippet will do that for you: + + usethis::use_directory("/inst/htmlwidgets/lfx-arrowhead") + +2. Install the **dependencies** via `npm`/`bower` etc if available. If the package cannot be installed, either fork/download the plugin-repo or copy/paste the JavaScript code manually. This plugin can be installed and requires 2 dependencies. I installed them with: + + npm install leaflet-arrowheads --save + npm install leaflet-geometryutil --save +This will add the dependencies in the directory `./node_modules/`. Find the directories with the source files and copy those into the new directory `lfx-arrowhead`. In this case the files: **leaflet.geometryutil.js** and **leaflet-arrowheads.js** + +3. Create a **new R-file** with the name of the plugin in `./R/`. In this case `arrowhead.R` or copy/paste another R-file and rename it accordingly. I copy/pasted the `antpath.R` file and search/replaced `antpath` with `arrowhead` and `Antpath` with `Arrowhead` and adapted the functions and options according to the plugin. + +4. Add a **JavaScript-binding** file in the directory `/inst/htmlwidgets/lfx-arrowhead`. Look at other plugins and their bindings for references and examples. In the beginning I use a lot of `console.log()` and `debugger` statements in the JS-methods to get an idea what the data looks like, if all arguments are passed correctly, etc. In this case I also copy/pasted the file `lfx-ant-path-bindings.js`, renamed it `leaflet-arrowheads-bindings.js` and adapted the JavaScript code. +If the plugin exposes several methods, you can/should write an R-function for every JS-method. The R-function calls the JS-method with `invokeMethod` where the argument *method* should correspond to the JavaScript method you want to invoke. The arrowheads-plugin has the method **deleteArrowheads**. I used that method for two R and JS functions, one where you can remove the arrowheads by **group** (`clearArrowhead`) and one by **layerId** (`removeArrowhead`). In the JS methods `this` always refers to the map-object. If needed, you can also use the `LeafletWidget` object from R-leaflet and the `L` object by leaflet itself. + +5. Add an **example** in `./inst/examples/`. I use this directory to demonstrate/test the plugins in **ShinyApps**. Non-interactive examples go straight in the documentation of the function. + +6. Add a **test** in `./tests/testthat/` or use this function `usethis::use_test("arrowhead")` + +7. **Check** the package and run `devtools::test_coverage()` and try to test all R-code lines. โœ… +You can also check the coverage of just one file with `devtools::test_coverage_file(paste0(getwd(),"/tests/testthat/test-arrowhead.R"))`. You may have to load some libraries manually before that. + +8. Add the new plugin in the **README.md** with a link to the github repo. + +8. Add a short description in the **NEWS.md** file that this plugin is now available. + +9. Add the plugin in the `_pkgdown.yml` file and make sure it matches all functions. + +10. If everything works correctly, push it to your fork and **open a PR**. I will be happy to merge it as soon as possible! ๐Ÿ’š +๐Ÿคท If you're stuck somewhere in the process and you just can't get it to work, you can still open a PR and explain what the problem is. I will look into it. + +11. ๐ŸŽ‰ Celebrate and use it ๐Ÿ† + + diff --git a/NAMESPACE b/NAMESPACE index e768508e..21777dcf 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,45 +2,100 @@ S3method("[",leaflet_mapkey_icon_set) export(addAntpath) +export(addArrowhead) export(addBuildings) +export(addContextmenu) export(addEasyprint) +export(addGIBS) +export(addHeightgraph) export(addHexbin) +export(addHistory) +export(addItemContextmenu) +export(addLabelgun) +export(addLatLngMoving) +export(addLeafletsync) +export(addLeafletsyncDependency) export(addMapkeyMarkers) +export(addMovingMarker) export(addOpenweatherCurrent) export(addOpenweatherTiles) export(addPlayback) export(addReachability) export(addSidebar) export(addSidebyside) +export(addSpinner) +export(addStationMoving) export(addTangram) +export(addTimeslider) export(addVelocity) export(addWMS) export(antpathOptions) +export(arrowheadOptions) export(clearAntpath) +export(clearArrowhead) +export(clearFuture) export(clearHexbin) +export(clearHistory) export(closeSidebar) +export(context_mapmenuItems) +export(context_markermenuItems) +export(context_menuItem) +export(disableContextmenu) export(easyprintMap) export(easyprintOptions) +export(enableContextmenu) +export(goBackHistory) +export(goForwardHistory) +export(heightgraphOptions) export(hexbinOptions) +export(hideContextmenu) export(hideHexbin) +export(historyOptions) +export(insertItemContextmenu) +export(isSynced) +export(leafletsyncOptions) export(makeMapkeyIcon) export(mapkeyIconList) export(mapkeyIcons) +export(mapmenuItems) +export(markermenuItems) +export(menuItem) +export(moveToMoving) +export(movingMarkerOptions) export(openSidebar) +export(openweatherCurrentOptions) +export(openweatherOptions) +export(pauseMoving) export(playbackOptions) export(reachabilityOptions) export(removeAntpath) +export(removeArrowhead) export(removeEasyprint) +export(removeItemContextmenu) export(removePlayback) export(removeReachability) export(removeSidebar) export(removeSidebyside) +export(removeTimeslider) export(removeVelocity) +export(removeallItemsContextmenu) +export(resumeMoving) export(setBuildingData) export(setBuildingStyle) +export(setDate) +export(setDisabledContextmenu) +export(setOptionsVelocity) +export(setTransparent) +export(showContextmenu) export(showHexbin) export(sidebar_pane) export(sidebar_tabs) +export(startMoving) +export(startSpinner) +export(stopMoving) +export(stopSpinner) +export(timesliderOptions) +export(unsync) export(updateBuildingTime) export(updateHexbin) export(velocityOptions) @@ -49,8 +104,7 @@ importFrom(htmltools,htmlDependency) importFrom(htmltools,tagGetAttribute) importFrom(htmltools,tagList) importFrom(htmltools,tags) -importFrom(jsonlite,fromJSON) -importFrom(jsonlite,read_json) -importFrom(jsonlite,toJSON) importFrom(magrittr,"%>%") -importFrom(shiny,addResourcePath) +importFrom(utils,adist) +importFrom(utils,globalVariables) +importFrom(utils,packageVersion) diff --git a/R/antpath.R b/R/antpath.R index 8f0dc3eb..9bcb2215 100644 --- a/R/antpath.R +++ b/R/antpath.R @@ -1,7 +1,7 @@ antpathDependency <- function() { list( htmltools::htmlDependency( - "lfx-antpath", version = "2.1.0", + "lfx-antpath", version = "1.0.0", src = system.file("htmlwidgets/lfx-antpath", package = "leaflet.extras2"), script = c("lfx-ant-path.js", "lfx-ant-path-bindings.js") @@ -12,30 +12,38 @@ antpathDependency <- function() { #' Add Antpath Lines #' #' Can be used almost exactly like \code{addPolylines} but instead of -#' \code{pathOptions} you can use \code{\link{antpathOptions}}, to adapt the -#' Antpath behaviour. See \href{https://github.com/rubenspgcavalcante/leaflet-ant-path}{leaflet-ant-path} +#' \code{pathOptions} you can use \code{\link{antpathOptions}} to adapt the +#' Antpath behaviour. See +#' \href{https://github.com/rubenspgcavalcante/leaflet-ant-path}{leaflet-ant-path} #' for further details. #' #' @inheritParams leaflet::addPolylines #' @param options A named list of options. See \code{\link{antpathOptions}} -#' @family Antpath Plugin -#' @seealso https://github.com/rubenspgcavalcante/leaflet-ant-path +#' @family Antpath Functions +#' @references \url{https://github.com/rubenspgcavalcante/leaflet-ant-path} +#' @return A modified leaflet map, with an 'ant-path' animated polyline #' @export -addAntpath <- function(map, lng = NULL, lat = NULL, layerId = NULL, group = NULL, - stroke = TRUE, color = "#03F", weight = 5, opacity = 0.5, - fill = FALSE, fillColor = color, fillOpacity = 0.2, dashArray = NULL, - smoothFactor = 1, noClip = FALSE, popup = NULL, popupOptions = NULL, - label = NULL, labelOptions = NULL, options = antpathOptions(), - highlightOptions = NULL, data = getMapData(map)) { +#' @examples +#' library(leaflet) +#' leaflet() %>% +#' addAntpath(data = atlStorms2005) +addAntpath <- function(map, lng = NULL, lat = NULL, layerId = NULL, + group = NULL, stroke = TRUE, color = "#03F", weight = 5, + opacity = 0.5, fill = FALSE, fillColor = color, + fillOpacity = 0.2, dashArray = NULL, smoothFactor = 1, + noClip = FALSE, popup = NULL, popupOptions = NULL, + label = NULL, labelOptions = NULL, + options = antpathOptions(), highlightOptions = NULL, + data = getMapData(map)) { if (missing(labelOptions)) labelOptions <- labelOptions() options <- c(options, filterNULL( - list(stroke = stroke, color = color, - weight = weight, opacity = opacity, fill = fill, fillColor = fillColor, - fillOpacity = fillOpacity, dashArray = dashArray, smoothFactor = smoothFactor, - noClip = noClip))) + list(stroke = stroke, color = color, weight = weight, + opacity = opacity, fill = fill, fillColor = fillColor, + fillOpacity = fillOpacity, dashArray = dashArray, + smoothFactor = smoothFactor, noClip = noClip))) pgons <- derivePolygons(data, lng, lat, missing(lng), missing(lat), "addPolylines") @@ -50,6 +58,7 @@ addAntpath <- function(map, lng = NULL, lat = NULL, layerId = NULL, group = NULL #' Antpath Options #' +#' Additional list of options for 'ant-path' animated polylines. #' @inheritParams leaflet::pathOptions #' @param delay Add a delay to the animation flux. Default is \code{400} #' @param paused Should the animation be paused. Default is \code{FALSE} @@ -59,7 +68,8 @@ addAntpath <- function(map, lng = NULL, lat = NULL, layerId = NULL, group = NULL #' acceleration. Default is \code{FALSE} #' @param dashArray The size of the animated dashes. Default is \code{c(10, 20)} #' @param pulseColor Adds a color to the dashed flux. Default is \code{#ffffff} -#' @family Antpath Plugin +#' @family Antpath Functions +#' @return A list of options for \code{addAntpath} animated polylines #' @export antpathOptions = function( delay = 400, @@ -70,7 +80,8 @@ antpathOptions = function( pulseColor = "#ffffff", lineCap = NULL, lineJoin = NULL, interactive = TRUE, pointerEvents = NULL, - className = "") { + className = "", + ...) { filterNULL(list( delay = delay, @@ -83,21 +94,28 @@ antpathOptions = function( lineJoin = lineJoin, interactive = interactive, pointerEvents = pointerEvents, - className = className + className = className, + ... )) } +#' removeAntpath +#' #' Remove one or more Antpaths from a map, identified by \code{layerId}. #' @inheritParams leaflet::removeShape -#' @family Antpath Plugin +#' @family Antpath Functions +#' @inherit leaflet::removeShape return #' @export removeAntpath <- function(map, layerId = NULL) { invokeMethod(map, NULL, "removeAntpath", layerId) } +#' clearAntpath +#' #' Clear all Antpaths #' @inheritParams leaflet::clearShapes -#' @family Antpath Plugin +#' @family Antpath Functions +#' @inherit leaflet::clearShapes return #' @export clearAntpath <- function(map) { invokeMethod(map, NULL, "clearAntpath") diff --git a/R/arrowhead.R b/R/arrowhead.R new file mode 100644 index 00000000..0cbf0929 --- /dev/null +++ b/R/arrowhead.R @@ -0,0 +1,159 @@ +arrowheadDependency <- function() { + list( + htmltools::htmlDependency( + "lfx-arrowhead", version = "1.0.0", + src = system.file("htmlwidgets/lfx-arrowhead", package = "leaflet.extras2"), + script = c("leaflet.geometryutil.js", + "leaflet-arrowheads.js", + "leaflet-arrowheads-bindings.js") + ) + ) +} + +#' Add Lines with an arrowhead +#' +#' Can be used almost exactly like \code{addPolylines} but instead of +#' \code{pathOptions} you can use \code{\link{arrowheadOptions}}. See +#' \href{https://github.com/slutske22/leaflet-arrowheads}{leaflet-arrowheads} +#' for further details. +#' +#' @inheritParams leaflet::addPolylines +#' @param options A named list of options. See \code{\link{arrowheadOptions}} +#' @family Arrowhead Functions +#' @references \url{https://github.com/slutske22/leaflet-arrowheads} +#' @return A modified leaflet map with a polyline with arrowheads +#' @export +#' @examples +#' library(leaflet) +#' leaflet() %>% +#' addArrowhead(data = atlStorms2005) +addArrowhead <- function(map, lng = NULL, lat = NULL, layerId = NULL, + group = NULL, stroke = TRUE, color = "#03F", weight = 5, + opacity = 0.5, fill = FALSE, fillColor = color, + fillOpacity = 0.2, dashArray = NULL, smoothFactor = 1, + noClip = FALSE, popup = NULL, popupOptions = NULL, + label = NULL, labelOptions = NULL, + options = arrowheadOptions(), highlightOptions = NULL, + data = getMapData(map)) { + + if (missing(labelOptions)) + labelOptions <- labelOptions() + + arrowheadOptions <- options + options <- filterNULL( + c(list(stroke = stroke, color = color, weight = weight, + opacity = opacity, fill = fill, fillColor = fillColor, + fillOpacity = fillOpacity, dashArray = dashArray, + smoothFactor = smoothFactor, noClip = noClip), + arrowheadOptions)) + + + pgons <- derivePolygons(data, lng, lat, missing(lng), missing(lat), + "addPolylines") + + map$dependencies <- c(map$dependencies, arrowheadDependency()) + + invokeMethod(map, data, "addArrowhead", pgons, layerId, group, + options, popup, popupOptions, safeLabel(label, data), + labelOptions, highlightOptions, arrowheadOptions) %>% + expandLimitsBbox(pgons) +} + +#' Arrowhead Options +#' +#' Additional list of options for polylines with arrowheads. You can also pass +#' options inherited from +#' \href{https://leafletjs.com/reference.html#path}{L.Path} +#' +#' @param yawn Defines the width of the opening of the arrowhead, given in +#' degrees. The larger the angle, the wider the arrowhead. +#' @param size Determines the size of the arrowhead. Accepts three types of +#' values: +#' \itemize{ +#' \item A string with the suffix \code{'m'}, i.e. \code{'500m'} will set the +#' size of the arrowhead to that number of meters. +#' \item A string with the suffix \code{'\%'}, i.e. \code{'15\%'} will render +#' arrows whose size is that percentage of the size of the parent polyline. If +#' the polyline has multiple segments, it will take the percent of the +#' average size of the segments. +#' \item A string the suffix \code{'px'}, i.e. \code{'20px'} will render an +#' arrowhead whose size stays at a constant pixel value, regardless of zoom +#' level. Will look strange at low zoom levels or for smaller parent vectors. +#' Ideal for larger parent vectors and at higher zoom levels. +#' } +#' @param frequency How many arrowheads are rendered on a polyline. +#' \itemize{ +#' \item \code{'allvertices'} renders an arrowhead on each vertex. +#' \item \code{'endonly'} renders only one at the end. +#' \item A numeric value renders that number of arrowheads evenly spaced +#' along the polyline. +#' \item A string with suffix \code{'m'}, i.e. \code{'100m'} will render +#' arrowheads spaced evenly along the polyline with roughly that many meters +#' between each one. +#' \item A string with suffix \code{'px'}, i.e. \code{'30px'} will render +#' arrowheads spaced evenly with roughly that many pixels between each, +#' regardless of zoom level. } +#' @param proportionalToTotal Only relevant when size is given as a percent. +#' Useful when frequency is set to \code{'endonly'}. Will render the +#' arrowheads with a size proportional to the entire length of the +#' multi-segmented polyline, rather than proportional to the average length of +#' all the segments. +#' @param offsets Enables the developer to have the arrowheads start or end at +#' some offset from the start and/or end of the polyline. This option can be a list +#' with `start` and `end` names. The values must be strings +#' defining the size of the offset in either meters or pixels, i.e. +#' \code{list('start' = '100m', 'end' = '15px')}. +#' @param perArrowheadOptions Enables the developer to customize arrowheads on a +#' one-by-one basis. Must be in the form of a function of i, which is the +#' index of the arrowhead as it is rendered in the loop through all +#' arrowheads. Must return an options object. Cannnot +#' account for \code{frequency} or \code{proportionalToTotal} from within the +#' \code{perArrowheadOptions} callback. See the example for details. +#' @param ... Additional options for arrowheads, inherited from +#' \href{https://leafletjs.com/reference.html#path}{L.Path} +#' @references \url{https://github.com/slutske22/leaflet-arrowheads#options} +#' @family Arrowhead Functions +#' @return A list of options for \code{addArrowhead} polylines +#' @export +arrowheadOptions <- function( + yawn = 60, + size = '15%', + frequency = 'allvertices', + proportionalToTotal = FALSE, + offsets = NULL, + perArrowheadOptions = NULL, + ...) { + + filterNULL(list( + yawn = yawn, + size = size, + frequency = frequency, + proportionalToTotal = proportionalToTotal, + offsets = offsets, + perArrowheadOptions = perArrowheadOptions, + ... + )) +} + +#' Remove arrowheads from Lines by group +#' +#' @param map the map +#' @param group A group name +#' @family Arrowhead Functions +#' @return A modified leaflet map +#' @export +clearArrowhead <- function(map, group) { + invokeMethod(map, getMapData(map), "clearArrowhead", group) +} + +#' Remove arrowheads from Lines by layerId +#' +#' @param map the map +#' @param layerId A single layerId or a vector of layerId's +#' @family Arrowhead Functions +#' @return A modified leaflet map +#' @export +removeArrowhead <- function(map, layerId) { + invokeMethod(map, getMapData(map), "removeArrowhead", layerId) +} + diff --git a/R/contextmenu.R b/R/contextmenu.R new file mode 100644 index 00000000..cc34bfdd --- /dev/null +++ b/R/contextmenu.R @@ -0,0 +1,277 @@ +contextmenuDependency <- function() { + list( + htmltools::htmlDependency( + "lfx-contextmenu", version = "1.0.0", + src = system.file("htmlwidgets/lfx-contextmenu", + package = "leaflet.extras2"), + script = c("leaflet.contextmenu.js", + "leaflet.contextmenu-bindings.js"), + stylesheet = "leaflet.contextmenu.css" + ) + ) +} + +#' Add contextmenu Plugin +#' +#' Add a contextmenu to the map or markers/vector layers. +#' @param map a map widget object created from \code{\link[leaflet]{leaflet}} +#' @family Contextmenu Functions +#' @references \url{https://github.com/aratcliffe/Leaflet.contextmenu} +#' @export +#' @return A leaflet map object +#' +#' @details +#' This function is only used to include the required JavaScript and CSS +#' bindings and to set up some Shiny event handlers. +#' +#' \subsection{Contextmenu initialization}{ +#' The contextmenu for +#' \itemize{ +#' \item {the \strong{map} must be defined in +#' \code{\link[leaflet]{leafletOptions}}.} +#' \item {the \strong{markers/vector layers} must be defined +#' in \code{\link[leaflet]{markerOptions}} or +#' \code{\link[leaflet]{pathOptions}}.} +#' } +#' } +#' +#' \subsection{Contextmenu selection}{ +#' When a contextmenu is selected, a Shiny input with the +#' ID \code{"MAPID_contextmenu_select"} is set (`MAPID` refers to the map's id). +#' +#' If the selected contextmenu item is triggered from: +#' \itemize{ +#' \item {the \strong{map}, the returned list contains the \code{text} of +#' the item.} +#' \item {the \strong{markers}, the returned list also contains the +#' \code{layerId}, \code{group}, \code{lat}, +#' \code{lng} and \code{label}.} +#' \item {the \strong{vector layers}, the returned list also contains the +#' \code{layerId}, \code{group} and \code{label}.} +#' } +#' } +#' +#' @examples +#' library(leaflet) +#' leaflet(options = leafletOptions( +#' contextmenu = TRUE, +#' contextmenuWidth = 200, +#' contextmenuItems = +#' context_mapmenuItems( +#' context_menuItem("Zoom Out", "function(e) {this.zoomOut()}", disabled=FALSE), +#' "-", +#' context_menuItem("Zoom In", "function(e) {this.zoomIn()}")))) %>% +#' addTiles(group = "base") %>% +#' addContextmenu() %>% +#' addMarkers(data = breweries91, label = ~brewery, +#' layerId = ~founded, group = "marker", +#' options = markerOptions( +#' contextmenu = TRUE, +#' contextmenuWidth = 200, +#' contextmenuItems = +#' context_markermenuItems( +#' context_menuItem(text = "Show Marker Coords", +#' callback = "function(e) {alert(e.latlng);}", +#' index = 1) +#' ) +#' )) +#' +addContextmenu <- function(map) { + map$dependencies <- c(map$dependencies, contextmenuDependency()) + leaflet::invokeMethod(map, NULL, "addContextmenu") +} + +#' showContextmenu +#' +#' Open the contextmenu at certain lat/lng-coordinates +#' @family Contextmenu Functions +#' @inheritParams leaflet::addMarkers +#' @return A leaflet map object +#' @export +showContextmenu <- function(map, lat = NULL, lng = NULL, + data = leaflet::getMapData(map)) { + pts <- leaflet::derivePoints(data, lng, lat, + missing(lng), missing(lat), "showContextmenu") + leaflet::invokeMethod(map, NULL, "showContextmenu", pts) +} + +#' enableContextmenu +#' +#' Enable the contextmenu +#' @family Contextmenu Functions +#' @inheritParams addContextmenu +#' @return A leaflet map object +#' @export +enableContextmenu <- function(map) { + leaflet::invokeMethod(map, NULL, "enableContextmenu") +} + +#' disableContextmenu +#' +#' Disable the contextmenu +#' @family Contextmenu Functions +#' @inheritParams addContextmenu +#' @return A leaflet map object +#' @export +disableContextmenu <- function(map) { + leaflet::invokeMethod(map, NULL, "disableContextmenu") +} + +#' hideContextmenu +#' +#' Hide the contextmenu +#' @family Contextmenu Functions +#' @inheritParams addContextmenu +#' @return A leaflet map object +#' @export +hideContextmenu <- function(map) { + leaflet::invokeMethod(map, NULL, "hideContextmenu") +} + +#' addItemContextmenu +#' +#' Add a new contextmenu menu item +#' @family Contextmenu Functions +#' @inheritParams addContextmenu +#' @param option new menu item to add +#' @return A leaflet map object +#' @export +addItemContextmenu <- function(map, option) { + if (utils::packageVersion("leaflet") < "2.0.4") { + warning("The `addItemContextmenu` function requires leaflet `2.0.4` to correctly register callbacks.") + } + leaflet::invokeMethod(map, NULL, "addItemContextmenu", option) +} +# remotes::install_github("rstudio/leaflet#696") + +#' insertItemContextmenu +#' +#' Insert a new contextmenu menu item at a specific index +#' @family Contextmenu Functions +#' @inheritParams addItemContextmenu +#' @inheritParams removeItemContextmenu +#' @return A leaflet map object +#' @export +insertItemContextmenu <- function(map, option, index) { + if (utils::packageVersion("leaflet") < "2.0.4") { + warning("The `insertItemContextmenu` function requires leaflet `2.0.4` to correctly register callbacks.") + } + leaflet::invokeMethod(map, NULL, "insertItemContextmenu", option, index) +} +# remotes::install_github("rstudio/leaflet#696") + +#' removeItemContextmenu +#' +#' Remove a contextmenu item by index. +#' @family Contextmenu Functions +#' @inheritParams addContextmenu +#' @param index Index of the contextmenu. (NOTE: Since the index is passed +#' to JavaScript, it is zero-based) +#' @return A leaflet map object +#' @export +removeItemContextmenu <- function(map, index) { + leaflet::invokeMethod(map, NULL, "removeItemContextmenu", index) +} + +#' setDisabledContextmenu +#' +#' Enable/Disable a contextmenu item by index. +#' @family Contextmenu Functions +#' @inheritParams removeItemContextmenu +#' @param disabled Set to \code{TRUE} to disable the element and \code{FALSE} +#' to enable it. Default is \code{TRUE} +#' @return A leaflet map object +#' @export +setDisabledContextmenu <- function(map, index, disabled=TRUE) { + leaflet::invokeMethod(map, NULL, "setDisabledContextmenu", index, disabled) +} + +#' removeallItemsContextmenu +#' +#' Remove all contextmenu items from the map. +#' @family Contextmenu Functions +#' @inheritParams removeItemContextmenu +#' @return A leaflet map object +#' @export +removeallItemsContextmenu <- function(map) { + leaflet::invokeMethod(map, NULL, "removeallItemsContextmenu") +} + + + +#' context_menuItem +#' @param text The label to use for the menu item +#' @param callback A callback function to be invoked when the menu item is +#' clicked. The callback is passed an object with properties identifying the +#' location the menu was opened at: \code{latlng}, \code{layerPoint} +#' and \code{containerPoint}. The callback-function must be valid JavaScript +#' and will be wrapped in \code{\link[leaflet]{JS}}. +#' @param ... For further options please visit +#' \url{https://github.com/aratcliffe/Leaflet.contextmenu} +#' @family Contextmenu Functions +#' @return A contextmenu item list +#' @export +context_menuItem <- function(text, callback = NULL, ...) { + list(text = text, + callback = leaflet::JS(callback), + ...) +} + +#' context_mapmenuItems +#' @param ... contextmenu item/s +#' @family Contextmenu Functions +#' @return A list of \code{context_menuItem} for the map +#' @export +context_mapmenuItems <- function(...) { + list(...) +} + +#' context_markermenuItems +#' @param ... contextmenu item/s +#' @family Contextmenu Functions +#' @return A list of \code{context_menuItem} for markers +#' @export +context_markermenuItems <- function(...) { + list(list(...)) +} + + +## Deprecated ########### +#' menuItem +#' @param text The label to use for the menu item +#' @param callback A callback function to be invoked when the menu item is +#' clicked. The callback is passed an object with properties identifying the +#' location the menu was opened at: \code{latlng}, \code{layerPoint} +#' and \code{containerPoint}. The callback-function must be valid JavaScript +#' and will be wrapped in \code{\link[leaflet]{JS}}. +#' @param ... For further options please visit +#' \url{https://github.com/aratcliffe/Leaflet.contextmenu} +#' @family Contextmenu Functions +#' @return A contextmenu item list +#' @export +menuItem <- function(text, callback = NULL, ...) { + .Deprecated("context_menuItem") + list(text = text, + callback=leaflet::JS(callback), + ...) +} + +#' mapmenuItems +#' @param ... contextmenu item/s +#' @family Contextmenu Functions +#' @return A list of \code{menuItem} for the map +#' @export +mapmenuItems <- function(...) { + .Deprecated("context_mapmenuItems") + list(...) +} + +#' markermenuItems +#' @param ... contextmenu item/s +#' @family Contextmenu Functions +#' @return A list of \code{menuItem} for markers +#' @export +markermenuItems <- function(...) { + .Deprecated("context_markermenuItems") + list(list(...)) +} diff --git a/R/data_docs.R b/R/data_docs.R new file mode 100644 index 00000000..6165cfe2 --- /dev/null +++ b/R/data_docs.R @@ -0,0 +1,2 @@ +#' The available GIBS layers with attributes +"gibs_layers" diff --git a/R/easyprint.R b/R/easyprint.R index db89df1f..1f948782 100644 --- a/R/easyprint.R +++ b/R/easyprint.R @@ -1,75 +1,135 @@ easyprintDependency <- function() { list( htmltools::htmlDependency( - "lfx-easyprint", version = "2.1.0", - src = system.file("htmlwidgets/lfx-easyprint", package = "leaflet.extras2"), - script = c("lfx-easyprint.js", - "lfx-easyprint-bindings.js") + "lfx-easyprint", version = "1.0.0", + src = system.file("htmlwidgets/lfx-easyprint", + package = "leaflet.extras2"), + script = c( + "dom-to-image.js", + "FileSaver.js", + # "lfx-easyprint.js", + "lfx-easyprint_full.js", + "lfx-easyprint-bindings.js") ) ) } #' Add easyPrint Plugin -#' @param map the map to add easyPrint to. +#' +#' Add a control, which allows to print or export a map as .PNG. +#' @param map a map widget object created from \code{\link[leaflet]{leaflet}} #' @param options A named list of options. See \code{\link{easyprintOptions}} -#' @family EasyPrint Plugin -#' @seealso https://github.com/rowanwins/leaflet-easyPrint +#' @family EasyPrint Functions +#' @references \url{https://github.com/rowanwins/leaflet-easyPrint} #' @export +#' @return A leaflet map object +#' @examples +#' library(leaflet) +#' leaflet() %>% +#' addTiles() %>% +#' addEasyprint(options = easyprintOptions( +#' title = 'Print map', +#' position = 'bottomleft', +#' exportOnly = TRUE)) addEasyprint <- function(map, options = easyprintOptions()) { - map$dependencies <- c(map$dependencies, easyprintDependency()) - leaflet::invokeMethod(map, NULL, "addEasyprint", options) } #' easyprintMap +#' +#' Print or export a map programmatically (e.g. in a Shiny environment). #' @param map the map widget -#' @param sizeModes Options available include Current, A4Portrait, A4Landscape -#' or a custom size object. Default is \code{A4Portrait} -#' @param filename Name of the file if export only option set to TRUE -#' @family EasyPrint Plugin +#' @param sizeModes Must match one of the given \code{sizeMode} names in +#' \code{\link{easyprintOptions}}. The options are: +#' \code{CurrentSize}, \code{A4Portrait} or \code{A4Landscape}. If you want to +#' print the map with a \code{Custom} sizeMode you need to pass the Custom className. +#' Default is \code{A4Portrait} +#' @param filename Name of the file if \code{exportOnly} option is \code{TRUE}. +#' @family EasyPrint Functions +#' @inherit addEasyprint return #' @export +#' @examples +#' ## Only run examples in interactive R sessions +#' if (interactive()) { +#' library(shiny) +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' ui <- fluidPage( +#' leafletOutput("map"), +#' selectInput("scene", "Select Scene", choices = c("CurrentSize", "A4Landscape", "A4Portrait")), +#' actionButton("print", "Print Map") +#' ) +#' +#' server <- function(input, output, session) { +#' output$map <- renderLeaflet({ +#' input$print +#' leaflet() %>% +#' addTiles() %>% +#' setView(10, 50, 9) %>% +#' addEasyprint(options = easyprintOptions( +#' exportOnly = TRUE +#' )) +#' }) +#' observeEvent(input$print, { +#' leafletProxy("map") %>% +#' easyprintMap(sizeModes = input$scene) +#' }) +#' } +#' +#' shinyApp(ui, server) +#' } easyprintMap <- function(map, sizeModes = "A4Portrait", filename = "map") { leaflet::invokeMethod(map, NULL, "easyprintMap", sizeModes, filename) } -#' easyprintMapremoveEasyprint +#' removeEasyprint +#' +#' Removes the easyprint control from the map. #' @param map the map widget -#' @family EasyPrint Plugin +#' @family EasyPrint Functions +#' @inherit addEasyprint return #' @export removeEasyprint <- function(map) { leaflet::invokeMethod(map, NULL, "removeEasyprint") } - - -#' easyPrint Options +#' easyprintOptions +#' +#' Create a list of further options for the easyprint plugin. #' @param title Sets the text which appears as the tooltip of the print/export button #' @param position Positions the print button -#' @param sizeModes Options available include Current, A4Portrait, A4Landscape -#' or a custom size object -#' @param defaultSizeTitles button tooltips for the default page sizes -#' @param exportOnly If set to true the map is exported to a png file -#' @param tileLayer A tile layer that you can wait for to draw (helpful when resizing) +#' @param sizeModes Either a character vector with one of the following options: +#' \code{CurrentSize}, \code{A4Portrait}, \code{A4Landscape}. If you want to +#' include a \code{Custom} size mode you need to pass a named list, with +#' \code{width}, \code{height}, \code{name} and \code{className} and assign a +#' background-image in CSS. +#' See the example in \code{./inst/examples/easyprint_app.R}. +#' @param defaultSizeTitles Button tooltips for the default page sizes +#' @param exportOnly If set to \code{TRUE} the map is exported to a .png file +#' @param tileLayer The group name of one tile layer that you can wait for to draw +#' (helpful when resizing) #' @param tileWait How long to wait for the tiles to draw (helpful when resizing) -#' @param filename Name of the file if export only option set to TRUE -#' @param hidden Set to true if you don't want to display the toolbar. +#' @param filename Name of the file if \code{exportOnly} option is \code{TRUE} +#' @param hidden Set to \code{TRUE} if you don't want to display the toolbar. #' Instead you can create your own buttons or fire print events programmatically. -#' You still need to call addTo(map) to set the leaflet map context. #' @param hideControlContainer Hides the leaflet controls like the zoom buttons -#' and the attribution on the print out. -#' @param hideClasses Hides classes on the print out. Use a list of strings as -#' follow : list('div1', 'div2') +#' and the attribution on the print out +#' @param hideClasses Use a character vector or list of CSS-classes to hide on +#' the output image. #' @param customWindowTitle A title for the print window which will get -#' added the printed paper. -#' @param spinnerBgColor A valid css colour for the spinner background color. +#' added to the printed paper +#' @param spinnerBgColor A valid css colour for the spinner background color #' @param customSpinnerClass A class for a custom css spinner to use while #' waiting for the print. -#' @family EasyPrint Plugin +#' @family EasyPrint Functions +#' @return A list of options for the 'easyprint' control +#' @references \url{https://github.com/rowanwins/leaflet-easyPrint} #' @export easyprintOptions <- function(title = 'Print map', position = 'topleft', - sizeModes = list("A4Portrait", "A4Landscape", "Current"), + sizeModes = list("A4Portrait", "A4Landscape", "CurrentSize"), defaultSizeTitles = NULL, exportOnly = FALSE, tileLayer = NULL, @@ -77,10 +137,16 @@ easyprintOptions <- function(title = 'Print map', filename = 'map', hidden = FALSE, hideControlContainer = TRUE, - hideClasses = list(), + hideClasses = NULL, customWindowTitle = NULL, spinnerBgColor = '#0DC5C1', customSpinnerClass = 'epLoader') { + if (inherits(sizeModes, "character")) sizeModes <- as.list(sizeModes) + if (inherits(hideClasses, "character")) hideClasses <- as.list(hideClasses) + if (length(sizeModes) == 0 || (is.null(sizeModes) || all(is.na(sizeModes)) || all(sizeModes == ""))) { + stop("The 'sizeModes' argument cannot be empty.\nUse one of the following ", + "options: 'A4Portrait', 'A4Landscape', 'CurrentSize' or define a 'Custom' sizeMode.") + } leaflet::filterNULL(list( title = title, position = position, diff --git a/R/gibs.R b/R/gibs.R new file mode 100644 index 00000000..2ab919a9 --- /dev/null +++ b/R/gibs.R @@ -0,0 +1,119 @@ +gibsDependency <- function() { + list( + htmltools::htmlDependency( + "lfx-gibs", version = "1.0.0", + src = system.file("htmlwidgets/lfx-gibs", package = "leaflet.extras2"), + script = c( + "GIBSLayer.js", + "GIBSMetadata.js", + "gibs-bindings.js") + ) + ) +} + +#' Add GIBS Layers +#' +#' A leaflet plugin for NASA EOSDIS GIBS imagery integration. 154 products are +#' available. The date can be set dynamically for multi-temporal products. No-data +#' pixels of MODIS Multiband Imagery can be made transparent. +#' @inheritParams leaflet::addWMSTiles +#' @param layers A character vector of GIBS-layers. See \code{\link{gibs_layers}} +#' @param dates Date object. If multiple \code{layers} are added, you can add a +#' Date vector of the same length +#' @param opacity Numeric value determining the opacity. If multiple +#' \code{layers} are added, you can add a numeric vector of the same length +#' @param transparent Should the layer be transparent. If multiple \code{layers} +#' are added, you can add a boolean vector of the same length +#' @references \url{https://github.com/aparshin/leaflet-GIBS} +#' @family GIBS Functions +#' @export +#' @inherit leaflet::addWMSTiles return +#' @examples +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' layers <- gibs_layers$title[c(35, 128, 185)] +#' +#' leaflet() %>% +#' addTiles() %>% +#' setView(9, 50, 4) %>% +#' addGIBS(layers = layers, +#' dates = Sys.Date() - 1, +#' group = layers) %>% +#' addLayersControl(overlayGroups = layers) +addGIBS <- function(map, layers = NULL, group = NULL, dates = NULL, + opacity = 0.5, transparent = TRUE) { + ## Check required args ###################### + if (is.null(layers)) + stop("You must define one or multiple `layers`.\n", + "See `gibs_layers` for a list of all available layers and their attributes.") + if (is.null(dates)) + stop("You must define one or multiple `dates` for each layer.") + + ## Check if layers exist ###################### + if (!all(layers %in% gibs_layers$title)) { + stop("The layer is not valid. Did you mean: `", + gibs_layers$title[which.min(adist(layers, gibs_layers$title))], "`?\n", + "If not, please see `gibs_layers` for a list of all available layers and their attributes.") + } + + ## If multiple layers passed, repeat single values, so JS can always assume an array + lenlay = length(layers) + if (lenlay > 1) { + seqlen <- seq.int(lenlay) + if (lenlay != length(group)) { + group <- rep(group, lenlay)[seqlen] + } + if (lenlay != length(dates)) { + dates <- rep(dates, lenlay)[seqlen] + } + if (lenlay != length(opacity)) { + opacity <- rep(opacity, lenlay)[seqlen] + } + if (lenlay != length(transparent)) { + transparent <- rep(transparent, lenlay)[seqlen] + } + } + + ## Add deps ################ + map$dependencies <- c(map$dependencies, gibsDependency()) + + ## Invoke Leaflet ########## + invokeMethod(map, getMapData(map), "addGIBS", layers, group, dates, opacity, transparent) +} + +#' Set Date for GIBS Layers +#' +#' Set a new date for multi-temporal layers. +#' @inheritParams addGIBS +#' @family GIBS Functions +#' @inherit leaflet::addWMSTiles return +#' @export +setDate <- function(map, layers = NULL, dates = NULL) { + ## Check required args ###################### + if (is.null(layers)) + stop("You must define one or multiple `layers`.\n", + "See `gibs_layers` for a list of all available layers and their attributes.") + if (is.null(dates)) + stop("You must define one or multiple `dates`.") + + ## Invoke Leaflet ########## + invokeMethod(map, NULL, "setDate", layers, dates) +} + +#' Set Transparency for GIBS Layers +#' +#' Change the transparency for no-data pixels. +#' @inheritParams addGIBS +#' @family GIBS Functions +#' @inherit leaflet::addWMSTiles return +#' @export +setTransparent <- function(map, layers = NULL, transparent = TRUE) { + ## Check required args ###################### + if (is.null(layers)) + stop("You must define one or multiple `layers`.\n", + "See `gibs_layers` for a list of all available layers and their attributes.") + + ## Invoke Leaflet ########## + invokeMethod(map, NULL, "setTransparent", layers, transparent) +} diff --git a/R/heightgraph.R b/R/heightgraph.R new file mode 100644 index 00000000..c37bee82 --- /dev/null +++ b/R/heightgraph.R @@ -0,0 +1,184 @@ +heightgraphDependency <- function() { + list( + htmltools::htmlDependency( + "lfx-heightgraph", version = "1.0.0", + src = system.file("htmlwidgets/lfx-heightgraph", package = "leaflet.extras2"), + script = c( + # "d3.js", + "L.Control.Heightgraph.js", + "L.Control.Heightgraph-bindings.js"), + stylesheet = "L.Control.Heightgraph.css" + ) + ) +} + +#' Add a Heightgraph layer +#' +#' Visualize height information and road attributes of linestring segments. +#' The linestrings must be a Simple Feature LINESTRING Z and are transformed to +#' GeoJSON. The function therefore inherits arguments from +#' \code{\link[leaflet]{addGeoJSON}}. +#' +#' @inheritParams leaflet::addGeoJSON +#' @param data A Simple Feature LINESTRING with Z dimension. +#' @param columns A character vector of the columns you want to include in the +#' heightgraph control +#' @param pathOpts List of further options for the path. See +#' \code{\link[leaflet]{pathOptions}} +#' @param options List of further plugin options. See +#' \code{\link{heightgraphOptions}} +#' +#' @note When used in Shiny, 3 events update a certain Shiny Input: +#' \enumerate{ +#' \item A click updates \code{input$MAPID_heightgraph_click} +#' \item A mouseover updates \code{input$MAPID_heightgraph_mouseover} +#' \item A mouseout updates \code{input$MAPID_heightgraph_mouseout} +#' } +#' If you want to explicitly remove the Heightgraph control, please use +#' \code{\link[leaflet]{removeControl}} with the \code{layerId = "hg_control"}. +#' @references \url{https://github.com/GIScience/Leaflet.Heightgraph} +#' @family Heightgraph Functions +#' @inherit leaflet::addGeoJSON return +#' @export +#' @examples \dontrun{ +#' library(leaflet) +#' library(leaflet.extras2) +#' library(sf) +#' +#' data <- st_cast(st_as_sf(leaflet::atlStorms2005[4,]), "LINESTRING") +#' data <- st_transform(data, 4326) +#' data <- data.frame(st_coordinates(data)) +#' data$elev <- runif(nrow(data), 10, 500) +#' data$L1 <- NULL +#' L1 <- round(seq.int(1, 4, length.out = nrow(data))) +#' data <- st_as_sf(st_sfc(lapply(split(data, L1), sfg_linestring))) +#' data <- st_as_sf(st_sfc(lapply(split(data, L1), function(x) { +#' st_linestring(as.matrix(x)) +#' }))) +#' data$steepness <- 1:nrow(data) +#' data$suitability <- nrow(data):1 +#' data$popup <- apply(data, 1, function(x) { +#' sprintf("Steepness: %s
Suitability: %s", x$steepness, x$suitability) +#' }) +#' +#' leaflet() %>% +#' addTiles(group = "base") %>% +#' addHeightgraph(color = "red", columns = c("steepness", "suitability"), +#' opacity = 1, data = data, group = "heightgraph", +#' options = heightgraphOptions(width = 400)) +#' } +addHeightgraph <- function( + map, data = NULL, columns = NULL, layerId = NULL, group = NULL, + color = "#03F", weight = 5, opacity = 0.5, + dashArray = NULL, smoothFactor = 1, noClip = FALSE, + pathOpts = leaflet::pathOptions(), + options = heightgraphOptions()) { + + if (!requireNamespace("geojsonsf")) { + stop("The package `geojsonsf` is needed for this plugin. ", + "Please install it with:\ninstall.packages('geojsonsf')") + } + + ## TODO - Use all columns if NULL ?? + if (is.null(columns)) stop("No `columns` given.") + + # if (inherits(data, "Spatial")) data <- sf::st_as_sf(data) + stopifnot(inherits(sf::st_geometry(data), "sfc_LINESTRING")) + stopifnot(!is.null(sf::st_z_range(data))) + bounds <- as.numeric(sf::st_bbox(data)) + + ## Create Property List + props <- lapply(columns, function(x) {data[[x]]}) + names(props) <- columns + + ## Change columnnames to `attributeType` and transform to Geojson + data <- lapply(columns, function(x) { + names(data)[names(data) == x] <- 'attributeType' + geojsonsf::sf_geojson(data) + }) + + # Check if Properties and Data have same length + stopifnot(length(props) == length(data)) + + geojson_opts <- c(pathOpts, filterNULL( + list(color = color, + weight = weight, opacity = opacity, + dashArray = dashArray, smoothFactor = smoothFactor, + noClip = noClip))) + + map$dependencies <- c(map$dependencies, heightgraphDependency()) + + invokeMethod(map, data, "addHeightgraph", data, props, layerId, + group, geojson_opts, options) %>% + expandLimits(bounds[c(2,4)], bounds[c(1,3)]) +} + +#' heightgraphOptions +#' +#' Customize the heightgraph with the following additional options. +#' @param position position of control: "topleft", "topright", "bottomleft", or +#' "bottomright". Default is \code{bottomright}. +#' @param width The width of the expanded heightgraph display in pixels. Default +#' is \code{800}. +#' @param height The height of the expanded heightgraph display in pixels. +#' Default is \code{200}. +#' @param margins The margins define the distance between the border of the +#' heightgraph and the actual graph inside. You are able to specify margins +#' for top, right, bottom and left in pixels. Default is \code{list(top = 10, +#' right = 30, bottom = 55, left = 50)}. +#' @param expand Boolean value that defines if the heightgraph should be +#' expanded on creation. Default is \code{200}. +#' @param expandCallback Function to be called if the heightgraph is expanded or +#' reduced. The state of the heightgraph is passed as an argument. It is +#' \code{TRUE} when expanded and \code{FALSE} when reduced. Default is +#' \code{NULL}. +#' @param mappings You may add a mappings object to customize the colors and +#' labels in the height graph. Without adding custom mappings the segments and +#' labels within the graph will be displayed in random colors. Each key of the +#' object must correspond to the \code{summary} key in \code{properties} +#' within the \code{FeatureCollection}. Default is \code{NULL}. +#' @param highlightStyle You can customize the highlight style when using the +#' horizontal line to find parts of the route above an elevation value. Use +#' any Leaflet Path options as value of the highlightStyle parameter. Default +#' is \code{list(color = "red")}. +#' @param translation You can change the labels of the heightgraph info field by +#' passing translations for \code{distance}, \code{elevation}, +#' \code{segment_length}, \code{type} and \code{legend}. Default is +#' \code{NULL}. +#' @param xTicks Specify the tick frequency in the x axis of the graph. +#' Corresponds approximately to 2 to the power of value ticks. Default is +#' \code{3}. +#' @param yTicks Specify the tick frequency in the y axis of the graph. +#' Corresponds approximately to 2 to the power of value ticks. Default is +#' \code{3}. +#' @family Heightgraph Functions +#' @return A list of further options for \code{addHeightgraph} +#' @export +heightgraphOptions = function( + position = c("bottomright", "topleft", "topright", "bottomleft"), + width = 800, + height = 200, + margins = list(top = 10, right = 30, bottom = 55, left = 50), + expand = TRUE, + expandCallback = NULL, + mappings = NULL, + highlightStyle = list(color = "red"), + translation = NULL, + xTicks = 3, + yTicks = 3 +) { + position <- match.arg(position) + filterNULL(list( + position = position, + width = width, + height = height, + margins = margins, + expand = expand, + expandCallback = expandCallback, + mappings = mappings, + highlightStyle = highlightStyle, + translation = translation, + xTicks = xTicks, + yTicks = yTicks + )) +} diff --git a/R/hexbin.R b/R/hexbin.R index 0acd07ff..367ff5b5 100644 --- a/R/hexbin.R +++ b/R/hexbin.R @@ -1,7 +1,7 @@ hexbinDependency <- function() { list( htmltools::htmlDependency( - "lfx-hexbin", version = "2.1.0", + "lfx-hexbin", version = "1.0.0", src = system.file("htmlwidgets/lfx-hexbin", package = "leaflet.extras2"), script = c( "d3.js", @@ -12,35 +12,37 @@ hexbinDependency <- function() { ) } - #' Add a Hexbin layer #' -#' @param map A map widget object created from \code{\link[leaflet]{leaflet}} -#' @param lng a numeric vector of longitudes, or a one-sided formula of the form -#' ~x where x is a variable in data; by default (if not explicitly provided), -#' it will be automatically inferred from data by looking for a column named -#' lng, long, or longitude (case-insensitively) -#' @param lat a vector of latitudes or a formula (similar to the lng argument; -#' the names lat and latitude are used when guessing the latitude column from -#' data) +#' Create dynamic hexbin-based heatmaps on Leaflet maps. This plugin leverages +#' the data-binding power of d3 to allow you to dynamically update the data and +#' visualize the transitions. +#' @inheritParams leaflet::addCircleMarkers #' @param radius Radius of the hexbin layer -#' @param layerId the layer id -#' @param group the name of the group the newly created layers should belong to -#' (for clearGroup and addLayersControl purposes). Human-friendly group names -#' are permittedโ€“they need not be short, identifier-style names. Any number of -#' layers and even different types of layers (e.g. markers and polygons) can -#' share the same group name. -#' @param opacity Opacity on the hexbin layer +#' @param opacity Opacity of the hexbin layer #' @param options List of further options. See \code{\link{hexbinOptions}} -#' @param data the data object from which the argument values are derived; by -#' default, it is the data object provided to leaflet() initially, but can be -#' overridden. #' -#' @note Currently doesn't respect \code{layerId} nor \code{group} +#' @note Currently doesn't respect \code{layerId} nor \code{group}. #' -#' @seealso https://github.com/Asymmetrik/leaflet-d3#hexbins-api -#' @family Hexbin-D3 Plugin +#' @references \url{https://github.com/bluehalo/leaflet-d3#hexbins-api} +#' @family Hexbin-D3 Functions +#' @inherit leaflet::addCircleMarkers return #' @export +#' @examples +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' n <- 1000 +#' df <- data.frame(lat = rnorm(n, 42.0285, .01), +#' lng = rnorm(n, -93.65, .01)) +#' +#' leaflet() %>% +#' addTiles() %>% +#' addHexbin(lng = df$lng, lat = df$lat, +#' options = hexbinOptions( +#' colorRange = c("red", "yellow", "blue"), +#' radiusRange = c(10, 20) +#' )) addHexbin <- function( map, lng = NULL, lat = NULL, radius = 20, layerId = NULL, group = NULL, opacity = 0.5, @@ -63,20 +65,13 @@ addHexbin <- function( } #' updateHexbin -#' @param map A map widget object created from \code{\link[leaflet]{leaflet}} -#' @param lng a numeric vector of longitudes, or a one-sided formula of the form -#' ~x where x is a variable in data; by default (if not explicitly provided), -#' it will be automatically inferred from data by looking for a column named -#' lng, long, or longitude (case-insensitively) -#' @param lat a vector of latitudes or a formula (similar to the lng argument; -#' the names lat and latitude are used when guessing the latitude column from -#' data) -#' @param data the data object from which the argument values are derived; by -#' default, it is the data object provided to leaflet() initially, but can be -#' overridden. -#' @param colorRange Sets the range of the color scale used to fill the -#' hexbins on the layer. -#' @family Hexbin-D3 Plugin +#' +#' Dynamically change the \code{data} and/or the \code{colorRange}. +#' @inheritParams leaflet::addCircleMarkers +#' @param colorRange The range of the color scale used to fill the +#' hexbins +#' @family Hexbin-D3 Functions +#' @inherit leaflet::addCircleMarkers return #' @export updateHexbin <- function(map, data = NULL, lng = NULL, lat = NULL, colorRange = NULL) { if (is.null(c(data, lng, lat))) { @@ -90,33 +85,41 @@ updateHexbin <- function(map, data = NULL, lng = NULL, lat = NULL, colorRange = } #' clearHexbin -#' Clear the hexbinLayer +#' +#' Clears the data of the hexbinLayer. #' @param map The map widget -#' @family Hexbin-D3 Plugin +#' @family Hexbin-D3 Functions +#' @inherit leaflet::addCircleMarkers return #' @export clearHexbin <- function(map) { invokeMethod(map, NULL, "clearHexbin") } #' hideHexbin -#' Hide the hexbinLayer +#' +#' Hide the hexbinLayer. #' @param map The map widget -#' @family Hexbin-D3 Plugin +#' @family Hexbin-D3 Functions +#' @inherit leaflet::addCircleMarkers return #' @export hideHexbin <- function(map) { invokeMethod(map, NULL, "hideHexbin") } #' showHexbin -#' Show the hexbinLayer +#' +#' Show the hexbinLayer. #' @param map The map widget -#' @family Hexbin-D3 Plugin +#' @family Hexbin-D3 Functions +#' @inherit leaflet::addCircleMarkers return #' @export showHexbin <- function(map) { invokeMethod(map, NULL, "showHexbin") } #' hexbinOptions +#' +#' A list of options for customizing the appearance/behavior of the hexbin layer. #' @param duration Transition duration for the hexbin layer #' @param colorScaleExtent extent of the color scale for the hexbin layer. This #' is used to override the derived extent of the color values and is specified @@ -143,7 +146,8 @@ showHexbin <- function(map) { #' append the string before the count. To disable tooltips, please pass #' \code{NULL} or \code{FALSE}. You can also pass a custom #' \code{\link[htmlwidgets]{JS}} function. -#' @family Hexbin-D3 Plugin +#' @family Hexbin-D3 Functions +#' @return A list of hexbin-specific options #' @export hexbinOptions = function( duration = 200, diff --git a/R/history.R b/R/history.R new file mode 100644 index 00000000..bdf57ae3 --- /dev/null +++ b/R/history.R @@ -0,0 +1,165 @@ +historyDependency <- function() { + list( + htmltools::htmlDependency( + name = "font-awesome", + version = fontawesome::fa_metadata()$version, + src = "fontawesome", + package = "fontawesome", + stylesheet = c("css/all.min.css", "css/v4-shims.min.css") + ), + htmlDependency( + "lfx-history", version = "1.0.0", + src = system.file("htmlwidgets/lfx-history", package = "leaflet.extras2"), + script = c("zoomCenter.js", + "lfx-history.js", + "lfx-history-bindings.js"), + stylesheet = "lfx-history.css" + ) + ) +} + +#' Add History Plugin +#' +#' The plugin enables tracking of map movements in a history similar to a web +#' browser. By default, it is a simple pair of buttons -- back and forward. +#' @param map a map widget object created from \code{\link[leaflet]{leaflet}} +#' @param layerId the control id +#' @param options A named list of options. See \code{\link{historyOptions}} +#' @family History Functions +#' @references \url{https://github.com/cscott530/leaflet-history} +#' @inherit leaflet::addControl return +#' @export +#' @examples +#' library(leaflet) +#' leaflet() %>% +#' addTiles() %>% +#' addHistory() +addHistory <- function(map, layerId = NULL, options = historyOptions()) { + if (!requireNamespace("fontawesome")) { + stop("The package `fontawesome` is needed for this plugin. ", + "Please install it with:\ninstall.packages('fontawesome')") + } + ## Check Icon options. Is it character or shiny.tag. Adapt htmlDeps + map$dependencies <- c(map$dependencies, historyDependency()) + leaflet::invokeMethod(map, NULL, "addHistory", layerId, options) +} + +#' History Options +#' @param position Set the position of the History control. Default is +#' \code{topright}. +#' @param maxMovesToSave Number of moves in the history to save before clearing +#' out the oldest. Default value is 10, use 0 or a negative number to make +#' unlimited. +#' @param backImage The class for the `back` button icon. Default is +#' \code{"fa fa-caret-left"}. +#' @param forwardImage The class for the `forward` button icon. Default is +#' \code{"fa fa-caret-right"}. +#' @param backText The text in the buttons. Default is ''. +#' @param forwardText The text in the buttons. Default is ''. +#' @param backTooltip Tooltip content. Default is \code{"Go to Previous Extent"}. +#' @param forwardTooltip Tooltip content. Default is \code{"Go to Next Extent"}. +#' @param backImageBeforeText When both text and image are present, whether to +#' show the image first or the text first (left to right). Default is +#' \code{TRUE} +#' @param forwardImageBeforeText When both text and image are present, whether +#' to show the image first or the text first (left to right). Default is +#' \code{FALSE} +#' @param orientation Whether to position the buttons on top of one another or +#' side-by-side. Default is \code{horizontal} +#' @param shouldSaveMoveInHistory A JS callback you can provide that gets called +#' with every move. return false to not save a move. +#' @family History Functions +#' @references \url{https://github.com/cscott530/leaflet-history} +#' @return A list of further options for \code{addHistory} +#' @export +#' @examples +#' library(leaflet) +#' leaflet() %>% +#' addTiles() %>% +#' addHistory(options = historyOptions(position = "bottomright", +#' maxMovesToSave = 20, +#' backText = "Go back", +#' forwardText = "Go forward", +#' orientation = "vertical" +#' )) +historyOptions <- function(position = c("topright", "topleft", "bottomleft","bottomright"), + maxMovesToSave = 10, + backImage = "fa fa-caret-left", + forwardImage = "fa fa-caret-right", + backText = '', + forwardText = '', + backTooltip = 'Go to Previous Extent', + forwardTooltip = 'Go to Next Extent', + backImageBeforeText = TRUE, + forwardImageBeforeText = FALSE, + orientation = c("horizontal", "vertical"), + shouldSaveMoveInHistory = NULL) { + position <- match.arg(position) + orientation <- match.arg(orientation) + leaflet::filterNULL(list( + position = position, + maxMovesToSave = maxMovesToSave, + backImage = backImage, + forwardImage = forwardImage, + backText = backText, + forwardText = forwardText, + backTooltip = backTooltip, + forwardTooltip = forwardTooltip, + backImageBeforeText = backImageBeforeText, + forwardImageBeforeText = forwardImageBeforeText, + orientation = orientation, + shouldSaveMoveInHistory = shouldSaveMoveInHistory + )) +} + +#' goBackHistory +#' +#' If possible, will go to previous map extent. Pushes current extent to the +#' "future" stack. +#' @param map a map widget object created from +#' \code{\link[leaflet]{leafletProxy}} +#' @family History Functions +#' @references \url{https://github.com/cscott530/leaflet-history} +#' @inherit leaflet::addControl return +#' @export +goBackHistory <- function(map) { + leaflet::invokeMethod(map, NULL, "goBackHistory") +} + +#' goForwardHistory +#' +#' If possible, will go to next map extent. Pushes current extent to the "back" +#' stack. +#' @inheritParams goBackHistory +#' @family History Functions +#' @references \url{https://github.com/cscott530/leaflet-history} +#' @inherit leaflet::addControl return +#' @export +goForwardHistory <- function(map) { + leaflet::invokeMethod(map, NULL, "goForwardHistory") +} + +#' clearHistory +#' +#' Resets the stack of history items. +#' @inheritParams goBackHistory +#' @family History Functions +#' @references \url{https://github.com/cscott530/leaflet-history} +#' @inherit leaflet::addControl return +#' @export +clearHistory <- function(map) { + leaflet::invokeMethod(map, NULL, "clearHistory") +} + +#' clearFuture +#' +#' Resets the stack of future items. +#' @inheritParams goBackHistory +#' @family History Functions +#' @references \url{https://github.com/cscott530/leaflet-history} +#' @inherit leaflet::addControl return +#' @export +clearFuture <- function(map) { + leaflet::invokeMethod(map, NULL, "clearFuture") +} + diff --git a/R/labelgun.R b/R/labelgun.R new file mode 100644 index 00000000..c201fdf4 --- /dev/null +++ b/R/labelgun.R @@ -0,0 +1,45 @@ +labelgunDependency <- function() { + list( + htmltools::htmlDependency( + "lfx-labelgun", version = "1.0.0", + src = system.file("htmlwidgets/lfx-labelgun", package = "leaflet.extras2"), + script = c("rbush.min.js", + "labelgun.js", + "labelgun-binding.js"), + all_files = TRUE + ) + ) +} + +#' Add addLabelgun Plugin +#' +#' The plugin allows to avoid cluttering in marker labels and gives priority +#' to labels of your choice (with higher weight). +#' +#' @note It is important to invoke the function after the markers have been +#' added to the map. Otherwise nothing will happen. +#' +#' @param map A map widget object created from \code{\link[leaflet]{leaflet}} +#' @param group The group name of the layer/s for which label collisions are +#' to be avoided. +#' To see the effects of this plugin the \code{labelOptions} of the markers must be +#' configured with either \code{permanent = TRUE} or \code{noHide = TRUE}. +#' @param weight An optional weight for markers. If a vector is given, the +#' length should match the number of all markers in the corresponding groups. +#' If a numeric value is specified, it is used for each marker and thus no +#' prioritization of the labels takes place. +#' In all other cases a random integer is calculated. +#' @param entries A numeric value, a higher value relates to faster insertion +#' and slower search, and vice versa. The default is 10 +#' +#' @return A leaflet map object +#' @export +#' +#' @references \url{https://github.com/Geovation/labelgun} +#' +#' @name addLabelgun +addLabelgun <- function(map, group=NULL, weight=NULL, entries=NULL) { + stopifnot("The group argument is NULL. Please define a valid group." = !is.null(group)) + map$dependencies <- c(map$dependencies, labelgunDependency()) + invokeMethod(map, NULL, "addLabelgun", group, weight, entries[1]) +} diff --git a/R/leaflet.extras2-package.R b/R/leaflet.extras2-package.R index 21093322..aca3ebdb 100644 --- a/R/leaflet.extras2-package.R +++ b/R/leaflet.extras2-package.R @@ -1,14 +1,13 @@ -#' leaflet.extras2: Extra Functionality for 'leaflet' Package. -#' -#' This package serves as an add-on to the 'leaflet' package by providing -#' extra functionality via 'leaflet' plugins. -#' + +#' @keywords internal +"_PACKAGE" + +## usethis namespace: start #' @importFrom magrittr %>% #' @import leaflet #' @importFrom htmltools htmlDependency tagGetAttribute tags tagList -#' @importFrom jsonlite fromJSON toJSON read_json -#' @importFrom shiny addResourcePath -#' -#' @name leaflet.extras2 -#' @docType package +#' @importFrom utils globalVariables adist packageVersion +## usethis namespace: end NULL + +globalVariables(c("gibs_layers")) diff --git a/R/leafletsync.R b/R/leafletsync.R new file mode 100644 index 00000000..decb503c --- /dev/null +++ b/R/leafletsync.R @@ -0,0 +1,167 @@ +leafletsyncDependency <- function() { + list( + htmltools::htmlDependency( + "lfx-leafletsync", version = "1.0.0", + src = system.file("htmlwidgets/lfx-leafletsync", package = "leaflet.extras2"), + script = c("L.Map.Sync.js", + "leafletsync-bindings.js") + ) + ) +} + +#' Add the Leaflet Sync JS dependencies +#' +#' Sometimes it makes sense to include the Leaflet Sync dependencies already +#' before synchronizing maps. For example, if you want to use the +#' `L.Sync.offsetHelper`. See the example in +#' \code{./inst/examples/offsetHelper.R} +#' +#' @param map the map +#' +#' @family leafletsync Functions +#' @return A modified leaflet map +#' @export +addLeafletsyncDependency <- function(map) { + map$dependencies <- c(map$dependencies, leafletsyncDependency()) + map +} + +#' Synchronize multiple Leaflet map +#' +#' The plugin allows you to synchronize and unsynchronize multiple leaflet maps +#' in a Shiny application. You can pass additional options +#' to \code{\link{leafletsyncOptions}}. For more information see +#' \href{https://github.com/jieter/Leaflet.Sync}{Leaflet.Sync} +#' +#' @param map the map +#' @param ids the map ids to be synced. If you use a \code{synclist}, you may +#' leave it \code{NULL.} The unique names and values of \code{synclist} will +#' be used. +#' @param synclist The synchronization list. The default is \code{'all'}, which +#' creates a list of all possible combinations of \code{ids}. For a more +#' detailed control, a named list can be passed in this form +#' \code{list(m1 = c("m2", "m3"), m2 = c("m1", "m3"), m3 = c("m1", "m2"))}, +#' where the names and values represent map-ids. The names of the lists serve +#' as a basis and the list values are the maps to be kept in sync with the +#' basemap. +#' @param options A named list of options. See \code{\link{leafletsyncOptions}}. +#' If you want to add different options to multiple maps, you can wrap the +#' options in a named list, with the names being the map-ids. See the example +#' in \code{./inst/examples/offset_continuous.R} +#' +#' @note If you synchronize multiple maps, a map may not yet be +#' initialized and therefore cannot be used. Make sure to use +#' \code{addLeafletsync} after all maps have been rendered. +#' +#' @family leafletsync Functions +#' @references \url{https://github.com/jieter/Leaflet.Sync} +#' @return A modified leaflet map +#' @export +addLeafletsync <- function(map, + ids = NULL, + synclist = "all", + options = leafletsyncOptions()) { + + ## Stop If Synclist is NULL or 'all' and 'ids' is also NULL + if (((length(synclist) == 1 && synclist == "all") || is.null(synclist)) && is.null(ids)) { + stop("You must pass a character vector to 'ids' ", + "if you use synclist = 'all' or if it is unset.") + } + ## If 'ids' is NULL and a 'synclist' is passed, take the unique values/names + if (is.null(ids) && is.list(synclist)) { + ids <- unique(c(unlist(synclist), names(synclist))) + } + ## Create all possible combinations of the given 'ids' + if (length(synclist) == 1 && synclist == "all") { + synclist <- vector(mode = "list", length = length(ids)) + names(synclist) <- ids + for (i in ids) { + rest <- ids[ids != i] + for (j in seq.int(length(rest))) { + synclist[[i]][j] <- rest[j] + } + } + } + else { + ## Warn if some names of the 'synclist' to not correspond to the 'ids' + if (is.list(synclist)) { + if (any(!names(synclist) %in% ids)) { + warning(sprintf("The map-ids %s in 'synclist' do not correspond to the given ids.\n", + paste(names(synclist)[!names(synclist) %in% ids], collapse = ", "))) + } + } + } + ## Repeat options for all maps + if (!all(ids %in% names(options))) { + options <- rep(list(options), length(ids)) + names(options) <- ids + } + + map$dependencies <- c(map$dependencies, leafletsyncDependency()) + invokeMethod(map, NULL, "addLeafletsync", ids, synclist, options) +} + +#' Removes synchronization. +#' +#' Removes the synchronization of multiple maps from a specific map. +#' +#' @param map the map +#' @param id The map id from which to unsynchronize the maps in \code{unsyncids} +#' @param unsyncids Unsynchronize the maps with the following IDs +#' +#' @family leafletsync Functions +#' @return A map +#' @export +unsync <- function(map, id = NULL, unsyncids = NULL) { + if (is.null(id)) stop("You need to pass an `id` argument as character") + if (is.null(unsyncids)) stop("You need to pass an `unsyncids` argument as character vector") + invokeMethod(map, NULL, "unsyncLeaflet", id, unsyncids) +} + +#' Is a map synchronized? +#' +#' Is a map snychronized with any or a specific map? +#' Invoking this method sets a Shiny input that returns \code{TRUE} when +#' the map is synchronized with another map. If \code{syncwith} is +#' set, \code{TRUE} is returned if the map is synchronized exactly +#' with that other map. +#' +#' @param map the map +#' @param id The map id +#' @param syncwith Is the map synchronized with one of these maps? +#' +#' @details The Siny input name is combined of the map-id and \code{"_synced"}. +#' For a map with id \code{map1} the input can be retrieved with +#' \code{input$map1_synced}. +#' +#' @family leafletsync Functions +#' @return A map +#' @export +isSynced <- function(map, id = NULL, syncwith = NULL) { + if (is.null(id)) stop("You need to pass an `id` argument as character") + invokeMethod(map, NULL, "isSyncedLeaflet", id, syncwith) +} + +#' leafletsync Options +#' +#' Additional list of options. +#' +#' @param noInitialSync Setting to \code{TRUE} disables initial synchronization +#' of the maps. The default is \code{FALSE}. +#' @param syncCursor The default \code{TRUE} adds a circle marker on the +#' synced map. +#' @param offsetFn A JavaScript-function to compute an offset for the center. +#' @family leafletsync Functions +#' @return A list of options for \code{addLeafletsync} +#' @export +leafletsyncOptions = function( + noInitialSync = FALSE, + syncCursor = TRUE, + offsetFn = JS("function (center, zoom, refMap, tgtMap) { return center; }")) { + filterNULL(list( + noInitialSync = noInitialSync, + syncCursor = syncCursor, + offsetFn = offsetFn + )) +} + diff --git a/R/mapkeyIcon.R b/R/mapkeyIcon.R index 8d656425..e1d6d784 100644 --- a/R/mapkeyIcon.R +++ b/R/mapkeyIcon.R @@ -1,4 +1,3 @@ - mapkeyIconDependency <- function() { list( htmltools::htmlDependency( @@ -12,21 +11,18 @@ mapkeyIconDependency <- function() { ) } - -#' Make mapkey-icon set -#' +#' Make Mapkey-icon set #' @param ... icons created from \code{\link{makeMapkeyIcon}()} -#' @family Mapkey Plugin +#' @family Mapkey Functions +#' @references \url{https://github.com/mapshakers/leaflet-mapkey-icon} #' @export +#' @return A list of class \code{"leaflet_mapkey_icon_set"} #' @examples -#' #' iconSet = mapkeyIconList( #' red = makeMapkeyIcon(color = "#ff0000"), #' blue = makeMapkeyIcon(color = "#0000ff") #' ) -#' #' iconSet[c("red", "blue")] -#' mapkeyIconList = function(...) { res = structure( list(...), @@ -42,16 +38,14 @@ mapkeyIconList = function(...) { #' @param x icons #' @param i offset #' @export -#' @family Mapkey Plugin +#' @family Mapkey Functions `[.leaflet_mapkey_icon_set` = function(x, i) { if (is.factor(i)) { i = as.character(i) } - if (!is.character(i) && !is.numeric(i) && !is.integer(i)) { stop("Invalid subscript type '", typeof(i), "'") } - structure(.subset(x, i), class = "leaflet_mapkey_icon_set") } @@ -77,11 +71,18 @@ mapkeyIconSetToMapkeyIcons = function(x) { })) } -#' Make mapkey Icon -#' +#' Make Mapkey Icon #' @inheritParams mapkeyIcons #' @export -#' @family Mapkey Plugin +#' @family Mapkey Functions +#' @references \url{https://github.com/mapshakers/leaflet-mapkey-icon} +#' @return A list of mapkey-icon data that can be passed to the argument \code{icon} +#' @examples +#' makeMapkeyIcon(icon = "traffic_signal", +#' color = "#0000ff", +#' iconSize = 12, +#' boxShadow = FALSE, +#' background="transparent") makeMapkeyIcon <- function( icon = 'mapkey', color = "#ff0000", @@ -111,34 +112,37 @@ makeMapkeyIcon <- function( structure(icon, class = "leaflet_mapkey_icon") } -#' Create a list of mapkey icon data see -#' \url{https://github.com/mapshakers/leaflet-mapkey-icon} +#' Create a list of Mapkey icon data #' #' An icon can be represented as a list of the form \code{list(color, iconSize, #' ...)}. This function is vectorized over its arguments to create a list of #' icon data. Shorter argument values will be re-cycled. \code{NULL} values for #' these arguments will be ignored. -#' @param icon ID of the mapkey Icon you want to use. See -#' \href{http://mapkeyicons.com/}{mapkeyicons.com} for a full list. +#' @param icon ID of the mapkey Icon you want to use. #' @param color Any CSS color (e.g. 'red','rgba(20,160,90,0.5)', '#686868', ...) #' @param iconSize Size of Icon in Pixels. Default is 12 #' @param background Any CSS color or false for no background #' @param borderRadius Any number (for circle size/2, for square 0.001) -#' @param hoverScale Any real number (best result in range 1 - 2, use 1 for no effect) +#' @param hoverScale Any real number (best result in range 1 - 2, use 1 for no +#' effect) #' @param hoverEffect Switch on/off effect on hover -#' @param hoverCSS CSS code (e.g. "background-color:#992b00!important; color:#99defc!important;") -#' @param additionalCSS CSS code (e.g. "border:4px solid #aa3838;") -#' @param htmlCode e.g. ''. -#' See \href{http://mapkeyicons.com/}{mapkeyicons.com} for further information -#' @param boxShadow Should a shadow be visible. +#' @param hoverCSS CSS code (e.g. \code{"background-color:#992b00 !important; +#' color:#99defc !important;"}) +#' @param additionalCSS CSS code (e.g. \code{"border:4px solid #aa3838;"}) +#' @param htmlCode e.g. \code{''}. +#' @param boxShadow Should a shadow be visible #' @export -#' @family Mapkey Plugin +#' @family Mapkey Functions +#' @references \url{https://github.com/mapshakers/leaflet-mapkey-icon} +#' @return A list of mapkey-icon data that can be passed to the argument \code{icon} #' @examples \dontrun{ -#' makeMapkeyIcon(icon = "traffic_signal", -#' color = "#0000ff", -#' iconSize = 12, -#' boxShadow = FALSE, -#' background="transparent") +#' library(leaflet) +#' leaflet() %>% +#' addMapkeyMarkers(data = breweries91, +#' icon = mapkeyIcons( +#' color = "red", +#' borderRadius = 0, +#' iconSize = 25)) #' } mapkeyIcons <- function( icon = 'mapkey', @@ -168,53 +172,27 @@ mapkeyIcons <- function( )) } -#' Add mapkey Markers +#' Add Mapkey Markers #' @param map the map to add mapkey Markers to. -#' @param lng a numeric vector of longitudes, or a one-sided formula of the form -#' \code{~x} where \code{x} is a variable in \code{data}; by default (if not -#' explicitly provided), it will be automatically inferred from \code{data} by -#' looking for a column named \code{lng}, \code{long}, or \code{longitude} -#' (case-insensitively) -#' @param lat a vector of latitudes or a formula (similar to the \code{lng} -#' argument; the names \code{lat} and \code{latitude} are used when guessing -#' the latitude column from \code{data}) -#' @param popup a character vector of the HTML content for the popups (you are -#' recommended to escape the text using \code{\link[htmltools]{htmlEscape}()} -#' for security reasons) -#' @param popupOptions options for popup -#' @param layerId the layer id -#' @param group the name of the group the newly created layers should belong to -#' (for \code{\link{clearGroup}} and \code{\link{addLayersControl}} purposes). -#' Human-friendly group names are permitted--they need not be short, -#' identifier-style names. Any number of layers and even different types of -#' layers (e.g. markers and polygons) can share the same group name. -#' @param data the data object from which the argument values are derived; by -#' default, it is the \code{data} object provided to \code{leaflet()} -#' initially, but can be overridden -#' @param icon the icon(s) for markers; -#' @param label a character vector of the HTML content for the labels -#' @param labelOptions A Vector of \code{\link{labelOptions}} to provide label -#' options for each label. Default \code{NULL} -#' @param clusterOptions if not \code{NULL}, markers will be clustered using -#' \href{https://github.com/Leaflet/Leaflet.markercluster}{Leaflet.markercluster}; -#' you can use \code{\link{markerClusterOptions}()} to specify marker cluster -#' options -#' @param clusterId the id for the marker cluster layer -#' @param options a list of extra options for tile layers, popups, paths -#' (circles, rectangles, polygons, ...), or other map elements -#' @family Mapkey Plugin +#' @inheritParams leaflet::addAwesomeMarkers +#' @param options a list of extra options for markers. See +#' \code{\link[leaflet]{markerOptions}} +#' @family Mapkey Functions +#' @references \url{https://github.com/mapshakers/leaflet-mapkey-icon} +#' @inherit leaflet::addMarkers return #' @export #' @examples -#' leaflet() %>% -#' addTiles() %>% -#' addMapkeyMarkers( -#' lng = -118.456554, lat = 34.078039, -#' label = "This is a label", -#' icon = makeMapkeyIcon(icon = "school") -#' ) +#' library(leaflet) #' -#' ## for more examples see -#' # browseURL(system.file("examples/mapkeyIcons.R", package = "leaflet.extras2")) +#' leaflet() %>% +#' addTiles() %>% +#' addMapkeyMarkers(data = breweries91, +#' icon = makeMapkeyIcon(icon = "mapkey", +#' iconSize = 30, +#' boxShadow = FALSE, +#' background = "transparent"), +#' group = "mapkey", +#' label = ~state, popup = ~village) addMapkeyMarkers = function( map, lng = NULL, lat = NULL, layerId = NULL, group = NULL, icon = NULL, diff --git a/R/movingmarker.R b/R/movingmarker.R new file mode 100644 index 00000000..4afe66e0 --- /dev/null +++ b/R/movingmarker.R @@ -0,0 +1,201 @@ +movingmarkerDependency <- function() { + list( + htmltools::htmlDependency( + "lfx-movingmarker", version = "1.0.0", + src = system.file("htmlwidgets/lfx-movingmarker", package = "leaflet.extras2"), + script = c("MovingMarker.js", + "lfx-movingmarker-bindings.js"), + all_files = TRUE + ) + ) +} +leafletAwesomeMarkersDependencies1 <- function() { + list(htmltools::htmlDependency("leaflet-awesomemarkers", + "2.0.3", "htmlwidgets/plugins/Leaflet.awesome-markers", + package = "leaflet", script = c("leaflet.awesome-markers.min.js"), + stylesheet = c("leaflet.awesome-markers.css"))) +} + + +#' Add Moving Markers +#' +#' The function expects either line or point data as spatial data or as Simple Feature. +#' Alternatively, coordinates can also be passed as numeric vectors. +#' @param map the map to add moving markers +#' @inheritParams leaflet::addAwesomeMarkers +#' @param duration Duration in milliseconds per line segment between 2 points. +#' Can be a vector or a single number. Default is \code{1000} +#' @param movingOptions a list of extra options for moving markers. +#' See \code{\link{movingMarkerOptions}} +#' @param layerId In order to be able to address the moving markings +#' individually, a layerId is required. If none is specified, one is created +#' that is derived from the current timestamp. +#' @param options a list of extra options for markers. See +#' \code{\link[leaflet]{markerOptions}} +#' @family MovingMarker Functions +#' @references \url{https://github.com/ewoken/Leaflet.MovingMarker} +#' @inherit leaflet::addMarkers return +#' @export +#' @examples \dontrun{ +#' library(sf) +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' crds <- data.frame(structure(c(-67.5, -68.5, -69.6, -70.5, -71.3, -72.2, -72.7, +#' -72.9, -73, -72.4, -70.8, 15.8, 16.5, 17.3, 17.8, 18.3, 18.6, +#' 19.8, 21.6, 23.5, 25.1, 27.9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +#' dim = c(11L, 3L), dimnames = list(NULL, c("X", "Y", "L1")))) +#' df <- st_sf(st_sfc(st_linestring(as.matrix(crds), dim="XYZ"), crs = 4326)) +#' st_geometry(df) <- "geometry"; df <- st_zm(df) +#' +#' leaflet() %>% +#' addTiles() %>% +#' addPolylines(data = df) %>% +#' addMovingMarker(data = df, +#' movingOptions = movingMarkerOptions(autostart = TRUE, loop = TRUE), +#' label="I am a pirate!", +#' popup="Arrr") +#' } +addMovingMarker = function( + map, lng = NULL, lat = NULL, layerId = NULL, group = NULL, + duration = 2000, + icon = NULL, + popup = NULL, popupOptions = NULL, + label = NULL, labelOptions = NULL, + movingOptions = movingMarkerOptions(), + options = leaflet::markerOptions(), + data = leaflet::getMapData(map)) { + + if (missing(labelOptions)) + labelOptions <- labelOptions() + + if (!is.null(data)) { + if (!requireNamespace("sf")) { + stop("The package `sf` is needed for this plugin. ", + "Please install it with:\ninstall.packages('sf')") + } + if (inherits(data, "Spatial")) { + data <- sf::st_as_sf(data) + } + if (!inherits(sf::st_geometry(data), "sfc_POINT")) { + data <- sf::st_cast(data, "POINT") + } + } + + if (is.null(layerId)) + layerId <- paste0("_", as.numeric(Sys.time())) + + pts <- derivePoints(data, lng, lat, missing(lng), missing(lat), "addMovingMarker") + + duration <- evalFormula(duration, data) + options <- filterNULL(c(options, movingOptions)) + + map$dependencies <- c(map$dependencies, + movingmarkerDependency()) + + if (inherits(icon, "leaflet_awesome_icon")) { + icon$class = "awesome" + map$dependencies <- c(map$dependencies, + leafletAwesomeMarkersDependencies1()) + } + + leaflet::invokeMethod( + map, data, "addMovingMarker", cbind(pts$lat, pts$lng), + duration, icon, layerId, + group, options, popup, popupOptions, + leaflet::safeLabel(label, data), labelOptions) %>% + expandLimits(pts$lat, pts$lng) +} + + +#' Set options for Moving Markers +#' @param autostart If \code{TRUE} the marker will start automatically after it +#' is added to map. Default is \code{FALSE} +#' @param loop if \code{TRUE} the marker will start automatically at the +#' beginning of the polyline when the it arrives at the end. +#' Default is \code{FALSE} +#' @param pauseOnZoom Pause the marker while zooming. While this improves the +#' animation, it is not recommended because the animation time is lost and +#' the marker will not appear at the correct time at the next station. +#' Default is \code{FALSE} +#' @family MovingMarker Functions +#' @references \url{https://github.com/ewoken/Leaflet.MovingMarker} +#' @return A list of extra options for moving markers +#' @export +movingMarkerOptions <- function(autostart = FALSE, loop = FALSE, + pauseOnZoom = FALSE) { + list( + autostart = autostart, + loop = loop, + pauseOnZoom = pauseOnZoom + ) +} + + +#' Interact with the moving markers +#' +#' The marker begins its path or resumes if it is paused. +#' @param map The leafletProxy object +#' @param layerId You can pass a string or a vector of strings for the moving +#' markers that you want to address. If none is specified, the action will be +#' applied to all moving markers. +#' @param latlng Coordinates as list (e.g.: \code{list(33, -67)} or +#' \code{list(lng=-65, lat=33)}) +#' @param duration Duration in milliseconds +#' @param pointIndex Index of a certain point +#' @family MovingMarker Functions +#' @references \url{https://github.com/ewoken/Leaflet.MovingMarker} +#' @aliases startMoving +#' @return the new \code{map} object +#' @export +startMoving <- function(map, layerId = NULL) { + leaflet::invokeMethod(map, NULL, "startMoving", layerId) +} + +#' @describeIn startMoving Manually stops the marker, if you call \code{start} +#' after, the marker starts again the polyline at the beginning. +#' @aliases stopMoving +#' @export +stopMoving <- function(map, layerId = NULL) { + leaflet::invokeMethod(map, NULL, "stopMoving", layerId) +} + +#' @describeIn startMoving Pauses the marker +#' @aliases pauseMoving +#' @export +pauseMoving <- function(map, layerId = NULL) { + leaflet::invokeMethod(map, NULL, "pauseMoving", layerId) +} + +#' @describeIn startMoving The marker resumes its animation +#' @aliases resumeMoving +#' @export +resumeMoving <- function(map, layerId = NULL) { + leaflet::invokeMethod(map, NULL, "resumeMoving", layerId) +} + +#' @describeIn startMoving Adds a point to the polyline. +#' Useful, if we have to set the path one by one. +#' @aliases addLatLngMoving +#' @export +addLatLngMoving <- function(map, layerId = NULL, latlng, duration) { + leaflet::invokeMethod(map, NULL, "addLatLngMoving", layerId, latlng, duration) +} + +#' @describeIn startMoving Stop the current animation and make the marker move +#' to \code{latlng} in \code{duration} ms. +#' @aliases moveToMoving +#' @export +moveToMoving <- function(map, layerId = NULL, latlng, duration) { + leaflet::invokeMethod(map, NULL, "moveToMoving", layerId, latlng, duration) +} + +#' @describeIn startMoving The marker will stop at the \code{pointIndex} point +#' of the polyline for \code{duration} milliseconds. You can't add a station +#' at the first or last point of the polyline. +#' @aliases addStationMoving +#' @export +addStationMoving <- function(map, layerId = NULL, pointIndex, duration) { + leaflet::invokeMethod(map, NULL, "addStationMoving", layerId, pointIndex, duration) +} + diff --git a/R/openweather.R b/R/openweather.R index c76566a8..c84c0d80 100644 --- a/R/openweather.R +++ b/R/openweather.R @@ -1,40 +1,54 @@ openweatherDependency <- function() { list( htmltools::htmlDependency( - "lfx-openweather", version = "2.1.0", + "lfx-openweather", version = "1.0.0", src = system.file("htmlwidgets/lfx-openweather", package = "leaflet.extras2"), script = c( "leaflet-openweathermap.js", - "leaflet-openweather-bindings.js"), + "leaflet-openweathermap-bindings.js"), stylesheet = "leaflet-openweathermap.css" ) ) } -#' Add OpenWeather Layers -#' -#' @param map A map widget object created from \code{\link[leaflet]{leaflet}} -#' @param options List of further options. See \code{\link{hexbinOptions}} +#' Add OpenWeatherMap Tiles +#' @inheritParams leaflet::addWMSTiles +#' @param apikey a valid OpenWeatherMap-API key. +#' @param layers character vector of layers you wish to add to the map. The +#' following layers are currently possible \code{c("clouds", "cloudsClassic", +#' "precipitation", "precipitationClassic", "rain", "rainClassic", "snow", +#' "pressure", "pressureContour", "temperature", "wind")}. +#' @param opacity opacity of the layer +#' @param options List of further options. See \code{\link{openweatherOptions}} #' #' @note Out of the box a legend image is only available for Pressure, #' Precipitation Classic, Clouds Classic, Rain Classic, Snow, Temperature and -#' Wind Speed. -#' @seealso https://github.com/Asymmetrik/leaflet-d3#hexbins-api -#' @family Openweather Plugin +#' Wind Speed. Please add your own images if you need some more. +#' +#' @references \url{https://github.com/trafficonese/leaflet-openweathermap} +#' @family Openweathermap Functions +#' @inherit leaflet::addWMSTiles return #' @export +#' @examples \dontrun{ +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' Sys.setenv("OPENWEATHERMAP" = 'Your_API_Key') +#' +#' leaflet() %>% +#' addTiles() %>% setView(9, 50, 6) %>% +#' addOpenweatherTiles(layers = "wind") +#' } addOpenweatherTiles <- function( - map, apikey = NULL, layers = NULL, addControl = TRUE, - group = NULL, opacity = 0.5) { - - # showLegend - # legendImagePath - # legendPosition <- c('topright', 'topleft', 'bottomright', 'bottomleft') + map, apikey = NULL, layers = NULL, + group = NULL, layerId = NULL, opacity = 0.5, + options = openweatherOptions()) { if (is.null(apikey)) { - apikey <- Sys.getenv("OPENWEATHER") + apikey <- Sys.getenv("OPENWEATHERMAP") if (apikey == "") { stop("You must either pass an `apikey` directly or save it as ", - "system variable under `OPENWEATHER`.") + "system variable under `OPENWEATHERMAP`.") } } @@ -55,73 +69,122 @@ addOpenweatherTiles <- function( layers <- layers[idx] } - if (length(opacity) == 1) - opacity <- rep(opacity, length(layers)) + if (!is.null(layerId)) { + if (length(layerId) != length(layers)) { + warning("The lengths of `layers` and `layerId` do not match.", + "Instead, the `layers` are used as the `layerID`.") + layerId <- layers + } + } else { + layerId <- layers + } + if (!is.null(group)) { + if (length(group) == 1 && length(layers) > 1) { + group <- rep(group, length(layers))[seq.int(layers)] + } + } else { + group = layers + } + + options <- c(appId = apikey, + opacity = opacity, + options) map$dependencies <- c(map$dependencies, openweatherDependency()) - invokeMethod(map, getMapData(map), "addOpenweather", apikey, layers, - addControl, group, opacity) + invokeMethod(map, NULL, "addOpenweather", layers, + group, layerId, options) } -#' Add OpenWeather Layers -#' -#' @param map A map widget object created from \code{\link[leaflet]{leaflet}} -#' @param options List of further options. See \code{\link{hexbinOptions}} -#' -#' @note Out of the box a legend image is only available for Pressure, -#' Precipitation Classic, Clouds Classic, Rain Classic, Snow, Temperature and -#' Wind Speed. -#' @seealso https://github.com/Asymmetrik/leaflet-d3#hexbins-api -#' @family Openweather Plugin +#' OpenWeatherMap Options +#' @param showLegend If \code{TRUE} and option \code{legendImagePath} is set +#' there will be a legend image on the map +#' @param legendImagePath A URL (is set to a default image for some layers, null +#' for others, see below). URL or relative path to an image which is a legend +#' to this layer +#' @param legendPosition Position of the legend images on the map. Must be one +#' of \code{'bottomleft', 'bottomright', 'topleft', 'topright'} +#' @return A list of options for \code{addOpenweatherTiles} +#' @family Openweathermap Functions #' @export -addOpenweatherCurrent <- function( - map, apikey = NULL, layers = NULL, addControl = TRUE, - group = NULL, opacity = 0.5) { +openweatherOptions <- function(showLegend = TRUE, + legendImagePath = NULL, + legendPosition = c('bottomleft', 'bottomright', + 'topleft', 'topright')) { + legendPosition <- match.arg(legendPosition) + leaflet::filterNULL(list( + showLegend = showLegend, + legendImagePath = legendImagePath, + legendPosition = legendPosition + )) +} +#' Add current OpenWeatherMap Marker +#' @inheritParams leaflet::addMarkers +#' @param apikey a valid Openweathermap-API key. +#' @param options List of further options. See +#' \code{\link{openweatherCurrentOptions}} +#' +#' @references \url{https://github.com/trafficonese/leaflet-openweathermap} +#' @note The current weather icons will appear beginning with zoom level 9 +#' and if used in Shiny, a click on an icon will update a Shiny input at +#' \code{input$MAPID_owm_click}. +#' @family Openweathermap Functions +#' @inherit leaflet::addMarkers return +#' @export +#' @examples \dontrun{ +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' Sys.setenv("OPENWEATHERMAP" = 'Your_API_Key') +#' +#' leaflet() %>% +#' addTiles() %>% setView(9, 50, 9) %>% +#' addOpenweatherCurrent(options = openweatherCurrentOptions( +#' lang = "en", popup = TRUE)) +#' } +addOpenweatherCurrent <- function(map, apikey = NULL, group = NULL, + layerId = NULL, + options = openweatherCurrentOptions()) { if (is.null(apikey)) { - apikey <- Sys.getenv("OPENWEATHER") + apikey <- Sys.getenv("OPENWEATHERMAP") if (apikey == "") { stop("You must either pass an `apikey` directly or save it as ", - "system variable under `OPENWEATHER`.") + "system variable under `OPENWEATHERMAP`.") } } + options <- c(appId = apikey, + type = "city", + options) + map$dependencies <- c(map$dependencies, openweatherDependency()) - invokeMethod(map, getMapData(map), "addOpenweatherCurrent", apikey, layers, - addControl, group, opacity) + invokeMethod(map, NULL, "addOpenweatherCurrent", group, layerId, options) } - -# appId: String ( null ). Please get a free API key (called APPID) if you're using OWM's current weather data regulary. -# lang: 'en', 'de', 'ru', 'fr', 'es', 'ca'. Language of popup texts. Note: not every translation is finished yet. -# minZoom: Number ( 7 ). Minimal zoom level for fetching city data. Use smaller values only at your own risk. -# interval: Number ( 0 ). Time in minutes to reload city data. Please do not use less than 10 minutes. 0 no reload (default) -# progressControl: true or false. Whether a progress control should be used to tell the user that data is being loaded at the moment. -# imageLoadingUrl: URL ( 'owmloading.gif' ). URL of the loading image, or a path relative to the HTML document. This is important when the image is not in the same directory as the HTML document! -# imageLoadingBgUrl: URL ( null ). URL of background image for progress control if you don't like the default one. -# temperatureUnit: 'C', 'F', 'K'. Display temperature in Celsius, Fahrenheit or Kelvin. -# temperatureDigits: Number ( 1 ). Number of decimal places for temperature. -# speedUnit: 'ms', 'kmh' or 'mph'. Unit of wind speed (m/s, km/h or mph). -# speedDigits: Number ( 0 ). Number of decimal places for wind speed. -# popup: true or false. Whether to bind a popup to the city marker. -# keepPopup: true or false. When true it tries to reopen an already open popup on move or reload. Can result in an additional map move (after reopening the popup) with closing and reopening the popup once again. -# showOwmStationLink: true or false. Whether to link city name to OWM. -# showWindSpeed: 'speed', 'beaufort' or 'both'. Show wind speed as speed in speedUnit or in beaufort scala or both. -# showWindDirection: 'deg', 'desc' or 'both'. Show wind direction as degree, as description (e.g. NNE) or both. -# showTimestamp: true or false. Whether to show the timestamp of the data. -# showTempMinMax: true or false. Whether to show temperature min/max. -# useLocalTime: true or false. Whether to use local time or UTC for the timestamp. -# clusterSize: Number ( 150 ). If some cities are too close to each other, they are hidden. In an area of the size clusterSize pixels * clusterSize pixels only one city is shown. If you zoom in the hidden cities will appear. -# imageUrlCity: URL ( 'https://openweathermap.org/img/w/{icon}.png' ). URL template for weather condition images of cities. {icon} will be replaced by the icon property of city's data. See http://openweathermap.org/img/w/ for some standard images. -# imageWidth: Number ( 50 ). Width of city's weather condition image. -# imageHeight: Number ( 50 ). Height of city's weather condition image. -# markerFunction: Function ( null ). User defined function for marker creation. Needs one parameter for city data. -# popupFunction: Function ( null ). User defined function for popup creation. Needs one parameter for city data. -# caching: true or false. Use caching of current weather data. Cached data is reloaded when it is too old or the new bounding box doesn't fit inside the cached bounding box. -# cacheMaxAge: Number ( 15 ). Maximum age in minutes for cached data before it is considered as too old. -# keepOnMinZoom: false or true. Keep or remove markers when zoom < minZoom. -# baseUrl: Defaults to "https://{s}.tile.openweathermap.org/map/{layername}/{z}/{x}/{y}.png" - only change it when you know what you're doing. - +#' openweatherCurrentOptions +#' @param lang 'en', 'de', 'ru', 'fr', 'es', 'ca'. Language of popup texts. +#' Note: not every translation is finished yet. +#' @param minZoom Number (7). Minimal zoom level for fetching city data. Use +#' smaller values only at your own risk. +#' @param interval Number (0). Time in minutes to reload city data. Please do +#' not use less than 10 minutes. +#' @param ... Further options passed to \code{L.OWM.current}. See the +#' \href{https://github.com/trafficonese/leaflet-openweathermap#options}{full +#' list of options} +#' @family Openweathermap Functions +#' @return A list of options for \code{addOpenweatherCurrent} +#' @export +openweatherCurrentOptions <- function(lang = "en", + minZoom = 7, + interval = 10, + ...) { + leaflet::filterNULL(list( + lang = lang, + minZoom = minZoom, + interval = interval, + ... + )) +} diff --git a/R/playback.R b/R/playback.R index da39546e..c2f6e37f 100644 --- a/R/playback.R +++ b/R/playback.R @@ -1,136 +1,148 @@ playbackDependencies <- function() { list( htmlDependency( - "leaflet.playback", "1.0.0", + "lfx-playback", "1.0.0", src = system.file("htmlwidgets/lfx-playback", package = "leaflet.extras2"), script = c("leaflet.playback.js", - "leaflet.playback.bindings.js") + "leaflet.playback-bindings.js") ) ) } #' Add Playback to Leaflet #' +#' The \href{https://github.com/hallahan/LeafletPlayback}{LeafletPlayback plugin} +#' provides the ability to replay GPS Points in the form of +#' POINT Simple Features. Rather than simply animating a marker along a +#' polyline, the speed of the animation is synchronized to a clock. The playback +#' functionality is similar to a video player; you can start and stop playback or +#' change the playback speed. #' @param map a map widget -#' @param data data can either be a matrix or data.frame with coordinates, -#' a POINT Simple Feature or a \code{SpatialPointsDataFrame}. -#' It must contain a time column of class \code{POSIXct} or \code{numeric}. -#' It can also be a JSON string which must be in a specific form. See the Details -#' for further information. +#' @param data data must be a POINT Simple Feature or a list of POINT Simple +#' Feature's with a time column. +#' @param popup A formula with the column names for the popup content +#' @param label A formula with the column names for the label content +#' @param name A formula with the column names for the feature name #' @param time The column name of the time column. Default is \code{"time"}. -#' @param icon an icon which can be created with \code{\link{makeIcon}{leaflet}} -#' @param pathOptions style the CircleMarker with \code{\link{pathOptions}{leaflet}} -#' @param options see \code{\link{playbackOptions}} -#' @description Add Leaflet Playback Plugin based on the -#' \href{https://github.com/hallahan/LeafletPlayback}{LeafletPlayback plugin} -#' @details If data is a JSON string, it must have the following form: -#' \preformatted{ -#' { -#' "type": "Feature", -#' "geometry": { -#' "type": "MultiPoint", -#' "coordinates": [ -#' [-123.2653968, 44.54962188], -#' [-123.26542599, 44.54951009] -#' ] -#' }, -#' "properties": { -#' "time": [1366067072000, 1366067074000] -#' } +#' @param icon an icon which can be created with \code{\link[leaflet]{makeIcon}} +#' @param pathOpts style the CircleMarkers with +#' \code{\link[leaflet]{pathOptions}} +#' @param options List of additional options. See \code{\link{playbackOptions}} +#' @note If used in Shiny, you can listen to 2 events +#' \itemize{ +#' \item `map-ID`+"_pb_mouseover" +#' \item `map-ID`+"_pb_click" #' } -#' } -#' Additional arrays can be inside the properties, but are not required and are not used -#' by the plugin. If the JSON is stored in a file you can load it to R via: -#' \code{data <- paste(readLines(json_file_path, warn = F), collapse = "")} -#' +#' @family Playback Functions +#' @references \url{https://github.com/hallahan/LeafletPlayback} #' @export -#' @family Playback Plugin +#' @inheritParams leaflet::addMarkers +#' @inherit leaflet::addMarkers return +#' @examples \dontrun{ +#' library(leaflet) +#' library(leaflet.extras2) +#' library(sf) +#' +#' ## Single Elements +#' data <- sf::st_as_sf(leaflet::atlStorms2005[1,]) +#' data <- st_cast(data, "POINT") +#' data$time = as.POSIXct( +#' seq.POSIXt(Sys.time() - 1000, Sys.time(), length.out = nrow(data))) +#' data$label <- as.character(data$time) +#' +#' leaflet() %>% +#' addTiles() %>% +#' addPlayback(data = data, label = ~label, +#' popup = ~sprintf("I am a popup for %s and %s", +#' Name, label), +#' popupOptions = popupOptions(offset = c(0, -35)), +#' options = playbackOptions(radius = 3, +#' tickLen = 36000, +#' speed = 50, +#' maxInterpolationTime = 1000), +#' pathOpts = pathOptions(weight = 5)) +#' +#' +#' ## Multiple Elements +#' data <- sf::st_as_sf(leaflet::atlStorms2005[1:5,]) +#' data$Name <- as.character(data$Name) +#' data <- st_cast(data, "POINT") +#' data$time <- unlist(lapply(rle(data$Name)$lengths, function(x) { +#' seq.POSIXt(as.POSIXct(Sys.Date()-2), as.POSIXct(Sys.Date()), length.out = x) +#' })) +#' data$time <- as.POSIXct(data$time, origin="1970-01-01") +#' data$label <- paste0("Time: ", data$time) +#' data$popup = sprintf("

Customized Popup

Name: %s
Time: %s", +#' data$Name, data$time) +#' data <- split(data, f = data$Name) +#' +#' leaflet() %>% +#' addTiles() %>% +#' addPlayback(data = data, +#' popup = ~popup, +#' label = ~label, +#' popupOptions = popupOptions(offset=c(0,-35)), +#' labelOptions = labelOptions(noHide = TRUE), +#' options = playbackOptions(radius = 3, +#' tickLen = 1000000, +#' speed = 5000, +#' maxInterpolationTime = 10000, +#' transitionpopup = FALSE, +#' transitionlabel = FALSE, +#' playCommand = "Let's go", +#' stopCommand = "Stop it!", +#' color = c("red","green","blue", +#' "orange","yellow")), +#' pathOpts = pathOptions(weight = 5)) +#' } addPlayback <- function(map, data, time = "time", icon = NULL, - pathOptions = pathOptions(), - options = playbackOptions()){ + pathOpts = pathOptions(), + popup = NULL, + label = NULL, + popupOptions = NULL, + labelOptions = NULL, + options = playbackOptions(), + name = NULL){ - ## If data is a `data.frame` / `data.table` or `matrix` - if (inherits(data, "data.frame") || inherits(data, "matrix")) { - ## Check if the `time` column exists. It is required! - if (!any(colnames(data) == time)) stop("No column named `", time, "` in data.") - ## If the `time` column is present but not numeric, convert it - if (!is.null(data[,time]) && !is.numeric(data[,time])) { - data$time <- as.numeric(data[,time][[1]]) - } - ## If there is no `geometry` column, check if lat/lng are given as columns - if (!any(colnames(data) %in% c("geom","geometry"))) { - ## Check if any column has lat/lon values - latnams <- c("y","lat","latitude") - lonnams <- c("x","lon","lng","longitude") - has_lat <- tolower(colnames(data)) %in% latnams - has_lng <- tolower(colnames(data)) %in% lonnams - if (any(has_lat) && any(has_lng)) { - ## If data has lat/lon columns, use `sf` if possible to transform to Simple Feature - if (requireNamespace("sf", quietly = TRUE)) { - data <- sf::st_as_sf(data.frame(data), ## Convert to data.frame. Matrix wouldnt work otherwise - coords = c(colnames(data)[which(has_lng)], - colnames(data)[which(has_lat)])) - } else { - ## If `sf` is not available, build a list which can be read by the plugin - data <- list( - coordinates = cbind(data[,colnames(data)[which(has_lng)]], - data[,colnames(data)[which(has_lat)]]), - time = data[,time] - ) - } - } else { - ## No lat/lng columns in data. Error - stop("Cannot read Lat/Lon columns. The column names must match either: \n", - paste(latnams, collapse = ","), " / ", paste(lonnams, collapse = ",")) - } - } + if (!requireNamespace("sf")) { + stop("The package `sf` is needed for this plugin. ", + "Please install it with:\ninstall.packages('sf')") } - ## If data is a `SpatialPointsDataFrame` - if (inherits(data, "SpatialPointsDataFrame")) { - if (requireNamespace("sf", quietly = TRUE)) { - ## If `sf` is available, use it to transform to Simple Features - data <- sf::st_as_sf(data) - } else { - ## If `sf` is not available, build a list with coordinates and the time column. - coords <- sp::coordinates(data) - data <- list( - coordinates = cbind(coords[,1], coords[,2]), - time = data[,time] - ) - } - } - - ## If data is a `character` - if (inherits(data, "character")) { - ## Since `basename` does not work, when the string is too long, we count - ## the number of characters first. 300 is chosen randomly, but I doubt that - ## file paths would be that long. If it's longer, we assume that its a JSON string already - if (nchar(data) < 300) { - ## Check if it's a path or URL to a json file - fileext <- gsub(".*\\.", "", basename(data)) - if (fileext == "json" || fileext == "geojson") { - data <- jsonlite::read_json(data) - } - } - ## Otherwise just pass the string (do nothing) + if (inherits(data, "list")) { + data <- lapply(data, function(x) { + to_jsonformat(x, time, popup, label, name) + }) + bounds <- do.call(rbind, lapply(data, function(x) x$geometry$coordinates)) + } else { + data <- to_jsonformat(data, time, popup, label, name) + bounds <- data$geometry$coordinates } map$dependencies <- c(map$dependencies, playbackDependencies()) - options = leaflet::filterNULL(c(icon = list(icon), - pathOptions = list(pathOptions), + options <- leaflet::filterNULL(c(icon = list(icon), + pathOptions = list(pathOpts), + popupOptions = list(popupOptions), + labelOptions = list(labelOptions), + popups = if(is.null(popup)) NULL else TRUE, + labels = if(is.null(label)) NULL else TRUE, options)) - invokeMethod(map, NULL, "addPlayback", data, options) + invokeMethod(map, NULL, "addPlayback", data, options) %>% + expandLimits(lat = as.numeric(bounds[,"Y"]), + lng = as.numeric(bounds[,"X"])) } #' playbackOptions #' +#' A list of options for \code{\link{addPlayback}}. For a full list please visit +#' the \href{https://github.com/hallahan/LeafletPlayback}{plugin repository}. +#' @param color colors of the CircleMarkers. #' @param radius a numeric value for the radius of the CircleMarkers. -#' @param tickLen Set tick length in miliseconds. Increasing this value, may +#' @param tickLen Set tick length in milliseconds. Increasing this value, may #' improve performance, at the cost of animation smoothness. Default is 250 -#' @param speed Set float multiplier for default animation speed. Default is 1 -#' @param maxInterpolationTime Set max interpolation time in seconds. +#' @param speed Set float multiplier for default animation speed. Default is 50 +#' @param maxInterpolationTime Set max interpolation time in milliseconds. #' Default is 5*60*1000 (5 minutes). #' @param tracksLayer Set \code{TRUE} if you want to show layer control on the #' map. Default is \code{TRUE} @@ -140,25 +152,36 @@ addPlayback <- function(map, data, time = "time", icon = NULL, #' Default is \code{TRUE} #' @param sliderControl Set \code{TRUE} if slider control is needed. #' Default is \code{TRUE} +#' @param orientIcons Set \code{TRUE} if you want icons to orient themselves on each +#' tick based on the bearing towards their next location. Default: \code{FALSE} #' @param staleTime Set time before a track is considered stale and faded out. #' Default is 60*60*1000 (1 hour) +#' @param transitionpopup Should the position of the popup move smoothly, +#' like the marker icon? Default: \code{TRUE} +#' @param transitionlabel Should the position of the label move smoothly, +#' like the marker icon? Default: \code{TRUE} #' @param ... Further arguments passed to `L.Playback` -#' @description Add extra options to \code{\link{addPlayback}}. For a full list -#' please visit the \href{https://github.com/hallahan/LeafletPlayback}{plugin repository} +#' @family Playback Functions +#' @return A list of options for \code{addPlayback} +#' @references \url{https://github.com/hallahan/LeafletPlayback} #' @export -#' @family Playback Plugin playbackOptions = function( + color = "blue", radius = 5, tickLen = 250, - speed = 1, + speed = 50, maxInterpolationTime = 5*60*1000, tracksLayer = TRUE, playControl = TRUE, dateControl = TRUE, sliderControl = TRUE, + orientIcons = FALSE, staleTime = 60*60*1000, + transitionpopup = TRUE, + transitionlabel = TRUE, ...) { leaflet::filterNULL(list( + color = color, radius = radius, tickLen = tickLen, speed = speed, @@ -167,16 +190,79 @@ playbackOptions = function( playControl = playControl, dateControl = dateControl, sliderControl = sliderControl, + orientIcons = orientIcons, staleTime = staleTime, + transitionpopup = transitionpopup, + transitionlabel = transitionlabel, ... )) } #' removePlayback -#' @param map the map widget. -#' @description Remove the reachability controls +#' +#' Remove the Playback controls and markers. +#' @param map the map widget #' @export -#' @family Playback Plugin +#' @inherit leaflet::addMarkers return +#' @family Playback Functions removePlayback <- function(map){ invokeMethod(map, NULL, "removePlayback") } + + + + +#' to_jsonformat +#' Transform object to JSON expected format +#' @param data The data +#' @param time Name of the time column. +#' @param popup Name of the popup column. +#' @param label Name of the label column. +#' @param name Name of the name column. +#' @return A list that is transformed to the expected JSON format +to_jsonformat <- function(data, time, popup=NULL, label=NULL, name=NULL) { + if (inherits(data, "Spatial")) data <- sf::st_as_sf(data) + if (inherits(data, "sf")) { + stopifnot(inherits(sf::st_geometry(data), c("sfc_POINT"))) + data <- to_ms(data, time) + dataorig <- data + data <- list("type"="Feature", + "name"=evalFormula(name, dataorig)[1], + "geometry"=list( + "type"="MultiPoint", + "coordinates"=sf::st_coordinates(data) + ), + "properties"=list( + "time"=data$time + )) + + if (!is.null(popup)) { + data <- c(data, list("popupContent" = evalFormula(popup, dataorig))) + } + if (!is.null(label)) { + data <- c(data, list("tooltipContent" = evalFormula(label, dataorig))) + } + } + data +} + +#' to_ms +#' Change POSIX or Date to milliseconds +#' @inheritParams to_jsonformat +#' @return A data.frame with the time column in milliseconds +to_ms <- function(data, time) { + coln <- colnames(data) + if (!any(coln == time)) { + stop("No column named `", time, "` found.") + } + if (time != "time") { + colnames(data)[coln == time] <- "time" + } + stopifnot(inherits(data[["time"]], c("POSIXt", "Date", "numeric"))) + if (inherits(data[["time"]], "POSIXt")) { + data[["time"]] <- as.numeric(data[["time"]]) * 1000 + } else if (inherits(data[["time"]], "Date")) { + data[["time"]] <- as.numeric(data[["time"]]) * 86400000 + } + data +} diff --git a/R/reachability.R b/R/reachability.R index f9493246..654016d7 100644 --- a/R/reachability.R +++ b/R/reachability.R @@ -1,10 +1,10 @@ reachabilityDependencies <- function() { list( htmlDependency( - "leaflet.reachability", "1.0.0", + "lfx-reachability", "1.0.0", src = system.file("htmlwidgets/lfx-reachability", package = "leaflet.extras2"), script = c("leaflet.reachability.js", - "leaflet.reachability.bindings.js"), + "leaflet.reachability-bindings.js"), stylesheet = "leaflet.reachability.css" ) ) @@ -12,37 +12,64 @@ reachabilityDependencies <- function() { #' Add Isochrones to Leaflet #' +#' A leaflet plugin which shows areas of reachability based on time or distance +#' for different modes of travel using the openrouteservice isochrones API. +#' Based on the +#' \href{https://github.com/traffordDataLab/leaflet.reachability}{leaflet.reachability +#' plugin} #' @param map a map widget -#' @param apiKey a valid Openrouteservice API-key. Can be obtained from +#' @param apikey a valid Openrouteservice API-key. Can be obtained from #' \href{https://openrouteservice.org/dev/#/signup}{Openrouteservice} -#' @param options see \code{\link{reachabilityOptions}} -#' @description Add Leaflet Reachability Plugin Control. Based on the -#' \href{https://github.com/traffordDataLab/leaflet.reachability}{leaflet.reachability plugin} +#' @param options A list of further options. See \code{\link{reachabilityOptions}} +#' @note When used in Shiny, 3 events update a certain shiny Input: +#' \enumerate{ +#' \item reachability:displayed updates \code{input$MAPID_reachability_displayed} +#' \item reachability:delete updates \code{input$MAPID_reachability_delete} +#' \item reachability:error updates \code{input$MAPID_reachability_error} +#' } +#' @family Reachability Functions +#' @references \url{https://github.com/traffordDataLab/leaflet.reachability} +#' @inherit leaflet::addControl return #' @export -#' @seealso https://github.com/traffordDataLab/leaflet.reachability -#' @family Reachability Plugin -addReachability <- function(map, apiKey = NULL, +#' @examples \dontrun{ +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' Sys.setenv("OPRS" = 'Your_API_Key') +#' +#' leaflet() %>% +#' addTiles() %>% +#' setView(8, 50, 10) %>% +#' addReachability() +#' } +addReachability <- function(map, apikey = NULL, options = reachabilityOptions()){ - + if (is.null(apikey)) { + apikey <- Sys.getenv("OPRS") + if (apikey == "") { + stop("You must either pass an Openrouteservice-`apikey` directly or save it as ", + "system variable under `OPRS`.") + } + } map$dependencies <- c(map$dependencies, reachabilityDependencies()) - if (is.null(apiKey)) stop("You must provide an API Key") - options = leaflet::filterNULL(c(apiKey = apiKey, options)) - + options = leaflet::filterNULL(c(apiKey = apikey, options)) invokeMethod(map, NULL, "addReachability", options) } #' reachabilityOptions #' +#' Add extra options. For a full list please visit the +#' \href{https://github.com/traffordDataLab/leaflet.reachability}{plugin repository}. #' @param collapsed Should the control widget start in a collapsed mode. #' Default is \code{TRUE} #' @param pane Leaflet pane to add the isolines GeoJSON to. #' Default is \code{overlayPane} #' @param position Leaflet control pane position. Default is \code{topleft} #' @param ... Further arguments passed to `L.Control.Reachability` -#' @description Add extra options. For a full list please visit the -#' \href{https://github.com/traffordDataLab/leaflet.reachability}{plugin repository} +#' @family Reachability Functions +#' @references \url{https://github.com/traffordDataLab/leaflet.reachability} +#' @return A list of options for \code{addReachability} #' @export -#' @family Reachability Plugin reachabilityOptions = function(collapsed = TRUE, pane = "overlayPane", position = "topleft", @@ -56,10 +83,12 @@ reachabilityOptions = function(collapsed = TRUE, } #' removeReachability +#' +#' Remove the reachability controls. #' @param map the map widget. -#' @description Remove the reachability controls +#' @inherit leaflet::addControl return #' @export -#' @family Reachability Plugin +#' @family Reachability Functions removeReachability <- function(map){ invokeMethod(map, NULL, "removeReachability") } diff --git a/R/sidebar.R b/R/sidebar.R index 6bd8a40e..9ca69444 100644 --- a/R/sidebar.R +++ b/R/sidebar.R @@ -1,97 +1,136 @@ sidebar_deps <- function(mini = FALSE) { list( htmlDependency( - "sidebar", "1.0.0", + "lfx-sidebar", "1.0.0", src = system.file("htmlwidgets/lfx-sidebar", package = "leaflet.extras2"), script = c("leaflet-sidebar.js", - "leaflet.sidebar.binding.js"), + "leaflet-sidebar-binding.js"), stylesheet = "leaflet-sidebar.css" ) ) } - -#' Adds a Sidebar Leaflet Control +#' Add a Sidebar Leaflet Control +#' +#' The sidebar HTML must be created with \code{\link{sidebar_tabs}} and +#' \code{\link{sidebar_pane}} before +#' \code{\link[leaflet]{leafletOutput}} is called. +#' #' @param map A leaflet map widget -#' @param id Id of the sidebar-div -#' @param options A named list with \code{position} and \code{fit} elements. -#' @seealso https://github.com/Turbo87/sidebar-v2 -#' @family Sidebar Plugin +#' @param id Id of the sidebar-div. Must match with the \code{id} of +#' \code{\link{sidebar_tabs}} +#' @param options A named list with the only option \code{position}, which should +#' be either \code{left} or \code{right}. +#' @param ns The namespace function, if used in Shiny modules. +#' @family Sidebar Functions +#' @references \url{https://github.com/Turbo87/sidebar-v2} #' @export +#' @inherit leaflet::addControl return +#' @inherit sidebar_tabs examples addSidebar <- function(map, id = "sidebar", - options = list(position = "left", - fit = TRUE)) { - + options = list(position = "left"), + ns = NULL) { map$dependencies <- c(map$dependencies, sidebar_deps()) + options$fit = TRUE + if (!is.null(ns)) id <- ns(id) invokeMethod(map, NULL, "addSidebar", id, options) } #' Remove the Sidebar #' @param map A leaflet map widget -#' @family Sidebar Plugin +#' @param sidebar_id The id of the sidebar (per \code{\link{sidebar_tabs}}). +#' Defaults to \code{NULL} such that the first sidebar is removed. +#' @family Sidebar Functions +#' @inherit leaflet::addControl return #' @export -removeSidebar <- function(map) { - invokeMethod(map, NULL, "removeSidebar") +removeSidebar <- function(map, sidebar_id = NULL) { + invokeMethod(map, NULL, "removeSidebar", sidebar_id) } #' Close the Sidebar #' @param map A leaflet map widget -#' @family Sidebar Plugin +#' @param sidebar_id The id of the sidebar (per \code{\link{sidebar_tabs}}). +#' Defaults to \code{NULL} such that the first sidebar is used. +#' @family Sidebar Functions +#' @inherit leaflet::addControl return #' @export -closeSidebar <- function(map) { - invokeMethod(map, NULL, "closeSidebar") +closeSidebar <- function(map, sidebar_id = NULL) { + invokeMethod(map, NULL, "closeSidebar", sidebar_id) } -#' Open the Sidebar -#' @param map A leaflet map widget +#' Open the Sidebar by ID #' @param id The id of the \code{\link{sidebar_pane}} to open. -#' @family Sidebar Plugin +#' @family Sidebar Functions +#' @param ns The namespace function, if used in Shiny modules. +#' @inheritParams closeSidebar +#' @inherit leaflet::addControl return #' @export -openSidebar <- function(map, id) { - invokeMethod(map, NULL, "openSidebar", id) +openSidebar <- function(map, id, sidebar_id = NULL, ns = NULL) { + if (!is.null(ns)) id <- ns(id) + invokeMethod(map, NULL, "openSidebar", list(id = id, sidebar_id = sidebar_id)) } - -#' Create a Sidebar Panel +#' Create a Sidebar Pane #' @param title A title for the sidebar panel #' @param id An id for the sidebar panel -#' @param icon An icon for the sidebar panel. +#' @param icon An icon for the sidebar panel #' @param ... List of elements to include in the panel -#' @family Sidebar Plugin +#' @family Sidebar Functions +#' @references \url{https://github.com/Turbo87/sidebar-v2}, +#' \url{https://github.com/Turbo87/sidebar-v2/blob/master/doc/usage.md} +#' @return A \code{shiny.tag} with sidebar-specific HTML classes #' @export +#' @examples \dontrun{ +#' library(shiny) +#' sidebar_pane(id = "id", icon = icon("cars"), tags$div()) +#' } sidebar_pane <- function(title = "Sidebar Title", id = NULL, icon = icon("caret-right"), ...) { if (is.null(id)) stop("The sidebar pane needs an `id`.") - tags$div(class = "sidebar-pane", id = id, - tags$h3(class = "sidebar-header", title, - tags$span(class = "sidebar-close", icon)), + tags$div(class = "leafsidebar-pane", id = id, + tags$h3(class = "leafsidebar-header", title, + tags$span(class = "leafsidebar-close", icon)), ...) } - #' Create a Sidebar +#' @param id The id of the sidebar, which must match the \code{id} of +#' \code{\link{addSidebar}}. Default is \code{"sidebar"} #' @param iconList A list of icons to be shown, when the sidebar is collapsed. #' The list is required and must match the amount of \code{\link{sidebar_pane}}. -#' @param ... The individual \code{\link{sidebar_pane}}. -#' @family Sidebar Plugin +#' @param ... The individual \code{\link{sidebar_pane}}'s. +#' @family Sidebar Functions +#' @references \url{https://github.com/Turbo87/sidebar-v2}, +#' \url{https://github.com/Turbo87/sidebar-v2/blob/master/doc/usage.md} +#' @return A \code{shiny.tag} with individual sidebar panes #' @export -sidebar_tabs <- function(iconList = NULL, ...){ +#' @examples \dontrun{ +#' library(shiny) +#' +#' # run example app showing a single sidebar +#' runApp(paste0(system.file("examples", package = "leaflet.extras2"), +#' "/sidebar_app.R")) +#' +#' # run example app showing two sidebars +#' runApp(paste0(system.file("examples", package = "leaflet.extras2"), +#' "/multi_sidebar_app.R")) +#' } +sidebar_tabs <- function(id = "sidebar", iconList = NULL, ...){ arg <- list(...) ids <- lapply(arg, function(x) tagGetAttribute(x, "id")) if (length(ids) != length(iconList)) stop("The number of icons needs to match the number of sidebar panes.") - tags$div(id = "sidebar", class = "sidebar collapsed", - tags$div(class = "sidebar-tabs", + tags$div(id = id, class = "leafsidebar collapsed", + tags$div(class = "leafsidebar-tabs", style = "display: none", tags$ul(role = "tablist", tagList(lapply(1:length(ids), function(x) { tags$li(tags$a(href = paste0("#", ids[[x]]), role = "tab", iconList[[x]])) })) ) ), - tags$div(class = "sidebar-content", + tags$div(class = "leafsidebar-content", style = "display: none", tagList(arg)) ) } - diff --git a/R/sidebyside.R b/R/sidebyside.R index a434b3c6..66bce555 100644 --- a/R/sidebyside.R +++ b/R/sidebyside.R @@ -1,16 +1,18 @@ sidebysideDependencies <- function() { list( htmlDependency( - "leaflet.sidebyside", "1.0.0", + "lfx-sidebyside", "1.0.0", src = system.file("htmlwidgets/lfx-side-by-side", package = "leaflet.extras2"), script = c("lfx-side-by-side.js", - "lfx.addSidebyside.bindings.js") + "lfx-side-by-side-bindings.js") ) ) } #' Add Side by Side View #' +#' A Leaflet control to add a split screen to compare two map overlays. +#' The plugin works with Panes, see the example. #' @param map a map widget #' @param layerId the layer id, needed for \code{\link{removeSidebyside}} #' @param leftId the \code{layerId} of the Tile layer that should be @@ -19,51 +21,32 @@ sidebysideDependencies <- function() { #' visible on the \strong{right} side #' @param options A list of options. Currently only \code{thumbSize} and #' \code{padding} can be changed. -#' @description Add Leaflet Sidebyside View. Based on the plugin -#' \href{https://github.com/digidem/leaflet-side-by-side}{leaflet-side-by-side}. -#' The plugin works with Panes, see the example. -#' @note It is currently not working correctly if the \code{baseGroups} are defined in -#' \code{\link[leaflet]{addLayersControl}}. +#' @note It is currently not working correctly if the \code{baseGroups} are +#' defined in \code{\link[leaflet]{addLayersControl}}. +#' @family Sidebyside Functions +#' @references \url{https://github.com/digidem/leaflet-side-by-side} +#' @inherit leaflet::addControl return #' @export -#' @family Sidebyside Plugin -#' @seealso https://github.com/digidem/leaflet-side-by-side -#' @examples \dontrun{ -#' library(shiny) +#' @examples #' library(leaflet) #' library(leaflet.extras2) #' -#' ui <- fluidPage( -#' leafletOutput("map"), -#' actionButton("removeSidebyside", "removeSidebyside") -#' ) -#' -#' server <- function(input, output, session) { -#' output$map <- renderLeaflet({ -#' leaflet(quakes) %>% -#' addMapPane("left", zIndex = 0) %>% -#' addMapPane("right", zIndex = 0) %>% -#' addTiles(group = "base", layerId = "baseid", -#' options = pathOptions(pane = "right")) %>% -#' addProviderTiles(providers$CartoDB.DarkMatter, group="carto", layerId = "cartoid", -#' options = pathOptions(pane = "left")) %>% -#' addCircleMarkers(data = breweries91[1:15,], color = "blue", group = "blue", -#' options = pathOptions(pane = "left")) %>% -#' addCircleMarkers(data = breweries91[15:20,], color = "yellow", group = "yellow") %>% -#' addCircleMarkers(data = breweries91[15:30,], color = "red", group = "red", -#' options = pathOptions(pane = "right")) %>% -#' addLayersControl(overlayGroups = c("blue","red", "yellow")) %>% -#' addSidebyside(layerId = "sidecontrols", -#' rightId = "baseid", -#' leftId = "opencycle") -#' }) -#' observeEvent(input$removeSidebyside, { -#' leafletProxy("map") %>% -#' removeSidebyside("sidecontrols") -#' }) -#' } -#' -#' shinyApp(ui, server) -#' } +#' leaflet(quakes) %>% +#' addMapPane("left", zIndex = 0) %>% +#' addMapPane("right", zIndex = 0) %>% +#' addTiles(group = "base", layerId = "baseid", +#' options = pathOptions(pane = "right")) %>% +#' addProviderTiles(providers$CartoDB.DarkMatter, group="carto", layerId = "cartoid", +#' options = pathOptions(pane = "left")) %>% +#' addCircleMarkers(data = breweries91[1:15,], color = "blue", group = "blue", +#' options = pathOptions(pane = "left")) %>% +#' addCircleMarkers(data = breweries91[15:20,], color = "yellow", group = "yellow") %>% +#' addCircleMarkers(data = breweries91[15:30,], color = "red", group = "red", +#' options = pathOptions(pane = "right")) %>% +#' addLayersControl(overlayGroups = c("blue","red", "yellow")) %>% +#' addSidebyside(layerId = "sidecontrols", +#' rightId = "baseid", +#' leftId = "cartoid") addSidebyside <- function(map, layerId = NULL, leftId = NULL, rightId = NULL, options = list(thumbSize = 42, @@ -80,7 +63,8 @@ addSidebyside <- function(map, layerId = NULL, #' @export #' @param map a map widget #' @param layerId the layer id of the \code{\link{addSidebyside}} layer -#' @family Sidebyside Plugin +#' @inherit leaflet::addControl return +#' @family Sidebyside Functions removeSidebyside <- function(map, layerId = NULL){ invokeMethod(map, NULL, "removeSidebyside", layerId) } diff --git a/R/spin.R b/R/spin.R new file mode 100644 index 00000000..e352e835 --- /dev/null +++ b/R/spin.R @@ -0,0 +1,57 @@ +spinDependency <- function() { + list( + htmltools::htmlDependency( + "lfx-spin", version = "1.0.0", + src = system.file("htmlwidgets/lfx-spin", package = "leaflet.extras2"), + script = c("spin.min.js", + "leaflet.spin.min.js", + "leaflet.spin-binding.js"), + # stylesheet = c("spin.css"), + all_files = TRUE + ) + ) +} + +#' Add Spin Plugin +#' +#' Adds an animated loading spinning over the map. +#' @param map A map widget object created from \code{\link[leaflet]{leaflet}} +#' +#' @param options Spin.js options. Named list. See \url{http://spin.js.org} +#' +#' @return A leaflet map object +#' @export +#' +#' @references \url{https://github.com/makinacorpus/Leaflet.Spin} +#' @references \url{https://github.com/fgnass/spin.js} +#' +#' @name addSpinner +#' +#' @examples +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' leaflet(data = quakes) %>% +#' addTiles() %>% +#' addSpinner() %>% +#' startSpinner(options = list("lines" = 7, "length" = 20)) %>% +#' addMarkers(~long, ~lat, popup = ~as.character(mag), label = ~as.character(mag)) %>% +#' stopSpinner() +addSpinner <- function(map) { + map$dependencies <- c(map$dependencies, spinDependency()) + map +} + +#' @export +#' +#' @rdname addSpinner +startSpinner <- function(map, options = NULL) { + invokeMethod(map, NULL, 'spinner', TRUE, options) +} + +#' @export +#' +#' @rdname addSpinner +stopSpinner <- function(map) { + invokeMethod(map, NULL, 'spinner', FALSE) +} diff --git a/R/tangram.R b/R/tangram.R index d679e5e7..3127a349 100644 --- a/R/tangram.R +++ b/R/tangram.R @@ -1,44 +1,41 @@ -tangram_deps <- function(mini = FALSE) { +tangram_deps <- function() { list( htmlDependency( - "tangram", "1.0.0", + "lfx-tangram", "1.0.0", src = system.file("htmlwidgets/lfx-tangram", package = "leaflet.extras2"), - script = c(ifelse(mini, "tangram.min.js", "tangram.js"), + script = c("tangram.min.js", "leaflet.tangram.binding.js")) ) } - #' Adds a Tangram layer to a Leaflet map in a Shiny App. #' -#' @param map A leaflet map widget -#' @param scene Path to a required \bold{.yaml} or \bold{.zip} file. The file must be in the -#' /www folder of a shinyApp. See the -#' \href{https://github.com/tangrams/tangram}{Tangram repo} or the -#' \href{https://tangrams.readthedocs.io/en/latest/}{Tangram docs} for further information -#' on how to edit such a .yaml file. -#' @param layerId A layer ID -#' @param group The name of the group the newly created layer should belong to -#' (for \code{\link{clearGroup}} and \code{\link{addLayersControl}} purposes). -#' @param options A list of further options. See the app in the \code{examples/tangram} folder -#' or the \href{https://tangrams.readthedocs.io/en/latest/Overviews/Tangram-Overview/#leaflet}{docs} -#' for further information. +#' @param scene Path to a required \bold{.yaml} or \bold{.zip} file. If the file +#' is within the \code{/www} folder of a Shiny-App, only the filename must be +#' given, otherwise the full path is needed. See the +#' \href{https://github.com/tangrams/tangram}{Tangram repository} or the +#' \href{https://tangrams.readthedocs.io/en/latest/}{Tangram docs} for further +#' information on how to edit such a .yaml file. +#' @param options A list of further options. See the app in the +#' \code{examples/tangram} folder or the +#' \href{https://tangrams.readthedocs.io/en/latest/Overviews/Tangram-Overview/#leaflet}{docs} +#' for further information. +#' @note Only works correctly in a Shiny-App environment. +#' @references \url{https://github.com/tangrams/tangram} +#' @family Tangram Functions +#' @inheritParams leaflet::addPolygons +#' @inherit leaflet::addWMSTiles return #' @export -#' @seealso https://github.com/tangrams/tangram -#' @family Tangram Plugin #' @examples \dontrun{ #' library(shiny) #' library(leaflet) #' library(leaflet.extras2) #' -#' ## In the /www folder of the ShinyApp. Must contain the Nextzen API-key +#' ## In the /www folder of a ShinyApp. Must contain the Nextzen API-key #' scene <- "scene.yaml" #' #' ui <- fluidPage(leafletOutput("map")) #' -#' ## The JS-source can be loaded in an unminified version with the options command below. -#' # options("leaflet.extras2.minified" = FALSE) -#' #' server <- function(input, output, session) { #' output$map <- renderLeaflet({ #' leaflet() %>% @@ -56,23 +53,23 @@ tangram_deps <- function(mini = FALSE) { addTangram <- function(map, scene = NULL, layerId = NULL, group = NULL, options = NULL) { - mini <- getOption("leaflet.extras2.minified", default = TRUE) - map$dependencies <- c(map$dependencies, tangram_deps(mini)) - if ((is.null(scene) || !is.character(scene) || (!gsub(".*\\.", "", scene) %in% c("yaml", "zip")))) { stop("The scene must point to a valid .yaml or .zip file.\n", "See the documentation for further information.") } - if (!requireNamespace("shiny")) { - stop("Package `shiny` must be loaded for Tangram") - } - shiny::addResourcePath("tangram", paste0(getwd(), "/www")) - scene <- basename(scene) - options <- leaflet::filterNULL(c(scene = scene, - options)) + tngrscene <- list( + htmltools::htmlDependency( + name = "tangram_scene", + version = 1, + src = dirname(scene), + attachment = basename(scene) + )) - invokeMethod(map, getMapData(map), "addTangram", + map$dependencies <- c(map$dependencies, tngrscene, tangram_deps()) + + options <- leaflet::filterNULL(c(list(scene = basename(scene)), options)) + + invokeMethod(map, NULL, "addTangram", layerId, group, options) } - diff --git a/R/timeslider.R b/R/timeslider.R new file mode 100644 index 00000000..52373c47 --- /dev/null +++ b/R/timeslider.R @@ -0,0 +1,181 @@ +timesliderDependencies <- function() { + list( + htmlDependency( + "lfx-timeslider", "1.0.0", + src = system.file("htmlwidgets/lfx-timeslider", package = "leaflet.extras2"), + stylesheet = "jquery-ui.css", + script = c( + "jquery-ui.min.js", + "leaflet.SliderControl.min.js", + "leaflet.SliderControl-bindings.js") + ) + ) +} + +#' Add Time Slider to Leaflet +#' +#' The \href{https://github.com/dwilhelm89/LeafletSlider}{LeafletSlider plugin} +#' enables you to dynamically add and remove Markers/Lines on a map by using a +#' JQuery UI slider. +#' @param map a map widget +#' @param data data must be a Simple Feature collection of type POINT or LINESTRING +#' with a column of class Date or POSIXct. +#' @param ordertime boolean value indicating whether to order the data by the +#' time column. The slider will adopt the order of the timestamps. +#' The default is \code{TRUE}. +#' @param options List of additional options. See \code{\link{timesliderOptions}} +#' @family Timeslider Functions +#' @references \url{https://github.com/dwilhelm89/LeafletSlider} +#' @export +#' @inheritParams leaflet::addCircleMarkers +#' @inherit leaflet::addMarkers return +#' @examples \dontrun{ +#' library(leaflet) +#' library(leaflet.extras2) +#' library(sf) +#' library(geojsonsf) +#' +#' data <- sf::st_as_sf(leaflet::atlStorms2005[1,]) +#' data <- st_cast(data, "POINT") +#' data$time = as.POSIXct( +#' seq.POSIXt(Sys.time() - 1000, Sys.time(), length.out = nrow(data))) +#' +#' leaflet() %>% +#' addTiles() %>% +#' addTimeslider(data = data, +#' options = timesliderOptions( +#' position = "topright", +#' timeAttribute = "time", +#' range = TRUE)) %>% +#' setView(-72, 22, 4) +#' } +addTimeslider <- function(map, data, radius = 10, + stroke = TRUE, color = "#03F", + weight = 5, opacity = 0.5, fill = TRUE, fillColor = color, + fillOpacity = 0.2, dashArray = NULL, + popup = NULL, popupOptions = NULL, + label = NULL, labelOptions = NULL, + ordertime = TRUE, + options = timesliderOptions()){ + + ## Style Options + data$radius = leaflet::evalFormula(radius, data) + data$stroke = leaflet::evalFormula(stroke, data) + data$color = leaflet::evalFormula(color, data) + data$weight = leaflet::evalFormula(weight, data) + data$fillColor = leaflet::evalFormula(fillColor, data) + data$opacity = leaflet::evalFormula(opacity, data) + data$fill = leaflet::evalFormula(fill, data) + data$dashArray = leaflet::evalFormula(dashArray, data) + data$fillOpacity = leaflet::evalFormula(fillOpacity, data) + + ## Order by time + if (ordertime) { + data <- data[order(data[[options$timeAttribute]]),] + } + + ## Popup + if (!is.null(popup) && !isFALSE(popup)) { + data$popup = leaflet::evalFormula(popup, data) + } + + ## Label + if (!is.null(label) && !isFALSE(label)) { + data$label = leaflet::evalFormula(label, data) + } + + ## BBOX + if (!requireNamespace("sf")) { + stop("The package `sf` is needed for this plugin. ", + "Please install it with:\ninstall.packages('sf')") + } + bbox <- sf::st_bbox(data) + + ## Make GeoJSON + if (!requireNamespace("geojsonsf")) { + stop("The package `geojsonsf` is needed for this plugin. ", + "Please install it with:\ninstall.packages('geojsonsf')") + } + data <- geojsonsf::sf_geojson(data) + + ## Add Deps and invoke Leaflet + map$dependencies <- c(map$dependencies, timesliderDependencies()) + invokeMethod(map, NULL, "addTimeslider", data, options, popupOptions, labelOptions) %>% + expandLimits(bbox[c(2,4)], bbox[c(1,3)]) +} + +#' timesliderOptions +#' +#' A list of options for \code{\link{addTimeslider}}. +#' @param position position of control: "topleft", "topright", "bottomleft", or +#' "bottomright". Default is \code{topright}. +#' @param timeAttribute The column name of the time property. +#' Default is \code{"time"} +#' @param isEpoch whether the time attribute is seconds elapsed from epoch. +#' Default is \code{FALSE} +#' @param startTimeIdx where to start looking for a timestring +#' Default is \code{0} +#' @param timeStrLength the size of \code{yyyy-mm-dd hh:mm:ss} - if milliseconds are +#' present this will be larger. Default is \code{19} +#' @param maxValue Set the maximum value of the slider. Default is \code{-1} +#' @param minValue Set the minimum value of the slider. Default is \code{0} +#' @param showAllOnStart Specify whether all markers should be initially visible. +#' Default is \code{FALSE} +#' @param range To use a range-slider, set to \code{TRUE.} Default is \code{FALSE} +#' Default is \code{FALSE} +#' @param follow To display only the markers at the specific timestamp specified +#' by the slider. Specify a value of 1 (or true) to display only a single data +#' point at a time, and a value of null (or false) to display the current marker +#' and all previous markers. The range property overrides the follow property. +#' Default is \code{FALSE} +#' @param alwaysShowDate Should the Date always be visible. Default is \code{FALSE} +#' @param rezoom Use the rezoom property to ensure the markers being displayed +#' remain in view. Default is \code{NULL} +#' @param sameDate Show only data with the current selected time. +#' Default is \code{FALSE} +#' @family Timeslider Functions +#' @return A list of options for \code{addTimeslider} +#' @references \url{https://github.com/dwilhelm89/LeafletSlider} +#' @export +timesliderOptions = function( + position = c("topright", "bottomleft", "bottomright", "topleft"), + timeAttribute = "time", + isEpoch = FALSE, + startTimeIdx = 0, + timeStrLength = 19, + maxValue = -1, + minValue = 0, + showAllOnStart = FALSE, + range = FALSE, + follow = FALSE, + alwaysShowDate = FALSE, + rezoom = NULL, + sameDate = FALSE) { + + leaflet::filterNULL(list( + position = match.arg(position), + timeAttribute = timeAttribute, + isEpoch = isEpoch, + startTimeIdx = startTimeIdx, + timeStrLength = timeStrLength, + maxValue = maxValue, + minValue = minValue, + showAllOnStart = showAllOnStart, + range = range, + follow = follow, + alwaysShowDate = alwaysShowDate, + rezoom = rezoom, + sameDate = sameDate + )) +} + +#' removeTimeslider +#' +#' Remove the Timeslider controls and markers. +#' @param map the map widget +#' @export +#' @inherit leaflet::addMarkers return +#' @family Timeslider Functions +removeTimeslider <- function(map){ + invokeMethod(map, NULL, "removeTimeslider") +} diff --git a/R/velocity.R b/R/velocity.R index 3a79b3e8..a99e6142 100644 --- a/R/velocity.R +++ b/R/velocity.R @@ -1,7 +1,7 @@ velocityDependencies <- function() { list( htmlDependency( - "leaflet.velocity", "1.0.0", + "lfx-velocity", "1.0.0", src = system.file("htmlwidgets/lfx-velocity", package = "leaflet.extras2"), script = c("leaflet-velocity.js", "leaflet-velocity-bindings.js"), @@ -12,55 +12,56 @@ velocityDependencies <- function() { #' Add Velocity Animation #' -#' @param map a map widget -#' @param layerId the layer id -#' @param group the name of the group the newly created layers should belong to -#' (for \code{clearGroup} and \code{addLayersControl} purposes). Human-friendly -#' group names are permittedโ€“they need not be short, identifier-style names. -#' Any number of layers and even different types of layers (e.g. markers and -#' polygons) can share the same group name. -#' @param content a JSON File respresenting the velocity data or a URL pointing -#' to such a JSON file. -#' @param options see \code{\link{velocityOptions}} -#' @description Add velocity animated data to leaflet. Based on the -#' \href{https://github.com/danwild/leaflet-velocity}{leaflet-velocity plugin} +#' Add velocity animated data to leaflet. Based on the +#' \href{https://github.com/onaci/leaflet-velocity}{leaflet-velocity plugin} +#' @inheritParams leaflet::addMarkers +#' @param content the path or URL to a JSON file representing the velocity data +#' or a data.frame which can be transformed to such a JSON file. Please see the +#' \href{https://github.com/onaci/leaflet-velocity/tree/master/demo}{demo +#' files} for some example data. +#' @param options List of further options. See \code{\link{velocityOptions}} #' @export -#' @family Velocity Plugin -#' @seealso https://github.com/danwild/leaflet-velocity +#' @family Velocity Functions +#' @references \url{https://github.com/onaci/leaflet-velocity} +#' @inherit leaflet::addMarkers return #' @examples \dontrun{ #' library(leaflet) #' library(leaflet.extras2) -#' content <- system.file("examples/velocity/wind-global.json", package = "leaflet.extras2") +#' content <- "https://raw.githubusercontent.com/onaci/leaflet-velocity/master/demo/water-gbr.json" #' leaflet() %>% #' addTiles(group = "base") %>% -#' addLayersControl(baseGroups = "base", overlayGroups = "velo") %>% -#' addVelocity(content = content, group = "velo", layerId = "veloid") +#' setView(145, -20, 4) %>% +#' addVelocity(content = content, group = "velo", layerId = "veloid") %>% +#' addLayersControl(baseGroups = "base", overlayGroups = "velo") #' } addVelocity <- function(map, layerId = NULL, group = NULL, content = NULL, options = velocityOptions()) { + if (!requireNamespace("jsonlite")) { + stop("Package `jsonlite` must be loaded to parse the `content`") + } ## Check Content - if (is.null(content)) stop("The content is empty. Please include a JSON or a URL for a specific JSON") + if (is.null(content)) stop("The velocity-content is NULL") if (inherits(content, "character")) { - # grepl("https:", content) || grepl("http:", content) content <- jsonlite::fromJSON(content) content <- jsonlite::toJSON(content) } else if (inherits(content, "data.frame")) { content <- jsonlite::toJSON(content) } else if (inherits(content, "json")) { } else { - stop("Content is does not point to a JSON file nor is it a data.frame") + stop("Content does not point to a JSON file nor is it a data.frame") } map$dependencies <- c(map$dependencies, velocityDependencies()) + options <- filterNULL(options) + invokeMethod( map, NULL, "addVelocity", layerId, group, content, options ) } - #' velocityOptions #' @description Define further options for the velocity layer. #' @param speedUnit Could be 'm/s' for meter per second, 'k/h' for kilometer @@ -70,9 +71,10 @@ addVelocity <- function(map, layerId = NULL, group = NULL, #' @param velocityScale scale for wind velocity #' @param colorScale A vector of hex colors or an RGB matrix #' @param ... Further arguments passed to the Velocity layer and Windy.js. -#' For more information, please visit \href{https://github.com/danwild/leaflet-velocity}{leaflet-velocity plugin} +#' For more information, please visit \href{https://github.com/onaci/leaflet-velocity}{leaflet-velocity plugin} +#' @return A list of further options for \code{addVelocity} #' @export -#' @family Velocity Plugin +#' @family Velocity Functions velocityOptions <- function(speedUnit = c("m/s", "k/h", "kt"), minVelocity = 0, maxVelocity = 10, @@ -99,7 +101,20 @@ velocityOptions <- function(speedUnit = c("m/s", "k/h", "kt"), #' @param map the map widget #' @param group the group to remove #' @export -#' @family Velocity Plugin +#' @inherit leaflet::removeMarker return +#' @family Velocity Functions removeVelocity <- function(map, group){ invokeMethod(map, NULL, "removeVelocity", group) } + +#' setOptionsVelocity +#' @param map the map widget +#' @param layerId the layer id +#' @param options see \code{\link{velocityOptions}} +#' @inherit leaflet::removeMarker return +#' @export +#' @family Velocity Functions +setOptionsVelocity <- function(map, layerId, options){ + options <- filterNULL(options) + invokeMethod(map, NULL, "setOptionsVelocity", layerId, options) +} diff --git a/R/wms.R b/R/wms.R index f945c9d0..015bd218 100644 --- a/R/wms.R +++ b/R/wms.R @@ -1,7 +1,7 @@ wmsDependency <- function() { list( htmltools::htmlDependency( - "lfx-wms", version = "2.1.0", + "lfx-wms", version = "1.0.0", src = system.file("htmlwidgets/lfx-wms", package = "leaflet.extras2"), script = c("leaflet.wms.js", "leaflet.wms-bindings.js") @@ -9,43 +9,58 @@ wmsDependency <- function() { ) } - #' Add Queryable WMS Layer #' -#' @param map a map widget object created from \code{\link[leaflet]{leaflet}} -#' @param baseUrl a base URL of the WMS service -#' @param layers vector or list of WMS layers to show. The name of the layer is -#' used as the \code{layerId} (for \code{\link[leaflet]{removeTiles}} -#' purposes) -#' @param group the name of the group the newly created layers should belong to -#' (for clearGroup and addLayersControl purposes). Human-friendly group names -#' are permittedโ€“they need not be short, identifier-style names. Any number of -#' layers and even different types of layers (e.g. markers and polygons) can -#' share the same group name. NOTE: If multiple \code{layers} are included, -#' the group argument will be ignored and the the layer-names will serve as -#' group names. -#' @param options List of further options. See -#' \code{\link[leaflet]{WMSTileOptions}} -#' @param attribution the attribution text of the tile layer (HTML) -#' @param data the data object from which the argument values are derived; by -#' default, it is the data object provided to \code{\link[leaflet]{leaflet}} -#' initially, but can be overridden. +#' @description +#' A Leaflet plugin for working with Web Map services, providing: +#' single-tile/untiled/nontiled layers, shared WMS sources, and +#' \bold{GetFeatureInfo}-powered identify. +#' +#' You can also use \bold{CQL-Filters} by appending a string to the \code{'baseUrl'}. #' -#' @seealso https://github.com/heigeo/leaflet.wms -#' @family WMS Plugin +#' Something like \code{'http://server/wms?cql_filter=attribute=value'} +#' +#' @inheritParams leaflet::addWMSTiles +#' @param checkempty Should the returned HTML-content be checked for emptiness? +#' If the HTML-body is empty no popup is opened. Default is \code{FALSE} +#' @param popupOptions List of popup options. See +#' \code{\link[leaflet]{popupOptions}}. Default is NULL. +#' @inherit leaflet::addWMSTiles return +#' @references \url{https://github.com/heigeo/leaflet.wms} +#' @family WMS Functions #' @export -addWMS <- function(map, baseUrl, layers = "", group = NULL, - options = WMSTileOptions(), attribution = NULL, +#' @examples +#' library(leaflet) +#' library(leaflet.extras2) +#' +#' leaflet() %>% +#' addTiles(group = "base") %>% +#' setView(9, 50, 5) %>% +#' addWMS(baseUrl = "https://maps.dwd.de/geoserver/dwd/wms", +#' layers = "dwd:BRD_1km_winddaten_10m", +#' popupOptions = popupOptions(maxWidth = 600), +#' checkempty = TRUE, +#' options = WMSTileOptions( +#' transparent = TRUE, +#' format = "image/png", +#' info_format = "text/html")) +addWMS <- function(map, baseUrl, layerId = NULL, group = NULL, + options = WMSTileOptions(), + attribution = NULL, + layers = NULL, + popupOptions = NULL, + checkempty = FALSE, data = getMapData(map)) { - if (identical(layers, "")) { + if (is.null(layers)) { stop("layers is a required argument with comma-separated list of WMS layers to show") } options$attribution <- attribution options$layers <- layers + options$checkempty <- checkempty map$dependencies <- c(map$dependencies, wmsDependency()) - invokeMethod(map, data, "addWMS", baseUrl, layers, - group, options) + invokeMethod(map, data, "addWMS", baseUrl, layerId, + group, options, popupOptions) } diff --git a/README.md b/README.md index 00f42957..1cba6f58 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,24 @@ # leaflet.extras2 - -The goal of `leaflet.extras2` package is to provide extra functionality to the [leaflet](https://cran.r-project.org/web/packages/leaflet/index.html) and [leaflet.extras](https://github.com/bhaskarvk/leaflet.extras) R packages using various [leaflet plugins](http://leafletjs.com/plugins). + +[![Checks](https://github.com/trafficonese/leaflet.extras2/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/trafficonese/leaflet.extras2/actions/workflows/R-CMD-check.yaml) +[![CRAN status](https://www.r-pkg.org/badges/version/leaflet.extras2)](https://CRAN.R-project.org/package=leaflet.extras2) +[![CRAN checks](https://badges.cranchecks.info/summary/leaflet.extras2.svg)](https://cran.r-project.org/web/checks/check_results_leaflet.extras2.html) +[![Last-changedate](https://img.shields.io/badge/last%20change-2024--06--10-green.svg)](/commits/master) +[![](https://cranlogs.r-pkg.org/badges/grand-total/leaflet.extras2)](https://cran.rstudio.com/web/packages/leaflet.extras2/index.html) +[![](https://cranlogs.r-pkg.org/badges/last-month/leaflet.extras2?color=blue)](https://cran.r-project.org/package=leaflet.extras2) +[![Codecov test coverage](https://codecov.io/gh/trafficonese/leaflet.extras2/branch/master/graph/badge.svg)](https://app.codecov.io/gh/trafficonese/leaflet.extras2?branch=master) + + +The goal of `leaflet.extras2` package is to provide extra functionality to the [leaflet](https://cran.r-project.org/package=leaflet) and [leaflet.extras](https://github.com/trafficonese/leaflet.extras) R packages using various leaflet plugins. ### Installation -For CRAN version (Not yet) +For CRAN version -~~`install.packages('leaflet.extras2')`~~ +``` r +install.packages('leaflet.extras2') +``` For latest development version @@ -15,30 +26,37 @@ For latest development version remotes::install_github('trafficonese/leaflet.extras2') ``` -### Progress +### Integrated Plugins -Plugins integrated so far ... +If you need a plugin that is not already implemented create an [issue](https://github.com/trafficonese/leaflet.extras2/issues/new). See the [FAQ](#FAQ) section below for details. - [Ant Path](https://github.com/rubenspgcavalcante/leaflet-ant-path) +- [Arrowheads](https://github.com/slutske22/leaflet-arrowheads) +- [Contextmenu](https://github.com/aratcliffe/Leaflet.contextmenu) - [Easy Print](https://github.com/rowanwins/leaflet-easyPrint) -- [Hexbin-D3](https://github.com/Asymmetrik/leaflet-d3#hexbins-api) +- [GIBS](https://github.com/aparshin/leaflet-GIBS) +- [Heightgraph](https://github.com/GIScience/Leaflet.Heightgraph) +- [Hexbin-D3](https://github.com/bluehalo/leaflet-d3#hexbins-api) +- [History](https://github.com/cscott530/leaflet-history) +- [Labelgun](https://github.com/Geovation/labelgun) +- [Leaflet.Sync](https://github.com/jieter/Leaflet.Sync) - [Mapkey Icons](https://github.com/mapshakers/leaflet-mapkey-icon) +- [Moving Markers](https://github.com/ewoken/Leaflet.MovingMarker) +- [OpenWeatherMap](https://github.com/trafficonese/leaflet-openweathermap) - [Playback](https://github.com/hallahan/LeafletPlayback) - [Reachability](https://github.com/traffordDataLab/leaflet.reachability) - [Sidebar-v2](https://github.com/Turbo87/sidebar-v2) - [Side-by-Side](https://github.com/digidem/leaflet-side-by-side) +- [Spin](https://github.com/makinacorpus/Leaflet.Spin) +- [Timeslider](https://github.com/dwilhelm89/LeafletSlider) - [Tangram](https://github.com/tangrams/tangram) -- [Velocity](https://github.com/danwild/leaflet-velocity) +- [Velocity](https://github.com/onaci/leaflet-velocity) - [WMS](https://github.com/heigeo/leaflet.wms) -If you need a plugin that is not already implemented create an [issue](https://github.com/trafficonese/leaflet.extras2/issues/new). See the [FAQ](#FAQ) section below for details. - ### Documentation -The R functions have been documented using roxygen, and should provide enough help to get started on using a feature. However some plugins have lots of options and it's not feasible to document every single detail. In such cases you are encouraged to check the plugin's documentation. - -Currently there are no vignettes (contributions welcome), but there are plenty of [examples](https://github.com/trafficonese/leaflet.extras2/tree/master/inst/examples) available. +The R functions have been documented using roxygen, and should provide enough help to get started on using a feature. However some plugins have lots of options and it's not feasible to document every single detail. In such cases you are encouraged to check the plugin's documentation and the [examples](https://github.com/trafficonese/leaflet.extras2/tree/master/inst/examples). ### FAQ @@ -46,11 +64,11 @@ Currently there are no vignettes (contributions welcome), but there are plenty o - **Good Solution**: Create issues for plugins you wish incorporated but before that search the existing issues to see if issue already exists and if so comment on that issue instead of creating duplicates. - **Better Solution**: It would help in prioritizing if you can include additional details like why you need the plugin, how helpful will it be to everyone etc. -- **Best Solution**: Code it yourself and submit a pull request. This is the fastest way to get a plugin into the package. +- **Best Solution**: Code it yourself and submit a pull request. This is the fastest way to get a plugin into the package. Checkout this little [tutorial](https://github.com/trafficonese/leaflet.extras2/blob/master/HowTo.md). *I submitted an issue for a plugin long time ago but it is still not available.* -This package is being developed purely on a voluntary basis on spare time without any monetary compensation. So the development progress can stall at times. It may also not be possible to prioritize one-off requests that no one else is interested in. Getting more people interested in a feature request will help prioritize development. Other option is to contribute code. That will get you added to the contributer list and a thanks tweet. +This package is being developed purely on a voluntary basis on spare time without any monetary compensation. So the development progress can stall at times. It may also not be possible to prioritize one-off requests that no one else is interested in. Getting more people interested in a feature request will help prioritize development. Other option is to contribute code. That will get you added to the contributor list. *I found a bug.* diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 00000000..7a18070c --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,113 @@ +title: leaflet.extras2 + +template: + params: + bootswatch: yeti + +reference: + - title: Package Documentation + desc: ~ + contents: + - '`leaflet.extras2`' + - title: Ant Path + contents: + - matches("Antpath") + - matches("antpath") + - title: Arrowhead + contents: + - matches("Arrowhead") + - matches("arrowhead") + - title: Contextmenu + contents: + - matches("Contextmenu") + - matches("contextmenu") + - matches("context_") + - menuItem + - mapmenuItems + - markermenuItems + - title: Easy Print + contents: + - matches("Easyprint") + - matches("easyprint") + - title: GIBS + contents: + - matches("GIBS") + - setDate + - setTransparent + - gibs_layers + - title: Heightgraph + contents: + - matches("Heightgraph") + - matches("heightgraph") + - title: Hexbin-D3 + contents: + - matches("Hexbin") + - matches("hexbin") + - title: History + contents: + - matches("History") + - matches("history") + - clearFuture + - title: Labelgun + contents: + - matches("Labelgun") + - title: Moving Markers + - title: Mapkey Icons + contents: + - matches("Mapkey") + - matches("mapkey") + - title: Moving Markers + contents: + - matches("movingMarker") + - matches("Moving") + - title: OpenWeatherMap + contents: + - matches("Openweather") + - matches("openweather") + - title: Playback + contents: + - matches("Playback") + - matches("playback") + - to_jsonformat + - to_ms + - title: Reachability + contents: + - matches("Reachability") + - matches("reachability") + - title: Sidebar-v2 + contents: + - matches("Sidebar") + - matches("sidebar") + - title: Side-by-Side + contents: + - matches("Sidebyside") + - title: Spinner + contents: + - matches("Spinner") + - title: Sync + contents: + - matches("sync") + - matches("Sync") + - title: Tangram + contents: + - matches("Tangram") + - title: Timeslider + contents: + - matches("Timeslider") + - matches("timeslider") + - title: Velocity + contents: + - matches("Velocity") + - matches("velocity") + - title: WMS + contents: + - matches("WMS") + +destination: docs + +development: + mode: auto + +authors: + Sebastian Gatscha: + href: https://github.com/trafficonese diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 58772741..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,60 +0,0 @@ -# DO NOT CHANGE the "init" and "install" sections below - -# Download script file from GitHub -init: - ps: | - $ErrorActionPreference = "Stop" - Invoke-WebRequest http://raw.github.com/krlmlr/r-appveyor/master/scripts/appveyor-tool.ps1 -OutFile "..\appveyor-tool.ps1" - Import-Module '..\appveyor-tool.ps1' - -install: - ps: Bootstrap - -# cache is causing errors -# cache: -# - C:\RLibrary - -# Adapt as necessary starting from here - -build_script: - - travis-tool.sh install_deps - -test_script: - - travis-tool.sh run_tests - -on_failure: - - 7z a failure.zip *.Rcheck\* - - appveyor PushArtifact failure.zip - -artifacts: - - path: '*.Rcheck\**\*.log' - name: Logs - - - path: '*.Rcheck\**\*.out' - name: Logs - - - path: '*.Rcheck\**\*.fail' - name: Logs - - - path: '*.Rcheck\**\*.Rout' - name: Logs - - - path: '\*_*.tar.gz' - name: Bits - - - path: '\*_*.zip' - name: Bits - -environment: - global: - _R_CHECK_FORCE_SUGGESTS_: false - -notifications: - - provider: Email - to: - - sebastian_gatscha@gmx.at - subject: 'r-appveyor build {{status}}' - message: "https://ci.appveyor.com/project/trafficones/leaflet.extras2" - on_build_success: false - on_build_failure: true - on_build_status_changed: true diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..8f36b6cc --- /dev/null +++ b/codecov.yml @@ -0,0 +1,12 @@ +comment: false + +coverage: + status: + project: + default: + target: auto + threshold: 1% + patch: + default: + target: auto + threshold: 1% diff --git a/cran-comments.md b/cran-comments.md new file mode 100644 index 00000000..d6b17a20 --- /dev/null +++ b/cran-comments.md @@ -0,0 +1,5 @@ +## R CMD check results `(devtools::check(args = c('--as-cran')))` + +0 errors v | 0 warnings v | 0 notes v + +* This is a patch release for the leaflet 2.2.0 release. diff --git a/data-raw/data-raw.R b/data-raw/data-raw.R new file mode 100644 index 00000000..f1d20114 --- /dev/null +++ b/data-raw/data-raw.R @@ -0,0 +1,10 @@ + +gibs_layerslink <- paste0(system.file("htmlwidgets/lfx-gibs", package = "leaflet.extras2"), "/gibs_layers_meta.json") +gibs_layers <- jsonify::from_json(json = gibs_layerslink, simplify = TRUE) +gibs_layers <- data.frame(do.call(rbind, gibs_layers), stringsAsFactors = FALSE) +gibs_layers$title <- as.character(gibs_layers$title) +gibs_layers$template <- as.character(gibs_layers$template) +gibs_layers$zoom <- as.integer(gibs_layers$zoom) +gibs_layers$date <- as.logical(gibs_layers$date) +rownames(gibs_layers) <- NULL +usethis::use_data(gibs_layers, overwrite = TRUE) diff --git a/data/gibs_layers.rda b/data/gibs_layers.rda new file mode 100644 index 00000000..02b9a774 Binary files /dev/null and b/data/gibs_layers.rda differ diff --git a/inst/examples/antpath_app.R b/inst/examples/antpath_app.R index d72f1423..4bec7e4a 100644 --- a/inst/examples/antpath_app.R +++ b/inst/examples/antpath_app.R @@ -20,7 +20,7 @@ ui <- fluidPage( server <- function(input, output, session) { output$map <- renderLeaflet({ leaflet() %>% - addTiles() %>% + addTiles() %>% addMapPane("my-pane", 420) %>% addAntpath(data = coords, layerId = ~FGN, label = ~sprintf("Ant-Colony of %s", district), @@ -30,11 +30,13 @@ server <- function(input, output, session) { popup = ~FGN, opacity = 1, options = antpathOptions( - pulseColor = colorNumeric("Reds", domain = as.numeric(coords$FKN))(as.numeric(coords$FKN)), - delay = c(rep(300, 50), rep(3000, 50)), + pulseColor = colorNumeric("Reds", + domain = as.numeric(coords$FKN))(as.numeric(coords$FKN)), + delay = 4000, paused = FALSE, + renderer= JS('L.svg({pane: "my-pane"})'), reverse = TRUE, - dashArray = c(40, 50), + dashArray = c(40, 10), hardwareAccelerated = T, interactive = TRUE, lineCap = "butt", diff --git a/inst/examples/arrowhead_app.R b/inst/examples/arrowhead_app.R new file mode 100644 index 00000000..69f3d489 --- /dev/null +++ b/inst/examples/arrowhead_app.R @@ -0,0 +1,81 @@ +library(shiny) +library(leaflet) +library(leaflet.extras2) + +ui <- fluidPage( + leafletOutput("map", height=800), + actionButton("clear", "Clear Group"), + actionButton("remove", "Remove"), + actionButton("clearArrowhead", "Remove Arrowheads by group"), + actionButton("removeArrowhead", "Remove Arrowheads by layerId's") +) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addLayersControl(overlayGroups = c("blue","red")) %>% + ## Blue ############# + addArrowhead(data = atlStorms2005[1:10,], color="blue", + group="blue", + options = arrowheadOptions( + yawn = 60, + size = '7%', + frequency = 'endonly', + fill = TRUE, + opacity=0.5, stroke=FALSE, fillOpacity=0.4, + proportionalToTotal = TRUE, + offsets = NULL, + perArrowheadOptions = NULL)) %>% + ## Red ############# + addArrowhead(data = atlStorms2005[11:20,], color = "red", + group = "red", + layerId = paste0("inp",1:10), + options = arrowheadOptions( + yawn = 90, + size = '10px', + frequency = 'allvertices', + fill = TRUE, + offsets = NULL, + perArrowheadOptions = NULL)) %>% + ## Green ############# + addArrowhead(data = atlStorms2005[21,], color = "green", group="green", + options = arrowheadOptions( + size = '10px', + frequency = '50px', + offsets = list('start' = '100m', 'end' = '15px'), + fill = TRUE)) %>% + ## Yellow ############# + addArrowhead(data = atlStorms2005[22,], color = "yellow", + options = arrowheadOptions( + size = "25000m", + frequency = '200000m', + fill = TRUE)) %>% + ## Purple ############# + addArrowhead(data = atlStorms2005[24,], color = "purple", + options = arrowheadOptions( + opacity=1, fillOpacity=1, + frequency = "30px", + size= "20px", fill=TRUE, + perArrowheadOptions = leaflet::JS("(i) => ({ + color: `rgba(150, 20, ${0 + 20 * i}, 1)`, + })"))) + }) + observeEvent(input$clear, { + leafletProxy("map") %>% + leaflet::clearGroup("blue") + }) + observeEvent(input$remove, { + leafletProxy("map") %>% + leaflet::removeShape(layerId = "inp3") + }) + observeEvent(input$clearArrowhead, { + leafletProxy("map") %>% + clearArrowhead(group = "blue") + }) + observeEvent(input$removeArrowhead, { + leafletProxy("map") %>% + removeArrowhead(paste0("inp",1:5)) + }) +} +shinyApp(ui, server) diff --git a/inst/examples/contextmenu_app.R b/inst/examples/contextmenu_app.R new file mode 100644 index 00000000..3aef5aa9 --- /dev/null +++ b/inst/examples/contextmenu_app.R @@ -0,0 +1,220 @@ +library(shiny) +library(leaflet) +library(leaflet.extras2) + +ui <- fluidPage( + leafletOutput("map", height = "800px"), + actionButton("show", "Show Contextmenu at given Coordinates"), + actionButton("hide", "Hide Contextmenu"), + actionButton("add", "Add Options to Contextmenu"), + actionButton("ins", "Insert Options to Contextmenu"), + actionButton("rm", "Remove Option 2"), + actionButton("disable", "Disable Contextmenu Item 1"), + actionButton("enable", "Enable Contextmenu Item 1"), + actionButton("disable_all", "Disable Contextmenu"), + actionButton("enable_all", "Enable Contextmenu"), + actionButton("rmall", "Remove All Map Items"), + splitLayout( + div( + h4("Contextmenu Selection:"), + verbatimTextOutput("print"), + ), + div( + h4("Custom Marker Selection:"), + verbatimTextOutput("print1") + ) + ) +) + +server <- function(input, output, session) { + data <- reactiveVal() + data1 <- reactiveVal() + + output$map <- renderLeaflet({ + ## Basemap #################### + suppressWarnings( + leaflet(options = leafletOptions( + contextmenu=TRUE, + contextmenuWidth = 200, + contextmenuItems = + context_mapmenuItems( + context_menuItem("Zoom Out", "function(e) {this.zoomOut();}", disabled=TRUE), + context_menuItem("Zoom In", "function(e) {this.zoomIn();}"), + "-", + context_menuItem("Disable index 0", + "function(e) {this.contextmenu.setDisabled(0, true)}", + hideOnSelect = TRUE), + context_menuItem("Enable index 0", + "function(e) {this.contextmenu.setDisabled(0, false)}", + hideOnSelect = FALSE), + "-", + context_menuItem(text="Center Map", + callback="function(e) {this.panTo(e.latlng);}", + icon="https://cdn3.iconfinder.com/data/icons/web-15/128/RSSvgLink-2-512.png"), + list(text="Console Log", + callback=JS("function(e) {console.log('e');console.log(e);}")) + ))) %>% + addTiles(group = "base") %>% + addContextmenu() %>% + + ## Points ############################### + addMarkers(data = sf::st_as_sf(leaflet::breweries91), + label=~brewery, layerId = ~founded, group="marker", + options = markerOptions( + contextmenu=TRUE, + contextmenuWidth = 200, + contextmenuItems = + context_markermenuItems( + context_menuItem( + text = "Show Marker Coords", + "function(e) { + Shiny.setInputValue(map.id + '_mymarkertrigger', { + menuid: e.relatedTarget.options.contextmenuItems[0].id, + layerId: e.relatedTarget.options.layerId, + lat: e.relatedTarget.options.lat, + lng: e.relatedTarget.options.lng, + opacity: e.relatedTarget.options.opacity + }); + alert(e.latlng);}", + id = "somemarkerid", + icon="https://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/Person_icon_BLACK-01.svg/1200px-Person_icon_BLACK-01.svg.png", + index=0) + ) + )) %>% + ## Lines ############################### + addPolylines(data = sf::st_as_sf(leaflet::atlStorms2005), + layerId = ~Name, group="lines", + label = ~Name, + options = pathOptions( + contextmenu=TRUE, + contextmenuWidth = 400, + contextmenuInheritItems = FALSE, + contextmenuItems = + context_markermenuItems( + context_menuItem(text = "Get Line Data", + NULL, + index=0), + context_menuItem(text = "Delete Line", + "function(e) {e.relatedTarget.remove()}", + icon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANAAAADyCAMAAAALHrt7AAAAdVBMVEUAAAD///+FhYVRUVFfX19paWk/Pz+ioqLHx8f7+/vm5ube3t739/fx8fG6urru7u7Pz8+MjIxISEi0tLR6enrAwMBWVlarq6vX19chISGPj48REREZGRmvr68tLS0mJiabm5s1NTV0dHRlZWU7OzscHBxLS0v96C8XAAAKaUlEQVR4nO2d60LjOAyFk5ZLoYVSCmWAmaHlMu//iMttSmwdRUeJd+2wOb+dRF/iiyQ7dlWn1mxyeVtx+rm5m6d+fJX4fjcky17PF2kNSAx04OV51VVSC5ICLe478FTVNKUNSYGeO/FU1WNCG1ICTTryVNU6nREJgU4781T36axICNT9A6X8RAmBuvUIHzpMZkU6oB417lXJzEh3p4teQMtUZqQDOu8FlMwFGoFUjUAjEKV0QNe9gE5TmfEJtLi+uzrspz+9gA56Pn11vmgC3fUyphBNTv4CLdmQuXSdfgCd5bYjnc7egS5zm5FOR29A69xWpNT6FegotxEpdVlX36gFvems6uf1F6eLapbbhLSajUCFawQqXSNQ6RqBStcIVLpGoNI1ApWuEah0jUClawQqXbNqntuEtJpX9c/cNqTUbV3V36rOzd6S9f2m3orS9cf80OL8bvINtPq1qNMv0cyuEah0jUClawQqXSNQ6RqBStcIVLpGoNI1ApWuEah0/U+ATv5jKxJKAs2uju6rn5vpALR5PP5hAa2Hlkh9uGkDOpnmtq+Dfi9VoMVDbuO6aa4B9ft9IaOWGOg4t12d9QCBFrnN6qEbBPQrt1U99ICAnnJb1UenACi3Tb20/m5A2xGocN0AoEH/GHUNgA5zG9VHcwB0lduoPkLd9ja3UX20AECD/hmvBkBDXoBxi4B+5Laqh6YIaJnbqh66QkBDDh9WCOikzz42mXWMgDpvbVWAriHQEFM+n7qAQAP2feYQaMDbRJxAoOFmfZpBUANouL7PCwYa7n/uUwzUb/+xnDrEQMP1fa4w0Eluuzpri4F67eGXVWsFaJfbsK6aKUBd9pEtQnMFqM8+mFl1pgAN1vdZKEDurZgL0W2tALn+vHmePm3oOdnLg41jQ6Sjg4NLz3TvkQbEp0mmFx/+7ZzJTn4WPruhhoX7448WseTry0YDon2fRr//w7Ty/Kvwo33r5p607BRcc8fucJ0CeYNgQ8WlsVQjKLz12EZ3uw1HoRNQtFNx+2+J0Q7uxje6DEuTWYHmYpIQiNoK8Dl6aGtvL3Y1br93vPck9w/ndfP+wfUb7+XvatsATWz3uW279VNcmrOouYIpBCIabTCKfUpfgXIkyrZ2PHLbbWqtQfO7hkBMI/wtHtpyGTgxoO3ecvtWaiQ5a94+uJxJk/yRNuojxrEs3DbAyk2qqUYUvK/gcmZ73LgjqtvqhRNIrqRkvlDT84mAGN9nJ23U00VOIFmaAQpecXgP5gP/lE/Vp8p6AzGZqODYiPAe1IyKrBf6U3sDMY1g1bwgWqLJAMluW/+wPiDQgTIeatPziRfRMq6CBNLzXz4g0N9sCYPOmxdEQMxqEtm3pgKSjgIVRAfuYgTEpEnk6Kf7Pj4gMAyvvAZFQEy8Jk9A0vuS3kCMQUEbiIC2xPWzWkgN8nxAK1maifGCCyIgplMR3nZd/04DtJWlmZXXbUDMapLzWkhNufqAbmRpYiI79OgjIMbT8BjpAwKvikj+hDFkBMSkSe7kY9VI2QcEKvOLbU/YlURAzO7bE/lYten6gEB3Q9gTtrzYfSJSZ57O1QckfgainMswzI2B3HX2Xep47gOSQzYzqRhW1BiI8H0OpJHbNEDSqWLadPhdYyBiNQlwIdXQ3QckAxMG6Cy4IgYifKeHWkiNwX1AsjAzjISvIb7JlriDfK4ahvUFInICUQQtfirsBKSGrC4gENwTAWuU+outY2J4+Vy1ZriAdrIwkWfchFfE1jFpEtl21atcQK6M317RyZoxENPxO3pXFxAYD4jMZ+SJifpDADnGPxdQtwi89cdcDsjhobiAwLGsRMAauegCiFhNAk4hTgIEvF5inI9erwAiYl6HU+wCAnEJMT0UzZEJIP9HfpPmpLuAQMBKTElGXZQA8jfDN2lJBRfQL0/hvaIrBBAxlIFchuaku4DAl1ezL3vdRlcIICJNAuq61vJcQCACt+PNeNJTABG+D+iNtJbnApK9JzF5EIebAoiIQEAMrs2yuoDkgE1E4HFyUgARLwW4KFoY5QKSLhUBFDdo6Trb93DMevQEIqpLvBJAAtmuwk5aqXnFLqAzUZYIWOOGJ4HssexFXKMGYi4gOZNG9FBxw5NAtvsEDo7XQmUPkGs2eq+4nkogYjWJfLL2Kj1AYIaViMDjS6RxREwl64ZW2T1AO1mWyHDYQMRN+BUsHiBPvm8v8RbA3lg2kDxRWQtZPUAbWdb2lOV6PHETou8HR0QnAAI5c7s9C69FAhFpEhmDpwACLqK9fk84yhKIcDf4kNUDBJx4ewgRMRTogu3VJCBwUZYGe4BAmGUvmxAhBwCyfR8QWioX/XvzsZ8yN8yrmcQEeLQy/e4xErwmu7KIEQQA2WkSvnJ4gEDAaloi09IAaGveBaz4UJqvB8iR7vuSvETexR6eQciqdLAeIH4w+JJYFI+AbBcXJKGVIdAD1CUCl95Fp2lA4KRs+wPxDtWXpHcBgGzfB7iRSsjqAZIBqz1ZJVszALI/tPwBQPPRPUBdFm3LJC4AspsiH4p5gGRROwKXPgsCMtOV9/JlKkFHPyA7kpFdPQKyV5PQ6QwHEEgp2LGm7EgQkO2000u3HUA7WdQeEWXsjIDssEp2SEoP6wCayqJb0xBZ9xGQfR/5pZWFdg4gELCa63TAKh0EZCeP6GljB5BjCmAvMH4goC6di5LjdwB1icCBD4aA7PGMXhzqAOoyZQzcfgRkLzylVzo7gECQZQas4BoEZLsK8m9G5eEOIMdU9F4gyIVApqsA7MSjsQMIVGNz/3wUEyIg81PT9d0B5Pml4q9QTIiAzOwR6GJxDO4A6jJlLB0FDGR2l/QyIweQfNt25wRsh0BmjhxMG+OVCmBw0eqR/EJ2pMkC2atJ5DX4xcvYVg2rZY9lDvAgLsNAHXwfzU7h9aketExUmDUfVBQMZEeKwpPUaqnoPvSeK2a3mxDomzAQMaMS1Xi9ukfJqRYHOv5EHeZSNCDmp5vgfZ60/OYTdK2trTP0zIi5XuBcYCBqC9dGM5q3/rbU+Jjb9ls2RwOj6LvAWIyBiGVqr5p8fqSlFbY8frAvrk0P5Pav/zOjtjUCno8CRG5fv5usJk8U/GZ1Re68dPm4WrEbroK5XgVoIId0INMxEPPDcgHigba5TaW044GGcdANmATRgIaxhStIfGlA3A5OuQVceQ1oGHvSIkdBARrGFq4gVaMBDeOkG+T5aEDU8J9byFHQgKhd0HILpEhUoEGcdCNnqXSgIfg+YC5FBxrCFq5gLkUHGsJJNyhFogINwfeBjoIGNARXAcyl6EBDcBWg56MBDcFVgI6CCkRt4ZpXcjlaG9AATrqBno8KNICTbvDh5RrQAHwfbLgGVP5JN9jzUYHKP+kGpkh0oPJ9HzSX0gJUfpoErCJpA2JmVPIKzEe3AZV/yh9MkehA5R+Kh+ZS2oCKj1nxuKoDld4r4PCuBaj0xI9S41qAyo7xYKK+Haho7+dFaUGtQAX3C/cwx2gCFZvMOlS/jwFUn5YYFh3h2JsCenWB1pPDg3J0OFnjQHWvfwAGBoka5A1PPAAAAABJRU5ErkJggg==", + index=1), + context_menuItem(text = "Change Color/Weight", + "function(e) {e.relatedTarget.setStyle({color: '#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6), + weight: Math.round(Math.random()*10)});}", + icon = "https://cdn3.iconfinder.com/data/icons/ui-glynh-blue-02-of-5/100/UI_Blue_2_of_3_30-512.png", + index = 2), + context_menuItem(text = "Add Centroid", + "function(e) {L.marker(Object.values(e.relatedTarget.getCenter())).addTo(this);}", + icon = "https://bodylab.ch/wp-content/uploads/2015/11/map-marker-icon.png", + index = 3), + context_menuItem(text = "Log GeoJSON", + "function(e) {console.log(e.relatedTarget.toGeoJSON());}", + icon = "https://cdn0.iconfinder.com/data/icons/outlinecons-filetypes/512/log-512.png", + index = 4), + context_menuItem(text = "-", separator=TRUE, + index = 5) + ) + )) %>% + ## Shapes ############################### + addPolygons(data = sf::st_as_sf(leaflet::gadmCHE), + label=~NAME_1, layerId = ~OBJECTID, group="shapes", + options = pathOptions( + contextmenu=TRUE, + contextmenuWidth = 200, + contextmenuItems = + context_markermenuItems( + context_menuItem(text = "Get Polygon Coords", + "function(e) {console.log(e.latlng);}", + index = 0), + context_menuItem(text = "Delete Polygon", + "function(e) {e.relatedTarget.remove()}", + index = 1), + context_menuItem(text = "Change Color", + "function(e) {e.relatedTarget.setStyle({color: '#4B1BDE', + fillColor : '#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6), + fillOpacity: 1});}", + index = 2), + context_menuItem(text = "Add Centroid", + "function(e) {L.marker(Object.values(e.relatedTarget.getCenter())).addTo(this);}", + index = 3), + context_menuItem(text = "Log GeoJSON", + "function(e) {console.log(e.relatedTarget.toGeoJSON());}", + index = 4), + context_menuItem(text = "-", NULL, separator=TRUE, + index = 5) + ) + )) + ) + }) + + observeEvent(input$map_contextmenu_select, { + txt <- input$map_contextmenu_select + data(txt) + print(txt) + }) + observeEvent(input$map_mymarkertrigger, { + message("Return Value from 'Show Marker Coords' - callback") + txt <- rbind(input$map_mymarkertrigger) + data1(txt) + print(txt) + }) + observeEvent(input$show, { + leafletProxy("map") %>% + showContextmenu(data = leaflet::breweries91[sample(1:32, 1),]) + }) + observeEvent(input$hide, { + leafletProxy("map") %>% + hideContextmenu() + }) + observeEvent(input$disable_all, { + leafletProxy("map") %>% + disableContextmenu() + }) + observeEvent(input$enable_all, { + leafletProxy("map") %>% + enableContextmenu() + }) + observeEvent(input$add, { + ## Requires https://github.com/rstudio/leaflet/pull/696 to be merged! + leafletProxy("map") %>% + addItemContextmenu( + context_menuItem(text = "Added Menu Item", + callback = ("function(e) {alert('I am a new menuItem!'); + console.log('e');console.log(e);}"))) + }) + observeEvent(input$ins, { + ## Requires https://github.com/rstudio/leaflet/pull/696 to be merged! + leafletProxy("map") %>% + addItemContextmenu( + context_menuItem(text = "Inserted Menu Item at Index 2", + callback = ("function(e) {alert('I am an inserted menuItem!'); + console.log('e');console.log(e);}"))) + }) + observeEvent(input$rm, { + leafletProxy("map") %>% + removeItemContextmenu(2) + }) + observeEvent(input$disable, { + leafletProxy("map") %>% + setDisabledContextmenu(1, TRUE) + }) + observeEvent(input$enable, { + leafletProxy("map") %>% + setDisabledContextmenu(1, FALSE) + }) + observeEvent(input$rmall, { + leafletProxy("map") %>% + removeallItemsContextmenu() + }) + + output$print <- renderPrint({ + txt <- req(data()) + print(txt) + }) + output$print1 <- renderPrint({ + txt <- req(data1()) + print(txt) + }) +} + +shinyApp(ui, server) diff --git a/inst/examples/easyprint_app.R b/inst/examples/easyprint_app.R index ffa12d26..75899ed5 100644 --- a/inst/examples/easyprint_app.R +++ b/inst/examples/easyprint_app.R @@ -1,13 +1,24 @@ - library(shiny) -library(shinycssloaders) library(leaflet) -library(leaflet.extras) - +library(leaflet.extras2) ui <- fluidPage( - withSpinner(leafletOutput("map")), - selectInput("scene", "Select Scene", choices = c("Current", "CurrentSize", "A4Landscape", "A4Portrait")), + tags$head(tags$style(".easyPrintHolder .customCssClass { + background-image: url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTguMS4xLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ0NC44MzMgNDQ0LjgzMyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDQ0LjgzMyA0NDQuODMzOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4Ij4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNNTUuMjUsNDQ0LjgzM2gzMzQuMzMzYzkuMzUsMCwxNy03LjY1LDE3LTE3VjEzOS4xMTdjMC00LjgxNy0xLjk4My05LjM1LTUuMzgzLTEyLjQ2N0wyNjkuNzMzLDQuNTMzICAgIEMyNjYuNjE3LDEuNywyNjIuMzY3LDAsMjU4LjExNywwSDU1LjI1Yy05LjM1LDAtMTcsNy42NS0xNywxN3Y0MTAuODMzQzM4LjI1LDQzNy4xODMsNDUuOSw0NDQuODMzLDU1LjI1LDQ0NC44MzN6ICAgICBNMzcyLjU4MywxNDYuNDgzdjAuODVIMjU2LjQxN3YtMTA4LjhMMzcyLjU4MywxNDYuNDgzeiBNNzIuMjUsMzRoMTUwLjE2N3YxMzAuMzMzYzAsOS4zNSw3LjY1LDE3LDE3LDE3aDEzMy4xNjd2MjI5LjVINzIuMjVWMzR6ICAgICIgZmlsbD0iIzAwMDAwMCIvPgoJPC9nPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=); + transform: rotate(90deg); + } + .easyPrintHolder .customCssClass1 { + background-image: url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTguMS4xLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ0NC44MzMgNDQ0LjgzMyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDQ0LjgzMyA0NDQuODMzOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4Ij4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNNTUuMjUsNDQ0LjgzM2gzMzQuMzMzYzkuMzUsMCwxNy03LjY1LDE3LTE3VjEzOS4xMTdjMC00LjgxNy0xLjk4My05LjM1LTUuMzgzLTEyLjQ2N0wyNjkuNzMzLDQuNTMzICAgIEMyNjYuNjE3LDEuNywyNjIuMzY3LDAsMjU4LjExNywwSDU1LjI1Yy05LjM1LDAtMTcsNy42NS0xNywxN3Y0MTAuODMzQzM4LjI1LDQzNy4xODMsNDUuOSw0NDQuODMzLDU1LjI1LDQ0NC44MzN6ICAgICBNMzcyLjU4MywxNDYuNDgzdjAuODVIMjU2LjQxN3YtMTA4LjhMMzcyLjU4MywxNDYuNDgzeiBNNzIuMjUsMzRoMTUwLjE2N3YxMzAuMzMzYzAsOS4zNSw3LjY1LDE3LDE3LDE3aDEzMy4xNjd2MjI5LjVINzIuMjVWMzR6ICAgICIgZmlsbD0iIzAwMDAwMCIvPgoJPC9nPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=); + transform: rotate(180deg); + }") + ), + leafletOutput("map", height = 700, width = "100%"), + selectInput("scene", "Select Scene", + choices = c("CurrentSize"="CurrentSize", + "A4Landscape"="A4Landscape", + "A4Portrait"="A4Portrait", + "Custom Landscape"="customCssClass", + "Custom Portrait"="customCssClass1")), textInput("fn", "Filename", value = "map"), actionButton("print", "Print Map"), actionButton("rem", "removeEasyprint"), @@ -16,21 +27,50 @@ ui <- fluidPage( server <- function(input, output, session) { output$map <- renderLeaflet({ - input$print leaflet() %>% - addTiles() %>% - addEasyprint(options = easyprintOptions(title = 'Give me that map', - position = 'bottomleft', - exportOnly = FALSE, - filename = "mapit", - hideClasses = list("div1","div2"), - customWindowTitle = "Some Fancy Title", - customSpinnerClass = "shiny-spinner-placeholder", - spinnerBgColor = "#b48484")) + addTiles(group = "basemap") %>% + addCircleMarkers(data=leaflet::breweries91, + group = "markers", popup = ~brewery, label=~brewery) %>% + addPopups(data=leaflet::breweries91[1:5,], + group = "popups", popup = ~brewery) %>% + addEasyprint(options = easyprintOptions( + title = 'Give me that map', + position = 'bottomleft', + exportOnly = TRUE, + # hideClasses = list("leaflet-overlay-pane", "leaflet-popup"), + # hidden = FALSE, hideControlContainer = TRUE, + filename = "mapit", + tileLayer = "basemap", + tileWait = 5000, + defaultSizeTitles = list( + "CurrentSize" = "The current map extent", + "A4Landscape" = "A4 (Landscape) extent with w:1045, h:715", + "A4Portrait" = "A4 (Portrait) extent with w:715, h:1045" + ), + # sizeModes = c("A4Portrait","A4Landscape"), + sizeModes = list("CurrentSize" = "CurrentSize", + "A4Landscape" = "A4Landscape", + "A4Portrait" = "A4Portrait", + "Custom Landscape"=list( + width= 1800, + height= 700, + name = "A custom landscape size tooltip", + className= 'customCssClass'), + "Custom Portrait"=list( + width= 700, + height= 1800, + name = "A custom portrait size tooltip", + className= 'customCssClass1') + ), + customWindowTitle = "Some Fancy Title", + customSpinnerClass = "shiny-spinner-placeholder", + spinnerBgColor = "#b48484")) }) observeEvent(input$print, { + scene <- input$scene leafletProxy("map") %>% - easyprintMap(sizeModes = input$scene, filename = input$fn) + easyprintMap(sizeModes = scene, filename = input$fn) + # easyprintMap(sizeModes = scene, filename = scene) }) observeEvent(input$rem, { leafletProxy("map") %>% @@ -39,24 +79,9 @@ server <- function(input, output, session) { observeEvent(input$cle, { leafletProxy("map") %>% clearControls() - # clearGroup("easyprintgroup") }) } shinyApp(ui, server) -# -# (title = 'Print map', -# position = 'topleft', -# sizeModes = NULL, -# defaultSizeTitles = NULL, -# exportOnly = FALSE, -# tileLayer = NULL, -# tileWait = 500, -# filename = 'map', -# hidden = FALSE, -# hideControlContainer = TRUE, -# hideClasses = list(), -# customWindowTitle = NULL, -# spinnerBgColor = '#0DC5C1', -# customSpinnerClass = 'epLoader') + diff --git a/inst/examples/gibs_app.R b/inst/examples/gibs_app.R new file mode 100644 index 00000000..e4eb751c --- /dev/null +++ b/inst/examples/gibs_app.R @@ -0,0 +1,36 @@ +library(shiny) +library(leaflet) +library(leaflet.extras2) + +ui <- fluidPage( + leafletOutput("map", height = "700px"), + dateInput("date", "Date:", max = Sys.Date(), value = Sys.Date()-10), + actionButton("go", "Set the new Date"), + checkboxInput("trans", "Transparency", value = TRUE), + actionButton("go1", "Set the new Transparency") +) + +layers <- gibs_layers$title[c(35, 128, 185)] + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + setView(9, 50, 6) %>% + addGIBS(layers = layers, + dates = Sys.Date() - 10, + group = layers, opacity = c(0.5, 0.3, 1)) %>% + addLayersControl(overlayGroups = layers) + }) + + observeEvent(input$go, { + leafletProxy("map",session) %>% + setDate(layers, input$date) + }) + observeEvent(input$go1, { + leafletProxy("map",session) %>% + setTransparent(layers, input$trans) + }) +} + +shinyApp(ui, server) diff --git a/inst/examples/heightgraph_app.R b/inst/examples/heightgraph_app.R new file mode 100644 index 00000000..f7cd9b6a --- /dev/null +++ b/inst/examples/heightgraph_app.R @@ -0,0 +1,123 @@ +library(shiny) +library(leaflet) +library(leaflet.extras2) +library(sf) +library(sfheaders) + +data(atlStorms2005) +data <- st_cast(st_as_sf(atlStorms2005[1,]), "LINESTRING") +data <- st_transform(data, 4326) +data <- data.frame(st_coordinates(data)) +data$elev <- runif(nrow(data), 10, 500) +data$L1 <- round(seq.int(1, 4, length.out = nrow(data))) +data <- sfheaders::sf_linestring(data, x = "X", + y = "Y", z = "elev", linestring_id = "L1") +data$steepness <- 1:nrow(data) +data$suitability <- nrow(data):1 +data$popup <- apply(data, 1, function(x) { + sprintf("Steepness: %s
Suitability: %s", x$steepness, x$suitability) +}) + +ui <- fluidPage( + leafletOutput("map", height = "700px"), + actionButton("hideGroup", "hideGroup"), + actionButton("showGroup", "showGroup"), + actionButton("clearGeoJSON", "clearGeoJSON"), + actionButton("clearControls", "clearControls"), + actionButton("removeControl", "removeControl"), + + h4("Clicks"), + verbatimTextOutput("click"), + h4("Mouseover"), + verbatimTextOutput("mouseover"), + h4("Mouseout"), + verbatimTextOutput("mouseout") +) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles(group = "base") %>% + addHeightgraph(color = "red", columns = c("steepness", "suitability"), + opacity = 1, data = data, group = "heightgraph", + options = heightgraphOptions( + width = 800, + mappings = list( + "steepness" = + list( + "1" = list( + "text"="1-3%", + "color"="#a9befc"), + "2" = list( + "text"="4-6%", + "color"="#6f93fc"), + "3" = list( + "text"="4-6%", + "color"="#2d62fc"), + "4" = list( + "text"="4-6%", + "color"="#0026ff") + ), + "suitability" = + list( + "1" = list( + "text"="Very Good", + "color"="green"), + "2" = list( + "text"="Moderate", + "color"="yellow"), + "3" = list( + "text"="Bad", + "color"="orange"), + "4" = list( + "text"="Very Bad", + "color"="red") + ) + ), + highlightStyle = list(weight= 10, + opacity= 0.8, + color= 'orange'), + translation = list(distance= "Distanz", + elevation= "Hรถhe", + segment_length= "Segment Lรคnge", + type= "Typ", + legend= "Legende"), + xTicks = 3) + ) %>% + addLayersControl(baseGroups = "base", overlayGroups = "heightgraph") + }) + observeEvent(input$hideGroup, { + leafletProxy("map") %>% + leaflet::hideGroup("heightgraph") + }) + observeEvent(input$showGroup, { + leafletProxy("map") %>% + leaflet::showGroup("heightgraph") + }) + observeEvent(input$clearGeoJSON, { + leafletProxy("map") %>% + clearGeoJSON() + }) + observeEvent(input$clearControls, { + leafletProxy("map") %>% + clearControls() + }) + observeEvent(input$removeControl, { + leafletProxy("map") %>% + removeControl("hg_control") + }) + + output$click <- renderPrint({ + txt <- req(input$map_heightgraph_click) + print(txt) + }) + output$mouseover <- renderPrint({ + txt <- req(input$map_heightgraph_mouseover) + print(txt) + }) + output$mouseout <- renderPrint({ + txt <- req(input$map_heightgraph_mouseout) + print(txt) + }) +} +shinyApp(ui, server) diff --git a/inst/examples/hexbin_app.R b/inst/examples/hexbin_app.R index 7e5bab3e..7eeed589 100644 --- a/inst/examples/hexbin_app.R +++ b/inst/examples/hexbin_app.R @@ -1,13 +1,8 @@ library(shiny) library(leaflet) library(leaflet.extras2) -library(sf) ## Data ################### -# df <- breweries91 - -# df <- st_as_sf(breweries91) - set.seed(100) rand_lng <- function(n = 10) rnorm(n, -93.65, .01) rand_lat <- function(n = 10) rnorm(n, 42.0285, .01) @@ -48,13 +43,13 @@ style <- " ui <- fluidPage( tags$head(tags$style(style)), leafletOutput("map", height = "700px"), - verbatimTextOutput("txt"), actionButton("update_data", "Update Hexbin Data"), actionButton("update_color", "Update Hexbin Colors"), actionButton("update_both", "Update Hexbin Data & Colors"), actionButton("hide", "Hide Hexbin"), actionButton("show", "Show Hexbin"), actionButton("clear", "Clear Hexbin Layers"), + verbatimTextOutput("txt") ) ## SERVER ################### @@ -62,26 +57,28 @@ server <- function(input, output, session) { output$map <- renderLeaflet({ leaflet() %>% addTiles(group = "base") %>% - addHexbin(data = df, opacity = 1, radius = 20, - layerId = "hexbin_id", group = "hexbin_group", - options = hexbinOptions( - duration = 300, - # colorRange = c("#ff0000", "#08306b"), - colorRange = c("red", "yellow", "blue"), - # colorRange = col, - # colorScaleExtent = c(1, 40), - # colorRange = c('red', 'red', 'orange', 'orange', 'yellow', 'yellow', 'green', 'green', 'blue', 'blue'), + addHexbin( + data = df, opacity = 1, + # radius = 20, + layerId = "hexbin_id", group = "hexbin_group", + options = hexbinOptions( + duration = 300, + # colorRange = c("#ff0000", "#08306b"), + colorRange = c("red", "yellow", "blue"), + # colorRange = col, + # colorScaleExtent = c(1, 40), + # colorRange = c('red', 'red', 'orange', 'orange', 'yellow', 'yellow', 'green', 'green', 'blue', 'blue'), - # radiusScaleExtent = (JS("[40, undefined]")), - # radiusRange = c(10, 20), - pointerEvents = "all", - # resizetoCount = TRUE, - resizetoCount = JS("function(d) { return (Math.cos(d.length) * 10); }"), + # radiusScaleExtent = (JS("[40, undefined]")), + radiusRange = c(10, 20), + pointerEvents = "all", + resizetoCount = TRUE, + # resizetoCount = JS("function(d) { return (Math.cos(d.length) * 10); }"), - tooltip = JS("function(d) {return 'Amount of coordinates: ' + d.length;} ") - # tooltip = "Amount of Markers: " - # tooltip = T - )) %>% + tooltip = JS("function(d) {return 'Amount of coordinates: ' + d.length;} ") + # tooltip = "Amount of Markers: " + # tooltip = T + )) %>% addMarkers(data = df, group = "markers") %>% hideGroup("markers") %>% addLayersControl(overlayGroups = c("hexbin_group", "markers")) @@ -95,6 +92,7 @@ server <- function(input, output, session) { pts <- do.call(rbind, lapply(pts$pts, function(x) do.call("cbind", x))) colnames(pts) <- c("lng","lat") clicked <- df[which(round(df$lng, 10) %in% round(pts[,"lng"], 10)),] + req(nrow(clicked) != 0) leafletProxy("map", session) %>% clearGroup("clicked_markers") %>% @@ -102,18 +100,21 @@ server <- function(input, output, session) { label = ~category) }) observeEvent(input$update_data, { - df <- data.frame(lat = rand_lat(n), lng = rand_lng(n)) + df <<- data.frame(lat = rand_lat(n), lng = rand_lng(n), + category = factor(sample(categories, n, replace = TRUE), levels = categories)) leafletProxy("map", session) %>% updateHexbin(data = df) }) observeEvent(input$update_color, { - cols <- sample(colors()[!(grepl("grey", colors())) | grepl("gray", colors())], 2) + cols <- sample(colors()[!(grepl("grey", colors())) | + grepl("gray", colors())], 2) leafletProxy("map", session) %>% updateHexbin(colorRange = rgb(t(col2rgb(cols)/255))) }) observeEvent(input$update_both, { df <- data.frame(lat = rand_lat(n), lng = rand_lng(n)) - cols <- sample(colors()[!(grepl("grey", colors())) | grepl("gray", colors())], 2) + cols <- sample(colors()[!(grepl("grey", colors())) | + grepl("gray", colors())], 2) leafletProxy("map", session) %>% updateHexbin(data = df, colorRange = rgb(t(col2rgb(cols)/255))) }) diff --git a/inst/examples/history_app.R b/inst/examples/history_app.R new file mode 100644 index 00000000..b86bc493 --- /dev/null +++ b/inst/examples/history_app.R @@ -0,0 +1,51 @@ +library(shiny) +library(leaflet) +library(leaflet.extras2) + +ui <- fluidPage( + leafletOutput("map"), + actionButton("goBack", "Go Back in Leaflet History"), + actionButton("goFwd", "Go Forward in Leaflet History"), + actionButton("clHi", "Clear History"), + actionButton("clFu", "Clear Future"), + actionButton("remo", "Remove Control"), + actionButton("clear", "Clear Control"), +) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addHistory(layerId = "histid", + options = historyOptions( + backText = "Back", + forwardText = "Forward", + position = 'bottomleft')) + }) + observeEvent(input$goBack, { + leafletProxy("map") %>% + goBackHistory() + }) + observeEvent(input$goFwd, { + leafletProxy("map") %>% + goForwardHistory() + }) + observeEvent(input$clHi, { + leafletProxy("map") %>% + clearHistory() + }) + observeEvent(input$clFu, { + leafletProxy("map") %>% + clearFuture() + }) + observeEvent(input$remo, { + leafletProxy("map") %>% + removeControl(layerId = "histid") + }) + observeEvent(input$clear, { + leafletProxy("map") %>% + clearControls() + }) +} + +shinyApp(ui, server) diff --git a/inst/examples/labelgun_app.R b/inst/examples/labelgun_app.R new file mode 100644 index 00000000..8f8f534c --- /dev/null +++ b/inst/examples/labelgun_app.R @@ -0,0 +1,63 @@ +library(shiny) +library(sf) +library(leaflet) +library(leaflet.extras2) + +df <- breweries91 +df$weight <- 1:nrow(df) +# df$weight <- sample(c(1,5,10,30), size = nrow(df), T) +dfjitter <- suppressWarnings(sf::st_jitter(sf::st_as_sf(df), 0.09)) +dfjitter1 <- suppressWarnings(sf::st_jitter(sf::st_as_sf(df), 0.09, 0.1)) +# dfjitter$weight <- rev(dfjitter$weight) +getColor <- function(dfjitter1) { + sapply(dfjitter1$weight, function(weight) { + if(weight > 5) { + "green" + } else if(weight <= 5) { + "orange" + } else { + "red" + } }) +} + +icons <- awesomeIcons(icon = 'ios-close', iconColor = 'black', library = 'ion', + markerColor = getColor(dfjitter1)) + +ui <- fluidPage(leafletOutput("map", height=700)) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addMarkers(data = df, label=~paste0(weight, " - ", brewery), + popup=~paste0(weight, " - ", brewery), + group = "hidemarkers_1", + labelOptions = labelOptions(permanent = TRUE)) %>% + addCircleMarkers(data = dfjitter, + label=~paste0(weight, " - ", brewery), + weight = ~weight, color = "red", + popup=~paste0(weight, " - ", brewery), + group = "hidemarkers_2", + labelOptions = labelOptions(permanent = TRUE)) %>% + addAwesomeMarkers(data=dfjitter1, + label=~paste0(weight, " - ", brewery), + icon=icons, + popup=~paste0(weight, " - ", brewery), + group = "hidemarkers_3", + labelOptions = labelOptions(permanent = TRUE)) %>% + addLabelgun(c("hidemarkers_1","hidemarkers_2","hidemarkers_3"), + rep(df$weight, 3)) %>% + # addLabelgun("hidemarkers_1") %>% + # addLabelgun(c("hidemarkers_1","hidemarkers_2"), rep(df$weight, 2)) %>% + # addLabelgun("hidemarkers_1", rep(df$weight, 3)) %>% + # addLabelgun("hidemarkers_2", rev(df$weight)) %>% + # addLabelgun("hidemarkers_1", entries = 50, + # weight = c(df$weight, rev(df$weight))) %>% + # addLabelgun(c("hidemarkers_1","hidemarkers_2"), df$weight) %>% + # addLabelgun(c("hidemarkers_1","hidemarkers_2")) %>% + addLayersControl(overlayGroups = c("hidemarkers_1", + "hidemarkers_2", + "hidemarkers_3")) + }) +} +shinyApp(ui, server) diff --git a/inst/examples/leafletsync/sync_basic.R b/inst/examples/leafletsync/sync_basic.R new file mode 100644 index 00000000..a0cb8cf3 --- /dev/null +++ b/inst/examples/leafletsync/sync_basic.R @@ -0,0 +1,86 @@ +library(shiny) +library(leaflet) +library(sf) +library(leaflet.extras2) +df <- st_as_sf(breweries91) + +ui <- fluidPage( + tags$head(tags$style(".btn-default { + width: 49%; display: inline-block; margin-top: 5px; }")), + h4("Drag/Zoom/Pan the individual maps"), + splitLayout(cellWidths = rep("33%",3), + leafletOutput("map1", height = 700), + leafletOutput("map2", height = 700), + leafletOutput("map3", height = 700) + ), + div( + actionButton("sync", label = "Sync all maps"), + actionButton("unsync", label = "Unsync all maps") + ), + splitLayout( + div( + actionButton("isSynced1", label = "Is map1 synced with any map?", width = "100%"), + verbatimTextOutput("issyncprint1") + ), + div( + actionButton("isSynced2", label = "Is map2 synced with map1?", width = "100%"), + verbatimTextOutput("issyncprint2") + ) + ) +) + +server <- function(input, output, session) { + output$map1 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "red") + }) + output$map2 <- renderLeaflet({ + leaflet() %>% + addProviderTiles(provider = "Stamen") %>% + addCircleMarkers(data = df, color = "orange") + }) + output$map3 <- renderLeaflet({ + leaflet() %>% + addProviderTiles(provider = "CartoDB.DarkMatter") %>% + addCircleMarkers(data = df[1:10,], color = "blue") %>% + addLeafletsync( + ids = NULL, + synclist = list(map1 = c("map2", "map3"), map2 = c("map3")), + options = leafletsyncOptions(noInitialSync = FALSE, + syncCursor = TRUE)) + }) + observeEvent(input$sync, { + leafletProxy("map1") %>% + addLeafletsync(c("map1","map2","map3")) + }) + observeEvent(input$unsync, { + leafletProxy("map1") %>% + unsync(id = "map1", unsyncids = c("map2","map3")) %>% + unsync(id = "map2", unsyncids = c("map1","map3")) %>% + unsync(id = "map3", unsyncids = c("map1","map2")) + }) + + + observeEvent(input$isSynced1, { + leafletProxy("map1") %>% + isSynced("map1") + }) + observeEvent(input$isSynced2, { + leafletProxy("map1") %>% + isSynced(id = "map2", syncwith = "map1") + }) + output$issyncprint1 <- renderPrint({ + print(input$map1_synced) + }) + output$issyncprint2 <- renderPrint({ + print(input$map2_synced) + }) +} +shinyApp(ui, server) + + + + + + diff --git a/inst/examples/leafletsync/sync_offsetHelper.R b/inst/examples/leafletsync/sync_offsetHelper.R new file mode 100644 index 00000000..df008e01 --- /dev/null +++ b/inst/examples/leafletsync/sync_offsetHelper.R @@ -0,0 +1,61 @@ +library(shiny) +library(leaflet) +library(sf) +library(leaflet.extras2) +df <- st_as_sf(breweries91) + +ui <- fluidPage( + h4("2 Maps with offset using 'L.Sync.offsetHelper'"), + tags$head(tags$style(".shiny-split-layout {margin-bottom: 4px;}")), + splitLayout(cellWidths = rep("50%",2), + leafletOutput("map1", height = 800), + leafletOutput("map2", height = 800), + ), + actionButton("sync", label = "Sync the maps"), + actionButton("unsync", label = "Unsync the maps") +) + +server <- function(input, output, session) { + output$map1 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "red") + }) + output$map2 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + ### The following line is needed, otherwise the plugin is not yet loaded and L.Sync will be undefined + addLeafletsyncDependency() %>% + addCircleMarkers(data = df, color = "orange") + }) + observe({ + leafletProxy("map1") %>% + addLeafletsync(ids = c("map1","map2"), + options = list( + "map1" = leafletsyncOptions( + syncCursor = FALSE,noInitialSync = FALSE, + offsetFn = JS("L.Sync.offsetHelper([0, 0.5], [0, 0])")), + "map2" = leafletsyncOptions( + syncCursor = FALSE,noInitialSync = FALSE, + offsetFn = JS("L.Sync.offsetHelper([0, 0], [0, 0.5])")) + ) + ) + }) + + observeEvent(input$sync, { + leafletProxy("map1") %>% + addLeafletsync(c("map1","map2")) + }) + observeEvent(input$unsync, { + leafletProxy("map1") %>% + unsync(id = "map1", unsyncids = "map2") %>% + unsync(id = "map2", unsyncids = "map1") + }) +} +shinyApp(ui, server) + + + + + + diff --git a/inst/examples/leafletsync/sync_offset_continuous.R b/inst/examples/leafletsync/sync_offset_continuous.R new file mode 100644 index 00000000..84027b91 --- /dev/null +++ b/inst/examples/leafletsync/sync_offset_continuous.R @@ -0,0 +1,117 @@ +library(shiny) +library(leaflet) +library(sf) +library(leaflet.extras2) +df <- st_as_sf(breweries91) + +ui <- fluidPage( + h4("1 Continuous Map built by 4 different Maps"), + tags$head(tags$style(".shiny-split-layout {margin-bottom: 4px;}")), + splitLayout(cellWidths = rep("50%",2), + leafletOutput("map1", height = 400), + leafletOutput("map2", height = 400), + ), + splitLayout(cellWidths = rep("50%",2), + leafletOutput("map3", height = 400), + leafletOutput("map4", height = 400) + ), + actionButton("sync", label = "Sync all maps"), + actionButton("unsync", label = "Unsync all maps") +) + +server <- function(input, output, session) { + output$map1 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "red") %>% + setView(lng = 10.55, lat = 49.76, zoom = 10) + }) + output$map2 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "orange") + }) + output$map3 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "purple") + }) + output$map4 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "blue") + }) + observe({ + leafletProxy("map1") %>% + addLeafletsync(ids = c("map1","map2","map3","map4"), + options = list( + "map1" = leafletsyncOptions( + syncCursor = FALSE,noInitialSync = FALSE, + offsetFn = JS("function (center, zoom, refMap, tgtMap) { + var refC = refMap.getContainer(); + var tgtC = tgtMap.getContainer(); + var pt = refMap.project(center, zoom) + .subtract([refC.offsetLeft, refC.offsetTop]) + .subtract(refMap.getSize().divideBy(2)) + .add([tgtC.offsetLeft, tgtC.offsetTop]) + .add(tgtMap.getSize().divideBy(2)); + return refMap.unproject(pt, zoom); + }")), + "map2" = leafletsyncOptions( + syncCursor = FALSE,noInitialSync = FALSE, + offsetFn = JS("function (center, zoom, refMap, tgtMap) { + var refC = refMap.getContainer(); + var tgtC = tgtMap.getContainer(); + var pt = refMap.project(center, zoom) + .subtract([refC.offsetLeft, refC.offsetTop]) + .subtract(refMap.getSize().divideBy(2)) + .add([tgtC.offsetLeft, tgtC.offsetTop]) + .add(tgtMap.getSize().divideBy(2)); + return refMap.unproject(pt, zoom); + }")), + "map3" = leafletsyncOptions( + syncCursor = FALSE,noInitialSync = FALSE, + offsetFn = JS("function (center, zoom, refMap, tgtMap) { + var refC = refMap.getContainer(); + var tgtC = tgtMap.getContainer(); + var pt = refMap.project(center, zoom) + .subtract([refC.offsetLeft, refC.offsetTop]) + .subtract(refMap.getSize().divideBy(2)) + .add([tgtC.offsetLeft, tgtC.offsetTop]) + .add(tgtMap.getSize().divideBy(2)); + return refMap.unproject(pt, zoom); + }")), + "map4" = leafletsyncOptions( + syncCursor = FALSE, noInitialSync = FALSE, + offsetFn = JS("function (center, zoom, refMap, tgtMap) { + var refC = refMap.getContainer(); + var tgtC = tgtMap.getContainer(); + var pt = refMap.project(center, zoom) + .subtract([refC.offsetLeft, refC.offsetTop]) + .subtract(refMap.getSize().divideBy(2)) + .add([tgtC.offsetLeft, tgtC.offsetTop]) + .add(tgtMap.getSize().divideBy(2)); + return refMap.unproject(pt, zoom); + }")) + )) + }) + + observeEvent(input$sync, { + leafletProxy("map1") %>% + addLeafletsync(c("map1","map2","map3","map4")) + }) + observeEvent(input$unsync, { + leafletProxy("map1") %>% + unsync(id = "map1", unsyncids = c("map2","map3","map4")) %>% + unsync(id = "map2", unsyncids = c("map1","map3","map4")) %>% + unsync(id = "map3", unsyncids = c("map1","map2","map4")) %>% + unsync(id = "map4", unsyncids = c("map1","map2","map3")) + }) +} +shinyApp(ui, server) + + + + + + diff --git a/inst/examples/leafletsync/sync_with_synclist.R b/inst/examples/leafletsync/sync_with_synclist.R new file mode 100644 index 00000000..aac05d34 --- /dev/null +++ b/inst/examples/leafletsync/sync_with_synclist.R @@ -0,0 +1,79 @@ +library(shiny) +library(leaflet) +library(sf) +library(leaflet.extras2) +df <- st_as_sf(breweries91) + +ui <- fluidPage( + h4("4 Maps synced with a 'synclist'"), + tags$head(tags$style(".shiny-split-layout {margin-bottom: 4px;}")), + splitLayout(cellWidths = rep("50%",2), + leafletOutput("map1", height = 400), + leafletOutput("map2", height = 400), + ), + splitLayout(cellWidths = rep("50%",2), + leafletOutput("map3", height = 400), + leafletOutput("map4", height = 400) + ), + actionButton("sync", label = "Sync all maps"), + actionButton("unsync", label = "Unsync all maps") +) + +server <- function(input, output, session) { + output$map1 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "red") %>% + setView(lng = 10.55, lat = 49.76, zoom = 10) + }) + output$map2 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "orange") + }) + output$map3 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "purple") + }) + output$map4 <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addCircleMarkers(data = df, color = "blue") + }) + observe({ + leafletProxy("map1") %>% + addLeafletsync( + synclist = list(mapa = c("map2","map4"), + map2 = c("map1"), + map3 = c("map1","map2","map4"), + map4 = c("map2")), + options = leafletsyncOptions(syncCursor = FALSE, + noInitialSync = FALSE)) + }) + + observeEvent(input$sync, { + leafletProxy("map1") %>% + addLeafletsync( + synclist = list(map1 = c("map2","map4"), + map2 = c("map1"), + map3 = c("map1","map2","map4"), + map4 = c("map2")), + options = leafletsyncOptions(syncCursor = FALSE, + noInitialSync = FALSE)) + }) + observeEvent(input$unsync, { + leafletProxy("map1") %>% + unsync(id = "map1", unsyncids = c("map2","map3","map4")) %>% + unsync(id = "map2", unsyncids = c("map1","map3","map4")) %>% + unsync(id = "map3", unsyncids = c("map1","map2","map4")) %>% + unsync(id = "map4", unsyncids = c("map1","map2","map3")) + }) +} +shinyApp(ui, server) + + + + + + diff --git a/inst/examples/movingmarker_app.R b/inst/examples/movingmarker_app.R new file mode 100644 index 00000000..7198e485 --- /dev/null +++ b/inst/examples/movingmarker_app.R @@ -0,0 +1,117 @@ +library(shiny) +library(sf) +library(leaflet) +library(leaflet.extras2) + +df <- sf::st_as_sf(atlStorms2005)[1,] +dfp <- suppressWarnings(st_cast(df, "POINT")) +dfp$duratios = sample(c(1000, 1500, 2000, 2500, 3000), nrow(dfp), TRUE) + +shipIcon <- makeIcon( + iconUrl = "https://cdn-icons-png.flaticon.com/512/1355/1355883.png", + iconWidth = 40, iconHeight = 50, + iconAnchorX = 0, iconAnchorY = 0 +) + +ui <- fluidPage( + splitLayout(cellWidths = c("50%","49%"), + leafletOutput("map", height = 800), + splitLayout(cellWidths = c("49%","49%"), + div(h5("Click Events"), + verbatimTextOutput("click")), + div(h5("Mouseover Events"), + verbatimTextOutput("mouseover")) + ) + ), + actionButton("start", "Start"), + actionButton("stop", "Stop"), + actionButton("pause", "Pause"), + actionButton("resume", "Resume"), + actionButton("addLatLng", "addLatLng"), + actionButton("moveTo", "moveTo"), + actionButton("addStation", "addStation"), + actionButton("clear", "Clear Group"), + actionButton("clearmark", "Clear Marker"), + actionButton("remove", "Remove Marker") +) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addPolylines(data = df) %>% + addMovingMarker(data = dfp, + duration = ~duratios, + icon = shipIcon, + movingOptions = movingMarkerOptions(autostart = TRUE, + loop = TRUE, + pauseOnZoom = TRUE), + label = "I am a pirate!", + popup = "Arrr", + group = "movingmarker", + layerId = "myid" + ) + }) + + output$click <- renderPrint({ + txt <- req(input$map_movingmarker_click) + print(txt) + }) + output$mouseover <- renderPrint({ + txt <- req(input$map_movingmarker_mouseover) + print(txt) + }) + + observeEvent(input$start, { + leafletProxy("map", session) %>% + startMoving() + }) + observeEvent(input$stop, { + leafletProxy("map", session) %>% + stopMoving() + }) + observeEvent(input$pause, { + leafletProxy("map", session) %>% + pauseMoving() + }) + observeEvent(input$resume, { + leafletProxy("map", session) %>% + resumeMoving() + }) + + observeEvent(input$addLatLng, { + latlng <- list(lat=runif(1,30,35),lng=runif(1,-70,-65)) + leafletProxy("map", session) %>% + addCircleMarkers(lng = latlng$lng,lat = latlng$lat, + label = paste("input$addLatLng:", input$addLatLng)) %>% + addLatLngMoving(latlng = latlng, duration = 2000) + }) + observeEvent(input$moveTo, { + latlng <- list(lat=runif(1,30,35),lng=runif(1,-70,-65)) + leafletProxy("map", session) %>% + addCircleMarkers(lng = latlng$lng,lat = latlng$lat, + label=paste("input$moveTo:", input$addLatLng)) %>% + moveToMoving(latlng = latlng, duration = 2000) + }) + observeEvent(input$addStation, { + pti <- sample(seq.int(nrow(dfp)), 1, TRUE) + print(paste("Stay at Point Index:", pti, "for 4000 ms.")) + leafletProxy("map", session) %>% + addStationMoving(pointIndex = pti, + duration = 4000) + }) + + observeEvent(input$clear, { + leafletProxy("map", session) %>% + clearGroup("movingmarker") + }) + observeEvent(input$clearmark, { + leafletProxy("map", session) %>% + clearMarkers() + }) + observeEvent(input$remove, { + leafletProxy("map", session) %>% + removeMarker("myid") + }) +} +shinyApp(ui, server) diff --git a/inst/examples/multi_sidebar_app.R b/inst/examples/multi_sidebar_app.R new file mode 100644 index 00000000..1330da1c --- /dev/null +++ b/inst/examples/multi_sidebar_app.R @@ -0,0 +1,153 @@ +library(sf) +library(shiny) +library(leaflet) +library(leaflet.extras2) + +data(breweries91, package = "leaflet") + +ui <- fluidPage( + h4("Leaflet Sidebar Plugin"), + splitLayout( + cellWidths = c("27%", "73%"), + tagList( + actionButton("open", "Open Sidebar"), + actionButton("close", "Close Sidebar"), + actionButton("clear", "Clear Sidebar") + ), + tagList( + leafletOutput("map", height = "700px", width = "100%"), + ## Sidebar 1 ############# + sidebar_tabs(id = "mysidebarid", + list(icon("car"), icon("user"), icon("envelope")), + ## Sidebar 1 - Pane ############# + sidebar_pane( + title = "home", id = "home_id", icon = icon("home"), + tagList( + sliderInput("obs", "Number of observations:", + min = 1, max = 32, value = 10), + sliderInput("opa", "Point Opacity:", + min = 0, max = 1, value = 0.5), + sliderInput("fillopa", "Fill Opacity:", + min = 0, max = 1, value = 0.2), + dateRangeInput("daterange4", "Date range:", + start = Sys.Date() - 10, + end = Sys.Date() + 10), + verbatimTextOutput("tab1") + ) + ), + ## Sidebar 1 - Pane ############# + sidebar_pane( + title = "profile", id = "profile_id", icon = icon("wrench"), + tagList( + textInput("caption", "Caption", "Data Summary"), + selectInput("label", "Label", + choices = c("brewery","address", "zipcode", "village")), + passwordInput("password", "Password:"), + actionButton("go", "Go"), + verbatimTextOutput("value") + ) + ), + ## Sidebar 1 - Pane ############# + sidebar_pane( + title = "messages", id = "messages_id", icon = icon("person"), + tagList( + checkboxGroupInput("variable", "Variables to show:", + c("Cylinders" = "cyl", + "Transmission" = "am", + "Gears" = "gear")), + tableOutput("data") + ) + ) + ), + ## Sidebar 2 ############# + sidebar_tabs(id = "animalsidebar", + list(icon("kiwi-bird"), icon("frog")), + ## Sidebar 2 - Pane ############# + sidebar_pane( + title = "kwi", id = "kiwi_id", icon = icon("kiwi-bird"), + tagList( + p("Kiwi birds are awesome.") + ) + ), + ## Sidebar 2 - Pane ############# + sidebar_pane( + title = "frog", id = "frog_id", icon = icon("frog"), + tagList( + p("No frogs are better.") + ) + ) + ) + ) + ) +) + +## Server ############ +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + ## Add Controls on all sides ######### + addEasyButton(easyButton(position = "topleft", + icon = htmltools::span(class = "star", htmltools::HTML("★")), + onClick = JS("function(btn, map){ map.setZoom(1);}"))) %>% + addEasyButton(easyButton(position = "topright", + icon = htmltools::span(class = "star", htmltools::HTML("★")), + onClick = JS("function(btn, map){ map.setZoom(2);}"))) %>% + addEasyButton(easyButton(position = "bottomright", + icon = htmltools::span(class = "star", htmltools::HTML("★")), + onClick = JS("function(btn, map){ map.setZoom(3);}"))) %>% + addEasyButton(easyButton(position = "bottomleft", + icon = htmltools::span(class = "star", htmltools::HTML("★")), + onClick = JS("function(btn, map){ map.setZoom(4);}"))) %>% + ## Add Sidebar ########## + addSidebar( + id = "mysidebarid", + options = list(position = "left") + ) %>% + addSidebar( + id = "animalsidebar", + options = list(position = "right") + ) + }) + observe({ + req(input$obs) + df <- breweries91[sample.int(nrow(breweries91), input$obs), ] + bbox <- st_bbox(df) + leafletProxy("map", session) %>% + clearGroup("pts") %>% + addCircleMarkers(data = df, + label = df[[input$label]], + opacity = input$opa, + fillOpacity = input$fillopa, + group = "pts") %>% + fitBounds(bbox[[1]], bbox[[2]], bbox[[3]], bbox[[4]]) + }) + + output$tab1 <- renderText({ + input$obs + }) + output$value <- renderText({ + req(input$go) + isolate(input$password) + }) + output$data <- renderTable(rownames = FALSE, { + mtcars[, c("mpg", input$variable), drop = FALSE] + }) + + observeEvent(input$open, { + tab_ids <- c(rep("mysidebarid", 3), rep("animalsidebar", 2)) + pane_ids <- c("home_id", "profile_id", "messages_id", "kiwi_id", "frog_id") + idx <- sample.int(length(pane_ids), 1) + leafletProxy("map", session) %>% + openSidebar(pane_ids[idx], tab_ids[idx]) + }) + observeEvent(input$close, { + leafletProxy("map", session) %>% + closeSidebar(sample(c("mysidebarid", "animalsidebar"), 1)) + }) + observeEvent(input$clear, { + leafletProxy("map", session) %>% + removeSidebar(sample(c("mysidebarid", "animalsidebar"), 1)) + }) +} +shinyApp(ui, server) diff --git a/inst/examples/openweather_app.R b/inst/examples/openweather_app.R index 320d4425..5d34b923 100644 --- a/inst/examples/openweather_app.R +++ b/inst/examples/openweather_app.R @@ -2,15 +2,93 @@ library(shiny) library(leaflet) library(leaflet.extras2) -ui <- fluidPage(leafletOutput("map", height = "700px")) +## Include your API-Key +# Sys.setenv("OPENWEATHERMAP" = 'Your_API_Key') +apikey <- Sys.getenv("OPENWEATHERMAP") + +ui <- fluidPage( + leafletOutput("map", height = "700px"), + ## Buttons for Overlay Tiles + actionButton("clgr", "Clear Group"), + actionButton("higr", "Hide Group"), + actionButton("shgr", "Show Group"), + actionButton("rmti", "Remove Tiles"), + ## Buttons for Current Markers + actionButton("clgrc", "Clear Group - Current"), + actionButton("higrc", "Hide Group - Current"), + actionButton("shgrc", "Show Group - Current"), + actionButton("rmtic", "Remove Marker - Current"), + + uiOutput("popuptxt") +) + + +owmlayers <- c("clouds", "pressure", + "precipitation", "rain", "wind") server <- function(input, output, session) { output$map <- renderLeaflet({ leaflet() %>% - addTiles() %>% - setView(9, 50, 6) %>% - addOpenweatherTiles(layers = c("clouds", "pressure", - "precipitation", "rain", "wind")) + addTiles() %>% setView(9, 50, 11) %>% + addOpenweatherTiles(apikey = apikey, + layers = owmlayers, + layerId = owmlayers, + group = owmlayers) %>% + addOpenweatherCurrent(apikey = apikey, + group = "currentgr", layerId = "currentid", + options = openweatherCurrentOptions( + lang = "de", + temperatureUnit = "F", + temperatureDigits = 2, + speedUnit = 'kmh', + speedDigits = 3, + popup = TRUE, + # markerFunction = htmlwidgets::JS('function(data) { + # return L.marker([data.coord.Lat, data.coord.Lon]);}'), + # popupFunction = htmlwidgets::JS('function(data) { + # return L.popup().setContent(typeof data.name != "undefined" ? data.name : data.id);}'), + useLocalTime = FALSE + )) %>% + addLayersControl(overlayGroups = owmlayers) + }) + + observeEvent(input$clgr , { + leafletProxy("map") %>% + clearGroup(group = "pressure") + }) + observeEvent(input$higr , { + leafletProxy("map") %>% + hideGroup(group = "pressure") + }) + observeEvent(input$shgr , { + leafletProxy("map") %>% + showGroup(group = "pressure") + }) + observeEvent(input$rmti , { + leafletProxy("map") %>% + removeTiles(layerId = "precipitation") + }) + + observeEvent(input$clgrc , { + leafletProxy("map") %>% + clearGroup(group = "currentgr") + }) + observeEvent(input$higrc , { + leafletProxy("map") %>% + hideGroup(group = "currentgr") + }) + observeEvent(input$shgrc , { + leafletProxy("map") %>% + showGroup(group = "currentgr") + }) + observeEvent(input$rmtic , { + leafletProxy("map") %>% + removeMarker(layerId = "currentid") + }) + + output$popuptxt <- renderUI({ + txt <- req(input$map_owm_click) + HTML(txt$content) }) } diff --git a/inst/examples/playback/data.csv b/inst/examples/playback/data.csv deleted file mode 100644 index 0baff0d8..00000000 --- a/inst/examples/playback/data.csv +++ /dev/null @@ -1,1247 +0,0 @@ -"time","x","y" -1366067072000,-123.2653968,44.54962188 -1366067074000,-123.26542599,44.54951009 -1366067076000,-123.26547225,44.5492899 -1366067077000,-123.26549654,44.54917343 -1366067079000,-123.26554281,44.54891614 -1366067080000,-123.26556555,44.54878695 -1366067082000,-123.26560808,44.54851984 -1366067083000,-123.26561995,44.54839196 -1366067086000,-123.26565215,44.54800062 -1366067089000,-123.26569247,44.54760721 -1366067092000,-123.26574792,44.54722007 -1366067095000,-123.26578896,44.54682917 -1366067098000,-123.26582461,44.54645322 -1366067101000,-123.26586197,44.54609782 -1366067104000,-123.26589666,44.54579504 -1366067105000,-123.26590807,44.54571401 -1366067109000,-123.26593057,44.54549186 -1366067111000,-123.26594982,44.54541613 -1366067122000,-123.26595491,44.54535095 -1366067135000,-123.26597049,44.54518109 -1366067137000,-123.26599333,44.54501792 -1366067139000,-123.26600236,44.54483693 -1366067140000,-123.26601534,44.54473309 -1366067142000,-123.26605076,44.54453012 -1366067145000,-123.26608525,44.54419806 -1366067148000,-123.26611214,44.54385608 -1366067151000,-123.26614375,44.54348167 -1366067154000,-123.26618797,44.5431001 -1366067157000,-123.26622983,44.54272769 -1366067160000,-123.26626606,44.5423464 -1366067162000,-123.26628574,44.5420917 -1366067163000,-123.26630186,44.54196771 -1366067165000,-123.26632618,44.54170957 -1366067166000,-123.26634178,44.54157733 -1366067168000,-123.26635716,44.54131612 -1366067169000,-123.26637671,44.54118596 -1366067171000,-123.26640047,44.54091701 -1366067172000,-123.26641868,44.54077296 -1366067173000,-123.26643736,44.54063844 -1366067174000,-123.26644412,44.54049204 -1366067175000,-123.26646509,44.5403517 -1366067176000,-123.26647582,44.5402058 -1366067177000,-123.26649113,44.54005965 -1366067178000,-123.26650648,44.53991332 -1366067179000,-123.26651714,44.53976474 -1366067180000,-123.26653307,44.53960766 -1366067181000,-123.26655086,44.53946206 -1366067182000,-123.26658852,44.53930491 -1366067183000,-123.26659857,44.53917055 -1366067184000,-123.26659745,44.53902043 -1366067186000,-123.26664917,44.5387342 -1366067188000,-123.26668718,44.53843455 -1366067190000,-123.26672678,44.53814207 -1366067192000,-123.26675634,44.5378427 -1366067194000,-123.26679634,44.53754431 -1366067196000,-123.26682742,44.53724028 -1366067198000,-123.26685448,44.53693909 -1366067200000,-123.26688895,44.53665138 -1366067202000,-123.26692022,44.53634566 -1366067204000,-123.26695427,44.53604737 -1366067205000,-123.26696551,44.53590054 -1366067206000,-123.26698494,44.53574854 -1366067207000,-123.2670017,44.53559873 -1366067208000,-123.26701926,44.53544296 -1366067209000,-123.26703523,44.53529422 -1366067210000,-123.26704312,44.53514364 -1366067211000,-123.2670586,44.53499597 -1366067212000,-123.26707128,44.53484068 -1366067213000,-123.2670988,44.53468398 -1366067214000,-123.26711722,44.53452707 -1366067215000,-123.2671344,44.53438066 -1366067216000,-123.26714814,44.53422102 -1366067217000,-123.26715766,44.5340727 -1366067218000,-123.26717965,44.53391346 -1366067219000,-123.26719659,44.53377891 -1366067220000,-123.26721917,44.5336297 -1366067221000,-123.26723907,44.53347759 -1366067222000,-123.2672618,44.53332867 -1366067224000,-123.2673157,44.53303079 -1366067226000,-123.26735503,44.5327368 -1366067228000,-123.26738147,44.5324391 -1366067230000,-123.2674151,44.5321552 -1366067232000,-123.26743853,44.53187826 -1366067234000,-123.26744424,44.53160656 -1366067237000,-123.26746326,44.53122664 -1366067240000,-123.2675081,44.53083601 -1366067242000,-123.26754157,44.53056117 -1366067244000,-123.26757076,44.5302729 -1366067246000,-123.26761011,44.52999344 -1366067248000,-123.26765207,44.52970039 -1366067250000,-123.26770791,44.52941153 -1366067252000,-123.26776413,44.5291118 -1366067254000,-123.26779326,44.52881322 -1366067256000,-123.26781256,44.52852564 -1366067258000,-123.26783905,44.52821506 -1366067260000,-123.26785862,44.52792227 -1366067262000,-123.26787421,44.52763006 -1366067264000,-123.26791075,44.52732672 -1366067266000,-123.26793951,44.52700113 -1366067268000,-123.26798464,44.52664881 -1366067270000,-123.26800356,44.5263178 -1366067272000,-123.26803836,44.52599413 -1366067274000,-123.26806183,44.52570957 -1366067276000,-123.26812024,44.52538351 -1366067278000,-123.2681914,44.52492832 -1366067280000,-123.26820723,44.52458001 -1366067282000,-123.2682692,44.52418099 -1366067284000,-123.26831116,44.52378889 -1366067286000,-123.26832363,44.52343379 -1366067287000,-123.26837467,44.52315362 -1366067289000,-123.26843893,44.52270056 -1366067291000,-123.26846951,44.52228757 -1366067293000,-123.26850322,44.52184872 -1366067295000,-123.2685453,44.52146518 -1366067297000,-123.2686059,44.52103568 -1366067299000,-123.26865746,44.52064332 -1366067301000,-123.26868859,44.52021735 -1366067303000,-123.26873203,44.51982596 -1366067305000,-123.26879159,44.5194292 -1366067307000,-123.26882603,44.51901272 -1366067309000,-123.26885234,44.51861022 -1366067311000,-123.26890242,44.51819673 -1366067313000,-123.26893149,44.51780045 -1366067315000,-123.26897624,44.51740318 -1366067317000,-123.26902805,44.51699623 -1366067319000,-123.26905345,44.51663066 -1366067321000,-123.26907845,44.51621528 -1366067323000,-123.26911866,44.51580423 -1366067325000,-123.26916501,44.51542341 -1366067327000,-123.26918917,44.51506471 -1366067329000,-123.26924094,44.51466664 -1366067331000,-123.26925848,44.51429637 -1366067333000,-123.26928051,44.51389784 -1366067335000,-123.26930765,44.51354382 -1366067337000,-123.26935049,44.51318392 -1366067339000,-123.26941652,44.51282517 -1366067341000,-123.26941863,44.51248692 -1366067343000,-123.26946991,44.51213166 -1366067345000,-123.26948735,44.51178657 -1366067347000,-123.26954343,44.51145848 -1366067349000,-123.26955927,44.51107967 -1366067351000,-123.26962467,44.5107418 -1366067353000,-123.26963966,44.51041988 -1366067355000,-123.2696979,44.51005794 -1366067357000,-123.26971385,44.50963898 -1366067359000,-123.2698249,44.509232 -1366067361000,-123.26982347,44.50880905 -1366067363000,-123.26987846,44.5084522 -1366067366000,-123.26996621,44.5081139 -1366067370000,-123.2702128,44.50787621 -1366067374000,-123.27066785,44.50785883 -1366067378000,-123.27111612,44.50786233 -1366067381000,-123.27151837,44.50787287 -1366067384000,-123.27191676,44.50788428 -1366067388000,-123.27239609,44.50795795 -1366067391000,-123.27284665,44.50795282 -1366067394000,-123.27333535,44.50792506 -1366067397000,-123.27379419,44.50793612 -1366067400000,-123.27425046,44.50795839 -1366067403000,-123.27467651,44.50799484 -1366067406000,-123.27514714,44.50795784 -1366067410000,-123.27568029,44.50797874 -1366067413000,-123.27606637,44.50798024 -1366067416000,-123.27650904,44.50797213 -1366067419000,-123.27693933,44.50795682 -1366067422000,-123.27732384,44.50798106 -1366067425000,-123.27775075,44.5079768 -1366067428000,-123.27822692,44.50799683 -1366067431000,-123.27869918,44.50800772 -1366067434000,-123.27920957,44.50800499 -1366067437000,-123.2796613,44.50800863 -1366067440000,-123.28016149,44.5080131 -1366067442000,-123.28049185,44.50801404 -1366067443000,-123.28066214,44.50800893 -1366067445000,-123.28099296,44.50800161 -1366067446000,-123.28118327,44.50800626 -1366067447000,-123.28137336,44.50801754 -1366067448000,-123.28156537,44.50799738 -1366067450000,-123.28193886,44.50799524 -1366067451000,-123.28211191,44.50800172 -1366067453000,-123.2824819,44.50802556 -1366067454000,-123.28266014,44.5080181 -1366067456000,-123.2830382,44.5080026 -1366067458000,-123.28342182,44.50801892 -1366067461000,-123.28387671,44.50800218 -1366067463000,-123.28416867,44.5080047 -1366067464000,-123.28431939,44.5079849 -1366067466000,-123.28458112,44.5079823 -1366067467000,-123.28472501,44.50797998 -1366067470000,-123.28500986,44.50801972 -1366067472000,-123.28512373,44.50806444 -1366067619000,-123.28529569,44.50779383 -1366067622000,-123.28530725,44.50750753 -1366067625000,-123.28530177,44.50718423 -1366067628000,-123.28530171,44.50685807 -1366067631000,-123.28530446,44.50655372 -1366067634000,-123.28530304,44.50626772 -1366067637000,-123.28530356,44.50598914 -1366067640000,-123.28530931,44.50569692 -1366067643000,-123.28531482,44.50539092 -1366067646000,-123.285322,44.50507938 -1366067649000,-123.28531355,44.50479598 -1366067652000,-123.28520154,44.50452862 -1366067656000,-123.28501689,44.50424677 -1366067661000,-123.28494625,44.50395744 -1366067683000,-123.28499372,44.50427312 -1366067687000,-123.28518952,44.50457574 -1366067690000,-123.28528259,44.50484167 -1366067693000,-123.28528126,44.50515073 -1366067696000,-123.28527731,44.50546418 -1366067699000,-123.28528704,44.5057864 -1366067702000,-123.28529865,44.50610547 -1366067705000,-123.28529908,44.50641184 -1366067708000,-123.28529543,44.50672686 -1366067711000,-123.28529251,44.50704394 -1366067714000,-123.28529733,44.50735341 -1366067717000,-123.28530224,44.50763654 -1366067722000,-123.28529372,44.50792583 -1366067727000,-123.28571883,44.50799392 -1366067730000,-123.28619153,44.50799372 -1366067733000,-123.28671596,44.50800565 -1366067736000,-123.28725073,44.50803753 -1366067739000,-123.28779291,44.50810782 -1366067741000,-123.28815997,44.50817088 -1366067744000,-123.28869594,44.50828794 -1366067746000,-123.2890606,44.50838101 -1366067748000,-123.28942683,44.50848273 -1366067750000,-123.28980364,44.508587 -1366067752000,-123.29019785,44.50869271 -1366067754000,-123.29060222,44.50878614 -1366067756000,-123.29102174,44.50886056 -1366067758000,-123.29145467,44.50893041 -1366067760000,-123.29190466,44.50898019 -1366067762000,-123.29235872,44.50900369 -1366067764000,-123.29283125,44.50901495 -1366067766000,-123.29330116,44.50901782 -1366067768000,-123.29376741,44.50901577 -1366067770000,-123.29422506,44.50901686 -1366067772000,-123.29467811,44.50901543 -1366067774000,-123.29513127,44.50901405 -1366067776000,-123.29557586,44.50901132 -1366067778000,-123.29601195,44.50900795 -1366067780000,-123.29645616,44.50900589 -1366067782000,-123.29690921,44.50900717 -1366067784000,-123.29737067,44.50900886 -1366067786000,-123.29784447,44.50900357 -1366067788000,-123.29832146,44.50899047 -1366067790000,-123.29879689,44.50895556 -1366067792000,-123.2992733,44.50890909 -1366067794000,-123.29974848,44.50884388 -1366067796000,-123.30021398,44.50876641 -1366067798000,-123.30067448,44.50867722 -1366067800000,-123.30113502,44.50857236 -1366067802000,-123.30159638,44.50844595 -1366067804000,-123.30207027,44.50830474 -1366067806000,-123.30258178,44.50813572 -1366067808000,-123.30314826,44.50791338 -1366067810000,-123.30374973,44.50764059 -1366067812000,-123.30431989,44.50735051 -1366067814000,-123.3048464,44.50705293 -1366067816000,-123.3053446,44.50676578 -1366067818000,-123.30581399,44.50650216 -1366067820000,-123.30625349,44.50625199 -1366067822000,-123.3066683,44.50601322 -1366067824000,-123.30706462,44.50578766 -1366067826000,-123.30744426,44.50557189 -1366067828000,-123.30780813,44.5053674 -1366067830000,-123.30814439,44.50517248 -1366067832000,-123.30846886,44.50498766 -1366067834000,-123.30877833,44.50480672 -1366067836000,-123.30908201,44.50463343 -1366067838000,-123.30939297,44.5044621 -1366067840000,-123.30970771,44.50428902 -1366067842000,-123.31001686,44.50411527 -1366067844000,-123.31032783,44.50393777 -1366067846000,-123.31063161,44.50376996 -1366067848000,-123.3109379,44.50360237 -1366067851000,-123.31138001,44.50334752 -1366067853000,-123.31168026,44.50318089 -1366067856000,-123.31204477,44.5028814 -1366067859000,-123.31215185,44.50250446 -1366067862000,-123.31215146,44.5021014 -1366067864000,-123.31214819,44.5018284 -1366067866000,-123.31214332,44.50154676 -1366067868000,-123.31214426,44.50124999 -1366067870000,-123.31213876,44.50093959 -1366067872000,-123.31213674,44.50062181 -1366067874000,-123.31213737,44.50029874 -1366067876000,-123.31212527,44.4999698 -1366067878000,-123.31211571,44.49963635 -1366067880000,-123.31211154,44.49928813 -1366067882000,-123.31210138,44.49892656 -1366067884000,-123.3121009,44.49856209 -1366067886000,-123.31209062,44.49820845 -1366067888000,-123.3120978,44.49790229 -1366067891000,-123.31227708,44.49763439 -1366067894000,-123.31271828,44.49761876 -1366067897000,-123.31329055,44.49763228 -1366067899000,-123.31370836,44.49763354 -1366067901000,-123.31414802,44.49763152 -1366067903000,-123.31460255,44.49763276 -1366067905000,-123.31505997,44.49763691 -1366067907000,-123.31551041,44.49763387 -1366067909000,-123.31596262,44.4976387 -1366067911000,-123.31641481,44.49763617 -1366067913000,-123.31687521,44.49763613 -1366067915000,-123.317332,44.497639 -1366067917000,-123.31776963,44.49763913 -1366067919000,-123.31818072,44.49764186 -1366067921000,-123.31856868,44.49764653 -1366067924000,-123.31910669,44.49763959 -1366067927000,-123.3195997,44.49764157 -1366067930000,-123.32005304,44.49764547 -1366067933000,-123.32047802,44.49764202 -1366067936000,-123.32089381,44.49763714 -1366067939000,-123.32128756,44.49762738 -1366067942000,-123.32169112,44.49760524 -1366067945000,-123.3221114,44.49758589 -1366067948000,-123.3226689,44.49756664 -1366067950000,-123.32309521,44.49755962 -1366067952000,-123.32353485,44.49755634 -1366067954000,-123.32397764,44.49755262 -1366067956000,-123.32442471,44.49754913 -1366067958000,-123.32487623,44.49754206 -1366067960000,-123.32531351,44.49753548 -1366067962000,-123.32575193,44.49753054 -1366067964000,-123.32619663,44.49753003 -1366067966000,-123.32664525,44.4975254 -1366067968000,-123.3271001,44.49751906 -1366067970000,-123.3275348,44.49752422 -1366067972000,-123.32797699,44.49752104 -1366067974000,-123.32842304,44.49751434 -1366067976000,-123.32887203,44.49748892 -1366067978000,-123.32933116,44.49742425 -1366067980000,-123.32977924,44.49731612 -1366067982000,-123.33021721,44.49717428 -1366067984000,-123.33062848,44.49700012 -1366067986000,-123.33101865,44.4968053 -1366067988000,-123.33141499,44.49659677 -1366067990000,-123.33180075,44.4964111 -1366067992000,-123.33219052,44.49624923 -1366067994000,-123.33257305,44.4961206 -1366067996000,-123.33294266,44.49602226 -1366067998000,-123.33333085,44.4959356 -1.366068e+12,-123.33370122,44.4958669 -1366068002000,-123.33409591,44.49581221 -1366068004000,-123.33452815,44.49576429 -1366068006000,-123.33498141,44.4957507 -1366068008000,-123.33541251,44.4957569 -1366068010000,-123.33582136,44.49574457 -1366068012000,-123.33621712,44.49574622 -1366068015000,-123.33676391,44.4957477 -1366068018000,-123.33725207,44.49574924 -1366068024000,-123.33764413,44.49576678 -1366068038000,-123.33805979,44.49575292 -1366068041000,-123.33863756,44.4957575 -1366068043000,-123.33911555,44.49578052 -1366068045000,-123.33962167,44.49575904 -1366068047000,-123.34015956,44.49575155 -1366068049000,-123.34073445,44.49575321 -1366068051000,-123.34131071,44.49574274 -1366068053000,-123.34188434,44.49573333 -1366068055000,-123.3424513,44.49572908 -1366068057000,-123.34301271,44.49573156 -1366068059000,-123.34357879,44.49573283 -1366068061000,-123.34414026,44.49573511 -1366068063000,-123.34471566,44.49572633 -1366068065000,-123.34529801,44.49572321 -1366068067000,-123.3458739,44.49572308 -1366068069000,-123.34644873,44.49572121 -1366068071000,-123.34701798,44.49572132 -1366068073000,-123.34757897,44.49572099 -1366068075000,-123.3481284,44.49572455 -1366068077000,-123.34867619,44.49572373 -1366068079000,-123.34921667,44.495722 -1366068081000,-123.34976011,44.49572271 -1366068083000,-123.35030473,44.49571927 -1366068085000,-123.35085844,44.49572216 -1366068087000,-123.35140944,44.49572321 -1366068089000,-123.35195816,44.4957255 -1366068091000,-123.35250524,44.49572224 -1366068093000,-123.35304311,44.49572095 -1366068095000,-123.35358401,44.49572192 -1366068097000,-123.35411605,44.49572092 -1366068099000,-123.35465388,44.49572139 -1366068101000,-123.35517871,44.49571705 -1366068103000,-123.35569378,44.49571897 -1366068105000,-123.35620354,44.4957182 -1366068107000,-123.35670346,44.4957207 -1366068109000,-123.35721153,44.49572872 -1366068111000,-123.35771327,44.495729 -1366068113000,-123.35822118,44.49572683 -1366068115000,-123.35873183,44.49572629 -1366068117000,-123.3592373,44.49572602 -1366068119000,-123.35973822,44.4957229 -1366068121000,-123.36019001,44.49572018 -1366068123000,-123.36057744,44.49572112 -1366068126000,-123.36109169,44.49571671 -1366068134000,-123.3614977,44.49571878 -1366068137000,-123.36188257,44.49572292 -1366068140000,-123.36244944,44.49572569 -1366068142000,-123.36288064,44.49572518 -1366068144000,-123.36334922,44.49572734 -1366068146000,-123.36384239,44.49572813 -1366068148000,-123.36433142,44.49572044 -1366068150000,-123.36480915,44.49571815 -1366068152000,-123.36527872,44.49572398 -1366068154000,-123.36573597,44.49572349 -1366068156000,-123.36618142,44.49571841 -1366068158000,-123.36661011,44.49571124 -1366068160000,-123.36702607,44.49569437 -1366068162000,-123.36743512,44.49570439 -1366068164000,-123.36783667,44.49570197 -1366068167000,-123.36835498,44.49570285 -1366068170000,-123.36890494,44.49569931 -1366068172000,-123.36931482,44.49570853 -1366068174000,-123.36974171,44.49572515 -1366068176000,-123.37013903,44.49571648 -1366068179000,-123.37063985,44.49573908 -1366068183000,-123.37101526,44.49577574 -1366068196000,-123.3710185,44.49544655 -1366068199000,-123.37103316,44.49516986 -1366068203000,-123.3709993,44.49484082 -1366068207000,-123.37099383,44.49449754 -1366068211000,-123.37099542,44.49413804 -1366068214000,-123.37098679,44.4938664 -1366068218000,-123.37099046,44.49353589 -1366068222000,-123.37097095,44.49322152 -1366068227000,-123.37116214,44.49298166 -1366068231000,-123.37160774,44.49295892 -1366068234000,-123.37203894,44.49295105 -1366068237000,-123.37244048,44.49292254 -1366068240000,-123.37290311,44.49292573 -1366068243000,-123.37334816,44.4929285 -1366068246000,-123.37379852,44.49293191 -1366068249000,-123.37424863,44.49296014 -1366068252000,-123.37472623,44.49300199 -1366068255000,-123.37510456,44.49296198 -1366068258000,-123.37552123,44.49283076 -1366068262000,-123.37578818,44.49258255 -1366068266000,-123.37591054,44.4922701 -1366068270000,-123.37614176,44.4920108 -1366068274000,-123.37660209,44.49189583 -1366068277000,-123.37698359,44.49187534 -1366068280000,-123.37748763,44.49187822 -1366068283000,-123.37796098,44.49188959 -1366068286000,-123.37851541,44.49187377 -1366068288000,-123.37892967,44.49186476 -1366068291000,-123.3794427,44.49187612 -1366068294000,-123.37992227,44.49186635 -1366068297000,-123.38032558,44.49185687 -1366068301000,-123.3807286,44.49170288 -1366068304000,-123.38071413,44.4913837 -1366068307000,-123.38067552,44.49099647 -1366068310000,-123.38068004,44.49057532 -1366068313000,-123.3806493,44.49018127 -1366068316000,-123.38065822,44.48978056 -1366068318000,-123.38063541,44.48950783 -1366068320000,-123.38066589,44.48923621 -1366068322000,-123.38065938,44.48896584 -1366068325000,-123.38074567,44.48857419 -1366068328000,-123.38086819,44.48820204 -1366068331000,-123.38093831,44.48788967 -1366068335000,-123.38105901,44.48758823 -1366068340000,-123.38116212,44.48728151 -1366068345000,-123.38124239,44.48695183 -1366068348000,-123.38132536,44.48668034 -1366068351000,-123.38137825,44.48634231 -1366068354000,-123.38146762,44.48605455 -1366068357000,-123.38155653,44.48576059 -1366068360000,-123.38162581,44.48542873 -1366068363000,-123.38174604,44.4851108 -1366068366000,-123.38179848,44.48482234 -1366068371000,-123.38186574,44.48451146 -1366068375000,-123.38189214,44.48421064 -1366068377000,-123.38188059,44.48393254 -1366068379000,-123.38190531,44.48365592 -1366068381000,-123.38188653,44.48337571 -1366068383000,-123.38187748,44.4830756 -1366068385000,-123.38187203,44.48277833 -1366068387000,-123.38186665,44.48249643 -1366068389000,-123.38184614,44.48219587 -1366068392000,-123.3818615,44.48182025 -1366068395000,-123.38182644,44.48145469 -1366068398000,-123.38179821,44.48113415 -1366068401000,-123.3818075,44.48081927 -1366068405000,-123.38181516,44.48046998 -1366068411000,-123.38182969,44.48018133 -1366068417000,-123.38142443,44.48010872 -1366068421000,-123.38095613,44.48013091 -1366068428000,-123.38050773,44.4800933 -1366068432000,-123.3801133,44.47991334 -1366068435000,-123.37989449,44.47966455 -1366068438000,-123.37964877,44.47934839 -1366068441000,-123.37947065,44.4790258 -1366068444000,-123.37929382,44.47871623 -1366068447000,-123.37915566,44.47841566 -1366068450000,-123.37904746,44.47807761 -1366068453000,-123.37893591,44.47775348 -1366068456000,-123.37881261,44.47742721 -1366068459000,-123.37867368,44.47710493 -1366068462000,-123.37853705,44.47679302 -1366068465000,-123.37838013,44.47649308 -1366068468000,-123.3781639,44.47621945 -1366068471000,-123.37777489,44.47614938 -1366068474000,-123.3772856,44.47615972 -1366068477000,-123.37683285,44.47616998 -1366068480000,-123.37645129,44.47609842 -1366068484000,-123.37629116,44.47577513 -1366068487000,-123.37627985,44.47542872 -1366068490000,-123.37628547,44.47504225 -1366068493000,-123.37627767,44.47464541 -1366068495000,-123.37627707,44.47436978 -1366068497000,-123.37626492,44.47408973 -1366068499000,-123.37626376,44.47381736 -1366068502000,-123.37624983,44.47342884 -1366068505000,-123.37623088,44.47308066 -1366068508000,-123.37620905,44.47278668 -1366068516000,-123.37587018,44.47261112 -1366068519000,-123.37535419,44.47261523 -1366068521000,-123.37493552,44.47260515 -1366068523000,-123.37448743,44.47259839 -1366068525000,-123.37402546,44.47259374 -1366068527000,-123.37355861,44.47259492 -1366068529000,-123.37307001,44.47259421 -1366068531000,-123.37259824,44.47259307 -1366068533000,-123.37211538,44.47259249 -1366068535000,-123.37162831,44.47258302 -1366068537000,-123.37113823,44.47258712 -1366068539000,-123.37064037,44.47258386 -1366068541000,-123.3701334,44.47258829 -1366068543000,-123.36962867,44.47259171 -1366068544000,-123.36937022,44.47258995 -1366068545000,-123.36912378,44.47259053 -1366068546000,-123.36887163,44.47258985 -1366068547000,-123.36863324,44.4725898 -1366068548000,-123.36838715,44.47258922 -1366068549000,-123.36814924,44.47259149 -1366068550000,-123.36789711,44.47259082 -1366068551000,-123.36766112,44.47258752 -1366068552000,-123.36741742,44.47258489 -1366068553000,-123.36717832,44.47258291 -1366068554000,-123.36694024,44.47258034 -1366068555000,-123.36670569,44.47258004 -1366068556000,-123.36646746,44.47258135 -1366068557000,-123.36623482,44.47258804 -1366068558000,-123.36598461,44.47258309 -1366068559000,-123.36574579,44.47257845 -1366068560000,-123.3655338,44.47257824 -1366068561000,-123.36533217,44.47257509 -1366068563000,-123.36510568,44.47257815 -1366068566000,-123.36489326,44.47257721 -1366068568000,-123.36466218,44.47257339 -1366068570000,-123.36436736,44.47257262 -1366068571000,-123.36421666,44.47257419 -1366068573000,-123.36390575,44.47257971 -1366068574000,-123.36376444,44.47257772 -1366068577000,-123.36345424,44.47257271 -1366068578000,-123.3633442,44.4725741 -1366068581000,-123.36294631,44.47258196 -1366068585000,-123.36249621,44.47256424 -1366068607000,-123.36290343,44.47254914 -1366068610000,-123.36340386,44.47256104 -1366068613000,-123.36390461,44.47256896 -1366068616000,-123.36438534,44.47257368 -1366068619000,-123.36483176,44.47258048 -1366068623000,-123.36528989,44.4725982 -1366068628000,-123.36541877,44.4729019 -1366068631000,-123.36534492,44.47324998 -1366068633000,-123.36528498,44.47351778 -1366068635000,-123.36523051,44.47380926 -1366068637000,-123.36517388,44.47411295 -1366068639000,-123.36510765,44.47441835 -1366068641000,-123.36504111,44.47474828 -1366068643000,-123.36498086,44.47505715 -1366068645000,-123.364906,44.47537289 -1366068647000,-123.36483848,44.47569095 -1366068649000,-123.36477777,44.47601283 -1366068651000,-123.36471569,44.47631687 -1366068653000,-123.36464285,44.4766202 -1366068655000,-123.36455395,44.47692703 -1366068657000,-123.36444889,44.47724018 -1366068659000,-123.36425392,44.47754867 -1366068661000,-123.36398455,44.4778458 -1366068663000,-123.3637075,44.47812319 -1366068665000,-123.36344706,44.47839477 -1366068667000,-123.36323979,44.47870751 -1366068669000,-123.36311147,44.47908059 -1366068671000,-123.36303851,44.47948787 -1366068673000,-123.36300979,44.47989029 -1366068675000,-123.3629961,44.48031362 -1366068677000,-123.36298102,44.48070729 -1366068679000,-123.36296296,44.48108138 -1366068681000,-123.36293987,44.48148094 -1366068683000,-123.36292523,44.48187751 -1366068685000,-123.36289383,44.48226047 -1366068687000,-123.36286448,44.48268227 -1366068689000,-123.3628803,44.48308152 -1366068691000,-123.36285904,44.48347825 -1366068693000,-123.36285033,44.48388443 -1366068695000,-123.36285319,44.48424317 -1366068697000,-123.36282358,44.4846135 -1366068699000,-123.36283064,44.48499237 -1366068701000,-123.36279845,44.48538377 -1366068703000,-123.36280365,44.48574292 -1366068705000,-123.36279103,44.48614027 -1366068707000,-123.36275882,44.48653038 -1366068709000,-123.36274116,44.48691251 -1366068711000,-123.36273447,44.48730966 -1366068713000,-123.36271833,44.48767209 -1366068715000,-123.36271052,44.48805876 -1366068717000,-123.36271529,44.48844957 -1366068719000,-123.36271707,44.48885722 -1366068721000,-123.36271342,44.48923657 -1366068723000,-123.36272713,44.48960986 -1366068725000,-123.36273137,44.48998309 -1366068727000,-123.36277839,44.49034337 -1366068729000,-123.36282615,44.49072404 -1366068731000,-123.36285145,44.49111262 -1366068733000,-123.36285707,44.49149927 -1366068735000,-123.36290385,44.49187654 -1366068737000,-123.36292367,44.49224925 -1366068739000,-123.36294821,44.49264102 -1366068741000,-123.36296194,44.49301479 -1366068743000,-123.36288459,44.4934073 -1366068745000,-123.36273562,44.49377256 -1366068747000,-123.36253489,44.49413239 -1366068749000,-123.36231906,44.49448448 -1366068751000,-123.36205489,44.49482926 -1366068753000,-123.36179433,44.49518322 -1366068755000,-123.36157846,44.49552327 -1366068757000,-123.36146593,44.49585897 -1366068759000,-123.36142305,44.49621261 -1366068761000,-123.36141416,44.49651894 -1366068763000,-123.36141521,44.49682134 -1366068765000,-123.36142282,44.49714268 -1366068767000,-123.36144152,44.49748082 -1366068769000,-123.36142261,44.49779811 -1366068771000,-123.36141675,44.49813024 -1366068773000,-123.36142061,44.49844143 -1366068775000,-123.36142109,44.49876812 -1366068777000,-123.36142069,44.49908708 -1366068779000,-123.36143407,44.49940369 -1366068781000,-123.36141717,44.49971028 -1366068783000,-123.36141545,44.50001698 -1366068785000,-123.36140439,44.50033155 -1366068787000,-123.36140674,44.50064952 -1366068789000,-123.36139215,44.50097352 -1366068791000,-123.36139402,44.50129888 -1366068793000,-123.36137066,44.50162203 -1366068795000,-123.36137386,44.50193885 -1366068797000,-123.36137358,44.50226545 -1366068799000,-123.36136434,44.5026049 -1366068801000,-123.36136304,44.50295191 -1366068803000,-123.36137093,44.50329056 -1366068805000,-123.36138476,44.50362755 -1366068807000,-123.36139781,44.50397618 -1366068809000,-123.36139632,44.50432095 -1366068811000,-123.3613971,44.50467597 -1366068813000,-123.36139774,44.50502173 -1366068815000,-123.36139644,44.50536213 -1366068817000,-123.36138866,44.50571724 -1366068819000,-123.36138144,44.50608813 -1366068821000,-123.36137998,44.50644445 -1366068823000,-123.36137587,44.50681541 -1366068825000,-123.36138115,44.5072001 -1366068827000,-123.36139523,44.50757645 -1366068829000,-123.36139261,44.507952 -1366068831000,-123.36141138,44.50831719 -1366068833000,-123.36140426,44.50864671 -1366068835000,-123.36138473,44.50897868 -1366068837000,-123.36137849,44.50930426 -1366068839000,-123.36134047,44.50963618 -1366068841000,-123.36135915,44.50995462 -1366068843000,-123.36137026,44.51029629 -1366068845000,-123.3613762,44.5106353 -1366068847000,-123.36131503,44.51096782 -1366068849000,-123.36113466,44.51128083 -1366068851000,-123.36082954,44.51158389 -1366068853000,-123.36054524,44.51189159 -1366068855000,-123.36025421,44.51217325 -1366068857000,-123.36001114,44.51245718 -1366068859000,-123.35987299,44.51279487 -1366068861000,-123.35985717,44.51313432 -1366068863000,-123.3602277,44.5133997 -1366068865000,-123.36056287,44.51364922 -1366068867000,-123.36095109,44.51388464 -1366068869000,-123.36138379,44.5141023 -1366068871000,-123.3618181,44.51435051 -1366068873000,-123.36222187,44.51457467 -1366068875000,-123.36263918,44.51481453 -1366068877000,-123.36306052,44.51504774 -1366068879000,-123.36346434,44.51529273 -1366068881000,-123.36387324,44.5155298 -1366068883000,-123.36427573,44.51576239 -1366068885000,-123.36466981,44.51598443 -1366068887000,-123.36507139,44.51623301 -1366068889000,-123.36546163,44.5164847 -1366068891000,-123.36583731,44.51672113 -1366068893000,-123.36622329,44.51694135 -1366068895000,-123.36655692,44.51715792 -1366068897000,-123.36683566,44.51734066 -1366068900000,-123.36708619,44.51771857 -1366068902000,-123.36713373,44.51805205 -1366068904000,-123.36715191,44.51838168 -1366068906000,-123.36716909,44.51875543 -1366068908000,-123.36720218,44.51908413 -1366068910000,-123.36721678,44.51943734 -1366068912000,-123.36725533,44.51980132 -1366068914000,-123.36728599,44.52016355 -1366068916000,-123.36733928,44.52051227 -1366068918000,-123.36736583,44.5208765 -1366068920000,-123.36740184,44.52122961 -1366068922000,-123.36744832,44.52157524 -1366068924000,-123.36749248,44.52191219 -1366068926000,-123.36752064,44.52228549 -1366068928000,-123.367545,44.52263567 -1366068930000,-123.36758798,44.52299975 -1366068932000,-123.36762097,44.52337038 -1366068934000,-123.36765269,44.52370824 -1366068936000,-123.36771761,44.52407281 -1366068938000,-123.36777188,44.52443368 -1366068940000,-123.36786312,44.52480202 -1366068942000,-123.36795255,44.52515584 -1366068944000,-123.36805044,44.52550058 -1366068946000,-123.3681332,44.52585043 -1366068948000,-123.36824639,44.52621328 -1366068950000,-123.36836139,44.52659395 -1366068952000,-123.36848099,44.52697476 -1366068954000,-123.36858801,44.52734381 -1366068956000,-123.36868571,44.52768466 -1366068958000,-123.36876652,44.52804732 -1366068960000,-123.36887051,44.52839267 -1366068962000,-123.36888905,44.52872868 -1366068964000,-123.36886609,44.52904234 -1366068966000,-123.3687869,44.52931052 -1366068968000,-123.36864168,44.5295885 -1366068970000,-123.36850086,44.52987966 -1366068972000,-123.36835275,44.5301667 -1366068974000,-123.36821015,44.5304506 -1366068976000,-123.36813521,44.53074289 -1366068978000,-123.36809417,44.5310493 -1366068980000,-123.36808307,44.53135268 -1366068982000,-123.36807709,44.53166551 -1366068984000,-123.36806277,44.53196998 -1366068986000,-123.3680463,44.53227926 -1366068988000,-123.36803965,44.53259274 -1366068990000,-123.36804211,44.53291313 -1366068992000,-123.36801791,44.53322385 -1366068994000,-123.36799434,44.53352872 -1366068996000,-123.36798858,44.53383712 -1366068998000,-123.36796247,44.5341586 -1.366069e+12,-123.36795658,44.53448844 -1366069002000,-123.36795352,44.53482638 -1366069004000,-123.36793744,44.5351432 -1366069006000,-123.36793308,44.53543689 -1366069008000,-123.36794899,44.53572842 -1366069010000,-123.36794201,44.53604456 -1366069012000,-123.3679144,44.53635445 -1366069014000,-123.36789605,44.53665071 -1366069017000,-123.36789202,44.53706667 -1366069019000,-123.36790227,44.5373534 -1366069022000,-123.36791436,44.5377419 -1366069025000,-123.36792139,44.53806974 -1366069028000,-123.367915,44.5383973 -1366069032000,-123.36787962,44.53868981 -1366069059000,-123.3678659,44.5390235 -1366069063000,-123.3678325,44.53929856 -1366069067000,-123.36783567,44.53961652 -1366069072000,-123.36780379,44.5399079 -1366069077000,-123.36782765,44.54022154 -1366069081000,-123.3678069,44.54055044 -1366069084000,-123.36775867,44.54082702 -1366069088000,-123.36769652,44.5411808 -1366069092000,-123.36770418,44.54150015 -1366069096000,-123.36773166,44.54183987 -1366069101000,-123.36774199,44.54213937 -1366069108000,-123.3681235,44.54227766 -1366069112000,-123.36856158,44.5422959 -1366069117000,-123.36896913,44.54231307 -1366069126000,-123.36936627,44.5423194 -1366069130000,-123.36978548,44.54234806 -1366069134000,-123.37020903,44.54234748 -1366069138000,-123.37065816,44.54234615 -1366069142000,-123.37108325,44.54235983 -1366069147000,-123.37146003,44.54237851 -1366069151000,-123.37183894,44.54239259 -1366069154000,-123.37223681,44.54240624 -1366069157000,-123.37262286,44.54242518 -1366069160000,-123.37303438,44.5424402 -1366069164000,-123.37351583,44.54245531 -1366069172000,-123.37383987,44.54227731 -1366069175000,-123.37383196,44.54195434 -1366069178000,-123.37383654,44.5416236 -1366069184000,-123.37384348,44.5413155 -1366069188000,-123.37387057,44.54098763 -1366069191000,-123.37389542,44.54063022 -1366069197000,-123.37390416,44.54036024 -1366069203000,-123.37393021,44.54002603 -1366069206000,-123.37396232,44.53973402 -1366069209000,-123.37397401,44.53944478 -1366069217000,-123.37374496,44.53919767 -1366069220000,-123.37329827,44.53918978 -1366069223000,-123.37275801,44.53914873 -1366069225000,-123.37237788,44.53916578 -1366069228000,-123.37181974,44.53916483 -1366069231000,-123.37129244,44.53915226 -1366069234000,-123.37076351,44.53913647 -1366069237000,-123.37022045,44.53912019 -1366069240000,-123.36967466,44.53910229 -1366069243000,-123.36913869,44.5390945 -1366069246000,-123.36864067,44.53908554 -1366069251000,-123.36820487,44.53909592 -1366069264000,-123.36781846,44.53910652 -1366069268000,-123.36729566,44.539101 -1366069271000,-123.36681229,44.53908135 -1366069274000,-123.36633677,44.53907648 -1366069277000,-123.36586587,44.53909134 -1366069280000,-123.36543583,44.53918949 -1366069283000,-123.36507294,44.53938391 -1366069286000,-123.36484442,44.53965598 -1366069289000,-123.36453922,44.53989085 -1366069292000,-123.36407934,44.5400364 -1366069295000,-123.36354648,44.54002754 -1366069298000,-123.36299412,44.54000902 -1366069301000,-123.36244989,44.53999501 -1366069304000,-123.36192411,44.53996992 -1366069307000,-123.36140626,44.53996283 -1366069310000,-123.36089448,44.53995435 -1366069313000,-123.3604195,44.53995083 -1366069316000,-123.35993781,44.53993368 -1366069319000,-123.35945167,44.5399286 -1366069322000,-123.35896432,44.53992065 -1366069325000,-123.35844079,44.53991354 -1366069327000,-123.3580599,44.53991998 -1366069329000,-123.3576619,44.53994369 -1366069331000,-123.35726352,44.53997553 -1366069333000,-123.35683844,44.54001482 -1366069335000,-123.35641025,44.54007779 -1366069337000,-123.35601564,44.54013913 -1366069339000,-123.35559222,44.54020833 -1366069341000,-123.35516143,44.54027658 -1366069343000,-123.35472893,44.54036935 -1366069345000,-123.3542955,44.54044764 -1366069347000,-123.35387838,44.54052771 -1366069349000,-123.35345842,44.54060082 -1366069351000,-123.35302709,44.54067578 -1366069353000,-123.35260504,44.5407514 -1366069355000,-123.35216942,44.54082992 -1366069357000,-123.35174408,44.540909 -1366069359000,-123.35131936,44.54098493 -1366069361000,-123.35089852,44.54106325 -1366069363000,-123.35046616,44.54113647 -1366069365000,-123.35003257,44.541214 -1366069367000,-123.34959196,44.54129491 -1366069369000,-123.34914326,44.54136874 -1366069371000,-123.3486948,44.54145045 -1366069373000,-123.34825091,44.54153397 -1366069375000,-123.34780619,44.54161201 -1366069377000,-123.34737654,44.54169485 -1366069379000,-123.34693627,44.54177226 -1366069381000,-123.3465053,44.54184768 -1366069383000,-123.34605872,44.54193055 -1366069385000,-123.34560894,44.54200864 -1366069387000,-123.34515577,44.54207941 -1366069389000,-123.34469986,44.54215613 -1366069391000,-123.34425035,44.54223638 -1366069393000,-123.34379305,44.54232516 -1366069395000,-123.34332858,44.54241009 -1366069397000,-123.34286511,44.54248899 -1366069399000,-123.34240605,44.54258027 -1366069401000,-123.34191071,44.54265805 -1366069403000,-123.34144605,44.54273822 -1366069405000,-123.34097164,44.54281773 -1366069407000,-123.34049089,44.54291136 -1366069409000,-123.34001549,44.54299275 -1366069411000,-123.33954619,44.54306487 -1366069413000,-123.33907374,44.54313308 -1366069415000,-123.33862872,44.54320893 -1366069417000,-123.3381779,44.54329137 -1366069419000,-123.33772016,44.54337602 -1366069421000,-123.33727489,44.54344441 -1366069423000,-123.33682816,44.54350219 -1366069425000,-123.33638509,44.54358552 -1366069427000,-123.33593829,44.54367072 -1366069429000,-123.33546824,44.54376649 -1366069431000,-123.33497755,44.54385456 -1366069433000,-123.33448343,44.54396112 -1366069435000,-123.33397749,44.5440744 -1366069437000,-123.33345742,44.54420844 -1366069439000,-123.33292713,44.54436008 -1366069441000,-123.33239796,44.54451878 -1366069443000,-123.33186398,44.5446863 -1366069445000,-123.33134261,44.54485311 -1366069447000,-123.33082993,44.54504215 -1366069449000,-123.33032629,44.54519326 -1366069451000,-123.32982344,44.5453518 -1366069453000,-123.3293095,44.5454894 -1366069455000,-123.32881378,44.54564453 -1366069457000,-123.32829921,44.54578852 -1366069459000,-123.3277828,44.54594657 -1366069461000,-123.32727762,44.54610511 -1366069463000,-123.32676085,44.5462653 -1366069465000,-123.32627765,44.54643078 -1366069467000,-123.32576999,44.546576 -1366069469000,-123.32528599,44.54674234 -1366069471000,-123.32478965,44.54691086 -1366069473000,-123.32427832,44.54705935 -1366069475000,-123.32378277,44.54721833 -1366069477000,-123.32329791,44.54736043 -1366069479000,-123.32280469,44.54751419 -1366069481000,-123.32229631,44.54766825 -1366069483000,-123.32179702,44.54780808 -1366069485000,-123.32131495,44.54794972 -1366069487000,-123.32086643,44.54807246 -1366069489000,-123.32040346,44.54822164 -1366069491000,-123.31993765,44.54839123 -1366069493000,-123.31949408,44.54851594 -1366069495000,-123.31899274,44.548659 -1366069497000,-123.31853074,44.54880099 -1366069499000,-123.31804481,44.54893515 -1366069501000,-123.31758997,44.54910401 -1366069503000,-123.31710916,44.5492607 -1366069505000,-123.31663671,44.54940898 -1366069507000,-123.31611987,44.54955905 -1366069509000,-123.31563779,44.54970864 -1366069511000,-123.31515491,44.54985207 -1366069513000,-123.314689,44.54999476 -1366069515000,-123.31421445,44.55015187 -1366069517000,-123.31372962,44.5502831 -1366069519000,-123.31330758,44.55041177 -1366069521000,-123.31292017,44.55052758 -1366069524000,-123.31251354,44.55066436 -1366069585000,-123.31208603,44.55077669 -1366069588000,-123.31161638,44.55094352 -1366069590000,-123.3112482,44.55105947 -1366069592000,-123.31086419,44.55119654 -1366069594000,-123.31046132,44.5513475 -1366069596000,-123.31005278,44.55148959 -1366069598000,-123.30961361,44.55159178 -1366069600000,-123.30920571,44.55172635 -1366069602000,-123.30874104,44.55184633 -1366069604000,-123.30829359,44.55198769 -1366069606000,-123.30787319,44.5520999 -1366069608000,-123.3074458,44.5522332 -1366069610000,-123.30706032,44.55234182 -1366069612000,-123.30672195,44.55247608 -1366069614000,-123.30631133,44.55258632 -1366069616000,-123.30591744,44.55270406 -1366069618000,-123.30552757,44.55283411 -1366069620000,-123.3051465,44.55296585 -1366069622000,-123.30474396,44.55309861 -1366069624000,-123.30434769,44.55324569 -1366069626000,-123.30394705,44.55338725 -1366069628000,-123.30354834,44.55350028 -1366069630000,-123.30313005,44.55361894 -1366069632000,-123.30266868,44.55374065 -1366069634000,-123.30221645,44.55388066 -1366069636000,-123.30173418,44.55401417 -1366069638000,-123.30124558,44.55413817 -1366069640000,-123.30079325,44.55427585 -1366069642000,-123.30029551,44.55437196 -1366069644000,-123.2997996,44.55448399 -1366069646000,-123.29932269,44.55452997 -1366069648000,-123.29879777,44.55454446 -1366069650000,-123.29830041,44.55457205 -1366069652000,-123.29779975,44.55457596 -1366069654000,-123.29729846,44.55460096 -1366069656000,-123.29679836,44.55459604 -1366069658000,-123.29626802,44.55456638 -1366069660000,-123.29575394,44.55454353 -1366069662000,-123.2952318,44.55451849 -1366069664000,-123.29473383,44.55452178 -1366069666000,-123.29423418,44.55451254 -1366069668000,-123.29371862,44.55453089 -1366069670000,-123.29321517,44.55453169 -1366069672000,-123.29275561,44.55451971 -1366069674000,-123.29231079,44.55451182 -1366069676000,-123.29187739,44.55450104 -1366069678000,-123.29145284,44.55450805 -1366069680000,-123.29105513,44.55449366 -1366069683000,-123.29059146,44.55449023 -1366069687000,-123.29019322,44.55448379 -1366069692000,-123.28978738,44.55447773 -1366069696000,-123.28929609,44.55448625 -1366069699000,-123.28874549,44.55450926 -1366069701000,-123.28834391,44.55450056 -1366069703000,-123.28790724,44.55449707 -1366069705000,-123.28741355,44.55450849 -1366069707000,-123.28693096,44.5545087 -1366069709000,-123.28646726,44.55452037 -1366069711000,-123.2860079,44.5545304 -1366069713000,-123.28554007,44.5545346 -1366069715000,-123.28508315,44.55454316 -1366069717000,-123.28462741,44.55455558 -1366069719000,-123.28417334,44.5545515 -1366069721000,-123.28374206,44.55455117 -1366069723000,-123.28333752,44.55453237 -1366069726000,-123.28278619,44.55453389 -1366069729000,-123.28236548,44.55452196 -1366069733000,-123.28188959,44.55453161 -1366069737000,-123.28146483,44.55453568 -1366069740000,-123.28109348,44.55459914 -1366069743000,-123.28066717,44.55469201 -1366069746000,-123.28020148,44.5548682 -1366069749000,-123.27971168,44.55503849 -1366069751000,-123.2793803,44.55518461 -1366069754000,-123.27896031,44.55543667 -1366069756000,-123.27862816,44.55556901 -1366069759000,-123.27821949,44.55573975 -1366069762000,-123.27783296,44.55592006 -1366069765000,-123.27745719,44.55609727 -1366069768000,-123.27714064,44.55625404 -1366069772000,-123.2767167,44.55644134 -1366069775000,-123.27634067,44.55656543 -1366069778000,-123.27596722,44.55669426 -1366069781000,-123.27549069,44.55678284 -1366069784000,-123.27496926,44.55689358 -1366069786000,-123.27458313,44.5569124 -1366069788000,-123.27419125,44.55689802 -1366069790000,-123.27377744,44.5568866 -1366069792000,-123.2733415,44.55686836 -1366069794000,-123.27290315,44.55682259 -1366069796000,-123.27243825,44.55675093 -1366069798000,-123.2720012,44.55668193 -1366069800000,-123.27155253,44.55660638 -1366069802000,-123.27110968,44.55655408 -1366069804000,-123.27065104,44.55648773 -1366069806000,-123.27018728,44.55641826 -1366069808000,-123.26972832,44.55634392 -1366069810000,-123.26928058,44.55627108 -1366069811000,-123.26906268,44.55623613 -1366069812000,-123.26882152,44.55624357 -1366069813000,-123.26860188,44.55623933 -1366069814000,-123.26834039,44.55622165 -1366069815000,-123.26811121,44.5562004 -1366069816000,-123.26788139,44.55618992 -1366069817000,-123.26767505,44.55619525 -1366069818000,-123.26745099,44.55621678 -1366069819000,-123.26722733,44.55625385 -1366069820000,-123.26699088,44.5562802 -1366069821000,-123.26677956,44.55633282 -1366069822000,-123.26654448,44.55639357 -1366069823000,-123.26631436,44.55645412 -1366069824000,-123.26606874,44.55652551 -1366069825000,-123.26583708,44.55660041 -1366069826000,-123.26558672,44.55669278 -1366069827000,-123.26534835,44.55678462 -1366069828000,-123.26510338,44.55687513 -1366069829000,-123.26486778,44.55696448 -1366069830000,-123.26462215,44.55704933 -1366069831000,-123.26437856,44.55713732 -1366069832000,-123.26413268,44.55721805 -1366069833000,-123.26388708,44.55730522 -1366069834000,-123.26362142,44.55739124 -1366069836000,-123.26309051,44.55753223 -1366069838000,-123.26252542,44.55763486 -1366069840000,-123.26195273,44.55772093 -1366069842000,-123.26139849,44.55781796 -1366069844000,-123.26085362,44.55789672 -1366069846000,-123.26032307,44.55798129 -1366069848000,-123.25980237,44.55806619 -1366069850000,-123.25928996,44.55815663 -1366069851000,-123.25903973,44.55821426 -1366069852000,-123.2587808,44.55828566 -1366069853000,-123.2585309,44.55835269 -1366069854000,-123.25827879,44.55842939 -1366069855000,-123.25802216,44.55851736 -1366069856000,-123.25776741,44.55860888 -1366069857000,-123.2575384,44.55870622 -1366069858000,-123.25731551,44.55882039 -1366069859000,-123.25711364,44.55896099 -1366069860000,-123.25693392,44.55911406 -1366069861000,-123.2567741,44.55926982 -1366069862000,-123.25662538,44.55943741 -1366069863000,-123.25648197,44.55960931 -1366069864000,-123.25633859,44.55978067 -1366069865000,-123.25618547,44.55994987 -1366069866000,-123.25603755,44.56012754 -1366069867000,-123.25591114,44.56029996 -1366069868000,-123.25578258,44.56046913 -1366069869000,-123.25564317,44.56063656 -1366069870000,-123.25547978,44.56081952 -1366069871000,-123.25535444,44.56098902 -1366069872000,-123.2552067,44.56116703 -1366069873000,-123.25505769,44.56132321 -1366069874000,-123.25491742,44.56147616 -1366069875000,-123.2547614,44.56163734 -1366069876000,-123.25461235,44.56179536 -1366069877000,-123.25447106,44.56194753 -1366069878000,-123.25432341,44.56210449 -1366069879000,-123.25418716,44.56224661 -1366069880000,-123.25404152,44.56239059 -1366069881000,-123.25390358,44.56253388 -1366069882000,-123.25376721,44.56268813 -1366069883000,-123.25363454,44.56284177 -1366069884000,-123.25349972,44.56299846 -1366069885000,-123.25337634,44.56313844 -1366069886000,-123.25326474,44.56329604 -1366069887000,-123.25316373,44.56343593 -1366069888000,-123.25306593,44.56358197 -1366069889000,-123.25296928,44.56371839 -1366069890000,-123.25287633,44.56383955 -1366069891000,-123.2527811,44.56396021 -1366069892000,-123.2527006,44.56409962 -1366069894000,-123.25251666,44.5642821 -1366069895000,-123.252464,44.56436555 -1366069898000,-123.2523231,44.56453533 -1366069915000,-123.25225519,44.5645614 -1366069929000,-123.25228097,44.56463903 -1366069931000,-123.2524103,44.56476912 -1366069933000,-123.25265286,44.56484287 -1366069934000,-123.25280326,44.5648831 -1366069936000,-123.253176,44.56495496 -1366069938000,-123.25360282,44.56504142 -1366069940000,-123.25401679,44.56515583 -1366069942000,-123.25443631,44.56532004 -1366069944000,-123.25480816,44.56548473 -1366069946000,-123.25519484,44.56566755 -1366069948000,-123.25551553,44.56583166 -1366069951000,-123.25596529,44.56603905 -1366069954000,-123.25639336,44.56622896 -1366069955000,-123.25652885,44.56629939 -1366069957000,-123.25678678,44.56643649 -1366069958000,-123.2569142,44.56649582 -1366069960000,-123.25715173,44.56660402 -1366069961000,-123.25726289,44.566648 -1366069964000,-123.25752143,44.56675673 -1366069966000,-123.25760653,44.56680001 -1366069971000,-123.25767378,44.56679999 -1366069980000,-123.25787237,44.56687549 -1366069983000,-123.25801719,44.56693186 -1366069986000,-123.25822182,44.56700321 -1366069988000,-123.25837141,44.56703318 -1366069991000,-123.25860196,44.56707244 -1366069993000,-123.25878758,44.56710355 -1366069994000,-123.25887093,44.56712097 -1366069996000,-123.25904221,44.56717036 -1366069998000,-123.25922649,44.56721374 -1.36607e+12,-123.25940227,44.56725654 -1366070002000,-123.25958777,44.56731148 -1366070004000,-123.25976646,44.56736335 -1366070007000,-123.26003077,44.56743253 -1366070008000,-123.26012839,44.56745472 -1366070011000,-123.26038022,44.56751068 -1366070014000,-123.26055354,44.56742884 -1366070016000,-123.26063004,44.56728882 -1366070018000,-123.26068524,44.56711308 -1366070020000,-123.26074998,44.56695316 -1366070022000,-123.2608089,44.56678942 -1366070024000,-123.26089009,44.56659957 -1366070025000,-123.26093937,44.56650242 -1366070027000,-123.26102979,44.56631785 -1366070028000,-123.26107432,44.56621301 -1366070030000,-123.26117094,44.56601462 -1366070031000,-123.26120647,44.5659277 -1366070033000,-123.26127949,44.56572113 -1366070034000,-123.26134965,44.565611 -1366070035000,-123.26140875,44.56550587 -1366070037000,-123.26153761,44.56528539 -1366070038000,-123.2615853,44.56518097 -1366070040000,-123.26170963,44.56499887 -1366070041000,-123.26177122,44.56490562 -1366070043000,-123.26189227,44.56471824 -1366070044000,-123.26193688,44.56462046 -1366070046000,-123.26203489,44.56443367 -1366070047000,-123.2620959,44.56432723 -1366070049000,-123.26224802,44.56409988 -1366070050000,-123.26222823,44.56401989 -1366070051000,-123.26222969,44.56394001 -1366070053000,-123.26235411,44.56373793 -1366070054000,-123.26240754,44.56363945 -1366070057000,-123.26253763,44.56341107 -1366070058000,-123.26260672,44.5633341 -1366070060000,-123.26270288,44.56315453 -1366070061000,-123.26274507,44.56306436 -1366070064000,-123.26287169,44.56281372 -1366070065000,-123.26293765,44.56273657 -1366070067000,-123.2630292,44.56252632 -1366070068000,-123.26310572,44.56240685 -1366070070000,-123.26322777,44.56217996 -1366070071000,-123.26326892,44.56206816 -1366070073000,-123.26338999,44.56184057 -1366070074000,-123.26344102,44.56173574 -1366070076000,-123.2635509,44.56152058 -1366070079000,-123.26372206,44.56116824 -1366070082000,-123.26387451,44.56086544 -1366070085000,-123.26401468,44.56056363 -1366070088000,-123.26418536,44.56026245 -1366070091000,-123.26433945,44.55997664 -1366070092000,-123.2643915,44.55987913 -1366070094000,-123.26446575,44.55970194 -1366070095000,-123.26451613,44.55958902 -1366070097000,-123.26459456,44.55937425 -1366070098000,-123.26461077,44.55926399 -1366070100000,-123.26473225,44.55909383 -1366070101000,-123.26478695,44.55898226 -1366070103000,-123.26492466,44.5587611 -1366070104000,-123.26497928,44.55865923 -1366070106000,-123.26509293,44.55842729 -1366070107000,-123.26514855,44.55831671 -1366070109000,-123.26525712,44.55809135 -1366070110000,-123.26531496,44.55798363 -1366070112000,-123.26543232,44.55779935 -1366070113000,-123.26549013,44.55770322 -1366070115000,-123.26558955,44.55749812 -1366070116000,-123.26565084,44.55737409 -1366070118000,-123.26575958,44.55717786 -1366070119000,-123.26581655,44.55705329 -1366070120000,-123.26585019,44.55690699 -1366070122000,-123.26593923,44.55666239 -1366070123000,-123.26597135,44.55657634 -1366070125000,-123.2659601,44.55632352 -1366070126000,-123.26592714,44.5561932 -1366070128000,-123.26582439,44.55597695 -1366070129000,-123.26572437,44.55584709 -1366070130000,-123.26563835,44.55571634 -1366070132000,-123.26541291,44.55553334 -1366070135000,-123.26510286,44.55524448 -1366070138000,-123.26490101,44.55490589 -1366070141000,-123.26489186,44.55455867 -1366070144000,-123.26493487,44.55421581 -1366070147000,-123.26497802,44.55394571 -1366070151000,-123.26498909,44.55366594 -1366070155000,-123.26505023,44.55331664 -1366070156000,-123.2650603,44.55321268 -1366070158000,-123.26509157,44.55301434 -1366070159000,-123.26510354,44.55290039 -1366070161000,-123.26512899,44.55267696 -1366070162000,-123.26515485,44.55256558 -1366070164000,-123.26518503,44.55234615 -1366070165000,-123.26518099,44.55223245 -1366070167000,-123.26519534,44.55199671 -1366070168000,-123.26520451,44.55187375 -1366070170000,-123.2652246,44.55161241 -1366070171000,-123.2652252,44.55150293 -1366070172000,-123.26522555,44.55136002 -1366070173000,-123.26523907,44.55123375 -1366070174000,-123.26525674,44.55109084 -1366070175000,-123.26527545,44.5509604 -1366070177000,-123.26531051,44.55068985 -1366070180000,-123.26534583,44.55030138 -1366070183000,-123.26537778,44.55000365 -1366070188000,-123.26497946,44.5498342 -1366070192000,-123.26450003,44.54982978 -1366070195000,-123.26414419,44.54980376 diff --git a/inst/examples/playback/drive.json b/inst/examples/playback/drive.json deleted file mode 100644 index d89dd107..00000000 --- a/inst/examples/playback/drive.json +++ /dev/null @@ -1,12501 +0,0 @@ -{ - "type": "Feature", - "geometry": { - "type": "MultiPoint", - "coordinates": [ - [ - -123.2653968, - 44.54962188 - ], - [ - -123.26542599, - 44.54951009 - ], - [ - -123.26547225, - 44.5492899 - ], - [ - -123.26549654, - 44.54917343 - ], - [ - -123.26554281, - 44.54891614 - ], - [ - -123.26556555, - 44.54878695 - ], - [ - -123.26560808, - 44.54851984 - ], - [ - -123.26561995, - 44.54839196 - ], - [ - -123.26565215, - 44.54800062 - ], - [ - -123.26569247, - 44.54760721 - ], - [ - -123.26574792, - 44.54722007 - ], - [ - -123.26578896, - 44.54682917 - ], - [ - -123.26582461, - 44.54645322 - ], - [ - -123.26586197, - 44.54609782 - ], - [ - -123.26589666, - 44.54579504 - ], - [ - -123.26590807, - 44.54571401 - ], - [ - -123.26593057, - 44.54549186 - ], - [ - -123.26594982, - 44.54541613 - ], - [ - -123.26595491, - 44.54535095 - ], - [ - -123.26597049, - 44.54518109 - ], - [ - -123.26599333, - 44.54501792 - ], - [ - -123.26600236, - 44.54483693 - ], - [ - -123.26601534, - 44.54473309 - ], - [ - -123.26605076, - 44.54453012 - ], - [ - -123.26608525, - 44.54419806 - ], - [ - -123.26611214, - 44.54385608 - ], - [ - -123.26614375, - 44.54348167 - ], - [ - -123.26618797, - 44.5431001 - ], - [ - -123.26622983, - 44.54272769 - ], - [ - -123.26626606, - 44.5423464 - ], - [ - -123.26628574, - 44.5420917 - ], - [ - -123.26630186, - 44.54196771 - ], - [ - -123.26632618, - 44.54170957 - ], - [ - -123.26634178, - 44.54157733 - ], - [ - -123.26635716, - 44.54131612 - ], - [ - -123.26637671, - 44.54118596 - ], - [ - -123.26640047, - 44.54091701 - ], - [ - -123.26641868, - 44.54077296 - ], - [ - -123.26643736, - 44.54063844 - ], - [ - -123.26644412, - 44.54049204 - ], - [ - -123.26646509, - 44.5403517 - ], - [ - -123.26647582, - 44.5402058 - ], - [ - -123.26649113, - 44.54005965 - ], - [ - -123.26650648, - 44.53991332 - ], - [ - -123.26651714, - 44.53976474 - ], - [ - -123.26653307, - 44.53960766 - ], - [ - -123.26655086, - 44.53946206 - ], - [ - -123.26658852, - 44.53930491 - ], - [ - -123.26659857, - 44.53917055 - ], - [ - -123.26659745, - 44.53902043 - ], - [ - -123.26664917, - 44.5387342 - ], - [ - -123.26668718, - 44.53843455 - ], - [ - -123.26672678, - 44.53814207 - ], - [ - -123.26675634, - 44.5378427 - ], - [ - -123.26679634, - 44.53754431 - ], - [ - -123.26682742, - 44.53724028 - ], - [ - -123.26685448, - 44.53693909 - ], - [ - -123.26688895, - 44.53665138 - ], - [ - -123.26692022, - 44.53634566 - ], - [ - -123.26695427, - 44.53604737 - ], - [ - -123.26696551, - 44.53590054 - ], - [ - -123.26698494, - 44.53574854 - ], - [ - -123.2670017, - 44.53559873 - ], - [ - -123.26701926, - 44.53544296 - ], - [ - -123.26703523, - 44.53529422 - ], - [ - -123.26704312, - 44.53514364 - ], - [ - -123.2670586, - 44.53499597 - ], - [ - -123.26707128, - 44.53484068 - ], - [ - -123.2670988, - 44.53468398 - ], - [ - -123.26711722, - 44.53452707 - ], - [ - -123.2671344, - 44.53438066 - ], - [ - -123.26714814, - 44.53422102 - ], - [ - -123.26715766, - 44.5340727 - ], - [ - -123.26717965, - 44.53391346 - ], - [ - -123.26719659, - 44.53377891 - ], - [ - -123.26721917, - 44.5336297 - ], - [ - -123.26723907, - 44.53347759 - ], - [ - -123.2672618, - 44.53332867 - ], - [ - -123.2673157, - 44.53303079 - ], - [ - -123.26735503, - 44.5327368 - ], - [ - -123.26738147, - 44.5324391 - ], - [ - -123.2674151, - 44.5321552 - ], - [ - -123.26743853, - 44.53187826 - ], - [ - -123.26744424, - 44.53160656 - ], - [ - -123.26746326, - 44.53122664 - ], - [ - -123.2675081, - 44.53083601 - ], - [ - -123.26754157, - 44.53056117 - ], - [ - -123.26757076, - 44.5302729 - ], - [ - -123.26761011, - 44.52999344 - ], - [ - -123.26765207, - 44.52970039 - ], - [ - -123.26770791, - 44.52941153 - ], - [ - -123.26776413, - 44.5291118 - ], - [ - -123.26779326, - 44.52881322 - ], - [ - -123.26781256, - 44.52852564 - ], - [ - -123.26783905, - 44.52821506 - ], - [ - -123.26785862, - 44.52792227 - ], - [ - -123.26787421, - 44.52763006 - ], - [ - -123.26791075, - 44.52732672 - ], - [ - -123.26793951, - 44.52700113 - ], - [ - -123.26798464, - 44.52664881 - ], - [ - -123.26800356, - 44.5263178 - ], - [ - -123.26803836, - 44.52599413 - ], - [ - -123.26806183, - 44.52570957 - ], - [ - -123.26812024, - 44.52538351 - ], - [ - -123.2681914, - 44.52492832 - ], - [ - -123.26820723, - 44.52458001 - ], - [ - -123.2682692, - 44.52418099 - ], - [ - -123.26831116, - 44.52378889 - ], - [ - -123.26832363, - 44.52343379 - ], - [ - -123.26837467, - 44.52315362 - ], - [ - -123.26843893, - 44.52270056 - ], - [ - -123.26846951, - 44.52228757 - ], - [ - -123.26850322, - 44.52184872 - ], - [ - -123.2685453, - 44.52146518 - ], - [ - -123.2686059, - 44.52103568 - ], - [ - -123.26865746, - 44.52064332 - ], - [ - -123.26868859, - 44.52021735 - ], - [ - -123.26873203, - 44.51982596 - ], - [ - -123.26879159, - 44.5194292 - ], - [ - -123.26882603, - 44.51901272 - ], - [ - -123.26885234, - 44.51861022 - ], - [ - -123.26890242, - 44.51819673 - ], - [ - -123.26893149, - 44.51780045 - ], - [ - -123.26897624, - 44.51740318 - ], - [ - -123.26902805, - 44.51699623 - ], - [ - -123.26905345, - 44.51663066 - ], - [ - -123.26907845, - 44.51621528 - ], - [ - -123.26911866, - 44.51580423 - ], - [ - -123.26916501, - 44.51542341 - ], - [ - -123.26918917, - 44.51506471 - ], - [ - -123.26924094, - 44.51466664 - ], - [ - -123.26925848, - 44.51429637 - ], - [ - -123.26928051, - 44.51389784 - ], - [ - -123.26930765, - 44.51354382 - ], - [ - -123.26935049, - 44.51318392 - ], - [ - -123.26941652, - 44.51282517 - ], - [ - -123.26941863, - 44.51248692 - ], - [ - -123.26946991, - 44.51213166 - ], - [ - -123.26948735, - 44.51178657 - ], - [ - -123.26954343, - 44.51145848 - ], - [ - -123.26955927, - 44.51107967 - ], - [ - -123.26962467, - 44.5107418 - ], - [ - -123.26963966, - 44.51041988 - ], - [ - -123.2696979, - 44.51005794 - ], - [ - -123.26971385, - 44.50963898 - ], - [ - -123.2698249, - 44.509232 - ], - [ - -123.26982347, - 44.50880905 - ], - [ - -123.26987846, - 44.5084522 - ], - [ - -123.26996621, - 44.5081139 - ], - [ - -123.2702128, - 44.50787621 - ], - [ - -123.27066785, - 44.50785883 - ], - [ - -123.27111612, - 44.50786233 - ], - [ - -123.27151837, - 44.50787287 - ], - [ - -123.27191676, - 44.50788428 - ], - [ - -123.27239609, - 44.50795795 - ], - [ - -123.27284665, - 44.50795282 - ], - [ - -123.27333535, - 44.50792506 - ], - [ - -123.27379419, - 44.50793612 - ], - [ - -123.27425046, - 44.50795839 - ], - [ - -123.27467651, - 44.50799484 - ], - [ - -123.27514714, - 44.50795784 - ], - [ - -123.27568029, - 44.50797874 - ], - [ - -123.27606637, - 44.50798024 - ], - [ - -123.27650904, - 44.50797213 - ], - [ - -123.27693933, - 44.50795682 - ], - [ - -123.27732384, - 44.50798106 - ], - [ - -123.27775075, - 44.5079768 - ], - [ - -123.27822692, - 44.50799683 - ], - [ - -123.27869918, - 44.50800772 - ], - [ - -123.27920957, - 44.50800499 - ], - [ - -123.2796613, - 44.50800863 - ], - [ - -123.28016149, - 44.5080131 - ], - [ - -123.28049185, - 44.50801404 - ], - [ - -123.28066214, - 44.50800893 - ], - [ - -123.28099296, - 44.50800161 - ], - [ - -123.28118327, - 44.50800626 - ], - [ - -123.28137336, - 44.50801754 - ], - [ - -123.28156537, - 44.50799738 - ], - [ - -123.28193886, - 44.50799524 - ], - [ - -123.28211191, - 44.50800172 - ], - [ - -123.2824819, - 44.50802556 - ], - [ - -123.28266014, - 44.5080181 - ], - [ - -123.2830382, - 44.5080026 - ], - [ - -123.28342182, - 44.50801892 - ], - [ - -123.28387671, - 44.50800218 - ], - [ - -123.28416867, - 44.5080047 - ], - [ - -123.28431939, - 44.5079849 - ], - [ - -123.28458112, - 44.5079823 - ], - [ - -123.28472501, - 44.50797998 - ], - [ - -123.28500986, - 44.50801972 - ], - [ - -123.28512373, - 44.50806444 - ], - [ - -123.28529569, - 44.50779383 - ], - [ - -123.28530725, - 44.50750753 - ], - [ - -123.28530177, - 44.50718423 - ], - [ - -123.28530171, - 44.50685807 - ], - [ - -123.28530446, - 44.50655372 - ], - [ - -123.28530304, - 44.50626772 - ], - [ - -123.28530356, - 44.50598914 - ], - [ - -123.28530931, - 44.50569692 - ], - [ - -123.28531482, - 44.50539092 - ], - [ - -123.285322, - 44.50507938 - ], - [ - -123.28531355, - 44.50479598 - ], - [ - -123.28520154, - 44.50452862 - ], - [ - -123.28501689, - 44.50424677 - ], - [ - -123.28494625, - 44.50395744 - ], - [ - -123.28499372, - 44.50427312 - ], - [ - -123.28518952, - 44.50457574 - ], - [ - -123.28528259, - 44.50484167 - ], - [ - -123.28528126, - 44.50515073 - ], - [ - -123.28527731, - 44.50546418 - ], - [ - -123.28528704, - 44.5057864 - ], - [ - -123.28529865, - 44.50610547 - ], - [ - -123.28529908, - 44.50641184 - ], - [ - -123.28529543, - 44.50672686 - ], - [ - -123.28529251, - 44.50704394 - ], - [ - -123.28529733, - 44.50735341 - ], - [ - -123.28530224, - 44.50763654 - ], - [ - -123.28529372, - 44.50792583 - ], - [ - -123.28571883, - 44.50799392 - ], - [ - -123.28619153, - 44.50799372 - ], - [ - -123.28671596, - 44.50800565 - ], - [ - -123.28725073, - 44.50803753 - ], - [ - -123.28779291, - 44.50810782 - ], - [ - -123.28815997, - 44.50817088 - ], - [ - -123.28869594, - 44.50828794 - ], - [ - -123.2890606, - 44.50838101 - ], - [ - -123.28942683, - 44.50848273 - ], - [ - -123.28980364, - 44.508587 - ], - [ - -123.29019785, - 44.50869271 - ], - [ - -123.29060222, - 44.50878614 - ], - [ - -123.29102174, - 44.50886056 - ], - [ - -123.29145467, - 44.50893041 - ], - [ - -123.29190466, - 44.50898019 - ], - [ - -123.29235872, - 44.50900369 - ], - [ - -123.29283125, - 44.50901495 - ], - [ - -123.29330116, - 44.50901782 - ], - [ - -123.29376741, - 44.50901577 - ], - [ - -123.29422506, - 44.50901686 - ], - [ - -123.29467811, - 44.50901543 - ], - [ - -123.29513127, - 44.50901405 - ], - [ - -123.29557586, - 44.50901132 - ], - [ - -123.29601195, - 44.50900795 - ], - [ - -123.29645616, - 44.50900589 - ], - [ - -123.29690921, - 44.50900717 - ], - [ - -123.29737067, - 44.50900886 - ], - [ - -123.29784447, - 44.50900357 - ], - [ - -123.29832146, - 44.50899047 - ], - [ - -123.29879689, - 44.50895556 - ], - [ - -123.2992733, - 44.50890909 - ], - [ - -123.29974848, - 44.50884388 - ], - [ - -123.30021398, - 44.50876641 - ], - [ - -123.30067448, - 44.50867722 - ], - [ - -123.30113502, - 44.50857236 - ], - [ - -123.30159638, - 44.50844595 - ], - [ - -123.30207027, - 44.50830474 - ], - [ - -123.30258178, - 44.50813572 - ], - [ - -123.30314826, - 44.50791338 - ], - [ - -123.30374973, - 44.50764059 - ], - [ - -123.30431989, - 44.50735051 - ], - [ - -123.3048464, - 44.50705293 - ], - [ - -123.3053446, - 44.50676578 - ], - [ - -123.30581399, - 44.50650216 - ], - [ - -123.30625349, - 44.50625199 - ], - [ - -123.3066683, - 44.50601322 - ], - [ - -123.30706462, - 44.50578766 - ], - [ - -123.30744426, - 44.50557189 - ], - [ - -123.30780813, - 44.5053674 - ], - [ - -123.30814439, - 44.50517248 - ], - [ - -123.30846886, - 44.50498766 - ], - [ - -123.30877833, - 44.50480672 - ], - [ - -123.30908201, - 44.50463343 - ], - [ - -123.30939297, - 44.5044621 - ], - [ - -123.30970771, - 44.50428902 - ], - [ - -123.31001686, - 44.50411527 - ], - [ - -123.31032783, - 44.50393777 - ], - [ - -123.31063161, - 44.50376996 - ], - [ - -123.3109379, - 44.50360237 - ], - [ - -123.31138001, - 44.50334752 - ], - [ - -123.31168026, - 44.50318089 - ], - [ - -123.31204477, - 44.5028814 - ], - [ - -123.31215185, - 44.50250446 - ], - [ - -123.31215146, - 44.5021014 - ], - [ - -123.31214819, - 44.5018284 - ], - [ - -123.31214332, - 44.50154676 - ], - [ - -123.31214426, - 44.50124999 - ], - [ - -123.31213876, - 44.50093959 - ], - [ - -123.31213674, - 44.50062181 - ], - [ - -123.31213737, - 44.50029874 - ], - [ - -123.31212527, - 44.4999698 - ], - [ - -123.31211571, - 44.49963635 - ], - [ - -123.31211154, - 44.49928813 - ], - [ - -123.31210138, - 44.49892656 - ], - [ - -123.3121009, - 44.49856209 - ], - [ - -123.31209062, - 44.49820845 - ], - [ - -123.3120978, - 44.49790229 - ], - [ - -123.31227708, - 44.49763439 - ], - [ - -123.31271828, - 44.49761876 - ], - [ - -123.31329055, - 44.49763228 - ], - [ - -123.31370836, - 44.49763354 - ], - [ - -123.31414802, - 44.49763152 - ], - [ - -123.31460255, - 44.49763276 - ], - [ - -123.31505997, - 44.49763691 - ], - [ - -123.31551041, - 44.49763387 - ], - [ - -123.31596262, - 44.4976387 - ], - [ - -123.31641481, - 44.49763617 - ], - [ - -123.31687521, - 44.49763613 - ], - [ - -123.317332, - 44.497639 - ], - [ - -123.31776963, - 44.49763913 - ], - [ - -123.31818072, - 44.49764186 - ], - [ - -123.31856868, - 44.49764653 - ], - [ - -123.31910669, - 44.49763959 - ], - [ - -123.3195997, - 44.49764157 - ], - [ - -123.32005304, - 44.49764547 - ], - [ - -123.32047802, - 44.49764202 - ], - [ - -123.32089381, - 44.49763714 - ], - [ - -123.32128756, - 44.49762738 - ], - [ - -123.32169112, - 44.49760524 - ], - [ - -123.3221114, - 44.49758589 - ], - [ - -123.3226689, - 44.49756664 - ], - [ - -123.32309521, - 44.49755962 - ], - [ - -123.32353485, - 44.49755634 - ], - [ - -123.32397764, - 44.49755262 - ], - [ - -123.32442471, - 44.49754913 - ], - [ - -123.32487623, - 44.49754206 - ], - [ - -123.32531351, - 44.49753548 - ], - [ - -123.32575193, - 44.49753054 - ], - [ - -123.32619663, - 44.49753003 - ], - [ - -123.32664525, - 44.4975254 - ], - [ - -123.3271001, - 44.49751906 - ], - [ - -123.3275348, - 44.49752422 - ], - [ - -123.32797699, - 44.49752104 - ], - [ - -123.32842304, - 44.49751434 - ], - [ - -123.32887203, - 44.49748892 - ], - [ - -123.32933116, - 44.49742425 - ], - [ - -123.32977924, - 44.49731612 - ], - [ - -123.33021721, - 44.49717428 - ], - [ - -123.33062848, - 44.49700012 - ], - [ - -123.33101865, - 44.4968053 - ], - [ - -123.33141499, - 44.49659677 - ], - [ - -123.33180075, - 44.4964111 - ], - [ - -123.33219052, - 44.49624923 - ], - [ - -123.33257305, - 44.4961206 - ], - [ - -123.33294266, - 44.49602226 - ], - [ - -123.33333085, - 44.4959356 - ], - [ - -123.33370122, - 44.4958669 - ], - [ - -123.33409591, - 44.49581221 - ], - [ - -123.33452815, - 44.49576429 - ], - [ - -123.33498141, - 44.4957507 - ], - [ - -123.33541251, - 44.4957569 - ], - [ - -123.33582136, - 44.49574457 - ], - [ - -123.33621712, - 44.49574622 - ], - [ - -123.33676391, - 44.4957477 - ], - [ - -123.33725207, - 44.49574924 - ], - [ - -123.33764413, - 44.49576678 - ], - [ - -123.33805979, - 44.49575292 - ], - [ - -123.33863756, - 44.4957575 - ], - [ - -123.33911555, - 44.49578052 - ], - [ - -123.33962167, - 44.49575904 - ], - [ - -123.34015956, - 44.49575155 - ], - [ - -123.34073445, - 44.49575321 - ], - [ - -123.34131071, - 44.49574274 - ], - [ - -123.34188434, - 44.49573333 - ], - [ - -123.3424513, - 44.49572908 - ], - [ - -123.34301271, - 44.49573156 - ], - [ - -123.34357879, - 44.49573283 - ], - [ - -123.34414026, - 44.49573511 - ], - [ - -123.34471566, - 44.49572633 - ], - [ - -123.34529801, - 44.49572321 - ], - [ - -123.3458739, - 44.49572308 - ], - [ - -123.34644873, - 44.49572121 - ], - [ - -123.34701798, - 44.49572132 - ], - [ - -123.34757897, - 44.49572099 - ], - [ - -123.3481284, - 44.49572455 - ], - [ - -123.34867619, - 44.49572373 - ], - [ - -123.34921667, - 44.495722 - ], - [ - -123.34976011, - 44.49572271 - ], - [ - -123.35030473, - 44.49571927 - ], - [ - -123.35085844, - 44.49572216 - ], - [ - -123.35140944, - 44.49572321 - ], - [ - -123.35195816, - 44.4957255 - ], - [ - -123.35250524, - 44.49572224 - ], - [ - -123.35304311, - 44.49572095 - ], - [ - -123.35358401, - 44.49572192 - ], - [ - -123.35411605, - 44.49572092 - ], - [ - -123.35465388, - 44.49572139 - ], - [ - -123.35517871, - 44.49571705 - ], - [ - -123.35569378, - 44.49571897 - ], - [ - -123.35620354, - 44.4957182 - ], - [ - -123.35670346, - 44.4957207 - ], - [ - -123.35721153, - 44.49572872 - ], - [ - -123.35771327, - 44.495729 - ], - [ - -123.35822118, - 44.49572683 - ], - [ - -123.35873183, - 44.49572629 - ], - [ - -123.3592373, - 44.49572602 - ], - [ - -123.35973822, - 44.4957229 - ], - [ - -123.36019001, - 44.49572018 - ], - [ - -123.36057744, - 44.49572112 - ], - [ - -123.36109169, - 44.49571671 - ], - [ - -123.3614977, - 44.49571878 - ], - [ - -123.36188257, - 44.49572292 - ], - [ - -123.36244944, - 44.49572569 - ], - [ - -123.36288064, - 44.49572518 - ], - [ - -123.36334922, - 44.49572734 - ], - [ - -123.36384239, - 44.49572813 - ], - [ - -123.36433142, - 44.49572044 - ], - [ - -123.36480915, - 44.49571815 - ], - [ - -123.36527872, - 44.49572398 - ], - [ - -123.36573597, - 44.49572349 - ], - [ - -123.36618142, - 44.49571841 - ], - [ - -123.36661011, - 44.49571124 - ], - [ - -123.36702607, - 44.49569437 - ], - [ - -123.36743512, - 44.49570439 - ], - [ - -123.36783667, - 44.49570197 - ], - [ - -123.36835498, - 44.49570285 - ], - [ - -123.36890494, - 44.49569931 - ], - [ - -123.36931482, - 44.49570853 - ], - [ - -123.36974171, - 44.49572515 - ], - [ - -123.37013903, - 44.49571648 - ], - [ - -123.37063985, - 44.49573908 - ], - [ - -123.37101526, - 44.49577574 - ], - [ - -123.3710185, - 44.49544655 - ], - [ - -123.37103316, - 44.49516986 - ], - [ - -123.3709993, - 44.49484082 - ], - [ - -123.37099383, - 44.49449754 - ], - [ - -123.37099542, - 44.49413804 - ], - [ - -123.37098679, - 44.4938664 - ], - [ - -123.37099046, - 44.49353589 - ], - [ - -123.37097095, - 44.49322152 - ], - [ - -123.37116214, - 44.49298166 - ], - [ - -123.37160774, - 44.49295892 - ], - [ - -123.37203894, - 44.49295105 - ], - [ - -123.37244048, - 44.49292254 - ], - [ - -123.37290311, - 44.49292573 - ], - [ - -123.37334816, - 44.4929285 - ], - [ - -123.37379852, - 44.49293191 - ], - [ - -123.37424863, - 44.49296014 - ], - [ - -123.37472623, - 44.49300199 - ], - [ - -123.37510456, - 44.49296198 - ], - [ - -123.37552123, - 44.49283076 - ], - [ - -123.37578818, - 44.49258255 - ], - [ - -123.37591054, - 44.4922701 - ], - [ - -123.37614176, - 44.4920108 - ], - [ - -123.37660209, - 44.49189583 - ], - [ - -123.37698359, - 44.49187534 - ], - [ - -123.37748763, - 44.49187822 - ], - [ - -123.37796098, - 44.49188959 - ], - [ - -123.37851541, - 44.49187377 - ], - [ - -123.37892967, - 44.49186476 - ], - [ - -123.3794427, - 44.49187612 - ], - [ - -123.37992227, - 44.49186635 - ], - [ - -123.38032558, - 44.49185687 - ], - [ - -123.3807286, - 44.49170288 - ], - [ - -123.38071413, - 44.4913837 - ], - [ - -123.38067552, - 44.49099647 - ], - [ - -123.38068004, - 44.49057532 - ], - [ - -123.3806493, - 44.49018127 - ], - [ - -123.38065822, - 44.48978056 - ], - [ - -123.38063541, - 44.48950783 - ], - [ - -123.38066589, - 44.48923621 - ], - [ - -123.38065938, - 44.48896584 - ], - [ - -123.38074567, - 44.48857419 - ], - [ - -123.38086819, - 44.48820204 - ], - [ - -123.38093831, - 44.48788967 - ], - [ - -123.38105901, - 44.48758823 - ], - [ - -123.38116212, - 44.48728151 - ], - [ - -123.38124239, - 44.48695183 - ], - [ - -123.38132536, - 44.48668034 - ], - [ - -123.38137825, - 44.48634231 - ], - [ - -123.38146762, - 44.48605455 - ], - [ - -123.38155653, - 44.48576059 - ], - [ - -123.38162581, - 44.48542873 - ], - [ - -123.38174604, - 44.4851108 - ], - [ - -123.38179848, - 44.48482234 - ], - [ - -123.38186574, - 44.48451146 - ], - [ - -123.38189214, - 44.48421064 - ], - [ - -123.38188059, - 44.48393254 - ], - [ - -123.38190531, - 44.48365592 - ], - [ - -123.38188653, - 44.48337571 - ], - [ - -123.38187748, - 44.4830756 - ], - [ - -123.38187203, - 44.48277833 - ], - [ - -123.38186665, - 44.48249643 - ], - [ - -123.38184614, - 44.48219587 - ], - [ - -123.3818615, - 44.48182025 - ], - [ - -123.38182644, - 44.48145469 - ], - [ - -123.38179821, - 44.48113415 - ], - [ - -123.3818075, - 44.48081927 - ], - [ - -123.38181516, - 44.48046998 - ], - [ - -123.38182969, - 44.48018133 - ], - [ - -123.38142443, - 44.48010872 - ], - [ - -123.38095613, - 44.48013091 - ], - [ - -123.38050773, - 44.4800933 - ], - [ - -123.3801133, - 44.47991334 - ], - [ - -123.37989449, - 44.47966455 - ], - [ - -123.37964877, - 44.47934839 - ], - [ - -123.37947065, - 44.4790258 - ], - [ - -123.37929382, - 44.47871623 - ], - [ - -123.37915566, - 44.47841566 - ], - [ - -123.37904746, - 44.47807761 - ], - [ - -123.37893591, - 44.47775348 - ], - [ - -123.37881261, - 44.47742721 - ], - [ - -123.37867368, - 44.47710493 - ], - [ - -123.37853705, - 44.47679302 - ], - [ - -123.37838013, - 44.47649308 - ], - [ - -123.3781639, - 44.47621945 - ], - [ - -123.37777489, - 44.47614938 - ], - [ - -123.3772856, - 44.47615972 - ], - [ - -123.37683285, - 44.47616998 - ], - [ - -123.37645129, - 44.47609842 - ], - [ - -123.37629116, - 44.47577513 - ], - [ - -123.37627985, - 44.47542872 - ], - [ - -123.37628547, - 44.47504225 - ], - [ - -123.37627767, - 44.47464541 - ], - [ - -123.37627707, - 44.47436978 - ], - [ - -123.37626492, - 44.47408973 - ], - [ - -123.37626376, - 44.47381736 - ], - [ - -123.37624983, - 44.47342884 - ], - [ - -123.37623088, - 44.47308066 - ], - [ - -123.37620905, - 44.47278668 - ], - [ - -123.37587018, - 44.47261112 - ], - [ - -123.37535419, - 44.47261523 - ], - [ - -123.37493552, - 44.47260515 - ], - [ - -123.37448743, - 44.47259839 - ], - [ - -123.37402546, - 44.47259374 - ], - [ - -123.37355861, - 44.47259492 - ], - [ - -123.37307001, - 44.47259421 - ], - [ - -123.37259824, - 44.47259307 - ], - [ - -123.37211538, - 44.47259249 - ], - [ - -123.37162831, - 44.47258302 - ], - [ - -123.37113823, - 44.47258712 - ], - [ - -123.37064037, - 44.47258386 - ], - [ - -123.3701334, - 44.47258829 - ], - [ - -123.36962867, - 44.47259171 - ], - [ - -123.36937022, - 44.47258995 - ], - [ - -123.36912378, - 44.47259053 - ], - [ - -123.36887163, - 44.47258985 - ], - [ - -123.36863324, - 44.4725898 - ], - [ - -123.36838715, - 44.47258922 - ], - [ - -123.36814924, - 44.47259149 - ], - [ - -123.36789711, - 44.47259082 - ], - [ - -123.36766112, - 44.47258752 - ], - [ - -123.36741742, - 44.47258489 - ], - [ - -123.36717832, - 44.47258291 - ], - [ - -123.36694024, - 44.47258034 - ], - [ - -123.36670569, - 44.47258004 - ], - [ - -123.36646746, - 44.47258135 - ], - [ - -123.36623482, - 44.47258804 - ], - [ - -123.36598461, - 44.47258309 - ], - [ - -123.36574579, - 44.47257845 - ], - [ - -123.3655338, - 44.47257824 - ], - [ - -123.36533217, - 44.47257509 - ], - [ - -123.36510568, - 44.47257815 - ], - [ - -123.36489326, - 44.47257721 - ], - [ - -123.36466218, - 44.47257339 - ], - [ - -123.36436736, - 44.47257262 - ], - [ - -123.36421666, - 44.47257419 - ], - [ - -123.36390575, - 44.47257971 - ], - [ - -123.36376444, - 44.47257772 - ], - [ - -123.36345424, - 44.47257271 - ], - [ - -123.3633442, - 44.4725741 - ], - [ - -123.36294631, - 44.47258196 - ], - [ - -123.36249621, - 44.47256424 - ], - [ - -123.36290343, - 44.47254914 - ], - [ - -123.36340386, - 44.47256104 - ], - [ - -123.36390461, - 44.47256896 - ], - [ - -123.36438534, - 44.47257368 - ], - [ - -123.36483176, - 44.47258048 - ], - [ - -123.36528989, - 44.4725982 - ], - [ - -123.36541877, - 44.4729019 - ], - [ - -123.36534492, - 44.47324998 - ], - [ - -123.36528498, - 44.47351778 - ], - [ - -123.36523051, - 44.47380926 - ], - [ - -123.36517388, - 44.47411295 - ], - [ - -123.36510765, - 44.47441835 - ], - [ - -123.36504111, - 44.47474828 - ], - [ - -123.36498086, - 44.47505715 - ], - [ - -123.364906, - 44.47537289 - ], - [ - -123.36483848, - 44.47569095 - ], - [ - -123.36477777, - 44.47601283 - ], - [ - -123.36471569, - 44.47631687 - ], - [ - -123.36464285, - 44.4766202 - ], - [ - -123.36455395, - 44.47692703 - ], - [ - -123.36444889, - 44.47724018 - ], - [ - -123.36425392, - 44.47754867 - ], - [ - -123.36398455, - 44.4778458 - ], - [ - -123.3637075, - 44.47812319 - ], - [ - -123.36344706, - 44.47839477 - ], - [ - -123.36323979, - 44.47870751 - ], - [ - -123.36311147, - 44.47908059 - ], - [ - -123.36303851, - 44.47948787 - ], - [ - -123.36300979, - 44.47989029 - ], - [ - -123.3629961, - 44.48031362 - ], - [ - -123.36298102, - 44.48070729 - ], - [ - -123.36296296, - 44.48108138 - ], - [ - -123.36293987, - 44.48148094 - ], - [ - -123.36292523, - 44.48187751 - ], - [ - -123.36289383, - 44.48226047 - ], - [ - -123.36286448, - 44.48268227 - ], - [ - -123.3628803, - 44.48308152 - ], - [ - -123.36285904, - 44.48347825 - ], - [ - -123.36285033, - 44.48388443 - ], - [ - -123.36285319, - 44.48424317 - ], - [ - -123.36282358, - 44.4846135 - ], - [ - -123.36283064, - 44.48499237 - ], - [ - -123.36279845, - 44.48538377 - ], - [ - -123.36280365, - 44.48574292 - ], - [ - -123.36279103, - 44.48614027 - ], - [ - -123.36275882, - 44.48653038 - ], - [ - -123.36274116, - 44.48691251 - ], - [ - -123.36273447, - 44.48730966 - ], - [ - -123.36271833, - 44.48767209 - ], - [ - -123.36271052, - 44.48805876 - ], - [ - -123.36271529, - 44.48844957 - ], - [ - -123.36271707, - 44.48885722 - ], - [ - -123.36271342, - 44.48923657 - ], - [ - -123.36272713, - 44.48960986 - ], - [ - -123.36273137, - 44.48998309 - ], - [ - -123.36277839, - 44.49034337 - ], - [ - -123.36282615, - 44.49072404 - ], - [ - -123.36285145, - 44.49111262 - ], - [ - -123.36285707, - 44.49149927 - ], - [ - -123.36290385, - 44.49187654 - ], - [ - -123.36292367, - 44.49224925 - ], - [ - -123.36294821, - 44.49264102 - ], - [ - -123.36296194, - 44.49301479 - ], - [ - -123.36288459, - 44.4934073 - ], - [ - -123.36273562, - 44.49377256 - ], - [ - -123.36253489, - 44.49413239 - ], - [ - -123.36231906, - 44.49448448 - ], - [ - -123.36205489, - 44.49482926 - ], - [ - -123.36179433, - 44.49518322 - ], - [ - -123.36157846, - 44.49552327 - ], - [ - -123.36146593, - 44.49585897 - ], - [ - -123.36142305, - 44.49621261 - ], - [ - -123.36141416, - 44.49651894 - ], - [ - -123.36141521, - 44.49682134 - ], - [ - -123.36142282, - 44.49714268 - ], - [ - -123.36144152, - 44.49748082 - ], - [ - -123.36142261, - 44.49779811 - ], - [ - -123.36141675, - 44.49813024 - ], - [ - -123.36142061, - 44.49844143 - ], - [ - -123.36142109, - 44.49876812 - ], - [ - -123.36142069, - 44.49908708 - ], - [ - -123.36143407, - 44.49940369 - ], - [ - -123.36141717, - 44.49971028 - ], - [ - -123.36141545, - 44.50001698 - ], - [ - -123.36140439, - 44.50033155 - ], - [ - -123.36140674, - 44.50064952 - ], - [ - -123.36139215, - 44.50097352 - ], - [ - -123.36139402, - 44.50129888 - ], - [ - -123.36137066, - 44.50162203 - ], - [ - -123.36137386, - 44.50193885 - ], - [ - -123.36137358, - 44.50226545 - ], - [ - -123.36136434, - 44.5026049 - ], - [ - -123.36136304, - 44.50295191 - ], - [ - -123.36137093, - 44.50329056 - ], - [ - -123.36138476, - 44.50362755 - ], - [ - -123.36139781, - 44.50397618 - ], - [ - -123.36139632, - 44.50432095 - ], - [ - -123.3613971, - 44.50467597 - ], - [ - -123.36139774, - 44.50502173 - ], - [ - -123.36139644, - 44.50536213 - ], - [ - -123.36138866, - 44.50571724 - ], - [ - -123.36138144, - 44.50608813 - ], - [ - -123.36137998, - 44.50644445 - ], - [ - -123.36137587, - 44.50681541 - ], - [ - -123.36138115, - 44.5072001 - ], - [ - -123.36139523, - 44.50757645 - ], - [ - -123.36139261, - 44.507952 - ], - [ - -123.36141138, - 44.50831719 - ], - [ - -123.36140426, - 44.50864671 - ], - [ - -123.36138473, - 44.50897868 - ], - [ - -123.36137849, - 44.50930426 - ], - [ - -123.36134047, - 44.50963618 - ], - [ - -123.36135915, - 44.50995462 - ], - [ - -123.36137026, - 44.51029629 - ], - [ - -123.3613762, - 44.5106353 - ], - [ - -123.36131503, - 44.51096782 - ], - [ - -123.36113466, - 44.51128083 - ], - [ - -123.36082954, - 44.51158389 - ], - [ - -123.36054524, - 44.51189159 - ], - [ - -123.36025421, - 44.51217325 - ], - [ - -123.36001114, - 44.51245718 - ], - [ - -123.35987299, - 44.51279487 - ], - [ - -123.35985717, - 44.51313432 - ], - [ - -123.3602277, - 44.5133997 - ], - [ - -123.36056287, - 44.51364922 - ], - [ - -123.36095109, - 44.51388464 - ], - [ - -123.36138379, - 44.5141023 - ], - [ - -123.3618181, - 44.51435051 - ], - [ - -123.36222187, - 44.51457467 - ], - [ - -123.36263918, - 44.51481453 - ], - [ - -123.36306052, - 44.51504774 - ], - [ - -123.36346434, - 44.51529273 - ], - [ - -123.36387324, - 44.5155298 - ], - [ - -123.36427573, - 44.51576239 - ], - [ - -123.36466981, - 44.51598443 - ], - [ - -123.36507139, - 44.51623301 - ], - [ - -123.36546163, - 44.5164847 - ], - [ - -123.36583731, - 44.51672113 - ], - [ - -123.36622329, - 44.51694135 - ], - [ - -123.36655692, - 44.51715792 - ], - [ - -123.36683566, - 44.51734066 - ], - [ - -123.36708619, - 44.51771857 - ], - [ - -123.36713373, - 44.51805205 - ], - [ - -123.36715191, - 44.51838168 - ], - [ - -123.36716909, - 44.51875543 - ], - [ - -123.36720218, - 44.51908413 - ], - [ - -123.36721678, - 44.51943734 - ], - [ - -123.36725533, - 44.51980132 - ], - [ - -123.36728599, - 44.52016355 - ], - [ - -123.36733928, - 44.52051227 - ], - [ - -123.36736583, - 44.5208765 - ], - [ - -123.36740184, - 44.52122961 - ], - [ - -123.36744832, - 44.52157524 - ], - [ - -123.36749248, - 44.52191219 - ], - [ - -123.36752064, - 44.52228549 - ], - [ - -123.367545, - 44.52263567 - ], - [ - -123.36758798, - 44.52299975 - ], - [ - -123.36762097, - 44.52337038 - ], - [ - -123.36765269, - 44.52370824 - ], - [ - -123.36771761, - 44.52407281 - ], - [ - -123.36777188, - 44.52443368 - ], - [ - -123.36786312, - 44.52480202 - ], - [ - -123.36795255, - 44.52515584 - ], - [ - -123.36805044, - 44.52550058 - ], - [ - -123.3681332, - 44.52585043 - ], - [ - -123.36824639, - 44.52621328 - ], - [ - -123.36836139, - 44.52659395 - ], - [ - -123.36848099, - 44.52697476 - ], - [ - -123.36858801, - 44.52734381 - ], - [ - -123.36868571, - 44.52768466 - ], - [ - -123.36876652, - 44.52804732 - ], - [ - -123.36887051, - 44.52839267 - ], - [ - -123.36888905, - 44.52872868 - ], - [ - -123.36886609, - 44.52904234 - ], - [ - -123.3687869, - 44.52931052 - ], - [ - -123.36864168, - 44.5295885 - ], - [ - -123.36850086, - 44.52987966 - ], - [ - -123.36835275, - 44.5301667 - ], - [ - -123.36821015, - 44.5304506 - ], - [ - -123.36813521, - 44.53074289 - ], - [ - -123.36809417, - 44.5310493 - ], - [ - -123.36808307, - 44.53135268 - ], - [ - -123.36807709, - 44.53166551 - ], - [ - -123.36806277, - 44.53196998 - ], - [ - -123.3680463, - 44.53227926 - ], - [ - -123.36803965, - 44.53259274 - ], - [ - -123.36804211, - 44.53291313 - ], - [ - -123.36801791, - 44.53322385 - ], - [ - -123.36799434, - 44.53352872 - ], - [ - -123.36798858, - 44.53383712 - ], - [ - -123.36796247, - 44.5341586 - ], - [ - -123.36795658, - 44.53448844 - ], - [ - -123.36795352, - 44.53482638 - ], - [ - -123.36793744, - 44.5351432 - ], - [ - -123.36793308, - 44.53543689 - ], - [ - -123.36794899, - 44.53572842 - ], - [ - -123.36794201, - 44.53604456 - ], - [ - -123.3679144, - 44.53635445 - ], - [ - -123.36789605, - 44.53665071 - ], - [ - -123.36789202, - 44.53706667 - ], - [ - -123.36790227, - 44.5373534 - ], - [ - -123.36791436, - 44.5377419 - ], - [ - -123.36792139, - 44.53806974 - ], - [ - -123.367915, - 44.5383973 - ], - [ - -123.36787962, - 44.53868981 - ], - [ - -123.3678659, - 44.5390235 - ], - [ - -123.3678325, - 44.53929856 - ], - [ - -123.36783567, - 44.53961652 - ], - [ - -123.36780379, - 44.5399079 - ], - [ - -123.36782765, - 44.54022154 - ], - [ - -123.3678069, - 44.54055044 - ], - [ - -123.36775867, - 44.54082702 - ], - [ - -123.36769652, - 44.5411808 - ], - [ - -123.36770418, - 44.54150015 - ], - [ - -123.36773166, - 44.54183987 - ], - [ - -123.36774199, - 44.54213937 - ], - [ - -123.3681235, - 44.54227766 - ], - [ - -123.36856158, - 44.5422959 - ], - [ - -123.36896913, - 44.54231307 - ], - [ - -123.36936627, - 44.5423194 - ], - [ - -123.36978548, - 44.54234806 - ], - [ - -123.37020903, - 44.54234748 - ], - [ - -123.37065816, - 44.54234615 - ], - [ - -123.37108325, - 44.54235983 - ], - [ - -123.37146003, - 44.54237851 - ], - [ - -123.37183894, - 44.54239259 - ], - [ - -123.37223681, - 44.54240624 - ], - [ - -123.37262286, - 44.54242518 - ], - [ - -123.37303438, - 44.5424402 - ], - [ - -123.37351583, - 44.54245531 - ], - [ - -123.37383987, - 44.54227731 - ], - [ - -123.37383196, - 44.54195434 - ], - [ - -123.37383654, - 44.5416236 - ], - [ - -123.37384348, - 44.5413155 - ], - [ - -123.37387057, - 44.54098763 - ], - [ - -123.37389542, - 44.54063022 - ], - [ - -123.37390416, - 44.54036024 - ], - [ - -123.37393021, - 44.54002603 - ], - [ - -123.37396232, - 44.53973402 - ], - [ - -123.37397401, - 44.53944478 - ], - [ - -123.37374496, - 44.53919767 - ], - [ - -123.37329827, - 44.53918978 - ], - [ - -123.37275801, - 44.53914873 - ], - [ - -123.37237788, - 44.53916578 - ], - [ - -123.37181974, - 44.53916483 - ], - [ - -123.37129244, - 44.53915226 - ], - [ - -123.37076351, - 44.53913647 - ], - [ - -123.37022045, - 44.53912019 - ], - [ - -123.36967466, - 44.53910229 - ], - [ - -123.36913869, - 44.5390945 - ], - [ - -123.36864067, - 44.53908554 - ], - [ - -123.36820487, - 44.53909592 - ], - [ - -123.36781846, - 44.53910652 - ], - [ - -123.36729566, - 44.539101 - ], - [ - -123.36681229, - 44.53908135 - ], - [ - -123.36633677, - 44.53907648 - ], - [ - -123.36586587, - 44.53909134 - ], - [ - -123.36543583, - 44.53918949 - ], - [ - -123.36507294, - 44.53938391 - ], - [ - -123.36484442, - 44.53965598 - ], - [ - -123.36453922, - 44.53989085 - ], - [ - -123.36407934, - 44.5400364 - ], - [ - -123.36354648, - 44.54002754 - ], - [ - -123.36299412, - 44.54000902 - ], - [ - -123.36244989, - 44.53999501 - ], - [ - -123.36192411, - 44.53996992 - ], - [ - -123.36140626, - 44.53996283 - ], - [ - -123.36089448, - 44.53995435 - ], - [ - -123.3604195, - 44.53995083 - ], - [ - -123.35993781, - 44.53993368 - ], - [ - -123.35945167, - 44.5399286 - ], - [ - -123.35896432, - 44.53992065 - ], - [ - -123.35844079, - 44.53991354 - ], - [ - -123.3580599, - 44.53991998 - ], - [ - -123.3576619, - 44.53994369 - ], - [ - -123.35726352, - 44.53997553 - ], - [ - -123.35683844, - 44.54001482 - ], - [ - -123.35641025, - 44.54007779 - ], - [ - -123.35601564, - 44.54013913 - ], - [ - -123.35559222, - 44.54020833 - ], - [ - -123.35516143, - 44.54027658 - ], - [ - -123.35472893, - 44.54036935 - ], - [ - -123.3542955, - 44.54044764 - ], - [ - -123.35387838, - 44.54052771 - ], - [ - -123.35345842, - 44.54060082 - ], - [ - -123.35302709, - 44.54067578 - ], - [ - -123.35260504, - 44.5407514 - ], - [ - -123.35216942, - 44.54082992 - ], - [ - -123.35174408, - 44.540909 - ], - [ - -123.35131936, - 44.54098493 - ], - [ - -123.35089852, - 44.54106325 - ], - [ - -123.35046616, - 44.54113647 - ], - [ - -123.35003257, - 44.541214 - ], - [ - -123.34959196, - 44.54129491 - ], - [ - -123.34914326, - 44.54136874 - ], - [ - -123.3486948, - 44.54145045 - ], - [ - -123.34825091, - 44.54153397 - ], - [ - -123.34780619, - 44.54161201 - ], - [ - -123.34737654, - 44.54169485 - ], - [ - -123.34693627, - 44.54177226 - ], - [ - -123.3465053, - 44.54184768 - ], - [ - -123.34605872, - 44.54193055 - ], - [ - -123.34560894, - 44.54200864 - ], - [ - -123.34515577, - 44.54207941 - ], - [ - -123.34469986, - 44.54215613 - ], - [ - -123.34425035, - 44.54223638 - ], - [ - -123.34379305, - 44.54232516 - ], - [ - -123.34332858, - 44.54241009 - ], - [ - -123.34286511, - 44.54248899 - ], - [ - -123.34240605, - 44.54258027 - ], - [ - -123.34191071, - 44.54265805 - ], - [ - -123.34144605, - 44.54273822 - ], - [ - -123.34097164, - 44.54281773 - ], - [ - -123.34049089, - 44.54291136 - ], - [ - -123.34001549, - 44.54299275 - ], - [ - -123.33954619, - 44.54306487 - ], - [ - -123.33907374, - 44.54313308 - ], - [ - -123.33862872, - 44.54320893 - ], - [ - -123.3381779, - 44.54329137 - ], - [ - -123.33772016, - 44.54337602 - ], - [ - -123.33727489, - 44.54344441 - ], - [ - -123.33682816, - 44.54350219 - ], - [ - -123.33638509, - 44.54358552 - ], - [ - -123.33593829, - 44.54367072 - ], - [ - -123.33546824, - 44.54376649 - ], - [ - -123.33497755, - 44.54385456 - ], - [ - -123.33448343, - 44.54396112 - ], - [ - -123.33397749, - 44.5440744 - ], - [ - -123.33345742, - 44.54420844 - ], - [ - -123.33292713, - 44.54436008 - ], - [ - -123.33239796, - 44.54451878 - ], - [ - -123.33186398, - 44.5446863 - ], - [ - -123.33134261, - 44.54485311 - ], - [ - -123.33082993, - 44.54504215 - ], - [ - -123.33032629, - 44.54519326 - ], - [ - -123.32982344, - 44.5453518 - ], - [ - -123.3293095, - 44.5454894 - ], - [ - -123.32881378, - 44.54564453 - ], - [ - -123.32829921, - 44.54578852 - ], - [ - -123.3277828, - 44.54594657 - ], - [ - -123.32727762, - 44.54610511 - ], - [ - -123.32676085, - 44.5462653 - ], - [ - -123.32627765, - 44.54643078 - ], - [ - -123.32576999, - 44.546576 - ], - [ - -123.32528599, - 44.54674234 - ], - [ - -123.32478965, - 44.54691086 - ], - [ - -123.32427832, - 44.54705935 - ], - [ - -123.32378277, - 44.54721833 - ], - [ - -123.32329791, - 44.54736043 - ], - [ - -123.32280469, - 44.54751419 - ], - [ - -123.32229631, - 44.54766825 - ], - [ - -123.32179702, - 44.54780808 - ], - [ - -123.32131495, - 44.54794972 - ], - [ - -123.32086643, - 44.54807246 - ], - [ - -123.32040346, - 44.54822164 - ], - [ - -123.31993765, - 44.54839123 - ], - [ - -123.31949408, - 44.54851594 - ], - [ - -123.31899274, - 44.548659 - ], - [ - -123.31853074, - 44.54880099 - ], - [ - -123.31804481, - 44.54893515 - ], - [ - -123.31758997, - 44.54910401 - ], - [ - -123.31710916, - 44.5492607 - ], - [ - -123.31663671, - 44.54940898 - ], - [ - -123.31611987, - 44.54955905 - ], - [ - -123.31563779, - 44.54970864 - ], - [ - -123.31515491, - 44.54985207 - ], - [ - -123.314689, - 44.54999476 - ], - [ - -123.31421445, - 44.55015187 - ], - [ - -123.31372962, - 44.5502831 - ], - [ - -123.31330758, - 44.55041177 - ], - [ - -123.31292017, - 44.55052758 - ], - [ - -123.31251354, - 44.55066436 - ], - [ - -123.31208603, - 44.55077669 - ], - [ - -123.31161638, - 44.55094352 - ], - [ - -123.3112482, - 44.55105947 - ], - [ - -123.31086419, - 44.55119654 - ], - [ - -123.31046132, - 44.5513475 - ], - [ - -123.31005278, - 44.55148959 - ], - [ - -123.30961361, - 44.55159178 - ], - [ - -123.30920571, - 44.55172635 - ], - [ - -123.30874104, - 44.55184633 - ], - [ - -123.30829359, - 44.55198769 - ], - [ - -123.30787319, - 44.5520999 - ], - [ - -123.3074458, - 44.5522332 - ], - [ - -123.30706032, - 44.55234182 - ], - [ - -123.30672195, - 44.55247608 - ], - [ - -123.30631133, - 44.55258632 - ], - [ - -123.30591744, - 44.55270406 - ], - [ - -123.30552757, - 44.55283411 - ], - [ - -123.3051465, - 44.55296585 - ], - [ - -123.30474396, - 44.55309861 - ], - [ - -123.30434769, - 44.55324569 - ], - [ - -123.30394705, - 44.55338725 - ], - [ - -123.30354834, - 44.55350028 - ], - [ - -123.30313005, - 44.55361894 - ], - [ - -123.30266868, - 44.55374065 - ], - [ - -123.30221645, - 44.55388066 - ], - [ - -123.30173418, - 44.55401417 - ], - [ - -123.30124558, - 44.55413817 - ], - [ - -123.30079325, - 44.55427585 - ], - [ - -123.30029551, - 44.55437196 - ], - [ - -123.2997996, - 44.55448399 - ], - [ - -123.29932269, - 44.55452997 - ], - [ - -123.29879777, - 44.55454446 - ], - [ - -123.29830041, - 44.55457205 - ], - [ - -123.29779975, - 44.55457596 - ], - [ - -123.29729846, - 44.55460096 - ], - [ - -123.29679836, - 44.55459604 - ], - [ - -123.29626802, - 44.55456638 - ], - [ - -123.29575394, - 44.55454353 - ], - [ - -123.2952318, - 44.55451849 - ], - [ - -123.29473383, - 44.55452178 - ], - [ - -123.29423418, - 44.55451254 - ], - [ - -123.29371862, - 44.55453089 - ], - [ - -123.29321517, - 44.55453169 - ], - [ - -123.29275561, - 44.55451971 - ], - [ - -123.29231079, - 44.55451182 - ], - [ - -123.29187739, - 44.55450104 - ], - [ - -123.29145284, - 44.55450805 - ], - [ - -123.29105513, - 44.55449366 - ], - [ - -123.29059146, - 44.55449023 - ], - [ - -123.29019322, - 44.55448379 - ], - [ - -123.28978738, - 44.55447773 - ], - [ - -123.28929609, - 44.55448625 - ], - [ - -123.28874549, - 44.55450926 - ], - [ - -123.28834391, - 44.55450056 - ], - [ - -123.28790724, - 44.55449707 - ], - [ - -123.28741355, - 44.55450849 - ], - [ - -123.28693096, - 44.5545087 - ], - [ - -123.28646726, - 44.55452037 - ], - [ - -123.2860079, - 44.5545304 - ], - [ - -123.28554007, - 44.5545346 - ], - [ - -123.28508315, - 44.55454316 - ], - [ - -123.28462741, - 44.55455558 - ], - [ - -123.28417334, - 44.5545515 - ], - [ - -123.28374206, - 44.55455117 - ], - [ - -123.28333752, - 44.55453237 - ], - [ - -123.28278619, - 44.55453389 - ], - [ - -123.28236548, - 44.55452196 - ], - [ - -123.28188959, - 44.55453161 - ], - [ - -123.28146483, - 44.55453568 - ], - [ - -123.28109348, - 44.55459914 - ], - [ - -123.28066717, - 44.55469201 - ], - [ - -123.28020148, - 44.5548682 - ], - [ - -123.27971168, - 44.55503849 - ], - [ - -123.2793803, - 44.55518461 - ], - [ - -123.27896031, - 44.55543667 - ], - [ - -123.27862816, - 44.55556901 - ], - [ - -123.27821949, - 44.55573975 - ], - [ - -123.27783296, - 44.55592006 - ], - [ - -123.27745719, - 44.55609727 - ], - [ - -123.27714064, - 44.55625404 - ], - [ - -123.2767167, - 44.55644134 - ], - [ - -123.27634067, - 44.55656543 - ], - [ - -123.27596722, - 44.55669426 - ], - [ - -123.27549069, - 44.55678284 - ], - [ - -123.27496926, - 44.55689358 - ], - [ - -123.27458313, - 44.5569124 - ], - [ - -123.27419125, - 44.55689802 - ], - [ - -123.27377744, - 44.5568866 - ], - [ - -123.2733415, - 44.55686836 - ], - [ - -123.27290315, - 44.55682259 - ], - [ - -123.27243825, - 44.55675093 - ], - [ - -123.2720012, - 44.55668193 - ], - [ - -123.27155253, - 44.55660638 - ], - [ - -123.27110968, - 44.55655408 - ], - [ - -123.27065104, - 44.55648773 - ], - [ - -123.27018728, - 44.55641826 - ], - [ - -123.26972832, - 44.55634392 - ], - [ - -123.26928058, - 44.55627108 - ], - [ - -123.26906268, - 44.55623613 - ], - [ - -123.26882152, - 44.55624357 - ], - [ - -123.26860188, - 44.55623933 - ], - [ - -123.26834039, - 44.55622165 - ], - [ - -123.26811121, - 44.5562004 - ], - [ - -123.26788139, - 44.55618992 - ], - [ - -123.26767505, - 44.55619525 - ], - [ - -123.26745099, - 44.55621678 - ], - [ - -123.26722733, - 44.55625385 - ], - [ - -123.26699088, - 44.5562802 - ], - [ - -123.26677956, - 44.55633282 - ], - [ - -123.26654448, - 44.55639357 - ], - [ - -123.26631436, - 44.55645412 - ], - [ - -123.26606874, - 44.55652551 - ], - [ - -123.26583708, - 44.55660041 - ], - [ - -123.26558672, - 44.55669278 - ], - [ - -123.26534835, - 44.55678462 - ], - [ - -123.26510338, - 44.55687513 - ], - [ - -123.26486778, - 44.55696448 - ], - [ - -123.26462215, - 44.55704933 - ], - [ - -123.26437856, - 44.55713732 - ], - [ - -123.26413268, - 44.55721805 - ], - [ - -123.26388708, - 44.55730522 - ], - [ - -123.26362142, - 44.55739124 - ], - [ - -123.26309051, - 44.55753223 - ], - [ - -123.26252542, - 44.55763486 - ], - [ - -123.26195273, - 44.55772093 - ], - [ - -123.26139849, - 44.55781796 - ], - [ - -123.26085362, - 44.55789672 - ], - [ - -123.26032307, - 44.55798129 - ], - [ - -123.25980237, - 44.55806619 - ], - [ - -123.25928996, - 44.55815663 - ], - [ - -123.25903973, - 44.55821426 - ], - [ - -123.2587808, - 44.55828566 - ], - [ - -123.2585309, - 44.55835269 - ], - [ - -123.25827879, - 44.55842939 - ], - [ - -123.25802216, - 44.55851736 - ], - [ - -123.25776741, - 44.55860888 - ], - [ - -123.2575384, - 44.55870622 - ], - [ - -123.25731551, - 44.55882039 - ], - [ - -123.25711364, - 44.55896099 - ], - [ - -123.25693392, - 44.55911406 - ], - [ - -123.2567741, - 44.55926982 - ], - [ - -123.25662538, - 44.55943741 - ], - [ - -123.25648197, - 44.55960931 - ], - [ - -123.25633859, - 44.55978067 - ], - [ - -123.25618547, - 44.55994987 - ], - [ - -123.25603755, - 44.56012754 - ], - [ - -123.25591114, - 44.56029996 - ], - [ - -123.25578258, - 44.56046913 - ], - [ - -123.25564317, - 44.56063656 - ], - [ - -123.25547978, - 44.56081952 - ], - [ - -123.25535444, - 44.56098902 - ], - [ - -123.2552067, - 44.56116703 - ], - [ - -123.25505769, - 44.56132321 - ], - [ - -123.25491742, - 44.56147616 - ], - [ - -123.2547614, - 44.56163734 - ], - [ - -123.25461235, - 44.56179536 - ], - [ - -123.25447106, - 44.56194753 - ], - [ - -123.25432341, - 44.56210449 - ], - [ - -123.25418716, - 44.56224661 - ], - [ - -123.25404152, - 44.56239059 - ], - [ - -123.25390358, - 44.56253388 - ], - [ - -123.25376721, - 44.56268813 - ], - [ - -123.25363454, - 44.56284177 - ], - [ - -123.25349972, - 44.56299846 - ], - [ - -123.25337634, - 44.56313844 - ], - [ - -123.25326474, - 44.56329604 - ], - [ - -123.25316373, - 44.56343593 - ], - [ - -123.25306593, - 44.56358197 - ], - [ - -123.25296928, - 44.56371839 - ], - [ - -123.25287633, - 44.56383955 - ], - [ - -123.2527811, - 44.56396021 - ], - [ - -123.2527006, - 44.56409962 - ], - [ - -123.25251666, - 44.5642821 - ], - [ - -123.252464, - 44.56436555 - ], - [ - -123.2523231, - 44.56453533 - ], - [ - -123.25225519, - 44.5645614 - ], - [ - -123.25228097, - 44.56463903 - ], - [ - -123.2524103, - 44.56476912 - ], - [ - -123.25265286, - 44.56484287 - ], - [ - -123.25280326, - 44.5648831 - ], - [ - -123.253176, - 44.56495496 - ], - [ - -123.25360282, - 44.56504142 - ], - [ - -123.25401679, - 44.56515583 - ], - [ - -123.25443631, - 44.56532004 - ], - [ - -123.25480816, - 44.56548473 - ], - [ - -123.25519484, - 44.56566755 - ], - [ - -123.25551553, - 44.56583166 - ], - [ - -123.25596529, - 44.56603905 - ], - [ - -123.25639336, - 44.56622896 - ], - [ - -123.25652885, - 44.56629939 - ], - [ - -123.25678678, - 44.56643649 - ], - [ - -123.2569142, - 44.56649582 - ], - [ - -123.25715173, - 44.56660402 - ], - [ - -123.25726289, - 44.566648 - ], - [ - -123.25752143, - 44.56675673 - ], - [ - -123.25760653, - 44.56680001 - ], - [ - -123.25767378, - 44.56679999 - ], - [ - -123.25787237, - 44.56687549 - ], - [ - -123.25801719, - 44.56693186 - ], - [ - -123.25822182, - 44.56700321 - ], - [ - -123.25837141, - 44.56703318 - ], - [ - -123.25860196, - 44.56707244 - ], - [ - -123.25878758, - 44.56710355 - ], - [ - -123.25887093, - 44.56712097 - ], - [ - -123.25904221, - 44.56717036 - ], - [ - -123.25922649, - 44.56721374 - ], - [ - -123.25940227, - 44.56725654 - ], - [ - -123.25958777, - 44.56731148 - ], - [ - -123.25976646, - 44.56736335 - ], - [ - -123.26003077, - 44.56743253 - ], - [ - -123.26012839, - 44.56745472 - ], - [ - -123.26038022, - 44.56751068 - ], - [ - -123.26055354, - 44.56742884 - ], - [ - -123.26063004, - 44.56728882 - ], - [ - -123.26068524, - 44.56711308 - ], - [ - -123.26074998, - 44.56695316 - ], - [ - -123.2608089, - 44.56678942 - ], - [ - -123.26089009, - 44.56659957 - ], - [ - -123.26093937, - 44.56650242 - ], - [ - -123.26102979, - 44.56631785 - ], - [ - -123.26107432, - 44.56621301 - ], - [ - -123.26117094, - 44.56601462 - ], - [ - -123.26120647, - 44.5659277 - ], - [ - -123.26127949, - 44.56572113 - ], - [ - -123.26134965, - 44.565611 - ], - [ - -123.26140875, - 44.56550587 - ], - [ - -123.26153761, - 44.56528539 - ], - [ - -123.2615853, - 44.56518097 - ], - [ - -123.26170963, - 44.56499887 - ], - [ - -123.26177122, - 44.56490562 - ], - [ - -123.26189227, - 44.56471824 - ], - [ - -123.26193688, - 44.56462046 - ], - [ - -123.26203489, - 44.56443367 - ], - [ - -123.2620959, - 44.56432723 - ], - [ - -123.26224802, - 44.56409988 - ], - [ - -123.26222823, - 44.56401989 - ], - [ - -123.26222969, - 44.56394001 - ], - [ - -123.26235411, - 44.56373793 - ], - [ - -123.26240754, - 44.56363945 - ], - [ - -123.26253763, - 44.56341107 - ], - [ - -123.26260672, - 44.5633341 - ], - [ - -123.26270288, - 44.56315453 - ], - [ - -123.26274507, - 44.56306436 - ], - [ - -123.26287169, - 44.56281372 - ], - [ - -123.26293765, - 44.56273657 - ], - [ - -123.2630292, - 44.56252632 - ], - [ - -123.26310572, - 44.56240685 - ], - [ - -123.26322777, - 44.56217996 - ], - [ - -123.26326892, - 44.56206816 - ], - [ - -123.26338999, - 44.56184057 - ], - [ - -123.26344102, - 44.56173574 - ], - [ - -123.2635509, - 44.56152058 - ], - [ - -123.26372206, - 44.56116824 - ], - [ - -123.26387451, - 44.56086544 - ], - [ - -123.26401468, - 44.56056363 - ], - [ - -123.26418536, - 44.56026245 - ], - [ - -123.26433945, - 44.55997664 - ], - [ - -123.2643915, - 44.55987913 - ], - [ - -123.26446575, - 44.55970194 - ], - [ - -123.26451613, - 44.55958902 - ], - [ - -123.26459456, - 44.55937425 - ], - [ - -123.26461077, - 44.55926399 - ], - [ - -123.26473225, - 44.55909383 - ], - [ - -123.26478695, - 44.55898226 - ], - [ - -123.26492466, - 44.5587611 - ], - [ - -123.26497928, - 44.55865923 - ], - [ - -123.26509293, - 44.55842729 - ], - [ - -123.26514855, - 44.55831671 - ], - [ - -123.26525712, - 44.55809135 - ], - [ - -123.26531496, - 44.55798363 - ], - [ - -123.26543232, - 44.55779935 - ], - [ - -123.26549013, - 44.55770322 - ], - [ - -123.26558955, - 44.55749812 - ], - [ - -123.26565084, - 44.55737409 - ], - [ - -123.26575958, - 44.55717786 - ], - [ - -123.26581655, - 44.55705329 - ], - [ - -123.26585019, - 44.55690699 - ], - [ - -123.26593923, - 44.55666239 - ], - [ - -123.26597135, - 44.55657634 - ], - [ - -123.2659601, - 44.55632352 - ], - [ - -123.26592714, - 44.5561932 - ], - [ - -123.26582439, - 44.55597695 - ], - [ - -123.26572437, - 44.55584709 - ], - [ - -123.26563835, - 44.55571634 - ], - [ - -123.26541291, - 44.55553334 - ], - [ - -123.26510286, - 44.55524448 - ], - [ - -123.26490101, - 44.55490589 - ], - [ - -123.26489186, - 44.55455867 - ], - [ - -123.26493487, - 44.55421581 - ], - [ - -123.26497802, - 44.55394571 - ], - [ - -123.26498909, - 44.55366594 - ], - [ - -123.26505023, - 44.55331664 - ], - [ - -123.2650603, - 44.55321268 - ], - [ - -123.26509157, - 44.55301434 - ], - [ - -123.26510354, - 44.55290039 - ], - [ - -123.26512899, - 44.55267696 - ], - [ - -123.26515485, - 44.55256558 - ], - [ - -123.26518503, - 44.55234615 - ], - [ - -123.26518099, - 44.55223245 - ], - [ - -123.26519534, - 44.55199671 - ], - [ - -123.26520451, - 44.55187375 - ], - [ - -123.2652246, - 44.55161241 - ], - [ - -123.2652252, - 44.55150293 - ], - [ - -123.26522555, - 44.55136002 - ], - [ - -123.26523907, - 44.55123375 - ], - [ - -123.26525674, - 44.55109084 - ], - [ - -123.26527545, - 44.5509604 - ], - [ - -123.26531051, - 44.55068985 - ], - [ - -123.26534583, - 44.55030138 - ], - [ - -123.26537778, - 44.55000365 - ], - [ - -123.26497946, - 44.5498342 - ], - [ - -123.26450003, - 44.54982978 - ], - [ - -123.26414419, - 44.54980376 - ] - ] - }, - "properties": { - "time": [ - 1366067072000, - 1366067074000, - 1366067076000, - 1366067077000, - 1366067079000, - 1366067080000, - 1366067082000, - 1366067083000, - 1366067086000, - 1366067089000, - 1366067092000, - 1366067095000, - 1366067098000, - 1366067101000, - 1366067104000, - 1366067105000, - 1366067109000, - 1366067111000, - 1366067122000, - 1366067135000, - 1366067137000, - 1366067139000, - 1366067140000, - 1366067142000, - 1366067145000, - 1366067148000, - 1366067151000, - 1366067154000, - 1366067157000, - 1366067160000, - 1366067162000, - 1366067163000, - 1366067165000, - 1366067166000, - 1366067168000, - 1366067169000, - 1366067171000, - 1366067172000, - 1366067173000, - 1366067174000, - 1366067175000, - 1366067176000, - 1366067177000, - 1366067178000, - 1366067179000, - 1366067180000, - 1366067181000, - 1366067182000, - 1366067183000, - 1366067184000, - 1366067186000, - 1366067188000, - 1366067190000, - 1366067192000, - 1366067194000, - 1366067196000, - 1366067198000, - 1366067200000, - 1366067202000, - 1366067204000, - 1366067205000, - 1366067206000, - 1366067207000, - 1366067208000, - 1366067209000, - 1366067210000, - 1366067211000, - 1366067212000, - 1366067213000, - 1366067214000, - 1366067215000, - 1366067216000, - 1366067217000, - 1366067218000, - 1366067219000, - 1366067220000, - 1366067221000, - 1366067222000, - 1366067224000, - 1366067226000, - 1366067228000, - 1366067230000, - 1366067232000, - 1366067234000, - 1366067237000, - 1366067240000, - 1366067242000, - 1366067244000, - 1366067246000, - 1366067248000, - 1366067250000, - 1366067252000, - 1366067254000, - 1366067256000, - 1366067258000, - 1366067260000, - 1366067262000, - 1366067264000, - 1366067266000, - 1366067268000, - 1366067270000, - 1366067272000, - 1366067274000, - 1366067276000, - 1366067278000, - 1366067280000, - 1366067282000, - 1366067284000, - 1366067286000, - 1366067287000, - 1366067289000, - 1366067291000, - 1366067293000, - 1366067295000, - 1366067297000, - 1366067299000, - 1366067301000, - 1366067303000, - 1366067305000, - 1366067307000, - 1366067309000, - 1366067311000, - 1366067313000, - 1366067315000, - 1366067317000, - 1366067319000, - 1366067321000, - 1366067323000, - 1366067325000, - 1366067327000, - 1366067329000, - 1366067331000, - 1366067333000, - 1366067335000, - 1366067337000, - 1366067339000, - 1366067341000, - 1366067343000, - 1366067345000, - 1366067347000, - 1366067349000, - 1366067351000, - 1366067353000, - 1366067355000, - 1366067357000, - 1366067359000, - 1366067361000, - 1366067363000, - 1366067366000, - 1366067370000, - 1366067374000, - 1366067378000, - 1366067381000, - 1366067384000, - 1366067388000, - 1366067391000, - 1366067394000, - 1366067397000, - 1366067400000, - 1366067403000, - 1366067406000, - 1366067410000, - 1366067413000, - 1366067416000, - 1366067419000, - 1366067422000, - 1366067425000, - 1366067428000, - 1366067431000, - 1366067434000, - 1366067437000, - 1366067440000, - 1366067442000, - 1366067443000, - 1366067445000, - 1366067446000, - 1366067447000, - 1366067448000, - 1366067450000, - 1366067451000, - 1366067453000, - 1366067454000, - 1366067456000, - 1366067458000, - 1366067461000, - 1366067463000, - 1366067464000, - 1366067466000, - 1366067467000, - 1366067470000, - 1366067472000, - 1366067619000, - 1366067622000, - 1366067625000, - 1366067628000, - 1366067631000, - 1366067634000, - 1366067637000, - 1366067640000, - 1366067643000, - 1366067646000, - 1366067649000, - 1366067652000, - 1366067656000, - 1366067661000, - 1366067683000, - 1366067687000, - 1366067690000, - 1366067693000, - 1366067696000, - 1366067699000, - 1366067702000, - 1366067705000, - 1366067708000, - 1366067711000, - 1366067714000, - 1366067717000, - 1366067722000, - 1366067727000, - 1366067730000, - 1366067733000, - 1366067736000, - 1366067739000, - 1366067741000, - 1366067744000, - 1366067746000, - 1366067748000, - 1366067750000, - 1366067752000, - 1366067754000, - 1366067756000, - 1366067758000, - 1366067760000, - 1366067762000, - 1366067764000, - 1366067766000, - 1366067768000, - 1366067770000, - 1366067772000, - 1366067774000, - 1366067776000, - 1366067778000, - 1366067780000, - 1366067782000, - 1366067784000, - 1366067786000, - 1366067788000, - 1366067790000, - 1366067792000, - 1366067794000, - 1366067796000, - 1366067798000, - 1366067800000, - 1366067802000, - 1366067804000, - 1366067806000, - 1366067808000, - 1366067810000, - 1366067812000, - 1366067814000, - 1366067816000, - 1366067818000, - 1366067820000, - 1366067822000, - 1366067824000, - 1366067826000, - 1366067828000, - 1366067830000, - 1366067832000, - 1366067834000, - 1366067836000, - 1366067838000, - 1366067840000, - 1366067842000, - 1366067844000, - 1366067846000, - 1366067848000, - 1366067851000, - 1366067853000, - 1366067856000, - 1366067859000, - 1366067862000, - 1366067864000, - 1366067866000, - 1366067868000, - 1366067870000, - 1366067872000, - 1366067874000, - 1366067876000, - 1366067878000, - 1366067880000, - 1366067882000, - 1366067884000, - 1366067886000, - 1366067888000, - 1366067891000, - 1366067894000, - 1366067897000, - 1366067899000, - 1366067901000, - 1366067903000, - 1366067905000, - 1366067907000, - 1366067909000, - 1366067911000, - 1366067913000, - 1366067915000, - 1366067917000, - 1366067919000, - 1366067921000, - 1366067924000, - 1366067927000, - 1366067930000, - 1366067933000, - 1366067936000, - 1366067939000, - 1366067942000, - 1366067945000, - 1366067948000, - 1366067950000, - 1366067952000, - 1366067954000, - 1366067956000, - 1366067958000, - 1366067960000, - 1366067962000, - 1366067964000, - 1366067966000, - 1366067968000, - 1366067970000, - 1366067972000, - 1366067974000, - 1366067976000, - 1366067978000, - 1366067980000, - 1366067982000, - 1366067984000, - 1366067986000, - 1366067988000, - 1366067990000, - 1366067992000, - 1366067994000, - 1366067996000, - 1366067998000, - 1366068000000, - 1366068002000, - 1366068004000, - 1366068006000, - 1366068008000, - 1366068010000, - 1366068012000, - 1366068015000, - 1366068018000, - 1366068024000, - 1366068038000, - 1366068041000, - 1366068043000, - 1366068045000, - 1366068047000, - 1366068049000, - 1366068051000, - 1366068053000, - 1366068055000, - 1366068057000, - 1366068059000, - 1366068061000, - 1366068063000, - 1366068065000, - 1366068067000, - 1366068069000, - 1366068071000, - 1366068073000, - 1366068075000, - 1366068077000, - 1366068079000, - 1366068081000, - 1366068083000, - 1366068085000, - 1366068087000, - 1366068089000, - 1366068091000, - 1366068093000, - 1366068095000, - 1366068097000, - 1366068099000, - 1366068101000, - 1366068103000, - 1366068105000, - 1366068107000, - 1366068109000, - 1366068111000, - 1366068113000, - 1366068115000, - 1366068117000, - 1366068119000, - 1366068121000, - 1366068123000, - 1366068126000, - 1366068134000, - 1366068137000, - 1366068140000, - 1366068142000, - 1366068144000, - 1366068146000, - 1366068148000, - 1366068150000, - 1366068152000, - 1366068154000, - 1366068156000, - 1366068158000, - 1366068160000, - 1366068162000, - 1366068164000, - 1366068167000, - 1366068170000, - 1366068172000, - 1366068174000, - 1366068176000, - 1366068179000, - 1366068183000, - 1366068196000, - 1366068199000, - 1366068203000, - 1366068207000, - 1366068211000, - 1366068214000, - 1366068218000, - 1366068222000, - 1366068227000, - 1366068231000, - 1366068234000, - 1366068237000, - 1366068240000, - 1366068243000, - 1366068246000, - 1366068249000, - 1366068252000, - 1366068255000, - 1366068258000, - 1366068262000, - 1366068266000, - 1366068270000, - 1366068274000, - 1366068277000, - 1366068280000, - 1366068283000, - 1366068286000, - 1366068288000, - 1366068291000, - 1366068294000, - 1366068297000, - 1366068301000, - 1366068304000, - 1366068307000, - 1366068310000, - 1366068313000, - 1366068316000, - 1366068318000, - 1366068320000, - 1366068322000, - 1366068325000, - 1366068328000, - 1366068331000, - 1366068335000, - 1366068340000, - 1366068345000, - 1366068348000, - 1366068351000, - 1366068354000, - 1366068357000, - 1366068360000, - 1366068363000, - 1366068366000, - 1366068371000, - 1366068375000, - 1366068377000, - 1366068379000, - 1366068381000, - 1366068383000, - 1366068385000, - 1366068387000, - 1366068389000, - 1366068392000, - 1366068395000, - 1366068398000, - 1366068401000, - 1366068405000, - 1366068411000, - 1366068417000, - 1366068421000, - 1366068428000, - 1366068432000, - 1366068435000, - 1366068438000, - 1366068441000, - 1366068444000, - 1366068447000, - 1366068450000, - 1366068453000, - 1366068456000, - 1366068459000, - 1366068462000, - 1366068465000, - 1366068468000, - 1366068471000, - 1366068474000, - 1366068477000, - 1366068480000, - 1366068484000, - 1366068487000, - 1366068490000, - 1366068493000, - 1366068495000, - 1366068497000, - 1366068499000, - 1366068502000, - 1366068505000, - 1366068508000, - 1366068516000, - 1366068519000, - 1366068521000, - 1366068523000, - 1366068525000, - 1366068527000, - 1366068529000, - 1366068531000, - 1366068533000, - 1366068535000, - 1366068537000, - 1366068539000, - 1366068541000, - 1366068543000, - 1366068544000, - 1366068545000, - 1366068546000, - 1366068547000, - 1366068548000, - 1366068549000, - 1366068550000, - 1366068551000, - 1366068552000, - 1366068553000, - 1366068554000, - 1366068555000, - 1366068556000, - 1366068557000, - 1366068558000, - 1366068559000, - 1366068560000, - 1366068561000, - 1366068563000, - 1366068566000, - 1366068568000, - 1366068570000, - 1366068571000, - 1366068573000, - 1366068574000, - 1366068577000, - 1366068578000, - 1366068581000, - 1366068585000, - 1366068607000, - 1366068610000, - 1366068613000, - 1366068616000, - 1366068619000, - 1366068623000, - 1366068628000, - 1366068631000, - 1366068633000, - 1366068635000, - 1366068637000, - 1366068639000, - 1366068641000, - 1366068643000, - 1366068645000, - 1366068647000, - 1366068649000, - 1366068651000, - 1366068653000, - 1366068655000, - 1366068657000, - 1366068659000, - 1366068661000, - 1366068663000, - 1366068665000, - 1366068667000, - 1366068669000, - 1366068671000, - 1366068673000, - 1366068675000, - 1366068677000, - 1366068679000, - 1366068681000, - 1366068683000, - 1366068685000, - 1366068687000, - 1366068689000, - 1366068691000, - 1366068693000, - 1366068695000, - 1366068697000, - 1366068699000, - 1366068701000, - 1366068703000, - 1366068705000, - 1366068707000, - 1366068709000, - 1366068711000, - 1366068713000, - 1366068715000, - 1366068717000, - 1366068719000, - 1366068721000, - 1366068723000, - 1366068725000, - 1366068727000, - 1366068729000, - 1366068731000, - 1366068733000, - 1366068735000, - 1366068737000, - 1366068739000, - 1366068741000, - 1366068743000, - 1366068745000, - 1366068747000, - 1366068749000, - 1366068751000, - 1366068753000, - 1366068755000, - 1366068757000, - 1366068759000, - 1366068761000, - 1366068763000, - 1366068765000, - 1366068767000, - 1366068769000, - 1366068771000, - 1366068773000, - 1366068775000, - 1366068777000, - 1366068779000, - 1366068781000, - 1366068783000, - 1366068785000, - 1366068787000, - 1366068789000, - 1366068791000, - 1366068793000, - 1366068795000, - 1366068797000, - 1366068799000, - 1366068801000, - 1366068803000, - 1366068805000, - 1366068807000, - 1366068809000, - 1366068811000, - 1366068813000, - 1366068815000, - 1366068817000, - 1366068819000, - 1366068821000, - 1366068823000, - 1366068825000, - 1366068827000, - 1366068829000, - 1366068831000, - 1366068833000, - 1366068835000, - 1366068837000, - 1366068839000, - 1366068841000, - 1366068843000, - 1366068845000, - 1366068847000, - 1366068849000, - 1366068851000, - 1366068853000, - 1366068855000, - 1366068857000, - 1366068859000, - 1366068861000, - 1366068863000, - 1366068865000, - 1366068867000, - 1366068869000, - 1366068871000, - 1366068873000, - 1366068875000, - 1366068877000, - 1366068879000, - 1366068881000, - 1366068883000, - 1366068885000, - 1366068887000, - 1366068889000, - 1366068891000, - 1366068893000, - 1366068895000, - 1366068897000, - 1366068900000, - 1366068902000, - 1366068904000, - 1366068906000, - 1366068908000, - 1366068910000, - 1366068912000, - 1366068914000, - 1366068916000, - 1366068918000, - 1366068920000, - 1366068922000, - 1366068924000, - 1366068926000, - 1366068928000, - 1366068930000, - 1366068932000, - 1366068934000, - 1366068936000, - 1366068938000, - 1366068940000, - 1366068942000, - 1366068944000, - 1366068946000, - 1366068948000, - 1366068950000, - 1366068952000, - 1366068954000, - 1366068956000, - 1366068958000, - 1366068960000, - 1366068962000, - 1366068964000, - 1366068966000, - 1366068968000, - 1366068970000, - 1366068972000, - 1366068974000, - 1366068976000, - 1366068978000, - 1366068980000, - 1366068982000, - 1366068984000, - 1366068986000, - 1366068988000, - 1366068990000, - 1366068992000, - 1366068994000, - 1366068996000, - 1366068998000, - 1366069000000, - 1366069002000, - 1366069004000, - 1366069006000, - 1366069008000, - 1366069010000, - 1366069012000, - 1366069014000, - 1366069017000, - 1366069019000, - 1366069022000, - 1366069025000, - 1366069028000, - 1366069032000, - 1366069059000, - 1366069063000, - 1366069067000, - 1366069072000, - 1366069077000, - 1366069081000, - 1366069084000, - 1366069088000, - 1366069092000, - 1366069096000, - 1366069101000, - 1366069108000, - 1366069112000, - 1366069117000, - 1366069126000, - 1366069130000, - 1366069134000, - 1366069138000, - 1366069142000, - 1366069147000, - 1366069151000, - 1366069154000, - 1366069157000, - 1366069160000, - 1366069164000, - 1366069172000, - 1366069175000, - 1366069178000, - 1366069184000, - 1366069188000, - 1366069191000, - 1366069197000, - 1366069203000, - 1366069206000, - 1366069209000, - 1366069217000, - 1366069220000, - 1366069223000, - 1366069225000, - 1366069228000, - 1366069231000, - 1366069234000, - 1366069237000, - 1366069240000, - 1366069243000, - 1366069246000, - 1366069251000, - 1366069264000, - 1366069268000, - 1366069271000, - 1366069274000, - 1366069277000, - 1366069280000, - 1366069283000, - 1366069286000, - 1366069289000, - 1366069292000, - 1366069295000, - 1366069298000, - 1366069301000, - 1366069304000, - 1366069307000, - 1366069310000, - 1366069313000, - 1366069316000, - 1366069319000, - 1366069322000, - 1366069325000, - 1366069327000, - 1366069329000, - 1366069331000, - 1366069333000, - 1366069335000, - 1366069337000, - 1366069339000, - 1366069341000, - 1366069343000, - 1366069345000, - 1366069347000, - 1366069349000, - 1366069351000, - 1366069353000, - 1366069355000, - 1366069357000, - 1366069359000, - 1366069361000, - 1366069363000, - 1366069365000, - 1366069367000, - 1366069369000, - 1366069371000, - 1366069373000, - 1366069375000, - 1366069377000, - 1366069379000, - 1366069381000, - 1366069383000, - 1366069385000, - 1366069387000, - 1366069389000, - 1366069391000, - 1366069393000, - 1366069395000, - 1366069397000, - 1366069399000, - 1366069401000, - 1366069403000, - 1366069405000, - 1366069407000, - 1366069409000, - 1366069411000, - 1366069413000, - 1366069415000, - 1366069417000, - 1366069419000, - 1366069421000, - 1366069423000, - 1366069425000, - 1366069427000, - 1366069429000, - 1366069431000, - 1366069433000, - 1366069435000, - 1366069437000, - 1366069439000, - 1366069441000, - 1366069443000, - 1366069445000, - 1366069447000, - 1366069449000, - 1366069451000, - 1366069453000, - 1366069455000, - 1366069457000, - 1366069459000, - 1366069461000, - 1366069463000, - 1366069465000, - 1366069467000, - 1366069469000, - 1366069471000, - 1366069473000, - 1366069475000, - 1366069477000, - 1366069479000, - 1366069481000, - 1366069483000, - 1366069485000, - 1366069487000, - 1366069489000, - 1366069491000, - 1366069493000, - 1366069495000, - 1366069497000, - 1366069499000, - 1366069501000, - 1366069503000, - 1366069505000, - 1366069507000, - 1366069509000, - 1366069511000, - 1366069513000, - 1366069515000, - 1366069517000, - 1366069519000, - 1366069521000, - 1366069524000, - 1366069585000, - 1366069588000, - 1366069590000, - 1366069592000, - 1366069594000, - 1366069596000, - 1366069598000, - 1366069600000, - 1366069602000, - 1366069604000, - 1366069606000, - 1366069608000, - 1366069610000, - 1366069612000, - 1366069614000, - 1366069616000, - 1366069618000, - 1366069620000, - 1366069622000, - 1366069624000, - 1366069626000, - 1366069628000, - 1366069630000, - 1366069632000, - 1366069634000, - 1366069636000, - 1366069638000, - 1366069640000, - 1366069642000, - 1366069644000, - 1366069646000, - 1366069648000, - 1366069650000, - 1366069652000, - 1366069654000, - 1366069656000, - 1366069658000, - 1366069660000, - 1366069662000, - 1366069664000, - 1366069666000, - 1366069668000, - 1366069670000, - 1366069672000, - 1366069674000, - 1366069676000, - 1366069678000, - 1366069680000, - 1366069683000, - 1366069687000, - 1366069692000, - 1366069696000, - 1366069699000, - 1366069701000, - 1366069703000, - 1366069705000, - 1366069707000, - 1366069709000, - 1366069711000, - 1366069713000, - 1366069715000, - 1366069717000, - 1366069719000, - 1366069721000, - 1366069723000, - 1366069726000, - 1366069729000, - 1366069733000, - 1366069737000, - 1366069740000, - 1366069743000, - 1366069746000, - 1366069749000, - 1366069751000, - 1366069754000, - 1366069756000, - 1366069759000, - 1366069762000, - 1366069765000, - 1366069768000, - 1366069772000, - 1366069775000, - 1366069778000, - 1366069781000, - 1366069784000, - 1366069786000, - 1366069788000, - 1366069790000, - 1366069792000, - 1366069794000, - 1366069796000, - 1366069798000, - 1366069800000, - 1366069802000, - 1366069804000, - 1366069806000, - 1366069808000, - 1366069810000, - 1366069811000, - 1366069812000, - 1366069813000, - 1366069814000, - 1366069815000, - 1366069816000, - 1366069817000, - 1366069818000, - 1366069819000, - 1366069820000, - 1366069821000, - 1366069822000, - 1366069823000, - 1366069824000, - 1366069825000, - 1366069826000, - 1366069827000, - 1366069828000, - 1366069829000, - 1366069830000, - 1366069831000, - 1366069832000, - 1366069833000, - 1366069834000, - 1366069836000, - 1366069838000, - 1366069840000, - 1366069842000, - 1366069844000, - 1366069846000, - 1366069848000, - 1366069850000, - 1366069851000, - 1366069852000, - 1366069853000, - 1366069854000, - 1366069855000, - 1366069856000, - 1366069857000, - 1366069858000, - 1366069859000, - 1366069860000, - 1366069861000, - 1366069862000, - 1366069863000, - 1366069864000, - 1366069865000, - 1366069866000, - 1366069867000, - 1366069868000, - 1366069869000, - 1366069870000, - 1366069871000, - 1366069872000, - 1366069873000, - 1366069874000, - 1366069875000, - 1366069876000, - 1366069877000, - 1366069878000, - 1366069879000, - 1366069880000, - 1366069881000, - 1366069882000, - 1366069883000, - 1366069884000, - 1366069885000, - 1366069886000, - 1366069887000, - 1366069888000, - 1366069889000, - 1366069890000, - 1366069891000, - 1366069892000, - 1366069894000, - 1366069895000, - 1366069898000, - 1366069915000, - 1366069929000, - 1366069931000, - 1366069933000, - 1366069934000, - 1366069936000, - 1366069938000, - 1366069940000, - 1366069942000, - 1366069944000, - 1366069946000, - 1366069948000, - 1366069951000, - 1366069954000, - 1366069955000, - 1366069957000, - 1366069958000, - 1366069960000, - 1366069961000, - 1366069964000, - 1366069966000, - 1366069971000, - 1366069980000, - 1366069983000, - 1366069986000, - 1366069988000, - 1366069991000, - 1366069993000, - 1366069994000, - 1366069996000, - 1366069998000, - 1366070000000, - 1366070002000, - 1366070004000, - 1366070007000, - 1366070008000, - 1366070011000, - 1366070014000, - 1366070016000, - 1366070018000, - 1366070020000, - 1366070022000, - 1366070024000, - 1366070025000, - 1366070027000, - 1366070028000, - 1366070030000, - 1366070031000, - 1366070033000, - 1366070034000, - 1366070035000, - 1366070037000, - 1366070038000, - 1366070040000, - 1366070041000, - 1366070043000, - 1366070044000, - 1366070046000, - 1366070047000, - 1366070049000, - 1366070050000, - 1366070051000, - 1366070053000, - 1366070054000, - 1366070057000, - 1366070058000, - 1366070060000, - 1366070061000, - 1366070064000, - 1366070065000, - 1366070067000, - 1366070068000, - 1366070070000, - 1366070071000, - 1366070073000, - 1366070074000, - 1366070076000, - 1366070079000, - 1366070082000, - 1366070085000, - 1366070088000, - 1366070091000, - 1366070092000, - 1366070094000, - 1366070095000, - 1366070097000, - 1366070098000, - 1366070100000, - 1366070101000, - 1366070103000, - 1366070104000, - 1366070106000, - 1366070107000, - 1366070109000, - 1366070110000, - 1366070112000, - 1366070113000, - 1366070115000, - 1366070116000, - 1366070118000, - 1366070119000, - 1366070120000, - 1366070122000, - 1366070123000, - 1366070125000, - 1366070126000, - 1366070128000, - 1366070129000, - 1366070130000, - 1366070132000, - 1366070135000, - 1366070138000, - 1366070141000, - 1366070144000, - 1366070147000, - 1366070151000, - 1366070155000, - 1366070156000, - 1366070158000, - 1366070159000, - 1366070161000, - 1366070162000, - 1366070164000, - 1366070165000, - 1366070167000, - 1366070168000, - 1366070170000, - 1366070171000, - 1366070172000, - 1366070173000, - 1366070174000, - 1366070175000, - 1366070177000, - 1366070180000, - 1366070183000, - 1366070188000, - 1366070192000, - 1366070195000 - ], - "speed": [ - 22, - 24, - 42, - 48, - 52, - 52, - 53, - 53, - 53, - 52, - 50, - 50, - 51, - 46, - 40, - 36, - 21, - 14, - 0, - 26, - 33, - 38, - 39, - 41, - 45, - 46, - 50, - 50, - 50, - 51, - 52, - 52, - 52, - 52, - 54, - 53, - 55, - 55, - 56, - 59, - 58, - 58, - 58, - 59, - 59, - 60, - 60, - 62, - 59, - 59, - 59, - 59, - 59, - 60, - 60, - 60, - 60, - 59, - 60, - 61, - 61, - 60, - 61, - 61, - 61, - 61, - 61, - 61, - 64, - 63, - 62, - 63, - 62, - 62, - 59, - 59, - 59, - 59, - 59, - 58, - 59, - 58, - 55, - 53, - 52, - 52, - 55, - 58, - 55, - 58, - 59, - 59, - 59, - 59, - 61, - 60, - 59, - 60, - 64, - 68, - 67, - 65, - 63, - 65, - 71, - 73, - 76, - 77, - 81, - 84, - 85, - 83, - 84, - 82, - 83, - 81, - 82, - 78, - 80, - 82, - 81, - 83, - 82, - 81, - 80, - 80, - 85, - 83, - 81, - 77, - 78, - 77, - 77, - 76, - 73, - 73, - 71, - 71, - 70, - 70, - 73, - 73, - 68, - 68, - 75, - 77, - 76, - 70, - 51, - 32, - 34, - 31, - 38, - 39, - 40, - 42, - 46, - 47, - 47, - 47, - 44, - 39, - 38, - 40, - 40, - 41, - 43, - 43, - 45, - 47, - 44, - 46, - 48, - 49, - 50, - 51, - 52, - 52, - 54, - 52, - 52, - 52, - 51, - 50, - 45, - 42, - 42, - 41, - 40, - 25, - 19, - 31, - 41, - 44, - 43, - 40, - 37, - 38, - 40, - 42, - 41, - 38, - 35, - 29, - 20, - 31, - 33, - 37, - 41, - 42, - 43, - 42, - 41, - 42, - 42, - 41, - 37, - 11, - 39, - 47, - 51, - 51, - 52, - 53, - 54, - 56, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 66, - 67, - 68, - 67, - 66, - 66, - 65, - 63, - 63, - 64, - 66, - 67, - 68, - 68, - 68, - 68, - 68, - 68, - 68, - 69, - 70, - 73, - 83, - 94, - 104, - 100, - 95, - 91, - 86, - 79, - 76, - 72, - 68, - 66, - 62, - 59, - 57, - 57, - 57, - 57, - 57, - 57, - 55, - 55, - 56, - 54, - 51, - 52, - 54, - 54, - 57, - 59, - 63, - 64, - 66, - 67, - 68, - 70, - 73, - 73, - 70, - 59, - 36, - 46, - 58, - 60, - 63, - 65, - 65, - 64, - 65, - 65, - 66, - 65, - 61, - 58, - 54, - 50, - 46, - 42, - 41, - 40, - 39, - 39, - 42, - 57, - 61, - 63, - 64, - 64, - 64, - 63, - 63, - 64, - 64, - 68, - 64, - 63, - 64, - 65, - 66, - 68, - 68, - 69, - 70, - 68, - 65, - 64, - 60, - 59, - 58, - 57, - 59, - 61, - 64, - 60, - 59, - 56, - 51, - 44, - 7, - 36, - 56, - 65, - 73, - 80, - 82, - 83, - 82, - 82, - 81, - 81, - 81, - 83, - 84, - 83, - 82, - 81, - 80, - 78, - 77, - 77, - 78, - 78, - 78, - 79, - 78, - 78, - 77, - 77, - 77, - 77, - 75, - 75, - 73, - 72, - 72, - 71, - 73, - 73, - 74, - 70, - 65, - 54, - 46, - 20, - 43, - 57, - 62, - 68, - 69, - 70, - 68, - 67, - 67, - 63, - 61, - 59, - 59, - 58, - 50, - 52, - 59, - 59, - 58, - 46, - 20, - 30, - 36, - 33, - 35, - 36, - 37, - 34, - 27, - 23, - 30, - 37, - 37, - 41, - 41, - 41, - 44, - 42, - 40, - 39, - 32, - 32, - 32, - 32, - 35, - 45, - 46, - 50, - 51, - 50, - 47, - 35, - 27, - 38, - 48, - 53, - 52, - 52, - 54, - 54, - 54, - 52, - 56, - 43, - 30, - 24, - 26, - 34, - 39, - 39, - 41, - 42, - 41, - 37, - 23, - 36, - 51, - 56, - 59, - 60, - 59, - 59, - 61, - 51, - 50, - 45, - 43, - 33, - 14, - 25, - 33, - 21, - 33, - 39, - 46, - 45, - 43, - 44, - 45, - 45, - 46, - 47, - 45, - 41, - 39, - 41, - 46, - 42, - 36, - 41, - 50, - 51, - 52, - 55, - 55, - 54, - 49, - 45, - 38, - 35, - 53, - 61, - 65, - 66, - 67, - 68, - 68, - 69, - 69, - 71, - 71, - 73, - 72, - 72, - 71, - 70, - 70, - 70, - 69, - 69, - 69, - 69, - 69, - 68, - 68, - 68, - 68, - 68, - 68, - 61, - 59, - 34, - 24, - 37, - 45, - 45, - 45, - 40, - 28, - 31, - 41, - 23, - 40, - 48, - 47, - 45, - 41, - 28, - 33, - 50, - 55, - 59, - 60, - 62, - 63, - 63, - 64, - 65, - 63, - 64, - 62, - 62, - 65, - 67, - 68, - 68, - 68, - 68, - 76, - 80, - 80, - 83, - 81, - 79, - 79, - 78, - 77, - 82, - 81, - 79, - 79, - 77, - 76, - 76, - 77, - 76, - 77, - 77, - 77, - 77, - 76, - 77, - 78, - 79, - 77, - 77, - 77, - 75, - 77, - 77, - 77, - 77, - 75, - 77, - 77, - 76, - 77, - 77, - 77, - 77, - 77, - 75, - 70, - 68, - 66, - 66, - 65, - 66, - 66, - 66, - 66, - 67, - 64, - 62, - 61, - 63, - 63, - 64, - 65, - 64, - 65, - 64, - 65, - 66, - 68, - 67, - 68, - 67, - 69, - 70, - 71, - 70, - 71, - 73, - 72, - 74, - 75, - 75, - 74, - 69, - 68, - 67, - 67, - 68, - 67, - 67, - 67, - 67, - 69, - 75, - 76, - 75, - 69, - 68, - 67, - 68, - 68, - 71, - 74, - 76, - 75, - 76, - 76, - 76, - 76, - 75, - 74, - 76, - 74, - 73, - 71, - 66, - 58, - 56, - 59, - 64, - 67, - 68, - 68, - 70, - 71, - 70, - 71, - 71, - 69, - 69, - 71, - 70, - 72, - 72, - 71, - 72, - 72, - 74, - 74, - 73, - 72, - 74, - 77, - 77, - 76, - 73, - 73, - 71, - 68, - 65, - 60, - 59, - 60, - 60, - 60, - 60, - 61, - 62, - 62, - 63, - 61, - 62, - 62, - 63, - 61, - 62, - 63, - 64, - 67, - 65, - 62, - 61, - 62, - 60, - 59, - 58, - 58, - 53, - 49, - 42, - 27, - 19, - 29, - 26, - 23, - 28, - 32, - 32, - 33, - 33, - 33, - 23, - 25, - 30, - 19, - 20, - 30, - 30, - 31, - 29, - 23, - 27, - 32, - 37, - 37, - 32, - 24, - 40, - 40, - 24, - 35, - 41, - 5, - 36, - 40, - 37, - 24, - 42, - 50, - 51, - 51, - 50, - 50, - 52, - 53, - 52, - 41, - 20, - 22, - 41, - 46, - 44, - 43, - 44, - 43, - 41, - 44, - 47, - 51, - 52, - 52, - 50, - 49, - 49, - 45, - 46, - 47, - 47, - 51, - 55, - 57, - 58, - 60, - 61, - 61, - 62, - 63, - 63, - 63, - 62, - 63, - 63, - 63, - 63, - 63, - 63, - 63, - 64, - 64, - 66, - 67, - 66, - 66, - 65, - 65, - 64, - 64, - 65, - 66, - 67, - 67, - 68, - 68, - 68, - 69, - 68, - 70, - 70, - 70, - 70, - 70, - 69, - 68, - 66, - 67, - 66, - 66, - 66, - 66, - 67, - 69, - 71, - 73, - 75, - 77, - 80, - 81, - 82, - 82, - 81, - 80, - 78, - 76, - 77, - 77, - 79, - 79, - 79, - 78, - 80, - 79, - 78, - 79, - 77, - 77, - 77, - 77, - 76, - 72, - 69, - 73, - 73, - 72, - 74, - 74, - 74, - 74, - 74, - 76, - 77, - 77, - 76, - 75, - 71, - 73, - 66, - 58, - 43, - 22, - 44, - 52, - 57, - 62, - 64, - 65, - 65, - 64, - 62, - 63, - 62, - 59, - 59, - 59, - 59, - 59, - 60, - 62, - 63, - 63, - 62, - 64, - 68, - 71, - 75, - 75, - 75, - 75, - 74, - 71, - 72, - 71, - 72, - 74, - 73, - 75, - 74, - 73, - 73, - 73, - 72, - 71, - 68, - 65, - 62, - 59, - 54, - 41, - 24, - 27, - 40, - 54, - 58, - 63, - 66, - 68, - 68, - 67, - 67, - 66, - 67, - 67, - 61, - 56, - 51, - 36, - 33, - 32, - 38, - 42, - 49, - 50, - 55, - 50, - 50, - 45, - 41, - 42, - 40, - 39, - 40, - 41, - 47, - 50, - 53, - 57, - 59, - 61, - 63, - 68, - 66, - 65, - 64, - 67, - 67, - 65, - 64, - 65, - 66, - 66, - 67, - 66, - 65, - 64, - 64, - 65, - 67, - 68, - 70, - 72, - 73, - 76, - 77, - 77, - 77, - 77, - 77, - 77, - 77, - 78, - 79, - 81, - 83, - 83, - 81, - 79, - 77, - 76, - 77, - 77, - 77, - 77, - 77, - 79, - 79, - 78, - 77, - 79, - 78, - 79, - 79, - 79, - 79, - 80, - 80, - 80, - 79, - 79, - 80, - 79, - 79, - 79, - 77, - 76, - 74, - 74, - 73, - 73, - 72, - 71, - 71, - 71, - 70, - 69, - 68, - 68, - 66, - 65, - 62, - 59, - 57, - 45, - 41, - 25, - 0, - 18, - 27, - 38, - 42, - 52, - 59, - 62, - 64, - 64, - 64, - 58, - 50, - 47, - 47, - 46, - 44, - 41, - 38, - 23, - 15, - 2, - 13, - 15, - 20, - 22, - 24, - 25, - 25, - 26, - 26, - 27, - 30, - 28, - 28, - 29, - 22, - 21, - 28, - 32, - 32, - 33, - 36, - 38, - 39, - 40, - 41, - 41, - 42, - 43, - 43, - 44, - 43, - 43, - 41, - 41, - 41, - 41, - 43, - 48, - 43, - 41, - 40, - 40, - 39, - 39, - 39, - 39, - 36, - 37, - 41, - 42, - 46, - 48, - 49, - 48, - 47, - 48, - 42, - 41, - 43, - 41, - 41, - 41, - 42, - 43, - 43, - 43, - 44, - 45, - 45, - 46, - 46, - 46, - 46, - 44, - 43, - 44, - 46, - 46, - 48, - 49, - 48, - 50, - 48, - 49, - 49, - 51, - 52, - 50, - 50, - 49, - 46, - 44, - 37, - 28, - 36, - 38, - 41, - 43, - 45, - 46, - 46, - 47, - 48, - 48, - 49, - 50, - 52, - 52, - 53, - 54, - 53, - 50, - 36, - 32, - 34, - 32 - ], - "altitude": [ - 38, - 39, - 39, - 38, - 38, - 38, - 39, - 38, - 38, - 37, - 37, - 38, - 39, - 39, - 39, - 40, - 40, - 40, - 40, - 41, - 40, - 41, - 41, - 41, - 40, - 40, - 40, - 41, - 40, - 40, - 40, - 40, - 40, - 41, - 41, - 41, - 42, - 42, - 42, - 42, - 42, - 42, - 43, - 43, - 43, - 44, - 43, - 44, - 44, - 44, - 43, - 42, - 41, - 43, - 43, - 43, - 43, - 43, - 43, - 43, - 43, - 44, - 43, - 43, - 44, - 43, - 43, - 43, - 43, - 43, - 43, - 43, - 42, - 42, - 43, - 43, - 43, - 43, - 43, - 43, - 43, - 43, - 43, - 43, - 43, - 42, - 42, - 44, - 44, - 44, - 44, - 44, - 43, - 41, - 42, - 42, - 43, - 42, - 42, - 42, - 42, - 42, - 42, - 42, - 41, - 41, - 41, - 41, - 41, - 41, - 41, - 40, - 40, - 40, - 40, - 39, - 39, - 39, - 40, - 40, - 39, - 39, - 39, - 39, - 39, - 40, - 40, - 40, - 40, - 39, - 39, - 39, - 40, - 40, - 40, - 41, - 41, - 40, - 40, - 40, - 39, - 40, - 40, - 39, - 40, - 39, - 37, - 36, - 35, - 38, - 37, - 38, - 39, - 40, - 40, - 40, - 40, - 38, - 37, - 39, - 38, - 39, - 39, - 39, - 39, - 39, - 39, - 43, - 44, - 45, - 46, - 45, - 45, - 46, - 45, - 45, - 45, - 46, - 45, - 45, - 45, - 46, - 46, - 47, - 47, - 48, - 48, - 48, - 48, - 48, - 49, - 47, - 46, - 47, - 47, - 47, - 47, - 47, - 47, - 47, - 48, - 48, - 49, - 49, - 49, - 49, - 48, - 49, - 50, - 50, - 51, - 51, - 52, - 52, - 52, - 52, - 52, - 52, - 51, - 51, - 51, - 52, - 52, - 52, - 51, - 51, - 51, - 51, - 51, - 51, - 51, - 51, - 51, - 51, - 51, - 50, - 49, - 48, - 48, - 49, - 49, - 49, - 50, - 50, - 50, - 50, - 50, - 50, - 50, - 50, - 51, - 51, - 51, - 51, - 51, - 51, - 52, - 51, - 51, - 51, - 51, - 51, - 50, - 50, - 49, - 49, - 48, - 48, - 48, - 48, - 47, - 48, - 48, - 47, - 47, - 47, - 47, - 49, - 49, - 49, - 49, - 50, - 50, - 51, - 51, - 52, - 52, - 52, - 52, - 52, - 51, - 52, - 52, - 52, - 52, - 51, - 51, - 51, - 51, - 51, - 51, - 51, - 52, - 52, - 52, - 51, - 51, - 51, - 51, - 50, - 50, - 50, - 50, - 51, - 50, - 50, - 49, - 49, - 49, - 49, - 49, - 49, - 48, - 48, - 48, - 48, - 48, - 48, - 49, - 48, - 48, - 48, - 48, - 48, - 48, - 48, - 48, - 49, - 51, - 52, - 53, - 55, - 54, - 54, - 54, - 57, - 59, - 60, - 60, - 61, - 62, - 62, - 63, - 65, - 66, - 66, - 65, - 64, - 64, - 63, - 65, - 65, - 63, - 62, - 63, - 61, - 61, - 61, - 62, - 63, - 64, - 65, - 65, - 67, - 68, - 69, - 69, - 69, - 70, - 69, - 70, - 70, - 70, - 70, - 71, - 71, - 70, - 71, - 71, - 71, - 70, - 71, - 71, - 72, - 73, - 72, - 72, - 72, - 71, - 73, - 73, - 71, - 71, - 71, - 71, - 71, - 71, - 70, - 72, - 73, - 74, - 74, - 75, - 76, - 77, - 76, - 74, - 73, - 74, - 75, - 78, - 80, - 81, - 82, - 83, - 82, - 83, - 84, - 85, - 85, - 88, - 91, - 90, - 91, - 92, - 93, - 93, - 94, - 97, - 99, - 99, - 100, - 101, - 101, - 101, - 100, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 107, - 107, - 107, - 106, - 106, - 107, - 108, - 106, - 106, - 104, - 104, - 104, - 103, - 103, - 101, - 101, - 100, - 98, - 96, - 93, - 91, - 89, - 87, - 85, - 84, - 81, - 80, - 78, - 78, - 76, - 78, - 78, - 77, - 77, - 76, - 77, - 74, - 72, - 71, - 71, - 72, - 71, - 71, - 71, - 70, - 70, - 71, - 71, - 71, - 73, - 72, - 72, - 71, - 71, - 70, - 71, - 71, - 71, - 73, - 74, - 75, - 80, - 81, - 84, - 85, - 83, - 83, - 82, - 80, - 80, - 79, - 78, - 77, - 75, - 73, - 73, - 72, - 71, - 71, - 72, - 71, - 71, - 71, - 71, - 72, - 71, - 71, - 71, - 71, - 71, - 71, - 70, - 69, - 68, - 67, - 67, - 67, - 67, - 66, - 65, - 65, - 65, - 65, - 65, - 66, - 66, - 68, - 66, - 66, - 66, - 67, - 67, - 66, - 65, - 65, - 64, - 62, - 62, - 62, - 62, - 62, - 64, - 64, - 65, - 65, - 64, - 63, - 62, - 63, - 63, - 64, - 65, - 66, - 65, - 65, - 64, - 64, - 64, - 65, - 66, - 66, - 66, - 66, - 66, - 65, - 65, - 64, - 64, - 64, - 63, - 63, - 63, - 64, - 64, - 63, - 64, - 65, - 65, - 65, - 66, - 66, - 67, - 67, - 67, - 67, - 67, - 67, - 67, - 67, - 67, - 67, - 69, - 70, - 70, - 70, - 72, - 72, - 72, - 73, - 73, - 74, - 74, - 74, - 74, - 74, - 74, - 74, - 74, - 75, - 75, - 75, - 75, - 75, - 75, - 75, - 76, - 76, - 75, - 76, - 76, - 76, - 77, - 76, - 77, - 76, - 75, - 75, - 75, - 75, - 75, - 74, - 73, - 71, - 73, - 75, - 75, - 75, - 74, - 75, - 74, - 74, - 75, - 75, - 75, - 76, - 75, - 75, - 73, - 74, - 73, - 72, - 71, - 71, - 71, - 70, - 70, - 69, - 69, - 69, - 69, - 69, - 68, - 67, - 66, - 68, - 68, - 68, - 68, - 68, - 68, - 67, - 67, - 67, - 66, - 65, - 65, - 63, - 64, - 63, - 63, - 63, - 63, - 62, - 61, - 62, - 61, - 60, - 60, - 60, - 60, - 61, - 62, - 62, - 62, - 62, - 62, - 62, - 62, - 62, - 62, - 62, - 61, - 63, - 62, - 62, - 62, - 60, - 61, - 62, - 61, - 60, - 60, - 60, - 59, - 60, - 61, - 60, - 60, - 60, - 59, - 58, - 57, - 57, - 54, - 54, - 55, - 57, - 57, - 57, - 57, - 57, - 57, - 60, - 61, - 61, - 61, - 63, - 63, - 66, - 70, - 72, - 71, - 71, - 71, - 69, - 71, - 71, - 71, - 71, - 69, - 67, - 66, - 66, - 65, - 67, - 67, - 67, - 69, - 70, - 70, - 65, - 66, - 64, - 64, - 63, - 63, - 62, - 60, - 60, - 60, - 60, - 60, - 59, - 61, - 61, - 60, - 60, - 60, - 61, - 59, - 60, - 60, - 61, - 64, - 66, - 66, - 65, - 65, - 65, - 67, - 66, - 67, - 66, - 68, - 67, - 67, - 67, - 67, - 66, - 66, - 66, - 66, - 65, - 65, - 65, - 65, - 65, - 65, - 66, - 66, - 66, - 66, - 66, - 66, - 64, - 64, - 63, - 63, - 64, - 64, - 64, - 65, - 65, - 65, - 65, - 64, - 63, - 63, - 63, - 63, - 63, - 63, - 63, - 63, - 63, - 64, - 64, - 63, - 65, - 64, - 64, - 65, - 65, - 66, - 65, - 66, - 67, - 67, - 68, - 68, - 69, - 69, - 68, - 68, - 69, - 68, - 68, - 67, - 66, - 67, - 67, - 67, - 67, - 68, - 69, - 69, - 70, - 71, - 70, - 70, - 70, - 70, - 70, - 71, - 70, - 70, - 71, - 70, - 70, - 70, - 71, - 71, - 70, - 70, - 70, - 71, - 71, - 69, - 69, - 69, - 69, - 68, - 69, - 68, - 67, - 67, - 67, - 67, - 66, - 62, - 61, - 61, - 61, - 61, - 62, - 62, - 61, - 60, - 60, - 59, - 58, - 58, - 58, - 58, - 58, - 58, - 59, - 59, - 58, - 58, - 59, - 60, - 59, - 59, - 59, - 61, - 61, - 61, - 62, - 62, - 63, - 61, - 61, - 61, - 60, - 60, - 59, - 59, - 59, - 60, - 59, - 59, - 58, - 57, - 56, - 55, - 56, - 57, - 56, - 58, - 57, - 58, - 58, - 59, - 59, - 59, - 58, - 56, - 57, - 56, - 56, - 56, - 56, - 55, - 55, - 54, - 53, - 53, - 53, - 53, - 51, - 51, - 51, - 50, - 51, - 51, - 51, - 51, - 50, - 49, - 48, - 48, - 47, - 47, - 46, - 46, - 47, - 48, - 48, - 48, - 50, - 50, - 49, - 50, - 50, - 50, - 51, - 51, - 51, - 52, - 53, - 53, - 53, - 53, - 53, - 54, - 54, - 54, - 55, - 54, - 54, - 52, - 53, - 52, - 52, - 52, - 51, - 51, - 51, - 50, - 51, - 51, - 50, - 50, - 50, - 50, - 51, - 50, - 49, - 49, - 49, - 49, - 49, - 50, - 50, - 49, - 50, - 50, - 50, - 50, - 50, - 50, - 49, - 50, - 50, - 50, - 50, - 51, - 51, - 51, - 51, - 52, - 52, - 52, - 52, - 52, - 51, - 51, - 50, - 50, - 50, - 50, - 50, - 50, - 49, - 49, - 49, - 49, - 49, - 49, - 49, - 48, - 47, - 46, - 49, - 47, - 48, - 49, - 50, - 50, - 50, - 49, - 50, - 52, - 51, - 51, - 52, - 52, - 52, - 53, - 54, - 53, - 52, - 50, - 50, - 50, - 48, - 49, - 48, - 47, - 45, - 44, - 45, - 46, - 46, - 46, - 48, - 49, - 48, - 48, - 47, - 47, - 46, - 46, - 45, - 46, - 46, - 45, - 45, - 46, - 45, - 45, - 45, - 45, - 45, - 45, - 44, - 44, - 44, - 44, - 44, - 44, - 44, - 45, - 45, - 46, - 46, - 45, - 45, - 45, - 45, - 44, - 44, - 44, - 44, - 45, - 43, - 43, - 44, - 44, - 44, - 43, - 43, - 43, - 43, - 45, - 46, - 44, - 45, - 45, - 45, - 45, - 46, - 45, - 46, - 46, - 46, - 46, - 47, - 46, - 46, - 46, - 59, - 59, - 59, - 59, - 58, - 55, - 54, - 54, - 54, - 55, - 56, - 57, - 56, - 56, - 57, - 56, - 55, - 53, - 53, - 52, - 52, - 52, - 51, - 51, - 51, - 50, - 50, - 51, - 51, - 51, - 51, - 51, - 50, - 51, - 50, - 49, - 49, - 49, - 48, - 48 - ], - "heading": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "horizontal_accuracy": [ - 3, - 4, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 3, - 3, - 4, - 3, - 4, - 4, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 3, - 3, - 4, - 3, - 3, - 4, - 3, - 4, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 3, - 4, - 4, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 5, - 7, - 9, - 11, - 12, - 13, - 12, - 13, - 13, - 14, - 11, - 12, - 11, - 10, - 11, - 9, - 7, - 6, - 6, - 6, - 6, - 7, - 6, - 6, - 6, - 6, - 6, - 6, - 6, - 6, - 7, - 7, - 7, - 7, - 6, - 6, - 6, - 6, - 7, - 9, - 9, - 9, - 8, - 8, - 9, - 9, - 9, - 8, - 8, - 8, - 7, - 6, - 6, - 7, - 8, - 8, - 7, - 7, - 6, - 7, - 7, - 7, - 8, - 7, - 7, - 7, - 5, - 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, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 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, - 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, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 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, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 4, - 4, - 4, - 3, - 4, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 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, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 3, - 4, - 3, - 4, - 4, - 3, - 3, - 3, - 4, - 4, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 6, - 6, - 5, - 4, - 5, - 5, - 6, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 4, - 4, - 5, - 5, - 5, - 5, - 5, - 5, - 5, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 3, - 4, - 3, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 3, - 4, - 4, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 4, - 4, - 3, - 3, - 3, - 4, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 4, - 4, - 4, - 3, - 4, - 4, - 3, - 3, - 4, - 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, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 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, - 5, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 5, - 5, - 5, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 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, - 3, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 3, - 3, - 3, - 4, - 4, - 3, - 4, - 4, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 4, - 3, - 4, - 3, - 3, - 3, - 4, - 4, - 4, - 3, - 3, - 4, - 3, - 3, - 4, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 3, - 3, - 3, - 3, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 4, - 4, - 4, - 4, - 4, - 5, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 5, - 5, - 4, - 4, - 4, - 4, - 4, - 5, - 5, - 5, - 5, - 5, - 6, - 5, - 5, - 5, - 5, - 5, - 5, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 3, - 3, - 4, - 4, - 4, - 3, - 4, - 3, - 4, - 4, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 3, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 5, - 5, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 3, - 4, - 4, - 4, - 3, - 4, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 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, - 3, - 3, - 3, - 3, - 4, - 4, - 3, - 4, - 4, - 3, - 3, - 4, - 3, - 4, - 4, - 4, - 3, - 3, - 3, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 7, - 6, - 6, - 6, - 6, - 5, - 5, - 5, - 5, - 5, - 5, - 4, - 4, - 5, - 4, - 5, - 5, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 5, - 5, - 5, - 5, - 5, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 3, - 3, - 4, - 4, - 3, - 4, - 4, - 4 - ], - "vertical_accuracy": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "raw": [] - }, - "bbox": [ - [ - -123.38190531, - 44.47254914 - ], - [ - -123.38190531, - 44.56751068 - ], - [ - -123.25225519, - 44.56751068 - ], - [ - -123.25225519, - 44.47254914 - ] - ] -} \ No newline at end of file diff --git a/inst/examples/playback/drive1.json b/inst/examples/playback/drive1.json deleted file mode 100644 index da916167..00000000 --- a/inst/examples/playback/drive1.json +++ /dev/null @@ -1,10133 +0,0 @@ -{ - "type": "Feature", - "geometry": { - "type": "MultiPoint", - "coordinates": [ - [ - -123.77252789, - 44.37857221 - ], - [ - -123.77317087, - 44.37864694 - ], - [ - -123.77383407, - 44.37875853 - ], - [ - -123.7744676, - 44.37886305 - ], - [ - -123.77507677, - 44.37893017 - ], - [ - -123.77566451, - 44.37901047 - ], - [ - -123.77605842, - 44.37892161 - ], - [ - -123.77660114, - 44.37895724 - ], - [ - -123.77720403, - 44.37897655 - ], - [ - -123.77781983, - 44.37900344 - ], - [ - -123.77838906, - 44.37898221 - ], - [ - -123.7789954, - 44.37899854 - ], - [ - -123.77951988, - 44.37891571 - ], - [ - -123.78004217, - 44.37883105 - ], - [ - -123.78056503, - 44.37875077 - ], - [ - -123.78105914, - 44.37868172 - ], - [ - -123.78156765, - 44.37852908 - ], - [ - -123.78211778, - 44.37847079 - ], - [ - -123.78269313, - 44.37840336 - ], - [ - -123.78319893, - 44.37834025 - ], - [ - -123.79013846, - 44.37675321 - ], - [ - -123.79067206, - 44.37666117 - ], - [ - -123.79122235, - 44.37667708 - ], - [ - -123.79156935, - 44.37655781 - ], - [ - -123.79231801, - 44.37652196 - ], - [ - -123.79301538, - 44.37651473 - ], - [ - -123.79359988, - 44.37656075 - ], - [ - -123.79428722, - 44.37655133 - ], - [ - -123.79487322, - 44.37661456 - ], - [ - -123.79548606, - 44.37666101 - ], - [ - -123.79603541, - 44.37670013 - ], - [ - -123.79660795, - 44.37662235 - ], - [ - -123.79718365, - 44.37650581 - ], - [ - -123.79780967, - 44.37653439 - ], - [ - -123.79831292, - 44.37685522 - ], - [ - -123.79883296, - 44.37696685 - ], - [ - -123.7993581, - 44.37709195 - ], - [ - -123.79988118, - 44.37718879 - ], - [ - -123.80039793, - 44.37728202 - ], - [ - -123.80089376, - 44.37738925 - ], - [ - -123.80142092, - 44.37766936 - ], - [ - -123.80179753, - 44.37789379 - ], - [ - -123.80233272, - 44.37795562 - ], - [ - -123.80277717, - 44.37816047 - ], - [ - -123.80331138, - 44.3783486 - ], - [ - -123.80381643, - 44.37850233 - ], - [ - -123.80420021, - 44.37865152 - ], - [ - -123.80474815, - 44.37882091 - ], - [ - -123.80522525, - 44.37906232 - ], - [ - -123.80570349, - 44.37922411 - ], - [ - -123.80620571, - 44.37941275 - ], - [ - -123.80673037, - 44.37965326 - ], - [ - -123.80735339, - 44.37979863 - ], - [ - -123.80784469, - 44.37999957 - ], - [ - -123.80837458, - 44.37998017 - ], - [ - -123.80899232, - 44.380014 - ], - [ - -123.80952307, - 44.37993165 - ], - [ - -123.80987634, - 44.37978153 - ], - [ - -123.81017161, - 44.37953295 - ], - [ - -123.81074873, - 44.37925199 - ], - [ - -123.81119243, - 44.37897587 - ], - [ - -123.81154793, - 44.37873989 - ], - [ - -123.81198778, - 44.37842102 - ], - [ - -123.81235373, - 44.37816192 - ], - [ - -123.81275348, - 44.37788448 - ], - [ - -123.81310351, - 44.37766604 - ], - [ - -123.81337983, - 44.37730145 - ], - [ - -123.81357531, - 44.37692989 - ], - [ - -123.81361254, - 44.37647844 - ], - [ - -123.81353376, - 44.37594116 - ], - [ - -123.813198, - 44.37561605 - ], - [ - -123.81284754, - 44.37547955 - ], - [ - -123.81254975, - 44.37524719 - ], - [ - -123.81227721, - 44.37500803 - ], - [ - -123.81207289, - 44.3746695 - ], - [ - -123.81171276, - 44.37434638 - ], - [ - -123.81097859, - 44.37413431 - ], - [ - -123.81041401, - 44.37394429 - ], - [ - -123.80976458, - 44.37373029 - ], - [ - -123.80923389, - 44.37352906 - ], - [ - -123.80863022, - 44.37335692 - ], - [ - -123.80827452, - 44.37322894 - ], - [ - -123.8079216, - 44.37304699 - ], - [ - -123.80755687, - 44.37290854 - ], - [ - -123.80710749, - 44.37269837 - ], - [ - -123.80659847, - 44.37245911 - ], - [ - -123.80613857, - 44.37221401 - ], - [ - -123.80573546, - 44.37193255 - ], - [ - -123.80540784, - 44.37151577 - ], - [ - -123.80511308, - 44.37120469 - ], - [ - -123.80500888, - 44.37078896 - ], - [ - -123.80529524, - 44.37037566 - ], - [ - -123.80558562, - 44.37019806 - ], - [ - -123.80585412, - 44.36996992 - ], - [ - -123.80610692, - 44.36970942 - ], - [ - -123.80661414, - 44.36946727 - ], - [ - -123.80708477, - 44.36926607 - ], - [ - -123.80747679, - 44.36907467 - ], - [ - -123.80784949, - 44.368733 - ], - [ - -123.80826348, - 44.36838459 - ], - [ - -123.80868817, - 44.36802111 - ], - [ - -123.80912729, - 44.36773598 - ], - [ - -123.80960812, - 44.36738742 - ], - [ - -123.81008551, - 44.36707347 - ], - [ - -123.81063481, - 44.36684946 - ], - [ - -123.81115119, - 44.36661789 - ], - [ - -123.811705, - 44.36640043 - ], - [ - -123.81227943, - 44.36624681 - ], - [ - -123.81272103, - 44.36622733 - ], - [ - -123.81348991, - 44.36635102 - ], - [ - -123.81411031, - 44.36622347 - ], - [ - -123.81475065, - 44.3661859 - ], - [ - -123.81536292, - 44.36625908 - ], - [ - -123.8160232, - 44.36634012 - ], - [ - -123.81661561, - 44.36646415 - ], - [ - -123.81719049, - 44.36652826 - ], - [ - -123.81784426, - 44.36665079 - ], - [ - -123.81846565, - 44.36680154 - ], - [ - -123.81905878, - 44.36690594 - ], - [ - -123.81970058, - 44.36704457 - ], - [ - -123.82030833, - 44.36728783 - ], - [ - -123.82091327, - 44.36747762 - ], - [ - -123.82156675, - 44.36747158 - ], - [ - -123.82213205, - 44.36750236 - ], - [ - -123.8227688, - 44.36753587 - ], - [ - -123.82339934, - 44.36749609 - ], - [ - -123.82400308, - 44.36747441 - ], - [ - -123.82437384, - 44.36736178 - ], - [ - -123.82498006, - 44.36711433 - ], - [ - -123.82554355, - 44.36692204 - ], - [ - -123.82599663, - 44.36659999 - ], - [ - -123.82653738, - 44.36631833 - ], - [ - -123.82687629, - 44.36595919 - ], - [ - -123.82730895, - 44.36559104 - ], - [ - -123.82752535, - 44.36508675 - ], - [ - -123.82778797, - 44.36466732 - ], - [ - -123.8280572, - 44.36424929 - ], - [ - -123.82826364, - 44.36381812 - ], - [ - -123.8284935, - 44.36337296 - ], - [ - -123.82872595, - 44.36288338 - ], - [ - -123.82894503, - 44.36243078 - ], - [ - -123.82914801, - 44.36196883 - ], - [ - -123.82942984, - 44.36158184 - ], - [ - -123.82967989, - 44.36114209 - ], - [ - -123.82984482, - 44.36067615 - ], - [ - -123.83000072, - 44.36021653 - ], - [ - -123.8302136, - 44.35975596 - ], - [ - -123.83043508, - 44.35927715 - ], - [ - -123.83043676, - 44.35897974 - ], - [ - -123.83066164, - 44.3585452 - ], - [ - -123.83087389, - 44.35808419 - ], - [ - -123.83123077, - 44.35771716 - ], - [ - -123.83149219, - 44.35730191 - ], - [ - -123.8317935, - 44.35689183 - ], - [ - -123.83221309, - 44.35652466 - ], - [ - -123.83264602, - 44.35620468 - ], - [ - -123.83295909, - 44.35604074 - ], - [ - -123.83322863, - 44.35582838 - ], - [ - -123.83363274, - 44.35546781 - ], - [ - -123.8339284, - 44.35504505 - ], - [ - -123.83421101, - 44.35462757 - ], - [ - -123.83441642, - 44.35420053 - ], - [ - -123.83459364, - 44.35374425 - ], - [ - -123.83484153, - 44.35328064 - ], - [ - -123.83503992, - 44.35279836 - ], - [ - -123.83532486, - 44.35239401 - ], - [ - -123.83558141, - 44.35190388 - ], - [ - -123.83584591, - 44.35144822 - ], - [ - -123.8362086, - 44.35106632 - ], - [ - -123.83646984, - 44.35061601 - ], - [ - -123.83682396, - 44.35027306 - ], - [ - -123.83741823, - 44.35002993 - ], - [ - -123.83797977, - 44.34977041 - ], - [ - -123.8384272, - 44.34973236 - ], - [ - -123.83891831, - 44.34973886 - ], - [ - -123.8393342, - 44.34980157 - ], - [ - -123.83983914, - 44.34970795 - ], - [ - -123.8402702, - 44.34971164 - ], - [ - -123.84067923, - 44.34973058 - ], - [ - -123.8410633, - 44.34970312 - ], - [ - -123.84147372, - 44.34971455 - ], - [ - -123.84204825, - 44.3498711 - ], - [ - -123.84264285, - 44.34994949 - ], - [ - -123.84321946, - 44.35001037 - ], - [ - -123.84377642, - 44.35003907 - ], - [ - -123.84432658, - 44.35025777 - ], - [ - -123.84203507, - 44.35487086 - ], - [ - -123.84165892, - 44.35522761 - ], - [ - -123.84141926, - 44.35562524 - ], - [ - -123.8411565, - 44.35599439 - ], - [ - -123.8410185, - 44.3562787 - ], - [ - -123.84055746, - 44.35664891 - ], - [ - -123.8402963, - 44.35698133 - ], - [ - -123.83992088, - 44.35727933 - ], - [ - -123.83973137, - 44.35754806 - ], - [ - -123.83932875, - 44.35773088 - ], - [ - -123.83914337, - 44.3580173 - ], - [ - -123.83895031, - 44.35825633 - ], - [ - -123.83850815, - 44.35862331 - ], - [ - -123.83822746, - 44.35907347 - ], - [ - -123.83796045, - 44.35949625 - ], - [ - -123.83768553, - 44.35990376 - ], - [ - -123.83745996, - 44.3604108 - ], - [ - -123.83714948, - 44.36078632 - ], - [ - -123.83691018, - 44.36125106 - ], - [ - -123.83671357, - 44.36176473 - ], - [ - -123.83643361, - 44.36221479 - ], - [ - -123.83615206, - 44.36264813 - ], - [ - -123.83578463, - 44.36307576 - ], - [ - -123.83542661, - 44.36349149 - ], - [ - -123.83506758, - 44.36384017 - ], - [ - -123.83472312, - 44.36423027 - ], - [ - -123.83433282, - 44.36461474 - ], - [ - -123.83404859, - 44.36509528 - ], - [ - -123.83375641, - 44.36552674 - ], - [ - -123.83348665, - 44.36592645 - ], - [ - -123.83352719, - 44.36641625 - ], - [ - -123.83354167, - 44.36687226 - ], - [ - -123.83352598, - 44.36733983 - ], - [ - -123.83357856, - 44.36781268 - ], - [ - -123.83358707, - 44.36828114 - ], - [ - -123.83361502, - 44.36877025 - ], - [ - -123.83363983, - 44.36924809 - ], - [ - -123.83386927, - 44.36974131 - ], - [ - -123.83398366, - 44.37020602 - ], - [ - -123.83411017, - 44.37066634 - ], - [ - -123.83422771, - 44.37115498 - ], - [ - -123.83440837, - 44.37157793 - ], - [ - -123.83451758, - 44.37203463 - ], - [ - -123.83466984, - 44.37246002 - ], - [ - -123.83476675, - 44.3729088 - ], - [ - -123.834789, - 44.37317881 - ], - [ - -123.8346991, - 44.37369173 - ], - [ - -123.83454395, - 44.37417495 - ], - [ - -123.83441269, - 44.37465505 - ], - [ - -123.83417986, - 44.37507302 - ], - [ - -123.83364152, - 44.37526 - ], - [ - -123.83321353, - 44.37557739 - ], - [ - -123.83285218, - 44.37595532 - ], - [ - -123.83248264, - 44.37637684 - ], - [ - -123.83225679, - 44.37665008 - ], - [ - -123.83191251, - 44.37707752 - ], - [ - -123.83159357, - 44.37751562 - ], - [ - -123.83134601, - 44.37796816 - ], - [ - -123.83118921, - 44.37842778 - ], - [ - -123.83090169, - 44.37889258 - ], - [ - -123.83070078, - 44.37934341 - ], - [ - -123.83056763, - 44.37979938 - ], - [ - -123.83053986, - 44.38025897 - ], - [ - -123.83063844, - 44.38064949 - ], - [ - -123.8307725, - 44.38109651 - ], - [ - -123.83083629, - 44.38148235 - ], - [ - -123.83082114, - 44.3819181 - ], - [ - -123.83065815, - 44.38231241 - ], - [ - -123.83050646, - 44.38273143 - ], - [ - -123.83030168, - 44.38315663 - ], - [ - -123.82998372, - 44.38356024 - ], - [ - -123.82974685, - 44.38396369 - ], - [ - -123.82954343, - 44.38431339 - ], - [ - -123.82937698, - 44.38464023 - ], - [ - -123.82929339, - 44.38499412 - ], - [ - -123.82929866, - 44.38537351 - ], - [ - -123.82929649, - 44.38572262 - ], - [ - -123.82939712, - 44.3861449 - ], - [ - -123.82974721, - 44.38640976 - ], - [ - -123.83006661, - 44.38665424 - ], - [ - -123.83047099, - 44.38693426 - ], - [ - -123.83085114, - 44.38712547 - ], - [ - -123.83131994, - 44.38731023 - ], - [ - -123.83186324, - 44.38761938 - ], - [ - -123.83217948, - 44.38780359 - ], - [ - -123.83273301, - 44.3880341 - ], - [ - -123.83332735, - 44.38824105 - ], - [ - -123.8340571, - 44.38841128 - ], - [ - -123.83465999, - 44.38859294 - ], - [ - -123.83528877, - 44.38859602 - ], - [ - -123.83569405, - 44.38844339 - ], - [ - -123.83638628, - 44.3884207 - ], - [ - -123.8370251, - 44.38844967 - ], - [ - -123.83739577, - 44.38837795 - ], - [ - -123.83776722, - 44.38831733 - ], - [ - -123.83837884, - 44.38836701 - ], - [ - -123.83900529, - 44.38838659 - ], - [ - -123.83961918, - 44.38831371 - ], - [ - -123.84021405, - 44.38829042 - ], - [ - -123.84086954, - 44.38828232 - ], - [ - -123.84151231, - 44.3883489 - ], - [ - -123.84204361, - 44.38864686 - ], - [ - -123.84250872, - 44.38883971 - ], - [ - -123.84286235, - 44.38913828 - ], - [ - -123.84327839, - 44.38943857 - ], - [ - -123.84351162, - 44.38965811 - ], - [ - -123.8437019, - 44.38990892 - ], - [ - -123.84414825, - 44.39024774 - ], - [ - -123.84457698, - 44.39057986 - ], - [ - -123.8450298, - 44.39091025 - ], - [ - -123.84540377, - 44.39127727 - ], - [ - -123.84576513, - 44.39169169 - ], - [ - -123.84620505, - 44.3920822 - ], - [ - -123.84662036, - 44.39243773 - ], - [ - -123.84701835, - 44.39281331 - ], - [ - -123.84736426, - 44.39303992 - ], - [ - -123.84774171, - 44.39336675 - ], - [ - -123.84750211, - 44.39375524 - ], - [ - -123.84730976, - 44.39415078 - ], - [ - -123.84716074, - 44.39450914 - ], - [ - -123.83325795, - 44.39231346 - ], - [ - -123.83287897, - 44.39233478 - ], - [ - -123.83242812, - 44.39225423 - ], - [ - -123.8320242, - 44.39214754 - ], - [ - -123.831443, - 44.39216949 - ], - [ - -123.83081285, - 44.39222948 - ], - [ - -123.83042339, - 44.39237674 - ], - [ - -123.8298725, - 44.39246101 - ], - [ - -123.82948222, - 44.39289454 - ], - [ - -123.82948876, - 44.39341478 - ], - [ - -123.82929042, - 44.39364585 - ], - [ - -123.82889206, - 44.39403331 - ], - [ - -123.82849602, - 44.39438788 - ], - [ - -123.82814269, - 44.39466477 - ], - [ - -123.82774371, - 44.39497413 - ], - [ - -123.82797044, - 44.39558031 - ], - [ - -123.82824962, - 44.39610349 - ], - [ - -123.82823647, - 44.39653022 - ], - [ - -123.82841452, - 44.3970331 - ], - [ - -123.82846666, - 44.39744215 - ], - [ - -123.82881905, - 44.39761326 - ], - [ - -123.82910502, - 44.39782317 - ], - [ - -123.82933156, - 44.39827824 - ], - [ - -123.82958303, - 44.39860292 - ], - [ - -123.82970897, - 44.39887799 - ], - [ - -123.82998729, - 44.39910031 - ], - [ - -123.83048205, - 44.39929464 - ], - [ - -123.83095576, - 44.3995244 - ], - [ - -123.83147986, - 44.39985473 - ], - [ - -123.83202919, - 44.40011745 - ], - [ - -123.83272727, - 44.40023748 - ], - [ - -123.83340891, - 44.40029896 - ], - [ - -123.8340274, - 44.40029109 - ], - [ - -123.83472264, - 44.40026772 - ], - [ - -123.83508238, - 44.40017841 - ], - [ - -123.83575472, - 44.40010627 - ], - [ - -123.83643769, - 44.40001533 - ], - [ - -123.8370988, - 44.39997518 - ], - [ - -123.83747722, - 44.39992662 - ], - [ - -123.83818459, - 44.39988528 - ], - [ - -123.83883679, - 44.3997823 - ], - [ - -123.8394548, - 44.39967891 - ], - [ - -123.84008445, - 44.39954732 - ], - [ - -123.84070208, - 44.39939815 - ], - [ - -123.84131372, - 44.39917183 - ], - [ - -123.84187299, - 44.39896379 - ], - [ - -123.84244572, - 44.39868752 - ], - [ - -123.84296973, - 44.3984023 - ], - [ - -123.84350996, - 44.3981352 - ], - [ - -123.84392876, - 44.39799545 - ], - [ - -123.8447125, - 44.39786568 - ], - [ - -123.84510842, - 44.39787915 - ], - [ - -123.84579844, - 44.39787518 - ], - [ - -123.84650467, - 44.39794333 - ], - [ - -123.84717138, - 44.39808825 - ], - [ - -123.84788597, - 44.39825368 - ], - [ - -123.84843146, - 44.3984778 - ], - [ - -123.84908022, - 44.39868748 - ], - [ - -123.84973524, - 44.39883781 - ], - [ - -123.85018943, - 44.39913399 - ], - [ - -123.85072511, - 44.39937269 - ], - [ - -123.85126588, - 44.39963369 - ], - [ - -123.85183667, - 44.39984811 - ], - [ - -123.85253322, - 44.39995526 - ], - [ - -123.85315519, - 44.40007652 - ], - [ - -123.85383831, - 44.40018159 - ], - [ - -123.85422651, - 44.4002215 - ], - [ - -123.85489009, - 44.40030811 - ], - [ - -123.85557778, - 44.40030578 - ], - [ - -123.85617964, - 44.40025503 - ], - [ - -123.85685093, - 44.40020889 - ], - [ - -123.85749307, - 44.40014005 - ], - [ - -123.85815502, - 44.39999251 - ], - [ - -123.85878967, - 44.39987297 - ], - [ - -123.85940186, - 44.39975461 - ], - [ - -123.86014717, - 44.39970844 - ], - [ - -123.86067393, - 44.39969683 - ], - [ - -123.86126228, - 44.39957493 - ], - [ - -123.86187423, - 44.39946623 - ], - [ - -123.86252734, - 44.39941413 - ], - [ - -123.86316943, - 44.39930916 - ], - [ - -123.86376752, - 44.39917205 - ], - [ - -123.86436596, - 44.39901877 - ], - [ - -123.86498829, - 44.39890866 - ], - [ - -123.86564018, - 44.39889606 - ], - [ - -123.86633351, - 44.39891627 - ], - [ - -123.86693144, - 44.39910351 - ], - [ - -123.86755934, - 44.39920612 - ], - [ - -123.86821285, - 44.39938466 - ], - [ - -123.86888417, - 44.39956356 - ], - [ - -123.86935838, - 44.3997763 - ], - [ - -123.86982656, - 44.40003146 - ], - [ - -123.87021351, - 44.40040625 - ], - [ - -123.87070082, - 44.40066815 - ], - [ - -123.8712128, - 44.40097838 - ], - [ - -123.87173204, - 44.40127655 - ], - [ - -123.8722167, - 44.40153571 - ], - [ - -123.87257382, - 44.40162574 - ], - [ - -123.87310406, - 44.40189762 - ], - [ - -123.87359914, - 44.40206826 - ], - [ - -123.87412929, - 44.40230976 - ], - [ - -123.87488722, - 44.40247685 - ], - [ - -123.87547359, - 44.40268243 - ], - [ - -123.87591649, - 44.40303744 - ], - [ - -123.87639193, - 44.40329141 - ], - [ - -123.87685593, - 44.403575 - ], - [ - -123.8773683, - 44.40388809 - ], - [ - -123.87787402, - 44.40421161 - ], - [ - -123.87830627, - 44.40450556 - ], - [ - -123.87875463, - 44.40481816 - ], - [ - -123.87921462, - 44.4051345 - ], - [ - -123.87965761, - 44.40550009 - ], - [ - -123.88006274, - 44.40581375 - ], - [ - -123.880311, - 44.40601844 - ], - [ - -123.88050868, - 44.40625212 - ], - [ - -123.88092865, - 44.40670517 - ], - [ - -123.88140728, - 44.40695894 - ], - [ - -123.88196001, - 44.40719543 - ], - [ - -123.88246063, - 44.40746501 - ], - [ - -123.88290241, - 44.40761001 - ], - [ - -123.88326407, - 44.40770471 - ], - [ - -123.88369986, - 44.4077935 - ], - [ - -123.88410483, - 44.40781332 - ], - [ - -123.88477941, - 44.40788478 - ], - [ - -123.88546521, - 44.40792777 - ], - [ - -123.88613991, - 44.40800486 - ], - [ - -123.88679371, - 44.40802335 - ], - [ - -123.88743945, - 44.40803797 - ], - [ - -123.88778308, - 44.40792528 - ], - [ - -123.88816662, - 44.40788622 - ], - [ - -123.88878509, - 44.4077292 - ], - [ - -123.88939277, - 44.40746818 - ], - [ - -123.88992761, - 44.40728381 - ], - [ - -123.89042965, - 44.40706805 - ], - [ - -123.89091789, - 44.40679144 - ], - [ - -123.89146513, - 44.40661118 - ], - [ - -123.89204869, - 44.40645954 - ], - [ - -123.8924492, - 44.40642341 - ], - [ - -123.89306481, - 44.40632346 - ], - [ - -123.89363697, - 44.4061784 - ], - [ - -123.89424605, - 44.40607274 - ], - [ - -123.89472907, - 44.40585515 - ], - [ - -123.89529258, - 44.4055676 - ], - [ - -123.89577479, - 44.40534867 - ], - [ - -123.89623146, - 44.40510029 - ], - [ - -123.89669813, - 44.4049264 - ], - [ - -123.89703676, - 44.40479792 - ], - [ - -123.89759604, - 44.40489638 - ], - [ - -123.89796954, - 44.40480068 - ], - [ - -123.89776908, - 44.40510428 - ], - [ - -123.89763026, - 44.40537959 - ], - [ - -123.89775748, - 44.40570888 - ], - [ - -123.89798825, - 44.40635395 - ], - [ - -123.89807914, - 44.40680006 - ], - [ - -123.8981605, - 44.40723602 - ], - [ - -123.89851731, - 44.40788018 - ], - [ - -123.89870319, - 44.40827993 - ], - [ - -123.89885188, - 44.40854481 - ], - [ - -123.89912201, - 44.4090699 - ], - [ - -123.89931266, - 44.40932872 - ], - [ - -123.89955343, - 44.40989939 - ], - [ - -123.89964612, - 44.41020136 - ], - [ - -123.89998865, - 44.41067162 - ], - [ - -123.90009915, - 44.41095871 - ], - [ - -123.90046547, - 44.41136472 - ], - [ - -123.90081575, - 44.41179523 - ], - [ - -123.90126973, - 44.41207393 - ], - [ - -123.90161867, - 44.41223466 - ], - [ - -123.90219707, - 44.41242756 - ], - [ - -123.90279124, - 44.41262141 - ], - [ - -123.90336856, - 44.41283241 - ], - [ - -123.90394765, - 44.41301175 - ], - [ - -123.90452798, - 44.4132305 - ], - [ - -123.90508748, - 44.41340748 - ], - [ - -123.90568275, - 44.41360401 - ], - [ - -123.90619128, - 44.41366257 - ], - [ - -123.90681799, - 44.41364594 - ], - [ - -123.90740832, - 44.41355112 - ], - [ - -123.90794155, - 44.41343054 - ], - [ - -123.9084303, - 44.41325435 - ], - [ - -123.90894564, - 44.41307826 - ], - [ - -123.90948204, - 44.41291141 - ], - [ - -123.90995774, - 44.41274009 - ], - [ - -123.91036825, - 44.41253823 - ], - [ - -123.91080595, - 44.41227071 - ], - [ - -123.91134941, - 44.41206608 - ], - [ - -123.91180342, - 44.41179606 - ], - [ - -123.91209543, - 44.41147776 - ], - [ - -123.91238624, - 44.41111112 - ], - [ - -123.91263172, - 44.41080515 - ], - [ - -123.91286336, - 44.41047062 - ], - [ - -123.91307648, - 44.41010501 - ], - [ - -123.91325976, - 44.40971712 - ], - [ - -123.91339298, - 44.4093358 - ], - [ - -123.91354334, - 44.40889929 - ], - [ - -123.91359042, - 44.40842761 - ], - [ - -123.9136534, - 44.40793958 - ], - [ - -123.91371997, - 44.40748378 - ], - [ - -123.91383764, - 44.40705641 - ], - [ - -123.91391104, - 44.40664034 - ], - [ - -123.91409615, - 44.40628875 - ], - [ - -123.91423042, - 44.40591397 - ], - [ - -123.91436732, - 44.40559092 - ], - [ - -123.91472252, - 44.40528978 - ], - [ - -123.91508271, - 44.40495322 - ], - [ - -123.91541287, - 44.40453829 - ], - [ - -123.91587899, - 44.40423021 - ], - [ - -123.91632563, - 44.40388354 - ], - [ - -123.91680777, - 44.40357231 - ], - [ - -123.91735984, - 44.40326839 - ], - [ - -123.91772488, - 44.40295815 - ], - [ - -123.91819859, - 44.4026917 - ], - [ - -123.91869704, - 44.40248751 - ], - [ - -123.91955809, - 44.40241698 - ], - [ - -123.92028749, - 44.40232218 - ], - [ - -123.92093335, - 44.4022829 - ], - [ - -123.92157021, - 44.40219044 - ], - [ - -123.92214399, - 44.40207362 - ], - [ - -123.92273745, - 44.40191332 - ], - [ - -123.92329758, - 44.40173306 - ], - [ - -123.92374441, - 44.40145561 - ], - [ - -123.92426761, - 44.4011692 - ], - [ - -123.92461559, - 44.40083517 - ], - [ - -123.92494488, - 44.40048791 - ], - [ - -123.92525406, - 44.40014004 - ], - [ - -123.92551382, - 44.39976282 - ], - [ - -123.92590109, - 44.3994442 - ], - [ - -123.92633895, - 44.399155 - ], - [ - -123.92704252, - 44.39905127 - ], - [ - -123.92769566, - 44.39898868 - ], - [ - -123.92830885, - 44.39900414 - ], - [ - -123.92892625, - 44.39895612 - ], - [ - -123.92954142, - 44.39893004 - ], - [ - -123.93014359, - 44.39889021 - ], - [ - -123.93069157, - 44.3987535 - ], - [ - -123.93121382, - 44.39858483 - ], - [ - -123.93179926, - 44.39837244 - ], - [ - -123.9323001, - 44.39811884 - ], - [ - -123.93286139, - 44.39791318 - ], - [ - -123.93343306, - 44.39771814 - ], - [ - -123.93402862, - 44.39752484 - ], - [ - -123.93445539, - 44.3974262 - ], - [ - -123.93507567, - 44.39720532 - ], - [ - -123.93566616, - 44.39703623 - ], - [ - -123.93608247, - 44.39695579 - ], - [ - -123.93680653, - 44.3968801 - ], - [ - -123.93748702, - 44.39688852 - ], - [ - -123.93801284, - 44.39704153 - ], - [ - -123.93862307, - 44.39713536 - ], - [ - -123.93909178, - 44.39738882 - ], - [ - -123.93958546, - 44.39763696 - ], - [ - -123.94004078, - 44.39791133 - ], - [ - -123.93992079, - 44.39849658 - ], - [ - -123.93951288, - 44.39911698 - ], - [ - -123.93937417, - 44.39938235 - ], - [ - -123.93930383, - 44.39977924 - ], - [ - -123.93916448, - 44.4000305 - ], - [ - -123.93901945, - 44.4003674 - ], - [ - -123.93904872, - 44.40078397 - ], - [ - -123.93909322, - 44.40129273 - ], - [ - -123.93915007, - 44.40175556 - ], - [ - -123.93925609, - 44.4022171 - ], - [ - -123.93943907, - 44.40268108 - ], - [ - -123.93960631, - 44.40322234 - ], - [ - -123.93982983, - 44.40361487 - ], - [ - -123.94014536, - 44.40397834 - ], - [ - -123.94026341, - 44.40429241 - ], - [ - -123.94057373, - 44.40447186 - ], - [ - -123.94105541, - 44.40474705 - ], - [ - -123.94160399, - 44.40494901 - ], - [ - -123.94220706, - 44.40502569 - ], - [ - -123.94279816, - 44.40506358 - ], - [ - -123.94340299, - 44.40507666 - ], - [ - -123.94402474, - 44.40510153 - ], - [ - -123.94462844, - 44.40520934 - ], - [ - -123.94524185, - 44.40526414 - ], - [ - -123.94588166, - 44.40528919 - ], - [ - -123.94651777, - 44.40533917 - ], - [ - -123.94717463, - 44.40539583 - ], - [ - -123.94782596, - 44.40545025 - ], - [ - -123.94847524, - 44.40549078 - ], - [ - -123.94908205, - 44.40554706 - ], - [ - -123.94968558, - 44.40556505 - ], - [ - -123.95032322, - 44.40564387 - ], - [ - -123.95088722, - 44.40579685 - ], - [ - -123.951475, - 44.40591513 - ], - [ - -123.95203642, - 44.40600215 - ], - [ - -123.95262381, - 44.40610039 - ], - [ - -123.95320377, - 44.40618497 - ], - [ - -123.95380631, - 44.40626162 - ], - [ - -123.95437712, - 44.40634471 - ], - [ - -123.95493238, - 44.40645369 - ], - [ - -123.95548339, - 44.40657689 - ], - [ - -123.95596045, - 44.40677881 - ], - [ - -123.95634357, - 44.40692054 - ], - [ - -123.95678154, - 44.40725095 - ], - [ - -123.95728515, - 44.40745667 - ], - [ - -123.9578236, - 44.4076733 - ], - [ - -123.95841299, - 44.40795093 - ], - [ - -123.95895545, - 44.40818203 - ], - [ - -123.95949965, - 44.40842223 - ], - [ - -123.95978424, - 44.40863051 - ], - [ - -123.96033444, - 44.40888121 - ], - [ - -123.96087367, - 44.4091309 - ], - [ - -123.96145696, - 44.40940761 - ], - [ - -123.96197166, - 44.4096763 - ], - [ - -123.96254326, - 44.40995239 - ], - [ - -123.96291887, - 44.41004019 - ], - [ - -123.96345949, - 44.41039994 - ], - [ - -123.96382274, - 44.4104883 - ], - [ - -123.96448741, - 44.41064768 - ], - [ - -123.96507192, - 44.41089011 - ], - [ - -123.96567255, - 44.41110579 - ], - [ - -123.96628875, - 44.41130712 - ], - [ - -123.96687554, - 44.4115252 - ], - [ - -123.96748682, - 44.41170485 - ], - [ - -123.96812516, - 44.4118425 - ], - [ - -123.96879175, - 44.41195063 - ], - [ - -123.96940244, - 44.41210901 - ], - [ - -123.96998386, - 44.41215632 - ], - [ - -123.97070257, - 44.41207678 - ], - [ - -123.97121878, - 44.41188922 - ], - [ - -123.9719615, - 44.41184233 - ], - [ - -123.97264813, - 44.41178434 - ], - [ - -123.97333195, - 44.41170379 - ], - [ - -123.9740139, - 44.41166369 - ], - [ - -123.974735, - 44.41159337 - ], - [ - -123.97534859, - 44.41154521 - ], - [ - -123.97597454, - 44.41151545 - ], - [ - -123.97657051, - 44.41142758 - ], - [ - -123.977225, - 44.41141165 - ], - [ - -123.97789065, - 44.41136242 - ], - [ - -123.97855006, - 44.411291 - ], - [ - -123.97922159, - 44.41131766 - ], - [ - -123.97987871, - 44.41131188 - ], - [ - -123.98055407, - 44.41134369 - ], - [ - -123.98121029, - 44.41132718 - ], - [ - -123.98184957, - 44.4114154 - ], - [ - -123.98245005, - 44.41138605 - ], - [ - -123.98307313, - 44.41141705 - ], - [ - -123.98369401, - 44.41139145 - ], - [ - -123.98440539, - 44.41135395 - ], - [ - -123.98511358, - 44.4113503 - ], - [ - -123.98671941, - 44.41152246 - ], - [ - -123.98748945, - 44.41152462 - ], - [ - -123.9882401, - 44.41152883 - ], - [ - -123.98889219, - 44.41159485 - ], - [ - -123.98946553, - 44.41174715 - ], - [ - -123.99005421, - 44.41187194 - ], - [ - -123.99053595, - 44.41199176 - ], - [ - -123.99112282, - 44.41208699 - ], - [ - -123.9917098, - 44.41221487 - ], - [ - -123.9923444, - 44.41227068 - ], - [ - -123.99298967, - 44.41233859 - ], - [ - -123.99366116, - 44.4123239 - ], - [ - -123.99425938, - 44.41231871 - ], - [ - -123.99488136, - 44.41231232 - ], - [ - -123.99551957, - 44.41230265 - ], - [ - -123.99616306, - 44.41226539 - ], - [ - -123.99679546, - 44.41222111 - ], - [ - -123.99739403, - 44.41220866 - ], - [ - -123.99802346, - 44.41219235 - ], - [ - -123.99863466, - 44.41223578 - ], - [ - -123.99926345, - 44.41228427 - ], - [ - -123.99984754, - 44.41237385 - ], - [ - -124.00048214, - 44.41239248 - ], - [ - -124.00114048, - 44.41245646 - ], - [ - -124.00178649, - 44.41250322 - ], - [ - -124.00242568, - 44.41254112 - ], - [ - -124.00302101, - 44.41260424 - ], - [ - -124.00366056, - 44.41272726 - ], - [ - -124.00431346, - 44.41279803 - ], - [ - -124.00495665, - 44.4128499 - ], - [ - -124.00579352, - 44.41288924 - ], - [ - -124.00624914, - 44.41287201 - ], - [ - -124.0068697, - 44.41285621 - ], - [ - -124.00755761, - 44.41290728 - ], - [ - -124.00823004, - 44.41289992 - ], - [ - -124.00860708, - 44.41299905 - ], - [ - -124.00932836, - 44.41308644 - ], - [ - -124.00997898, - 44.41306819 - ], - [ - -124.01056621, - 44.41316267 - ], - [ - -124.0111938, - 44.41317779 - ], - [ - -124.01185685, - 44.41324235 - ], - [ - -124.01249612, - 44.41327547 - ], - [ - -124.01314373, - 44.41326774 - ], - [ - -124.01379886, - 44.41329262 - ], - [ - -124.01443035, - 44.41329667 - ], - [ - -124.01504742, - 44.41325602 - ], - [ - -124.01567696, - 44.41326543 - ], - [ - -124.0163176, - 44.41323321 - ], - [ - -124.01697681, - 44.41320211 - ], - [ - -124.0176808, - 44.41319297 - ], - [ - -124.01830344, - 44.41318806 - ], - [ - -124.01892875, - 44.41316995 - ], - [ - -124.01957479, - 44.41310311 - ], - [ - -124.02028666, - 44.41296881 - ], - [ - -124.02096835, - 44.41287308 - ], - [ - -124.02159251, - 44.41281857 - ], - [ - -124.02222162, - 44.41283223 - ], - [ - -124.02293347, - 44.41285626 - ], - [ - -124.02358937, - 44.4128672 - ], - [ - -124.02419598, - 44.41289626 - ], - [ - -124.02482112, - 44.41293497 - ], - [ - -124.02548339, - 44.41297929 - ], - [ - -124.02611148, - 44.41299481 - ], - [ - -124.0266979, - 44.41313225 - ], - [ - -124.02736855, - 44.41333595 - ], - [ - -124.02783454, - 44.41368598 - ], - [ - -124.02836911, - 44.41389146 - ], - [ - -124.02897219, - 44.41403678 - ], - [ - -124.029629, - 44.41416364 - ], - [ - -124.03033955, - 44.41430962 - ], - [ - -124.03100129, - 44.41447188 - ], - [ - -124.03157854, - 44.4145831 - ], - [ - -124.03213505, - 44.41468656 - ], - [ - -124.03269749, - 44.41490901 - ], - [ - -124.033154, - 44.41508231 - ], - [ - -124.03359996, - 44.41520344 - ], - [ - -124.03408523, - 44.41530917 - ], - [ - -124.0346166, - 44.41543075 - ], - [ - -124.03512713, - 44.41554203 - ], - [ - -124.03564424, - 44.41566261 - ], - [ - -124.03605195, - 44.41585219 - ], - [ - -124.03654838, - 44.41591092 - ], - [ - -124.03701368, - 44.41610872 - ], - [ - -124.03751824, - 44.41637551 - ], - [ - -124.03799254, - 44.41658715 - ], - [ - -124.0384103, - 44.41683276 - ], - [ - -124.03883734, - 44.41708857 - ], - [ - -124.03925739, - 44.41737799 - ], - [ - -124.03971456, - 44.41764979 - ], - [ - -124.04013647, - 44.41789315 - ], - [ - -124.04054395, - 44.41813668 - ], - [ - -124.04097723, - 44.41838177 - ], - [ - -124.04146112, - 44.4186056 - ], - [ - -124.04185121, - 44.41889254 - ], - [ - -124.04228709, - 44.41915181 - ], - [ - -124.04260596, - 44.41950951 - ], - [ - -124.04295319, - 44.41978532 - ], - [ - -124.0433162, - 44.42011499 - ], - [ - -124.0436819, - 44.42043111 - ], - [ - -124.04408065, - 44.42071266 - ], - [ - -124.04439889, - 44.42100308 - ], - [ - -124.04478977, - 44.4212684 - ], - [ - -124.04517681, - 44.42157563 - ], - [ - -124.04553017, - 44.42187406 - ], - [ - -124.04588278, - 44.42214059 - ], - [ - -124.04625229, - 44.42241312 - ], - [ - -124.04662308, - 44.42269237 - ], - [ - -124.04695262, - 44.42303343 - ], - [ - -124.04714038, - 44.42343828 - ], - [ - -124.04741315, - 44.42376849 - ], - [ - -124.04768053, - 44.42407676 - ], - [ - -124.04780435, - 44.42435651 - ], - [ - -124.04732634, - 44.42489447 - ], - [ - -124.04702656, - 44.42523888 - ], - [ - -124.04687808, - 44.4257034 - ], - [ - -124.04689221, - 44.42611206 - ], - [ - -124.04694745, - 44.42650644 - ], - [ - -124.04699714, - 44.42683515 - ], - [ - -124.04711255, - 44.42722664 - ], - [ - -124.04718166, - 44.42755012 - ], - [ - -124.04735098, - 44.42792237 - ], - [ - -124.04744022, - 44.42823233 - ], - [ - -124.04763186, - 44.42858768 - ], - [ - -124.04782294, - 44.42893506 - ], - [ - -124.04795772, - 44.42927056 - ], - [ - -124.04812008, - 44.42954357 - ], - [ - -124.0482655, - 44.42985726 - ], - [ - -124.04841015, - 44.43016916 - ], - [ - -124.04959029, - 44.43019059 - ], - [ - -124.04958402, - 44.43058002 - ], - [ - -124.05003768, - 44.43060595 - ], - [ - -124.05056385, - 44.43056855 - ], - [ - -124.0509838, - 44.43054737 - ], - [ - -124.05142502, - 44.4304973 - ], - [ - -124.05188644, - 44.43042265 - ], - [ - -124.05234342, - 44.4303942 - ], - [ - -124.05285804, - 44.43048907 - ], - [ - -124.05322937, - 44.43062561 - ], - [ - -124.05355872, - 44.43079039 - ], - [ - -124.05393383, - 44.43093127 - ], - [ - -124.05434019, - 44.4310527 - ], - [ - -124.05478282, - 44.43112744 - ], - [ - -124.05524487, - 44.43116655 - ], - [ - -124.05570963, - 44.43125383 - ], - [ - -124.05620541, - 44.43119684 - ], - [ - -124.0566196, - 44.43110111 - ], - [ - -124.05700451, - 44.43095856 - ], - [ - -124.05735068, - 44.4308297 - ], - [ - -124.0576967, - 44.4306475 - ], - [ - -124.05806766, - 44.43046741 - ], - [ - -124.05842788, - 44.43029024 - ], - [ - -124.0587761, - 44.43014354 - ], - [ - -124.05919087, - 44.42992754 - ], - [ - -124.05955409, - 44.42970128 - ], - [ - -124.05993269, - 44.42959332 - ], - [ - -124.0600291, - 44.42991412 - ], - [ - -124.06039563, - 44.42997867 - ], - [ - -124.06040845, - 44.42966802 - ], - [ - -124.06039705, - 44.42937148 - ], - [ - -124.06062818, - 44.42914606 - ], - [ - -124.06099005, - 44.42900989 - ], - [ - -124.06106585, - 44.42873816 - ], - [ - -124.06133563, - 44.42851991 - ], - [ - -124.06164997, - 44.42832205 - ], - [ - -124.06198476, - 44.42810412 - ], - [ - -124.06232868, - 44.42788506 - ], - [ - -124.0626385, - 44.42768829 - ], - [ - -124.06294375, - 44.42749466 - ], - [ - -124.06324718, - 44.42728655 - ], - [ - -124.06356995, - 44.42711808 - ], - [ - -124.06394055, - 44.42699164 - ], - [ - -124.06434683, - 44.42693523 - ], - [ - -124.06477167, - 44.42693652 - ], - [ - -124.06518523, - 44.42695944 - ], - [ - -124.06558096, - 44.42698015 - ], - [ - -124.0659813, - 44.42700063 - ], - [ - -124.06638206, - 44.42699874 - ], - [ - -124.066768, - 44.42700564 - ], - [ - -124.06714626, - 44.42700383 - ], - [ - -124.06733695, - 44.42673471 - ], - [ - -124.06735524, - 44.42643001 - ], - [ - -124.06741351, - 44.42614907 - ], - [ - -124.06751697, - 44.42582062 - ], - [ - -124.06767438, - 44.42549643 - ], - [ - -124.06783809, - 44.42525326 - ], - [ - -124.06804478, - 44.42500646 - ], - [ - -124.06828641, - 44.42478841 - ], - [ - -124.06867087, - 44.42453262 - ], - [ - -124.06911546, - 44.42428148 - ], - [ - -124.06962386, - 44.42408709 - ], - [ - -124.0699778, - 44.42397249 - ], - [ - -124.07046375, - 44.42374579 - ], - [ - -124.07076916, - 44.4235611 - ], - [ - -124.07104161, - 44.42335428 - ], - [ - -124.07130694, - 44.42312002 - ], - [ - -124.07160346, - 44.42287778 - ], - [ - -124.07193864, - 44.42264133 - ], - [ - -124.07229798, - 44.42242491 - ], - [ - -124.07268246, - 44.42218728 - ], - [ - -124.0730827, - 44.42194548 - ], - [ - -124.07350536, - 44.42171291 - ], - [ - -124.07391474, - 44.42147584 - ], - [ - -124.07431838, - 44.42125 - ], - [ - -124.07469786, - 44.42101658 - ], - [ - -124.07507283, - 44.4207555 - ], - [ - -124.07544303, - 44.42051063 - ], - [ - -124.07584042, - 44.42027326 - ], - [ - -124.07619407, - 44.42003165 - ], - [ - -124.07656189, - 44.41980864 - ], - [ - -124.07690587, - 44.41959394 - ], - [ - -124.07721702, - 44.41933004 - ], - [ - -124.07750715, - 44.41906131 - ], - [ - -124.07779686, - 44.41879036 - ], - [ - -124.07809044, - 44.41852666 - ], - [ - -124.07838983, - 44.41828726 - ], - [ - -124.07869746, - 44.41803038 - ], - [ - -124.07899261, - 44.41776279 - ], - [ - -124.07928888, - 44.41749579 - ], - [ - -124.07959817, - 44.4172429 - ], - [ - -124.07991585, - 44.41697402 - ], - [ - -124.08021911, - 44.41670149 - ], - [ - -124.08051445, - 44.41644058 - ], - [ - -124.08081398, - 44.41617324 - ], - [ - -124.08111657, - 44.41591081 - ], - [ - -124.08140945, - 44.41563878 - ], - [ - -124.08169799, - 44.41537443 - ], - [ - -124.08196931, - 44.41511894 - ], - [ - -124.08223731, - 44.41484764 - ], - [ - -124.08248837, - 44.41455977 - ], - [ - -124.08273127, - 44.41426732 - ], - [ - -124.08295988, - 44.41394897 - ], - [ - -124.08318646, - 44.41361575 - ], - [ - -124.08339613, - 44.41326079 - ], - [ - -124.08360565, - 44.41286803 - ], - [ - -124.08378138, - 44.41243915 - ], - [ - -124.08392812, - 44.41199675 - ], - [ - -124.08407669, - 44.41155153 - ], - [ - -124.08416379, - 44.41110435 - ], - [ - -124.08424807, - 44.41065802 - ], - [ - -124.08433027, - 44.41021677 - ], - [ - -124.08440363, - 44.40977697 - ], - [ - -124.0844971, - 44.40934979 - ], - [ - -124.08457662, - 44.40890334 - ], - [ - -124.08463357, - 44.40843865 - ], - [ - -124.08470493, - 44.40798972 - ], - [ - -124.08478255, - 44.40755327 - ], - [ - -124.08485464, - 44.40710002 - ], - [ - -124.084937, - 44.40665373 - ], - [ - -124.08500794, - 44.4062263 - ], - [ - -124.08509662, - 44.40579608 - ], - [ - -124.0851855, - 44.40537637 - ], - [ - -124.08526469, - 44.40493355 - ], - [ - -124.0853604, - 44.40448814 - ], - [ - -124.0854256, - 44.40405236 - ], - [ - -124.08549662, - 44.40364048 - ], - [ - -124.08556736, - 44.40322146 - ], - [ - -124.08563999, - 44.40282071 - ], - [ - -124.08569912, - 44.40241828 - ], - [ - -124.08575541, - 44.40200769 - ], - [ - -124.08579996, - 44.40158931 - ], - [ - -124.08583788, - 44.40116359 - ], - [ - -124.08586248, - 44.40074857 - ], - [ - -124.08588751, - 44.40032682 - ], - [ - -124.08591715, - 44.39990584 - ], - [ - -124.08594765, - 44.3994889 - ], - [ - -124.08598338, - 44.39907611 - ], - [ - -124.08601174, - 44.39866195 - ], - [ - -124.08602915, - 44.3982504 - ], - [ - -124.08605424, - 44.39785357 - ], - [ - -124.08608075, - 44.39746382 - ], - [ - -124.08610102, - 44.39706608 - ], - [ - -124.08612618, - 44.39666548 - ], - [ - -124.08614935, - 44.3962578 - ], - [ - -124.08617283, - 44.3958356 - ], - [ - -124.08619864, - 44.39539612 - ], - [ - -124.08622245, - 44.39494482 - ], - [ - -124.08625353, - 44.39448402 - ], - [ - -124.08627856, - 44.39402613 - ], - [ - -124.08632344, - 44.39356685 - ], - [ - -124.08635422, - 44.39310132 - ], - [ - -124.08641151, - 44.39265309 - ], - [ - -124.08655568, - 44.39222757 - ], - [ - -124.0867262, - 44.39180388 - ], - [ - -124.08690547, - 44.39139068 - ], - [ - -124.08709086, - 44.39098651 - ], - [ - -124.0872532, - 44.39059634 - ], - [ - -124.0874169, - 44.39021887 - ], - [ - -124.08759701, - 44.38985034 - ], - [ - -124.08773617, - 44.38947703 - ], - [ - -124.08786768, - 44.38909557 - ], - [ - -124.08799708, - 44.38870543 - ], - [ - -124.08812654, - 44.38832237 - ], - [ - -124.08824476, - 44.38795648 - ], - [ - -124.08836949, - 44.38759741 - ], - [ - -124.08848898, - 44.38723755 - ], - [ - -124.0886004, - 44.38688288 - ], - [ - -124.08868703, - 44.38652479 - ], - [ - -124.0887235, - 44.38615643 - ], - [ - -124.0887073, - 44.38578298 - ], - [ - -124.08866765, - 44.3854133 - ], - [ - -124.08862364, - 44.38502272 - ], - [ - -124.08857869, - 44.38464463 - ], - [ - -124.08852475, - 44.38428098 - ], - [ - -124.08848203, - 44.383933 - ], - [ - -124.08842158, - 44.383597 - ], - [ - -124.08835965, - 44.3832785 - ], - [ - -124.08830479, - 44.38294095 - ], - [ - -124.08826863, - 44.38260108 - ], - [ - -124.08820845, - 44.3822522 - ], - [ - -124.08816678, - 44.38191104 - ], - [ - -124.08809489, - 44.38155442 - ], - [ - -124.08801834, - 44.38118953 - ], - [ - -124.08799307, - 44.38083131 - ], - [ - -124.08798255, - 44.38046027 - ], - [ - -124.08795659, - 44.38011778 - ], - [ - -124.08794419, - 44.37976553 - ], - [ - -124.08797682, - 44.37942379 - ], - [ - -124.08800555, - 44.37907677 - ], - [ - -124.08807389, - 44.37872006 - ], - [ - -124.08815757, - 44.37836394 - ], - [ - -124.08825646, - 44.37800067 - ], - [ - -124.08831758, - 44.37758827 - ], - [ - -124.0884206, - 44.37717262 - ], - [ - -124.08853293, - 44.37672522 - ], - [ - -124.08862997, - 44.37627187 - ], - [ - -124.0887306, - 44.37582995 - ], - [ - -124.08882129, - 44.37538556 - ], - [ - -124.08891044, - 44.37493614 - ], - [ - -124.08902176, - 44.37449193 - ], - [ - -124.08912412, - 44.37403556 - ], - [ - -124.08922632, - 44.37359816 - ], - [ - -124.08932993, - 44.37315501 - ], - [ - -124.08943379, - 44.37270285 - ], - [ - -124.08953036, - 44.37224868 - ], - [ - -124.08962632, - 44.37178984 - ], - [ - -124.0897062, - 44.37134743 - ], - [ - -124.08979663, - 44.37090437 - ], - [ - -124.08989389, - 44.37045203 - ], - [ - -124.08998729, - 44.36999483 - ], - [ - -124.09008152, - 44.36954793 - ], - [ - -124.09017757, - 44.36911563 - ], - [ - -124.09026309, - 44.36870016 - ], - [ - -124.09033758, - 44.36829176 - ], - [ - -124.09042925, - 44.36791484 - ], - [ - -124.09051605, - 44.36755222 - ], - [ - -124.09059652, - 44.36722549 - ], - [ - -124.09067102, - 44.36688946 - ], - [ - -124.09073613, - 44.36658666 - ], - [ - -124.0908498, - 44.3663165 - ], - [ - -124.09123576, - 44.36621449 - ], - [ - -124.09152652, - 44.3664172 - ], - [ - -124.09150175, - 44.36675248 - ], - [ - -124.09151938, - 44.36705164 - ], - [ - -124.0918594, - 44.36718891 - ], - [ - -124.0922132, - 44.36698833 - ], - [ - -124.09238998, - 44.3666993 - ], - [ - -124.0924104, - 44.36642336 - ], - [ - -124.09232828, - 44.36610462 - ], - [ - -124.09243297, - 44.36578117 - ], - [ - -124.0925485, - 44.36547432 - ] - ] - }, - "properties": { - "title" : "tillicum", - "path_options" : { "color" : "red" }, - "time": [ - 1369786338000, - 1369786340000, - 1369786342000, - 1369786344000, - 1369786346000, - 1369786348000, - 1369786349000, - 1369786351000, - 1369786353000, - 1369786355000, - 1369786357000, - 1369786359000, - 1369786361000, - 1369786363000, - 1369786365000, - 1369786367000, - 1369786369000, - 1369786371000, - 1369786373000, - 1369786375000, - 1369786399000, - 1369786401000, - 1369786403000, - 1369786404000, - 1369786406000, - 1369786408000, - 1369786410000, - 1369786412000, - 1369786414000, - 1369786416000, - 1369786418000, - 1369786420000, - 1369786422000, - 1369786424000, - 1369786426000, - 1369786428000, - 1369786430000, - 1369786432000, - 1369786434000, - 1369786436000, - 1369786438000, - 1369786440000, - 1369786442000, - 1369786444000, - 1369786446000, - 1369786448000, - 1369786449000, - 1369786451000, - 1369786453000, - 1369786455000, - 1369786457000, - 1369786459000, - 1369786461000, - 1369786463000, - 1369786465000, - 1369786467000, - 1369786469000, - 1369786471000, - 1369786472000, - 1369786474000, - 1369786476000, - 1369786478000, - 1369786480000, - 1369786482000, - 1369786484000, - 1369786486000, - 1369786488000, - 1369786490000, - 1369786492000, - 1369786494000, - 1369786495000, - 1369786496000, - 1369786498000, - 1369786500000, - 1369786502000, - 1369786504000, - 1369786506000, - 1369786508000, - 1369786510000, - 1369786512000, - 1369786514000, - 1369786515000, - 1369786516000, - 1369786517000, - 1369786519000, - 1369786521000, - 1369786523000, - 1369786525000, - 1369786527000, - 1369786529000, - 1369786531000, - 1369786533000, - 1369786534000, - 1369786536000, - 1369786537000, - 1369786539000, - 1369786541000, - 1369786542000, - 1369786544000, - 1369786546000, - 1369786548000, - 1369786550000, - 1369786552000, - 1369786554000, - 1369786556000, - 1369786558000, - 1369786560000, - 1369786562000, - 1369786563000, - 1369786564000, - 1369786566000, - 1369786568000, - 1369786570000, - 1369786572000, - 1369786574000, - 1369786576000, - 1369786578000, - 1369786580000, - 1369786582000, - 1369786584000, - 1369786586000, - 1369786588000, - 1369786590000, - 1369786592000, - 1369786594000, - 1369786596000, - 1369786598000, - 1369786599000, - 1369786601000, - 1369786603000, - 1369786605000, - 1369786607000, - 1369786609000, - 1369786611000, - 1369786613000, - 1369786615000, - 1369786617000, - 1369786619000, - 1369786621000, - 1369786623000, - 1369786625000, - 1369786627000, - 1369786629000, - 1369786631000, - 1369786633000, - 1369786635000, - 1369786637000, - 1369786639000, - 1369786640000, - 1369786642000, - 1369786644000, - 1369786646000, - 1369786648000, - 1369786650000, - 1369786652000, - 1369786654000, - 1369786655000, - 1369786656000, - 1369786658000, - 1369786660000, - 1369786662000, - 1369786664000, - 1369786666000, - 1369786668000, - 1369786670000, - 1369786672000, - 1369786674000, - 1369786676000, - 1369786678000, - 1369786680000, - 1369786682000, - 1369786684000, - 1369786686000, - 1369786687000, - 1369786688000, - 1369786689000, - 1369786691000, - 1369786692000, - 1369786693000, - 1369786694000, - 1369786695000, - 1369786697000, - 1369786699000, - 1369786701000, - 1369786703000, - 1369786705000, - 1369786715000, - 1369786716000, - 1369786717000, - 1369786718000, - 1369786719000, - 1369786720000, - 1369786721000, - 1369786722000, - 1369786723000, - 1369786724000, - 1369786725000, - 1369786726000, - 1369786728000, - 1369786730000, - 1369786732000, - 1369786734000, - 1369786736000, - 1369786738000, - 1369786740000, - 1369786742000, - 1369786744000, - 1369786746000, - 1369786748000, - 1369786750000, - 1369786752000, - 1369786754000, - 1369786756000, - 1369786758000, - 1369786760000, - 1369786762000, - 1369786764000, - 1369786766000, - 1369786768000, - 1369786770000, - 1369786772000, - 1369786774000, - 1369786776000, - 1369786778000, - 1369786780000, - 1369786782000, - 1369786784000, - 1369786786000, - 1369786788000, - 1369786790000, - 1369786792000, - 1369786793000, - 1369786795000, - 1369786797000, - 1369786799000, - 1369786801000, - 1369786803000, - 1369786805000, - 1369786807000, - 1369786809000, - 1369786810000, - 1369786812000, - 1369786814000, - 1369786816000, - 1369786818000, - 1369786820000, - 1369786822000, - 1369786824000, - 1369786826000, - 1369786828000, - 1369786830000, - 1369786832000, - 1369786834000, - 1369786836000, - 1369786838000, - 1369786840000, - 1369786842000, - 1369786844000, - 1369786846000, - 1369786848000, - 1369786850000, - 1369786852000, - 1369786854000, - 1369786856000, - 1369786857000, - 1369786859000, - 1369786861000, - 1369786862000, - 1369786864000, - 1369786866000, - 1369786867000, - 1369786869000, - 1369786871000, - 1369786873000, - 1369786875000, - 1369786877000, - 1369786878000, - 1369786880000, - 1369786882000, - 1369786883000, - 1369786884000, - 1369786886000, - 1369786888000, - 1369786890000, - 1369786892000, - 1369786894000, - 1369786896000, - 1369786898000, - 1369786900000, - 1369786902000, - 1369786904000, - 1369786905000, - 1369786906000, - 1369786908000, - 1369786910000, - 1369786912000, - 1369786914000, - 1369786916000, - 1369786918000, - 1369786920000, - 1369786922000, - 1369786924000, - 1369786926000, - 1369786927000, - 1369786928000, - 1369786929000, - 1369786960000, - 1369786961000, - 1369786962000, - 1369786963000, - 1369786965000, - 1369786967000, - 1369786969000, - 1369786971000, - 1369786972000, - 1369786973000, - 1369786974000, - 1369786976000, - 1369786978000, - 1369786980000, - 1369786982000, - 1369786984000, - 1369786986000, - 1369786988000, - 1369786990000, - 1369786992000, - 1369786993000, - 1369786994000, - 1369786996000, - 1369786998000, - 1369786999000, - 1369787000000, - 1369787001000, - 1369787003000, - 1369787005000, - 1369787007000, - 1369787009000, - 1369787011000, - 1369787013000, - 1369787015000, - 1369787016000, - 1369787018000, - 1369787020000, - 1369787022000, - 1369787023000, - 1369787025000, - 1369787027000, - 1369787029000, - 1369787031000, - 1369787033000, - 1369787035000, - 1369787037000, - 1369787039000, - 1369787041000, - 1369787043000, - 1369787045000, - 1369787047000, - 1369787048000, - 1369787050000, - 1369787052000, - 1369787054000, - 1369787056000, - 1369787058000, - 1369787060000, - 1369787062000, - 1369787064000, - 1369787066000, - 1369787068000, - 1369787070000, - 1369787072000, - 1369787074000, - 1369787076000, - 1369787077000, - 1369787079000, - 1369787081000, - 1369787083000, - 1369787085000, - 1369787087000, - 1369787089000, - 1369787091000, - 1369787093000, - 1369787095000, - 1369787097000, - 1369787099000, - 1369787101000, - 1369787103000, - 1369787105000, - 1369787107000, - 1369787109000, - 1369787111000, - 1369787113000, - 1369787115000, - 1369787117000, - 1369787119000, - 1369787121000, - 1369787123000, - 1369787125000, - 1369787127000, - 1369787129000, - 1369787131000, - 1369787133000, - 1369787135000, - 1369787137000, - 1369787138000, - 1369787140000, - 1369787142000, - 1369787144000, - 1369787146000, - 1369787148000, - 1369787150000, - 1369787152000, - 1369787154000, - 1369787156000, - 1369787158000, - 1369787160000, - 1369787162000, - 1369787164000, - 1369787166000, - 1369787168000, - 1369787169000, - 1369787170000, - 1369787172000, - 1369787174000, - 1369787176000, - 1369787178000, - 1369787180000, - 1369787181000, - 1369787182000, - 1369787183000, - 1369787185000, - 1369787187000, - 1369787189000, - 1369787191000, - 1369787193000, - 1369787194000, - 1369787195000, - 1369787197000, - 1369787199000, - 1369787201000, - 1369787203000, - 1369787205000, - 1369787207000, - 1369787209000, - 1369787210000, - 1369787212000, - 1369787214000, - 1369787216000, - 1369787218000, - 1369787220000, - 1369787222000, - 1369787224000, - 1369787226000, - 1369787228000, - 1369787230000, - 1369787232000, - 1369787236000, - 1369787238000, - 1369787240000, - 1369787243000, - 1369787244000, - 1369787245000, - 1369787247000, - 1369787248000, - 1369787249000, - 1369787251000, - 1369787252000, - 1369787254000, - 1369787255000, - 1369787257000, - 1369787258000, - 1369787260000, - 1369787262000, - 1369787264000, - 1369787265000, - 1369787267000, - 1369787269000, - 1369787271000, - 1369787273000, - 1369787275000, - 1369787277000, - 1369787279000, - 1369787281000, - 1369787283000, - 1369787285000, - 1369787287000, - 1369787289000, - 1369787291000, - 1369787293000, - 1369787295000, - 1369787297000, - 1369787299000, - 1369787301000, - 1369787303000, - 1369787305000, - 1369787307000, - 1369787309000, - 1369787311000, - 1369787313000, - 1369787315000, - 1369787317000, - 1369787319000, - 1369787321000, - 1369787323000, - 1369787325000, - 1369787327000, - 1369787329000, - 1369787331000, - 1369787333000, - 1369787335000, - 1369787337000, - 1369787339000, - 1369787341000, - 1369787343000, - 1369787345000, - 1369787347000, - 1369787349000, - 1369787351000, - 1369787353000, - 1369787355000, - 1369787357000, - 1369787359000, - 1369787361000, - 1369787363000, - 1369787365000, - 1369787367000, - 1369787369000, - 1369787371000, - 1369787373000, - 1369787375000, - 1369787377000, - 1369787379000, - 1369787381000, - 1369787383000, - 1369787385000, - 1369787387000, - 1369787389000, - 1369787391000, - 1369787393000, - 1369787395000, - 1369787397000, - 1369787399000, - 1369787401000, - 1369787403000, - 1369787405000, - 1369787407000, - 1369787409000, - 1369787411000, - 1369787412000, - 1369787414000, - 1369787416000, - 1369787417000, - 1369787419000, - 1369787421000, - 1369787423000, - 1369787425000, - 1369787427000, - 1369787429000, - 1369787431000, - 1369787435000, - 1369787436000, - 1369787437000, - 1369787439000, - 1369787440000, - 1369787441000, - 1369787443000, - 1369787445000, - 1369787447000, - 1369787449000, - 1369787451000, - 1369787453000, - 1369787454000, - 1369787456000, - 1369787457000, - 1369787458000, - 1369787460000, - 1369787462000, - 1369787464000, - 1369787466000, - 1369787468000, - 1369787470000, - 1369787472000, - 1369787474000, - 1369787476000, - 1369787478000, - 1369787480000, - 1369787482000, - 1369787484000, - 1369787486000, - 1369787488000, - 1369787490000, - 1369787492000, - 1369787494000, - 1369787496000, - 1369787498000, - 1369787500000, - 1369787502000, - 1369787504000, - 1369787506000, - 1369787508000, - 1369787510000, - 1369787512000, - 1369787514000, - 1369787516000, - 1369787518000, - 1369787520000, - 1369787522000, - 1369787524000, - 1369787525000, - 1369787527000, - 1369787529000, - 1369787531000, - 1369787533000, - 1369787535000, - 1369787536000, - 1369787538000, - 1369787539000, - 1369787541000, - 1369787543000, - 1369787545000, - 1369787547000, - 1369787549000, - 1369787551000, - 1369787553000, - 1369787555000, - 1369787557000, - 1369787559000, - 1369787561000, - 1369787562000, - 1369787564000, - 1369787566000, - 1369787568000, - 1369787570000, - 1369787572000, - 1369787574000, - 1369787576000, - 1369787578000, - 1369787580000, - 1369787582000, - 1369787584000, - 1369787586000, - 1369787588000, - 1369787590000, - 1369787592000, - 1369787594000, - 1369787596000, - 1369787598000, - 1369787600000, - 1369787602000, - 1369787604000, - 1369787610000, - 1369787612000, - 1369787614000, - 1369787616000, - 1369787618000, - 1369787620000, - 1369787622000, - 1369787624000, - 1369787626000, - 1369787628000, - 1369787630000, - 1369787632000, - 1369787634000, - 1369787636000, - 1369787638000, - 1369787640000, - 1369787642000, - 1369787644000, - 1369787646000, - 1369787648000, - 1369787650000, - 1369787652000, - 1369787654000, - 1369787656000, - 1369787658000, - 1369787660000, - 1369787662000, - 1369787664000, - 1369787666000, - 1369787668000, - 1369787670000, - 1369787671000, - 1369787673000, - 1369787675000, - 1369787677000, - 1369787678000, - 1369787680000, - 1369787682000, - 1369787684000, - 1369787686000, - 1369787688000, - 1369787690000, - 1369787692000, - 1369787694000, - 1369787696000, - 1369787698000, - 1369787700000, - 1369787702000, - 1369787704000, - 1369787706000, - 1369787708000, - 1369787710000, - 1369787712000, - 1369787714000, - 1369787716000, - 1369787718000, - 1369787720000, - 1369787722000, - 1369787724000, - 1369787726000, - 1369787728000, - 1369787730000, - 1369787732000, - 1369787734000, - 1369787736000, - 1369787738000, - 1369787740000, - 1369787742000, - 1369787744000, - 1369787746000, - 1369787748000, - 1369787750000, - 1369787752000, - 1369787754000, - 1369787756000, - 1369787758000, - 1369787760000, - 1369787762000, - 1369787764000, - 1369787766000, - 1369787768000, - 1369787770000, - 1369787772000, - 1369787774000, - 1369787776000, - 1369787778000, - 1369787780000, - 1369787782000, - 1369787784000, - 1369787786000, - 1369787788000, - 1369787790000, - 1369787792000, - 1369787794000, - 1369787796000, - 1369787798000, - 1369787800000, - 1369787802000, - 1369787804000, - 1369787806000, - 1369787808000, - 1369787810000, - 1369787812000, - 1369787814000, - 1369787816000, - 1369787818000, - 1369787820000, - 1369787822000, - 1369787824000, - 1369787826000, - 1369787828000, - 1369787830000, - 1369787832000, - 1369787833000, - 1369787835000, - 1369787837000, - 1369787839000, - 1369787841000, - 1369787843000, - 1369787845000, - 1369787847000, - 1369787849000, - 1369787851000, - 1369787853000, - 1369787855000, - 1369787857000, - 1369787859000, - 1369787861000, - 1369787865000, - 1369787866000, - 1369787867000, - 1369787869000, - 1369787871000, - 1369787873000, - 1369787875000, - 1369787877000, - 1369787880000, - 1369787882000, - 1369787884000, - 1369787886000, - 1369787888000, - 1369787890000, - 1369787892000, - 1369787895000, - 1369787898000, - 1369787901000, - 1369787904000, - 1369787906000, - 1369787908000, - 1369787910000, - 1369787912000, - 1369787914000, - 1369787917000, - 1369787920000, - 1369787925000, - 1369787930000, - 1369787937000, - 1369788765000, - 1369788771000, - 1369788777000, - 1369788782000, - 1369788789000, - 1369788793000, - 1369788796000, - 1369788799000, - 1369788802000, - 1369788805000, - 1369788808000, - 1369788811000, - 1369788814000, - 1369788817000, - 1369788820000, - 1369788823000, - 1369788826000, - 1369788829000, - 1369788832000, - 1369788835000, - 1369788839000, - 1369788857000, - 1369788864000, - 1369788870000, - 1369788874000, - 1369788878000, - 1369788882000, - 1369788885000, - 1369788889000, - 1369788892000, - 1369788895000, - 1369788898000, - 1369788901000, - 1369788903000, - 1369788906000, - 1369788908000, - 1369788910000, - 1369788912000, - 1369788914000, - 1369788916000, - 1369788918000, - 1369788920000, - 1369788922000, - 1369788924000, - 1369788926000, - 1369788928000, - 1369788930000, - 1369788932000, - 1369788934000, - 1369788936000, - 1369788938000, - 1369788940000, - 1369788942000, - 1369788944000, - 1369788946000, - 1369788948000, - 1369788950000, - 1369788952000, - 1369788954000, - 1369788956000, - 1369788958000, - 1369788960000, - 1369788962000, - 1369788964000, - 1369788966000, - 1369788968000, - 1369788970000, - 1369788972000, - 1369788974000, - 1369788976000, - 1369788978000, - 1369788980000, - 1369788982000, - 1369788984000, - 1369788986000, - 1369788988000, - 1369788990000, - 1369788992000, - 1369788994000, - 1369788996000, - 1369788998000, - 1369789000000, - 1369789002000, - 1369789004000, - 1369789006000, - 1369789008000, - 1369789010000, - 1369789012000, - 1369789014000, - 1369789016000, - 1369789018000, - 1369789020000, - 1369789022000, - 1369789024000, - 1369789026000, - 1369789028000, - 1369789030000, - 1369789032000, - 1369789034000, - 1369789036000, - 1369789038000, - 1369789040000, - 1369789042000, - 1369789044000, - 1369789046000, - 1369789048000, - 1369789050000, - 1369789052000, - 1369789054000, - 1369789056000, - 1369789058000, - 1369789060000, - 1369789062000, - 1369789064000, - 1369789066000, - 1369789068000, - 1369789070000, - 1369789072000, - 1369789074000, - 1369789076000, - 1369789078000, - 1369789080000, - 1369789082000, - 1369789084000, - 1369789086000, - 1369789088000, - 1369789090000, - 1369789092000, - 1369789094000, - 1369789096000, - 1369789098000, - 1369789100000, - 1369789102000, - 1369789104000, - 1369789106000, - 1369789108000, - 1369789110000, - 1369789112000, - 1369789114000, - 1369789116000, - 1369789118000, - 1369789120000, - 1369789122000, - 1369789124000, - 1369789126000, - 1369789128000, - 1369789130000, - 1369789132000, - 1369789134000, - 1369789136000, - 1369789138000, - 1369789140000, - 1369789142000, - 1369789144000, - 1369789146000, - 1369789148000, - 1369789150000, - 1369789152000, - 1369789154000, - 1369789156000, - 1369789158000, - 1369789160000, - 1369789162000, - 1369789164000, - 1369789166000, - 1369789168000, - 1369789170000, - 1369789172000, - 1369789174000, - 1369789176000, - 1369789178000, - 1369789180000, - 1369789182000, - 1369789184000, - 1369789186000, - 1369789188000, - 1369789190000, - 1369789192000, - 1369789194000, - 1369789196000, - 1369789198000, - 1369789200000, - 1369789202000, - 1369789204000, - 1369789206000, - 1369789208000, - 1369789210000, - 1369789212000, - 1369789214000, - 1369789216000, - 1369789218000, - 1369789221000, - 1369789226000, - 1369789233000, - 1369789244000, - 1369789249000, - 1369789255000, - 1369789260000, - 1369789265000, - 1369789270000, - 1369789275000, - 1369789280000, - 1369789285000 - ], - "speed": [ - 85, - 88, - 90, - 91, - 91, - 89, - 88, - 87, - 88, - 88, - 88, - 86, - 85, - 82, - 80, - 79, - 79, - 79, - 80, - 79, - 85, - 86, - 85, - 86, - 88, - 89, - 88, - 86, - 87, - 87, - 82, - 79, - 82, - 85, - 80, - 77, - 77, - 77, - 77, - 77, - 77, - 77, - 77, - 76, - 79, - 79, - 86, - 86, - 85, - 81, - 80, - 80, - 78, - 78, - 79, - 85, - 81, - 71, - 77, - 85, - 84, - 77, - 78, - 77, - 77, - 75, - 77, - 77, - 78, - 83, - 86, - 81, - 77, - 71, - 70, - 69, - 76, - 77, - 80, - 81, - 83, - 85, - 84, - 85, - 83, - 82, - 82, - 80, - 85, - 81, - 79, - 71, - 69, - 63, - 68, - 69, - 70, - 75, - 76, - 82, - 84, - 84, - 86, - 87, - 87, - 86, - 88, - 87, - 92, - 95, - 94, - 95, - 93, - 93, - 91, - 90, - 93, - 93, - 92, - 94, - 93, - 90, - 90, - 88, - 89, - 89, - 87, - 93, - 93, - 91, - 94, - 96, - 94, - 95, - 95, - 95, - 94, - 92, - 93, - 95, - 95, - 95, - 93, - 94, - 93, - 93, - 95, - 95, - 95, - 95, - 95, - 94, - 91, - 90, - 92, - 92, - 95, - 95, - 92, - 92, - 92, - 90, - 90, - 92, - 95, - 94, - 97, - 98, - 97, - 95, - 90, - 91, - 90, - 94, - 95, - 93, - 91, - 95, - 97, - 99, - 102, - 88, - 87, - 86, - 85, - 85, - 89, - 92, - 93, - 95, - 95, - 99, - 100, - 99, - 99, - 98, - 97, - 97, - 95, - 97, - 95, - 95, - 95, - 95, - 97, - 97, - 97, - 96, - 99, - 99, - 98, - 95, - 95, - 96, - 96, - 94, - 91, - 90, - 92, - 95, - 95, - 95, - 95, - 98, - 97, - 96, - 97, - 95, - 94, - 92, - 94, - 95, - 97, - 97, - 100, - 95, - 86, - 88, - 89, - 94, - 95, - 95, - 97, - 96, - 95, - 95, - 96, - 93, - 89, - 83, - 85, - 81, - 86, - 84, - 85, - 88, - 88, - 86, - 82, - 79, - 77, - 77, - 74, - 78, - 82, - 79, - 76, - 83, - 80, - 86, - 89, - 89, - 90, - 89, - 88, - 86, - 88, - 91, - 91, - 94, - 94, - 91, - 90, - 88, - 89, - 91, - 93, - 91, - 86, - 80, - 80, - 86, - 90, - 92, - 92, - 92, - 92, - 93, - 95, - 95, - 95, - 87, - 87, - 86, - 88, - 91, - 93, - 91, - 92, - 90, - 88, - 90, - 79, - 79, - 89, - 86, - 86, - 89, - 90, - 86, - 86, - 82, - 85, - 86, - 90, - 90, - 91, - 92, - 92, - 88, - 89, - 93, - 96, - 94, - 96, - 95, - 95, - 95, - 92, - 94, - 95, - 96, - 98, - 96, - 96, - 96, - 94, - 91, - 93, - 94, - 96, - 94, - 95, - 95, - 94, - 87, - 88, - 93, - 95, - 100, - 99, - 102, - 96, - 98, - 98, - 95, - 94, - 96, - 97, - 96, - 96, - 96, - 96, - 95, - 97, - 95, - 95, - 94, - 95, - 95, - 93, - 96, - 93, - 92, - 92, - 91, - 92, - 91, - 92, - 91, - 92, - 94, - 89, - 92, - 95, - 98, - 93, - 87, - 86, - 86, - 88, - 90, - 92, - 94, - 92, - 87, - 87, - 90, - 92, - 92, - 93, - 94, - 94, - 95, - 91, - 89, - 90, - 93, - 92, - 94, - 94, - 96, - 95, - 93, - 90, - 85, - 88, - 94, - 95, - 94, - 95, - 95, - 93, - 92, - 91, - 95, - 94, - 95, - 96, - 95, - 93, - 89, - 91, - 91, - 90, - 89, - 86, - 85, - 87, - 85, - 83, - 80, - 71, - 72, - 71, - 29, - 23, - 30, - 53, - 67, - 78, - 94, - 98, - 100, - 101, - 103, - 103, - 103, - 103, - 103, - 101, - 97, - 89, - 93, - 92, - 93, - 95, - 94, - 95, - 94, - 92, - 85, - 84, - 82, - 79, - 77, - 77, - 80, - 79, - 77, - 77, - 82, - 85, - 83, - 85, - 85, - 84, - 83, - 83, - 81, - 86, - 88, - 91, - 90, - 90, - 86, - 83, - 84, - 82, - 83, - 86, - 87, - 88, - 90, - 89, - 92, - 90, - 86, - 83, - 88, - 90, - 89, - 89, - 87, - 88, - 86, - 83, - 89, - 90, - 93, - 91, - 91, - 87, - 86, - 86, - 87, - 86, - 86, - 86, - 86, - 85, - 86, - 89, - 89, - 89, - 91, - 92, - 96, - 97, - 97, - 99, - 100, - 95, - 85, - 86, - 81, - 84, - 83, - 59, - 72, - 74, - 74, - 75, - 80, - 81, - 86, - 87, - 88, - 88, - 90, - 95, - 89, - 92, - 92, - 90, - 86, - 85, - 85, - 85, - 86, - 89, - 89, - 91, - 91, - 94, - 94, - 94, - 92, - 91, - 93, - 91, - 91, - 88, - 87, - 86, - 87, - 86, - 85, - 83, - 82, - 81, - 81, - 82, - 85, - 89, - 90, - 90, - 94, - 95, - 95, - 97, - 97, - 98, - 100, - 102, - 101, - 100, - 100, - 98, - 97, - 95, - 96, - 96, - 95, - 94, - 89, - 89, - 92, - 95, - 94, - 94, - 96, - 98, - 95, - 94, - 92, - 94, - 95, - 95, - 95, - 95, - 95, - 95, - 94, - 93, - 93, - 92, - 94, - 96, - 92, - 92, - 95, - 93, - 93, - 91, - 88, - 87, - 89, - 89, - 90, - 93, - 91, - 90, - 91, - 91, - 88, - 89, - 89, - 89, - 89, - 91, - 91, - 93, - 93, - 93, - 90, - 93, - 95, - 95, - 100, - 101, - 97, - 97, - 96, - 97, - 96, - 96, - 92, - 91, - 93, - 92, - 92, - 92, - 90, - 90, - 91, - 90, - 92, - 94, - 93, - 91, - 91, - 93, - 94, - 94, - 92, - 92, - 91, - 91, - 92, - 94, - 92, - 89, - 93, - 92, - 93, - 95, - 97, - 100, - 98, - 94, - 90, - 87, - 82, - 79, - 77, - 79, - 78, - 78, - 75, - 76, - 79, - 78, - 79, - 77, - 77, - 78, - 79, - 78, - 77, - 77, - 78, - 79, - 79, - 78, - 77, - 78, - 78, - 80, - 79, - 78, - 80, - 81, - 77, - 79, - 77, - 77, - 77, - 77, - 77, - 71, - 76, - 80, - 79, - 77, - 77, - 73, - 73, - 69, - 68, - 69, - 70, - 70, - 70, - 67, - 67, - 67, - 60, - 62, - 64, - 67, - 62, - 63, - 66, - 65, - 57, - 60, - 59, - 61, - 60, - 64, - 60, - 50, - 52, - 42, - 43, - 53, - 59, - 61, - 58, - 55, - 50, - 45, - 23, - 30, - 18, - 21, - 17, - 26, - 20, - 21, - 34, - 41, - 45, - 41, - 40, - 39, - 40, - 39, - 40, - 41, - 41, - 40, - 38, - 39, - 37, - 21, - 16, - 16, - 23, - 32, - 33, - 36, - 35, - 24, - 41, - 52, - 54, - 57, - 56, - 56, - 57, - 59, - 61, - 64, - 68, - 68, - 72, - 74, - 75, - 75, - 74, - 73, - 72, - 72, - 72, - 69, - 69, - 68, - 68, - 68, - 68, - 67, - 68, - 68, - 68, - 68, - 69, - 69, - 70, - 69, - 69, - 68, - 68, - 65, - 65, - 67, - 68, - 71, - 73, - 73, - 78, - 86, - 89, - 91, - 91, - 90, - 89, - 89, - 88, - 87, - 89, - 90, - 89, - 90, - 91, - 89, - 88, - 86, - 86, - 88, - 89, - 86, - 85, - 83, - 81, - 82, - 83, - 85, - 86, - 85, - 84, - 85, - 85, - 84, - 83, - 82, - 79, - 79, - 79, - 81, - 82, - 86, - 88, - 91, - 93, - 92, - 92, - 94, - 91, - 88, - 87, - 87, - 84, - 81, - 79, - 77, - 77, - 79, - 80, - 78, - 76, - 75, - 73, - 73, - 73, - 73, - 75, - 74, - 77, - 76, - 74, - 69, - 68, - 68, - 66, - 68, - 70, - 70, - 72, - 74, - 71, - 70, - 70, - 70, - 68, - 68, - 72, - 74, - 75, - 81, - 85, - 87, - 89, - 90, - 89, - 90, - 90, - 91, - 89, - 91, - 91, - 92, - 92, - 90, - 92, - 91, - 91, - 90, - 86, - 83, - 82, - 78, - 75, - 70, - 68, - 63, - 41, - 23, - 14, - 20, - 21, - 22, - 26, - 23, - 23, - 26, - 26, - 25 - ], - "altitude": [ - 49, - 50, - 49, - 50, - 50, - 50, - 49, - 49, - 49, - 49, - 49, - 50, - 49, - 49, - 49, - 48, - 48, - 48, - 48, - 48, - 47, - 46, - 47, - 47, - 46, - 45, - 45, - 44, - 45, - 45, - 44, - 43, - 43, - 43, - 42, - 42, - 43, - 43, - 43, - 43, - 41, - 41, - 41, - 41, - 41, - 41, - 40, - 40, - 41, - 40, - 40, - 41, - 40, - 39, - 39, - 39, - 38, - 39, - 39, - 39, - 40, - 38, - 34, - 32, - 33, - 32, - 31, - 31, - 30, - 29, - 27, - 24, - 24, - 24, - 24, - 24, - 24, - 25, - 25, - 25, - 26, - 28, - 31, - 34, - 34, - 36, - 36, - 36, - 35, - 36, - 37, - 39, - 40, - 40, - 40, - 40, - 40, - 37, - 36, - 35, - 35, - 35, - 33, - 30, - 30, - 30, - 30, - 30, - 30, - 24, - 23, - 22, - 23, - 24, - 23, - 23, - 24, - 25, - 24, - 24, - 24, - 23, - 25, - 26, - 26, - 26, - 26, - 26, - 25, - 25, - 22, - 23, - 24, - 24, - 24, - 23, - 23, - 23, - 23, - 23, - 21, - 21, - 21, - 20, - 19, - 18, - 18, - 17, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 17, - 16, - 16, - 16, - 16, - 15, - 16, - 16, - 16, - 17, - 15, - 15, - 14, - 14, - 13, - 13, - 13, - 13, - 13, - 12, - 13, - 13, - 13, - 14, - 14, - 14, - 15, - 15, - 15, - 15, - 17, - 17, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 19, - 19, - 19, - 19, - 20, - 20, - 21, - 19, - 20, - 21, - 21, - 22, - 22, - 22, - 23, - 23, - 23, - 24, - 24, - 24, - 25, - 25, - 25, - 25, - 25, - 25, - 26, - 26, - 26, - 26, - 26, - 26, - 26, - 25, - 26, - 28, - 30, - 30, - 29, - 29, - 29, - 30, - 30, - 30, - 29, - 30, - 30, - 30, - 30, - 30, - 31, - 30, - 30, - 30, - 31, - 31, - 32, - 33, - 35, - 35, - 35, - 34, - 34, - 35, - 35, - 36, - 36, - 36, - 36, - 36, - 36, - 33, - 32, - 31, - 32, - 32, - 31, - 31, - 31, - 31, - 31, - 31, - 31, - 30, - 30, - 30, - 30, - 29, - 29, - 29, - 29, - 29, - 29, - 30, - 30, - 30, - 30, - 30, - 30, - 30, - 30, - 30, - 30, - 30, - 29, - 26, - 26, - 26, - 27, - 27, - 27, - 28, - 28, - 28, - 29, - 29, - 29, - 29, - 28, - 28, - 28, - 27, - 27, - 27, - 27, - 27, - 27, - 28, - 28, - 28, - 28, - 28, - 28, - 29, - 29, - 30, - 30, - 31, - 30, - 30, - 28, - 27, - 27, - 26, - 25, - 25, - 25, - 25, - 24, - 24, - 24, - 24, - 24, - 23, - 23, - 23, - 23, - 23, - 23, - 24, - 24, - 24, - 24, - 24, - 24, - 23, - 23, - 23, - 22, - 22, - 22, - 20, - 20, - 20, - 19, - 18, - 18, - 18, - 17, - 16, - 16, - 17, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 18, - 17, - 17, - 17, - 17, - 17, - 16, - 15, - 15, - 16, - 15, - 15, - 15, - 15, - 16, - 16, - 15, - 14, - 15, - 14, - 15, - 14, - 13, - 13, - 13, - 13, - 14, - 15, - 15, - 14, - 14, - 14, - 14, - 14, - 14, - 14, - 14, - 23, - 23, - 23, - 23, - 23, - 23, - 23, - 23, - 23, - 23, - 22, - 22, - 22, - 22, - 22, - 22, - 22, - 22, - 23, - 23, - 23, - 23, - 23, - 23, - 24, - 24, - 25, - 27, - 28, - 28, - 29, - 29, - 29, - 29, - 29, - 29, - 30, - 30, - 30, - 30, - 30, - 31, - 31, - 31, - 31, - 32, - 31, - 30, - 28, - 28, - 27, - 26, - 26, - 26, - 26, - 25, - 25, - 26, - 25, - 25, - 25, - 25, - 25, - 25, - 25, - 23, - 20, - 16, - 13, - 11, - 10, - 10, - 10, - 9, - 9, - 9, - 9, - 8, - 8, - 7, - 6, - 5, - 6, - 5, - 5, - 4, - 4, - 3, - 22, - 22, - 22, - 21, - 20, - 20, - 20, - 20, - 20, - 20, - 19, - 19, - 18, - 16, - 15, - 13, - 12, - 12, - 12, - 11, - 12, - 11, - 11, - 11, - 10, - 10, - 10, - 9, - 9, - 9, - 9, - 8, - 8, - 8, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 7, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 9, - 9, - 9, - 9, - 10, - 10, - 10, - 11, - 11, - 12, - 12, - 13, - 11, - 11, - 11, - 8, - 7, - 6, - 6, - 6, - 7, - 7, - 7, - 7, - 7, - 9, - 10, - 10, - 10, - 9, - 10, - 9, - 9, - 9, - 9, - 10, - 12, - 12, - 12, - 11, - 11, - 12, - 11, - 11, - 12, - 12, - 12, - 12, - 12, - 12, - 12, - 12, - 12, - 13, - 13, - 13, - 13, - 13, - 13, - 13, - 13, - 13, - 10, - 9, - 9, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 9, - 9, - 9, - 9, - 9, - 9, - 10, - 10, - 12, - 14, - 13, - 11, - 9, - 9, - 6, - 6, - 7, - 7, - 7, - 8, - 8, - 9, - 9, - 10, - 10, - 10, - 10, - 9, - 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, - 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, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 9, - 9, - 9, - 9, - 9, - 9, - 9, - 8, - 9, - 9, - 9, - 9, - 9, - 9, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 9, - 9, - 9, - 9, - 9, - 9, - 9, - 9, - 9, - 9, - 10, - 10, - 9, - 10, - 10, - 10, - 10, - 10, - 11, - 11, - 11, - 11, - 11, - 12, - 12, - 12, - 11, - 12, - 11, - 6, - 3, - 5, - 4, - 3, - 2, - 4, - 3, - 3, - 3, - 3, - 5, - 3, - 1, - -4, - 0, - 0, - -1, - -2, - -4, - -3, - -4, - -6, - -8, - -8, - -8, - -10, - 4, - 2, - 1, - 1, - -2, - -3, - -3, - -4, - -2, - -3, - -3, - -4, - -5, - -5, - -6, - -6, - -6, - -7, - -8, - -8, - -8, - -7, - -6, - -10, - -11, - -11, - -10, - -10, - -10, - -11, - -12, - -11, - -11, - -12, - -12, - -12, - -12, - -12, - -13, - -13, - -13, - -12, - -13, - -12, - -12, - -12, - -12, - -12, - -12, - -13, - -12, - -12, - -11, - -11, - -11, - -10, - -10, - -9, - -8, - -9, - -9, - -9, - -10, - -9, - -9, - -8, - -7, - -6, - -6, - -5, - -5, - -6, - -6, - -5, - -7, - -8, - -9, - -8, - -7, - -8, - -8, - -7, - -8, - -8, - -7, - -8, - -8, - -9, - -10, - -10, - -11, - -11, - -12, - -12, - -11, - -11, - -11, - -8, - -6, - -6, - -6, - -7, - -7, - -8, - -9, - -10, - -11, - -10, - -10, - -10, - -8, - -7, - -6, - -6, - -7, - -9, - -10, - -12, - -13, - -14, - -15, - -15, - -16, - -17, - -17, - -16, - -15, - -13, - -12, - -11, - -11, - -10, - -11, - -11, - -10, - -9, - -9, - -8, - -9, - -9, - -9, - -9, - -10, - -10, - -11, - -10, - -11, - -11, - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -10, - -9, - -9, - -9, - -8, - -8, - -9, - -10, - -10, - -11, - -12, - -12, - -13, - -14, - -13, - -14, - -14, - -15, - -15, - -15, - -15, - -13, - -14, - -14, - -13, - -13, - -11, - -11, - -12, - -12, - -12, - -12, - -12, - -12, - -12, - -13, - -11, - -11, - -12, - -13, - -12, - -11, - -9, - -9, - -10, - -10 - ], - "heading": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "horizontal_accuracy": [ - 87, - 79, - 59, - 43, - 54, - 55, - 40, - 33, - 30, - 32, - 29, - 33, - 40, - 53, - 77, - 92, - 93, - 103, - 114, - 139, - 121, - 130, - 127, - 102, - 46, - 28, - 24, - 22, - 21, - 28, - 29, - 30, - 29, - 30, - 22, - 21, - 26, - 30, - 41, - 61, - 39, - 34, - 36, - 39, - 38, - 38, - 35, - 41, - 45, - 44, - 45, - 45, - 50, - 45, - 27, - 22, - 24, - 25, - 24, - 22, - 20, - 15, - 14, - 13, - 15, - 15, - 17, - 22, - 29, - 34, - 30, - 29, - 24, - 23, - 26, - 27, - 22, - 19, - 18, - 15, - 13, - 13, - 11, - 10, - 8, - 9, - 11, - 13, - 13, - 16, - 20, - 23, - 24, - 27, - 27, - 27, - 31, - 27, - 25, - 22, - 17, - 18, - 17, - 14, - 15, - 13, - 14, - 18, - 16, - 11, - 10, - 11, - 12, - 12, - 11, - 11, - 12, - 14, - 17, - 17, - 17, - 12, - 9, - 10, - 11, - 13, - 16, - 16, - 15, - 16, - 14, - 12, - 10, - 11, - 10, - 11, - 13, - 12, - 13, - 13, - 14, - 15, - 16, - 17, - 18, - 18, - 15, - 15, - 15, - 17, - 19, - 20, - 20, - 19, - 18, - 16, - 13, - 13, - 13, - 12, - 12, - 13, - 14, - 15, - 19, - 20, - 20, - 21, - 22, - 20, - 19, - 20, - 23, - 22, - 21, - 20, - 26, - 30, - 35, - 40, - 47, - 50, - 64, - 84, - 109, - 138, - 147, - 140, - 136, - 129, - 116, - 97, - 86, - 70, - 65, - 62, - 58, - 52, - 29, - 25, - 24, - 25, - 29, - 21, - 21, - 19, - 16, - 15, - 15, - 16, - 16, - 18, - 21, - 19, - 18, - 18, - 17, - 16, - 16, - 13, - 12, - 11, - 11, - 12, - 13, - 15, - 18, - 16, - 16, - 17, - 16, - 14, - 12, - 12, - 13, - 15, - 12, - 11, - 10, - 9, - 10, - 9, - 10, - 9, - 7, - 7, - 7, - 7, - 7, - 7, - 8, - 9, - 9, - 9, - 10, - 11, - 14, - 14, - 14, - 14, - 18, - 20, - 22, - 22, - 21, - 24, - 28, - 27, - 28, - 21, - 19, - 18, - 18, - 18, - 19, - 18, - 17, - 18, - 22, - 21, - 20, - 19, - 16, - 15, - 17, - 18, - 23, - 26, - 33, - 37, - 40, - 36, - 30, - 26, - 24, - 24, - 30, - 32, - 35, - 37, - 50, - 77, - 113, - 117, - 123, - 129, - 107, - 87, - 70, - 62, - 62, - 79, - 98, - 96, - 80, - 62, - 48, - 34, - 28, - 27, - 31, - 28, - 21, - 21, - 24, - 34, - 38, - 41, - 46, - 40, - 38, - 36, - 29, - 21, - 18, - 19, - 17, - 18, - 15, - 14, - 14, - 14, - 14, - 12, - 13, - 11, - 9, - 9, - 8, - 8, - 8, - 10, - 11, - 14, - 18, - 20, - 22, - 19, - 24, - 23, - 22, - 27, - 32, - 42, - 50, - 37, - 26, - 17, - 16, - 13, - 12, - 10, - 10, - 9, - 8, - 8, - 9, - 10, - 11, - 13, - 14, - 16, - 20, - 20, - 16, - 15, - 15, - 18, - 21, - 27, - 29, - 22, - 19, - 19, - 19, - 23, - 33, - 25, - 22, - 21, - 18, - 18, - 16, - 15, - 15, - 17, - 19, - 17, - 17, - 16, - 14, - 10, - 9, - 10, - 10, - 10, - 11, - 13, - 19, - 21, - 19, - 18, - 17, - 16, - 16, - 18, - 19, - 17, - 19, - 24, - 27, - 28, - 32, - 32, - 28, - 24, - 19, - 17, - 18, - 21, - 26, - 24, - 25, - 22, - 19, - 15, - 13, - 11, - 10, - 11, - 12, - 14, - 14, - 16, - 24, - 42, - 58, - 61, - 59, - 56, - 51, - 46, - 43, - 42, - 40, - 40, - 34, - 31, - 26, - 24, - 23, - 28, - 26, - 21, - 17, - 16, - 14, - 13, - 12, - 13, - 15, - 14, - 12, - 12, - 13, - 16, - 16, - 15, - 17, - 21, - 25, - 24, - 19, - 14, - 11, - 11, - 11, - 9, - 10, - 10, - 12, - 13, - 15, - 18, - 19, - 20, - 20, - 18, - 14, - 13, - 11, - 12, - 12, - 12, - 13, - 12, - 11, - 10, - 10, - 9, - 8, - 9, - 11, - 14, - 15, - 12, - 10, - 10, - 11, - 12, - 12, - 13, - 13, - 14, - 12, - 12, - 10, - 9, - 9, - 9, - 9, - 10, - 9, - 10, - 12, - 14, - 18, - 17, - 23, - 17, - 15, - 11, - 10, - 11, - 14, - 17, - 21, - 27, - 51, - 47, - 48, - 54, - 56, - 49, - 49, - 53, - 56, - 57, - 46, - 39, - 36, - 30, - 24, - 20, - 15, - 12, - 11, - 9, - 7, - 7, - 6, - 6, - 6, - 7, - 8, - 10, - 12, - 14, - 14, - 15, - 13, - 12, - 11, - 11, - 11, - 12, - 14, - 15, - 16, - 17, - 14, - 16, - 21, - 26, - 29, - 28, - 30, - 29, - 30, - 35, - 38, - 42, - 45, - 39, - 32, - 26, - 20, - 16, - 15, - 15, - 17, - 17, - 14, - 16, - 16, - 19, - 21, - 20, - 20, - 23, - 26, - 30, - 39, - 36, - 33, - 33, - 34, - 36, - 40, - 37, - 48, - 66, - 78, - 87, - 76, - 77, - 88, - 107, - 148, - 131, - 63, - 37, - 25, - 19, - 15, - 13, - 12, - 11, - 9, - 7, - 7, - 8, - 9, - 9, - 9, - 11, - 12, - 13, - 12, - 9, - 9, - 10, - 13, - 15, - 19, - 24, - 36, - 52, - 77, - 64, - 47, - 28, - 23, - 15, - 14, - 13, - 13, - 13, - 11, - 10, - 10, - 9, - 11, - 10, - 10, - 11, - 10, - 9, - 8, - 9, - 10, - 11, - 12, - 14, - 15, - 15, - 12, - 12, - 15, - 18, - 25, - 34, - 39, - 36, - 28, - 22, - 22, - 21, - 17, - 15, - 13, - 11, - 11, - 10, - 10, - 10, - 9, - 11, - 11, - 13, - 14, - 11, - 10, - 8, - 8, - 8, - 9, - 9, - 10, - 9, - 8, - 8, - 8, - 9, - 10, - 9, - 8, - 9, - 9, - 10, - 10, - 11, - 12, - 10, - 10, - 11, - 11, - 12, - 14, - 17, - 20, - 24, - 18, - 15, - 16, - 19, - 20, - 22, - 24, - 22, - 24, - 27, - 32, - 48, - 69, - 99, - 138, - 58, - 18, - 14, - 10, - 9, - 8, - 9, - 7, - 7, - 6, - 6, - 7, - 6, - 6, - 7, - 7, - 5, - 5, - 5, - 5, - 5, - 5, - 4, - 4, - 4, - 3, - 3, - 4, - 3, - 4, - 3, - 4, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 4, - 4, - 4, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 5, - 5, - 5, - 5, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 3, - 4, - 3, - 3, - 4, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 3, - 4, - 4, - 3, - 3, - 4, - 4, - 3, - 4, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 3, - 4, - 3, - 3, - 3, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 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, - 3, - 3, - 3, - 4, - 4, - 3, - 3, - 4, - 4, - 4, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 3, - 3, - 3, - 4, - 3, - 4, - 4, - 3, - 3 - ], - "vertical_accuracy": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ], - "raw": [] - }, - "bbox": [ - [ - -124.09386637, - 44.34348063 - ], - [ - -124.09386637, - 44.56531305 - ], - [ - -123.26148271, - 44.56531305 - ], - [ - -123.26148271, - 44.34348063 - ] - ] -} diff --git a/inst/examples/playback/playback_app.R b/inst/examples/playback/playback_app.R deleted file mode 100644 index 134d686a..00000000 --- a/inst/examples/playback/playback_app.R +++ /dev/null @@ -1,65 +0,0 @@ -library(leaflet) -library(leaflet.extras2) -library(shiny) -library(geojsonio) - - -# drivejson <- system.file("examples/playback/drive.json", package = "leaflet.extras2") -drivejson <- system.file("examples/playback/drive.json", package = "leaflet.extras2") -drivejson1 <- system.file("examples/playback/drive1.json", package = "leaflet.extras2") -csvpath <- system.file("examples/playback/data.csv", package = "leaflet.extras2") -url = "https://raw.githubusercontent.com/hallahan/LeafletPlayback/master/data/demo/drive.json" - -asd <- geojson_read(drivejson) # "list" -# asd <- jsonlite::read_json(drivejson) # "list" -# asd <- paste(readLines(drivejson, warn = F), collapse = "") # "character" containing the JSON -# asd <- read.csv(file = csvpath) # "data.frame" -# asd <- as.matrix(asd) # "matrix" -# data.table::setDT(asd) # "data.table" "data.frame" -# sp::coordinates(asd) <- ~x+y # "SpatialPointsDataFrame" -# asd <- sf::st_as_sf(asd) # "sf" "data.frame" -# asd <- drivejson # "character" with JSON path -# asd <- url # "character" with JSON URL - - - - -iconship = makeIcon( - iconUrl = 'https://cdn0.iconfinder.com/data/icons/man-listening-to-music-with-earphone-headphone/247/listern-music-006-512.png', - iconWidth = 50, iconHeight = 60, shadowWidth = 55, shadowHeight = 65 ,iconAnchorX = 25, iconAnchorY = 25 -) - -ui <- fluidPage( - leafletOutput("map"), - h4("Clicks"), - verbatimTextOutput("click"), - h4("Mouseover"), - verbatimTextOutput("mouseover") -) - -server <- function(input, output, session) { - output$map <- renderLeaflet({ - leaflet() %>% - addTiles() %>% - setView(-123.3, 44.53, 11) %>% - addPlayback(data = asd, icon = iconship, - options = playbackOptions( - radius = 3), - pathOptions = pathOptions( - color = "red", weight = 5, - fillColor = "green" - )) - }) - output$click <- renderPrint({ - req(input$map_pb_click) - input$map_pb_click - }) - output$mouseover <- renderPrint({ - req(input$map_pb_mouseover) - input$map_pb_mouseover - }) -} - -shinyApp(ui, server) - - diff --git a/inst/examples/playback_app.R b/inst/examples/playback_app.R new file mode 100644 index 00000000..953e8176 --- /dev/null +++ b/inst/examples/playback_app.R @@ -0,0 +1,112 @@ +library(leaflet) +library(leaflet.extras2) +library(shiny) +library(sf) +library(mapview) + +## Single Trail ############## +# trail_pts <- sf::st_line_sample(x = st_cast(mapview::trails[10,], "LINESTRING"), n = 100) +# trail_pts <- st_transform(trail_pts, 4326) +# data <- sf::st_as_sf(st_cast(trail_pts, "POINT")) +# colnames(data) <- "geometry" +# st_geometry(data) <- "geometry" +# data$time = as.POSIXct( +# seq.POSIXt(Sys.time() - 1000, Sys.time(), length.out = nrow(data))) +# data <- data[, c("time","geometry")] +# data$popup1 <- paste("This is a popup for time:", data$time,"") +# data$label1 <- paste("Time: ", data$time) + +## Multiple Trails ############## +n = 150 +rows <- c(10, 21) +trail_pts <- sf::st_line_sample(x = st_cast(mapview::trails[rows,], "LINESTRING"), n = n) +trail_pts <- st_transform(trail_pts, 4326) +data <- sf::st_as_sf(st_cast(trail_pts, "POINT")) +colnames(data) <- "geometry" +st_geometry(data) <- "geometry" +nrows <- length(rows) +data$id <- rep(1:nrows, each = n) +time <- as.POSIXct(seq.POSIXt(Sys.time() - 1000, Sys.time(), + length.out = nrow(data)/nrows)) +data$time <- rep(time, nrows) +data <- data[, c("id", "time","geometry")] +data$popup1 <- paste("This is a popup for Track ID: ", + data$id," and time:", data$time,"") +data$label1 <- paste("Track ID: ",data$id,"
", data$time) +data <- split(data, data$id) + +## Icon ################# +iconship = makeIcon( + iconUrl = 'https://cdn0.iconfinder.com/data/icons/man-listening-to-music-with-earphone-headphone/247/listern-music-006-512.png', + iconWidth = 30, iconHeight = 35, shadowWidth = 30, shadowHeight = 35, + iconAnchorX = 0, iconAnchorY = 0 +) + +## UI ################# +ui <- fluidPage( + splitLayout( + cellWidths = c("60%","40%"), + leafletOutput("map", height = "800px"), + div( + h4("Clicks"), + verbatimTextOutput("click"), + h4("Mouseover"), + verbatimTextOutput("mouseover") + ) + ), + actionButton("rm","Remove Playback") +) + +## Server ############### +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet(options = list(closePopupOnClick = FALSE)) %>% + addProviderTiles("CartoDB.Positron", group = "CartoDB") %>% + # addCircleMarkers(data=sf::st_as_sf(breweries), radius = 1, + # popup="I am a regular Popup") %>% + leafem::addMouseCoordinates() %>% + addPlayback(data = data, icon = iconship, + popup = ~popup1, + # popup = ~sprintf("this popup is created with sprintf:
%s",popup1), + label = ~label1, + options = playbackOptions( + maxInterpolationTime = 6, color = list("red", "green"), + speed = 250, orientIcons = FALSE, + playCommand = "Let's go", stopCommand = "Stop it!", + transitionpopup = TRUE, transitionlabel = TRUE, + locale = list(locale="de-DE", + options = list(weekday = 'long', + year = 'numeric', + month = 'long', + day = 'numeric', + timeZone = 'UTC', + timeZoneName = 'short')), + radius = 3), + popupOptions = popupOptions(maxWidth = 700, + closeOnClick = TRUE), + labelOptions = labelOptions( + interactive = FALSE, clickable = NULL, + noHide = TRUE, permanent = FALSE, + className = "", direction = "auto", + offset = c(0, 0), opacity = 1, + textsize = "10px", textOnly = FALSE, + style = NULL, sticky = TRUE + ), + pathOpts = pathOptions(weight = 5)) + }) + output$click <- renderPrint({ + inp <- req(input$map_pb_click) + print(inp) + }) + output$mouseover <- renderPrint({ + req(input$map_pb_mouseover) + input$map_pb_mouseover + }) + observeEvent(input$rm, { + leafletProxy("map", session) %>% + removePlayback() + }) +} + +shinyApp(ui, server) + diff --git a/inst/examples/playback_app_awesomemarkers.R b/inst/examples/playback_app_awesomemarkers.R new file mode 100644 index 00000000..0bdb0b44 --- /dev/null +++ b/inst/examples/playback_app_awesomemarkers.R @@ -0,0 +1,81 @@ +library(shiny) +library(sf) +library(leaflet) +library(leaflet.extras2) + +data(atlStorms2005) +data <- sf::st_as_sf(leaflet::atlStorms2005)[1:5,] +data$Name <- as.character(data$Name) +data <- st_cast(data, "POINT") +data$time <- unlist(lapply(rle(data$Name)$lengths, function(x) { + seq.POSIXt(as.POSIXct(Sys.Date()-2), as.POSIXct(Sys.Date()), length.out = x) +})) +data$time <- as.POSIXct(data$time, origin="1970-01-01") +data$label <- paste0("Time: ", data$time) +data$popup = sprintf("

Customized Popup

Name: %s
Time: %s", + data$Name, data$time) +data <- split(data, f = data$Name) + + +ui <- fluidPage( + leafletOutput("map", height=800) +) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + map <- leaflet() %>% + addTiles() + map$dependencies <- c(map$dependencies, + leaflet:::leafletAwesomeMarkersDependencies()) + map %>% + addPlayback(data = data, + popup = ~popup, + label = ~label, + name = ~Name, + popupOptions = popupOptions(offset=c(0,-35)), + options = playbackOptions(radius = 3, tickLen = 1000000, + speed = 5000, + marker = htmlwidgets::JS(" + function(feature) { + var color = 'blue'; + var icon = null; + switch (feature.name) { + case 'ALPHA': + color = 'red'; + icon = 'glass'; + break; + case 'ARLENE': + color = 'green'; + icon = 'flag'; + break; + case 'BRET': + color = 'blue'; + icon = 'star'; + break; + case 'CINDY': + color = 'orange'; + icon = 'home'; + break; + case 'DELTA': + color = 'purple'; + icon = 'bookmark'; + break; + } + return { + icon: L.AwesomeMarkers.icon({ + icon: icon, + markerColor: color + }) + } + }"), + maxInterpolationTime = 10000, + transitionpopup = FALSE, + transitionlabel = FALSE, + playCommand = "Let's go", + stopCommand = "Stop it!", + color = c("red","green","blue", + "orange","purple")), + pathOpts = pathOptions(weight = 5)) + }) +} +shinyApp(ui, server) diff --git a/inst/examples/playback_app_divicon.R b/inst/examples/playback_app_divicon.R new file mode 100644 index 00000000..864a3eef --- /dev/null +++ b/inst/examples/playback_app_divicon.R @@ -0,0 +1,110 @@ +library(shiny) +library(sf) +library(leaflet) +library(leaflet.extras2) + +data(atlStorms2005) +data <- sf::st_as_sf(leaflet::atlStorms2005)[1:5,] +data$Name <- as.character(data$Name) +data <- st_cast(data, "POINT") +data$time <- unlist(lapply(rle(data$Name)$lengths, function(x) { + seq.POSIXt(as.POSIXct(Sys.Date()-2), as.POSIXct(Sys.Date()), length.out = x) +})) +data$time <- as.POSIXct(data$time, origin="1970-01-01") +data$label <- paste0("Time: ", data$time) +data$popup = sprintf("

Customized Popup

Name: %s
Time: %s", + data$Name, data$time) +data <- split(data, f = data$Name) + + +ui <- fluidPage( + tags$head(tags$style(" + .leaflet-div-icon { + background: transparent !important; + border: unset !important; + } + .divicon { + border: 1px solid #666; + border-radius: 50%; + font-size: 14px; + color: black; + text-align: center; + width: 30px !important; + height: 30px !important; + padding-top: 3px; + font-weight: 800; + } + .red { + background-color: #db0a0a; + } + .green { + background-color: #1fdb0a; + } + .blue { + background-color: #0a34db; + } + .orange { + background-color: #f4ba27; + } + .purple { + background-color: #f127f4; + } + ")), + leafletOutput("map", height=800) +) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + addPlayback(data = data, + popup = ~popup, + label = ~label, + name = ~Name, + popupOptions = popupOptions(offset=c(8,0)), + labelOptions = labelOptions(offset=c(8,-10)), + options = playbackOptions(radius = 3, tickLen = 1000000, + speed = 5000, + marker = htmlwidgets::JS(" + function(feature) { + var CssClass = 'blue'; + var text = null; + switch (feature.name) { + case 'ALPHA': + CssClass = 'red'; + text = 'A'; + break; + case 'ARLENE': + CssClass = 'green'; + text = 'B'; + break; + case 'BRET': + CssClass = 'blue'; + text = 'C'; + break; + case 'CINDY': + CssClass = 'orange'; + text = 'D'; + break; + case 'DELTA': + CssClass = 'purple'; + text = 'E'; + break; + } + return { + icon: L.divIcon({ + html: '
' + text + '
' + }) + } + }"), + maxInterpolationTime = 10000, + transitionpopup = FALSE, + transitionlabel = FALSE, + playCommand = "Let's go", + stopCommand = "Stop it!", + color = c("red","green","blue", + "orange","purple")), + pathOpts = pathOptions(weight = 5)) + }) +} +shinyApp(ui, server) diff --git a/inst/examples/reachability_app.R b/inst/examples/reachability_app.R index 2e30515c..0ae82a7f 100644 --- a/inst/examples/reachability_app.R +++ b/inst/examples/reachability_app.R @@ -1,9 +1,10 @@ +library(shiny) library(leaflet) library(leaflet.extras2) -library(shiny) -## TODO - Include your own Openrouteservice API-key. -apiKey <- Sys.getenv("OPRS") +## Include your API-Key +# Sys.setenv("OPRS" = 'Your_API_Key') +apikey <- Sys.getenv("OPRS") ui <- fluidPage( icon("cars"), ## needed to load FontAwesome Lib @@ -17,7 +18,7 @@ server <- function(input, output, session) { addTiles(group = "base") %>% setView(8, 50, 11) %>% addLayersControl(baseGroups = "base") %>% - addReachability(apiKey = apiKey, + addReachability(apikey = apikey, options = reachabilityOptions( collapsed = FALSE, drawButtonContent = as.character(icon("plus")), diff --git a/inst/examples/side_by_side_app.R b/inst/examples/side_by_side_app.R index 1d8965c4..0e252bd6 100644 --- a/inst/examples/side_by_side_app.R +++ b/inst/examples/side_by_side_app.R @@ -14,12 +14,16 @@ server <- function(input, output, session) { addMapPane("right", zIndex = 0) %>% addTiles(group = "base", layerId = "baseid", options = pathOptions(pane = "right")) %>% - addProviderTiles(providers$CartoDB.DarkMatter, group="carto", layerId = "cartoid", + addProviderTiles(providers$CartoDB.DarkMatter, + group="carto", layerId = "cartoid", options = pathOptions(pane = "left")) %>% - addCircleMarkers(data = breweries91[1:15,], color = "blue", group = "blue", + addCircleMarkers(data = breweries91[1:15,], + color = "blue", group = "blue", options = pathOptions(pane = "left")) %>% - addCircleMarkers(data = breweries91[15:20,], color = "yellow", group = "yellow") %>% - addCircleMarkers(data = breweries91[15:30,], color = "red", group = "red", + addCircleMarkers(data = breweries91[15:20,], + color = "yellow", group = "yellow") %>% + addCircleMarkers(data = breweries91[15:30,], + color = "red", group = "red", options = pathOptions(pane = "right")) %>% addLayersControl(overlayGroups = c("blue","red", "yellow")) %>% addSidebyside(layerId = "sidecontrols", diff --git a/inst/examples/sidebar_app.R b/inst/examples/sidebar_app.R index a81fe075..37c3f6c8 100644 --- a/inst/examples/sidebar_app.R +++ b/inst/examples/sidebar_app.R @@ -5,56 +5,67 @@ library(leaflet.extras2) data(breweries91, package = "leaflet") +breweries_data <- breweries91 |> + st_as_sf() + +sample_brewery_data <- function(data, n_obs){ + ii <- sample.int(nrow(data),n_obs,replace = TRUE) + data[ii,] +} + ui <- fluidPage( + tags$head(tags$style(".btn-default {display: block;}")), h4("Leaflet Sidebar Plugin"), - splitLayout(cellWidths = c("30%", "70%"), + splitLayout(cellWidths = c("20%", "80%"), tagList( actionButton("open", "Open Sidebar"), actionButton("close", "Close Sidebar"), - actionButton("clear", "Clear Sidebar") + actionButton("clear", "Clear Sidebar"), + verbatimTextOutput("whichtab") ), tagList( - sidebar_tabs( - list(icon("car"), icon("user"), icon("envelope")), - sidebar_pane( - title = "home", id = "home_id", icon = icon("home"), - tagList( - sliderInput("obs", "Number of observations:", - min = 1, max = 32, value = 10 - ), - dateRangeInput("daterange4", "Date range:", - start = Sys.Date() - 10, - end = Sys.Date() + 10 - ), - verbatimTextOutput("tab1") - ) - ), - sidebar_pane( - title = "profile", id = "profile_id", icon = icon("wrench"), - tagList( - textInput("caption", "Caption", "Data Summary"), - selectInput("label", "Label", choices = c("brewery", "address", "zipcode", "village")), - passwordInput("password", "Password:"), - actionButton("go", "Go"), - verbatimTextOutput("value") - ) - ), - sidebar_pane( - title = "messages", id = "messages_id", icon = icon("person"), - tagList( - checkboxGroupInput( - "variable", "Variables to show:", - c( - "Cylinders" = "cyl", - "Transmission" = "am", - "Gears" = "gear" - ) - ), - tableOutput("data") - ) - ) + sidebar_tabs(id = "mysidebarid", + list(icon("car"), icon("user"), icon("envelope")), + sidebar_pane( + title = "home", id = "home_id", icon = icon("home"), + tagList( + sliderInput("obs", "Number of observations:", + min = 1, max = 32, value = 10), + sliderInput("opa", "Point Opacity:", + min = 0, max = 1, value = 0.5), + sliderInput("fillopa", "Fill Opacity:", + min = 0, max = 1, value = 0.2), + dateRangeInput("daterange4", "Date range:", + start = Sys.Date() - 10, + end = Sys.Date() + 10), + verbatimTextOutput("tab1") + ) + ), + sidebar_pane( + title = "profile", id = "profile_id", icon = icon("wrench"), + tagList( + textInput("caption", "Caption", "Data Summary"), + selectInput("label", "Label", + choices = c("brewery", "address", + "zipcode", "village")), + passwordInput("password", "Password:"), + actionButton("go", "Go"), + verbatimTextOutput("value") + ) + ), + sidebar_pane( + title = "messages", id = "messages_id", + icon = icon("person", verify_fa = FALSE), + tagList( + checkboxGroupInput("variable", "Variables to show:", + c("Cylinders" = "cyl", + "Transmission" = "am", + "Gears" = "gear")), + tableOutput("data") + ) + ) ), - leafletOutput("map") + leafletOutput("map", height = "700px") ) ) ) @@ -64,31 +75,40 @@ server <- function(input, output, session) { leaflet() %>% addTiles() %>% addSidebar( - id = "sidebar", - options = list(position = "left", fit = TRUE) + id = "mysidebarid", + options = list(position = "left") ) }) + output$whichtab <- renderPrint({ + paste0(req(input$mysidebarid), " is open") + }) + observe({ req(input$obs) - df <- breweries91[sample.int(nrow(breweries91), input$obs), ] - bbox <- st_bbox(df) + + df <- breweries_data |> + sample_brewery_data(n_obs = input$obs) + + bbox <- suppressWarnings(st_bbox(df)) leafletProxy("map", session) %>% clearGroup("pts") %>% - addCircleMarkers(data = df, label = df[[input$label]], group = "pts") %>% + addCircleMarkers(data = df, + label = df[[input$label]], + opacity = input$opa, + fillOpacity = input$fillopa, + group = "pts") %>% fitBounds(bbox[[1]], bbox[[2]], bbox[[3]], bbox[[4]]) }) output$tab1 <- renderText({ input$obs }) - output$value <- renderText({ req(input$go) isolate(input$password) }) - output$data <- renderTable(rownames = FALSE, { - mtcars[, c("mpg", input$variable), drop = FALSE] + mtcars[, c("mpg", input$variable), drop = FALSE] }) observeEvent(input$open, { diff --git a/inst/examples/spin_app.R b/inst/examples/spin_app.R new file mode 100644 index 00000000..fa1d3d5f --- /dev/null +++ b/inst/examples/spin_app.R @@ -0,0 +1,36 @@ +library(shiny) +library(leaflet) +library(leaflet.extras2) + +dlat <- 1 / 111000 * 100 # degrees per metre + +ui <- fluidRow( + tags$h2("Using Leaflet.Spin in Shiny"), + actionButton("plotbutton", label = "Show Spinner While Adding Markers"), + leafletOutput("map") +) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles() %>% + setView(175.322, -37.789, zoom = 17) %>% + addSpinner() + }) + + observeEvent(input$plotbutton, { + n <- ceiling(runif(1) * 10000) + leafletProxy("map") %>% + startSpinner(list("lines" = 7, "length" = 40, + "width" = 20, "radius" = 10)) %>% + clearShapes() %>% + addCircles( + lng = 175.322 + (runif(n) * 2 - 1) * dlat * 6, + lat = -37.789 + (runif(n) * 2 - 1) * dlat * 1.5, + radius = dlat * runif(n) * dlat + ) %>% + stopSpinner() + }) +} + +shinyApp(ui = ui, server = server) diff --git a/inst/examples/tangram/tangram_app.R b/inst/examples/tangram/tangram_app.R index 90623f2c..15efffd0 100644 --- a/inst/examples/tangram/tangram_app.R +++ b/inst/examples/tangram/tangram_app.R @@ -2,10 +2,7 @@ library(shiny) library(leaflet) library(leaflet.extras2) -## Load Tangram-JS in debug mode -options("leaflet.extras2.minified" = FALSE) - -## File is in /www folder. (Enter your API-Key in the global section) +## File is in /www folder. (Enter your Nextzen API-Key in the global section) scene <- "scene.yaml" ui <- fluidPage(leafletOutput("map")) @@ -21,9 +18,14 @@ server <- function(input, output, session) { modifyZoomBehavior = TRUE, webGLContextOptions = list( preserveDrawingBuffer = TRUE, - antialias = FALSE) - # ,postUpdate = htmlwidgets::JS("function(didRender) {console.log('postUpdate!'); - # if (didRender) {console.log('new frame rendered!');}}") + antialias = FALSE), + postUpdate = htmlwidgets::JS(" + function(didRender) { + console.log('postUpdate!'); + if (didRender) { + console.log('New frame rendered!'); + } + }") )) %>% addCircleMarkers(data = breweries91, group = "brews") %>% setView(11, 49.4, 14) %>% diff --git a/inst/examples/tangram/www/pois.png b/inst/examples/tangram/www/pois.png new file mode 100644 index 00000000..3818d492 Binary files /dev/null and b/inst/examples/tangram/www/pois.png differ diff --git a/inst/examples/tangram/www/scene.yaml b/inst/examples/tangram/www/scene.yaml index 098cefa6..9b82f8a5 100644 --- a/inst/examples/tangram/www/scene.yaml +++ b/inst/examples/tangram/www/scene.yaml @@ -1,5 +1,5 @@ global: - api_key: '__YOUR__NEXTZEN_API_KEY__' # put your nextzen API key here + api_key: 'Your_API_Key' # put your nextzen API key here language: en # optional ISO 2-char code language_text_source: | function() { @@ -41,7 +41,7 @@ fonts: textures: icons: - url: images/pois.png + url: pois.png filtering: mipmap sprites: # define sprites: [x origin, y origin, width, height] diff --git a/inst/examples/timeslider_app.R b/inst/examples/timeslider_app.R new file mode 100644 index 00000000..51513cf5 --- /dev/null +++ b/inst/examples/timeslider_app.R @@ -0,0 +1,45 @@ +library(leaflet) +library(leaflet.extras2) +library(sf) +library(geojsonsf) +library(shiny) + +data <- sf::st_as_sf(leaflet::atlStorms2005[1,]) +data <- suppressWarnings(st_cast(data, "POINT")) +data$time = as.POSIXct( + seq.POSIXt(as.POSIXct(paste0(2020-nrow(data)+1,"-01-01")), + as.POSIXct("2020-01-01"), by = "year")) +data1 <- sf::st_as_sf(leaflet::atlStorms2005[2,]) +data1 <- suppressWarnings(st_cast(data1, "POINT")) +data1$time = as.POSIXct( + seq.POSIXt(as.POSIXct(paste0(2020-nrow(data1)+1,"-01-01")), + as.POSIXct("2020-01-01"), by = "year")) +data <- rbind(data, data1) + +ui <- fluidPage(leafletOutput("map", height = "600px")) +server <- function(input, output, session) { + output$map <- renderLeaflet({ + opac <- runif(nrow(data), 0.5, 1) + leaflet() %>% + addTiles() %>% + addTimeslider( + data = data, + color = colorNumeric("viridis", + seq.int(nrow(data)))(seq.int(nrow(data))), + opacity = opac, fillOpacity = opac, + radius = sample(5:15, nrow(data), TRUE), + popupOptions = popupOptions(maxWidth = 1000, + closeOnClick = TRUE, + closeButton = FALSE), + popup = ~sprintf("Time: %s
Name: %s
MaxWind: %s
MinPress: %s", + time, Name, MaxWind, MinPress), + label = ~sprintf("Time: %s
Name: %s", time, Name), + labelOptions = labelOptions(noHide = TRUE), + options = timesliderOptions( + alwaysShowDate = TRUE, + sameDate = TRUE, + range = FALSE)) + }) +} +shinyApp(ui, server) + diff --git a/inst/examples/velocity/water-gbr.json b/inst/examples/velocity/water-gbr.json deleted file mode 100644 index 8a2b490b..00000000 --- a/inst/examples/velocity/water-gbr.json +++ /dev/null @@ -1 +0,0 @@ -[{"header": {"parameterUnit": "m.s-1", "parameterNumber": 2, "dx": 1.0, "dy": 1.0, "parameterNumberName": "Eastward current", "la1": -7.5, "la2": -28.5, "parameterCategory": 2, "lo2": 156, "nx": 14, "ny": 22, "refTime": "2017-02-01 23:00:00", "lo1": 143}, "data": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.33000001311302185, 0.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.12999999523162842, -0.0, 0.6499999761581421, 0.44999998807907104, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.03999999910593033, -0.1899999976158142, 0.4300000071525574, 0.23999999463558197, 0.44999998807907104, 0.23000000417232513, 0.4399999976158142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1599999964237213, 0.0, -0.019999999552965164, -0.05000000074505806, 0.23000000417232513, 0.3700000047683716, 0.550000011920929, 0.2800000011920929, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.11999999731779099, -0.33000001311302185, 0.05999999865889549, 0.12999999523162842, 0.3199999928474426, 0.28999999165534973, 0.2800000011920929, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.20999999344348907, -0.30000001192092896, -0.8199999928474426, -0.27000001072883606, -0.019999999552965164, 0.23000000417232513, 0.20000000298023224, 0.10000000149011612, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.12999999523162842, -0.1899999976158142, -0.18000000715255737, -0.44999998807907104, 0.11999999731779099, -0.05000000074505806, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.20999999344348907, -0.1899999976158142, -0.27000001072883606, -0.6499999761581421, -0.3199999928474426, -0.3199999928474426, -0.07000000029802322, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.23999999463558197, -0.14000000059604645, -0.15000000596046448, -0.09000000357627869, -0.3799999952316284, -0.33000001311302185, -0.17000000178813934, -0.28999999165534973, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.03999999910593033, -0.17000000178813934, 0.07000000029802322, -0.27000001072883606, -0.10999999940395355, -0.1899999976158142, -0.019999999552965164, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.14000000059604645, -0.05999999865889549, -0.05000000074505806, -0.36000001430511475, -0.3700000047683716, -0.20000000298023224, -0.20999999344348907, -0.09000000357627869, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05000000074505806, -0.019999999552965164, 0.1599999964237213, 0.3100000023841858, -0.18000000715255737, -0.1599999964237213, -0.25999999046325684, -0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05999999865889549, -0.27000001072883606, -0.27000001072883606, 0.4099999964237213, 0.23999999463558197, -0.09000000357627869, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.20999999344348907, -0.3499999940395355, -0.23999999463558197, 0.009999999776482582, -0.14000000059604645, -0.18000000715255737, -0.1599999964237213, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.25, -0.23000000417232513, 0.17000000178813934, -0.17000000178813934, 0.09000000357627869, 0.1599999964237213, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.05000000074505806, -0.1899999976158142, 0.10999999940395355, -0.03999999910593033, -0.10999999940395355, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.009999999776482582, -0.009999999776482582, -0.23999999463558197, -0.33000001311302185, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.25999999046325684, -0.03999999910593033, 0.11999999731779099, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.11999999731779099, -0.17000000178813934, 0.25999999046325684, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.05000000074505806, -0.6100000143051147, -0.2199999988079071, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5600000023841858, 0.3100000023841858, 0.36000001430511475]}, {"header": {"parameterUnit": "m.s-1", "parameterNumber": 3, "dx": 1.0, "dy": 1.0, "parameterNumberName": "Northward current", "la1": -7.5, "la2": -28.5, "parameterCategory": 2, "lo2": 156, "nx": 14, "ny": 22, "refTime": "2017-02-01 23:00:00", "lo1": 143}, "data": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1899999976158142, 0.28999999165534973, 0.019999999552965164, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2800000011920929, 0.20999999344348907, 0.44999998807907104, 0.11999999731779099, -0.3100000023841858, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.18000000715255737, 0.36000001430511475, 0.20000000298023224, -0.20000000298023224, -0.25, -0.3100000023841858, 0.10000000149011612, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15000000596046448, 0.38999998569488525, 0.14000000059604645, -0.1599999964237213, -0.28999999165534973, -0.1599999964237213, -0.1599999964237213, 0.10999999940395355, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.23000000417232513, -0.07000000029802322, -0.3400000035762787, -0.18000000715255737, -0.3799999952316284, -0.3700000047683716, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.17000000178813934, 0.3400000035762787, -0.009999999776482582, -0.029999999329447746, -0.25999999046325684, -0.07000000029802322, -0.25999999046325684, -0.33000001311302185, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05999999865889549, 0.03999999910593033, 0.05000000074505806, -0.1599999964237213, -0.0, 0.009999999776482582, -0.2199999988079071, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.05000000074505806, -0.2199999988079071, -0.05999999865889549, -0.3799999952316284, -0.20000000298023224, -0.07000000029802322, 0.2199999988079071, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.019999999552965164, 0.2199999988079071, 0.05000000074505806, -0.10999999940395355, -0.25, -0.12999999523162842, 0.11999999731779099, 0.07000000029802322, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.07000000029802322, -0.05999999865889549, -0.1899999976158142, -0.41999998688697815, -0.10000000149011612, -0.12999999523162842, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.10000000149011612, -0.12999999523162842, 0.019999999552965164, -0.28999999165534973, -0.12999999523162842, 0.20000000298023224, 0.07999999821186066, -0.4399999976158142, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.11999999731779099, -0.7599999904632568, -0.49000000953674316, -0.550000011920929, -0.10000000149011612, 0.09000000357627869, 0.07000000029802322, -0.23999999463558197, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.47999998927116394, -0.5299999713897705, -0.550000011920929, -0.47999998927116394, -0.05000000074505806, 0.03999999910593033, -0.3700000047683716, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5400000214576721, -0.019999999552965164, -0.3199999928474426, -0.18000000715255737, -0.09000000357627869, -0.1599999964237213, -0.3499999940395355, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.029999999329447746, 0.029999999329447746, -0.15000000596046448, -0.23000000417232513, -0.019999999552965164, -0.3799999952316284, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1599999964237213, -0.18000000715255737, -0.05999999865889549, 0.5199999809265137, -0.07000000029802322, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3100000023841858, -0.4699999988079071, 0.2800000011920929, -0.41999998688697815, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5799999833106995, 0.019999999552965164, -0.4000000059604645, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.47999998927116394, -0.019999999552965164, -0.09000000357627869, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7699999809265137, -0.019999999552965164, -0.05999999865889549, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.1699999570846558, 0.33000001311302185, -0.05000000074505806]}] \ No newline at end of file diff --git a/inst/examples/velocity/wind-gbr.json b/inst/examples/velocity/wind-gbr.json deleted file mode 100644 index 1addd4a9..00000000 --- a/inst/examples/velocity/wind-gbr.json +++ /dev/null @@ -1 +0,0 @@ -[{"header": {"parameterUnit": "m.s-1", "parameterNumber": 2, "dx": 1.0, "dy": 1.0, "parameterNumberName": "eastward_wind", "la1": -7.5, "la2": -28.5, "parameterCategory": 2, "lo2": 156.0, "nx": 14, "ny": 22, "refTime": "2017-02-01 23:00:00", "lo1": 143.0}, "data": [0.0, 0.0, 0.0, 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.170000076293945, 2.9800000190734863, 2.5799999237060547, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.400000095367432, 4.360000133514404, 3.859999895095825, 3.5799999237060547, 3.440000057220459, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.3399999141693115, 3.9100000858306885, 3.9000000953674316, 3.890000104904175, 3.7799999713897705, 6.46999979019165, 5.840000152587891, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20000000298023224, -0.03999999910593033, 0.9300000071525574, 1.5199999809265137, 2.390000104904175, 3.930000066757202, 4.25, 3.069999933242798, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.850000023841858, -2.4700000286102295, -2.2899999618530273, -1.309999942779541, 0.2800000011920929, 1.0299999713897705, 0.7400000095367432, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.9000000953674316, -3.1500000953674316, -3.569999933242798, -3.5999999046325684, -2.819999933242798, -2.509999990463257, -2.9600000381469727, -3.2200000286102295, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.880000114440918, -4.5, -4.960000038146973, -5.090000152587891, -4.949999809265137, -4.679999828338623, -4.789999961853027, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -5.300000190734863, -5.590000152587891, -5.659999847412109, -5.489999771118164, -5.550000190734863, -5.400000095367432, -5.429999828338623, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -5.389999866485596, -5.800000190734863, -6.179999828338623, -6.059999942779541, -5.570000171661377, -5.880000114440918, -6.5, -7.239999771118164, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -6.210000038146973, -6.699999809265137, -6.789999961853027, -7.059999942779541, -7.670000076293945, -7.789999961853027, -8.130000114440918, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -7.420000076293945, -7.489999771118164, -7.239999771118164, -7.889999866485596, -8.079999923706055, -7.909999847412109, -7.559999942779541, -7.360000133514404, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -7.940000057220459, -7.260000228881836, -7.590000152587891, -7.920000076293945, -7.630000114440918, -7.710000038146973, -7.480000019073486, -7.21999979019165, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -6.539999961853027, -7.400000095367432, -7.519999980926514, -7.28000020980835, -7.769999980926514, -7.480000019073486, -7.389999866485596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -6.760000228881836, -6.659999847412109, -6.889999866485596, -7.559999942779541, -7.389999866485596, -7.639999866485596, -8.069999694824219, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -5.710000038146973, -6.420000076293945, -6.880000114440918, -7.079999923706055, -7.380000114440918, -7.71999979019165, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -5.900000095367432, -6.510000228881836, -6.460000038146973, -6.710000038146973, -6.599999904632568, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -5.260000228881836, -5.71999979019165, -5.829999923706055, -6.059999942779541, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.260000228881836, -4.5, -5.360000133514404, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -2.859999895095825, -2.75, -3.869999885559082, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8199999928474426, -1.7699999809265137, -2.25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20999999344348907, -1.4199999570846558, -1.25]}, {"header": {"parameterUnit": "m.s-1", "parameterNumber": 3, "dx": 1.0, "dy": 1.0, "parameterNumberName": "northward_wind", "la1": -7.5, "la2": -28.5, "parameterCategory": 2, "lo2": 156.0, "nx": 14, "ny": 22, "refTime": "2017-02-01 23:00:00", "lo1": 143.0}, "data": [0.0, 0.0, 0.0, 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.880000114440918, -3.759999990463257, -3.5799999237060547, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.2599999904632568, -0.25, -1.75, -3.430000066757202, -4.690000057220459, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8799999952316284, -0.7300000190734863, -1.1699999570846558, -2.680000066757202, -4.329999923706055, -3.1700000762939453, -1.059999942779541, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5099999904632568, -0.38999998569488525, -0.550000011920929, -1.2799999713897705, -3.0399999618530273, -2.75, -0.7200000286102295, 1.4500000476837158, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8799999952316284, 1.2999999523162842, -0.5299999713897705, -1.9700000286102295, -1.3899999856948853, -0.75, -0.12999999523162842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.9700000286102295, 2.059999942779541, 1.3700000047683716, 0.019999999552965164, -0.6700000166893005, -0.47999998927116394, 0.4399999976158142, 1.340000033378601, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.880000114440918, 2.5299999713897705, 1.159999966621399, 0.6800000071525574, 0.6399999856948853, 0.8799999952316284, 1.2000000476837158, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.190000057220459, 1.2899999618530273, 1.3799999952316284, 1.5700000524520874, 1.7999999523162842, 2.0199999809265137, 2.2100000381469727, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.329999923706055, 2.299999952316284, 2.440000057220459, 2.3499999046325684, 2.259999990463257, 1.2599999904632568, 1.7799999713897705, 1.600000023841858, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.9200000762939453, 2.690000057220459, 2.7799999713897705, 2.390000104904175, 1.5399999618530273, 1.4500000476837158, 1.9299999475479126, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.809999942779541, 3.359999895095825, 3.3499999046325684, 2.3399999141693115, 1.940000057220459, 1.7999999523162842, 2.359999895095825, 3.2200000286102295, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.4200000762939453, 2.990000009536743, 1.3200000524520874, 1.1799999475479126, 1.7999999523162842, 2.609999895095825, 3.259999990463257, 4.139999866485596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.440000057220459, 1.6299999952316284, 1.4199999570846558, 1.2100000381469727, 1.7100000381469727, 2.6700000762939453, 2.2799999713897705, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.3600000143051147, 1.4500000476837158, 1.1799999475479126, 1.6299999952316284, 1.5299999713897705, 1.9800000190734863, 2.1500000953674316, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1899999976158142, -0.30000001192092896, 0.6800000071525574, 0.25, 0.3700000047683716, 1.0499999523162842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.8600000143051147, -0.9399999976158142, -0.7300000190734863, -0.28999999165534973, -0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.4800000190734863, -2.9200000762939453, -2.140000104904175, -1.590000033378601, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.510000228881836, -3.809999942779541, -3.059999942779541, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -6.559999942779541, -4.96999979019165, -4.449999809265137, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -7.840000152587891, -6.809999942779541, -5.869999885559082, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -9.369999885559082, -8.289999961853027, -7.130000114440918]}] \ No newline at end of file diff --git a/inst/examples/velocity/wind-global.json b/inst/examples/velocity/wind-global.json deleted file mode 100644 index ae550a79..00000000 --- a/inst/examples/velocity/wind-global.json +++ /dev/null @@ -1 +0,0 @@ -[{"header":{"discipline":0,"disciplineName":"Meteorological products","gribEdition":2,"gribLength":76420,"center":7,"centerName":"US National Weather Service - NCEP(WMC)","subcenter":0,"refTime":"2016-04-30T06:00:00.000Z","significanceOfRT":1,"significanceOfRTName":"Start of forecast","productStatus":0,"productStatusName":"Operational products","productType":1,"productTypeName":"Forecast products","productDefinitionTemplate":0,"productDefinitionTemplateName":"Analysis/forecast at horizontal level/layer at a point in time","parameterCategory":2,"parameterCategoryName":"Momentum","parameterNumber":2,"parameterNumberName":"U-component_of_wind","parameterUnit":"m.s-1","genProcessType":2,"genProcessTypeName":"Forecast","forecastTime":0,"surface1Type":103,"surface1TypeName":"Specified height level above ground","surface1Value":10.0,"surface2Type":255,"surface2TypeName":"Missing","surface2Value":0.0,"gridDefinitionTemplate":0,"gridDefinitionTemplateName":"Latitude_Longitude","numberPoints":65160,"shape":6,"shapeName":"Earth spherical with radius of 6,371,229.0 m","gridUnits":"degrees","resolution":48,"winds":"true","scanMode":0,"nx":360,"ny":181,"basicAngle":0,"subDivisions":0,"lo1":0.0,"la1":90.0,"lo2":359.0,"la2":-90.0,"dx":1.0,"dy":1.0},"data":[4.54,4.52,4.49,4.47,4.44,4.41,4.38,4.34,4.31,4.27,4.24,4.2,4.16,4.12,4.08,4.04,3.99,3.95,3.9,3.85,3.8,3.75,3.7,3.65,3.6,3.54,3.49,3.43,3.37,3.31,3.25,3.19,3.13,3.07,3.0,2.94,2.87,2.81,2.74,2.67,2.6,2.53,2.46,2.39,2.32,2.25,2.17,2.1,2.03,1.95,1.87,1.8,1.72,1.64,1.57,1.49,1.41,1.33,1.25,1.17,1.09,1.01,0.93,0.85,0.76,0.68,0.6,0.52,0.44,0.35,0.27,0.19,0.11,0.02,-0.06,-0.14,-0.23,-0.31,-0.39,-0.47,-0.56,-0.64,-0.72,-0.8,-0.88,-0.96,-1.04,-1.13,-1.21,-1.29,-1.36,-1.44,-1.52,-1.6,-1.68,-1.76,-1.83,-1.91,-1.98,-2.06,-2.13,-2.21,-2.28,-2.35,-2.42,-2.49,-2.56,-2.63,-2.7,-2.77,-2.84,-2.9,-2.97,-3.03,-3.09,-3.16,-3.22,-3.28,-3.34,-3.4,-3.45,-3.51,-3.57,-3.62,-3.67,-3.72,-3.77,-3.82,-3.87,-3.92,-3.97,-4.01,-4.05,-4.1,-4.14,-4.18,-4.22,-4.25,-4.29,-4.32,-4.36,-4.39,-4.42,-4.45,-4.48,-4.5,-4.53,-4.55,-4.58,-4.6,-4.62,-4.64,-4.65,-4.67,-4.68,-4.69,-4.71,-4.72,-4.72,-4.73,-4.74,-4.74,-4.74,-4.74,-4.74,-4.74,-4.74,-4.73,-4.73,-4.72,-4.71,-4.7,-4.69,-4.68,-4.66,-4.65,-4.63,-4.61,-4.59,-4.57,-4.54,-4.52,-4.49,-4.47,-4.44,-4.41,-4.38,-4.34,-4.31,-4.27,-4.24,-4.2,-4.16,-4.12,-4.08,-4.04,-3.99,-3.95,-3.9,-3.85,-3.8,-3.75,-3.7,-3.65,-3.6,-3.54,-3.49,-3.43,-3.37,-3.31,-3.25,-3.19,-3.13,-3.07,-3.0,-2.94,-2.87,-2.81,-2.74,-2.67,-2.6,-2.53,-2.46,-2.39,-2.32,-2.25,-2.17,-2.1,-2.03,-1.95,-1.87,-1.8,-1.72,-1.64,-1.57,-1.49,-1.41,-1.33,-1.25,-1.17,-1.09,-1.01,-0.93,-0.85,-0.76,-0.68,-0.6,-0.52,-0.44,-0.35,-0.27,-0.19,-0.11,-0.02,0.06,0.14,0.23,0.31,0.39,0.47,0.56,0.64,0.72,0.8,0.88,0.96,1.04,1.13,1.21,1.29,1.36,1.44,1.52,1.6,1.68,1.76,1.83,1.91,1.98,2.06,2.13,2.21,2.28,2.35,2.42,2.49,2.56,2.63,2.7,2.77,2.84,2.9,2.97,3.03,3.09,3.16,3.22,3.28,3.34,3.4,3.45,3.51,3.57,3.62,3.67,3.72,3.77,3.82,3.87,3.92,3.97,4.01,4.05,4.1,4.14,4.18,4.22,4.25,4.29,4.32,4.36,4.39,4.42,4.45,4.48,4.5,4.53,4.55,4.58,4.6,4.62,4.64,4.65,4.67,4.68,4.69,4.71,4.72,4.72,4.73,4.74,4.74,4.74,4.74,4.74,4.74,4.74,4.73,4.73,4.72,4.71,4.7,4.69,4.68,4.66,4.65,4.63,4.61,4.59,4.57,3.51,3.5,3.5,3.5,3.49,3.49,3.48,3.48,3.48,3.47,3.47,3.46,3.46,3.45,3.44,3.43,3.42,3.41,3.4,3.39,3.38,3.37,3.36,3.35,3.33,3.31,3.28,3.26,3.24,3.21,3.18,3.16,3.13,3.1,3.08,3.06,3.03,2.99,2.96,2.92,2.89,2.85,2.81,2.77,2.73,2.69,2.64,2.58,2.54,2.49,2.43,2.38,2.32,2.27,2.21,2.15,2.09,2.02,1.96,1.89,1.82,1.75,1.68,1.61,1.53,1.46,1.38,1.3,1.23,1.14,1.07,0.98,0.9,0.82,0.73,0.64,0.56,0.47,0.38,0.3,0.2,0.12,0.03,-0.05,-0.14,-0.23,-0.32,-0.41,-0.5,-0.59,-0.69,-0.78,-0.87,-0.96,-1.06,-1.14,-1.24,-1.33,-1.43,-1.52,-1.62,-1.71,-1.8,-1.89,-1.99,-2.08,-2.17,-2.27,-2.36,-2.45,-2.55,-2.63,-2.72,-2.82,-2.91,-2.99,-3.08,-3.17,-3.25,-3.34,-3.42,-3.5,-3.57,-3.65,-3.72,-3.79,-3.86,-3.93,-3.99,-4.05,-4.11,-4.18,-4.22,-4.28,-4.33,-4.38,-4.43,-4.47,-4.52,-4.57,-4.61,-4.64,-4.68,-4.71,-4.75,-4.78,-4.8,-4.82,-4.85,-4.87,-4.89,-4.91,-4.92,-4.94,-4.95,-4.95,-4.96,-4.97,-4.97,-4.97,-4.97,-4.97,-4.96,-4.95,-4.94,-4.93,-4.92,-4.91,-4.89,-4.87,-4.85,-4.83,-4.8,-4.77,-4.74,-4.72,-4.68,-4.65,-4.61,-4.57,-4.54,-4.49,-4.45,-4.41,-4.37,-4.32,-4.27,-4.22,-4.17,-4.12,-4.07,-4.01,-3.95,-3.9,-3.84,-3.77,-3.71,-3.65,-3.59,-3.52,-3.45,-3.38,-3.31,-3.24,-3.17,-3.09,-3.01,-2.93,-2.86,-2.77,-2.7,-2.61,-2.53,-2.44,-2.36,-2.27,-2.19,-2.1,-2.02,-1.93,-1.84,-1.76,-1.67,-1.58,-1.49,-1.41,-1.31,-1.23,-1.14,-1.05,-0.96,-0.88,-0.79,-0.7,-0.61,-0.52,-0.44,-0.35,-0.27,-0.18,-0.1,-0.01,0.07,0.16,0.24,0.33,0.41,0.5,0.57,0.66,0.74,0.82,0.9,0.97,1.05,1.12,1.2,1.27,1.34,1.41,1.48,1.55,1.61,1.67,1.74,1.8,1.86,1.91,1.97,2.03,2.08,2.13,2.18,2.22,2.28,2.32,2.37,2.41,2.45,2.5,2.53,2.57,2.61,2.65,2.68,2.72,2.75,2.79,2.82,2.85,2.88,2.9,2.93,2.96,2.99,3.02,3.04,3.07,3.09,3.11,3.13,3.15,3.17,3.19,3.21,3.23,3.25,3.26,3.28,3.29,3.31,3.32,3.33,3.35,3.36,3.38,3.39,3.39,3.4,3.41,3.41,3.42,3.42,3.43,3.43,3.44,3.45,3.45,3.45,3.45,3.46,3.46,3.47,3.47,3.47,3.47,3.48,3.48,3.48,3.48,3.49,3.49,3.49,3.49,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,1.62,1.67,1.73,1.78,1.83,1.89,1.94,1.99,2.05,2.1,2.15,2.19,2.24,2.28,2.32,2.37,2.4,2.44,2.47,2.5,2.53,2.56,2.59,2.61,2.63,2.65,2.67,2.69,2.7,2.71,2.72,2.72,2.73,2.73,2.73,2.73,2.73,2.72,2.72,2.71,2.7,2.69,2.68,2.67,2.65,2.63,2.62,2.6,2.57,2.55,2.52,2.5,2.47,2.44,2.41,2.37,2.33,2.29,2.25,2.2,2.16,2.1,2.05,1.99,1.94,1.87,1.81,1.74,1.67,1.6,1.52,1.44,1.37,1.29,1.21,1.13,1.05,0.97,0.88,0.81,0.72,0.64,0.55,0.47,0.39,0.31,0.22,0.14,0.06,-0.02,-0.1,-0.18,-0.26,-0.34,-0.42,-0.5,-0.58,-0.66,-0.74,-0.83,-0.91,-1.01,-1.1,-1.21,-1.3,-1.4,-1.52,-1.63,-1.76,-1.87,-1.99,-2.12,-2.25,-2.39,-2.51,-2.64,-2.77,-2.89,-3.02,-3.12,-3.22,-3.32,-3.41,-3.51,-3.6,-3.68,-3.76,-3.83,-3.9,-3.97,-4.02,-4.08,-4.13,-4.17,-4.21,-4.26,-4.33,-4.36,-4.38,-4.4,-4.44,-4.48,-4.5,-4.52,-4.56,-4.58,-4.57,-4.59,-4.63,-4.67,-4.67,-4.65,-4.64,-4.65,-4.67,-4.68,-4.66,-4.64,-4.61,-4.58,-4.56,-4.55,-4.53,-4.51,-4.49,-4.47,-4.46,-4.45,-4.41,-4.37,-4.33,-4.27,-4.22,-4.17,-4.13,-4.08,-4.04,-4.0,-3.96,-3.93,-3.9,-3.85,-3.81,-3.77,-3.72,-3.68,-3.63,-3.57,-3.51,-3.45,-3.39,-3.33,-3.25,-3.19,-3.1,-3.03,-2.94,-2.86,-2.79,-2.7,-2.62,-2.54,-2.45,-2.37,-2.29,-2.2,-2.12,-2.04,-1.97,-1.89,-1.81,-1.74,-1.67,-1.6,-1.52,-1.45,-1.37,-1.29,-1.21,-1.12,-1.03,-0.94,-0.83,-0.73,-0.63,-0.51,-0.41,-0.29,-0.18,-0.07,0.04,0.15,0.25,0.35,0.45,0.55,0.64,0.73,0.82,0.91,0.99,1.08,1.16,1.25,1.33,1.41,1.49,1.58,1.66,1.74,1.82,1.9,1.97,2.04,2.11,2.17,2.23,2.29,2.33,2.37,2.41,2.45,2.48,2.51,2.53,2.55,2.57,2.59,2.6,2.61,2.62,2.63,2.64,2.65,2.65,2.66,2.66,2.67,2.67,2.66,2.66,2.66,2.65,2.64,2.63,2.62,2.6,2.58,2.56,2.53,2.51,2.48,2.45,2.41,2.37,2.32,2.28,2.23,2.18,2.13,2.09,2.03,1.97,1.91,1.85,1.79,1.73,1.67,1.61,1.55,1.5,1.44,1.38,1.32,1.27,1.22,1.17,1.12,1.07,1.03,0.99,0.96,0.92,0.89,0.86,0.83,0.81,0.79,0.77,0.76,0.74,0.74,0.73,0.73,0.73,0.74,0.75,0.76,0.77,0.79,0.8,0.82,0.85,0.87,0.9,0.93,0.97,1.0,1.04,1.08,1.11,1.16,1.21,1.25,1.3,1.35,1.41,1.45,1.51,1.56,-1.74,-1.58,-1.42,-1.26,-1.09,-0.93,-0.76,-0.6,-0.44,-0.28,-0.13,0.03,0.18,0.33,0.47,0.61,0.76,0.9,1.04,1.18,1.31,1.45,1.58,1.68,1.78,1.88,1.99,2.08,2.16,2.23,2.29,2.35,2.42,2.47,2.52,2.56,2.6,2.63,2.66,2.68,2.7,2.71,2.71,2.71,2.71,2.71,2.7,2.69,2.67,2.65,2.63,2.61,2.59,2.56,2.52,2.48,2.45,2.41,2.37,2.31,2.26,2.2,2.14,2.07,2.0,1.92,1.84,1.75,1.66,1.56,1.47,1.37,1.26,1.16,1.05,0.96,0.87,0.79,0.7,0.63,0.57,0.51,0.45,0.4,0.35,0.29,0.24,0.19,0.14,0.08,0.03,-0.02,-0.08,-0.14,-0.21,-0.27,-0.34,-0.41,-0.49,-0.58,-0.66,-0.75,-0.84,-0.95,-1.06,-1.17,-1.27,-1.39,-1.5,-1.62,-1.74,-1.85,-1.97,-2.09,-2.21,-2.33,-2.45,-2.55,-2.65,-2.75,-2.85,-2.95,-3.04,-3.12,-3.2,-3.26,-3.31,-3.38,-3.45,-3.53,-3.59,-3.65,-3.7,-3.74,-3.79,-3.82,-3.83,-3.83,-3.85,-3.86,-3.87,-3.89,-3.9,-3.91,-3.95,-4.05,-4.12,-4.15,-4.24,-4.34,-4.42,-4.51,-4.64,-4.76,-4.86,-4.94,-5.01,-5.08,-5.15,-5.17,-5.17,-5.15,-5.13,-5.09,-5.03,-4.94,-4.87,-4.81,-4.75,-4.7,-4.61,-4.52,-4.44,-4.36,-4.26,-4.17,-4.06,-3.93,-3.8,-3.65,-3.49,-3.34,-3.18,-3.01,-2.85,-2.71,-2.56,-2.42,-2.31,-2.21,-2.13,-2.06,-2.0,-1.95,-1.92,-1.9,-1.88,-1.87,-1.86,-1.84,-1.83,-1.81,-1.78,-1.75,-1.7,-1.65,-1.58,-1.51,-1.42,-1.32,-1.2,-1.08,-0.94,-0.79,-0.63,-0.47,-0.31,-0.16,-0.02,0.1,0.22,0.31,0.39,0.46,0.51,0.56,0.61,0.67,0.74,0.81,0.91,1.01,1.12,1.24,1.36,1.49,1.62,1.74,1.86,1.98,2.08,2.18,2.26,2.35,2.42,2.5,2.56,2.64,2.71,2.77,2.84,2.89,2.95,2.99,3.03,3.07,3.08,3.08,3.08,3.07,3.05,3.02,3.0,2.97,2.93,2.89,2.84,2.8,2.75,2.7,2.66,2.61,2.55,2.49,2.44,2.38,2.33,2.26,2.21,2.15,2.09,2.01,1.93,1.85,1.75,1.66,1.56,1.45,1.33,1.22,1.09,0.97,0.84,0.71,0.58,0.44,0.31,0.17,0.04,-0.09,-0.21,-0.33,-0.45,-0.57,-0.68,-0.79,-0.89,-1.0,-1.1,-1.19,-1.27,-1.35,-1.45,-1.54,-1.62,-1.69,-1.74,-1.81,-1.89,-1.96,-2.03,-2.1,-2.19,-2.27,-2.36,-2.45,-2.53,-2.61,-2.68,-2.75,-2.82,-2.88,-2.94,-2.98,-3.03,-3.06,-3.09,-3.11,-3.13,-3.14,-3.15,-3.15,-3.15,-3.13,-3.11,-3.09,-3.05,-3.01,-2.96,-2.91,-2.84,-2.76,-2.68,-2.6,-2.5,-2.39,-2.28,-2.15,-2.02,-1.88,-4.49,-4.35,-4.2,-4.05,-3.89,-3.73,-3.57,-3.41,-3.23,-3.04,-2.83,-2.63,-2.41,-2.16,-1.9,-1.63,-1.35,-1.08,-0.8,-0.52,-0.25,0.0,0.23,0.45,0.66,0.86,1.05,1.24,1.41,1.59,1.75,1.9,2.04,2.17,2.29,2.4,2.49,2.58,2.66,2.73,2.79,2.84,2.88,2.91,2.94,2.96,2.97,2.98,2.98,2.98,2.98,2.98,2.97,2.95,2.93,2.9,2.87,2.83,2.79,2.75,2.69,2.64,2.57,2.49,2.4,2.31,2.21,2.09,1.97,1.83,1.69,1.53,1.38,1.22,1.08,0.94,0.82,0.72,0.65,0.59,0.55,0.52,0.5,0.48,0.45,0.42,0.39,0.34,0.28,0.22,0.14,0.06,-0.02,-0.11,-0.2,-0.28,-0.37,-0.45,-0.54,-0.63,-0.72,-0.83,-0.92,-1.02,-1.11,-1.2,-1.3,-1.4,-1.47,-1.53,-1.6,-1.67,-1.72,-1.78,-1.84,-1.9,-1.95,-2.02,-2.1,-2.18,-2.26,-2.34,-2.41,-2.47,-2.54,-2.6,-2.67,-2.73,-2.77,-2.84,-2.91,-2.95,-3.0,-3.05,-3.07,-3.1,-3.12,-3.11,-3.09,-3.07,-2.98,-2.86,-2.74,-2.61,-2.46,-2.32,-2.17,-2.04,-1.93,-1.81,-1.71,-1.62,-1.53,-1.46,-1.4,-1.35,-1.3,-1.27,-1.26,-1.25,-1.24,-1.24,-1.24,-1.25,-1.25,-1.25,-1.24,-1.21,-1.17,-1.11,-1.03,-0.93,-0.83,-0.72,-0.62,-0.54,-0.5,-0.5,-0.58,-0.72,-0.91,-1.2,-1.52,-1.85,-2.19,-2.46,-2.66,-2.78,-2.78,-2.73,-2.62,-2.43,-2.23,-2.03,-1.85,-1.71,-1.59,-1.5,-1.45,-1.41,-1.39,-1.37,-1.33,-1.29,-1.22,-1.14,-1.06,-0.97,-0.89,-0.81,-0.74,-0.67,-0.6,-0.53,-0.44,-0.33,-0.21,-0.05,0.13,0.33,0.55,0.77,1.01,1.23,1.44,1.63,1.8,1.93,2.01,2.08,2.11,2.13,2.16,2.2,2.27,2.35,2.46,2.58,2.72,2.87,3.02,3.14,3.26,3.35,3.42,3.48,3.53,3.57,3.6,3.63,3.65,3.67,3.67,3.67,3.64,3.6,3.54,3.46,3.38,3.28,3.19,3.08,2.97,2.87,2.76,2.65,2.54,2.44,2.33,2.22,2.11,2.02,1.92,1.83,1.74,1.65,1.55,1.45,1.34,1.23,1.12,1.0,0.89,0.78,0.67,0.56,0.47,0.38,0.3,0.23,0.16,0.09,0.02,-0.06,-0.15,-0.28,-0.43,-0.61,-0.83,-1.05,-1.25,-1.41,-1.56,-1.7,-1.82,-1.95,-2.11,-2.27,-2.5,-2.71,-2.9,-3.1,-3.26,-3.41,-3.54,-3.64,-3.73,-3.86,-3.89,-3.89,-3.93,-4.01,-4.13,-4.27,-4.43,-4.58,-4.72,-4.85,-4.96,-5.07,-5.19,-5.27,-5.35,-5.42,-5.44,-5.48,-5.54,-5.58,-5.63,-5.67,-5.71,-5.75,-5.77,-5.79,-5.82,-5.81,-5.77,-5.73,-5.66,-5.58,-5.51,-5.43,-5.35,-5.27,-5.18,-5.08,-4.97,-4.86,-4.74,-4.62,-5.28,-5.12,-4.97,-4.81,-4.66,-4.5,-4.36,-4.22,-4.01,-3.83,-3.65,-3.46,-3.27,-3.07,-2.83,-2.63,-2.4,-2.17,-1.92,-1.65,-1.39,-1.11,-0.83,-0.54,-0.25,0.02,0.3,0.57,0.83,1.07,1.3,1.53,1.72,1.88,2.02,2.17,2.31,2.4,2.49,2.61,2.71,2.79,2.86,2.92,3.0,3.06,3.11,3.15,3.2,3.24,3.27,3.29,3.31,3.31,3.31,3.3,3.29,3.27,3.24,3.19,3.15,3.08,3.02,2.95,2.87,2.78,2.68,2.58,2.45,2.3,2.15,1.99,1.85,1.73,1.62,1.53,1.43,1.36,1.26,1.16,1.05,0.92,0.77,0.62,0.47,0.35,0.23,0.13,0.03,-0.07,-0.19,-0.32,-0.46,-0.59,-0.71,-0.83,-0.92,-0.99,-1.05,-1.13,-1.21,-1.3,-1.39,-1.5,-1.6,-1.7,-1.81,-1.88,-1.95,-2.01,-2.1,-2.21,-2.32,-2.46,-2.58,-2.67,-2.73,-2.79,-2.81,-2.77,-2.7,-2.58,-2.42,-2.21,-1.97,-1.72,-1.46,-1.21,-0.99,-0.81,-0.66,-0.53,-0.44,-0.37,-0.31,-0.25,-0.2,-0.17,-0.15,-0.13,-0.12,-0.11,-0.09,-0.08,-0.05,-0.03,0.01,0.07,0.14,0.23,0.33,0.43,0.53,0.6,0.63,0.63,0.6,0.53,0.45,0.37,0.29,0.24,0.21,0.19,0.17,0.14,0.1,0.03,-0.09,-0.25,-0.45,-0.68,-0.93,-1.18,-1.41,-1.58,-1.67,-1.66,-1.53,-1.3,-0.95,-0.56,-0.17,0.13,0.28,0.26,0.05,-0.35,-0.89,-1.41,-1.86,-2.16,-2.29,-2.27,-2.12,-1.89,-1.66,-1.46,-1.31,-1.22,-1.19,-1.22,-1.24,-1.24,-1.2,-1.12,-0.99,-0.84,-0.68,-0.52,-0.38,-0.27,-0.18,-0.11,-0.06,-0.01,0.06,0.16,0.27,0.41,0.58,0.77,0.96,1.18,1.42,1.68,1.95,2.21,2.46,2.67,2.84,2.96,3.03,3.07,3.09,3.12,3.18,3.26,3.37,3.5,3.64,3.78,3.91,3.99,4.05,4.08,4.09,4.07,4.04,4.01,3.97,3.91,3.85,3.76,3.65,3.52,3.37,3.21,3.04,2.86,2.69,2.52,2.35,2.18,2.02,1.86,1.71,1.57,1.44,1.32,1.21,1.11,1.03,0.93,0.85,0.75,0.66,0.59,0.51,0.46,0.41,0.38,0.37,0.38,0.4,0.44,0.48,0.53,0.55,0.54,0.48,0.34,0.15,-0.08,-0.3,-0.5,-0.72,-0.93,-1.14,-1.36,-1.58,-1.8,-2.02,-2.26,-2.5,-2.77,-3.04,-3.32,-3.61,-3.89,-4.16,-4.4,-4.56,-4.65,-4.62,-4.58,-4.54,-4.54,-4.63,-4.84,-4.98,-5.13,-5.3,-5.45,-5.59,-5.72,-5.78,-5.9,-6.01,-6.11,-6.22,-6.33,-6.43,-6.55,-6.67,-6.83,-6.95,-7.02,-7.06,-7.19,-7.23,-7.28,-7.34,-7.37,-7.34,-7.3,-7.25,-7.12,-7.03,-6.95,-6.87,-6.77,-6.64,-6.47,-6.34,-6.15,-5.97,-5.8,-5.63,-5.46,-1.34,-1.42,-1.55,-1.72,-1.88,-2.02,-2.09,-2.1,-2.06,-1.96,-1.87,-1.79,-1.7,-1.61,-1.53,-1.45,-1.35,-1.26,-1.16,-1.04,-0.91,-0.75,-0.58,-0.38,-0.18,0.03,0.25,0.47,0.71,0.92,1.13,1.4,1.6,1.78,1.97,2.09,2.27,2.43,2.5,2.61,2.69,2.75,2.8,2.87,2.94,2.99,3.04,3.1,3.16,3.24,3.3,3.36,3.4,3.44,3.46,3.47,3.47,3.46,3.45,3.42,3.38,3.34,3.3,3.23,3.16,3.09,2.99,2.89,2.78,2.67,2.56,2.46,2.35,2.24,2.12,1.99,1.86,1.74,1.61,1.5,1.39,1.28,1.15,1.01,0.86,0.7,0.53,0.35,0.16,-0.02,-0.21,-0.38,-0.54,-0.67,-0.78,-0.87,-0.98,-1.13,-1.34,-1.59,-1.87,-2.16,-2.46,-2.71,-2.91,-3.08,-3.17,-3.21,-3.24,-3.2,-3.15,-3.07,-2.97,-2.85,-2.75,-2.66,-2.57,-2.49,-2.39,-2.3,-2.22,-2.12,-2.04,-1.97,-1.9,-1.84,-1.78,-1.73,-1.68,-1.64,-1.6,-1.56,-1.53,-1.51,-1.48,-1.47,-1.45,-1.43,-1.41,-1.38,-1.37,-1.34,-1.29,-1.21,-1.16,-1.12,-1.06,-1.0,-0.91,-0.82,-0.73,-0.65,-0.57,-0.5,-0.42,-0.35,-0.28,-0.2,-0.13,-0.05,0.03,0.11,0.2,0.28,0.37,0.46,0.55,0.63,0.69,0.76,0.82,0.89,0.99,1.11,1.25,1.41,1.54,1.6,1.55,1.37,1.06,0.64,0.23,-0.07,-0.2,-0.12,0.07,0.27,0.34,0.19,-0.19,-0.72,-1.22,-1.59,-1.75,-1.72,-1.55,-1.33,-1.11,-0.94,-0.84,-0.8,-0.8,-0.83,-0.84,-0.81,-0.75,-0.66,-0.55,-0.43,-0.32,-0.24,-0.2,-0.17,-0.14,-0.09,-0.02,0.09,0.22,0.35,0.48,0.63,0.79,0.98,1.2,1.43,1.68,1.94,2.19,2.44,2.67,2.88,3.05,3.2,3.33,3.45,3.56,3.67,3.77,3.89,4.0,4.12,4.22,4.27,4.28,4.25,4.2,4.12,4.03,3.93,3.82,3.7,3.55,3.38,3.18,2.96,2.73,2.49,2.25,2.01,1.78,1.56,1.35,1.14,0.94,0.76,0.6,0.46,0.32,0.2,0.07,-0.05,-0.16,-0.25,-0.32,-0.36,-0.36,-0.33,-0.25,-0.14,0.01,0.18,0.4,0.64,0.88,1.07,1.22,1.36,1.46,1.54,1.58,1.59,1.53,1.42,1.26,1.04,0.77,0.47,0.12,-0.26,-0.64,-1.02,-1.39,-1.76,-2.13,-2.49,-2.85,-3.2,-3.53,-3.8,-4.0,-4.09,-4.11,-4.05,-4.01,-4.05,-4.18,-4.38,-4.61,-4.92,-5.18,-5.42,-5.61,-5.73,-5.8,-5.83,-5.81,-5.75,-5.69,-5.64,-5.6,-5.61,-5.61,-5.6,-5.61,-5.61,-5.6,-5.59,-5.45,-5.39,-5.28,-5.16,-5.0,-4.81,-4.51,-4.14,-3.72,-3.32,-2.93,-2.59,-2.31,-2.07,-1.84,-1.67,-1.53,-1.43,-1.37,-1.31,-1.31,-1.31,2.88,3.17,3.49,3.75,3.88,3.84,3.57,3.09,2.5,2.02,1.63,1.25,0.99,0.77,0.67,0.61,0.6,0.6,0.66,0.72,0.78,0.81,0.82,0.81,0.76,0.73,0.68,0.67,0.74,0.86,1.06,1.32,1.51,1.69,1.85,1.99,2.1,2.23,2.32,2.43,2.52,2.61,2.73,2.82,2.83,2.87,2.95,3.08,3.17,3.22,3.28,3.33,3.38,3.38,3.4,3.48,3.5,3.5,3.47,3.44,3.41,3.38,3.35,3.31,3.26,3.17,3.12,3.04,2.96,2.85,2.73,2.6,2.48,2.36,2.24,2.13,1.99,1.86,1.72,1.57,1.42,1.27,1.12,0.97,0.83,0.68,0.51,0.32,0.11,-0.12,-0.34,-0.53,-0.69,-0.85,-1.05,-1.31,-1.6,-1.96,-2.34,-2.71,-3.01,-3.22,-3.31,-3.35,-3.31,-3.25,-3.15,-3.08,-3.0,-2.95,-2.9,-2.88,-2.84,-2.8,-2.77,-2.73,-2.7,-2.68,-2.67,-2.68,-2.71,-2.75,-2.8,-2.84,-2.86,-2.89,-2.91,-2.93,-2.92,-2.92,-2.9,-2.87,-2.85,-2.81,-2.77,-2.72,-2.7,-2.69,-2.64,-2.59,-2.47,-2.4,-2.38,-2.39,-2.39,-2.38,-2.34,-2.3,-2.24,-2.18,-2.11,-2.03,-1.95,-1.86,-1.77,-1.67,-1.58,-1.47,-1.36,-1.23,-1.11,-0.97,-0.83,-0.67,-0.5,-0.33,-0.16,0.01,0.18,0.35,0.5,0.65,0.8,0.92,1.0,1.05,1.07,1.1,1.19,1.37,1.64,1.94,2.14,2.17,1.98,1.6,1.21,0.93,0.79,0.7,0.54,0.19,-0.36,-0.95,-1.36,-1.56,-1.52,-1.35,-1.11,-0.95,-0.87,-0.88,-0.93,-0.95,-0.94,-0.9,-0.88,-0.86,-0.83,-0.8,-0.79,-0.78,-0.78,-0.75,-0.68,-0.55,-0.41,-0.27,-0.15,-0.04,0.06,0.17,0.29,0.45,0.65,0.87,1.11,1.33,1.57,1.81,2.09,2.38,2.66,2.93,3.18,3.39,3.55,3.67,3.78,3.87,3.97,4.07,4.14,4.18,4.16,4.09,3.99,3.87,3.73,3.59,3.43,3.27,3.07,2.84,2.6,2.33,2.07,1.82,1.56,1.3,1.02,0.73,0.44,0.15,-0.11,-0.34,-0.54,-0.69,-0.83,-0.94,-1.09,-1.3,-1.57,-1.9,-2.24,-2.55,-2.78,-3.02,-3.1,-2.96,-2.75,-2.36,-2.02,-1.97,-1.04,-0.01,0.92,1.1,1.08,1.18,2.19,3.53,4.1,4.58,5.18,5.88,6.27,6.14,5.53,4.58,3.46,2.32,1.26,0.35,-0.36,-0.85,-1.14,-1.28,-1.29,-1.21,-1.1,-0.97,-0.84,-0.65,-0.41,-0.02,0.3,0.47,0.74,1.76,2.93,3.3,3.04,2.49,2.16,1.84,1.59,1.42,0.47,-0.5,-1.08,-1.37,-1.84,-1.98,-2.18,-2.06,-2.03,-2.54,-3.0,-3.26,-3.41,-3.54,-3.66,-3.65,-3.4,-2.97,-2.42,-1.85,-1.32,-0.91,-0.58,-0.28,0.05,0.39,0.71,1.12,1.49,1.87,2.2,2.54,3.8,3.99,4.15,4.29,4.39,4.47,4.53,4.59,4.65,4.71,4.82,4.82,4.71,4.53,4.34,4.1,3.69,3.13,2.62,2.22,1.95,1.86,1.89,1.94,2.0,2.07,2.08,2.03,1.95,1.71,1.48,1.35,1.37,1.51,1.69,1.86,2.0,2.15,2.29,2.43,2.55,2.64,2.69,2.68,2.68,2.68,2.74,2.8,2.86,2.92,3.0,3.1,3.17,3.22,3.25,3.26,3.25,3.27,3.46,3.75,3.95,3.88,3.76,3.7,3.63,3.48,3.27,3.09,2.95,2.82,2.69,2.53,2.36,2.19,2.02,1.87,1.74,1.62,1.48,1.32,1.16,0.99,0.82,0.66,0.51,0.36,0.21,0.04,-0.17,-0.41,-0.68,-0.98,-1.26,-1.55,-1.89,-2.35,-2.87,-3.28,-3.53,-3.59,-3.5,-3.38,-3.23,-3.13,-3.07,-3.04,-3.1,-3.17,-3.24,-3.27,-3.31,-3.34,-3.43,-3.55,-3.65,-3.77,-3.87,-3.95,-3.99,-3.98,-3.97,-3.94,-3.88,-3.8,-3.75,-3.75,-3.78,-3.8,-3.84,-3.92,-3.91,-3.92,-3.91,-3.92,-3.88,-3.87,-3.76,-3.69,-3.6,-3.57,-3.54,-3.54,-3.53,-3.5,-3.43,-3.38,-3.32,-3.26,-3.2,-3.13,-3.07,-2.99,-2.91,-2.84,-2.76,-2.68,-2.58,-2.48,-2.37,-2.26,-2.13,-1.99,-1.84,-1.69,-1.52,-1.35,-1.18,-0.99,-0.8,-0.61,-0.41,-0.2,0.0,0.21,0.43,0.65,0.84,1.0,1.09,1.13,1.18,1.3,1.53,1.84,2.11,2.23,2.13,1.87,1.65,1.55,1.45,1.14,0.49,-0.46,-1.26,-1.7,-1.68,-1.49,-1.31,-1.26,-1.32,-1.4,-1.43,-1.42,-1.41,-1.46,-1.59,-1.72,-1.77,-1.74,-1.64,-1.51,-1.4,-1.29,-1.21,-1.14,-1.09,-1.04,-0.98,-0.9,-0.81,-0.69,-0.56,-0.41,-0.24,-0.06,0.14,0.37,0.6,0.87,1.14,1.45,1.79,2.14,2.48,2.77,3.0,3.17,3.28,3.35,3.42,3.5,3.56,3.58,3.54,3.46,3.35,3.22,3.1,2.99,2.88,2.75,2.59,2.39,2.18,1.96,1.76,1.54,1.31,1.08,0.85,0.63,0.43,0.28,0.2,0.12,-0.08,-0.46,-0.86,-1.05,-1.12,-1.25,-1.57,-2.26,-2.37,-2.34,-1.23,0.3,0.99,1.1,0.41,-1.12,-2.5,-2.62,-2.56,-2.5,-1.93,-0.91,-0.07,0.38,0.45,0.19,-0.35,-0.89,-1.3,-1.56,-1.75,-1.63,-1.53,-1.26,-0.91,-0.69,-0.71,-0.46,0.5,1.82,2.59,2.52,2.55,2.35,2.09,2.56,3.41,4.16,4.24,2.74,1.38,0.91,1.26,2.21,3.54,4.91,5.49,4.86,3.3,2.14,2.09,2.1,1.41,-0.73,-3.45,-4.72,-3.96,-1.87,-0.11,0.75,0.6,-0.4,-1.72,-3.36,-4.73,-5.34,-5.06,-4.13,-3.07,-2.13,-1.43,-0.87,-0.38,0.03,0.37,0.64,0.92,1.24,1.62,2.06,2.5,2.94,3.27,3.56,3.41,3.55,3.88,4.33,4.54,4.51,4.53,4.85,5.18,5.11,4.74,4.45,4.34,4.41,4.5,4.7,4.77,4.81,4.78,4.84,4.89,4.93,4.65,4.13,3.53,2.95,2.58,2.35,2.31,2.46,2.65,2.65,2.44,2.05,1.65,1.31,1.15,1.21,1.44,1.71,1.9,2.04,2.12,2.21,2.32,2.46,2.68,2.95,3.14,3.27,3.38,3.77,3.83,3.34,2.79,2.38,2.65,2.85,3.09,2.7,3.16,3.54,3.96,3.74,3.83,3.99,3.76,3.0,2.45,2.21,2.07,1.93,1.81,1.67,1.42,1.11,0.8,0.59,0.49,0.49,0.52,0.45,0.26,0.07,-0.07,-0.2,-0.37,-0.59,-0.84,-1.18,-1.62,-2.02,-2.35,-2.67,-2.98,-3.18,-3.15,-3.07,-3.09,-3.07,-2.98,-2.93,-2.94,-3.01,-3.01,-2.98,-2.91,-2.87,-2.91,-2.99,-3.12,-3.27,-3.41,-3.51,-3.63,-3.77,-3.93,-4.08,-4.2,-4.33,-4.43,-4.47,-4.45,-4.38,-4.3,-4.23,-4.18,-4.18,-4.11,-4.14,-4.14,-4.13,-4.1,-4.11,-4.18,-4.25,-4.26,-4.24,-4.13,-3.92,-3.81,-3.74,-3.68,-3.6,-3.5,-3.42,-3.4,-3.46,-3.47,-3.46,-3.37,-3.29,-3.12,-3.01,-2.95,-2.89,-2.84,-2.76,-2.68,-2.6,-2.51,-2.4,-2.3,-2.18,-2.05,-1.9,-1.74,-1.56,-1.37,-1.16,-0.94,-0.72,-0.5,-0.28,-0.07,0.14,0.35,0.58,0.8,0.97,1.07,1.09,1.12,1.29,1.6,1.96,2.15,2.12,1.94,1.84,1.82,1.6,0.67,-0.68,-1.81,-2.28,-2.11,-1.79,-1.61,-1.6,-1.68,-1.77,-1.88,-2.02,-2.17,-2.31,-2.37,-2.44,-2.47,-2.46,-2.43,-2.4,-2.39,-2.37,-2.35,-2.32,-2.29,-2.24,-2.18,-2.11,-2.04,-1.96,-1.87,-1.76,-1.63,-1.5,-1.36,-1.19,-0.98,-0.72,-0.41,-0.06,0.32,0.72,1.11,1.46,1.73,1.9,1.99,2.03,2.06,2.11,2.17,2.24,2.28,2.3,2.3,2.28,2.24,2.2,2.16,2.13,2.08,2.02,1.91,1.76,1.56,1.37,1.22,1.13,0.98,0.74,0.48,0.29,0.05,-0.17,0.25,1.72,5.4,6.29,4.46,2.8,3.17,2.87,1.16,-0.04,-0.09,-0.16,-0.62,-0.69,-0.07,0.15,-0.25,-0.47,-1.1,-2.11,-2.92,-1.23,0.84,0.89,0.07,-0.5,-1.07,-2.14,-3.87,-4.77,-3.46,-1.24,-0.2,-2.34,-6.91,-9.56,-8.22,-4.31,-1.13,0.12,0.31,-0.11,-0.61,-0.7,-0.36,0.0,0.19,0.44,1.07,1.9,2.22,1.84,1.58,2.72,5.58,8.59,9.94,8.79,6.07,4.15,3.82,4.42,4.41,3.12,1.41,-0.08,-1.45,-2.98,-3.28,-2.61,-0.66,0.11,-0.57,-1.44,-1.07,0.28,1.05,0.47,-0.34,-0.21,0.35,0.52,0.3,0.22,0.43,0.75,1.1,1.49,1.93,2.31,2.56,2.79,3.05,3.25,2.97,3.05,2.86,2.63,2.46,2.52,2.64,2.62,2.61,2.87,3.44,3.98,3.85,2.85,1.74,1.22,1.09,0.65,-0.58,-0.67,0.97,2.29,1.5,1.05,2.81,4.75,4.22,2.24,1.0,1.38,2.28,2.83,2.84,2.95,3.01,3.07,3.04,2.79,2.23,1.46,0.96,1.13,1.65,2.11,2.39,2.52,2.53,2.49,2.45,2.41,2.21,2.48,2.71,2.81,2.87,2.76,2.56,2.55,2.36,2.14,2.12,1.97,1.66,1.42,1.33,1.29,1.2,1.05,0.93,0.85,0.81,0.78,0.75,0.64,0.39,0.04,-0.26,-0.39,-0.37,-0.34,-0.4,-0.52,-0.65,-0.73,-0.73,-0.69,-0.67,-0.78,-1.01,-1.24,-1.23,-0.8,-0.31,-0.45,-1.48,-2.83,-4.01,-4.45,-3.33,-2.03,-1.6,-2.11,-2.57,-2.59,-2.43,-2.31,-2.27,-2.26,-2.27,-2.31,-2.43,-2.57,-2.68,-2.78,-2.93,-3.22,-3.54,-3.84,-4.1,-4.25,-4.32,-4.39,-4.44,-4.48,-4.5,-4.51,-4.52,-4.45,-4.42,-4.42,-4.41,-4.39,-4.38,-4.36,-4.33,-4.29,-4.26,-4.22,-4.17,-4.11,-4.03,-3.95,-3.76,-3.62,-3.57,-3.43,-3.32,-3.22,-3.15,-3.07,-2.98,-2.87,-2.76,-2.67,-2.61,-2.47,-2.37,-2.29,-2.22,-2.15,-2.09,-2.06,-2.05,-2.04,-1.99,-1.89,-1.77,-1.64,-1.5,-1.34,-1.14,-0.93,-0.69,-0.46,-0.22,0.02,0.24,0.42,0.59,0.76,0.94,1.08,1.14,1.12,1.14,1.33,1.67,1.99,2.19,2.32,2.55,2.78,2.17,0.16,-1.95,-2.94,-2.82,-2.43,-2.25,-2.28,-2.29,-2.37,-2.54,-2.77,-2.95,-3.09,-3.16,-3.22,-3.31,-3.38,-3.43,-3.45,-3.46,-3.47,-3.47,-3.49,-3.52,-3.54,-3.53,-3.51,-3.47,-3.43,-3.39,-3.35,-3.28,-3.21,-3.15,-3.1,-3.01,-2.87,-2.69,-2.43,-2.1,-1.71,-1.29,-0.89,-0.58,-0.38,-0.24,-0.12,0.03,0.23,0.47,0.75,1.04,1.29,1.51,1.68,1.79,1.86,1.89,1.92,1.94,1.95,1.96,1.92,1.84,1.74,1.66,1.5,1.27,1.24,1.32,1.49,1.54,0.36,-2.09,-3.68,-1.65,2.99,5.94,4.91,2.65,2.34,2.4,3.05,2.71,1.78,1.13,-0.63,-1.99,-2.14,-1.68,-1.23,-0.9,-0.88,-1.09,-1.14,-1.54,-3.01,-4.84,-5.77,-4.87,-3.18,-2.39,-3.52,-5.54,-6.93,-4.88,-1.61,-0.42,-1.11,-1.64,-1.56,-1.09,-0.39,-0.16,-0.31,0.27,2.16,4.14,5.02,4.93,4.44,4.1,3.92,3.86,4.7,6.73,9.07,10.27,10.34,10.22,10.57,11.26,11.94,11.37,9.61,6.23,3.85,3.33,3.51,3.58,3.91,3.63,1.55,-2.04,-4.76,-5.0,-2.71,-0.41,0.41,0.53,0.08,-0.31,-0.4,-0.43,-0.45,-0.51,-0.52,-0.38,0.06,0.65,1.16,1.43,1.55,1.72,2.04,2.4,2.72,0.91,0.95,0.84,0.56,0.23,0.09,0.23,0.37,0.16,-0.26,-0.58,-1.11,-1.26,-0.29,0.9,0.74,-0.31,0.16,1.55,0.67,-0.34,0.09,0.61,0.52,0.83,1.39,1.66,1.7,1.72,1.75,1.84,2.0,2.19,2.34,2.51,2.68,2.8,2.83,2.77,2.67,2.5,2.33,2.27,2.3,2.42,2.63,2.84,2.99,3.08,3.09,3.03,2.96,2.94,2.98,3.08,3.2,3.23,3.06,2.73,2.41,2.2,2.14,2.2,1.99,1.63,1.45,1.31,1.11,1.0,0.96,0.9,0.81,0.82,0.92,0.9,0.63,0.24,0.0,-0.01,0.04,0.03,-0.03,-0.07,-0.02,0.03,0.0,-0.12,-0.25,-0.41,-0.64,-0.88,-1.0,-0.96,-0.78,-0.79,-1.01,-1.07,-1.46,-3.02,-4.04,-3.38,-2.64,-1.78,-0.59,0.29,0.66,0.24,-0.35,-0.82,-1.28,-1.64,-1.84,-1.99,-2.1,-2.08,-1.96,-1.94,-2.23,-2.82,-3.44,-3.88,-4.13,-4.22,-4.23,-4.2,-4.17,-4.16,-4.15,-4.13,-4.13,-4.15,-4.2,-4.22,-4.24,-4.26,-4.28,-4.3,-4.29,-4.29,-4.27,-4.2,-4.06,-3.91,-3.77,-3.63,-3.54,-3.39,-3.21,-3.07,-2.96,-2.88,-2.8,-2.72,-2.61,-2.46,-2.28,-2.15,-2.05,-1.95,-1.86,-1.76,-1.72,-1.7,-1.72,-1.72,-1.68,-1.59,-1.51,-1.41,-1.31,-1.18,-1.01,-0.8,-0.54,-0.27,0.01,0.28,0.49,0.67,0.8,0.9,1.01,1.13,1.21,1.18,1.1,1.14,1.35,1.63,1.83,2.09,2.57,2.46,0.78,-1.81,-3.11,-3.08,-2.67,-2.6,-2.78,-2.97,-3.16,-3.24,-3.34,-3.45,-3.63,-3.83,-4.02,-4.18,-4.26,-4.29,-4.32,-4.35,-4.39,-4.46,-4.57,-4.68,-4.76,-4.83,-4.92,-4.98,-5.02,-5.02,-4.99,-4.91,-4.81,-4.69,-4.59,-4.49,-4.43,-4.38,-4.32,-4.3,-4.25,-3.89,-3.48,-3.03,-2.68,-2.48,-2.29,-1.98,-1.55,-1.07,-0.57,-0.06,0.42,0.88,1.26,1.55,1.77,1.96,2.07,2.11,2.16,2.16,1.93,1.8,2.47,3.64,4.33,4.4,4.34,4.58,4.9,4.64,3.57,1.65,-0.21,-1.01,-0.41,0.52,1.87,1.83,0.84,0.5,1.68,1.41,1.67,1.19,0.16,0.85,2.15,1.23,0.3,0.57,0.26,-2.09,-5.22,-6.78,-6.19,-4.89,-3.85,-3.08,-2.29,-1.17,-0.11,0.61,0.89,0.64,0.2,-0.43,-1.19,-1.51,-0.84,0.16,0.71,0.89,1.21,1.48,1.54,1.59,1.83,2.3,2.86,3.33,3.8,4.65,5.85,6.91,7.43,7.45,7.39,7.67,8.21,8.57,8.63,8.84,9.37,9.6,9.09,8.66,8.86,9.26,8.88,7.52,7.01,8.76,10.39,7.38,1.69,-0.91,-0.59,0.06,-0.08,-0.32,-0.29,-0.31,-0.52,-0.62,-0.4,0.02,0.42,0.64,0.82,1.05,1.31,1.47,1.42,1.2,1.0,-2.33,-2.31,-2.25,-2.15,-2.22,-2.27,-2.26,-2.16,-1.98,-1.87,-1.87,-1.76,-1.48,-1.14,-0.58,-0.1,0.4,0.85,0.86,0.2,-0.88,-0.57,0.93,1.21,0.53,0.18,0.48,0.78,0.86,1.03,1.36,1.64,1.85,1.89,2.14,2.48,2.75,2.9,2.96,2.99,2.94,2.98,2.92,2.84,2.81,2.82,2.87,2.96,3.1,3.24,3.34,3.34,3.47,3.48,3.43,3.4,3.39,3.38,3.34,3.25,3.09,2.89,2.69,2.54,2.46,2.4,2.34,2.24,2.1,1.94,1.78,1.53,1.13,0.76,0.66,0.96,1.14,0.94,0.6,0.4,0.38,0.37,0.31,0.28,0.33,0.41,0.49,0.57,0.59,0.39,-0.04,-0.47,-0.74,-1.03,-1.51,-2.09,-2.49,-2.54,-2.15,-1.42,-0.76,-0.72,-1.61,-2.95,-3.84,-3.81,-3.04,-2.07,-1.58,-1.53,-1.56,-1.52,-1.48,-1.51,-1.54,-1.56,-1.61,-1.73,-1.94,-2.2,-2.43,-2.62,-2.78,-2.94,-3.15,-3.33,-3.42,-3.35,-3.18,-2.98,-2.79,-2.67,-2.6,-2.5,-2.32,-2.12,-1.96,-1.8,-1.7,-1.67,-1.71,-1.84,-2.07,-2.36,-2.62,-2.77,-2.74,-2.74,-2.7,-2.72,-2.72,-2.67,-2.57,-2.44,-2.32,-2.2,-2.03,-1.85,-1.71,-1.6,-1.55,-1.53,-1.54,-1.53,-1.53,-1.56,-1.58,-1.55,-1.44,-1.29,-1.13,-0.95,-0.76,-0.54,-0.3,-0.04,0.23,0.48,0.69,0.82,0.87,0.89,0.95,1.06,1.11,1.01,0.85,0.83,1.04,1.27,1.56,2.11,2.06,0.22,-2.3,-3.31,-3.12,-2.9,-3.13,-3.35,-3.58,-3.77,-3.84,-3.83,-3.91,-4.04,-4.19,-4.36,-4.58,-4.75,-4.94,-5.12,-5.29,-5.48,-5.66,-5.81,-5.89,-5.96,-6.08,-6.19,-6.25,-6.27,-6.29,-6.3,-6.34,-6.38,-6.4,-6.36,-6.27,-6.14,-5.98,-5.79,-5.56,-5.38,-5.44,-5.9,-5.71,-4.47,-3.9,-3.56,-3.18,-2.69,-2.16,-1.66,-1.17,-0.63,-0.1,0.39,1.1,1.78,2.01,2.11,2.3,2.58,2.86,3.13,3.4,3.5,3.25,2.91,3.19,3.9,4.2,4.26,4.32,4.42,4.72,4.99,5.0,4.51,3.13,1.64,1.19,2.02,2.37,1.08,1.36,2.43,0.77,0.22,1.56,0.47,-0.63,-0.37,-2.46,-6.33,-6.97,-6.25,-5.19,-4.85,-2.64,-2.01,-3.31,-3.42,-2.79,-2.07,-1.47,-1.39,-1.77,-2.62,-3.8,-4.65,-4.59,-3.62,-2.29,-1.38,-1.09,-0.88,-0.42,0.12,0.55,0.81,1.13,1.82,2.73,3.43,3.8,4.18,4.94,6.03,6.81,6.75,6.51,6.65,7.06,7.49,7.75,7.6,7.38,7.39,7.62,8.09,8.79,9.7,10.34,8.88,6.29,5.32,3.41,1.47,0.72,0.0,-0.24,0.06,-0.08,-0.62,-0.91,-0.75,-0.33,-0.02,-0.02,-0.13,-0.3,-0.5,-0.62,-0.69,-0.88,-1.35,-1.86,-2.22,-3.66,-3.8,-3.81,-3.77,-3.8,-3.98,-4.23,-4.4,-4.49,-4.39,-4.1,-3.8,-3.54,-2.99,-2.74,-2.23,-0.32,1.58,2.38,2.87,3.36,2.7,2.0,1.98,2.52,3.31,3.8,3.95,3.87,3.75,3.7,3.72,3.84,4.01,4.15,4.26,4.29,4.29,4.29,4.32,4.34,4.19,3.82,3.5,3.36,3.29,3.21,3.11,3.08,3.13,3.21,3.27,3.31,3.38,3.48,3.63,3.75,3.8,3.86,3.99,4.17,4.31,4.32,4.31,4.26,4.06,3.99,4.8,5.72,5.11,3.78,2.83,2.01,1.25,0.7,0.54,0.59,0.59,0.39,0.17,0.07,0.08,0.08,0.1,0.21,0.42,0.61,0.68,0.53,0.29,0.11,0.2,0.45,0.43,-0.31,-1.39,-1.99,-1.89,-1.85,-2.28,-2.68,-2.59,-2.37,-2.19,-1.84,-1.77,-1.58,-1.22,-0.96,-0.69,-0.35,-0.08,-0.05,-0.24,-0.4,-0.53,-0.79,-1.2,-1.5,-1.53,-1.4,-1.31,-1.23,-1.08,-0.86,-0.67,-0.58,-0.57,-0.54,-0.41,-0.3,-0.36,-0.57,-0.74,-0.74,-0.67,-0.74,-0.99,-1.26,-1.41,-1.47,-1.55,-1.69,-1.84,-1.94,-2.0,-2.01,-2.11,-2.37,-2.61,-2.73,-2.71,-2.6,-2.55,-2.47,-2.33,-2.14,-1.85,-1.59,-1.38,-1.28,-1.29,-1.32,-1.35,-1.38,-1.4,-1.37,-1.29,-1.21,-1.14,-1.05,-0.92,-0.75,-0.55,-0.33,-0.08,0.19,0.45,0.62,0.68,0.64,0.57,0.54,0.59,0.63,0.58,0.51,0.52,0.66,0.83,1.19,1.77,1.42,-0.76,-2.94,-3.17,-2.73,-2.9,-3.52,-3.82,-3.85,-4.14,-4.31,-4.21,-4.05,-4.09,-4.24,-4.42,-4.6,-4.81,-5.06,-5.43,-5.8,-6.06,-6.16,-6.27,-6.48,-6.85,-7.27,-7.34,-7.27,-7.4,-7.5,-7.53,-7.58,-7.65,-7.78,-7.91,-7.97,-7.88,-7.72,-7.53,-7.36,-7.09,-6.75,-6.57,-6.83,-6.59,-5.61,-5.36,-5.31,-5.14,-4.62,-3.22,-2.0,-1.32,-0.43,0.38,0.94,1.4,1.86,2.37,2.77,2.91,3.01,3.19,3.41,3.64,3.83,4.08,4.34,4.43,4.26,3.68,3.71,5.99,6.15,5.33,4.83,4.56,3.99,2.92,1.61,0.27,1.14,3.06,2.95,2.53,1.5,2.03,3.37,5.19,6.7,7.52,6.55,4.59,3.42,2.54,0.56,-1.75,-2.8,-2.35,0.07,1.68,0.1,-2.13,-2.47,-2.67,-3.79,-4.85,-5.87,-7.18,-8.16,-8.22,-7.87,-7.12,-6.54,-5.6,-4.63,-4.02,-3.06,-1.44,-0.08,0.89,1.73,2.45,3.18,3.9,4.51,4.89,5.0,4.96,4.97,5.19,5.56,5.46,5.02,5.3,6.25,6.89,6.4,5.18,3.9,4.92,10.85,14.69,7.31,-2.09,-4.46,-0.91,1.17,0.23,-0.58,-0.75,-0.92,-0.93,-0.73,-0.43,-0.47,-0.84,-1.31,-1.65,-1.8,-1.94,-2.25,-2.42,-2.51,-2.69,-3.01,-3.38,-5.84,-5.93,-6.03,-6.05,-6.14,-6.3,-6.16,-5.96,-5.83,-5.62,-5.38,-5.19,-5.16,-5.09,-4.88,-4.53,-4.16,-3.66,-3.09,-2.51,-1.94,-1.47,-1.07,-0.68,-0.31,0.01,0.31,0.69,1.27,1.71,1.87,1.72,1.36,1.06,1.11,1.62,2.4,3.15,3.63,3.85,3.95,4.0,3.97,3.89,3.82,3.77,3.7,3.57,3.49,3.48,3.47,3.37,3.26,3.2,3.18,3.21,3.26,3.33,3.42,3.58,4.23,5.38,6.16,7.23,7.64,6.75,4.82,3.59,2.35,1.27,1.33,1.87,1.94,1.58,1.21,0.95,0.74,0.5,0.12,-0.28,-0.44,-0.35,-0.25,-0.27,-0.44,-0.52,-0.42,-0.22,-0.05,0.06,0.06,-0.05,-0.03,-0.02,-0.08,0.01,0.07,0.03,-0.13,-0.55,-1.17,-1.67,-1.78,-1.72,-1.83,-2.11,-1.87,-1.32,-0.81,-0.9,-0.92,0.2,1.85,2.4,0.71,-1.22,-1.49,-1.02,-1.1,-1.46,-1.46,-1.21,-1.0,-0.88,-0.8,-0.77,-0.82,-0.88,-0.88,-0.81,-0.76,-0.83,-1.0,-1.16,-1.28,-1.46,-1.67,-1.97,-2.3,-2.46,-2.38,-2.34,-2.47,-2.7,-2.96,-3.12,-3.23,-3.36,-3.4,-3.32,-3.19,-2.97,-2.82,-2.62,-2.4,-2.13,-1.92,-1.75,-1.57,-1.31,-1.05,-0.87,-0.8,-0.85,-1.0,-1.18,-1.23,-1.11,-0.89,-0.68,-0.55,-0.48,-0.47,-0.45,-0.34,-0.14,0.08,0.25,0.32,0.28,0.13,0.01,0.04,0.17,0.23,0.16,0.14,0.26,0.39,0.51,0.95,1.13,-0.29,-2.29,-2.91,-2.6,-2.68,-3.08,-3.79,-4.09,-4.09,-4.09,-4.19,-4.3,-4.25,-4.08,-4.1,-4.22,-4.37,-4.72,-5.32,-5.56,-5.77,-6.03,-6.24,-6.52,-6.87,-7.27,-7.46,-7.47,-7.8,-8.1,-8.32,-8.52,-8.69,-9.11,-9.48,-9.65,-9.57,-9.4,-9.48,-9.51,-9.33,-9.0,-8.58,-8.21,-7.98,-7.11,-5.95,-5.94,-5.01,-4.55,-4.61,-5.2,-4.55,-2.53,-1.88,-1.46,-0.44,0.2,0.57,1.14,2.02,2.63,3.59,3.98,2.98,2.55,2.78,3.34,2.94,4.16,5.07,4.38,4.32,5.24,4.3,3.21,3.03,3.85,3.05,4.31,5.97,7.66,6.82,5.49,6.7,8.87,10.41,10.53,9.74,6.93,6.55,5.04,4.77,4.96,5.52,6.32,6.92,7.55,7.37,5.89,5.28,5.0,3.58,2.04,1.24,-0.04,-1.11,-1.52,-1.58,-1.88,-2.03,-1.87,-2.73,-3.6,-3.85,-3.87,-3.47,-3.13,-3.43,-3.89,-3.58,-2.66,-1.71,-0.6,0.55,1.91,3.78,5.45,5.69,4.71,4.06,3.83,3.69,3.58,3.4,3.14,3.72,5.59,6.84,6.57,5.28,4.15,7.98,14.02,13.93,10.01,4.04,1.64,1.75,-0.37,-0.86,-0.46,-0.58,-0.56,-0.53,-0.8,-1.23,-1.77,-2.4,-3.22,-4.39,-5.18,-5.61,-5.82,-5.85,-5.79,-5.79,-5.82,-8.45,-8.43,-8.25,-8.14,-7.96,-7.78,-7.95,-8.37,-8.54,-8.47,-8.42,-8.24,-8.14,-7.87,-7.38,-6.95,-6.71,-6.57,-6.46,-6.09,-5.65,-5.21,-4.75,-4.24,-3.73,-3.32,-3.18,-2.88,-2.42,-1.88,-1.26,-0.57,0.18,0.91,1.48,1.77,1.85,1.96,2.23,2.59,2.93,3.23,3.46,3.62,3.7,3.68,3.55,3.4,3.28,3.12,2.91,2.67,2.3,2.07,2.03,1.47,0.64,1.77,5.4,6.68,4.15,1.75,1.49,2.74,3.76,3.57,2.81,2.83,3.28,3.22,2.8,2.54,2.47,2.2,1.64,1.13,1.04,1.23,1.03,0.07,-0.87,-0.89,-0.49,-0.64,-1.14,-1.32,-1.3,-1.42,-1.45,-1.06,-0.83,-1.0,-0.99,-1.22,-1.5,-1.4,-0.97,-0.54,-0.37,-0.1,0.12,-0.32,-0.74,-0.65,-0.46,-0.33,-0.04,0.41,0.74,0.1,-1.47,-2.53,-2.45,-1.72,-1.37,-1.5,-1.47,-1.18,-0.91,-0.73,-0.58,-0.35,-0.2,-0.44,-0.94,-1.24,-1.27,-1.32,-1.54,-1.81,-2.03,-2.24,-2.53,-2.84,-2.97,-3.14,-3.34,-3.83,-4.42,-4.41,-4.25,-4.39,-4.63,-4.77,-4.62,-4.64,-4.64,-4.63,-4.44,-4.16,-3.78,-3.38,-2.9,-2.44,-2.03,-1.66,-1.36,-1.17,-1.03,-0.91,-0.81,-0.79,-0.77,-0.69,-0.59,-0.57,-0.68,-0.76,-0.67,-0.5,-0.37,-0.24,-0.1,-0.07,-0.12,-0.09,0.04,0.13,0.13,0.1,0.02,-0.06,-0.05,-0.01,-0.05,-0.11,-0.03,0.12,0.19,0.25,0.74,0.99,-0.51,-2.29,-2.54,-2.42,-2.76,-3.49,-3.91,-4.16,-4.22,-4.2,-4.2,-4.19,-4.21,-4.29,-4.46,-4.7,-4.89,-4.85,-5.03,-5.23,-5.29,-5.22,-5.21,-5.39,-6.07,-6.56,-6.86,-7.08,-7.47,-7.88,-8.04,-8.41,-8.75,-9.0,-9.23,-9.5,-9.62,-9.77,-9.83,-9.95,-10.08,-10.17,-10.19,-10.27,-10.69,-10.66,-9.47,-8.51,-8.17,-8.21,-7.74,-6.9,-5.61,-4.0,-4.2,-4.38,-3.1,-2.75,-2.14,-1.09,-0.88,0.18,0.84,1.2,2.28,3.15,3.58,3.79,3.48,2.87,3.38,3.58,3.45,3.5,4.62,4.3,2.83,3.43,4.35,3.88,2.62,2.94,2.97,3.77,2.11,-2.16,-2.49,-0.28,-0.33,-0.17,1.79,3.93,5.64,6.05,6.13,6.12,6.1,5.87,5.65,5.77,6.22,6.71,7.25,7.59,7.06,6.18,5.4,4.43,3.55,3.41,2.62,-1.16,-4.33,-4.64,-4.49,-4.68,-4.27,-3.57,-3.79,-4.09,-3.24,-2.66,-2.39,-1.53,0.02,1.29,2.41,3.24,3.49,3.75,3.94,3.82,3.82,3.87,3.41,3.25,4.19,5.02,5.47,5.79,5.67,4.27,2.74,3.54,6.74,7.19,3.8,2.95,1.0,-0.66,-0.59,-0.73,-0.86,-0.96,-1.6,-2.33,-3.01,-4.16,-5.53,-5.91,-6.19,-6.75,-7.35,-7.74,-7.84,-7.91,-8.11,-8.31,-7.78,-7.58,-7.37,-7.14,-6.99,-6.92,-6.91,-6.92,-6.79,-6.65,-6.64,-6.74,-6.95,-7.14,-7.29,-7.72,-8.11,-8.22,-7.74,-7.16,-7.22,-7.46,-7.48,-7.2,-6.78,-6.31,-5.77,-5.24,-4.75,-4.27,-3.77,-3.25,-2.68,-2.09,-1.52,-1.06,-0.64,-0.07,0.7,1.44,1.93,2.22,2.46,2.73,2.98,3.04,2.91,2.75,2.43,2.01,1.73,1.45,1.27,1.14,0.31,0.43,2.34,3.28,2.94,3.08,3.52,3.72,3.24,2.41,1.8,1.58,1.75,2.13,2.54,2.81,2.99,3.18,3.45,3.75,3.71,2.69,1.24,0.83,1.39,1.54,0.81,0.05,-0.32,-0.73,-1.04,-0.94,-0.78,-0.9,-1.23,-1.27,-0.96,-0.7,-1.17,-1.77,-1.33,-0.89,-0.39,-0.6,-0.65,-0.34,-0.02,0.2,0.05,-0.02,0.14,-0.09,-0.54,-0.72,-0.87,-1.04,-1.07,-0.91,-0.74,-0.76,-0.64,-0.54,-0.65,-0.68,-0.57,-0.44,-0.33,-0.23,-0.23,-0.62,-1.2,-1.54,-1.75,-2.12,-2.49,-2.69,-2.95,-3.44,-4.01,-4.46,-4.72,-5.04,-5.35,-5.54,-5.79,-6.07,-6.22,-6.3,-6.52,-6.54,-6.39,-6.16,-5.91,-5.59,-5.22,-4.86,-4.5,-4.11,-3.79,-3.51,-3.24,-2.97,-2.7,-2.45,-2.31,-2.23,-2.12,-1.92,-1.65,-1.41,-1.19,-0.93,-0.64,-0.37,-0.15,0.08,0.19,-0.06,0.0,0.17,0.11,0.05,0.11,0.1,-0.04,-0.18,-0.15,0.1,0.23,-0.13,-0.53,-0.47,-0.23,-0.05,0.08,0.39,0.73,-0.07,-1.68,-2.23,-2.34,-2.88,-3.32,-3.61,-3.93,-4.18,-4.46,-4.75,-4.91,-5.03,-5.07,-4.99,-4.57,-4.17,-3.9,-4.08,-4.38,-4.85,-5.22,-5.16,-5.02,-4.99,-5.2,-5.35,-5.58,-5.99,-6.28,-6.32,-6.63,-6.97,-7.43,-7.85,-8.29,-8.71,-9.05,-9.45,-9.54,-9.38,-9.28,-9.48,-9.46,-8.76,-8.57,-9.51,-9.14,-7.07,-4.91,-8.29,-9.73,-5.95,-6.2,-7.72,-7.92,-6.86,-5.75,-5.27,-4.92,-4.67,-4.24,-3.68,-3.22,-2.43,-1.4,-0.5,0.21,0.95,1.73,2.2,3.24,4.16,3.6,2.74,3.86,4.19,3.95,5.68,6.35,6.08,6.12,6.93,8.36,9.57,9.98,11.1,11.01,10.15,11.04,11.43,11.05,10.24,8.91,7.44,6.42,5.86,5.36,5.09,5.04,5.17,5.15,5.18,5.17,5.22,5.2,4.98,4.66,4.26,3.86,3.56,3.21,3.0,0.61,-4.74,-8.1,-7.72,-6.65,-5.89,-5.05,-5.59,-6.18,-6.0,-4.73,-3.0,-1.57,-0.69,-0.4,-0.06,0.61,1.52,2.32,2.87,3.47,4.3,4.52,4.48,5.08,5.26,5.42,5.95,6.95,5.56,3.45,3.92,2.04,3.14,3.12,3.51,2.42,-0.3,-1.2,-1.71,-1.97,-2.36,-3.05,-4.33,-5.72,-6.18,-6.67,-7.28,-7.61,-7.82,-7.88,-7.75,-7.71,-7.73,-7.78,-7.84,-6.62,-6.39,-6.33,-6.23,-6.2,-6.26,-6.33,-6.39,-6.46,-6.52,-6.42,-6.34,-6.6,-7.35,-8.1,-8.63,-9.03,-9.45,-9.67,-9.59,-9.4,-9.41,-9.49,-9.38,-9.1,-8.7,-8.18,-7.51,-6.73,-6.01,-5.43,-4.91,-4.39,-3.89,-3.45,-3.05,-2.71,-2.39,-1.96,-1.32,-0.58,-0.01,0.4,0.74,1.09,1.3,1.34,1.27,1.12,0.86,0.6,0.31,-0.32,-0.34,1.54,3.1,2.31,1.01,0.92,1.51,2.18,2.52,2.78,3.19,3.67,4.07,4.36,4.55,4.66,4.64,4.56,4.69,4.84,4.45,3.73,3.76,3.4,2.07,1.04,0.78,0.92,0.93,0.93,0.83,0.0,-0.56,0.03,-0.01,-0.57,-0.44,-0.1,0.06,0.3,0.55,0.52,0.4,0.1,-0.23,-0.3,-0.27,-0.44,-0.53,-0.26,-0.25,-0.74,-1.13,-1.03,-0.7,-0.47,-0.22,0.04,0.23,0.34,0.3,0.13,0.0,0.0,-0.2,-0.67,-1.13,-1.53,-1.81,-1.89,-1.65,-1.24,-0.84,-0.8,-1.18,-1.59,-1.99,-2.77,-3.54,-4.12,-4.63,-4.89,-5.04,-5.28,-5.58,-5.92,-6.21,-6.28,-6.16,-6.06,-5.8,-5.6,-5.65,-5.75,-5.6,-5.29,-5.02,-4.92,-5.02,-5.26,-5.34,-5.09,-4.72,-4.39,-4.1,-3.83,-3.64,-3.46,-3.2,-2.89,-2.53,-2.17,-1.8,-1.4,-1.02,-0.66,-0.41,-0.24,-0.12,-0.05,-0.05,-0.11,-0.15,-0.15,-0.21,-0.41,-0.54,-0.39,-0.05,0.1,-0.1,-0.33,-0.35,-0.27,-0.15,0.11,0.33,0.36,-0.81,-1.78,-1.63,-2.11,-2.67,-2.87,-3.03,-3.49,-3.96,-4.11,-4.28,-4.53,-4.83,-5.15,-5.28,-5.02,-4.55,-3.92,-3.55,-3.55,-3.82,-4.12,-4.4,-4.58,-4.71,-4.75,-4.53,-4.22,-4.22,-4.4,-4.65,-4.82,-4.87,-4.96,-4.9,-4.96,-5.25,-5.7,-6.18,-6.67,-7.06,-7.94,-9.68,-9.62,-8.82,-8.97,-8.76,-8.57,-9.21,-9.02,-9.51,-8.36,-6.44,-5.92,-7.96,-6.13,-7.26,-6.83,-5.63,-4.13,-4.25,-4.36,-3.16,-3.52,-3.59,-3.23,-3.2,-2.7,-2.14,-2.54,-1.31,-0.55,-0.09,-0.58,-0.37,1.55,0.73,1.86,1.83,1.65,2.13,3.7,3.88,1.75,1.25,2.05,1.88,2.24,2.92,2.18,1.72,2.24,1.57,-1.82,-1.04,1.6,2.54,3.26,3.68,3.74,3.8,3.95,4.05,4.03,3.89,3.78,3.76,3.76,3.59,3.08,2.99,2.52,2.09,3.34,-0.05,-6.73,-7.48,-7.63,-7.99,-7.21,-7.66,-7.29,-6.91,-6.25,-5.08,-4.3,-3.97,-3.6,-2.7,-2.29,-1.59,0.08,1.84,2.65,3.18,3.35,3.17,4.4,4.36,5.36,3.41,3.96,2.19,3.3,2.81,1.71,5.47,3.21,0.6,-0.54,-1.4,-1.27,-0.99,-1.87,-3.59,-5.13,-5.98,-7.23,-7.87,-8.1,-8.09,-8.33,-8.48,-8.43,-8.19,-7.91,-7.59,-7.29,-6.98,-4.33,-3.72,-2.99,-2.18,-1.27,-0.33,0.55,1.21,1.56,1.6,1.46,1.25,0.96,0.42,-0.62,-2.45,-4.53,-6.01,-6.8,-7.52,-8.26,-8.88,-9.59,-10.19,-10.25,-9.99,-9.64,-9.05,-8.14,-7.43,-7.0,-6.46,-5.9,-5.57,-5.25,-4.84,-4.33,-3.78,-3.38,-3.13,-2.74,-2.17,-1.85,-1.68,-1.17,-0.64,-0.39,-0.23,-0.08,-0.02,-0.1,-0.26,0.31,1.15,1.83,0.86,0.2,0.92,1.44,2.09,2.62,2.97,3.36,3.7,3.85,3.8,3.69,3.59,3.46,3.2,3.41,3.42,3.45,4.04,3.61,2.63,2.69,2.74,2.15,1.08,0.68,1.1,1.55,1.11,0.41,0.69,1.28,1.01,0.38,0.18,0.39,0.67,1.13,1.27,1.0,0.38,0.12,0.17,0.04,-0.19,-0.04,-0.2,-0.77,-0.88,-1.11,-1.6,-1.48,-1.53,-1.74,-1.93,-1.62,-1.12,-1.01,-1.02,-0.88,-0.81,-1.09,-1.22,-1.28,-1.23,-1.19,-1.14,-1.03,-0.99,-1.3,-1.44,-1.03,-0.93,0.56,1.76,1.64,0.74,0.1,-0.26,-1.02,-1.59,-1.71,-1.56,-1.47,-1.58,-1.59,-1.7,-2.05,-2.5,-2.95,-3.4,-4.29,-4.28,-4.26,-4.31,-4.28,-4.93,-5.83,-5.97,-5.55,-5.33,-5.21,-5.01,-4.75,-4.61,-4.45,-4.31,-4.08,-3.8,-3.44,-3.14,-2.87,-2.53,-2.14,-1.74,-1.34,-1.02,-0.83,-0.75,-0.75,-0.79,-0.74,-0.61,-0.55,-0.53,-0.35,-0.06,0.05,-0.04,-0.18,-0.21,-0.05,0.4,0.61,0.35,-0.23,-1.13,-1.23,-1.21,-1.58,-1.89,-1.92,-2.49,-3.63,-4.03,-3.63,-3.43,-3.74,-4.15,-4.25,-4.33,-4.45,-4.38,-4.37,-4.43,-4.44,-4.34,-4.15,-3.92,-3.56,-3.04,-2.76,-2.52,-2.23,-2.12,-2.16,-2.29,-2.43,-2.49,-2.46,-2.45,-2.57,-2.77,-2.94,-3.19,-3.28,-3.99,-5.11,-4.08,-4.2,-5.62,-6.91,-7.42,-6.99,-6.59,-5.45,-6.47,-7.57,-7.64,-6.62,-5.0,-3.6,-4.53,-4.75,-6.64,-7.09,-4.06,-3.5,-5.59,-5.17,-3.5,-3.89,-4.09,-4.04,-3.75,-3.81,-3.27,-2.45,-1.61,-1.31,-1.5,-0.62,-0.78,0.56,0.77,0.13,1.33,2.34,3.61,4.18,4.07,2.99,2.98,3.74,2.21,1.71,1.74,0.4,1.48,1.76,0.26,-2.71,-2.14,0.54,2.22,2.85,2.95,3.06,3.14,3.12,2.98,2.92,2.95,2.99,2.94,2.43,1.98,1.82,0.99,0.15,-0.93,-0.43,-3.07,-8.82,-9.32,-9.3,-9.21,-9.05,-8.36,-7.54,-6.88,-6.29,-5.91,-5.56,-5.18,-4.52,-3.64,-2.67,-1.0,0.55,2.13,3.74,4.52,4.96,6.09,7.11,2.92,0.34,0.76,0.64,2.16,3.18,2.87,1.88,0.4,-0.13,-0.56,-0.69,-2.1,-4.53,-6.05,-7.14,-8.17,-8.64,-8.76,-8.75,-8.15,-7.67,-7.42,-7.12,-6.66,-6.21,-5.76,-5.3,-4.85,-7.66,-7.35,-7.03,-6.54,-5.93,-5.18,-4.31,-3.27,-2.05,-0.68,0.6,1.55,1.92,1.82,1.93,2.98,4.37,4.11,1.55,-0.82,-1.82,-2.24,-3.41,-3.69,-3.61,-3.88,-3.06,-3.67,-4.16,-5.91,-6.92,-6.82,-6.3,-6.18,-6.08,-5.81,-5.5,-5.13,-4.7,-4.28,-4.01,-3.98,-3.96,-3.53,-2.69,-2.11,-1.86,-1.48,-0.99,-0.59,-0.44,-0.12,0.75,0.72,0.62,1.43,1.53,0.92,0.64,0.79,0.81,1.04,1.31,1.51,1.63,1.72,1.85,1.69,1.81,2.18,2.36,2.47,2.46,2.35,1.61,1.47,1.48,1.21,1.02,0.58,0.19,0.16,0.38,0.4,-0.08,-0.12,-0.63,-0.8,-0.57,-0.29,-0.27,-0.48,-0.4,-0.14,0.16,0.46,0.87,1.1,0.91,0.67,0.8,1.12,0.78,0.1,-1.34,-2.27,-1.86,-1.38,-2.12,-3.23,-3.24,-2.78,-2.0,-1.66,-1.72,-1.68,-1.64,-1.59,-1.83,-1.93,-1.86,-1.75,-1.46,-2.02,-2.24,-2.01,-2.18,-1.87,-1.64,-1.16,0.21,2.47,3.04,3.55,4.15,4.9,5.05,5.13,5.23,5.15,5.24,4.11,1.21,-0.01,-0.17,-0.37,-0.51,-0.6,-1.09,-2.6,-3.83,-4.31,-5.07,-5.59,-5.05,-4.65,-4.23,-4.1,-4.13,-4.08,-3.94,-3.92,-3.94,-3.94,-3.81,-3.61,-3.48,-3.26,-2.9,-2.56,-2.34,-2.15,-1.95,-1.79,-1.56,-1.26,-1.0,-0.57,-0.13,-0.44,-0.89,-0.54,0.09,0.33,0.39,0.38,0.72,1.3,1.53,0.74,-0.65,-1.07,-1.12,-0.84,-0.36,-0.09,0.06,-0.49,-1.69,-2.56,-3.4,-3.63,-3.45,-2.39,-2.33,-2.72,-2.76,-2.45,-2.01,-1.67,-1.71,-2.2,-2.38,-2.45,-2.67,-2.69,-2.43,-2.03,-1.72,-1.58,-1.57,-1.54,-1.37,-0.99,-0.57,-0.56,-1.07,-1.24,-0.96,-1.26,-2.71,-4.47,-5.09,-4.93,-5.47,-6.76,-8.57,-8.11,-6.87,-6.96,-6.17,-5.64,-6.82,-7.2,-7.2,-7.96,-6.99,-7.57,-8.66,-8.9,-7.13,-5.99,-6.33,-6.32,-6.11,-5.23,-4.55,-4.77,-4.8,-4.68,-4.5,-4.16,-3.36,-2.87,-1.49,-1.35,-0.68,-0.59,-0.38,0.43,0.76,1.1,1.44,2.01,3.45,3.95,4.43,5.17,5.09,4.83,4.56,3.16,2.82,2.25,2.46,2.13,1.08,1.2,0.11,-0.9,0.21,2.88,3.56,3.43,3.09,2.97,3.05,3.07,3.05,3.02,2.83,2.53,1.77,1.26,-0.56,-5.21,-7.75,-9.15,-10.01,-11.88,-10.65,-10.47,-11.77,-9.07,-7.93,-7.47,-6.55,-5.89,-5.6,-5.1,-4.9,-4.05,-3.25,-2.99,-3.0,-2.92,-2.11,-1.41,0.34,3.14,3.59,2.64,2.42,-0.28,1.96,0.01,0.15,1.58,2.24,2.45,0.63,0.09,-1.38,-4.4,-6.32,-7.4,-7.84,-7.63,-7.33,-7.78,-8.05,-8.3,-8.02,-8.46,-9.07,-8.9,-8.83,-8.52,-8.21,-7.92,-9.3,-8.96,-8.6,-8.13,-7.46,-6.6,-5.53,-4.37,-3.44,-2.88,-2.35,-1.41,-0.33,-0.04,0.05,0.12,-1.33,-1.79,-0.01,0.89,1.05,-1.39,-2.58,-0.69,-0.83,0.11,-0.75,-0.97,-1.74,-2.46,-3.19,-3.63,-4.98,-6.44,-6.87,-6.91,-6.91,-6.76,-6.59,-6.22,-5.71,-5.16,-4.7,-4.4,-4.03,-3.57,-3.07,-2.44,-1.7,-1.03,-0.54,-0.54,-0.67,0.04,1.2,0.87,-0.31,-0.75,-0.37,-0.46,-0.69,-0.55,-0.37,-0.24,-0.21,0.0,0.15,-0.59,-0.64,0.29,0.38,-0.44,-0.6,-1.14,-0.86,-0.54,-0.5,-0.66,-0.99,-0.78,-0.64,-0.53,-0.57,-0.35,-0.49,-1.02,-1.22,-1.74,-2.43,-2.44,-1.5,-2.53,-3.06,-2.52,-2.08,-1.41,-0.45,0.0,0.04,0.2,0.14,0.11,-0.57,-1.28,-0.99,-0.84,-0.68,-0.76,-1.92,-3.94,-4.19,-3.97,-3.26,-3.13,-3.37,-3.26,-3.29,-3.28,-3.43,-3.22,-3.28,-3.25,-2.97,-2.65,-2.6,-2.07,-1.66,-1.02,-0.64,-0.42,-2.0,-1.76,-1.09,-0.75,0.43,1.2,0.73,1.16,1.63,1.89,2.22,1.65,1.65,1.05,0.62,0.24,0.03,-0.31,-0.53,-0.75,-1.47,-2.78,-3.57,-3.09,-3.68,-4.08,-4.01,-3.72,-3.5,-3.32,-2.8,-2.54,-2.9,-2.96,-3.12,-3.57,-3.53,-3.45,-3.09,-2.14,-0.98,-0.86,-1.96,-2.54,-2.01,-1.49,-0.7,0.64,1.74,2.0,1.53,0.7,0.19,0.43,0.78,0.96,1.27,1.73,1.23,-0.52,-1.05,-1.16,-1.95,-2.39,-2.43,-2.63,-3.02,-3.45,-2.81,-2.54,-2.51,-2.7,-2.67,-2.5,-2.32,-2.2,-2.31,-2.42,-2.29,-2.92,-2.65,-1.84,-1.24,-1.61,-2.38,-2.95,-3.01,-2.96,-3.0,-2.42,-0.91,0.28,0.68,0.19,-0.68,-0.93,-0.7,-0.79,-0.66,-0.76,-1.11,-1.58,-1.54,-1.37,-2.87,-3.75,-4.42,-5.23,-5.8,-6.09,-5.76,-5.8,-5.55,-5.7,-5.96,-7.05,-7.34,-7.52,-7.88,-7.53,-7.92,-7.46,-7.11,-7.24,-7.42,-5.78,-5.12,-4.79,-4.55,-4.42,-4.35,-4.14,-3.89,-3.54,-4.05,-4.18,-2.48,-2.13,-1.71,-1.85,-1.26,-0.5,0.38,1.17,2.07,2.23,2.74,2.94,3.47,3.91,3.95,4.59,3.45,1.32,2.17,0.85,-0.02,1.32,-0.44,-1.05,0.1,0.51,1.23,2.91,3.01,3.27,3.48,3.64,3.76,3.84,3.97,3.96,3.63,3.37,4.42,1.11,-4.47,-2.94,-4.02,-2.99,-8.5,-8.9,-8.17,-8.18,-7.49,-7.32,-7.51,-7.06,-6.2,-5.65,-5.41,-4.99,-4.17,-3.9,-4.07,-4.04,-3.11,-2.34,0.1,3.14,5.0,4.83,4.22,2.44,2.35,2.16,3.61,7.74,7.22,2.76,1.08,-0.4,-3.9,-6.23,-7.44,-7.63,-7.64,-8.37,-9.51,-10.53,-11.19,-11.57,-11.81,-11.88,-11.72,-11.42,-10.94,-10.46,-10.05,-9.63,-10.88,-10.28,-9.64,-8.95,-8.29,-7.73,-7.22,-6.79,-6.3,-5.8,-5.22,-3.93,-1.95,-1.23,-2.08,-1.98,-0.92,-0.05,-0.35,-1.23,-1.25,-0.78,-0.65,-1.18,-2.49,-2.61,-2.46,-1.5,-1.57,-1.52,-1.93,-2.12,-2.06,-2.27,-2.95,-2.61,-3.92,-6.39,-6.96,-6.69,-6.66,-6.54,-6.26,-5.8,-5.13,-4.38,-3.85,-3.58,-2.89,-1.88,-1.9,-1.05,0.5,1.2,0.16,-1.07,-1.27,-1.21,-1.16,-1.09,-1.37,-0.86,-0.75,-0.72,-0.31,-0.36,-0.19,-0.11,-0.5,-0.47,-0.7,-1.21,-1.25,-2.12,-2.12,-1.83,-1.7,-1.24,-1.05,-0.76,-0.63,-0.74,-0.86,-0.63,-0.47,-0.63,-1.04,-1.61,-0.18,2.06,0.59,0.03,-1.17,-1.91,-1.15,-1.28,-1.76,-1.02,-1.4,-0.95,1.04,0.48,-0.4,0.34,1.18,1.68,1.35,-2.23,-3.57,-4.18,-4.35,-4.28,-4.4,-4.51,-3.95,-3.94,-4.02,-4.14,-3.97,-4.22,-4.12,-4.05,-3.76,-3.23,-2.4,-1.65,-1.18,-1.57,-0.38,1.04,-1.99,-2.29,-1.79,-1.03,-0.32,0.63,1.4,2.17,3.21,3.35,3.11,-0.73,-0.32,0.06,0.26,0.25,0.24,-0.76,-2.5,-2.07,-1.3,-1.84,-2.56,-3.18,-3.08,-3.06,-3.07,-3.07,-3.05,-3.46,-3.65,-2.86,-2.39,-1.37,-0.58,0.02,-0.02,-0.76,-1.55,-1.95,-2.48,-1.25,-0.87,-0.96,-0.79,-0.51,-0.83,-0.63,0.0,0.71,2.4,2.26,1.82,1.75,1.72,1.56,1.58,1.59,0.38,-0.88,-0.94,-1.16,-2.02,-3.42,-4.14,-3.12,-2.33,-1.46,-1.17,-1.69,-1.77,-1.91,-2.2,-1.9,-1.66,-1.9,-1.61,-2.06,-1.9,-1.12,-1.65,-1.39,-0.98,-0.72,-0.18,0.24,0.25,-0.38,-0.59,-0.54,-0.95,-0.27,-0.52,-0.18,-0.57,-0.87,-0.81,-1.2,-1.31,-0.92,-1.49,-2.09,-2.63,-2.46,-1.7,-1.22,-1.19,-1.65,-1.67,-0.99,-1.12,-1.62,-3.37,-4.86,-6.25,-6.26,-6.75,-7.61,-7.34,-7.16,-7.34,-6.85,-6.37,-5.79,-5.98,-5.41,-4.92,-4.35,-3.82,-3.27,-2.24,-1.34,-0.93,-1.29,-2.03,-2.47,-1.72,-0.36,-1.45,-2.27,-2.03,-0.78,-0.57,-0.4,0.45,0.87,2.6,4.72,3.35,4.07,4.25,3.31,4.54,5.35,4.41,3.37,1.43,0.77,1.25,0.1,0.15,0.26,0.92,0.93,2.14,2.95,3.59,4.16,4.45,4.58,4.67,4.76,4.29,3.37,2.9,4.16,-0.26,-4.97,-3.72,-5.43,-8.85,-8.51,-6.21,-7.01,-6.7,-5.36,-5.11,-5.22,-5.74,-5.47,-5.04,-4.92,-3.84,-4.21,-0.68,2.37,0.94,-4.36,-8.23,-0.35,-2.77,0.25,-1.39,0.16,3.48,2.89,0.02,-1.61,-0.37,-0.28,-1.45,-3.29,-5.68,-7.04,-7.35,-7.68,-7.91,-8.97,-10.42,-11.52,-12.65,-13.92,-14.86,-15.49,-15.34,-14.35,-13.3,-12.65,-12.15,-11.56,-10.97,-10.44,-10.26,-9.89,-9.35,-8.67,-8.0,-7.49,-7.21,-7.17,-7.33,-7.69,-7.94,-6.79,-4.83,-2.71,-2.26,-2.62,-1.61,0.8,0.28,-0.05,1.33,1.55,0.73,1.59,0.55,-1.19,-2.07,-1.24,-0.04,-0.45,-0.56,-1.17,-2.06,-2.07,-3.04,-3.09,-2.84,-3.67,-5.43,-6.12,-6.15,-5.49,-4.37,-3.95,-3.37,-3.7,-3.8,-3.06,-2.14,-1.36,-1.15,-1.05,-1.21,-1.1,-1.02,-0.71,-0.66,-1.49,-1.09,-0.49,-0.52,-0.74,-0.98,-0.86,0.25,2.01,0.75,0.02,0.06,-0.65,-1.17,-1.41,-1.77,-1.65,-1.45,-1.49,-1.22,-0.94,-0.83,-0.57,-0.65,-0.67,-0.78,-0.96,-0.08,1.01,-0.2,-0.61,0.44,-0.74,-2.24,-1.97,-2.23,-1.38,-1.71,-1.23,-2.0,-1.61,-2.51,-1.3,-0.66,-0.22,0.42,1.28,0.09,-2.87,-2.98,-3.6,-4.01,-4.48,-4.38,-4.75,-4.59,-4.5,-4.48,-4.44,-4.77,-4.82,-4.22,-3.84,-3.16,-2.2,-1.59,-2.27,-2.23,-1.73,-0.51,0.03,-0.09,0.28,-0.66,-0.71,-0.32,-0.47,-0.35,0.88,2.5,2.14,0.32,0.54,2.29,1.64,0.09,-0.68,-0.5,-0.51,0.09,-0.98,-1.05,-1.28,-1.87,-2.55,-2.8,-3.11,-2.79,-2.64,-2.55,-1.75,-2.43,-3.09,-2.45,-2.36,-1.41,-1.22,-0.81,-0.43,-0.05,-0.59,-1.33,-0.77,0.0,0.77,-0.28,-0.32,0.74,-0.59,-1.76,-1.53,-1.04,-0.66,0.77,1.9,2.19,1.56,1.65,1.23,0.49,0.11,-0.03,-0.36,-0.06,0.69,-0.74,-1.53,-1.17,-1.24,-1.5,-1.17,-0.79,-0.18,-0.57,-0.43,-0.54,-0.83,-0.6,-0.16,-0.17,-1.04,-0.87,-0.86,-0.69,-0.8,-0.21,-0.57,-1.02,-0.61,-1.1,-0.72,-0.26,-1.33,-1.38,-0.84,-0.18,-0.85,-1.01,-1.53,-1.72,-2.3,-1.87,-1.62,-1.92,-2.43,-2.47,-2.44,-2.22,-1.77,-1.9,-2.34,-2.17,-1.19,-1.1,-2.2,-2.04,-1.01,-1.2,-2.56,-3.57,-3.81,-3.84,-4.43,-4.12,-3.66,-3.41,-3.11,-3.31,-2.74,-1.73,-1.12,-0.61,-0.09,0.12,0.25,0.7,1.46,1.86,2.3,3.3,3.48,2.54,0.16,-2.65,-0.81,0.26,1.73,1.71,2.81,3.05,2.57,3.58,4.07,3.76,3.78,4.59,4.47,4.13,3.1,1.67,0.72,-2.6,-2.35,-2.55,-0.5,1.3,3.81,6.44,6.86,6.53,6.43,6.22,5.61,4.68,3.88,3.18,3.42,2.02,0.37,-0.52,-6.05,-7.22,-5.04,-7.63,-10.12,-7.23,-5.71,-5.48,-5.65,-5.68,-5.1,-4.67,-3.81,-3.25,-2.65,-0.49,1.06,1.06,3.94,2.53,-0.28,1.89,1.48,0.98,1.35,-0.08,-1.78,-3.2,-3.85,-3.25,-2.94,-3.79,-5.47,-7.12,-7.04,-6.89,-6.74,-6.59,-7.61,-9.02,-11.19,-13.51,-14.75,-15.55,-16.35,-16.6,-16.49,-15.93,-14.77,-13.43,-12.15,-10.56,-9.19,-8.18,-8.16,-8.59,-8.76,-8.75,-8.71,-8.4,-7.66,-6.87,-6.8,-5.86,-4.36,-3.64,-2.72,-3.09,-1.94,0.6,0.92,1.66,1.54,0.46,0.83,0.76,0.94,1.06,1.06,0.44,-0.48,-0.69,-0.53,-0.37,-0.83,-1.12,-1.39,-1.82,-2.0,-2.62,-2.59,-2.27,-2.64,-4.34,-4.43,-4.05,-3.88,-4.2,-3.74,-3.02,-3.37,-2.55,-2.48,-2.32,-2.55,-2.79,-2.44,-2.24,-2.02,-1.65,-1.35,-0.89,-0.98,-1.27,-0.67,-0.02,2.21,1.11,-1.42,-0.35,0.03,0.12,0.09,-0.66,-1.29,-1.02,-0.67,-0.49,-0.68,-0.54,-0.41,-0.09,-0.18,-0.41,-0.38,-0.23,0.1,0.54,0.51,0.22,-1.35,-1.48,0.17,-0.85,-1.64,-0.8,-2.27,-1.63,-1.07,-2.42,-2.76,-2.66,-1.75,-1.09,-0.47,-0.58,-1.02,-2.04,-1.93,-2.46,-2.8,-2.63,-3.2,-3.32,-3.64,-3.75,-3.5,-4.03,-3.59,-3.17,-3.83,-4.35,-4.07,-4.1,-2.42,-2.13,-2.29,-2.32,-2.39,-1.3,-0.65,-0.87,-0.13,-0.38,-1.19,-0.5,0.49,-0.19,0.86,0.12,3.33,3.02,-2.04,-1.75,-0.99,2.49,1.01,-1.26,-2.21,-2.2,-1.82,-1.21,-1.28,-1.29,-1.44,-2.32,-2.47,-2.48,-2.74,-2.28,-2.34,-2.93,-3.07,-2.66,-3.0,-2.17,-1.48,-1.09,-0.73,-0.54,0.14,-0.05,-0.42,0.44,1.33,1.51,1.14,1.35,0.56,-1.41,-1.68,-2.07,-1.96,-0.93,0.42,1.06,1.99,1.33,0.54,0.98,1.46,1.2,0.58,1.01,1.7,1.62,1.45,1.23,-0.21,-0.52,-0.67,-0.9,-1.2,-2.0,-1.61,-1.68,-0.87,-0.49,-0.78,-0.86,-1.32,-1.48,-1.16,-0.63,0.11,-0.16,-1.56,-1.85,-1.08,-0.81,-0.99,-0.46,-0.2,-0.96,-2.91,-0.98,-0.44,-1.28,-1.19,-1.64,-0.89,-1.63,-1.84,-2.18,-2.18,-2.54,-2.62,-2.45,-2.73,-2.01,-2.33,-2.58,-2.05,-2.09,-1.54,-1.24,-1.19,-0.39,-0.05,0.37,0.38,0.03,0.43,-1.07,-1.92,-1.83,-1.78,-1.46,-1.02,-0.84,-0.42,-0.03,0.31,0.8,0.87,0.36,1.23,3.28,2.05,1.91,3.34,3.96,4.32,2.96,-0.29,0.99,1.08,0.57,2.2,1.92,1.55,2.4,3.14,3.57,3.96,4.19,4.16,4.14,3.8,3.98,4.4,2.4,2.22,1.68,0.14,-0.27,0.32,-0.76,0.02,5.41,10.07,8.84,6.51,4.6,4.08,3.46,1.68,0.68,1.09,-0.31,-3.39,-4.53,-5.6,-7.21,-8.01,-6.36,-7.14,-5.88,-6.07,-6.93,-4.9,-4.32,-3.16,-4.91,-3.93,-3.06,-1.57,1.57,-1.12,-0.78,-2.28,-5.14,-4.95,-4.52,-6.89,-9.07,-8.99,-8.83,-7.27,-4.83,-3.16,-2.96,-4.09,-5.53,-5.93,-5.71,-5.35,-4.91,-4.27,-5.14,-7.59,-9.45,-11.21,-13.2,-14.19,-13.87,-13.33,-13.29,-13.65,-13.47,-12.27,-9.32,-7.08,-5.8,-4.61,-4.49,-7.33,-8.12,-9.29,-10.57,-9.7,-9.3,-8.24,-6.21,-4.35,-3.65,-2.75,-2.9,-1.49,-0.86,-0.43,0.52,0.71,0.46,0.27,-0.15,-0.41,-0.13,0.07,-0.13,-1.02,-1.25,-0.85,-0.94,-0.88,-1.31,-3.26,-3.61,-3.2,-3.13,-4.0,-4.57,-2.39,-0.94,-1.35,-1.5,-1.39,-1.29,-0.9,-0.97,-0.86,-0.79,-1.23,-1.65,-2.15,-2.93,-2.97,-2.61,-2.31,-1.84,-1.3,-1.15,-1.33,-0.7,2.37,1.21,0.18,-2.7,-2.0,-0.63,-0.03,0.31,-0.05,0.05,0.37,0.28,0.07,0.43,0.49,0.35,0.16,0.1,0.27,0.36,0.13,0.15,0.21,-0.11,-0.22,0.09,-0.22,-1.34,-0.66,0.15,0.8,-1.87,-2.15,-1.9,-1.96,-2.1,-1.85,-2.04,-1.46,-1.29,-1.1,-0.67,-1.41,-1.96,-1.71,-2.56,-3.78,-2.54,-2.18,-2.6,-1.46,0.58,0.02,-2.04,-2.24,-1.92,-2.49,-3.09,-3.4,-3.75,-2.91,-2.08,-2.71,-3.93,-2.79,-2.29,-1.64,-0.91,0.75,0.87,-0.46,-1.1,-0.81,0.45,-0.8,0.91,2.18,2.95,2.88,1.12,0.43,-1.21,-0.96,1.21,2.75,2.52,0.79,-0.9,-1.07,-1.85,-1.59,-1.72,-1.24,-0.9,-1.54,-2.69,-1.49,-0.81,-1.0,-1.1,-0.91,-1.05,-0.72,-1.05,-0.74,-0.5,-0.53,0.05,0.53,0.2,0.04,-0.13,1.21,0.68,0.17,-0.6,0.15,-0.68,-2.99,-2.47,-2.33,-1.77,-0.71,0.94,1.04,-1.11,0.92,1.76,0.87,0.96,0.82,0.83,1.42,1.31,0.48,-0.5,-1.06,-1.72,-1.16,-1.12,-1.64,-1.13,-0.63,-1.33,-0.51,-1.0,-1.47,0.5,0.27,-0.88,-0.49,1.12,1.27,-0.62,-0.63,-0.98,-1.38,-0.38,0.12,-1.03,-1.46,-1.51,-1.11,-1.06,-1.18,-1.49,-1.31,-1.18,-0.61,-0.5,-1.6,-2.78,-3.02,-2.64,-2.68,-2.61,-4.08,-4.15,-3.68,-2.95,-1.98,-1.86,-0.91,-1.25,-0.97,-0.57,-0.09,1.0,0.04,-1.12,-2.12,-1.98,-1.71,-1.56,-1.2,-0.9,-0.72,-0.46,-0.02,0.37,0.19,0.19,0.67,1.77,2.88,2.86,1.44,1.62,2.37,4.52,3.73,2.4,1.69,1.88,1.8,1.22,1.07,1.46,2.38,3.24,3.76,4.08,4.11,3.84,3.64,5.41,4.67,6.57,8.97,9.93,6.37,1.9,-1.28,-0.5,2.68,1.01,-0.22,2.05,2.46,2.34,2.39,1.57,0.51,1.74,-3.88,-1.61,1.34,-1.36,-3.02,-5.91,-5.08,-8.44,-9.52,-6.85,-8.82,-6.32,-1.63,-0.5,2.28,1.35,-2.13,-1.58,-3.82,-6.5,-6.65,-7.35,-8.65,-11.78,-11.89,-11.7,-11.87,-11.55,-10.39,-6.35,-3.54,-3.73,-1.62,-0.75,1.13,3.16,3.27,2.28,1.53,0.88,1.66,2.83,2.15,-0.64,-5.0,-7.98,-8.59,-8.63,-7.41,-6.64,-7.63,-9.31,-10.57,-5.12,-4.25,-2.01,-0.76,-0.85,-1.2,-4.52,-9.65,-10.84,-10.58,-11.23,-9.95,-6.87,-5.38,-4.69,-3.6,-2.38,-1.67,-1.41,-1.46,-1.61,-0.35,-0.06,-0.97,-1.05,0.06,0.12,0.43,0.38,-0.77,-1.2,-1.23,-1.24,-1.05,-0.7,-2.03,-2.8,-2.43,-3.38,-3.38,-2.2,-1.24,-0.71,-0.37,-0.01,0.28,0.29,0.42,0.35,0.21,0.0,-0.04,0.21,0.21,-0.01,0.15,-0.24,0.08,-0.2,0.52,1.67,-0.24,-0.96,-0.74,-0.34,-0.41,-2.17,-1.18,-0.78,-0.18,-0.12,-0.27,0.76,1.21,0.94,0.64,0.74,0.78,0.8,0.45,0.23,-0.03,-0.39,-1.09,-1.7,-1.98,-1.79,-1.56,-0.96,-1.05,-1.33,-0.43,-0.12,0.8,1.64,-0.39,-1.93,-1.06,-1.57,-0.83,-0.62,-0.18,-0.17,-0.34,-0.71,-0.59,0.49,0.9,1.39,1.0,1.42,1.8,1.54,1.6,1.46,2.0,1.3,0.51,0.27,-0.52,-0.48,-1.62,-4.23,-5.43,-4.93,-6.03,-5.43,-4.95,-4.05,-3.41,-1.8,-0.76,-1.23,-1.6,-1.29,-0.82,-1.09,0.2,1.1,1.38,1.9,1.36,1.79,1.26,2.34,1.64,2.59,0.83,1.64,1.19,0.73,-1.99,-1.95,-1.97,-1.59,-1.52,-1.87,-1.64,-1.39,-1.87,-2.53,-1.52,-0.87,-1.05,-0.78,-0.89,-0.77,-0.73,-0.31,0.22,-0.61,-0.17,0.49,0.8,2.11,2.8,2.47,1.94,0.35,-0.91,-0.49,-1.11,-3.02,-3.82,-3.7,-3.49,-2.74,0.76,2.94,-0.17,-0.51,0.08,0.45,-1.07,-1.03,0.44,0.65,-0.65,-0.38,1.09,0.12,-0.53,-0.03,-0.18,-0.26,-0.11,-0.22,-0.5,-1.98,-1.53,-0.39,0.03,0.1,0.79,-0.07,0.51,0.82,0.22,-0.26,0.24,-0.03,-0.36,-0.67,-1.22,-0.93,-0.6,-0.83,0.06,-0.1,0.41,-0.54,-0.26,0.19,1.34,-1.42,-2.63,-2.35,-2.32,-2.94,-2.43,-2.48,-2.21,-2.59,-2.72,-2.46,-2.31,-1.26,-1.43,-1.47,-1.12,-0.6,-1.04,-0.9,-1.87,-1.97,-1.59,-1.71,-1.88,-1.74,-1.8,-1.41,-1.04,-0.56,-1.0,-0.62,-0.73,0.06,1.15,1.94,2.2,2.18,2.77,1.78,1.87,2.17,1.52,2.7,3.08,3.31,3.42,3.18,2.86,2.41,3.56,4.61,4.08,2.99,3.72,5.18,4.91,5.37,5.75,7.56,7.37,6.98,8.98,5.1,2.99,-1.08,-0.75,0.62,-0.08,0.61,0.62,0.48,-0.58,-4.19,-6.0,-5.45,-5.57,-3.59,-4.19,-8.02,-9.25,-9.38,-7.56,-10.25,-9.57,-6.39,-0.2,0.98,-3.49,-6.98,-9.04,-8.54,-9.72,-12.01,-11.27,-10.66,-10.98,-11.57,-11.94,-11.32,-9.93,-9.36,-9.43,-8.34,-5.37,-3.45,-1.21,0.76,2.73,3.38,4.49,7.23,6.26,5.32,5.42,4.84,5.96,8.23,8.94,8.26,5.92,3.08,2.06,-0.37,-1.43,-2.48,-4.61,2.56,1.99,1.75,1.97,1.63,2.18,3.73,-5.06,-10.81,-10.27,-6.57,-6.08,-5.31,-5.03,-4.92,-4.44,-3.29,-2.48,-1.96,-1.28,-1.42,-3.06,-4.18,-2.49,-1.24,-0.79,-0.32,-0.25,-0.82,-0.86,-1.29,-2.36,-1.98,-1.21,-1.33,-1.62,-1.98,-2.63,-1.89,-1.49,-1.45,-1.16,-0.85,-0.41,0.15,0.51,0.88,1.5,1.36,1.37,1.98,1.72,1.49,1.22,1.35,1.51,1.02,0.97,1.63,2.53,3.69,-0.56,-3.77,-2.26,0.04,0.35,-0.3,-1.17,-0.76,-0.18,0.19,0.16,0.91,1.45,1.71,1.85,2.09,2.0,1.94,2.04,2.0,1.79,1.5,0.85,-0.09,-0.19,-1.1,-1.65,-0.91,-0.48,-1.29,-1.17,0.27,1.17,1.5,2.63,3.37,0.52,0.52,0.79,0.76,1.93,1.78,1.95,2.87,3.25,3.91,3.21,3.09,2.81,3.18,2.46,1.11,0.34,1.25,1.23,1.36,1.63,0.95,1.72,0.11,-1.11,-1.19,-2.0,-4.67,-7.48,-7.73,-8.5,-8.97,-8.18,-6.1,-4.94,-3.89,-2.3,-1.62,-1.14,-1.75,-0.99,0.73,1.6,1.86,0.34,0.42,0.87,2.62,-0.85,-0.36,2.19,2.41,1.01,1.13,0.7,-1.3,-0.77,-0.71,-1.03,-1.13,0.0,0.16,-1.03,-0.8,-0.94,-1.15,-1.18,-0.82,-0.64,-0.94,-0.77,-0.4,-0.32,-0.68,-0.03,0.77,0.79,-0.04,1.18,0.51,0.55,1.5,1.19,0.75,0.14,-0.77,-0.91,-1.38,-1.06,0.81,-1.45,-1.52,-0.84,-0.27,0.09,1.22,1.62,2.07,-0.58,-2.33,-3.61,-2.68,-1.5,-0.48,-0.26,0.55,1.01,-0.01,-0.24,-0.74,-1.02,-0.83,1.79,0.1,-0.66,0.09,1.33,0.37,0.88,1.08,1.79,0.95,0.91,0.76,0.65,0.65,-0.67,-1.95,-1.91,-1.19,-0.54,0.92,1.92,0.7,1.09,0.81,-2.87,-1.15,-0.86,-2.23,-1.92,-1.98,-2.41,-3.17,-2.99,-2.57,-3.03,-3.24,-2.97,-3.34,-3.21,-2.36,-1.9,-2.11,-1.94,-1.7,-1.67,-2.03,-1.63,-1.44,-0.93,-1.68,-0.92,-1.56,-1.82,-1.36,-0.44,-0.6,-0.82,-0.4,0.2,1.14,1.86,1.74,1.89,1.45,1.28,0.39,0.56,0.91,1.14,1.39,1.35,2.01,2.16,3.08,3.03,2.05,2.85,3.31,3.14,1.6,2.45,4.69,5.76,3.59,3.21,4.38,2.0,2.36,5.03,3.65,1.65,0.46,-0.27,0.14,0.9,1.61,2.49,0.32,-0.82,-2.47,-3.92,-3.93,-6.33,-12.28,-10.18,-8.31,-11.65,-12.02,-9.29,-6.18,0.45,-3.34,-8.55,-11.96,-12.71,-13.04,-12.65,-12.03,-11.23,-9.99,-8.61,-7.21,-5.88,-5.24,-5.06,-4.39,-4.18,-4.45,-3.89,-0.81,1.3,-1.62,2.83,1.49,-2.73,2.93,5.68,8.45,9.28,9.87,10.84,9.63,6.45,4.3,3.9,4.2,3.2,3.92,4.51,4.26,3.1,6.03,4.12,2.73,1.66,1.87,3.11,5.13,5.53,0.52,-2.06,-2.36,-3.63,-3.21,-3.55,-4.01,-3.71,-2.9,-2.14,-1.82,-2.09,-2.2,-0.94,-1.54,-2.41,-1.0,-0.06,-0.09,-0.72,-0.79,-1.45,-1.74,-2.7,-2.53,-1.92,-1.77,-1.75,-1.97,-1.79,-1.51,-0.97,-0.64,-0.2,-0.2,0.12,0.69,1.22,1.5,1.94,2.06,2.08,2.14,2.11,2.24,2.53,2.63,2.78,3.1,3.01,3.45,5.13,4.43,3.83,3.23,1.71,1.05,0.99,1.32,2.16,2.12,1.11,0.44,0.43,1.09,1.67,2.65,3.2,3.67,4.17,4.43,4.59,4.65,5.24,5.17,5.28,5.46,4.78,3.88,3.38,1.92,0.5,0.84,2.14,2.48,2.44,2.28,2.74,3.63,4.77,4.39,2.69,2.73,3.26,3.4,2.91,3.61,4.0,4.39,4.5,3.98,3.51,2.97,3.2,2.73,2.14,2.12,1.78,2.04,2.45,2.33,2.45,2.88,2.08,-0.78,-1.49,-0.97,-1.69,-3.17,-4.72,-5.06,-5.26,-5.66,-5.54,-4.96,-4.74,-4.39,-3.58,-2.77,-2.18,-1.29,-0.05,1.79,0.93,-0.48,0.21,0.84,2.55,-0.29,0.48,1.79,2.42,-0.04,0.73,0.76,-0.04,-0.13,0.65,-1.26,-0.12,-1.36,-0.71,-0.65,-0.58,-0.6,0.03,0.18,-0.21,-1.24,-0.91,-0.22,-0.59,0.29,0.17,-0.32,0.36,0.51,0.79,0.33,-0.26,0.02,1.03,1.63,0.75,0.12,0.33,0.52,0.19,-0.87,-2.02,-1.56,-1.02,-1.11,-0.99,0.43,1.37,-0.36,-1.97,-1.2,-2.38,-3.18,-2.18,-1.41,-1.09,-0.78,-0.17,1.18,-0.96,-2.04,-1.67,-2.23,0.52,1.0,-0.64,-1.29,-2.18,-1.72,0.48,1.88,2.39,3.06,1.37,0.52,0.65,1.05,0.79,-1.02,0.62,0.72,0.5,1.23,0.92,1.95,2.48,1.98,2.11,-0.43,-1.08,-0.81,-1.77,-3.36,-3.61,-3.39,-3.28,-3.18,-2.58,-2.76,-4.4,-4.08,-4.34,-4.68,-2.43,-2.85,-3.19,-2.85,-2.18,-1.98,-1.46,-1.42,-0.97,-2.04,-2.76,-2.17,-1.7,-2.18,-2.45,-1.81,-1.2,-0.21,0.32,-0.18,0.36,0.14,-0.08,0.05,-0.47,-0.17,0.08,0.62,-0.84,-0.61,0.19,0.6,1.45,1.86,2.68,3.0,2.0,2.12,3.58,4.35,3.09,2.39,-0.7,1.35,6.89,3.27,1.55,0.34,2.13,2.6,1.3,-0.87,-0.28,0.68,1.57,2.04,2.14,3.11,3.76,0.4,-4.1,-6.02,-6.52,-10.45,-15.59,-11.05,-13.56,-9.63,-0.67,0.1,-2.7,-9.32,-12.25,-12.51,-12.78,-12.59,-12.18,-11.42,-10.6,-9.67,-8.56,-7.26,-5.96,-4.67,-3.39,-1.92,-0.31,0.7,1.69,2.97,2.94,5.23,6.08,7.03,8.43,7.39,7.08,7.71,8.55,9.53,10.47,11.31,12.33,13.54,14.28,14.3,13.74,12.86,11.77,9.9,7.77,1.76,0.12,0.03,0.53,1.61,0.15,-1.12,-1.79,-2.54,-2.57,-1.46,-3.0,-4.58,-3.36,-3.62,-3.05,-2.98,-2.05,-3.6,-3.48,-1.79,-0.44,-0.11,0.44,0.09,0.33,1.02,-0.67,-0.46,-0.44,-1.55,-1.71,-2.19,-2.34,-1.96,-2.52,-1.52,-1.63,-1.47,-0.76,-0.37,0.04,0.12,0.76,0.85,0.9,1.27,1.85,2.18,2.31,2.56,2.63,2.84,3.05,3.36,3.6,3.78,3.84,4.15,5.01,5.74,4.42,4.74,5.06,4.66,4.4,3.86,3.94,3.97,3.8,3.92,4.42,3.7,3.61,3.65,4.11,4.62,4.72,4.89,5.14,5.76,5.33,6.09,5.49,6.1,5.72,5.79,5.48,5.18,3.63,2.99,2.32,2.54,3.67,3.83,3.76,4.23,3.93,4.02,4.43,5.12,4.09,3.04,3.63,4.41,4.19,4.26,3.94,2.76,2.75,2.87,3.19,2.46,0.42,0.2,1.85,1.9,2.31,2.7,2.82,2.72,2.53,1.66,0.88,-0.37,-1.01,-1.34,-1.25,-0.94,-1.5,-2.81,-3.04,-3.09,-2.87,-2.35,-1.72,-1.37,-2.26,-1.86,-0.73,0.09,1.08,1.23,1.45,0.61,1.97,1.53,0.55,0.42,1.21,1.68,0.79,0.83,1.04,-0.49,-0.59,-1.61,-1.12,-0.06,0.03,-0.9,-1.21,-1.01,-0.98,-0.84,-0.72,-0.91,-0.72,-0.48,0.34,0.53,-0.11,-1.61,0.19,0.22,1.01,1.34,1.42,1.76,0.26,-0.76,-0.05,0.01,0.27,0.07,-0.07,-1.36,-1.38,-0.81,-0.15,-0.23,-0.47,0.04,-0.44,-0.69,0.38,-2.94,-3.35,-3.86,-3.32,-1.12,-0.78,-0.16,0.11,-0.66,-1.35,-2.3,-1.09,-0.63,1.83,1.35,0.38,1.33,-0.26,-0.66,-2.35,-0.51,-0.36,1.71,2.09,1.35,-0.04,0.44,2.01,0.82,-0.01,1.92,2.85,2.73,3.21,2.28,2.33,2.66,2.46,1.14,2.26,1.85,1.05,0.6,-0.91,-0.35,-1.02,-0.87,-1.84,-2.88,-3.74,-5.42,-4.51,-3.56,-3.07,-3.22,-3.34,-3.13,-2.81,-2.03,-1.59,-1.69,-1.61,-1.78,-2.07,-2.63,-2.23,-2.59,-2.81,-2.42,-2.06,-1.62,-1.64,-1.72,-1.66,-1.43,-1.2,-1.09,-0.88,-0.58,-0.48,-0.77,-0.98,-0.57,-0.17,0.39,1.08,1.7,1.95,1.19,2.42,3.04,4.5,4.25,5.78,5.96,6.93,6.92,1.02,0.03,2.94,1.35,1.64,0.19,-0.89,0.06,0.6,0.75,0.5,0.34,1.16,2.32,1.9,3.18,-1.21,-4.07,-0.64,-9.59,-16.73,-15.99,-16.73,-14.26,-5.49,0.15,-5.64,-13.77,-14.92,-15.73,-15.73,-15.79,-15.62,-14.85,-13.73,-12.42,-11.04,-9.78,-8.62,-7.43,-6.06,-4.38,-2.14,0.43,2.64,4.14,5.25,6.48,7.75,8.75,8.83,7.66,7.09,6.76,6.87,5.8,4.68,5.62,6.62,7.08,7.52,8.19,8.55,8.38,7.27,5.26,4.17,0.29,-1.44,-0.95,-1.36,-1.41,-1.47,-1.83,-2.01,-2.37,-0.95,-1.41,-2.36,-3.16,-3.66,-3.59,-2.86,-2.44,-1.53,-3.78,-3.28,-2.96,-1.84,-0.6,0.3,1.17,0.71,1.34,1.51,-0.27,-0.56,-1.36,-3.81,-3.15,-1.48,-1.08,-0.82,-1.47,-1.58,-1.32,-0.93,-0.71,-0.41,-0.3,0.1,0.43,0.54,0.47,0.85,1.34,1.9,2.2,2.53,2.87,3.23,3.23,4.38,4.85,3.84,3.81,4.18,4.92,4.24,4.45,5.04,5.81,5.57,5.08,4.92,4.78,4.71,4.86,5.32,5.53,5.96,5.66,5.74,5.72,5.8,5.56,5.93,5.62,5.83,6.09,5.88,5.42,6.2,6.3,6.51,5.81,4.86,3.66,4.46,4.07,3.64,3.94,4.2,4.43,4.23,4.5,4.32,4.27,4.14,4.02,3.81,3.86,3.9,3.6,2.03,1.52,2.43,2.99,3.6,3.46,2.43,0.11,0.06,1.84,2.92,2.46,2.12,2.45,2.44,2.07,2.37,1.78,0.36,0.68,-0.53,-0.7,-0.42,-1.34,-1.75,-1.81,-2.69,-2.75,-2.47,-2.6,-2.06,-1.08,-0.88,0.11,0.88,1.27,0.64,1.56,1.02,0.83,1.24,0.86,0.68,1.49,0.84,1.44,0.02,-0.15,-0.92,-1.6,-1.35,-1.33,-1.09,0.51,-1.94,-3.8,-1.66,0.18,-0.85,-0.58,-0.37,-0.4,0.34,0.29,0.29,-0.36,1.2,0.65,-0.84,-0.48,-0.14,-0.78,-0.99,-0.18,0.05,0.28,0.65,0.62,0.35,-0.17,-0.18,0.18,0.17,0.15,0.36,1.04,0.99,0.18,-0.59,-0.58,-0.44,-0.65,-2.86,-4.36,-2.52,-1.4,-0.75,-1.54,-2.99,-2.59,-2.78,-0.89,-4.6,-3.72,-1.5,-1.78,-0.07,0.18,-1.16,1.26,-1.41,-1.79,-1.53,2.49,2.34,0.41,1.8,1.97,0.53,1.24,2.7,4.49,5.65,6.49,5.1,5.92,9.06,7.8,6.08,5.54,0.63,3.67,4.38,3.89,2.61,4.4,3.82,0.94,-2.24,-2.61,-2.12,-2.56,-3.01,-3.07,-3.3,-3.28,-3.24,-2.4,-1.6,-1.71,-1.74,-1.62,-2.0,-2.36,-2.72,-2.65,-2.3,-2.11,-1.91,-3.0,-3.13,-2.7,-2.38,-1.98,-1.59,-1.33,-0.88,-0.6,-0.65,-0.34,0.07,0.53,0.9,1.39,1.52,1.27,0.73,-0.63,0.94,1.61,1.77,1.51,3.8,7.54,7.41,6.49,3.28,-0.05,0.59,1.06,2.17,1.84,1.26,0.98,0.31,-0.06,1.43,2.42,1.76,1.66,1.12,1.29,-0.1,-0.81,0.69,0.3,-13.28,-3.63,-15.79,-14.6,-5.37,-7.41,-15.51,-13.82,-10.81,-8.24,-7.05,-7.52,-9.45,-12.79,-16.16,-17.87,-17.05,-15.18,-14.09,-11.97,-10.25,-8.55,-6.32,-3.75,-0.7,2.0,3.98,5.26,6.39,6.95,6.73,6.46,6.64,6.47,6.78,7.68,7.08,6.11,5.38,5.27,5.04,4.74,4.79,4.85,4.44,3.66,1.63,-0.19,-2.02,-2.32,-2.88,-4.52,-3.72,-2.17,-2.51,-2.49,-0.91,-0.78,-1.79,-3.61,-3.9,-4.3,-3.11,-2.76,-2.47,-1.93,-2.09,-2.4,-3.0,-2.07,-0.89,0.22,0.7,1.36,2.46,4.16,2.9,0.81,0.02,-1.26,-1.67,-1.73,-1.5,-0.39,-0.4,-0.62,-0.63,-0.54,-0.49,-0.51,-0.38,-0.46,-0.6,-0.34,0.0,0.53,1.06,1.68,2.13,2.58,3.05,3.25,4.03,4.88,3.62,3.32,5.49,4.17,3.52,3.88,4.38,4.57,5.24,5.85,6.09,6.0,5.94,5.51,5.7,5.88,6.16,6.35,6.54,6.75,6.75,6.71,6.53,6.94,6.86,6.94,7.25,7.36,7.19,7.32,6.91,6.2,5.46,4.3,3.67,3.89,4.5,4.2,3.91,3.58,3.67,3.98,4.35,4.34,4.25,4.52,4.52,4.38,4.03,3.52,3.08,1.38,1.85,2.36,2.63,2.4,2.24,3.32,1.88,2.3,1.49,1.87,1.89,1.46,2.26,2.41,1.25,0.2,0.26,0.85,0.53,0.91,0.78,-0.68,-1.46,-1.81,-1.8,-2.32,-2.52,-2.12,-2.32,-1.62,-0.38,0.32,1.17,1.52,0.6,1.76,0.82,-0.32,0.6,0.58,1.34,1.23,0.24,-0.97,-0.95,-1.42,-2.32,-2.13,-3.54,-3.96,-3.79,-5.71,-4.14,-2.12,-1.39,0.47,1.55,3.32,1.34,1.13,0.57,1.0,0.16,0.42,1.37,2.74,2.76,2.07,1.66,0.7,-0.96,0.07,0.98,1.08,1.35,1.22,1.34,0.54,0.78,0.43,0.46,0.32,0.47,0.82,0.43,0.05,1.9,2.37,1.25,-0.19,-1.23,-1.93,-3.07,-5.92,-6.94,-6.37,-2.26,-1.9,-2.43,-3.21,-2.1,-5.81,-3.7,-5.24,-8.71,-10.3,-10.85,-9.57,-8.93,-5.72,-2.61,-1.48,0.92,0.9,-0.41,0.56,2.48,2.23,2.32,2.3,4.58,7.97,5.69,6.11,6.09,5.82,5.99,3.75,3.73,2.9,3.26,2.85,3.7,4.08,4.64,3.13,0.42,-0.64,-1.21,-2.01,-2.57,-2.95,-2.23,-2.58,-2.74,-3.17,-1.84,-1.02,-0.48,-1.97,-2.29,-2.97,-2.63,-2.25,-2.36,-2.21,-1.9,-3.16,-3.0,-2.94,-2.46,-1.89,-1.13,-0.45,-0.64,-1.21,-1.52,-1.32,-0.27,0.91,1.6,1.87,2.2,2.6,2.55,2.51,1.78,1.84,1.97,2.77,3.48,3.03,3.29,3.14,3.16,2.59,1.53,3.6,4.06,4.32,2.75,1.81,0.1,0.24,2.01,2.17,0.14,-2.13,-2.76,-2.33,-0.31,-0.96,-2.89,-4.63,-11.9,-17.36,-12.87,-8.72,1.42,8.54,7.83,5.97,7.25,8.53,9.17,9.43,9.37,9.06,9.21,10.26,11.43,7.23,-8.98,-14.51,-12.3,-11.32,-9.5,-7.02,-4.23,-0.89,2.52,5.21,6.73,7.11,7.07,6.81,6.42,6.66,6.65,6.91,7.69,8.01,7.41,5.89,5.35,4.86,4.33,4.27,4.51,3.3,1.31,-1.72,-2.54,-3.47,-7.03,-8.16,-7.17,-6.15,-4.57,-2.1,-2.82,-5.04,-3.94,-2.6,-6.46,-6.56,-3.54,-3.57,-2.97,-3.66,-3.32,-3.0,-3.2,-2.76,-2.16,-0.77,0.51,1.17,1.52,1.76,2.42,1.95,1.12,0.51,-1.26,-2.48,-2.23,-2.24,-2.3,-1.67,-1.41,-1.53,-1.49,-1.69,-1.73,-1.35,-1.8,-1.54,-1.46,-1.51,-1.34,-0.79,-0.27,0.62,1.63,1.99,2.41,2.71,2.89,3.3,4.93,4.13,3.71,3.7,4.11,4.42,4.64,5.04,5.42,5.61,5.41,5.89,5.97,5.92,6.0,6.0,6.12,6.4,6.22,6.27,6.2,6.23,5.86,6.23,6.7,6.71,6.72,6.53,6.38,6.08,5.0,4.85,3.89,3.68,4.35,4.37,3.6,3.58,3.52,3.59,3.29,3.64,2.99,3.14,3.16,3.7,4.37,4.76,3.75,3.2,2.45,2.23,2.96,2.49,1.18,2.04,2.41,0.99,-0.27,-0.7,0.4,1.86,2.55,1.79,-0.56,0.69,1.49,1.35,0.79,0.07,0.21,-0.78,-0.7,-1.47,-2.23,-2.1,-1.92,-2.29,-1.66,-0.71,-0.03,0.76,0.97,1.79,3.68,5.2,6.06,5.17,4.61,3.81,2.52,1.24,1.75,-0.49,-0.8,-1.62,-4.24,-4.58,-4.56,-4.94,-4.6,-1.09,-2.15,-1.34,-0.17,0.19,0.18,2.24,2.97,2.67,2.52,2.54,2.17,1.15,0.13,0.26,1.09,2.01,3.0,2.76,2.67,1.59,1.79,2.39,2.28,1.87,1.78,1.49,2.21,1.28,1.13,1.24,1.33,2.1,1.67,-1.36,-1.95,-1.86,-0.43,-1.26,-3.38,-1.98,-2.16,-2.93,-5.57,-5.86,-4.49,-5.87,-13.9,-15.67,-15.41,-13.96,-13.2,-12.19,-10.62,-9.83,-9.88,-9.31,-8.97,-8.7,-7.97,-7.35,-6.56,-1.97,-2.52,-1.23,-1.76,1.48,0.26,1.46,1.96,2.64,2.76,1.94,1.25,4.28,5.08,5.23,3.49,2.3,2.7,2.09,2.68,1.46,1.48,1.77,1.26,1.4,0.19,0.06,0.24,-0.17,-1.08,-1.07,-1.38,-1.85,-2.44,-1.6,-0.74,-1.16,-1.47,-2.07,-2.79,-2.74,-2.89,-2.74,-2.27,-2.87,-2.96,-2.81,-2.2,-1.15,-0.09,-0.16,-0.58,-1.67,-1.52,-0.62,-0.72,-1.19,0.51,1.48,2.17,2.39,2.36,2.6,2.83,3.46,3.11,3.1,3.05,2.82,3.59,3.62,3.74,2.84,1.81,1.78,3.7,4.55,3.69,3.28,2.43,0.44,-1.57,-5.11,-9.02,-11.13,-11.29,-10.79,-8.69,-4.73,-2.27,0.08,1.32,2.08,3.87,3.48,4.05,4.64,5.07,6.21,7.56,8.54,9.12,9.53,9.86,10.02,10.23,10.57,11.19,11.2,11.32,11.09,-4.43,-9.77,-9.2,-8.34,-5.99,-3.46,-0.4,2.35,4.67,6.56,8.16,8.89,8.46,7.54,7.08,7.25,7.0,6.89,7.17,7.23,6.03,5.49,5.72,5.51,4.48,2.21,0.45,0.43,-0.84,-1.01,-5.12,-6.68,-6.08,-6.31,-7.18,-6.97,-6.2,-3.86,-3.11,-3.25,-4.93,-4.53,-4.05,-3.16,-4.96,-5.3,-3.75,-3.22,-2.96,-2.22,-4.02,-2.7,-1.01,-0.39,0.14,1.33,1.47,1.71,1.58,1.55,-0.54,-1.38,-2.18,-2.23,-2.77,-2.33,-2.75,-3.01,-2.73,-2.9,-2.44,-2.52,-3.2,-2.77,-2.64,-2.5,-3.44,-3.53,-2.99,-3.11,-2.53,-1.68,-0.58,0.68,1.94,2.92,4.06,4.76,4.79,4.64,4.47,4.57,4.73,4.8,4.93,5.19,5.51,5.78,5.74,6.0,5.92,5.69,5.88,5.63,5.62,5.68,5.69,5.62,5.55,5.52,5.29,5.47,5.55,5.5,5.31,4.88,4.52,4.2,4.06,3.95,3.97,4.01,4.16,4.64,3.76,3.81,4.25,4.74,4.94,5.09,5.36,5.17,4.85,4.91,4.96,3.4,2.65,3.94,2.55,2.42,1.89,3.03,2.4,2.05,2.15,-0.98,0.61,1.43,1.83,-0.22,0.05,-1.23,-0.61,1.24,0.82,-0.03,-0.19,0.71,1.61,0.59,-0.47,-1.69,-2.18,-1.79,-1.21,-0.51,0.41,0.53,0.39,2.27,1.68,1.79,2.01,1.94,1.72,1.42,0.86,0.06,-0.84,-2.45,-3.64,-4.2,-4.99,-6.44,-5.9,-3.01,-1.05,-2.06,-1.7,-1.29,-1.67,-0.71,0.17,0.95,1.78,2.73,3.26,3.41,3.58,3.55,3.09,2.34,1.89,2.26,1.65,1.72,2.63,3.2,2.75,2.87,3.64,3.24,2.49,2.32,3.26,3.37,2.28,1.95,1.13,1.1,0.9,-1.93,-3.92,-3.29,-3.88,-4.77,-5.19,-5.63,-5.91,-5.0,-2.51,-2.78,-6.85,-9.65,-6.76,-10.47,-13.18,-14.25,-14.45,-14.16,-13.5,-12.74,-12.0,-11.3,-10.59,-9.71,-8.66,-7.79,-6.41,-6.1,-6.18,-1.38,-3.81,-2.81,-0.67,1.77,0.57,1.12,1.17,0.68,1.51,0.74,1.72,2.09,-0.21,0.19,0.91,0.98,1.8,2.19,1.9,2.59,0.51,1.33,1.03,1.7,0.08,-0.02,-0.03,-0.14,-0.82,-1.41,-2.12,-1.11,-0.58,-0.83,-1.84,-1.42,-2.1,-2.9,-2.68,-2.37,-2.13,-2.38,-2.19,-2.45,-1.56,-0.2,0.31,0.93,0.81,-0.18,-0.98,-1.39,-0.87,-0.21,0.05,-0.01,0.4,0.62,0.72,1.1,2.28,2.82,3.32,2.66,3.13,2.78,2.91,2.89,2.64,2.46,2.32,2.41,1.08,3.5,4.36,4.38,3.68,2.76,-1.55,-4.18,-6.02,-6.1,-6.14,-5.15,-4.68,-4.29,-2.79,-1.27,-0.52,-0.01,0.68,1.59,2.44,3.09,4.0,4.64,5.41,6.35,7.13,7.84,8.51,9.2,9.64,9.75,10.06,10.39,10.81,11.2,11.54,3.47,-4.98,-6.09,-5.49,-4.12,-2.14,0.54,2.97,4.6,5.94,7.19,8.55,9.54,9.71,8.96,8.68,8.44,7.05,6.64,4.4,4.4,2.61,3.39,6.6,5.29,2.29,4.53,2.27,3.1,2.23,-2.79,-1.3,-2.55,-1.87,-3.43,-4.14,-1.66,-2.13,-5.49,-3.65,-4.28,-4.23,-3.21,-5.41,-5.64,-4.57,-3.93,-2.38,-1.7,-2.05,-2.41,-2.36,-3.08,-2.28,-0.71,0.53,1.0,0.63,1.3,-0.18,0.66,-0.79,-2.33,-3.26,-3.85,-3.74,-3.44,-3.9,-4.24,-4.16,-4.89,-3.64,-3.1,-2.98,-3.14,-3.2,-3.11,-3.43,-3.27,-2.79,-2.54,-1.85,-1.18,-0.21,1.53,2.61,3.63,4.19,4.44,4.6,4.75,5.01,4.97,5.2,5.3,5.18,5.17,5.15,5.09,5.12,5.08,5.14,5.14,5.13,5.25,5.24,5.43,5.23,4.88,4.81,4.39,4.78,4.72,4.63,4.64,4.63,4.6,4.62,4.49,4.36,4.31,4.19,4.49,4.89,4.84,4.53,4.33,4.62,4.92,4.85,4.8,4.67,4.68,4.66,2.36,2.97,3.43,1.67,1.46,2.24,1.02,1.7,1.15,1.65,0.27,1.71,-1.3,-1.82,-1.47,0.18,-2.3,-1.76,-1.39,-1.16,0.16,1.53,-0.24,0.83,-0.16,-2.04,-1.82,-1.73,-0.69,-0.79,-0.08,-0.08,-0.09,-0.39,-0.45,-1.04,-1.27,-1.33,-1.07,-1.15,-1.18,-1.7,-2.33,-2.68,-3.64,-4.56,-4.86,-5.13,-3.53,-2.43,-2.22,-1.45,-4.36,-1.33,-1.88,-2.29,-2.11,-1.7,-1.0,-0.08,1.12,2.25,2.97,3.31,3.35,3.32,3.01,2.49,2.22,2.48,1.06,0.87,2.22,2.74,3.32,3.81,3.59,2.36,2.3,3.06,2.94,2.49,1.78,1.15,1.27,0.92,-1.47,-3.64,-2.97,-3.93,-4.92,-5.28,-5.08,-3.8,-1.98,-2.44,-7.72,-6.86,-5.51,-10.04,-12.2,-14.02,-15.32,-15.99,-15.93,-15.46,-14.83,-13.95,-12.96,-11.97,-10.98,-9.83,-8.66,-7.44,-6.44,-5.35,-5.58,-1.58,-2.89,-3.28,0.01,0.83,-0.08,0.73,0.67,1.21,2.19,1.42,1.52,2.15,2.55,2.06,2.15,2.98,3.98,2.06,1.64,0.87,0.11,0.35,0.69,-0.69,0.4,0.01,-0.13,-0.86,-0.14,-0.19,0.19,0.27,0.42,0.88,-0.31,-2.13,-2.41,-2.64,-2.61,-2.89,-2.07,-1.93,-1.83,-0.93,0.21,0.61,1.01,1.13,0.68,-0.56,-1.96,-1.89,-1.66,-1.6,-1.69,-1.34,-0.74,0.43,0.89,1.45,2.32,2.96,2.77,2.65,2.5,2.15,2.07,2.29,2.48,2.82,3.84,1.78,1.83,5.03,4.73,4.05,3.35,-1.47,-3.31,-4.94,-5.4,-6.01,-6.52,-5.73,-4.69,-4.02,-3.05,-2.04,-1.03,0.1,1.29,2.19,3.37,4.32,4.54,4.19,4.07,5.17,6.17,7.16,7.85,8.44,9.04,9.39,9.7,10.06,10.46,10.68,9.6,3.57,-1.86,-3.14,-3.23,-2.47,-0.81,0.82,2.99,5.05,6.11,6.57,7.34,8.29,8.76,8.82,8.6,7.64,7.18,5.52,2.81,0.93,1.45,3.02,5.77,6.4,6.17,6.32,5.55,7.77,9.59,7.87,6.51,4.66,0.94,-1.17,-0.71,-1.7,-3.16,-2.92,-2.52,-5.61,-6.44,-6.24,-6.07,-5.13,-4.47,-2.43,-2.18,-1.85,-1.9,-2.96,-3.18,-3.25,-2.34,-0.95,-0.5,-0.11,0.17,-0.81,0.22,0.28,0.09,-1.51,-3.09,-3.62,-3.6,-4.33,-4.76,-4.29,-4.34,-3.99,-3.07,-3.03,-2.54,-2.72,-3.22,-3.28,-4.16,-4.06,-3.72,-2.76,-1.84,-1.28,-1.03,0.67,1.96,2.52,3.31,4.77,4.65,5.33,5.95,6.14,6.23,5.57,4.86,4.96,5.5,5.67,4.81,4.83,4.94,5.01,5.38,5.85,4.85,4.92,5.07,5.41,4.32,4.48,5.87,5.86,4.84,5.01,5.03,4.79,5.07,5.27,5.21,5.08,5.05,5.14,5.52,5.57,5.42,5.9,6.51,5.66,4.81,5.38,4.68,4.58,1.26,2.37,1.56,2.93,1.94,2.03,2.41,0.14,0.0,1.27,1.47,-0.86,-0.91,-1.61,-2.59,-3.86,-2.51,-1.86,-2.61,-2.01,-0.74,-0.43,1.4,-1.08,-0.92,-0.25,-0.31,0.42,-1.05,-0.66,-1.38,-1.56,-2.2,-2.34,-2.87,-3.08,-3.3,-3.15,-3.35,-3.71,-4.14,-4.53,-4.78,-5.0,-5.0,-4.96,-4.89,-4.06,-1.39,0.7,-2.63,-2.09,-0.75,-2.24,-1.22,-2.49,-2.63,-3.37,-3.46,-1.43,-0.04,1.35,2.26,2.63,2.53,2.31,2.41,2.38,2.16,2.43,1.33,0.65,1.34,2.06,3.03,3.55,3.07,2.65,2.98,3.63,3.23,3.19,2.15,2.16,1.62,1.5,0.01,-1.78,-1.48,-1.46,-0.94,-0.22,-0.81,-2.69,-7.27,-9.03,-11.16,-12.96,-14.57,-15.69,-16.32,-16.79,-17.04,-17.0,-16.63,-16.08,-15.72,-15.22,-14.23,-13.54,-12.91,-11.56,-10.31,-8.89,-7.47,-6.1,-4.4,-4.02,-2.99,-1.21,-1.28,-0.88,1.19,-0.87,1.08,1.57,1.84,2.16,1.51,1.73,2.19,3.12,3.11,3.73,3.51,2.55,1.47,1.67,-0.09,-0.35,-1.0,0.47,0.02,0.83,-0.05,-0.58,-0.3,-0.42,-0.28,0.08,1.06,1.47,2.13,1.91,-1.6,-2.2,-2.45,-2.1,-1.88,-1.89,-2.03,-1.28,-1.0,-0.71,0.15,0.7,0.74,0.18,-2.26,-3.06,-2.92,-2.8,-2.27,-2.19,-1.9,-0.99,-0.32,0.98,2.03,2.57,4.16,3.11,3.45,3.09,2.6,2.28,2.47,3.05,3.59,4.0,2.92,3.65,3.53,4.34,3.71,0.38,-1.64,-4.56,-5.48,-6.54,-6.49,-6.44,-5.76,-4.34,-2.82,-1.34,0.13,1.35,2.17,3.04,4.31,4.88,4.69,4.14,4.64,5.27,5.92,6.36,6.95,7.13,7.16,7.64,8.23,8.84,9.44,9.74,8.97,6.55,3.19,0.28,0.5,-1.15,-1.75,-0.19,1.44,3.03,4.73,6.41,7.72,8.44,9.02,9.26,9.28,7.96,7.11,6.68,3.45,1.98,2.35,2.57,4.61,5.13,5.78,6.49,7.46,7.66,8.22,8.48,7.29,6.76,3.32,-0.12,1.34,0.3,-1.12,-3.26,-4.21,-3.23,-5.43,-4.67,-5.01,-5.38,-4.4,-3.3,-1.87,-1.94,-2.06,-2.37,-2.72,-2.97,-2.86,-2.17,-1.97,-1.34,-1.8,-2.25,-2.1,-1.25,-2.26,-2.27,-2.49,-2.73,-2.65,-2.53,-2.49,-3.06,-3.3,-4.5,-3.75,-2.84,-2.91,-4.13,-2.67,-2.5,-4.01,-4.7,-5.23,-4.32,-3.75,-3.23,-2.29,-1.11,-0.61,1.45,2.04,3.48,4.1,4.52,5.83,6.51,6.79,6.3,5.03,4.94,5.71,5.24,4.73,4.68,4.8,5.43,6.36,6.23,4.88,4.74,6.24,6.05,4.7,5.25,6.77,5.11,5.16,5.92,4.94,4.43,4.47,5.19,5.55,5.66,5.76,6.28,6.33,5.33,5.2,5.57,5.02,5.02,4.78,3.93,3.91,3.95,1.85,0.89,1.88,1.71,2.48,3.39,2.78,2.89,2.37,1.07,0.81,-0.35,-0.06,-0.57,-2.37,-2.23,-2.95,-4.77,-5.42,-4.42,-4.74,-4.56,-2.24,-0.03,-1.65,-1.56,-1.49,-2.04,-2.64,-1.57,-1.75,-1.91,-3.08,-3.33,-3.0,-3.79,-4.51,-4.87,-5.22,-5.63,-5.91,-6.1,-6.07,-5.86,-5.73,-5.39,-4.47,-3.29,-1.84,-1.81,-2.4,-2.26,-2.27,-2.07,-1.62,-3.32,-4.33,-3.78,-2.26,-2.96,-2.83,-1.99,-0.92,0.05,0.66,1.24,1.37,1.65,1.67,2.2,2.96,2.36,1.66,1.34,2.0,2.65,3.17,3.4,3.53,3.57,3.69,3.42,3.37,3.32,2.95,2.4,1.95,0.59,1.03,2.94,-0.63,-4.17,-4.6,-6.79,-8.46,-10.14,-12.3,-14.54,-16.14,-16.42,-15.88,-15.0,-14.74,-14.49,-14.25,-14.56,-14.63,-14.43,-13.13,-12.18,-11.51,-11.27,-11.06,-10.0,-8.35,-6.59,-4.76,-3.27,-2.96,-1.43,-2.42,-1.57,0.2,1.21,1.58,1.98,1.64,2.17,2.36,1.55,1.75,2.92,3.22,3.12,3.83,3.13,2.38,1.54,-0.39,-0.46,-1.51,-1.14,-0.36,0.31,-0.4,-0.74,-0.19,-0.51,-0.69,-0.59,-0.07,0.81,2.02,2.63,0.4,-1.18,-1.69,-1.68,-2.13,-1.89,-1.57,-1.02,-1.42,-1.55,-1.02,-0.11,0.11,0.42,0.88,-0.85,-3.15,-3.23,-2.74,-1.77,-0.48,-0.3,0.24,0.99,1.42,2.9,2.04,2.99,3.14,2.98,2.84,3.27,2.05,2.47,2.8,3.72,2.97,2.46,2.74,5.09,5.0,1.69,0.3,-0.45,-2.84,-5.3,-7.63,-6.81,-5.14,-2.76,-0.65,0.59,1.85,2.87,2.88,3.39,4.24,4.78,5.1,4.78,4.25,4.37,4.32,4.77,5.34,5.76,6.21,6.86,7.55,8.1,8.36,8.51,7.89,6.07,5.27,3.64,2.25,3.78,2.71,0.09,1.03,3.02,4.36,5.41,6.25,6.79,7.94,8.7,9.54,8.92,4.62,3.58,5.15,4.84,2.71,1.72,2.52,4.93,4.37,6.35,7.35,7.86,7.44,7.39,7.8,6.26,3.89,0.16,0.79,0.13,-1.2,-1.92,-3.8,-3.27,-3.35,-3.29,-2.51,-2.09,-2.88,-2.4,-2.64,-2.38,-2.1,-2.67,-2.9,-3.26,-2.64,-2.25,-2.16,-2.03,-2.39,-3.55,-3.47,-3.38,-2.95,-3.19,-3.88,-4.28,-4.58,-4.43,-2.76,-3.25,-3.19,-3.81,-3.9,-4.14,-4.2,-4.2,-4.37,-4.68,-5.8,-6.36,-6.51,-5.36,-5.31,-4.67,-4.55,-3.51,-3.46,-1.97,-1.07,0.32,2.37,3.68,4.29,4.84,5.1,5.49,6.0,5.94,6.27,5.82,5.21,5.1,5.19,5.55,5.84,5.98,6.09,5.98,6.03,5.28,4.85,5.12,5.3,3.97,3.92,4.71,5.37,3.98,4.64,4.6,4.35,5.13,3.14,1.62,0.99,2.85,2.72,3.81,3.95,3.93,4.09,4.07,3.09,3.16,2.24,-2.43,2.47,5.04,2.95,3.97,2.43,1.76,1.06,1.49,-0.28,-0.43,-1.58,-2.69,-2.72,-3.03,-3.51,-4.32,-3.46,-3.03,-2.94,-2.16,-2.59,-5.07,-3.68,-3.96,-1.73,-2.28,-1.33,-1.6,-0.15,-0.45,-0.05,-2.24,-2.13,-3.14,-4.69,-5.55,-6.66,-7.13,-7.06,-7.05,-7.08,-6.91,-6.22,-4.63,-3.23,-2.49,-2.3,-4.31,-3.1,-3.58,-7.51,-9.84,-8.2,-7.26,-6.86,-6.21,-5.7,-5.51,-4.99,-4.54,-4.02,-3.24,-2.44,-1.29,-0.36,0.99,1.68,2.06,2.45,3.04,2.97,2.95,2.82,3.21,3.69,3.61,3.67,3.38,3.49,3.62,3.74,3.72,4.17,3.5,4.53,4.82,2.8,-0.21,-0.43,-1.99,-3.26,-4.49,-5.34,-6.8,-8.07,-10.61,-10.21,-6.85,-4.46,-3.52,-3.06,-4.12,-3.98,-5.4,-8.48,-11.13,-12.25,-11.79,-11.33,-10.23,-9.47,-8.6,-7.8,-6.76,-5.02,-3.1,-2.35,-1.32,0.6,-2.54,-0.43,0.74,1.59,1.96,2.03,2.45,1.96,2.37,1.08,1.23,1.75,1.3,2.31,1.87,2.39,0.76,-0.18,0.1,-0.93,-1.07,-1.54,-0.84,-0.85,-1.78,-1.18,-0.75,-0.89,-0.92,-1.32,-0.68,0.21,1.88,0.67,-1.01,-1.77,-1.7,-1.97,-2.0,-1.92,-1.71,-1.48,-1.48,-1.15,-0.19,-0.42,-0.66,-0.16,0.16,0.08,-0.92,-2.23,-1.96,-2.11,-1.71,-0.63,-0.08,1.08,1.61,1.94,1.89,2.33,2.72,2.53,2.92,2.63,3.47,3.59,3.02,4.19,2.63,2.67,2.77,2.83,3.25,2.92,1.11,-2.52,-6.3,-6.57,-5.34,-2.65,-0.12,1.57,2.39,3.21,3.83,3.42,3.64,4.1,4.89,4.76,4.28,3.94,2.36,2.04,1.98,1.81,2.42,3.06,4.33,5.98,6.97,7.59,8.01,7.07,6.44,6.55,5.21,4.06,4.5,5.29,5.04,2.12,2.78,4.29,5.32,6.28,6.77,7.13,8.42,7.55,3.71,3.63,4.33,6.05,7.05,6.25,3.81,2.93,1.99,3.68,5.28,6.4,7.01,7.76,7.09,3.43,2.07,0.38,0.8,0.72,-0.05,-2.42,-2.01,-2.69,-3.39,-3.7,-4.09,-3.23,-3.3,-2.72,-1.88,-1.81,-1.43,-0.68,-0.35,-2.88,-3.24,-3.74,-3.57,-2.8,-2.13,-1.94,-3.39,-3.0,-2.66,-2.77,-2.95,-3.21,-4.0,-5.45,-7.05,-3.94,-4.23,-5.57,-4.65,-4.75,-4.66,-4.72,-5.42,-6.61,-6.71,-6.56,-6.71,-7.74,-7.43,-5.73,-5.15,-4.78,-5.32,-5.88,-4.82,-3.39,-2.51,-2.13,-0.99,0.26,1.57,2.65,3.78,4.76,5.13,5.15,5.0,4.81,4.87,4.62,4.43,4.54,4.47,4.52,4.39,4.74,3.87,3.03,3.36,3.61,3.6,3.83,4.8,6.08,5.69,3.27,2.38,3.85,6.21,5.0,4.4,3.12,2.02,0.57,0.33,0.71,1.9,2.47,3.26,3.1,1.9,2.83,3.57,4.68,4.45,3.18,2.17,1.64,1.24,1.16,1.55,2.36,2.54,1.1,1.27,0.46,-0.27,-1.0,-2.11,-3.32,-3.14,-3.0,-3.55,-3.75,-4.7,-3.67,-2.98,-2.61,-1.68,-1.58,-1.94,-0.35,0.66,-1.02,-0.29,-1.63,-2.13,-4.0,-5.69,-6.75,-7.26,-7.68,-7.96,-8.62,-9.31,-9.46,-9.37,-9.49,-9.53,-7.79,-7.86,-7.92,-11.41,-11.52,-12.29,-12.08,-10.98,-10.05,-9.05,-8.12,-7.09,-6.09,-5.37,-4.97,-4.53,-4.04,-3.12,-2.12,-0.8,0.48,1.93,2.35,2.48,2.87,2.46,2.8,3.18,3.08,3.83,4.0,3.87,3.76,3.85,3.82,4.18,4.95,6.65,4.65,4.34,4.31,3.1,0.83,0.14,-1.0,-1.47,-2.09,-2.8,-3.71,-3.21,-1.16,-0.56,-0.99,-1.07,-0.4,-0.19,0.25,1.25,-0.27,-3.25,-7.25,-9.65,-10.56,-10.37,-9.94,-8.14,-6.97,-5.95,-4.79,-3.42,-1.94,-2.46,0.47,2.99,0.43,0.28,0.98,1.65,1.39,1.79,2.3,2.11,0.68,0.3,0.73,1.34,-1.12,1.77,2.65,0.93,0.01,-0.47,0.06,-0.28,-2.17,-2.26,-2.24,-1.81,-2.53,-1.76,-1.96,-2.03,-0.73,-1.71,-2.11,-1.17,-3.12,-1.51,-2.13,-2.18,-2.02,-2.24,-1.7,-1.89,-1.63,-1.33,-1.19,-1.34,-0.7,-0.04,-0.92,-1.57,-1.63,-0.77,-1.21,-2.32,-2.28,-2.11,-1.98,0.16,1.13,1.21,1.67,2.24,2.01,1.81,2.47,2.11,2.3,2.38,3.12,4.41,3.84,2.84,3.83,4.03,2.66,1.94,3.62,5.71,1.74,-1.63,-2.56,0.74,1.78,3.19,3.56,4.25,5.15,5.96,4.57,4.16,4.95,5.88,5.58,5.67,5.85,3.97,0.61,2.18,1.78,0.72,1.57,2.96,5.12,6.58,6.63,7.01,6.98,6.38,5.87,6.07,5.44,5.5,5.38,4.94,3.97,2.98,4.13,5.63,6.78,7.6,7.59,7.37,7.89,3.9,3.5,3.6,5.59,6.4,1.94,3.35,3.79,3.86,2.72,2.51,3.52,3.44,2.74,1.49,1.91,1.43,0.42,0.29,-0.08,-0.43,-1.02,-1.06,-1.55,-2.66,-3.0,-3.16,-3.11,-2.84,-2.5,-2.27,-2.47,-2.53,-3.06,0.03,-3.02,-2.48,-2.85,-3.01,-2.48,-2.39,-2.97,-3.04,-1.84,-1.2,-1.35,-0.9,-1.68,-2.29,-4.04,-5.45,-6.11,-5.17,-5.31,-4.9,-4.86,-5.5,-6.47,-6.47,-6.12,-6.14,-6.79,-7.89,-6.84,-8.43,-8.02,-8.46,-6.09,-6.32,-7.67,-6.88,-5.63,-4.13,-2.94,-2.3,-1.98,-1.25,-0.44,0.88,1.8,3.02,3.57,4.09,4.29,4.49,4.29,3.89,3.52,3.29,3.39,3.21,3.22,3.71,3.86,4.28,3.84,4.09,3.28,6.28,4.87,3.51,3.4,2.76,3.12,0.81,0.86,4.29,2.45,1.6,-0.51,1.25,-0.82,-0.8,0.54,2.83,3.56,2.95,2.87,2.94,3.01,2.8,3.22,2.26,1.96,1.35,0.69,2.01,1.25,1.69,1.86,1.45,0.95,1.2,1.94,0.73,-1.8,-2.71,-2.41,-1.68,-1.34,-1.86,-2.34,-3.06,-2.16,-1.89,-1.19,-1.34,-1.44,-0.38,-0.17,-1.32,-1.4,-1.4,-3.09,-4.78,-6.14,-7.68,-9.41,-11.31,-12.85,-13.64,-14.46,-14.13,-14.04,-13.13,-11.58,-8.73,-10.38,-15.99,-16.4,-15.79,-14.48,-13.02,-11.84,-10.97,-10.1,-9.2,-8.17,-6.83,-5.79,-5.18,-4.14,-2.86,-3.06,-2.04,-0.79,0.04,1.65,2.1,2.23,1.99,2.01,2.21,2.23,2.83,4.08,5.09,4.81,5.16,5.02,5.86,6.7,5.5,4.96,4.3,4.6,4.36,2.93,3.25,1.52,1.08,0.47,-0.49,-0.56,1.31,0.77,-0.48,-1.08,-1.36,-0.83,-0.34,0.14,0.44,1.34,1.29,1.06,-0.63,-3.93,-6.73,-7.85,-8.56,-8.13,-5.97,-4.52,-3.53,-2.24,-0.92,0.36,1.77,3.63,3.31,0.95,0.91,1.32,0.6,1.24,0.5,1.22,1.74,1.05,0.59,0.98,-1.69,0.41,0.0,-1.64,-1.04,-0.71,-0.18,0.11,-3.92,-3.21,-2.93,-4.24,-3.81,-3.25,-3.16,-2.92,-1.99,-2.76,-2.2,-2.7,-3.41,-2.47,-2.41,-2.05,-1.86,-1.44,-1.58,-1.71,-1.48,-0.78,-0.77,-0.74,-0.53,-0.23,-1.57,-1.77,-1.61,-1.9,-2.92,-1.92,-1.49,-1.66,-1.62,0.3,0.28,1.2,0.92,1.34,1.57,1.46,1.87,2.4,2.41,3.13,3.77,3.88,3.44,3.88,4.83,5.07,3.72,5.08,11.13,12.84,11.16,6.38,5.94,6.44,6.84,6.3,6.62,7.52,7.21,5.14,5.11,5.94,6.43,7.21,7.84,7.33,6.96,7.03,7.16,6.74,6.29,6.06,5.51,5.5,5.09,6.81,6.49,6.04,5.93,5.67,5.6,5.72,5.38,6.01,5.72,4.94,2.95,3.75,4.78,6.23,7.39,6.76,5.99,3.62,2.8,3.15,4.99,5.55,2.86,2.12,2.83,2.18,2.78,0.8,1.37,0.9,0.21,1.18,1.1,0.75,0.97,0.57,-0.1,-0.56,-0.38,0.25,-1.13,-0.89,0.15,-1.58,-2.51,-2.7,-2.63,-2.67,-2.11,-1.65,-1.67,-2.89,-2.03,-3.16,-3.44,-2.52,-2.18,-2.22,-2.83,-3.08,-2.6,-1.64,-1.14,-0.73,-0.6,-0.27,-0.05,-0.19,-2.42,-4.96,-6.13,-5.62,-5.17,-3.98,-4.52,-5.58,-5.22,-5.48,-5.31,-5.61,-5.94,-6.68,-7.22,-6.99,-6.71,-7.83,-7.12,-8.07,-8.01,-7.13,-5.93,-4.79,-3.55,-2.8,-2.29,-1.92,-1.57,-0.66,-0.25,0.44,1.69,2.24,3.03,3.8,3.93,4.0,3.99,3.79,3.71,3.64,2.35,1.91,1.96,0.66,2.4,2.38,3.03,1.56,2.9,3.67,0.52,1.89,3.81,2.23,2.56,0.35,-1.31,-1.28,0.8,-0.84,-0.98,-1.23,-0.75,-1.02,-0.91,0.55,1.14,1.8,2.23,2.13,2.31,2.65,4.78,3.7,1.35,-0.98,0.13,1.55,1.48,0.91,0.68,0.31,-0.14,-0.11,-1.49,-2.11,-1.11,-0.99,-1.31,-1.93,-1.31,-2.84,-1.55,-1.0,0.12,-2.51,-0.73,0.72,-0.17,-0.78,-1.21,-0.75,-3.52,-5.17,-7.35,-9.85,-12.24,-14.0,-15.11,-15.6,-16.67,-17.75,-18.65,-19.92,-20.5,-18.83,-18.66,-18.49,-17.99,-16.71,-14.94,-12.91,-11.38,-10.29,-9.57,-8.72,-7.67,-6.29,-4.64,-2.92,-1.82,-1.5,-1.05,-0.61,-0.28,-0.07,1.64,2.57,3.26,2.83,2.24,1.71,3.12,4.07,3.86,4.66,4.31,4.72,5.04,5.79,5.69,5.17,4.78,5.04,4.43,4.15,4.0,3.16,2.78,2.76,1.63,2.93,2.29,1.12,0.07,-0.78,-0.96,-0.62,-0.51,0.11,1.28,1.56,1.89,2.11,2.32,2.8,1.53,-0.75,-3.67,-5.68,-7.05,-5.06,-2.45,-1.84,-0.99,0.29,2.1,3.21,3.16,3.25,1.1,1.4,0.28,-1.45,0.72,1.73,2.12,1.92,1.02,1.04,-0.44,-0.32,-0.04,-0.93,-1.59,-1.62,-1.72,0.92,-1.36,-3.72,-3.27,-3.63,-5.16,-4.55,-3.09,-2.65,-2.26,-1.88,-2.81,-2.59,-3.66,-2.79,-2.71,-2.37,-2.33,-1.88,-1.52,-1.49,-1.54,-1.08,-0.5,0.09,-1.25,-1.54,-1.89,-2.07,-1.81,-1.3,-1.7,-1.87,-0.76,-1.73,-1.95,-0.54,0.43,0.79,1.08,0.8,1.53,2.09,1.36,0.95,1.7,1.3,2.28,2.27,3.83,3.5,4.66,10.74,10.47,6.12,12.21,12.13,12.14,11.93,12.57,9.25,9.13,9.17,8.91,8.85,7.71,6.64,6.24,6.67,7.26,7.77,8.05,8.1,7.94,7.89,7.51,6.9,6.63,6.81,6.47,5.95,6.5,5.87,5.9,5.93,5.71,5.52,6.01,6.0,6.49,6.54,6.2,4.96,5.09,2.87,3.94,5.41,6.37,6.53,5.0,4.21,3.94,3.52,4.31,4.12,3.12,1.68,1.73,1.61,0.89,-1.8,-1.4,1.39,1.21,-1.87,-1.87,0.84,1.11,0.35,-0.91,-1.73,-2.1,-1.89,-1.24,-0.72,-1.09,-1.51,-1.77,-1.72,-3.57,-1.95,-0.62,0.58,1.41,2.34,1.63,-1.56,-3.49,-3.14,-2.63,-2.63,-2.43,-2.83,-2.46,-2.49,-1.36,-1.19,-1.13,-0.42,0.77,0.95,1.73,0.31,-4.12,-5.52,-5.43,-3.24,-2.36,-2.55,-2.62,-3.33,-3.96,-5.04,-5.96,-5.0,-4.95,-5.51,-6.26,-7.54,-7.5,-7.32,-8.44,-7.67,-7.38,-6.27,-5.63,-5.3,-5.32,-4.41,-3.4,-2.97,-2.54,-1.86,-1.36,-0.54,0.13,1.68,2.97,3.73,4.01,4.28,4.17,4.13,4.99,2.07,1.27,0.83,1.52,2.13,3.55,5.19,1.32,2.81,0.8,3.04,1.93,1.56,0.59,2.12,-1.65,-3.39,-2.37,-1.72,-0.22,-0.45,-2.35,-2.96,-2.46,-1.17,-0.04,1.01,1.27,1.4,0.26,4.38,2.89,-0.88,-3.42,-2.08,-1.09,-0.08,0.52,0.69,-0.43,0.9,-0.72,-0.18,-1.18,-3.85,-3.76,-0.76,-0.9,-1.15,-0.71,-0.8,-2.04,-1.75,-1.34,-0.75,-0.69,-0.58,0.16,2.55,-0.06,0.19,-2.88,-4.39,-6.62,-9.5,-11.14,-13.99,-15.57,-16.17,-17.4,-19.18,-17.73,-20.48,-19.97,-19.34,-18.81,-18.33,-17.84,-17.49,-16.99,-15.62,-13.75,-11.7,-10.17,-9.13,-7.95,-6.36,-5.19,-4.16,-2.76,-1.07,0.3,1.5,1.81,1.45,1.21,2.25,3.47,3.81,3.94,3.53,3.85,4.27,4.58,4.5,4.35,4.54,4.81,5.38,5.95,5.81,5.46,5.42,5.62,5.62,5.57,4.82,5.18,5.51,5.27,5.26,2.95,1.7,0.85,-0.01,-0.39,0.64,0.9,1.95,2.44,2.56,2.14,2.18,2.52,2.88,2.4,0.48,-1.75,-3.09,-4.23,-4.02,-2.77,-0.79,-0.14,0.28,1.7,3.2,3.27,3.16,-0.37,1.06,5.02,0.97,0.56,0.03,2.34,3.64,1.76,1.06,-0.61,0.17,-0.33,-0.59,-2.07,-1.8,-1.76,-1.19,-1.11,-1.54,-2.52,-2.99,-4.04,-5.98,-5.99,-3.97,-3.82,-3.89,-3.15,-4.49,-4.22,-2.47,-2.08,-2.02,-2.01,-1.87,-1.81,-1.72,-1.38,-1.57,-0.96,0.11,0.73,-1.68,-1.91,-2.07,-2.37,-1.87,-1.79,-2.16,-1.32,-0.37,-1.76,-1.52,-0.36,0.48,0.98,1.12,1.8,0.83,2.74,3.78,6.49,6.52,9.65,9.39,7.19,8.77,11.67,11.27,6.99,9.09,14.21,15.28,15.77,15.04,12.29,11.13,10.47,10.79,10.03,8.66,8.2,7.78,7.52,7.94,8.64,8.73,8.14,8.07,7.99,7.78,7.71,7.51,7.43,8.08,7.32,7.08,5.86,5.88,5.89,6.09,5.8,5.82,6.28,7.26,7.62,7.1,7.23,7.25,6.14,3.5,2.72,4.07,5.24,5.75,5.1,4.17,4.2,3.29,2.91,2.89,2.3,1.76,0.89,-0.5,-0.6,1.82,1.38,-0.86,-1.89,-0.53,0.17,1.4,1.05,0.25,0.03,0.34,-1.37,-1.1,-1.05,-0.4,-3.65,-2.35,-1.8,-0.75,-0.52,-0.51,0.14,-0.17,-0.19,-0.38,1.15,-0.65,-1.99,-2.0,-2.81,-3.27,-3.28,-2.32,-2.4,-2.63,-2.29,-1.51,-0.56,-0.13,0.29,0.38,0.94,1.31,2.24,-0.77,-3.79,-2.74,-1.26,-0.26,0.32,-0.12,-0.06,-5.89,-5.89,-5.24,-5.83,-6.73,-7.5,-7.14,-6.78,-7.05,-7.71,-7.66,-7.76,-7.53,-6.85,-6.4,-6.63,-6.13,-5.12,-4.41,-4.04,-3.49,-3.51,-2.75,-2.16,-0.84,-0.18,0.27,1.29,1.95,2.33,3.48,2.91,1.81,0.45,0.61,0.72,1.86,3.58,3.32,5.8,2.2,2.85,2.53,5.04,4.27,5.07,5.3,2.94,1.22,-1.52,-3.91,-3.84,-2.61,-3.24,-3.08,-3.29,-1.03,0.73,1.27,0.92,-0.01,3.05,2.49,-0.01,-2.36,-5.53,-2.97,-2.86,-1.37,0.26,-0.36,-1.0,0.79,0.89,0.69,0.61,1.37,-3.31,-3.61,-2.96,-2.02,-1.98,-2.67,-2.69,-1.64,-0.75,-0.01,0.09,-1.43,0.37,2.14,-1.03,-0.22,-1.14,-2.39,-4.53,-7.41,-9.93,-12.42,-13.63,-13.08,-11.64,-10.39,-9.51,-9.26,-10.44,-12.57,-16.02,-17.57,-17.02,-17.28,-16.58,-15.33,-14.69,-13.75,-12.31,-9.95,-8.45,-7.22,-5.61,-4.19,-3.16,-2.15,-0.71,1.46,3.29,3.63,3.07,2.6,2.5,3.86,4.71,5.51,5.38,5.01,4.56,4.52,4.5,4.49,4.55,4.51,4.29,4.57,5.19,6.0,7.05,7.26,7.63,7.57,8.14,8.58,8.09,6.6,3.35,1.09,0.85,0.75,0.76,1.43,2.63,3.75,3.61,3.06,2.82,2.52,2.7,2.91,2.84,1.8,-0.57,-1.32,-2.04,-2.05,-1.82,-1.09,0.88,1.62,1.72,3.18,4.24,5.68,8.07,7.02,-0.33,2.2,0.64,-0.51,1.23,2.55,1.53,-0.4,-0.27,-0.15,-0.6,-0.24,-1.02,-1.81,-3.29,-3.92,-3.0,-2.15,-2.21,-2.23,-3.15,-3.26,-3.61,-4.58,-4.93,-4.68,-4.61,-3.12,-4.01,-3.69,-4.97,-2.64,-2.49,-2.59,-1.99,-1.34,-0.35,-1.1,-1.29,-1.05,-0.98,-1.73,-1.93,-1.92,-1.94,-2.24,-2.13,-1.72,-1.38,-0.59,0.01,-1.64,-0.44,-0.87,-0.48,1.59,1.93,3.44,2.1,1.16,2.36,8.41,6.74,5.1,8.18,10.31,11.07,5.91,7.05,6.9,8.02,8.04,14.17,13.04,11.46,10.19,9.91,10.93,10.1,9.63,8.78,8.33,7.88,8.7,9.64,9.25,7.89,7.87,8.12,7.92,7.87,7.05,7.19,5.4,7.61,6.18,6.33,5.73,5.66,5.85,6.0,6.29,6.34,6.38,7.07,7.45,7.45,7.7,6.84,4.21,2.55,1.82,3.38,4.28,4.39,3.34,3.02,2.62,1.79,1.76,1.19,0.24,0.01,-1.85,0.92,-0.69,-2.15,-1.69,-1.28,-0.22,-0.56,-0.87,0.15,-0.96,-0.2,0.28,0.81,0.84,-0.68,-0.4,-0.77,0.58,-2.12,-0.18,-0.16,-0.17,0.26,0.87,0.63,-0.28,-0.69,-1.43,-1.84,-0.63,-2.43,-2.68,-2.76,-3.3,-2.82,-2.27,-1.86,-1.49,-1.31,-1.06,-1.2,-0.74,0.7,2.22,1.62,2.23,-0.69,-1.43,-0.52,0.25,1.18,1.33,1.81,1.82,-3.83,-2.78,-7.8,-8.77,-6.38,-8.61,-8.07,-9.17,-8.87,-8.83,-8.88,-8.32,-7.73,-9.09,-8.58,-7.45,-6.7,-6.1,-5.51,-5.26,-4.91,-4.19,-4.5,-3.89,-3.6,-2.53,-1.89,-1.91,-1.12,0.98,3.64,5.87,11.22,11.45,8.88,2.79,0.4,3.25,5.33,3.47,6.59,8.31,9.91,10.05,10.61,10.96,2.23,-1.45,-0.79,-5.24,-7.38,-3.94,-2.83,-0.3,2.39,1.81,1.24,0.41,3.72,5.02,4.79,3.15,0.67,-2.91,-3.22,-3.41,-2.47,-0.59,0.7,-1.22,0.92,1.3,0.1,-0.2,-0.72,-0.18,1.4,-3.74,-3.49,-3.7,-3.69,-3.37,-2.38,-0.43,0.05,-0.21,-0.19,-5.68,-0.1,4.05,-0.44,1.7,2.02,0.71,-0.94,-4.01,-7.12,-7.21,-8.39,-9.87,-10.95,-9.96,-8.07,-6.19,-4.45,-1.89,0.04,0.37,-4.1,-9.96,-13.16,-14.34,-14.81,-15.53,-14.27,-12.32,-10.3,-8.79,-7.11,-5.53,-3.92,-2.42,-1.41,0.13,2.34,4.28,5.04,4.5,3.31,3.15,4.04,5.25,5.77,5.57,4.66,4.43,4.45,4.63,5.28,5.71,5.51,5.48,5.85,6.96,8.18,9.16,9.59,10.61,10.61,11.13,10.18,9.25,7.67,5.71,4.77,4.22,4.01,4.21,5.11,5.72,5.24,4.16,3.24,2.83,2.9,3.24,2.57,2.16,1.38,-0.32,-0.94,-0.79,-0.27,-0.24,0.11,2.05,2.81,3.35,4.76,6.21,7.61,8.47,7.62,0.16,2.15,-0.7,1.4,2.35,0.74,-1.59,0.25,0.48,0.44,-0.95,-1.86,-3.53,-5.12,-5.67,-2.33,-2.45,-1.73,-2.99,-3.78,-4.07,-4.33,-4.43,-4.29,-5.01,-5.03,-5.35,-5.49,-4.13,-4.24,-2.79,-2.95,-2.56,-2.11,-0.43,-2.12,-2.03,-3.09,-3.08,-1.48,-1.46,-1.79,-1.89,-1.77,-1.98,-1.95,-1.53,-1.27,-0.87,-0.25,0.49,-0.53,-0.85,0.94,1.58,1.55,1.73,1.88,5.14,4.24,4.58,5.66,6.82,8.43,10.2,6.88,7.58,7.35,7.5,7.38,8.43,10.01,10.42,10.22,9.94,9.48,8.82,8.65,10.35,9.86,8.12,8.82,9.44,9.21,8.54,8.25,8.19,8.08,7.65,6.6,4.63,3.89,8.47,7.61,7.9,6.94,6.02,5.79,5.67,5.44,5.35,5.46,5.61,6.35,6.69,6.77,6.82,6.55,6.01,2.27,1.02,0.93,2.59,3.13,2.34,1.65,1.88,1.38,1.33,1.04,0.78,1.95,1.02,-1.18,-3.07,-1.88,-2.1,-1.7,-1.49,-1.2,-1.19,-0.5,-0.17,-0.43,-1.78,-0.23,-0.22,0.66,1.13,1.74,0.95,-0.07,-0.72,-0.59,-0.51,-0.67,-0.35,0.67,-0.28,-1.33,-1.73,-0.31,-1.4,-1.16,-1.94,-2.98,-3.89,-3.67,-3.11,-2.78,-2.62,-2.75,-1.95,0.55,2.19,0.89,0.11,-0.35,0.19,0.18,-1.15,-0.25,0.9,1.33,2.36,1.9,1.03,-2.4,-4.74,-10.69,-8.48,-6.66,-9.08,-9.47,-9.17,-9.42,-9.38,-9.23,-9.29,-9.42,-10.25,-9.69,-8.58,-7.57,-6.84,-6.91,-7.01,-7.02,-6.27,-6.06,-5.43,-5.33,-4.74,-3.54,-2.33,-1.69,-1.88,-0.74,0.79,5.54,1.93,8.62,9.43,8.07,5.83,1.71,1.75,5.5,7.52,8.71,10.12,12.61,13.14,13.13,12.96,15.25,11.33,-2.85,-1.57,1.06,3.58,3.38,4.22,5.97,6.99,8.07,8.01,9.01,6.85,0.98,-2.88,-0.86,-2.73,-2.18,-1.26,0.17,-0.36,-0.02,0.45,-2.01,-2.45,-2.52,-3.19,-0.85,-4.59,-3.75,-3.98,-3.77,-3.35,-1.19,0.89,0.92,0.81,0.8,-0.24,0.68,3.25,0.4,3.91,5.72,5.85,4.15,1.73,-0.59,-3.28,-5.47,-10.31,-11.44,-9.41,-6.25,-3.58,-2.31,-2.26,-0.61,1.88,3.73,2.23,-5.3,-10.77,-12.99,-14.79,-14.9,-14.07,-12.26,-10.55,-8.6,-6.8,-5.03,-3.48,-1.67,-0.56,0.78,3.08,5.2,6.12,5.45,3.95,3.7,4.33,5.44,6.36,6.17,6.03,6.22,6.27,6.36,6.6,7.16,7.89,8.52,8.64,9.69,10.49,11.57,12.49,12.72,13.11,12.91,13.45,14.17,13.28,10.84,9.63,8.17,7.47,7.52,6.85,5.66,4.29,3.41,3.11,3.35,2.67,2.56,2.39,2.23,1.96,-0.16,-0.38,0.38,1.11,1.38,1.32,2.67,3.29,4.26,5.55,6.13,6.2,5.62,3.6,1.72,-0.08,3.36,2.87,0.92,-0.28,1.25,0.49,0.48,-0.05,-1.96,-0.67,-2.61,-1.3,-3.9,-4.09,-3.15,-2.63,-4.15,-5.39,-4.87,-4.99,-4.89,-5.09,-5.69,-6.73,-5.78,-4.61,-2.82,-2.54,-3.1,-2.64,-3.66,-5.01,-2.57,-1.06,0.52,0.76,-2.12,-1.67,-1.33,-1.4,-1.42,-1.58,-1.73,-1.63,-1.36,-0.61,-0.63,-0.01,-0.51,-0.22,0.14,-0.44,0.78,1.22,1.2,2.09,2.28,3.12,3.89,3.82,4.48,6.08,8.82,11.27,11.98,10.39,11.25,8.77,7.56,9.35,9.93,9.83,9.64,9.21,9.08,10.32,9.41,6.13,8.02,7.65,7.53,7.67,6.79,5.52,4.86,3.81,1.23,7.4,8.47,7.84,7.39,7.79,7.39,6.65,6.11,5.74,5.44,5.22,4.39,4.46,5.34,5.83,5.84,6.04,6.1,6.37,7.33,0.19,0.85,0.94,1.95,1.6,0.85,1.34,1.25,0.77,0.84,-0.09,0.54,-0.71,-1.2,-2.22,-1.23,0.21,0.07,0.82,0.09,-0.39,-0.66,-0.8,-0.04,-0.98,-0.68,-0.1,0.02,-0.9,0.69,0.15,-0.74,-0.58,-1.02,-1.89,-0.12,0.92,1.22,0.19,-0.45,-1.46,-1.04,-1.6,-1.21,-1.04,-0.05,-0.39,-0.71,-0.26,1.31,1.75,1.97,1.33,-0.29,-1.19,-1.52,-0.82,-0.06,0.29,-0.71,-1.04,-1.03,1.13,1.3,2.0,2.0,2.08,1.41,-1.17,-3.1,-4.95,-7.02,-9.79,-9.67,-8.1,-9.42,-9.57,-9.6,-9.9,-10.5,-10.13,-10.74,-9.92,-8.99,-8.88,-8.83,-9.37,-9.11,-8.09,-7.44,-6.96,-6.4,-5.43,-3.55,-1.79,5.09,5.53,7.52,8.59,7.49,-0.34,-4.57,2.94,6.7,9.33,13.34,14.37,13.5,14.7,5.6,7.91,13.52,14.38,15.21,13.38,12.36,12.98,10.23,4.21,-3.45,1.06,4.33,6.32,8.63,9.01,10.93,11.43,12.25,12.14,8.51,-2.23,-1.96,-2.0,-2.66,-1.21,-1.55,-2.33,-2.36,-2.0,-0.84,0.1,-0.69,-2.04,-3.05,-3.6,0.6,-1.58,-4.07,-2.9,0.01,1.5,2.89,-3.16,-0.92,1.37,3.13,3.97,3.57,6.27,8.28,10.75,10.3,9.09,5.79,2.56,2.21,-4.65,-7.69,-4.87,-1.89,-0.16,0.42,0.49,0.7,1.52,3.68,5.51,5.49,0.0,-6.14,-11.64,-12.85,-14.11,-13.33,-11.85,-9.52,-7.5,-6.11,-4.36,-2.57,-0.9,0.87,2.24,4.18,5.93,6.97,6.59,5.4,4.29,5.49,6.73,7.78,8.24,7.96,8.23,8.08,8.38,8.09,8.43,9.0,9.93,9.83,10.85,12.22,13.76,14.99,15.95,16.92,17.54,18.19,17.26,14.59,14.28,11.35,9.66,9.54,7.56,5.73,4.18,4.07,3.48,2.75,2.4,2.39,2.58,3.08,3.12,2.14,-0.03,0.41,1.28,1.98,2.09,1.83,2.23,2.97,3.81,4.36,3.98,3.81,1.88,2.26,1.87,1.9,4.51,3.58,1.5,0.61,-0.1,0.61,0.18,-0.27,-1.36,-2.28,-3.56,-5.78,-6.14,-5.74,-4.17,-1.42,-2.2,-3.56,-3.64,-3.92,-3.09,-2.64,-3.65,-4.4,-5.36,-3.48,-3.69,-3.96,-3.08,-2.13,-2.05,-1.84,-1.35,-0.64,-0.84,0.04,0.71,0.36,-0.66,-0.83,-1.25,-1.77,-0.75,-1.03,-1.13,-0.98,-0.74,-1.68,-0.74,-0.28,-0.32,0.42,0.57,0.31,0.18,1.32,2.05,2.96,5.86,1.79,3.27,8.11,9.8,10.16,10.33,10.19,9.81,10.43,9.41,9.07,9.48,9.13,6.88,8.86,8.7,8.37,7.76,7.59,7.02,5.37,3.43,1.51,1.72,1.46,5.81,7.72,7.76,7.3,6.54,6.34,6.77,6.56,5.8,5.56,5.4,5.25,4.95,3.85,3.64,4.04,4.61,5.07,5.5,5.9,6.41,7.32,6.2,0.39,0.54,0.87,0.77,0.43,0.69,0.8,0.41,0.43,0.39,1.68,1.87,4.61,1.78,0.93,0.15,3.03,0.6,1.14,-1.43,0.05,1.74,0.1,-1.9,-2.84,-1.28,-1.61,-1.24,-2.24,0.05,-0.87,-2.01,-1.02,0.97,1.09,1.46,-1.4,-1.98,-2.56,-2.75,-2.9,-3.23,-2.99,-2.69,-1.54,-0.7,-1.05,-1.42,-1.7,-2.0,-2.34,-2.71,-2.21,-3.04,-3.21,-3.39,-3.27,-1.6,0.05,1.2,1.06,1.23,2.36,1.64,1.91,0.66,1.43,-0.29,-0.38,-3.59,-7.13,-9.32,-8.4,-10.97,-8.05,-10.28,-10.07,-9.56,-9.17,-10.62,-11.28,-10.75,-9.94,-9.78,-10.07,-9.97,-10.8,-8.05,-7.33,-6.66,-5.96,-4.38,-0.88,3.25,-2.78,-4.24,2.15,-2.61,4.32,6.56,8.68,0.78,5.17,8.93,13.38,12.42,11.88,13.31,13.15,16.85,14.34,16.36,14.62,12.12,7.86,8.61,10.31,8.7,10.42,11.0,10.78,11.38,12.95,12.12,11.68,11.72,10.91,11.27,8.56,1.66,-0.95,-1.34,-0.27,-1.27,-1.88,-2.62,-2.9,-3.18,-3.38,-2.65,-0.99,-0.58,-1.2,-0.71,-0.58,-2.17,2.91,4.16,3.77,1.96,1.83,-3.3,-1.89,1.98,4.69,2.81,9.88,8.29,12.04,13.97,14.54,11.98,15.3,13.27,12.25,16.63,12.94,7.6,6.74,4.49,4.31,3.08,2.39,2.45,2.32,4.19,6.32,6.45,2.83,-4.5,-8.69,-12.53,-13.04,-11.36,-10.19,-8.47,-6.71,-4.82,-2.43,-0.42,0.74,2.15,3.69,5.19,6.62,7.55,8.15,8.28,7.19,7.28,7.98,9.04,9.48,9.69,8.69,8.0,9.53,9.8,8.64,9.27,10.08,9.95,11.35,13.43,15.47,18.33,19.3,19.43,19.13,18.69,16.04,16.31,12.91,11.79,10.53,7.95,5.36,5.4,4.56,3.47,2.04,2.32,2.81,3.02,2.91,3.19,2.93,1.63,0.5,1.4,2.22,1.73,1.18,1.19,1.51,2.2,2.56,2.44,1.89,0.97,1.13,2.19,2.21,3.47,2.38,2.92,0.35,-1.0,0.46,1.31,1.62,-0.9,-1.09,-2.09,1.14,-1.8,-4.86,-7.07,-6.04,-3.17,-2.32,-2.03,-2.56,-3.24,-3.07,-4.05,-4.41,-4.35,-3.67,-2.49,-2.77,-2.31,-2.35,-2.36,-2.53,-2.04,-3.27,-3.71,-1.21,-0.27,-1.39,-0.13,-2.09,-2.28,-1.79,-1.01,-0.52,-1.72,-2.66,-2.89,-1.96,-0.65,-0.22,0.68,-0.32,1.28,3.15,4.27,2.11,1.77,1.33,3.44,5.23,5.68,5.25,6.44,7.46,7.58,8.26,7.7,7.23,7.69,8.09,7.6,5.68,7.46,7.26,6.55,5.59,5.02,5.77,5.35,3.85,3.26,1.35,4.36,7.2,6.71,6.27,6.13,6.02,5.88,5.73,5.43,5.07,4.65,4.23,4.09,4.17,4.62,4.48,4.18,4.2,4.02,4.14,4.33,4.39,4.73,5.16,3.14,0.04,-0.51,-0.68,-0.61,-0.45,0.3,1.11,1.87,2.49,3.08,4.49,7.82,7.58,3.68,3.2,1.83,4.0,-0.03,0.39,-0.3,-0.85,0.95,-1.11,-2.22,-1.12,-0.92,-0.52,-2.11,-3.19,-1.36,-0.89,-0.65,-1.14,-0.97,0.43,2.8,4.11,1.28,-1.43,-3.44,-3.26,-3.96,-4.6,-4.5,-4.32,-3.94,-3.5,-3.21,-3.55,-4.26,-2.02,-1.0,0.3,-0.28,-0.28,-0.02,-1.66,-1.28,-0.9,0.54,1.33,3.04,2.11,1.67,0.1,-1.62,-0.32,-2.91,0.33,-4.35,-6.83,-8.26,-7.77,-7.37,-8.99,-8.89,-8.46,-7.96,-7.52,-6.48,-5.62,-5.69,-8.18,-10.2,-10.97,-11.39,-10.23,-11.17,-7.34,-4.11,-1.24,2.73,8.97,13.45,10.69,9.63,2.79,1.08,-2.4,2.81,6.74,3.25,4.31,8.6,11.19,11.79,11.09,16.75,16.71,16.18,13.83,9.9,9.65,10.14,12.58,11.57,14.29,12.42,13.38,13.43,12.72,11.08,10.6,9.81,11.08,11.87,11.52,11.36,10.8,6.77,3.31,-2.19,-2.48,-1.8,-0.57,-0.63,-0.64,-0.68,-1.45,-1.25,-1.64,-1.21,0.81,0.85,-1.6,-0.15,3.88,2.97,1.69,1.5,1.24,2.06,-0.74,2.48,5.51,5.87,6.48,4.96,10.65,13.97,17.33,19.48,22.69,23.81,22.82,23.12,20.7,15.83,14.62,9.68,7.74,5.58,5.62,2.59,1.93,3.02,6.26,6.84,7.21,1.19,-7.11,-10.64,-10.63,-11.18,-9.2,-8.64,-7.11,-5.36,-3.56,-1.59,0.71,2.14,3.56,4.07,5.59,6.87,7.75,8.9,9.67,9.39,9.96,10.73,10.69,10.07,10.96,10.77,10.13,10.27,10.02,9.81,9.62,9.66,10.76,12.18,14.49,16.56,18.15,19.42,18.98,16.67,17.79,13.78,13.65,12.33,9.89,7.45,5.94,5.74,3.87,2.44,2.96,2.76,2.75,2.75,2.36,2.65,2.54,1.79,1.07,1.54,1.68,0.85,0.3,0.07,0.43,1.18,1.49,1.62,1.1,1.16,1.31,1.84,2.38,3.09,2.46,1.67,4.1,-0.61,-1.92,1.04,0.64,-2.11,-2.17,-2.06,-0.96,0.6,-2.91,-3.46,-3.32,-8.79,-1.93,-3.5,-1.79,-2.1,-3.28,-3.09,-3.98,-4.31,-3.46,-3.25,-3.28,-3.05,-2.42,-3.12,-2.64,-1.73,-2.48,-2.22,-2.24,-2.07,-2.07,-3.66,-1.83,0.5,0.68,-0.19,-0.49,-0.89,0.05,-1.04,-1.17,-0.84,-0.06,1.01,3.4,4.48,5.42,1.6,1.31,2.42,3.15,3.43,3.59,3.11,3.29,3.75,4.6,5.25,5.4,5.54,5.34,5.3,5.65,4.55,3.72,5.72,5.47,5.93,4.1,1.98,2.83,1.72,0.27,2.97,7.11,6.15,6.67,4.23,4.24,4.19,4.48,4.67,4.64,4.8,4.34,3.53,3.16,3.08,3.57,3.99,4.38,4.45,4.07,3.56,3.17,3.02,2.52,1.99,2.28,0.14,-1.32,-2.21,-2.47,-2.31,-2.6,-2.46,-0.09,2.68,5.1,7.01,8.31,10.05,4.89,1.86,0.73,2.88,5.95,-2.18,-1.54,-1.37,-0.02,-0.68,-0.75,-0.8,-2.33,-1.07,-1.78,0.94,-0.42,-0.14,-1.81,-1.27,-1.34,-1.3,-0.75,0.53,1.15,0.32,1.34,1.5,-0.95,-3.54,-4.29,-4.68,-5.33,-6.18,-6.63,-5.25,-2.31,-1.01,-1.75,-1.5,-0.52,2.86,2.33,0.52,1.44,-1.41,-1.13,-0.61,-0.52,2.47,4.33,3.48,2.37,-0.56,-4.04,-0.15,-3.64,-6.3,-7.17,-6.9,-6.47,-7.13,-7.28,-7.48,-6.53,-4.01,-3.51,-3.29,-5.31,-7.76,-6.3,-6.04,-3.2,-7.73,-8.61,-6.07,-3.38,0.7,0.85,-0.43,0.41,6.18,4.81,-1.6,2.13,1.17,8.32,12.25,6.14,6.27,4.63,0.37,1.94,3.87,-1.78,1.65,-1.49,6.36,12.02,10.58,13.32,12.05,11.73,11.42,10.75,10.73,10.35,9.2,9.43,9.71,12.36,14.43,14.85,14.48,12.51,11.18,10.73,10.25,6.6,4.64,-4.63,-3.27,-1.05,0.66,0.93,1.74,2.73,1.34,-1.29,0.5,-1.48,-4.0,-0.77,-0.48,1.56,2.51,4.02,1.69,2.83,3.64,3.06,3.59,4.36,6.66,7.9,5.11,4.19,11.81,17.48,20.31,22.93,24.56,25.61,24.72,22.68,20.75,18.46,15.67,14.03,9.94,7.46,3.49,2.2,2.91,4.78,5.92,7.0,8.06,-0.29,-5.06,-7.23,-8.73,-9.88,-8.4,-7.18,-5.81,-3.36,-1.92,-0.93,1.56,3.86,5.14,5.45,6.13,7.22,8.59,9.87,10.61,10.68,11.13,11.51,11.85,11.92,11.52,10.55,9.57,9.83,10.37,10.45,10.33,10.54,11.56,12.49,13.72,14.28,14.93,15.3,16.64,14.25,13.53,12.66,10.78,9.2,6.75,7.3,4.35,2.81,3.52,3.29,2.1,2.28,2.34,1.93,1.88,1.36,1.16,1.1,1.22,0.87,0.0,-0.13,-0.63,-0.39,0.43,0.78,0.35,0.02,1.16,1.31,1.2,0.91,2.25,1.34,4.72,2.11,6.65,2.4,-1.66,-0.15,-1.16,-0.9,-0.5,-0.29,-3.94,-4.64,-3.95,-4.62,-5.45,-3.63,-5.16,-5.44,-2.9,-3.58,-6.01,-6.53,-6.82,-6.05,-5.03,-4.03,-3.8,-2.39,-3.03,-2.51,-1.67,-2.77,-2.95,-3.92,-3.8,-2.06,-0.5,-0.57,-0.88,-0.64,0.28,0.24,0.65,1.69,0.75,0.76,0.05,0.42,2.3,1.98,1.56,1.32,0.95,0.8,1.94,1.71,0.35,-0.49,-0.05,0.01,-0.28,0.62,2.01,2.43,2.31,1.73,0.62,1.38,1.88,2.1,2.49,3.23,2.86,0.9,-1.35,-2.76,3.14,6.98,5.58,6.35,5.21,4.65,4.18,3.69,3.39,3.18,3.28,3.41,3.27,3.19,3.25,3.58,3.73,2.96,2.5,2.24,2.03,1.78,1.37,0.89,0.57,-0.12,-0.39,-0.05,-1.73,-2.85,-4.0,-4.25,-4.59,-2.42,-1.46,-0.94,0.36,1.04,2.0,4.36,4.63,1.71,2.62,-0.13,-0.08,1.43,3.85,0.77,-0.26,-1.05,-1.43,-1.46,0.24,-3.3,-3.4,-1.84,-0.58,0.49,1.53,1.2,-0.19,-2.7,-2.67,-1.4,0.96,-0.62,-1.08,1.45,0.32,-1.3,-1.27,-4.38,-4.21,-4.17,-2.96,-2.63,-3.42,-2.64,-2.22,-3.04,-1.85,-1.52,-1.12,-1.54,0.03,-0.64,-1.84,-1.1,1.07,0.55,-1.93,2.96,3.56,3.47,2.71,0.49,3.2,4.8,-1.94,-5.0,-6.67,-7.82,-8.41,-7.5,-7.42,-6.45,-6.05,-4.79,-3.97,-3.11,-1.79,0.34,3.35,2.2,0.21,-1.78,4.1,5.58,3.18,3.38,4.71,2.44,4.46,3.04,2.9,0.86,-0.78,-0.13,-3.33,-9.64,-4.32,3.83,3.75,-7.98,-1.77,3.85,-0.73,-11.14,-5.11,1.43,5.36,7.23,5.81,6.26,8.01,10.88,11.84,12.28,12.48,13.89,14.15,15.33,14.3,13.25,14.01,12.28,10.95,10.1,10.51,4.68,5.79,-1.38,-0.29,-1.1,-0.73,0.78,3.23,5.12,3.25,2.05,3.6,1.95,-1.17,-2.59,-2.29,-1.32,-0.05,0.57,0.62,2.34,4.07,5.97,7.55,8.33,11.25,11.5,8.75,12.78,8.79,10.48,15.7,19.48,21.96,23.37,23.71,22.94,20.57,18.48,17.66,15.68,10.58,8.99,5.08,3.12,3.2,4.49,5.27,6.91,8.07,6.2,-0.73,-5.79,-8.29,-8.93,-7.52,-7.14,-6.4,-4.23,-2.33,-1.26,-0.72,1.86,4.68,6.51,6.57,6.73,7.73,8.75,9.64,10.34,10.83,10.65,10.66,11.05,11.19,11.46,10.31,10.86,10.84,11.03,11.16,11.03,11.73,12.42,12.97,13.11,12.66,14.31,12.76,11.18,11.18,10.37,9.77,7.71,8.1,5.38,3.3,3.71,3.36,2.55,2.38,2.13,2.37,1.84,1.68,0.6,0.62,0.29,-0.04,-0.61,-1.11,-0.91,-1.08,-1.1,-0.26,-0.12,-1.04,0.02,-1.69,0.64,0.77,0.72,-1.78,0.23,0.46,2.6,-0.45,3.41,2.38,1.36,-1.23,-1.04,-1.51,-4.46,-2.74,-2.84,-2.49,-1.41,-3.91,-3.41,-2.74,-6.06,-4.62,-4.85,-7.16,-7.75,-7.57,-8.66,-7.56,-7.28,-6.35,-5.96,-5.3,-4.19,-2.12,-4.45,-3.09,-3.33,-2.23,-2.21,-0.85,-0.01,-0.72,-0.27,-0.99,-0.06,-0.13,0.46,0.43,1.08,1.33,1.44,1.06,-1.22,-2.15,-2.84,-3.09,-2.95,-2.31,-2.11,-2.49,-3.0,-4.25,-3.74,-3.6,-3.02,-2.8,-1.89,-3.18,-4.29,-3.55,-3.49,-1.93,-1.18,-3.01,-1.81,-0.74,-0.34,4.88,5.91,5.35,4.55,5.37,4.27,3.95,3.65,3.04,2.39,1.81,1.83,1.41,1.22,1.62,2.06,2.32,1.98,1.47,0.62,-0.3,-0.66,-0.66,-0.59,-0.45,-0.57,-0.9,-1.67,-2.08,-2.25,-3.39,-4.56,-5.7,-6.17,-6.15,-4.34,-1.35,-0.57,-0.89,0.5,-3.39,-0.78,3.85,6.35,5.81,1.53,2.2,4.23,3.58,0.36,-1.45,-2.27,-2.83,-2.26,-0.14,1.58,1.28,-2.8,-2.71,-1.93,0.08,0.99,1.37,-1.53,-1.54,-1.73,0.53,-0.74,-1.25,-2.78,-2.67,-4.12,-5.45,-4.25,-1.47,1.0,1.19,1.18,1.05,-1.12,-0.41,-0.16,0.23,-0.79,-1.96,0.41,1.02,-0.09,0.92,-1.58,-2.69,-0.6,2.84,-1.09,5.33,3.48,3.11,2.83,4.62,7.88,4.26,-1.5,-4.1,-6.49,-8.22,-9.19,-9.06,-8.31,-8.25,-7.71,-7.24,-3.52,-1.33,-1.26,0.98,-1.18,-2.12,-1.35,5.03,3.94,1.53,4.18,2.13,4.38,-2.77,-4.7,-5.11,-3.52,-4.53,-5.54,-1.73,-0.86,-8.06,-6.9,-5.23,-6.59,-6.31,-1.37,3.19,10.28,14.0,16.02,14.81,14.3,6.17,3.59,6.77,9.7,10.93,11.93,11.93,11.42,10.55,9.3,9.5,10.01,7.82,9.54,10.34,5.65,5.49,2.58,0.24,0.15,-1.12,-2.11,0.43,2.46,5.88,6.14,4.78,6.66,6.08,-0.61,-1.62,-4.68,-4.29,-3.82,-3.19,-2.35,-1.5,-0.03,2.7,5.24,8.62,10.92,12.53,12.25,14.04,16.64,15.65,13.6,11.08,16.43,18.79,19.97,21.71,21.46,20.37,18.76,17.46,16.04,12.04,9.83,7.81,4.22,4.19,4.46,5.33,6.77,7.52,7.94,4.41,-1.03,-5.02,-7.38,-7.8,-6.0,-6.27,-4.44,-3.29,-1.6,-0.58,-0.7,2.57,4.81,6.28,6.87,6.95,7.44,8.35,9.36,10.06,10.38,10.87,10.5,10.87,11.04,11.33,11.23,10.82,11.09,11.26,11.28,11.53,11.73,12.03,11.75,12.7,11.66,11.59,9.82,9.32,9.12,8.64,7.7,6.23,3.99,3.88,3.28,2.31,2.08,2.42,2.97,2.4,2.0,1.48,0.26,-0.08,-0.68,-1.28,-1.66,-1.86,-1.67,-1.7,-1.58,-0.83,-0.44,-0.66,1.23,-0.11,-0.92,-0.9,-0.32,-2.05,-0.21,-0.28,0.49,-2.14,-2.76,1.02,-1.03,-0.41,-0.82,0.95,1.76,0.3,-1.91,-1.78,-2.23,-3.34,-1.72,-4.41,-5.53,-6.19,-5.26,-6.7,-8.88,-7.72,-9.27,-7.49,-7.25,-7.63,-7.4,-6.91,-5.36,-3.57,-3.71,-4.58,-4.24,-3.45,-2.2,-0.97,-0.9,-0.7,0.18,-0.48,-0.79,0.02,0.18,-0.34,-1.38,-4.14,-2.87,-3.74,-4.36,-5.15,-5.41,-4.48,-4.0,-3.83,-4.16,-4.67,-6.89,-7.97,-7.42,-7.64,-6.77,-5.82,-5.94,-6.53,-7.18,-7.56,-7.12,-6.81,-6.87,-6.03,-3.62,4.12,6.41,4.66,4.61,5.14,4.05,3.44,2.87,2.35,1.69,0.95,0.23,0.01,0.19,0.05,0.55,-0.33,-0.34,-0.69,-1.18,-1.68,-2.13,-2.61,-2.86,-2.98,-3.02,-3.11,-2.69,-2.58,-2.8,-3.03,-3.43,-4.36,-5.75,-7.19,-7.88,-7.45,-3.55,-1.76,0.01,-3.81,0.26,1.33,0.57,-0.22,1.57,0.24,0.45,0.3,-1.3,-1.21,-2.43,-3.73,-4.36,-3.02,-2.26,-1.99,-1.49,-0.2,0.61,0.85,-1.91,-1.82,-0.54,-0.92,0.62,-1.91,-1.92,-0.93,0.96,-2.29,-5.9,-5.35,-3.37,-1.69,-0.9,-0.54,2.0,2.62,4.99,4.49,5.29,3.28,3.11,0.92,1.59,1.37,1.57,0.86,1.39,-2.24,1.99,0.06,-2.62,-2.81,1.57,-0.56,1.55,2.1,1.69,1.72,3.74,3.14,1.47,0.17,-3.04,-5.89,-7.08,-7.01,-7.65,-5.94,-3.81,-4.99,-5.16,-1.66,-0.02,1.49,1.53,0.45,0.62,5.09,9.73,11.62,7.88,7.86,0.06,0.23,-0.82,1.29,4.21,7.34,9.99,10.89,9.47,5.0,-6.57,-9.95,-2.05,8.98,12.07,12.48,12.58,14.03,14.46,13.35,11.02,9.61,8.85,8.33,9.32,8.94,9.7,9.68,10.64,10.17,11.57,10.87,8.64,7.37,8.15,7.77,7.24,-1.57,-2.2,-1.57,-5.36,-4.99,-4.04,0.92,3.2,1.21,1.22,1.87,3.53,-1.06,-0.67,2.84,2.16,-1.78,-5.5,-4.96,-2.77,-1.08,-0.38,2.27,4.89,5.62,5.46,5.22,9.52,12.66,14.86,16.42,17.13,16.22,15.62,15.18,16.56,17.63,17.83,17.52,16.57,16.23,16.9,14.37,12.59,8.43,4.47,4.22,4.41,5.45,6.39,8.12,8.4,6.81,4.27,-1.19,-4.86,-5.84,-4.44,-4.51,-4.26,-3.07,-1.74,-0.36,0.44,1.46,3.36,4.77,5.88,6.72,6.94,7.44,8.58,9.42,9.76,9.81,10.0,10.54,10.85,10.68,10.86,10.85,10.98,11.1,10.97,10.72,10.71,11.44,11.95,10.3,9.6,8.64,9.57,8.41,8.4,6.93,6.86,4.1,3.34,2.9,2.02,2.03,1.77,2.04,2.28,1.58,2.35,1.76,-0.89,-1.12,-1.73,-2.18,-2.33,-2.52,-2.15,-2.01,-1.76,-0.88,0.05,0.34,0.84,0.72,-1.44,1.55,-0.96,1.18,0.21,-1.54,-2.13,0.55,-1.11,-1.81,2.51,-1.09,0.82,-1.17,-2.48,0.26,1.3,-0.15,-0.91,-0.16,-0.19,-1.73,-3.48,-5.52,-4.87,-5.9,-6.95,-8.16,-8.75,-7.24,-7.35,-6.32,-6.76,-6.71,-7.32,-6.2,-5.5,-5.61,-6.04,-4.8,-3.12,-0.78,-0.71,0.04,1.22,0.23,-1.5,-0.93,-0.8,-5.81,-7.76,-7.69,-8.52,-6.86,-6.48,-8.32,-8.77,-8.4,-6.95,-6.1,-5.25,-6.32,-10.2,-10.22,-10.15,-9.98,-9.44,-9.43,-9.08,-9.05,-11.13,-4.99,3.32,3.21,6.41,5.99,3.89,5.67,5.3,3.78,4.99,4.51,2.68,1.95,1.39,0.74,-0.23,-0.93,-1.11,-0.92,-0.88,-0.89,-0.99,-2.01,-2.66,-3.23,-3.76,-3.9,-3.97,-4.03,-4.11,-4.68,-4.5,-4.18,-4.07,-4.03,-3.98,-4.27,-4.37,-4.61,-5.49,-6.48,-7.01,-5.07,-2.35,-0.46,0.3,0.39,-0.55,0.81,1.77,1.14,1.42,0.67,-1.97,-3.56,-3.7,-4.88,-5.67,-5.39,-4.83,-4.17,-3.42,-4.01,-3.02,-1.95,-0.94,-1.39,-1.05,-0.03,-1.98,-0.85,0.59,0.59,-2.48,-1.58,-0.75,-1.14,-4.31,-3.17,-4.61,-1.57,-1.44,0.15,1.22,2.15,4.7,6.05,4.8,6.5,6.47,2.4,2.43,1.09,2.47,2.64,-0.48,4.26,-1.14,-0.69,0.61,-1.37,-3.55,-2.89,-0.9,1.63,3.27,3.1,3.88,3.6,6.62,4.06,0.89,-0.59,-1.31,1.72,0.77,0.47,-0.34,-0.19,-0.19,0.31,-0.23,-2.35,0.61,1.9,1.37,1.4,3.48,2.31,7.89,12.25,12.41,14.25,12.75,11.81,12.53,13.86,13.8,13.29,13.07,11.61,10.66,8.43,9.54,8.2,5.34,7.13,9.93,8.03,8.38,6.02,4.0,-0.46,7.03,6.21,5.88,7.23,7.13,4.52,4.78,9.17,9.36,8.76,6.32,8.74,2.94,-1.17,-1.39,-2.58,-4.07,-1.52,-2.38,-1.27,1.17,2.87,6.1,3.96,2.78,4.45,3.9,0.69,-0.82,2.08,5.38,3.81,4.44,1.57,-4.71,-3.37,2.56,1.3,2.38,4.29,5.39,8.25,5.35,7.58,12.46,15.27,17.05,17.96,17.89,17.81,17.17,16.49,15.77,15.44,15.68,16.74,17.42,15.92,11.36,8.22,6.24,5.35,4.88,5.42,7.04,7.47,7.24,7.1,4.3,1.42,-2.77,-3.6,-2.62,-1.68,-1.39,-2.59,-2.21,-0.97,0.06,0.69,2.23,4.0,4.44,5.42,6.71,6.85,7.59,8.52,9.04,9.26,8.75,9.19,10.21,10.7,10.82,10.46,10.09,10.11,9.9,10.05,10.2,10.18,10.02,10.05,7.72,8.36,7.59,7.77,6.11,7.28,4.62,3.28,2.5,1.84,1.58,1.63,1.63,1.51,1.9,1.13,1.75,1.38,-2.43,-2.04,-2.66,-3.05,-2.96,-2.84,-2.66,-2.28,-1.72,-0.72,0.07,0.99,2.56,6.3,0.09,1.79,0.47,0.2,3.27,3.42,2.82,-1.07,-0.95,-2.15,-1.44,-1.22,1.5,-2.26,0.21,-0.29,1.35,0.09,1.63,1.32,0.89,1.48,0.38,-3.06,-2.5,-1.87,-4.87,-8.33,-6.54,-6.05,-4.6,-3.95,-3.61,-5.13,-4.81,-4.5,-4.59,-4.62,-5.08,-5.21,-2.92,-1.48,-0.99,0.29,-0.28,-0.1,-1.66,-1.62,-2.65,-4.86,-6.89,-9.51,-8.66,-7.59,-9.19,-10.67,-10.58,-10.26,-8.63,-8.58,-6.03,-4.5,-7.91,-10.1,-11.81,-9.73,0.25,4.64,1.81,6.16,8.03,6.87,7.76,6.75,5.57,4.72,3.06,3.75,4.02,4.16,3.65,2.39,1.47,0.79,-0.07,-0.99,-1.47,-2.01,-1.93,-1.68,-1.89,-2.52,-3.47,-3.92,-3.84,-4.3,-4.95,-5.44,-5.36,-5.35,-5.35,-5.1,-4.97,-4.99,-5.13,-5.08,-5.09,-5.13,-4.87,-4.58,-4.54,-4.42,-3.82,-2.49,1.46,1.37,0.42,1.69,0.52,1.5,2.07,3.45,2.52,-0.49,-1.25,-1.83,-3.2,-4.85,-5.55,-5.21,-4.64,-5.67,-6.66,-5.22,-4.0,-2.86,-1.09,0.1,0.62,-2.01,-4.44,-1.52,0.32,0.89,-1.42,-3.28,-0.58,-1.29,-1.43,-4.48,-2.7,-2.44,-1.94,-2.09,-0.34,-0.02,1.6,1.74,2.63,1.54,1.0,-0.16,-0.62,-0.47,-1.85,-0.8,1.83,1.53,-2.03,0.8,1.14,0.38,-3.1,-2.31,-0.15,1.82,2.73,3.46,3.01,2.46,-1.56,-1.74,3.75,4.28,3.62,3.91,3.03,-0.18,0.99,1.32,-1.98,-1.15,0.36,2.09,0.23,1.09,1.67,0.83,2.26,2.93,-1.62,3.23,6.72,8.72,9.75,10.51,10.81,11.47,11.76,9.42,3.54,5.21,7.37,5.28,4.68,5.19,6.44,5.41,5.38,7.07,7.22,9.21,9.22,5.77,2.17,3.07,0.36,1.11,-0.44,0.54,-0.82,4.07,6.98,4.47,2.52,3.86,4.24,-3.18,-1.58,-0.41,-0.21,-2.21,-4.74,-0.77,-3.07,-2.22,1.92,5.01,4.13,5.08,4.59,7.12,2.63,0.42,3.15,5.71,6.55,7.85,3.89,2.36,3.2,1.14,2.68,4.19,2.47,6.43,10.02,11.86,11.33,11.21,13.67,15.88,17.5,17.85,17.62,17.83,17.45,16.86,15.87,16.04,15.8,13.94,9.54,7.51,7.18,6.31,5.96,6.86,6.89,6.89,6.62,4.33,2.81,1.22,-0.8,-2.24,-1.59,-1.07,-0.1,-1.11,-1.92,-1.25,-0.8,0.2,0.98,2.93,3.84,4.85,5.45,5.95,6.23,6.76,7.32,7.87,8.4,8.59,9.0,9.66,10.11,9.99,9.42,8.64,8.86,8.69,8.22,8.27,8.61,8.02,6.62,6.41,6.69,5.57,6.82,4.98,3.35,2.31,1.84,1.18,1.02,1.32,1.08,0.79,1.78,0.43,-0.12,0.1,-2.94,-2.79,-3.04,-3.48,-3.51,-3.16,-2.72,-2.4,-1.82,-0.61,0.65,1.87,4.66,7.89,8.33,1.62,1.07,-0.09,3.65,4.6,5.77,-1.65,0.32,-1.49,-0.44,0.56,1.41,1.07,-0.84,-0.24,2.17,0.59,1.75,2.75,3.24,2.49,3.04,3.03,2.63,2.98,-1.7,-3.38,-3.17,-5.53,-3.39,-2.59,-2.64,-3.63,-3.85,-4.2,-2.67,-2.66,-4.03,-4.01,-3.29,-1.86,-0.91,-0.16,-1.16,-1.4,-1.28,-2.91,-2.32,-1.25,-1.98,-6.49,-5.04,-9.42,-10.31,-12.96,-11.56,-10.99,-9.85,-8.63,-9.98,-8.87,-3.55,6.13,9.59,8.91,7.74,6.3,5.62,5.58,5.11,4.47,4.51,4.48,4.36,3.76,3.41,4.16,3.08,2.39,1.02,0.57,-0.54,-1.09,-1.86,-2.52,-2.92,-2.93,-2.95,-3.16,-3.26,-4.1,-4.91,-5.66,-6.13,-5.19,-5.3,-5.68,-6.16,-6.28,-6.03,-5.7,-5.53,-6.01,-6.01,-5.79,-5.89,-5.5,-5.36,-4.99,-4.34,-3.73,-2.8,-1.34,-0.36,1.13,0.02,1.31,0.8,0.31,0.5,1.05,1.7,-2.26,-2.38,-1.85,-0.63,1.08,0.84,-1.07,-0.22,-1.6,-1.64,-1.31,-1.97,-1.77,-4.99,-1.35,-1.32,-4.65,-3.74,-2.21,-0.11,0.62,0.47,-2.17,-0.73,-4.39,-2.44,-4.01,-2.52,-2.34,-0.37,0.31,1.0,0.74,-0.62,1.74,-0.65,1.08,1.81,1.04,0.53,2.51,1.23,-0.39,-0.35,-1.15,2.2,0.92,3.17,0.78,-3.15,0.4,0.27,4.17,5.05,3.83,2.12,0.81,-4.34,-2.76,-5.42,-0.65,2.57,2.91,0.12,-4.76,-4.56,-5.74,-3.71,-2.27,1.03,-0.08,1.78,1.68,1.78,1.17,1.43,1.77,1.4,-1.18,-1.47,1.57,4.87,6.24,6.65,6.87,4.26,5.42,4.92,7.71,8.02,7.16,8.19,5.11,3.47,3.97,5.9,9.34,10.68,9.4,11.68,5.6,8.74,2.96,3.02,-1.36,-1.14,1.06,1.44,3.65,5.09,3.9,5.29,4.78,3.78,-1.44,-1.52,1.06,3.4,4.16,3.47,2.5,0.62,3.23,3.87,4.98,4.78,3.18,7.51,9.35,9.01,3.26,5.33,9.45,9.7,9.27,4.14,2.85,3.94,1.6,0.46,3.76,2.96,-0.66,4.72,9.37,10.64,11.2,11.03,11.99,13.95,15.26,15.38,15.37,15.1,14.6,14.34,14.55,14.22,10.72,7.82,6.94,5.95,5.98,6.86,6.35,6.54,7.3,5.29,3.21,2.42,1.3,-0.21,-1.29,-1.51,-0.81,-0.02,-0.75,-1.88,-1.46,-1.06,0.31,0.84,1.62,2.74,3.53,4.24,4.53,4.66,5.11,5.55,5.98,6.53,7.05,7.72,8.65,8.94,8.88,8.71,8.05,7.44,7.04,6.92,6.95,6.27,5.82,4.94,4.97,4.74,6.4,4.05,3.05,2.4,1.77,1.41,0.9,0.65,0.44,-0.12,0.08,0.5,-0.96,-1.85,-3.08,-3.42,-3.22,-3.03,-3.26,-3.32,-3.24,-3.03,-2.51,-1.48,-0.35,1.09,2.75,5.91,8.83,10.22,5.13,5.02,5.79,1.11,1.45,0.95,1.17,0.66,-4.62,0.2,5.32,3.03,1.94,-0.05,0.79,-0.68,0.73,2.02,2.53,3.88,2.64,2.08,3.67,3.69,4.94,3.89,-2.52,-3.15,-6.61,-3.48,-4.59,-4.62,-4.28,-3.29,-3.78,-3.11,-2.83,-3.09,-2.72,-2.04,-0.97,-0.66,-3.31,-3.25,-2.42,-1.22,-2.37,-0.48,0.94,0.52,-1.59,-2.61,-3.34,-1.49,-0.45,0.28,0.29,5.7,6.92,5.45,5.07,5.71,6.37,6.99,6.41,5.55,4.81,4.54,3.73,2.93,2.42,2.2,1.65,1.63,1.72,2.84,2.26,0.42,-0.1,-1.29,-2.0,-2.39,-2.8,-3.46,-3.93,-4.05,-4.44,-4.88,-4.99,-4.61,-5.8,-6.83,-7.26,-7.49,-7.55,-7.41,-7.33,-7.1,-6.91,-6.91,-6.79,-6.75,-6.86,-6.68,-6.49,-6.31,-5.95,-5.71,-5.28,-4.71,-3.89,-2.8,-1.96,-0.91,-0.57,0.22,-0.09,0.67,0.72,0.99,-0.47,-2.4,-0.82,1.21,1.45,-0.09,-1.69,1.15,0.46,-1.6,-1.24,-0.95,-1.14,-2.85,-1.91,-1.0,-4.75,-4.26,-3.99,-3.51,-2.37,-0.78,0.78,0.14,-1.86,-8.16,-7.25,-6.27,-8.74,-6.82,-5.0,-6.65,-4.7,-1.47,-1.03,-3.58,-1.4,1.04,2.2,3.87,5.9,5.84,6.27,4.26,3.68,0.76,-2.44,-0.08,2.71,3.13,1.92,3.12,1.85,4.0,1.55,-0.48,-0.45,-3.01,-2.71,-5.86,-2.73,-7.23,-4.07,-2.12,0.05,0.28,-5.02,-1.67,-2.08,-0.24,-1.2,3.29,1.27,2.74,1.59,0.8,0.34,2.26,1.77,2.16,1.03,0.64,0.88,0.25,0.03,4.13,3.22,5.1,5.3,4.9,6.89,6.01,5.11,4.46,3.84,3.21,0.93,3.81,4.77,4.66,7.35,11.59,6.76,6.75,3.61,2.65,-1.81,-0.78,3.12,-0.94,3.0,3.02,2.41,3.16,4.76,3.97,-2.08,1.6,3.3,4.16,6.29,5.17,0.32,0.91,1.73,3.37,4.31,4.12,2.38,6.07,7.9,6.38,3.98,9.08,10.17,12.03,10.71,0.51,-1.09,2.15,3.2,-4.73,2.3,-4.06,-0.01,3.69,6.14,7.54,9.11,10.7,11.59,12.51,13.3,13.27,13.49,13.68,13.92,13.62,11.81,7.91,6.18,6.1,5.25,5.45,7.1,6.47,6.31,7.18,7.17,4.77,3.17,3.19,1.73,0.67,-0.74,-1.45,-1.15,-0.52,-0.17,-0.87,-1.46,-1.53,-1.14,0.03,0.71,1.45,1.69,2.65,3.16,3.6,4.05,4.37,4.51,5.18,5.67,5.95,6.98,7.26,6.9,6.53,6.11,5.95,5.94,5.91,5.13,4.28,3.39,2.95,4.12,5.66,4.46,3.03,2.03,1.54,0.85,0.24,0.02,-0.23,-0.63,-1.02,-0.99,-0.89,-1.73,-2.75,-3.8,-4.21,-3.82,-3.2,-2.94,-2.66,-2.32,-2.27,-2.16,-1.33,-0.05,1.37,3.04,5.5,7.65,9.9,4.78,0.23,3.56,2.05,5.42,1.29,-0.46,2.75,-2.69,0.53,3.23,1.42,2.94,6.23,4.47,2.07,-0.92,0.43,2.54,-0.11,1.58,2.41,4.26,3.56,5.16,5.33,4.12,-1.08,1.55,-2.46,-3.27,-2.31,-2.2,-2.87,-2.64,-2.08,-1.61,-1.78,-1.25,-1.87,0.4,-0.77,-0.62,-3.22,-3.63,-2.36,-1.26,0.9,1.53,2.68,4.75,7.6,7.38,6.82,7.01,6.87,6.43,6.04,5.94,5.37,4.89,4.56,4.93,4.83,4.36,3.91,3.96,3.32,2.38,1.69,0.94,-0.34,-0.37,0.22,1.2,1.07,-0.3,-1.29,-2.31,-3.1,-3.49,-3.45,-3.93,-4.52,-5.04,-5.45,-6.14,-6.4,-6.35,-6.25,-6.96,-7.47,-7.59,-7.83,-8.4,-8.73,-8.71,-8.16,-7.6,-7.49,-7.53,-7.61,-7.6,-7.3,-6.79,-6.37,-5.69,-5.48,-5.15,-4.26,-3.15,-2.08,-1.62,-1.59,-4.93,-4.49,-2.82,-2.43,-2.97,-3.18,-3.25,-3.39,1.12,0.95,0.59,0.43,-1.58,-3.45,-1.99,-0.66,-4.81,-3.16,-3.19,-3.66,-3.38,-3.52,-4.72,-3.67,-3.31,-3.48,-2.57,-1.14,-0.29,-0.23,-3.93,-4.22,-3.46,-4.31,-1.86,-4.74,-5.97,-4.81,-3.76,-2.81,-1.62,-3.43,-1.64,-0.82,1.35,3.0,3.81,3.66,4.19,2.8,3.24,3.2,2.26,0.68,1.55,1.87,2.68,1.5,5.86,4.22,3.28,1.0,0.73,-1.45,-3.17,-5.31,-8.9,-5.47,-4.33,-3.08,-2.27,-1.02,-1.19,-0.89,0.06,0.38,0.56,1.06,0.69,0.08,1.43,-0.02,-0.23,-0.82,-0.75,0.1,1.57,1.27,0.13,2.71,2.74,3.02,2.67,2.22,3.19,3.96,2.02,1.52,1.32,3.48,2.96,4.24,4.84,5.23,5.84,6.09,5.24,2.89,3.83,5.6,3.76,0.58,2.07,-0.93,2.11,2.93,0.63,0.93,0.92,1.0,1.75,1.62,2.08,3.55,5.13,5.07,4.82,4.73,1.04,-0.05,1.69,2.94,3.46,3.53,2.52,4.52,1.76,4.17,5.55,6.99,7.54,3.56,2.52,2.65,2.17,1.79,5.01,0.14,3.97,5.62,1.65,2.23,3.48,4.84,6.91,8.69,10.41,11.63,12.94,13.55,13.85,13.71,13.12,12.45,11.8,9.34,6.48,4.25,5.65,7.83,6.33,5.96,7.7,6.89,5.96,3.47,2.18,2.15,1.12,0.04,-0.84,-1.68,-1.97,-1.75,-1.57,-1.18,-1.11,-1.86,-2.15,-1.56,-0.9,0.0,0.28,0.77,1.55,2.14,2.74,2.88,3.05,3.41,3.97,4.48,4.7,4.53,4.12,3.79,3.95,4.4,4.13,3.34,2.72,2.32,1.29,4.03,4.86,3.47,3.01,2.3,1.54,0.99,0.53,-0.1,-0.54,-1.08,-1.27,-1.71,-1.84,-1.93,-2.31,-3.09,-4.16,-4.58,-4.23,-3.8,-3.4,-2.5,-1.56,-1.0,-0.89,-0.65,0.3,1.63,2.93,4.77,6.04,7.17,6.43,7.08,-0.61,1.86,5.55,12.9,7.72,9.68,2.77,1.3,-0.51,4.76,6.06,5.89,7.78,5.5,4.52,2.18,-4.27,-1.23,1.79,2.59,4.46,2.65,4.25,1.61,2.75,-0.04,-2.0,-2.45,-2.93,-0.32,-2.25,-2.77,-2.97,-1.77,-1.57,-0.88,-1.23,-0.86,-1.58,-0.42,0.19,-0.58,-1.87,-2.09,-2.57,-0.83,1.02,3.51,6.04,6.3,6.67,5.71,5.21,5.29,4.71,3.89,4.0,4.2,3.94,3.99,3.51,3.04,2.84,2.87,2.27,1.64,1.39,1.16,0.19,-0.62,-0.91,-0.77,-0.87,-1.47,-2.44,-3.11,-3.82,-4.15,-4.12,-4.38,-5.04,-5.39,-6.53,-6.81,-7.4,-7.64,-7.88,-7.77,-8.1,-8.16,-7.84,-7.67,-8.18,-8.99,-9.58,-9.42,-8.87,-7.98,-7.76,-7.69,-8.1,-7.66,-7.01,-6.34,-5.39,-5.11,-4.09,-3.51,-2.23,-0.86,0.34,-0.03,-3.24,-2.46,-0.51,-0.08,0.65,-0.06,0.9,1.73,-0.22,0.62,-1.25,-3.87,-5.59,-5.81,-7.16,-9.54,-9.44,-8.53,-6.91,-6.22,-5.2,-4.92,-5.37,-4.08,-2.61,-2.52,-1.79,-1.22,-1.08,-1.03,0.78,2.61,6.2,2.7,-3.04,-3.41,-4.28,-3.93,-2.09,-2.1,-3.72,-3.33,-2.32,-0.57,1.87,-0.08,1.41,2.6,0.11,-0.09,2.02,2.08,1.11,0.39,1.34,0.61,2.04,3.27,2.53,1.8,2.67,3.43,1.66,1.34,4.61,2.45,-1.33,-1.07,-4.85,-3.39,-1.5,-0.18,1.11,0.55,-0.44,0.31,1.01,-0.05,-0.03,-0.72,0.8,1.11,-0.21,0.32,-1.08,-0.45,1.36,1.23,1.43,0.76,0.55,1.08,2.27,1.5,-0.64,-1.27,-1.02,0.46,1.7,-0.64,-0.27,1.52,1.3,2.6,2.05,4.38,2.86,5.64,1.94,2.18,4.48,0.5,0.25,-1.08,0.32,1.2,-0.83,-0.07,-0.48,1.27,0.2,0.42,3.61,4.45,5.18,5.06,4.39,3.49,4.15,-1.4,0.91,1.79,2.2,2.6,3.24,0.49,2.77,2.33,5.32,1.87,0.99,3.66,2.07,0.48,2.1,2.91,7.62,6.81,4.03,0.34,1.93,1.05,2.64,3.64,5.01,6.48,8.13,9.43,10.43,11.11,11.48,11.5,10.79,10.19,9.86,9.44,6.97,6.63,7.38,6.38,6.53,7.13,6.71,6.6,5.19,2.28,1.89,1.33,0.11,-1.2,-2.26,-2.72,-2.72,-2.69,-2.76,-2.44,-2.67,-2.65,-2.92,-2.84,-2.33,-1.79,-0.98,-0.74,-0.21,0.19,0.54,0.73,1.18,1.66,1.95,1.86,1.83,1.88,1.99,1.8,2.2,2.18,1.48,1.33,0.53,0.33,4.59,4.79,2.81,2.41,2.51,1.69,0.85,0.17,0.85,-0.48,-1.27,-2.69,-1.24,-2.3,-2.37,-3.27,-3.57,-3.79,-4.63,-4.37,-3.72,-3.19,-2.99,-3.15,-2.95,-1.35,-0.39,-0.06,0.66,1.74,2.33,3.86,5.33,6.44,7.02,7.14,10.46,0.28,-0.58,1.91,2.66,2.4,2.77,-0.06,0.37,-0.01,0.26,3.16,1.49,1.9,4.13,3.9,-0.01,-5.4,-0.83,0.4,2.2,3.22,3.16,2.76,0.51,-2.13,-3.15,-2.3,0.0,-0.58,-0.97,-0.94,-2.77,-2.41,-1.89,-1.31,0.45,1.52,-0.41,0.31,0.22,-0.86,-2.21,-3.91,-3.23,-1.89,0.2,2.18,3.62,4.09,4.75,4.3,4.23,3.69,2.85,1.87,1.89,2.95,3.41,2.79,2.28,1.67,0.87,0.35,0.83,1.42,1.84,1.58,0.16,-1.16,-1.86,-2.31,-2.51,-3.9,-3.93,-4.25,-4.26,-4.53,-4.71,-5.47,-5.9,-6.36,-6.96,-7.85,-8.36,-8.69,-9.32,-9.68,-9.63,-9.25,-8.73,-8.4,-8.37,-8.45,-8.66,-9.58,-9.87,-9.23,-7.98,-7.47,-7.33,-7.1,-6.7,-6.0,-5.3,-4.36,-3.29,-2.32,-1.09,-0.26,0.42,0.75,1.71,1.29,1.1,1.35,1.7,0.9,1.49,1.05,1.03,-0.38,-4.29,-5.75,-5.55,-5.79,-6.68,-8.03,-7.6,-6.88,-9.65,-4.34,-5.4,-6.8,-6.15,-4.85,-2.0,-2.48,-2.38,-2.3,-2.19,-0.68,5.91,10.71,10.26,5.0,-1.51,-4.37,-4.64,-3.82,-2.98,-3.05,-3.62,-2.11,-1.25,-0.77,0.98,-0.26,-0.51,0.62,0.95,2.56,3.18,2.91,2.83,2.14,2.91,0.22,-0.11,0.69,2.46,3.15,5.63,0.53,0.47,3.79,2.19,-0.94,0.24,1.22,-2.58,0.51,-1.15,-1.16,1.75,-0.25,0.11,0.99,2.14,4.89,-1.35,-0.51,-1.78,0.61,1.3,1.4,1.43,-1.45,2.32,0.71,-1.08,0.43,0.93,1.11,1.39,0.51,-0.72,-2.87,-1.91,-2.13,0.4,0.38,-0.3,0.42,-0.11,-0.43,1.39,1.57,3.1,5.03,4.23,0.55,1.12,3.09,-0.5,-1.05,1.5,0.87,0.79,2.17,0.59,2.15,2.47,3.51,3.75,3.12,4.2,4.18,3.16,2.22,3.05,-1.02,-1.19,0.26,0.71,1.52,1.1,3.14,2.28,1.32,1.24,1.79,-2.56,2.58,4.0,4.82,6.55,4.46,4.44,4.47,3.59,-0.3,-0.65,0.83,0.84,1.49,2.81,4.0,5.41,6.63,7.36,7.72,7.97,7.56,5.47,5.12,6.7,6.7,7.19,6.41,5.23,5.42,6.96,7.06,7.21,6.81,3.6,2.3,1.3,0.38,-1.1,-1.84,-3.24,-3.49,-3.62,-3.99,-3.9,-3.84,-3.69,-4.1,-3.85,-4.08,-3.8,-3.27,-2.74,-2.26,-2.17,-2.22,-1.86,-1.19,-0.62,-0.33,-0.51,-0.79,-0.68,-0.42,-0.58,-0.38,-0.2,0.0,-0.28,-0.8,0.31,4.68,4.45,3.14,1.6,1.87,1.72,1.06,0.15,0.26,1.02,-1.05,-2.46,-2.65,-3.37,-3.83,-3.9,-4.1,-4.09,-4.61,-4.54,-4.4,-3.51,-2.72,-2.2,-1.42,-1.35,-0.48,0.37,1.02,1.04,1.21,1.88,3.13,4.5,6.03,7.04,8.1,8.68,7.65,3.8,-0.49,4.53,2.55,2.24,3.15,2.84,1.23,0.51,0.78,2.3,2.0,-2.56,4.41,1.38,-3.03,-5.71,-3.81,-1.74,0.39,1.97,3.31,1.23,-2.5,-2.96,-1.04,0.01,-0.59,-0.94,-0.46,-1.63,-1.96,-1.72,-0.25,-0.24,-2.25,-1.86,-0.29,-0.48,-2.35,-4.4,-4.52,-4.23,-2.0,-0.19,1.66,2.58,4.05,2.88,3.8,2.87,2.65,1.37,0.05,0.22,2.04,2.28,0.97,0.53,-0.49,-1.36,-2.05,-1.07,-0.5,-0.02,-0.25,-1.36,-2.26,-2.9,-4.05,-4.63,-4.82,-4.64,-4.34,-4.66,-5.03,-5.42,-6.02,-6.35,-6.98,-7.46,-8.28,-9.4,-10.54,-11.09,-11.1,-11.11,-10.84,-10.4,-9.74,-9.09,-8.85,-8.64,-8.39,-8.48,-9.24,-9.2,-8.44,-7.78,-7.2,-6.86,-5.32,-4.57,-3.63,-2.83,-2.19,-1.71,-1.3,-1.15,-1.08,-0.14,-0.63,0.27,1.82,-1.0,0.49,0.11,-0.65,-1.15,1.69,2.91,-1.82,-3.14,-5.0,-5.23,-4.71,-4.71,-5.15,-7.34,-2.01,-2.24,-4.04,-2.94,-2.74,-1.69,-1.72,-2.59,-2.42,-1.22,1.29,3.37,3.03,7.43,6.0,-0.34,-5.05,-5.03,-4.51,-3.7,-4.61,-4.25,-3.47,-3.07,-0.2,1.29,-0.85,-1.38,0.18,0.3,-1.17,1.53,3.53,2.47,3.43,3.83,4.33,2.44,0.39,1.96,2.64,2.38,3.56,-0.72,-0.11,5.24,0.08,-0.33,-0.46,-1.96,-1.42,-4.24,-3.68,-4.78,0.28,1.19,4.08,5.61,4.13,-0.02,-1.58,0.75,0.01,0.49,0.44,3.16,1.35,-2.31,0.73,-0.75,0.0,-0.08,1.71,3.43,3.77,0.81,2.43,-1.79,3.46,3.51,2.66,0.88,-0.8,0.93,0.32,-0.46,0.43,0.86,3.27,6.66,6.9,3.36,2.36,-3.63,-1.41,0.49,0.81,1.78,-0.45,-1.94,-3.19,-0.65,2.95,3.83,3.04,3.07,0.82,2.16,1.44,0.55,1.45,-2.26,-0.67,-0.09,0.64,0.78,0.82,1.64,1.25,3.62,1.05,0.03,2.27,3.56,2.17,2.6,3.04,2.91,3.14,1.57,-0.37,-3.38,-4.38,-3.32,-1.48,-0.35,0.96,2.16,3.18,3.96,4.22,4.26,3.76,2.58,3.32,4.41,6.84,6.3,4.03,4.54,6.59,6.91,6.7,5.64,4.7,3.65,2.06,0.5,-0.91,-2.56,-3.77,-4.43,-4.41,-4.82,-4.87,-4.98,-4.55,-4.67,-4.83,-5.44,-5.37,-5.14,-4.81,-4.5,-4.19,-3.87,-3.59,-3.11,-2.69,-2.38,-2.38,-2.67,-2.75,-2.66,-2.7,-2.62,-2.15,-1.84,-2.1,-1.3,0.76,5.43,3.61,2.72,1.69,0.94,0.62,0.48,-0.04,-0.96,-1.82,-2.58,-2.39,-4.03,-4.01,-4.41,-4.88,-5.4,-5.48,-4.68,-4.25,-4.09,-4.37,-3.93,-3.18,-2.2,-2.28,-3.28,-2.76,-2.1,-1.22,-0.11,0.9,1.38,2.22,3.87,5.41,6.18,7.32,7.91,7.99,6.21,3.61,5.09,0.01,0.09,0.28,1.46,1.91,2.43,1.7,2.24,1.36,3.08,2.38,3.3,5.61,3.29,-1.56,-4.13,-1.48,1.15,3.09,2.24,0.46,-0.79,-2.3,2.07,-2.1,-1.37,-1.03,-0.96,-1.08,0.0,0.44,0.21,-5.36,-1.37,-0.41,-2.04,-3.66,-5.24,-5.06,-4.03,-2.21,-1.02,2.42,3.53,1.92,2.53,2.41,2.22,2.29,2.27,0.8,-0.12,0.19,-0.4,-0.64,-0.64,-0.7,-0.97,-3.47,-4.27,-3.04,-2.33,-3.19,-3.33,-3.77,-4.19,-4.79,-5.17,-5.13,-4.77,-5.01,-5.53,-5.49,-5.64,-6.41,-6.48,-6.86,-7.85,-9.79,-10.86,-11.64,-12.15,-12.57,-12.6,-12.46,-11.88,-11.31,-10.88,-9.75,-9.07,-8.93,-8.35,-7.84,-7.86,-8.07,-8.3,-7.94,-6.39,-7.48,-5.56,-4.42,-3.35,-2.72,-2.37,-2.64,-3.96,-1.8,-0.93,0.98,-0.55,0.53,-0.61,-0.97,-1.39,-0.55,3.91,3.18,2.66,1.97,2.84,1.54,-1.9,-0.86,-6.34,-4.59,-4.41,-7.46,-6.03,-5.19,-2.96,-1.75,-0.88,-0.26,0.36,0.6,1.74,3.19,4.2,5.8,5.73,4.29,-0.27,-1.29,-2.75,-4.33,-3.06,-1.78,-2.94,-4.91,-1.77,-0.65,1.61,0.8,0.98,-1.28,-2.83,-3.65,-0.6,-1.21,-0.4,1.36,2.67,3.91,4.44,3.32,1.96,1.86,3.26,2.69,3.12,7.29,0.26,4.46,-2.04,-1.15,-2.92,-2.55,-1.38,-2.63,-1.06,-0.55,-0.04,2.41,4.21,2.58,0.7,0.15,1.33,3.53,3.24,1.03,1.01,4.66,1.94,0.56,-0.93,-0.88,-0.03,0.97,0.57,5.61,6.73,4.85,4.96,4.4,5.56,5.47,0.96,-0.23,0.97,1.27,2.05,1.3,2.8,3.6,3.55,2.38,2.28,-0.17,-0.76,0.12,0.74,0.49,0.08,0.81,-1.63,-2.13,0.94,2.21,3.01,2.16,3.27,1.78,2.17,1.26,-1.42,-0.6,-2.42,-0.66,-0.52,0.27,0.83,-0.62,0.13,0.22,2.88,-0.33,0.7,1.35,0.69,0.36,1.03,1.85,2.2,3.24,3.32,2.6,2.39,-1.17,-4.95,-5.1,-4.15,-3.0,-1.58,-0.32,0.62,1.08,1.4,1.58,2.11,4.09,5.11,4.91,3.97,4.95,5.69,7.03,7.24,5.51,4.68,3.73,3.06,2.36,0.69,-1.55,-3.34,-4.46,-5.43,-6.0,-5.96,-5.96,-5.78,-5.69,-5.78,-6.37,-6.71,-6.79,-6.65,-6.42,-6.11,-5.76,-5.42,-5.17,-4.94,-4.7,-4.5,-4.41,-4.34,-4.38,-4.39,-3.96,-3.62,-3.52,-2.72,-1.17,2.85,5.09,2.62,1.92,1.78,0.77,-0.19,-0.38,-0.21,-1.11,-2.09,-2.89,-4.05,-3.58,-4.9,-5.15,-5.53,-5.83,-5.72,-5.67,-5.28,-5.21,-5.0,-4.86,-5.27,-4.82,-4.36,-4.4,-4.37,-4.14,-3.5,-2.94,-2.09,-0.96,0.28,1.81,3.93,4.76,5.39,6.36,7.29,7.55,7.42,5.2,0.92,-0.54,-0.82,-1.15,0.98,1.26,3.37,2.14,4.49,5.96,4.72,3.12,5.75,2.6,3.65,2.42,2.1,1.59,1.6,1.52,1.97,0.76,-1.37,0.73,-2.66,-1.46,-1.37,-2.24,-2.01,-1.1,-0.17,1.5,1.05,0.55,-1.13,-0.12,-2.07,-2.34,-2.76,-3.43,-2.39,1.01,3.32,2.69,1.13,1.17,1.8,1.64,1.65,1.12,0.75,-0.66,-1.05,-1.6,-1.84,-1.18,-0.3,0.34,1.36,-0.77,-4.99,-4.36,-4.39,-4.51,-4.67,-4.6,-4.97,-4.7,-5.39,-5.49,-5.01,-5.6,-5.64,-5.51,-5.64,-6.86,-5.89,-7.11,-8.84,-10.33,-11.1,-11.53,-11.86,-11.95,-12.21,-11.99,-10.63,-8.75,-10.39,-10.54,-9.63,-9.36,-9.14,-8.62,-7.54,-6.72,-6.32,-6.06,-6.91,-6.26,-6.55,-5.47,-3.97,-3.14,-2.76,-2.7,-1.7,-2.37,-0.83,1.19,0.47,-0.25,-0.88,1.92,2.45,3.64,4.38,3.16,1.22,0.87,1.89,-0.62,-2.93,-5.56,-3.78,-5.5,-5.93,-7.62,-6.42,-5.92,-3.35,-2.57,-1.97,0.07,0.23,1.85,2.67,3.56,4.33,6.24,3.9,0.58,-2.62,-3.67,-3.94,-4.1,-3.7,-2.29,-0.87,-3.42,-0.58,-0.3,-1.55,-1.72,1.62,2.03,-0.19,-0.91,-3.43,-2.39,-0.14,1.4,2.12,2.92,4.03,4.12,4.27,0.12,2.7,2.16,3.0,0.62,3.68,1.82,-1.38,-3.91,0.58,-1.76,2.1,1.08,1.49,-0.33,1.5,0.68,2.21,2.74,2.13,2.63,2.39,3.06,2.58,2.53,1.55,2.54,2.13,1.26,1.33,0.16,2.84,-1.71,2.5,4.16,3.64,4.49,2.65,1.29,2.71,1.42,2.48,0.41,0.84,-1.36,2.49,0.01,3.05,0.46,2.96,1.89,0.12,-2.17,-0.74,-0.68,-0.55,0.99,1.01,-0.29,-0.01,-0.38,0.52,1.14,1.5,-0.22,-0.07,2.23,1.98,1.19,0.78,-0.37,-3.01,-0.81,-0.71,-0.31,0.41,0.97,-0.29,0.27,0.67,1.13,-0.01,-0.05,-0.39,-0.08,0.36,0.46,1.63,3.09,4.27,4.49,4.04,4.09,3.36,1.0,-0.19,-0.33,0.24,1.03,1.51,2.01,2.77,3.95,4.74,3.87,3.67,4.21,7.55,7.59,6.57,5.84,6.05,5.17,4.35,3.31,2.96,2.23,1.68,-0.28,-2.81,-4.76,-6.2,-6.91,-6.94,-7.08,-7.32,-7.74,-7.78,-7.54,-7.74,-7.61,-7.58,-7.43,-7.27,-7.16,-6.93,-6.71,-6.56,-6.41,-6.22,-5.99,-5.67,-5.2,-5.0,-4.75,-3.51,-1.36,2.36,3.76,3.58,2.41,2.68,2.06,0.55,-0.41,-0.92,-0.91,-0.76,-1.5,-2.43,-4.2,-5.06,-5.23,-5.77,-6.39,-6.42,-6.18,-6.06,-5.76,-5.56,-5.53,-5.42,-5.35,-5.54,-5.0,-4.75,-4.46,-4.51,-4.38,-4.07,-3.75,-2.85,-2.04,-0.73,0.72,2.16,3.22,4.23,5.47,5.9,6.28,7.45,5.6,4.8,6.43,3.86,-1.16,1.18,1.22,1.33,-0.88,4.11,3.66,6.67,5.15,2.95,2.46,2.63,-0.31,-1.22,0.0,-0.41,0.84,-1.69,0.43,-1.59,-2.75,-2.84,-2.11,-3.3,-5.27,-5.12,-3.25,-1.75,0.17,0.85,0.04,-0.73,0.86,-0.9,-1.16,-0.35,1.16,2.2,2.75,1.97,0.56,0.05,0.31,-0.11,0.08,-0.57,-0.65,-1.22,-1.62,-2.16,-2.77,-2.61,-1.75,-0.48,0.8,1.47,1.65,-4.87,-5.15,-5.02,-4.55,-4.55,-4.55,-5.19,-4.64,-5.13,-5.47,-5.33,-5.86,-5.65,-5.36,-5.44,-6.37,-5.67,-6.62,-8.63,-9.63,-10.55,-10.74,-10.88,-10.76,-9.56,-8.77,-7.97,-7.66,-8.6,-8.81,-9.99,-8.5,-7.68,-8.01,-7.69,-6.93,-5.77,-5.79,-5.93,-5.56,-5.81,-5.4,-4.42,-3.41,-2.51,-1.82,0.12,-0.27,1.0,0.51,1.65,3.77,2.1,3.67,2.17,3.79,1.94,2.34,-0.92,0.93,-1.5,-3.39,-1.64,-3.38,-6.49,-6.99,-6.99,-7.78,-7.88,-7.52,-5.46,-2.89,0.27,-2.57,-1.66,-1.2,0.47,2.1,2.66,4.92,2.87,0.14,-2.01,-1.44,-2.69,-2.04,-1.04,1.13,-2.86,2.76,-1.27,-0.63,1.1,-3.3,-0.83,0.18,0.33,-2.62,-2.8,-1.57,-0.63,1.89,0.14,-0.59,5.15,3.43,4.25,3.21,0.41,0.09,0.31,2.7,3.83,3.47,3.63,0.7,1.22,1.32,1.82,1.02,0.82,1.22,2.58,-1.09,-0.81,1.69,1.68,1.6,1.96,0.93,-0.23,2.38,2.9,2.14,0.96,1.46,2.89,0.12,1.27,3.49,1.96,0.92,5.2,5.06,3.67,1.92,3.94,2.3,2.31,-0.54,-0.62,1.57,1.42,1.62,2.84,1.57,4.11,1.72,-0.92,-2.12,-1.39,-0.45,0.39,1.33,-0.31,-0.62,0.32,0.88,-1.14,0.41,0.48,0.13,0.68,1.15,1.24,1.14,0.29,-1.98,-1.92,-1.63,-1.61,-1.65,-0.7,0.48,0.18,0.38,0.22,0.13,-1.1,-1.7,-1.2,-1.21,-0.13,0.13,0.09,1.31,2.67,3.49,3.91,3.55,3.02,2.49,2.28,2.22,1.95,2.31,3.01,3.57,4.01,3.34,3.17,3.47,6.11,9.98,6.31,5.56,5.74,5.17,4.6,4.21,3.75,2.9,2.82,1.91,1.35,1.11,-0.83,-3.85,-5.93,-7.43,-7.74,-7.32,-7.83,-8.34,-8.61,-8.42,-8.25,-8.01,-7.05,-7.14,-6.94,-7.58,-7.7,-7.33,-7.06,-7.1,-6.77,-6.39,-6.55,-5.8,-4.05,-1.42,1.71,3.66,3.54,3.14,1.92,1.31,2.07,0.92,0.35,-0.95,-1.36,-1.39,-2.19,-2.59,-3.68,-5.31,-6.17,-6.36,-6.37,-7.33,-6.79,-6.67,-6.72,-6.65,-6.61,-6.68,-6.67,-6.37,-6.14,-5.68,-5.64,-5.3,-5.11,-5.08,-4.86,-4.23,-3.31,-2.46,-1.4,0.17,1.41,2.46,3.03,3.66,4.56,5.52,6.65,5.66,5.43,6.67,2.55,3.08,1.25,2.11,2.35,-0.3,1.59,3.14,5.73,3.78,4.5,2.67,1.32,1.53,-1.19,-2.63,-2.21,-1.35,-2.49,-1.53,-3.62,-5.34,-5.35,-4.72,-4.68,-4.62,-5.0,-3.63,-2.78,-0.88,-0.68,-1.23,-1.76,0.35,-0.65,-1.13,0.66,1.22,0.97,-0.11,-0.86,-1.35,-1.15,-1.65,-1.86,-2.85,-2.41,-2.49,-2.48,-2.77,-3.06,-3.31,-3.27,-2.11,-0.19,0.22,0.04,-0.21,-2.52,-5.73,-4.8,-4.17,-3.26,-3.81,-5.22,-4.83,-5.14,-5.7,-5.29,-5.16,-5.45,-5.97,-4.73,-6.02,-5.06,-5.63,-6.93,-8.31,-10.04,-9.6,-8.97,-8.56,-9.4,-7.83,-5.75,-5.7,-5.49,-8.62,-7.16,-8.34,-7.32,-7.11,-6.68,-6.54,-5.91,-6.41,-7.71,-5.96,-5.3,-4.9,-4.69,-3.6,-2.65,-1.71,1.93,2.35,3.52,3.26,4.07,2.42,1.79,1.33,2.53,3.68,2.51,-0.22,-0.86,-3.08,-4.25,-2.22,0.84,-4.41,-3.83,-2.66,-5.43,-8.1,-5.94,-6.79,-5.28,-5.53,-5.76,-2.0,0.05,-0.92,0.43,1.87,2.74,1.68,0.26,-0.21,-1.62,-1.83,-1.9,-1.23,-0.47,0.27,-3.09,1.49,2.48,0.38,-3.74,-4.97,-4.03,-1.84,0.98,1.25,1.94,-0.29,2.23,1.32,1.79,-0.89,4.42,2.67,3.99,4.12,1.93,1.13,2.68,0.36,2.91,2.14,1.64,5.18,2.12,3.14,2.07,-0.96,0.44,0.65,-0.2,-0.44,-1.13,-1.15,0.16,0.97,0.24,1.11,0.61,1.76,4.12,3.76,3.21,3.19,2.32,2.28,4.77,6.34,-1.46,3.38,1.46,0.91,2.21,1.99,0.17,-1.76,3.85,-3.2,-2.55,-1.11,-1.09,2.22,1.26,2.52,3.8,2.25,-0.74,0.05,-2.86,-0.57,-0.89,0.67,0.65,0.08,1.19,-0.32,0.82,0.91,0.69,0.51,0.05,1.38,0.17,1.7,-1.81,-1.42,-2.06,-2.04,-2.49,-2.3,-1.56,-1.15,-0.62,0.2,-0.94,-0.8,-1.94,-2.43,-2.43,-2.0,-1.4,-0.06,0.72,0.91,0.76,0.61,0.84,0.93,0.87,0.85,0.71,0.63,0.18,0.06,0.45,0.12,0.7,1.45,3.67,9.84,7.46,6.55,5.41,4.91,4.76,4.39,3.62,3.11,2.98,2.68,2.59,1.9,1.3,0.86,0.79,1.06,-1.16,-5.93,-7.69,-7.05,-6.95,-7.47,-8.71,-9.48,-9.57,-9.53,-8.79,-8.63,-8.36,-8.1,-7.73,-7.16,-7.16,-7.62,-7.51,-6.06,-3.35,-0.71,0.85,1.8,2.09,2.23,1.77,1.09,0.68,0.37,0.29,-0.01,-0.7,-1.69,-2.07,-2.77,-3.25,-3.62,-4.52,-6.34,-6.76,-7.09,-7.22,-7.52,-7.2,-7.14,-7.35,-7.72,-7.36,-7.39,-7.32,-7.02,-6.93,-6.61,-6.31,-6.13,-5.7,-5.62,-5.44,-4.54,-4.14,-3.37,-2.32,-1.13,-0.01,1.28,1.99,2.65,3.84,5.1,5.89,5.36,5.43,4.43,5.52,4.0,2.64,0.98,0.16,0.52,1.63,3.46,5.15,3.33,4.04,4.39,2.55,0.05,0.51,-0.87,-1.18,-2.66,-2.81,-3.19,-5.32,-7.03,-6.65,-6.69,-6.15,-5.66,-5.06,-4.32,-4.48,-3.68,-3.55,-1.89,-2.0,-0.29,-1.63,-3.3,-2.27,-1.8,-2.11,-2.53,-2.76,-2.44,-2.55,-2.76,-2.37,-3.8,-3.92,-3.68,-3.66,-3.8,-3.95,-3.82,-3.39,-2.51,-2.16,-1.63,-0.84,0.07,-1.35,-5.07,-4.79,-3.77,-3.2,-3.63,-4.76,-4.93,-4.94,-5.83,-5.16,-5.13,-5.93,-6.46,-5.34,-5.79,-4.58,-4.24,-4.43,-5.86,-7.42,-8.21,-7.05,-6.44,-6.02,-5.67,-5.0,-4.32,-5.28,-7.32,-6.93,-6.58,-6.61,-6.39,-6.46,-6.33,-6.52,-4.49,-8.35,-1.78,-4.43,-4.17,-5.33,-4.57,-2.33,-0.19,3.52,4.46,4.33,3.57,2.87,1.2,1.48,1.87,2.97,3.93,-1.93,-2.84,-3.9,-4.43,-4.86,-0.98,1.85,2.15,0.09,-1.14,-2.66,-4.46,-5.62,-5.63,-4.69,-4.27,-3.93,-2.83,1.29,4.05,3.45,2.28,2.07,0.17,-0.84,-0.86,-0.6,-0.71,-0.12,-1.09,0.12,1.06,-1.86,-0.66,4.3,2.88,-2.45,-2.49,-2.57,-3.43,-1.33,0.97,1.3,1.57,3.5,4.85,-0.65,-1.39,1.83,2.29,4.01,4.66,6.15,6.24,1.98,-0.06,-1.3,1.88,7.12,1.09,1.21,3.39,4.95,4.6,4.57,4.95,1.85,1.15,0.51,-0.55,1.29,4.02,4.22,1.21,-0.34,1.31,3.39,4.09,4.61,6.56,6.84,6.49,5.66,5.9,6.85,3.44,2.75,1.24,1.16,0.93,-0.95,1.07,0.63,-1.46,-2.03,-0.87,-0.1,1.94,1.47,2.99,3.49,5.14,1.0,3.11,2.52,-2.19,-0.83,0.31,1.7,-0.58,1.0,-0.46,0.54,0.9,2.64,0.83,0.58,1.41,-0.15,0.65,-0.73,-1.69,-3.49,-2.37,-1.44,-1.5,-1.89,-1.52,-2.17,-1.98,-2.08,-1.39,-2.02,-2.57,-2.73,-2.85,-2.7,-1.8,-0.7,0.16,0.54,0.67,0.43,0.59,0.8,0.8,0.71,0.52,0.07,0.27,-0.24,0.65,0.82,8.23,7.55,5.5,5.52,4.77,4.6,4.07,3.76,3.42,2.97,2.44,2.09,1.91,2.21,1.7,1.15,1.57,2.18,2.68,2.9,2.88,2.16,0.77,0.87,0.77,1.22,-1.34,-5.7,-6.32,-5.32,-5.93,-7.8,-7.65,-6.63,-5.89,-4.27,-2.24,-1.06,-0.87,-0.87,-0.66,-0.45,-0.21,-0.91,-0.8,-0.45,-1.14,-1.2,-1.4,-2.03,-2.36,-2.78,-3.67,-4.01,-4.24,-4.31,-4.51,-4.99,-6.6,-7.27,-7.71,-8.04,-8.03,-7.6,-7.62,-8.03,-8.0,-7.96,-8.03,-7.78,-7.85,-7.73,-7.18,-6.9,-6.69,-6.6,-5.91,-5.77,-4.98,-4.54,-3.92,-3.31,-2.52,-1.94,-0.7,0.69,2.22,2.97,4.24,4.88,4.87,4.79,5.5,2.22,2.81,0.18,3.35,1.62,-0.08,1.7,3.45,2.72,6.56,6.67,3.99,4.22,-0.92,-2.25,-2.2,-1.59,-1.65,-2.44,-4.52,-6.71,-8.65,-8.14,-8.05,-7.74,-6.72,-5.9,-5.17,-5.72,-5.68,-5.24,-4.1,-2.03,-1.99,-1.96,-4.37,-4.41,-4.18,-4.21,-4.09,-3.96,-3.58,-3.16,-2.26,-3.03,-4.1,-4.24,-4.46,-4.04,-3.83,-3.8,-3.33,-2.93,-3.03,-3.18,-2.26,-2.27,-1.24,-1.06,-2.62,-4.54,-3.9,-3.27,-3.05,-4.77,-5.26,-4.83,-5.57,-4.59,-5.27,-6.34,-6.85,-6.07,-5.14,-4.44,-3.03,-2.09,-1.73,-1.79,-3.43,-4.06,-3.81,-3.25,-3.66,-4.09,-3.61,-4.74,-5.37,-6.69,-6.16,-6.24,-6.25,-6.35,-6.22,-5.15,-5.1,-3.92,-7.95,-5.96,-5.78,-5.62,-2.77,-1.35,1.64,1.68,2.96,3.48,2.3,1.63,-0.39,1.06,0.99,2.0,0.93,-3.04,-3.42,-4.37,-6.31,-1.08,3.51,1.95,1.0,1.75,1.41,3.22,0.61,1.8,-2.07,-2.3,0.48,-1.04,-0.66,-0.31,2.0,1.12,1.15,0.6,-1.67,-0.53,-1.06,-1.69,-1.59,-0.71,-1.58,-0.23,-0.24,1.39,1.25,-1.19,4.07,-0.96,-2.1,-2.35,-0.89,-0.78,0.45,-0.8,-0.43,1.39,1.77,-1.05,-3.15,1.69,2.94,2.79,2.37,3.64,4.65,4.79,5.02,3.83,0.53,0.81,0.23,3.4,3.91,3.92,3.35,4.84,1.75,1.13,2.37,-0.12,2.62,4.04,5.38,4.54,5.72,6.19,1.34,1.01,1.56,1.79,0.36,0.24,0.56,1.5,2.75,3.91,4.46,4.3,1.32,-1.56,-3.47,0.18,0.09,0.65,-1.38,1.36,2.17,0.04,1.23,-0.78,4.28,4.11,4.1,3.26,4.3,4.76,-2.19,-0.14,0.06,-0.32,-0.19,0.5,0.52,0.2,0.78,1.39,1.48,0.15,0.45,-0.2,-0.97,-0.39,-3.76,-4.12,-3.11,-1.75,-1.55,-1.92,-2.2,-2.23,-3.23,-3.12,-2.38,-2.82,-3.11,-2.92,-2.56,-2.98,-3.27,-2.67,-1.66,-0.94,-0.72,-0.77,-0.18,0.23,0.69,1.08,0.59,-0.63,-0.79,-0.54,5.21,7.27,6.47,4.11,4.15,4.12,4.36,3.8,3.11,2.45,2.31,1.87,1.22,0.9,0.71,0.43,0.16,0.04,0.36,0.98,1.66,2.15,2.45,2.24,2.09,2.2,2.18,1.82,2.33,3.65,3.55,3.01,2.25,2.14,2.96,0.75,0.28,-0.96,-1.43,-1.81,-2.32,-2.56,-2.51,-2.28,-2.44,-2.91,-2.5,-2.86,-3.1,-3.45,-3.64,-4.05,-4.32,-4.71,-5.33,-5.49,-5.45,-5.32,-5.26,-5.79,-6.17,-7.12,-7.67,-8.34,-8.4,-7.93,-8.25,-8.34,-8.28,-8.46,-8.39,-8.49,-8.33,-7.93,-7.55,-7.3,-6.98,-6.77,-6.11,-5.71,-5.27,-4.84,-4.26,-3.8,-3.23,-2.59,-1.48,-0.02,0.98,1.72,2.62,3.44,3.48,3.94,4.55,6.0,6.24,3.25,0.93,2.39,0.15,0.65,-0.6,2.78,4.3,3.43,6.88,2.52,0.4,-0.98,-2.56,-1.47,-1.29,-2.83,-4.55,-7.16,-8.83,-8.9,-8.59,-8.29,-8.04,-7.04,-6.73,-6.65,-7.05,-6.72,-5.41,-3.2,-2.39,-4.63,-5.32,-5.8,-5.27,-5.21,-5.07,-4.78,-3.95,-2.51,-2.88,-3.92,-4.6,-4.89,-4.86,-4.43,-3.95,-3.49,-2.7,-2.36,-0.48,1.11,-1.15,-2.17,-1.52,-2.39,-2.43,-4.22,-3.79,-3.27,-2.84,-4.48,-5.71,-5.76,-4.95,-4.56,-5.02,-5.93,-6.29,-6.15,-5.01,-4.05,-2.6,-0.93,0.58,1.67,0.37,-0.43,-0.96,-1.18,-2.45,-2.85,-3.2,-3.73,-5.12,-5.69,-5.71,-6.15,-6.23,-6.04,-5.31,-5.26,-4.87,-6.03,-6.21,-6.59,-6.6,-2.99,-3.66,-1.77,2.61,3.01,1.32,0.66,-0.19,-0.71,-0.3,-1.96,-0.51,-1.6,-2.41,-4.52,-7.28,-4.52,-3.17,-1.23,-0.6,1.36,3.23,1.42,1.66,1.24,0.56,1.12,-0.44,0.05,-1.35,-1.08,-0.57,-0.8,0.24,-0.02,0.32,-1.48,-2.96,-0.39,-1.62,-1.37,-1.24,-0.26,0.6,-1.49,-2.11,-1.33,-0.63,-1.66,2.01,2.49,0.8,-2.81,-2.01,-3.83,-1.96,1.0,2.48,1.39,-0.85,-2.47,-3.55,1.13,5.26,4.12,4.97,0.1,0.13,3.22,5.28,4.3,-0.43,-2.02,-1.51,0.29,3.43,5.28,5.43,4.93,4.27,4.72,5.63,6.4,5.84,3.63,2.84,3.99,4.93,4.72,2.57,1.18,1.97,1.34,0.66,-0.67,-2.96,-2.32,-1.83,-0.77,2.6,4.95,5.96,3.64,1.56,-2.91,-2.82,-1.08,0.56,0.83,-2.24,0.03,0.65,4.5,4.62,5.69,5.27,4.03,6.71,4.25,-0.24,-0.66,-1.57,-0.72,-0.48,-1.6,-1.54,-0.73,-0.22,1.44,0.0,-1.61,-0.7,0.53,-0.67,0.32,1.7,-4.17,-2.78,-2.92,-3.04,-2.86,-3.38,-3.8,-3.92,-3.79,-3.8,-3.98,-4.0,-3.63,-3.24,-3.14,-3.3,-3.29,-2.87,-2.57,-2.66,-2.28,-1.78,-1.29,-1.07,-1.4,-1.8,-2.5,1.01,7.53,5.95,5.37,4.08,3.67,3.66,3.63,3.3,2.68,1.47,1.08,0.73,0.08,-0.72,-1.16,-1.55,-1.87,-2.13,-2.28,-2.35,-2.13,-1.93,-1.72,-1.35,-0.79,-0.25,0.16,0.48,0.61,0.58,0.3,0.04,-0.04,-0.06,0.37,0.34,0.3,-1.6,-2.38,-2.76,-3.16,-3.84,-3.71,-3.54,-3.66,-3.78,-4.23,-3.95,-3.86,-4.68,-5.02,-5.41,-5.74,-6.28,-6.19,-6.47,-6.59,-6.48,-6.27,-6.19,-6.04,-6.59,-7.2,-7.51,-8.19,-8.69,-8.54,-8.65,-8.68,-8.82,-8.75,-8.68,-8.59,-8.35,-8.15,-7.75,-7.62,-7.34,-7.02,-6.57,-5.95,-5.57,-5.04,-4.78,-3.91,-3.51,-3.06,-2.1,-1.19,-0.24,0.02,0.84,1.65,1.92,2.82,3.61,4.79,5.06,3.38,2.37,2.53,1.16,0.89,0.21,0.99,2.97,3.07,3.88,3.88,2.62,2.28,0.4,-1.26,-1.22,-2.06,-5.26,-7.95,-8.65,-9.72,-9.47,-9.09,-8.5,-7.47,-6.95,-6.9,-7.69,-8.56,-7.05,-6.13,-4.21,-6.27,-6.44,-4.81,-5.64,-5.41,-5.26,-4.12,-3.14,-2.92,-3.58,-4.19,-4.55,-4.66,-4.34,-3.71,-3.18,-2.86,-2.0,0.07,0.91,0.53,-0.24,-2.64,-2.6,-2.48,-2.8,-4.54,-4.05,-3.15,-2.81,-3.48,-5.31,-5.61,-5.37,-4.69,-4.78,-5.33,-5.52,-5.43,-4.81,-4.02,-2.58,-0.94,0.57,1.78,1.98,1.68,0.78,1.46,-1.07,-1.96,-2.19,-4.08,-5.03,-5.25,-5.49,-5.95,-6.03,-5.75,-5.27,-5.08,-5.1,-5.33,-6.05,-5.64,-4.42,-3.35,-1.56,-1.47,-0.36,-0.03,-1.22,-0.66,-0.8,-0.64,-0.99,-2.29,-3.49,-4.44,-4.8,-5.35,-7.64,-5.69,-2.24,-2.27,-1.66,0.95,2.86,3.5,1.65,-0.2,0.17,1.3,1.66,0.56,0.11,-0.71,-0.21,0.19,-2.84,-0.06,1.4,-1.75,-3.23,-1.62,-3.55,-2.66,-1.1,0.05,-0.69,-0.97,-1.34,-2.75,-1.64,-0.85,-2.03,2.21,0.75,-0.39,-1.87,-3.99,-4.0,-2.25,1.4,0.76,-2.32,-4.24,-1.16,-0.64,3.18,5.31,9.67,7.67,7.67,7.1,6.92,3.67,1.55,0.24,2.96,2.26,-1.09,1.29,3.88,4.14,4.84,5.36,4.42,4.95,6.16,3.54,3.44,3.76,4.12,1.68,4.36,3.18,2.63,3.46,2.1,3.23,3.55,2.92,2.17,-1.37,0.66,3.11,5.48,3.69,1.6,-0.83,-0.26,0.56,1.1,1.02,0.94,0.51,0.89,4.1,4.19,3.85,2.63,2.51,4.55,3.57,2.1,-1.7,-1.23,-0.05,-2.39,-1.46,-1.07,-1.34,-1.16,0.74,0.11,-1.05,-1.34,-3.74,-2.27,2.0,3.44,-1.39,-3.71,-3.93,-4.42,-4.4,-4.29,-4.47,-4.86,-5.37,-5.29,-5.25,-4.81,-4.59,-4.36,-4.1,-4.01,-3.85,-3.81,-3.72,-4.03,-3.98,-3.74,-3.97,-3.56,-3.72,-2.13,6.3,5.09,5.05,4.42,3.51,2.59,2.49,1.94,1.84,1.78,1.22,0.12,-0.23,-1.16,-1.72,-2.26,-2.79,-3.23,-3.61,-3.98,-3.98,-4.0,-3.94,-3.73,-3.67,-3.5,-3.12,-2.81,-2.64,-2.56,-2.44,-2.24,-2.1,-2.07,-1.88,-1.39,-0.82,-1.01,-2.61,-3.18,-3.34,-3.39,-4.61,-3.92,-3.31,-4.09,-4.22,-4.72,-5.05,-4.39,-5.08,-5.89,-6.0,-6.17,-7.11,-7.64,-7.55,-7.55,-7.63,-7.39,-7.17,-7.18,-6.82,-6.85,-7.22,-7.67,-8.16,-9.05,-9.45,-9.06,-8.96,-9.06,-8.97,-9.03,-8.83,-8.61,-8.38,-7.9,-7.7,-7.57,-7.34,-7.05,-6.5,-6.06,-5.49,-5.36,-4.62,-4.09,-3.64,-2.77,-2.28,-1.71,-1.1,-0.42,0.4,0.71,1.59,2.5,3.48,4.02,4.57,4.19,1.26,2.38,-0.67,1.12,-0.45,3.72,1.17,3.3,3.43,6.06,3.25,-0.86,-1.51,-0.94,-2.19,-6.29,-8.0,-9.31,-10.72,-10.42,-10.22,-8.92,-7.34,-6.14,-5.93,-7.67,-9.12,-8.43,-7.43,-6.79,-6.63,-7.07,-6.01,-5.91,-5.01,-4.73,-4.16,-3.8,-3.68,-3.58,-4.55,-4.57,-4.31,-4.4,-4.47,-3.61,-3.05,-1.82,-0.63,-0.66,-0.69,-1.34,-0.76,-2.06,-3.24,-4.12,-4.93,-4.57,-3.27,-2.99,-2.64,-3.87,-5.17,-5.21,-5.03,-4.53,-4.76,-4.87,-4.63,-4.34,-3.72,-2.32,-1.15,0.44,1.56,3.16,4.23,2.86,1.4,0.11,-0.35,-1.09,-3.38,-4.92,-4.96,-5.26,-5.37,-5.63,-5.47,-5.17,-4.81,-4.83,-5.15,-5.01,-4.42,-1.36,-2.45,-0.5,-2.88,-3.19,0.75,0.32,-1.47,-0.78,-0.17,-1.05,-3.43,-4.01,-5.33,-5.33,-5.23,-5.84,-3.62,-1.14,-1.3,-2.28,2.25,1.63,1.79,3.59,2.92,0.37,1.13,3.23,0.39,-0.3,2.91,1.05,-2.25,-1.08,0.42,-0.64,-2.29,-3.95,-3.35,-2.37,-3.15,-1.28,-0.06,-0.15,-1.06,0.09,-2.45,0.61,-1.6,-2.98,0.72,1.48,2.91,0.73,-1.27,-5.02,-2.31,0.11,0.68,-1.33,-0.52,-2.34,0.16,4.43,5.84,7.2,6.85,6.22,5.29,5.31,3.45,0.8,4.12,4.15,0.42,3.23,2.19,3.2,4.08,5.15,5.65,5.85,5.35,5.28,3.85,3.81,2.53,2.67,3.38,4.78,4.16,3.93,4.39,4.84,3.26,3.51,1.87,3.27,3.75,2.8,3.22,2.37,0.78,2.47,1.34,-1.09,0.1,1.27,-3.38,-0.93,1.23,2.61,2.53,2.53,4.01,3.19,1.74,1.28,2.36,-0.22,0.73,-1.55,-2.66,-1.53,-2.84,-1.39,-1.89,-1.39,-2.75,-1.17,-3.38,-6.27,-4.5,-2.95,5.12,0.08,-4.27,-4.88,-5.26,-5.27,-5.18,-5.03,-4.58,-5.01,-5.37,-5.56,-5.46,-5.44,-5.42,-5.45,-5.56,-5.3,-4.95,-5.03,-5.03,-4.55,-4.12,-3.81,-3.9,-2.02,5.41,4.77,4.51,3.72,3.01,2.16,1.34,1.16,0.31,0.05,0.3,-0.03,-0.68,-1.1,-1.78,-2.51,-3.16,-3.67,-4.09,-4.19,-4.26,-4.73,-4.91,-4.57,-4.45,-4.77,-4.98,-4.87,-4.93,-4.48,-4.27,-4.32,-4.31,-4.02,-3.68,-3.51,-3.41,-3.58,-3.66,-3.9,-4.06,-4.11,-4.14,-4.33,-4.42,-4.1,-4.46,-4.31,-4.31,-4.43,-5.82,-5.23,-6.01,-7.35,-7.01,-7.31,-8.62,-8.62,-8.97,-8.19,-8.22,-8.02,-7.83,-7.94,-7.73,-7.56,-7.41,-7.62,-7.98,-8.88,-9.55,-9.28,-9.22,-9.1,-9.05,-9.01,-8.9,-8.77,-8.39,-8.19,-8.01,-7.87,-7.68,-7.16,-6.93,-6.69,-6.17,-6.02,-5.34,-4.75,-4.04,-3.39,-3.08,-2.69,-1.98,-1.37,-0.87,-0.43,0.34,1.22,2.63,3.67,4.03,3.73,3.35,0.22,0.07,0.93,1.37,-0.28,1.02,3.0,5.37,6.65,1.27,0.16,1.77,-1.49,-4.52,-6.7,-8.26,-9.13,-10.44,-10.01,-10.14,-9.16,-7.27,-6.27,-5.46,-4.36,-4.03,-3.57,-1.92,-2.11,-5.6,-7.16,-6.9,-6.35,-5.14,-4.49,-4.27,-4.24,-3.65,-3.96,-4.5,-4.62,-4.98,-5.07,-3.71,-2.24,-1.34,-0.45,-0.07,-1.52,-2.58,-2.88,-2.66,-1.89,-1.6,-4.14,-5.84,-5.02,-3.74,-3.06,-3.09,-2.54,-3.37,-4.63,-4.3,-4.03,-3.99,-4.01,-3.84,-3.48,-2.53,-1.62,-0.47,1.14,3.3,5.03,4.09,4.54,2.19,0.36,0.19,-1.27,-3.56,-4.23,-4.46,-4.74,-4.84,-4.75,-4.9,-4.84,-4.64,-4.58,-4.64,-3.91,-2.15,-0.36,-0.87,-2.84,-2.65,-1.13,0.45,0.14,0.01,-0.28,-2.15,-2.17,-2.87,-3.49,-5.4,-5.6,-4.71,-3.19,1.53,1.16,1.86,-2.48,-2.75,-0.85,-0.42,2.77,1.14,1.39,0.99,0.14,0.27,-1.63,1.54,0.3,-0.69,-1.68,0.29,-1.73,-4.28,-3.99,-4.68,-2.22,-3.6,-1.63,-0.31,-0.48,-1.25,0.73,0.08,0.1,-0.95,-0.97,-0.43,1.68,2.82,1.71,-2.09,-2.82,-3.13,-1.91,0.51,1.32,-0.09,-1.15,1.48,4.04,3.4,3.33,4.65,3.22,1.75,1.75,1.94,3.36,2.53,4.18,4.63,6.21,4.77,3.98,4.33,5.16,5.74,5.85,5.47,5.47,4.29,3.02,-0.75,3.29,4.84,4.2,5.25,3.36,3.54,3.35,1.47,1.34,2.59,4.18,4.39,4.16,4.37,2.5,-0.21,1.49,1.66,1.03,3.66,0.94,-2.48,0.46,0.66,1.32,1.21,2.63,3.89,2.74,2.1,1.9,2.92,-1.33,0.59,0.87,-1.39,-1.46,-4.68,-3.23,-1.55,-3.35,-7.39,-6.93,-5.97,-5.58,-6.92,-7.39,-7.42,-7.64,-5.95,-5.74,-5.7,-5.33,-5.21,-5.31,-4.97,-4.85,-5.05,-5.26,-5.02,-5.21,-5.15,-5.42,-5.69,-5.56,-5.43,-5.22,-4.58,-4.27,-3.51,0.72,4.85,5.42,4.13,3.54,2.82,1.6,1.0,0.15,-0.33,-0.75,-1.73,-1.55,-1.41,-1.66,-2.32,-2.57,-3.03,-3.68,-4.33,-4.73,-4.85,-4.84,-5.11,-5.12,-5.37,-5.31,-5.41,-5.59,-5.57,-5.17,-5.12,-5.25,-5.19,-5.17,-5.35,-5.42,-5.43,-5.47,-5.3,-5.14,-5.29,-5.27,-5.05,-5.1,-5.09,-5.29,-5.14,-5.24,-5.1,-4.9,-4.94,-4.53,-4.12,-3.54,-3.32,-3.96,-3.88,-9.08,-9.64,-9.31,-9.9,-8.8,-8.68,-8.54,-7.99,-8.23,-8.31,-8.07,-7.84,-7.81,-7.95,-8.9,-9.24,-9.37,-9.53,-9.4,-9.27,-9.16,-8.95,-8.71,-8.52,-8.37,-8.09,-7.78,-7.59,-7.62,-7.41,-7.18,-6.78,-6.22,-5.71,-4.99,-4.15,-3.56,-3.38,-2.88,-2.38,-2.1,-1.63,-0.91,-0.53,0.16,1.68,3.5,4.12,3.96,4.76,4.33,0.98,-0.1,0.85,-0.53,0.93,1.63,2.16,3.42,0.31,-0.99,-1.32,-3.78,-5.49,-6.22,-7.91,-8.96,-9.72,-10.36,-9.68,-8.51,-7.29,-5.76,-6.17,-4.47,-2.11,-3.99,-5.84,-4.25,-1.19,-1.03,-4.11,-6.54,-5.43,-4.45,-4.02,-3.86,-4.36,-4.36,-4.89,-4.87,-4.91,-4.68,-4.49,-4.77,-3.81,-2.27,-1.72,-3.06,-3.59,-3.57,-4.46,-4.42,-2.78,-2.07,-5.81,-5.13,-3.94,-3.08,-3.19,-2.9,-2.6,-2.48,-3.68,-3.19,-3.01,-2.9,-2.84,-2.15,-1.13,0.09,1.74,3.12,4.04,4.39,4.55,3.84,1.65,1.44,-0.39,-1.02,-3.13,-4.21,-4.38,-4.49,-4.35,-4.37,-4.49,-4.55,-4.39,-4.18,-3.94,-3.49,-1.31,-1.15,-0.23,-0.28,-0.91,0.34,0.42,-0.24,-0.16,-3.98,-2.65,-3.16,-2.91,-2.84,-5.29,-5.97,-1.32,0.61,0.76,1.45,-0.92,-2.79,-0.13,0.24,1.07,0.67,1.65,1.49,-0.15,-2.11,-0.25,-0.36,-1.85,-1.89,-1.14,1.22,0.05,-3.31,-4.46,-2.52,-4.23,-5.08,-4.18,-2.25,-1.12,-0.93,-1.18,-0.33,0.49,-0.74,-3.01,-4.69,-1.92,-0.58,1.2,-0.67,-0.5,-2.67,-3.16,-3.03,-1.32,-0.18,-0.9,0.52,0.69,-0.71,1.17,1.28,1.05,-0.49,0.99,0.5,3.07,3.1,2.67,2.34,4.96,5.36,5.43,5.23,4.45,4.66,5.33,5.43,5.09,5.15,4.93,3.64,1.9,4.01,4.55,4.01,4.66,3.28,4.19,3.46,2.15,2.84,4.43,6.36,5.95,5.41,5.6,-1.34,2.02,2.16,1.41,1.49,1.94,1.16,0.52,0.56,1.3,3.46,2.72,3.4,2.75,3.09,2.43,2.21,2.21,-1.06,-2.4,-1.04,0.35,-0.05,0.37,-4.85,-2.06,-1.39,-2.46,-3.65,-4.54,-5.87,-7.1,-8.13,-9.09,-8.36,-6.84,-6.0,-5.76,-5.54,-5.36,-5.23,-5.2,-5.06,-4.66,-4.63,-4.96,-4.86,-4.88,-5.15,-4.7,-4.2,-3.61,-1.3,3.04,4.85,5.28,5.16,4.09,2.72,2.51,1.58,0.6,0.21,-0.6,-1.56,-1.36,-2.35,-3.3,-2.7,-2.93,-2.9,-3.65,-3.6,-4.1,-4.78,-5.05,-5.17,-5.36,-5.74,-5.64,-5.84,-5.67,-5.86,-6.09,-6.37,-6.07,-5.9,-5.85,-5.92,-5.67,-5.79,-5.97,-6.18,-6.37,-6.47,-6.54,-6.46,-6.35,-6.14,-5.76,-5.73,-5.86,-6.17,-5.96,-5.7,-5.74,-5.62,-5.43,-5.42,-5.41,-5.17,-4.41,-4.18,-4.08,-2.29,-3.28,-2.85,-7.87,-8.5,-9.02,-9.02,-8.74,-8.67,-8.84,-8.74,-8.32,-8.28,-8.38,-8.66,-9.16,-9.09,-9.33,-9.45,-9.33,-9.17,-8.98,-8.78,-8.39,-8.09,-8.08,-7.89,-7.64,-7.6,-7.53,-7.45,-7.28,-6.79,-6.1,-5.41,-4.84,-4.3,-3.89,-3.17,-2.56,-2.14,-1.76,-0.98,-0.73,-0.08,1.37,2.77,3.6,3.3,4.06,4.26,3.44,1.16,-0.28,-1.45,1.0,1.82,3.17,3.8,1.58,1.21,-1.31,-6.72,-6.4,-5.09,-8.0,-8.95,-7.53,-9.63,-7.86,-5.97,-3.76,-3.09,-6.72,-6.05,-4.84,-4.81,-6.08,-8.01,-8.47,-7.61,-1.73,-1.1,-1.8,-4.36,-3.84,-3.71,-4.48,-4.12,-4.01,-3.77,-4.58,-4.9,-5.53,-5.61,-4.29,-4.15,-3.21,-4.24,-3.53,-3.57,-3.86,-4.68,-4.41,-3.69,-4.71,-5.15,-4.28,-3.26,-2.78,-2.74,-2.54,-2.11,-1.8,-2.66,-2.74,-2.16,-1.7,-1.21,-0.5,0.34,1.83,3.09,3.86,4.13,3.83,2.03,1.91,0.06,1.03,-1.39,-2.9,-3.85,-3.97,-4.0,-4.15,-4.21,-4.16,-4.02,-3.84,-3.44,-2.47,-0.77,-1.65,-1.89,0.96,-1.43,0.73,-0.8,-0.38,-1.03,-1.38,-2.02,-3.16,-4.07,-3.29,-3.18,-4.51,-4.3,-0.18,0.9,-1.76,-0.39,-3.0,-2.96,-1.3,0.27,-1.29,2.24,1.29,0.29,-0.91,-1.58,-0.99,-2.83,-1.65,0.36,0.19,2.8,-1.46,-4.3,-5.28,-5.8,-5.1,-5.2,-4.42,-3.16,-1.43,-0.79,-1.13,-0.55,-2.42,-2.5,-5.04,-6.07,-2.62,-1.72,-0.38,-3.8,-5.54,-2.07,-3.21,-1.2,-2.46,-1.03,-0.79,-0.62,-3.24,-2.8,0.94,1.53,0.03,-3.25,-3.7,-1.7,1.64,3.79,1.04,3.38,3.6,4.29,4.68,4.8,4.73,4.4,4.53,4.6,4.51,4.32,4.48,2.93,1.52,1.77,2.26,2.74,1.97,3.1,2.77,2.25,0.54,1.67,2.17,3.04,5.6,4.6,5.63,7.39,4.91,3.11,1.62,1.52,2.07,2.94,3.06,0.33,1.27,4.0,3.45,1.98,1.85,1.8,1.84,2.28,2.52,-0.67,-1.84,-0.1,1.62,5.4,2.51,-1.18,-1.64,-0.45,-0.95,-3.36,-4.51,-5.0,-6.68,-8.5,-9.57,-8.72,-7.14,-6.7,-5.85,-5.79,-5.48,-5.04,-5.13,-4.88,-4.59,-4.55,-4.68,-3.47,-0.9,-0.87,0.28,2.83,4.64,3.44,2.69,2.8,2.95,2.78,1.91,0.83,0.38,0.04,-0.65,-0.91,-2.1,-2.57,-2.3,-3.61,-4.07,-3.5,-4.03,-4.13,-4.51,-4.44,-4.92,-5.51,-5.42,-5.88,-6.27,-6.05,-6.01,-6.04,-6.28,-6.35,-6.4,-6.49,-6.36,-6.61,-6.4,-6.42,-6.24,-6.43,-6.68,-6.93,-7.2,-7.24,-7.14,-7.03,-6.9,-6.81,-6.6,-6.45,-6.25,-6.3,-6.25,-6.19,-6.93,-6.84,-6.4,-5.5,-5.04,-4.75,-4.67,-4.35,-4.07,-3.81,-1.27,-6.02,-0.89,-3.32,-7.73,-9.17,-9.05,-9.18,-9.35,-9.44,-9.19,-9.06,-8.99,-9.04,-9.12,-9.47,-9.63,-9.69,-9.39,-9.14,-8.98,-8.94,-8.68,-8.42,-8.47,-8.0,-7.78,-7.68,-7.35,-7.38,-7.45,-7.15,-6.62,-6.11,-5.81,-5.14,-4.58,-3.83,-3.03,-2.41,-2.05,-1.5,-0.85,-0.41,0.37,1.56,2.4,2.77,3.61,3.94,3.9,2.52,1.76,-0.84,-0.67,1.01,1.15,-0.31,-0.25,-1.17,3.61,0.48,-6.1,-4.44,-7.32,-10.04,-9.61,-8.09,-3.65,-2.82,-1.9,-8.23,-7.73,-7.14,-6.63,-4.86,-5.11,-4.97,-5.64,-8.09,-6.9,-1.06,-0.14,-0.87,-4.03,-4.0,-2.04,-2.77,-3.85,-4.21,-3.22,-3.98,-4.86,-5.0,-5.47,-5.28,-5.55,-4.95,-4.78,-5.29,-4.56,-4.57,-5.02,-5.06,-5.39,-5.69,-5.18,-3.92,-3.33,-2.81,-2.5,-1.92,-1.76,-1.19,-1.05,-1.36,-1.34,-0.8,0.04,0.98,1.94,2.83,3.1,2.71,1.74,1.83,-0.17,1.35,-0.61,-1.68,-3.02,-3.66,-3.81,-3.75,-3.78,-3.9,-3.73,-3.48,-3.17,-2.43,-1.13,1.39,1.55,-0.57,-0.32,0.06,-0.28,-0.91,0.09,-0.56,-1.6,-2.02,-0.59,-1.25,-1.57,-1.75,-0.62,-0.98,-2.19,-1.24,-2.41,-2.45,-2.21,-2.34,-0.44,0.87,-3.05,0.36,1.29,-0.24,-2.19,-1.67,-2.13,-5.12,-4.23,-6.58,-8.43,-3.97,-3.69,-6.21,-5.07,-6.22,-4.85,-4.1,-4.02,-4.42,-0.47,0.12,-0.8,-1.44,-3.86,-3.8,-4.07,-5.24,-3.79,-3.29,-0.98,-3.58,-4.61,-4.02,-0.08,-0.63,-0.36,-0.94,-1.96,-1.28,-3.33,-4.49,-3.39,-2.1,-4.65,-4.79,-1.85,-0.53,1.25,2.27,2.79,2.83,3.03,3.2,3.39,3.71,4.05,4.04,3.89,3.88,3.64,3.36,2.88,0.58,0.29,1.45,0.36,0.77,1.48,0.27,1.41,2.13,0.73,0.55,-0.05,1.87,3.33,3.15,7.73,7.58,5.24,4.6,3.03,2.98,2.79,3.51,3.44,0.58,0.76,2.31,2.15,-0.31,0.74,1.54,-0.14,1.21,1.08,3.1,-3.75,-0.63,-0.46,1.53,1.07,1.81,-0.94,-0.39,-0.89,-2.13,-4.5,-4.86,-6.26,-7.79,-8.81,-9.5,-7.27,-6.3,-5.67,-5.41,-5.02,-4.46,-4.4,-3.64,-2.35,0.21,1.23,0.84,1.81,1.91,2.95,2.78,2.03,1.32,0.86,0.76,0.8,0.59,-0.01,-0.68,-0.99,-1.25,-0.96,-1.82,-2.89,-3.14,-3.38,-4.59,-4.79,-4.45,-4.71,-5.15,-5.19,-5.47,-5.87,-6.31,-6.44,-6.73,-6.62,-6.44,-6.48,-6.64,-6.73,-6.81,-6.77,-6.73,-6.68,-6.95,-6.9,-6.91,-7.01,-7.19,-7.47,-7.62,-7.8,-7.86,-7.81,-7.91,-7.92,-7.69,-7.39,-7.24,-6.99,-5.86,-6.35,-6.84,-7.5,-7.7,-7.12,-6.64,-5.68,-5.36,-5.34,-4.96,-4.98,-5.45,-4.35,-5.5,-3.87,-5.47,-7.38,-8.83,-9.23,-9.48,-9.55,-9.63,-9.46,-9.02,-8.94,-9.07,-9.44,-10.12,-10.57,-10.26,-9.95,-9.6,-9.22,-8.98,-8.71,-8.27,-8.12,-7.93,-7.77,-7.65,-7.51,-7.31,-7.15,-7.15,-7.01,-6.87,-6.61,-5.93,-5.11,-4.58,-4.16,-3.45,-2.74,-2.09,-1.88,-1.5,-1.01,0.14,1.33,2.04,2.82,3.77,3.98,3.53,3.41,4.24,0.51,1.9,-1.71,0.89,0.07,-2.09,-0.3,2.0,-1.61,-2.93,-1.88,-4.69,-8.25,-3.6,-3.01,-1.64,-2.06,-8.95,-9.0,-8.31,-7.2,-6.48,-6.23,-5.38,-5.4,-6.72,-6.3,-6.1,-7.7,-7.04,-3.37,-2.88,-0.49,0.08,0.89,-1.24,-0.88,-2.34,-3.3,-3.76,-5.68,-5.28,-5.81,-5.66,-5.82,-5.4,-5.23,-5.12,-4.77,-4.49,-4.98,-6.12,-6.17,-5.02,-4.16,-2.86,-2.79,-1.94,-1.61,-1.36,-1.1,-0.61,-0.17,0.14,0.49,0.77,1.11,1.38,1.28,1.17,0.88,0.59,0.8,-1.2,-1.5,-2.48,-3.34,-3.77,-3.76,-3.52,-3.47,-3.55,-3.37,-3.01,-2.58,-1.92,0.73,2.68,2.85,2.2,0.59,1.03,-1.33,-0.44,0.86,-2.67,-3.43,-1.82,-2.7,-1.55,0.59,-1.14,0.21,-2.28,-2.98,-2.37,-3.11,-3.9,-2.62,-3.37,-0.59,0.54,-5.08,-0.33,1.37,-1.53,-4.28,-3.48,-2.8,-5.09,-4.76,-6.86,-6.81,-4.91,-6.12,-7.69,-6.78,-5.85,-5.0,-3.4,-3.38,-3.99,-0.94,-0.89,0.19,-0.82,-3.26,-3.85,-2.86,-5.04,-5.1,-4.56,-2.31,-0.1,-2.56,-6.5,-2.95,0.36,-0.96,0.31,-0.94,0.64,0.76,-1.68,-2.29,-2.0,-0.2,1.65,1.65,-0.38,1.6,2.62,2.04,1.57,1.73,1.69,1.86,2.09,2.42,2.99,3.19,3.02,2.51,2.32,0.14,0.06,0.23,2.85,-1.27,-0.25,-0.61,0.83,0.29,0.28,0.17,-0.79,-0.26,-2.78,0.98,5.26,5.76,5.97,5.1,4.86,4.2,4.16,3.91,3.42,2.95,0.7,0.52,-0.12,1.39,-0.66,-0.48,0.38,-1.77,0.2,0.61,2.21,1.83,-2.37,-1.48,-0.62,2.59,1.6,-0.13,-0.91,-0.31,-1.5,-3.11,-2.99,-1.64,0.32,1.12,-0.28,-2.54,-3.16,-2.38,-1.9,-0.42,-0.51,0.11,0.92,1.57,1.52,0.64,0.9,0.95,0.41,0.36,0.27,-0.27,-0.78,-0.97,-1.2,-1.17,-1.73,-2.34,-2.55,-2.47,-2.06,-2.32,-3.28,-3.58,-3.89,-4.51,-5.44,-5.57,-5.63,-5.67,-5.69,-5.89,-6.5,-6.93,-7.14,-7.37,-7.24,-6.92,-7.17,-7.06,-7.24,-7.08,-7.03,-7.05,-6.8,-6.92,-7.39,-7.42,-7.49,-7.7,-7.85,-7.95,-8.06,-8.11,-7.97,-8.09,-8.16,-8.18,-8.1,-7.91,-7.44,-7.1,-6.73,-6.39,-7.0,-7.58,-8.29,-8.03,-7.66,-6.93,-6.03,-6.29,-6.08,-6.15,-6.31,-7.14,-6.92,-8.32,-7.5,-7.47,-8.83,-9.34,-9.75,-9.98,-9.92,-9.55,-9.04,-8.73,-9.13,-9.41,-10.09,-10.52,-10.27,-10.1,-9.84,-9.71,-9.38,-9.03,-8.62,-8.32,-8.07,-7.58,-7.14,-7.14,-7.37,-7.84,-7.92,-8.09,-7.49,-7.07,-6.39,-5.95,-5.34,-4.69,-4.47,-4.0,-3.51,-3.33,-2.76,-1.87,-0.64,0.27,1.21,2.04,2.99,3.87,4.06,3.91,4.57,5.63,5.71,-0.63,1.31,0.82,0.27,-1.3,2.48,-1.06,-1.3,0.34,0.14,-3.42,-3.0,-3.65,-2.34,-8.21,-9.77,-9.45,-8.45,-7.83,-6.78,-6.17,-5.47,-3.98,-2.12,-1.22,0.05,-5.81,-4.48,-2.71,-2.05,-2.96,-2.24,-2.94,-3.58,-4.57,-1.52,-0.84,-2.6,-5.85,-5.26,-6.8,-6.09,-6.32,-6.52,-5.9,-5.52,-5.33,-4.98,-4.77,-5.67,-6.52,-5.51,-4.73,-3.99,-3.4,-2.78,-2.08,-1.78,-1.42,-0.9,-0.48,-0.16,0.17,0.27,0.1,0.19,0.33,-0.33,0.13,-0.17,-1.07,-1.87,-2.47,-3.13,-3.62,-4.05,-4.0,-3.64,-3.35,-3.41,-3.33,-3.01,-2.48,-0.21,1.73,3.27,3.69,1.96,2.5,2.03,-0.22,0.07,0.07,-3.71,-2.76,-2.51,-3.46,-1.43,-2.15,1.09,1.57,-3.19,-1.49,-2.86,-3.94,-4.32,-3.41,-3.28,-1.69,-3.98,-5.62,-2.37,-0.33,-4.29,-4.05,-4.34,-3.16,-4.69,-5.79,-6.87,-6.65,-7.25,-7.73,-6.69,-9.99,-8.25,-4.33,-3.03,-2.8,-2.36,-0.87,-1.42,-1.0,-0.94,-1.9,-4.3,-3.56,-7.2,-7.71,-4.69,-2.03,0.99,-2.49,-5.5,-2.89,1.47,-1.14,-0.25,-1.34,0.76,3.39,1.04,-1.11,-1.76,-0.07,-0.27,-0.04,3.86,2.49,1.79,0.78,0.06,-0.01,0.04,0.29,0.6,1.02,1.62,2.3,2.29,1.48,0.39,-0.49,0.24,0.57,1.58,0.57,-1.43,-0.72,-1.69,0.09,-0.48,0.24,0.0,-0.08,0.36,2.93,4.79,4.71,4.68,4.82,4.58,4.71,4.79,4.58,4.1,3.77,5.81,2.56,0.92,1.49,0.2,-1.24,-0.48,-2.29,-2.52,-0.09,2.52,3.01,-0.32,-2.73,-1.4,1.05,0.05,-0.97,-0.55,-1.85,-1.29,-1.74,-1.54,1.48,2.75,5.95,-0.27,-2.12,-0.19,-1.16,-1.44,-0.2,-0.78,-0.33,0.47,0.31,0.01,0.02,-0.02,-1.02,-1.1,-1.2,-1.76,-2.32,-2.3,-2.42,-2.47,-3.25,-4.03,-4.38,-4.32,-3.94,-3.48,-3.87,-4.36,-4.36,-4.96,-5.43,-6.18,-6.39,-6.39,-6.16,-6.42,-6.81,-7.24,-7.51,-7.85,-8.04,-7.79,-7.63,-7.79,-7.61,-7.56,-7.44,-7.09,-6.96,-6.87,-7.58,-7.83,-8.02,-8.08,-8.15,-8.08,-7.91,-8.04,-8.21,-8.37,-8.31,-7.92,-8.05,-8.07,-7.97,-7.19,-7.39,-7.37,-7.3,-7.69,-7.82,-7.54,-8.2,-8.12,-7.54,-7.19,-7.13,-6.9,-6.99,-7.33,-7.76,-8.06,-8.03,-8.0,-8.24,-8.83,-9.55,-10.07,-10.13,-10.23,-10.04,-9.76,-9.31,-9.28,-9.45,-9.52,-10.02,-10.1,-9.91,-9.7,-9.62,-9.21,-9.23,-8.93,-8.53,-8.22,-7.7,-6.71,-6.61,-7.93,-7.91,-8.21,-8.28,-7.72,-7.06,-6.55,-6.17,-6.02,-5.6,-5.38,-5.03,-4.34,-4.5,-3.42,-2.43,-1.72,-0.26,0.71,1.74,2.8,3.56,3.73,3.57,4.19,5.68,6.79,6.07,5.99,0.54,-1.06,-0.7,1.69,2.58,-0.48,-0.01,-0.17,0.32,-1.5,-2.69,-2.54,-7.63,-11.43,-10.55,-8.37,-7.91,-6.94,-6.1,-6.51,-6.48,-7.35,-8.07,-8.02,-6.15,-5.6,-5.33,-5.21,-5.8,-5.6,-5.34,-5.28,-5.34,-4.62,-4.16,-4.15,-5.22,-6.2,-7.37,-7.22,-6.98,-6.86,-6.54,-6.23,-6.08,-5.71,-5.34,-5.61,-6.5,-6.4,-5.4,-4.88,-4.27,-3.81,-3.21,-2.52,-2.13,-1.84,-1.47,-1.17,-0.84,-0.74,-0.57,-0.52,-0.19,-0.44,-1.11,-1.76,-2.27,-2.69,-3.2,-3.64,-3.83,-3.99,-3.72,-2.72,-3.39,-3.72,-3.45,-2.95,-1.26,0.18,1.75,3.11,2.91,1.78,2.42,3.6,1.88,0.59,0.5,-0.77,-1.69,-0.63,0.83,-1.11,-0.44,-0.38,-1.77,-1.39,1.55,2.41,1.5,-2.96,-2.71,-2.08,-4.08,-4.08,-4.86,-3.04,-3.35,-4.47,-3.4,-4.18,-3.67,-5.5,-5.07,-7.38,-6.43,-7.33,-7.77,-8.41,-8.2,-6.91,-4.4,-3.6,-2.94,-1.65,-0.67,-0.86,-1.3,-1.94,-0.97,-4.13,-4.73,-5.79,-4.66,-3.06,-1.39,-0.88,0.85,0.03,-2.94,0.41,-1.02,2.29,-1.6,-0.89,1.82,-0.43,-2.17,-1.9,-1.43,0.74,1.33,1.82,1.16,0.01,-0.61,-0.8,-1.11,-1.31,-0.81,-0.47,-0.21,0.53,1.38,1.44,0.37,-0.71,-0.51,-0.05,0.35,0.4,1.77,-0.46,0.06,0.07,0.12,-0.25,0.19,1.78,3.06,2.89,3.27,4.2,4.24,4.17,4.4,4.5,4.71,4.8,4.57,4.2,4.44,4.85,-0.75,2.43,2.04,0.1,-1.92,-1.64,-3.1,-3.84,-1.32,2.17,3.04,2.11,-2.8,-2.58,-0.15,-0.14,-0.12,-0.86,-1.85,-2.27,-1.76,-0.44,0.52,1.86,5.04,-1.29,-2.58,-2.09,-1.4,-1.81,-1.56,-0.73,-0.62,-0.96,-1.2,-1.0,-1.15,-2.04,-2.05,-2.08,-2.62,-3.14,-3.36,-3.29,-3.33,-4.03,-4.78,-5.1,-5.15,-5.53,-4.71,-4.74,-4.91,-5.28,-4.9,-5.74,-6.06,-6.59,-6.88,-6.87,-6.64,-6.82,-6.92,-7.46,-7.88,-8.16,-8.17,-8.09,-8.09,-7.98,-8.01,-7.91,-7.55,-7.28,-7.06,-7.56,-7.88,-8.35,-8.46,-8.51,-8.5,-8.38,-8.5,-8.45,-8.45,-8.37,-8.29,-8.22,-8.15,-7.69,-7.56,-7.37,-7.37,-7.67,-7.52,-7.48,-6.88,-7.16,-7.67,-8.02,-7.61,-7.48,-7.47,-7.43,-7.3,-7.2,-7.23,-7.64,-7.53,-7.53,-8.08,-8.49,-9.43,-10.26,-10.3,-10.11,-9.83,-10.03,-9.59,-9.43,-9.59,-9.45,-9.74,-9.84,-9.84,-9.68,-9.51,-8.98,-8.98,-8.51,-8.02,-7.56,-6.69,-6.16,-6.16,-7.98,-7.7,-7.92,-7.7,-7.6,-7.22,-6.91,-6.19,-6.14,-5.96,-5.65,-5.46,-4.87,-4.77,-3.74,-2.74,-1.62,-1.07,0.32,1.57,2.68,3.25,3.12,3.09,3.73,4.75,6.11,6.41,6.1,6.2,4.83,2.77,0.77,1.57,4.6,-2.48,0.8,0.66,0.06,-3.11,-1.43,-5.72,-5.72,-6.42,-4.88,-6.91,-7.16,-6.41,-6.17,-6.25,-6.88,-7.28,-7.17,-6.49,-6.57,-6.57,-7.02,-6.96,-6.87,-6.55,-6.63,-6.67,-5.69,-5.53,-5.46,-7.29,-7.62,-6.77,-7.98,-7.65,-7.33,-7.08,-6.69,-6.53,-6.28,-6.09,-6.15,-6.17,-6.51,-6.14,-5.5,-4.8,-4.24,-3.85,-3.53,-3.21,-2.85,-2.57,-2.22,-1.88,-1.72,-1.33,-1.27,-1.33,-1.97,-2.52,-2.8,-3.01,-3.38,-3.69,-3.98,-4.19,-3.52,-3.86,-4.07,-4.08,-3.66,-3.15,-2.19,-1.35,0.07,1.5,2.64,2.08,1.74,2.26,3.51,2.3,2.98,2.16,1.22,-0.53,-1.07,3.42,3.63,2.06,2.37,1.71,0.14,2.48,2.98,3.48,-1.67,-2.48,-1.88,-3.96,-4.83,-3.91,-2.95,-4.86,-3.11,-2.75,-5.5,-5.55,-5.07,-5.98,-7.74,-8.1,-8.74,-8.7,-8.17,-8.47,-5.36,-5.08,-4.5,0.31,-2.61,-0.76,-0.73,0.03,-2.6,-0.12,-2.26,-4.86,-4.11,-0.69,-1.07,-1.79,-2.46,-0.85,-2.56,-2.64,-0.03,0.49,-0.21,-0.11,1.35,0.6,-1.79,-0.34,0.48,0.71,-0.08,-0.38,-0.65,-0.82,-1.31,-1.63,-1.72,-2.07,-2.11,-1.54,-1.14,-1.03,-0.26,0.79,0.79,0.2,-0.39,-0.18,0.25,0.54,1.97,3.36,0.75,0.47,1.38,1.14,0.38,-0.88,3.94,4.08,3.47,3.08,3.37,3.82,3.79,3.77,3.91,3.99,4.05,3.87,3.45,2.96,2.17,1.95,2.42,2.95,0.81,-0.7,-0.9,-3.77,-3.09,-1.72,1.42,2.47,2.44,1.84,-6.67,-0.57,-0.57,-1.65,-2.48,-2.99,-2.49,-2.5,-1.42,-0.49,-1.01,3.17,-1.48,-0.35,-2.75,-3.19,-2.18,-2.43,-1.56,-1.82,-2.47,-2.08,-2.2,-2.88,-2.6,-2.79,-3.27,-3.76,-4.06,-4.06,-4.06,-4.09,-5.05,-5.15,-4.77,-4.25,-4.19,-5.04,-5.53,-6.54,-5.89,-5.41,-6.2,-6.53,-6.84,-6.91,-7.06,-6.86,-6.56,-6.8,-6.76,-7.26,-8.17,-8.34,-8.49,-8.22,-8.2,-8.24,-8.13,-8.02,-7.92,-7.59,-7.55,-7.99,-8.66,-8.65,-8.68,-8.67,-8.65,-8.8,-8.63,-8.53,-8.58,-8.58,-8.38,-8.28,-7.3,-6.31,-5.06,-7.08,-7.06,-6.65,-7.14,-6.97,-7.41,-7.39,-8.29,-8.0,-8.01,-8.1,-8.15,-8.04,-7.72,-7.67,-7.95,-7.84,-7.58,-7.78,-7.99,-8.64,-9.34,-9.29,-9.17,-9.46,-9.26,-8.94,-8.94,-8.95,-8.94,-9.13,-9.32,-9.43,-9.18,-8.76,-8.76,-8.48,-7.87,-7.3,-6.75,-6.71,-5.91,-6.3,-6.22,-6.71,-7.0,-7.42,-7.76,-7.77,-7.45,-6.07,-6.43,-6.09,-5.99,-5.62,-5.28,-5.08,-3.77,-2.87,-1.97,-1.28,-0.2,0.91,2.05,2.61,2.48,2.44,3.07,4.26,5.02,5.27,5.06,5.47,5.87,6.04,6.21,6.07,4.43,1.59,-2.03,-0.03,1.14,-0.15,0.7,0.66,-1.82,-1.54,-0.48,-0.65,-6.68,-6.18,-5.97,-6.29,-6.31,-6.57,-6.6,-6.72,-7.03,-7.21,-7.46,-7.71,-7.66,-7.62,-7.85,-7.92,-7.46,-6.71,-7.22,-7.88,-7.74,-8.05,-7.66,-7.83,-7.62,-7.38,-6.98,-6.76,-6.77,-6.53,-6.57,-6.51,-6.47,-6.29,-6.08,-5.55,-5.21,-4.7,-4.43,-4.08,-3.79,-3.44,-3.22,-3.05,-2.91,-2.57,-2.64,-2.77,-3.1,-3.27,-3.4,-3.7,-3.96,-4.26,-4.11,-3.77,-4.08,-4.34,-5.04,-2.5,-3.13,-2.31,-1.7,-1.04,-0.09,1.06,1.0,1.52,1.61,1.44,2.22,3.41,2.26,2.53,1.46,-0.16,0.15,1.6,2.44,1.86,0.63,1.48,2.28,2.67,3.71,3.08,0.04,-0.38,-2.55,-2.36,-2.14,-3.81,-3.6,-4.32,-3.82,-5.21,-6.59,-6.37,-7.54,-6.84,-7.58,-7.79,-6.27,-5.72,-10.14,-10.17,-5.07,-5.71,-1.58,-4.36,-2.43,-3.15,-1.11,-0.58,-0.12,1.09,0.64,0.51,1.56,1.17,1.34,-1.33,-1.91,-1.56,0.22,-3.82,0.54,0.82,-0.94,-0.93,-0.23,-1.24,-2.64,-2.24,-1.83,-1.3,-1.02,-1.32,-1.86,-1.71,-1.76,-2.09,-2.25,-2.63,-2.53,-1.98,-1.75,-1.7,-0.92,0.04,0.24,0.11,-0.28,-0.3,0.13,0.11,0.47,0.49,1.27,1.47,1.82,0.58,-0.01,-0.18,3.46,3.39,2.69,2.8,3.08,3.18,2.97,2.72,2.99,3.41,3.35,2.9,2.46,2.02,1.43,1.23,2.38,4.5,0.83,-0.31,-1.44,0.91,1.18,-1.27,0.48,2.34,2.12,2.41,-2.83,0.0,-1.22,-1.91,-2.89,-3.11,-3.03,-2.74,-1.74,-0.63,-0.81,-0.18,-1.09,-0.67,-1.01,-2.66,-3.06,-3.05,-2.63,-2.51,-3.27,-2.98,-3.55,-3.27,-3.35,-3.67,-4.08,-4.4,-4.57,-4.6,-4.49,-5.09,-5.2,-4.92,-4.28,-4.11,-3.16,-4.67,-7.37,-6.61,-6.3,-6.13,-6.49,-6.72,-6.9,-7.0,-7.01,-6.81,-6.39,-6.29,-6.5,-6.9,-7.47,-8.2,-8.25,-7.99,-8.54,-8.73,-7.83,-8.51,-8.11,-7.98,-7.66,-8.01,-8.35,-8.58,-8.68,-8.7,-8.72,-8.86,-8.89,-9.05,-8.99,-8.48,-7.03,-8.35,-7.49,-6.52,-5.69,-5.96,-6.73,-6.51,-6.86,-7.1,-7.25,-7.64,-7.98,-8.25,-7.91,-8.05,-8.08,-8.17,-7.82,-8.03,-8.36,-8.41,-8.45,-7.83,-7.39,-7.67,-7.89,-8.27,-8.59,-8.79,-8.86,-8.58,-8.59,-8.62,-8.65,-8.7,-9.08,-8.98,-8.53,-7.9,-7.26,-7.42,-7.44,-7.25,-6.66,-6.59,-6.39,-5.67,-5.99,-6.31,-7.02,-7.13,-7.3,-7.53,-7.31,-6.55,-6.74,-6.26,-6.09,-5.58,-5.57,-5.2,-3.82,-2.83,-2.36,-1.68,-1.03,0.26,1.23,1.64,1.51,2.29,3.13,3.38,3.53,3.84,4.02,4.35,5.03,5.35,5.0,4.2,3.03,1.29,1.5,1.07,-0.23,0.67,0.3,0.69,0.69,-1.66,-0.55,-0.6,-5.93,-5.57,-5.52,-5.42,-5.54,-5.57,-5.77,-6.4,-7.03,-7.37,-8.06,-8.18,-8.35,-8.87,-9.13,-8.92,-8.66,-7.91,-8.0,-7.88,-8.91,-8.86,-6.6,-7.9,-7.69,-7.66,-7.21,-6.88,-6.88,-6.96,-6.9,-7.03,-7.05,-6.71,-6.52,-6.23,-5.91,-5.69,-5.53,-5.25,-4.98,-4.81,-4.8,-4.52,-4.17,-3.97,-3.97,-4.03,-4.1,-4.05,-4.02,-4.19,-4.32,-4.32,-4.26,-4.47,-4.2,-4.23,-3.42,-4.18,-2.91,-1.63,-0.93,-0.39,0.17,0.83,1.3,1.23,1.43,1.62,1.59,0.35,1.39,1.63,1.35,-0.41,0.88,1.21,2.6,1.74,0.87,2.24,2.69,2.44,2.63,2.95,1.41,1.22,1.04,0.28,0.08,-0.59,-0.53,-3.01,-2.25,-2.3,-4.27,-5.65,-6.36,-6.78,-6.43,-5.95,-4.12,-5.16,-6.62,-7.32,-2.74,-2.88,1.77,-2.13,-3.18,-2.77,-2.27,-0.1,1.85,3.52,2.2,2.54,1.99,1.34,-0.54,-0.31,0.21,-0.74,2.22,0.74,-4.03,-4.92,-5.44,-6.47,-4.92,-4.21,-4.32,-4.67,-2.93,-1.5,-1.09,-2.23,-2.2,-2.29,-2.65,-2.74,-2.86,-2.86,-2.79,-2.34,-2.29,-2.3,-1.74,-1.06,-0.95,-0.94,-1.15,-1.25,-0.85,-0.64,-0.04,0.75,2.48,-0.88,-0.08,-0.97,-1.09,0.5,2.68,1.97,2.16,2.13,2.2,2.37,2.2,2.24,2.28,2.3,2.0,1.11,-0.28,1.18,1.21,1.61,1.65,-0.36,2.53,-4.2,2.82,0.74,1.92,1.55,0.65,1.44,2.12,0.42,-2.41,-0.28,-2.18,-1.74,-1.74,-2.14,-3.92,-3.51,-2.18,-0.81,-0.1,1.43,1.04,-4.11,2.11,-3.57,-7.23,-3.75,-3.37,-3.35,-3.25,-3.77,-3.88,-3.95,-4.07,-4.36,-4.5,-4.7,-4.96,-4.94,-5.04,-5.31,-4.96,-5.05,-4.48,-3.08,-3.38,-5.67,-6.62,-6.85,-6.77,-6.77,-6.68,-6.66,-6.82,-6.98,-7.0,-6.93,-6.76,-6.48,-6.53,-6.83,-7.26,-7.76,-8.01,-7.86,-7.9,-8.29,-8.13,-8.6,-8.37,-8.23,-7.93,-7.94,-7.86,-8.1,-8.37,-8.31,-8.11,-8.35,-8.2,-8.23,-9.11,-8.1,-7.8,-7.67,-7.38,-6.75,-6.13,-5.71,-5.75,-6.19,-6.51,-7.07,-7.92,-7.83,-7.98,-8.52,-8.36,-8.16,-8.1,-8.07,-7.99,-8.07,-8.52,-8.76,-8.59,-8.39,-7.89,-7.79,-8.05,-8.37,-8.73,-8.66,-8.57,-8.48,-8.47,-8.5,-8.59,-8.56,-8.73,-8.34,-7.49,-6.59,-6.77,-7.13,-7.19,-7.27,-6.89,-6.34,-5.97,-6.1,-5.97,-6.26,-6.41,-6.34,-6.51,-7.1,-7.41,-6.7,-6.38,-5.82,-5.5,-5.75,-5.73,-5.21,-4.66,-3.29,-2.71,-2.2,-1.88,-0.5,-0.22,0.58,1.26,1.94,2.33,2.28,2.28,2.23,2.35,3.15,4.14,4.51,3.88,2.68,0.98,0.53,0.96,1.09,-0.46,0.27,1.83,3.6,0.74,-2.06,-0.62,-0.64,-5.36,-4.96,-4.95,-4.72,-4.72,-4.66,-4.87,-5.9,-7.25,-7.13,-7.74,-7.75,-8.61,-9.78,-9.71,-9.16,-9.28,-8.8,-8.25,-8.42,-8.78,-8.28,-7.85,-7.73,-7.93,-7.71,-7.47,-7.11,-7.23,-7.29,-7.0,-6.91,-7.2,-7.05,-6.91,-6.7,-6.51,-6.42,-6.3,-6.26,-6.11,-5.95,-5.86,-5.6,-5.26,-5.01,-4.96,-4.92,-4.81,-4.7,-4.61,-4.38,-4.43,-4.2,-4.3,-4.21,-4.15,-3.22,-3.79,-3.81,-2.48,-1.34,-0.31,0.42,0.5,1.26,1.43,1.2,0.37,0.9,2.02,2.47,1.55,1.3,0.79,-0.54,0.02,1.56,1.74,0.85,0.59,2.26,2.02,2.73,1.52,2.6,1.63,0.52,1.31,0.41,0.89,2.56,2.55,2.05,-0.16,0.91,0.5,0.05,-2.37,-3.25,-3.15,-2.94,-2.85,-4.09,-3.79,-2.18,1.64,-2.23,-4.08,-1.81,-2.09,-3.1,-3.17,0.51,1.08,3.37,3.4,3.65,0.88,-0.14,-0.99,-1.7,-0.62,-0.61,0.66,-3.17,0.82,-0.79,-5.49,-4.39,-4.4,-4.14,-3.2,-2.18,-2.98,-1.01,-2.24,-3.05,-2.69,-3.0,-3.43,-3.68,-3.81,-3.54,-3.27,-2.97,-3.05,-3.12,-2.72,-2.06,-1.78,-1.84,-1.84,-1.61,-1.33,-0.92,-0.16,1.21,3.81,-0.28,-1.4,-0.24,-0.94,-2.01,0.53,0.37,0.31,0.55,1.04,1.38,1.65,1.84,2.01,1.88,1.1,0.16,-3.42,0.14,1.42,1.5,1.43,0.82,1.9,-1.66,0.02,-3.98,-1.17,1.11,1.52,1.13,1.26,1.48,-2.28,-0.3,-2.75,-3.51,-3.14,-2.84,-3.67,-3.55,-2.7,-1.69,-0.88,-0.48,-3.85,-4.57,-1.66,-0.81,-1.68,-3.01,-3.51,-3.84,-4.01,-4.3,-4.55,-4.84,-5.03,-4.94,-4.89,-5.01,-5.15,-5.26,-5.53,-5.65,-5.37,-5.35,-4.89,-4.13,-4.02,-5.73,-6.8,-7.16,-7.18,-7.1,-6.78,-6.4,-6.53,-6.94,-7.13,-7.09,-7.12,-7.05,-6.85,-6.97,-7.19,-7.51,-7.59,-7.46,-7.55,-8.09,-8.28,-8.39,-8.79,-8.64,-8.28,-7.98,-7.79,-7.23,-7.8,-7.74,-7.57,-7.73,-6.85,-7.99,-8.39,-8.06,-8.0,-7.63,-7.14,-6.87,-6.34,-5.94,-5.8,-5.94,-6.36,-7.02,-7.78,-8.16,-7.88,-8.38,-8.36,-8.23,-8.06,-7.89,-8.01,-7.95,-7.84,-8.02,-8.05,-8.21,-8.13,-7.82,-7.99,-8.09,-8.19,-8.42,-8.6,-8.6,-8.21,-8.18,-8.16,-7.83,-7.34,-7.39,-7.05,-6.65,-6.77,-6.59,-6.7,-6.87,-6.63,-6.87,-6.65,-6.22,-6.31,-6.12,-5.7,-5.91,-5.96,-6.06,-6.83,-6.29,-5.83,-5.8,-5.36,-6.07,-5.77,-5.42,-5.04,-3.94,-3.46,-2.67,-1.87,-1.23,-0.56,0.32,0.55,1.45,1.13,1.42,1.28,1.03,1.52,2.48,3.29,3.18,2.16,0.7,-0.16,-0.44,-1.13,-1.13,-1.21,-0.9,0.58,2.63,1.35,-1.24,-1.43,-0.95,-4.88,-4.81,-4.4,-4.75,-4.52,-4.39,-4.32,-4.93,-5.93,-6.2,-6.37,-4.03,-8.22,-6.88,-9.79,-9.76,-9.33,-9.3,-8.64,-8.59,-8.59,-8.84,-8.33,-8.17,-7.91,-7.85,-7.64,-7.48,-7.4,-7.69,-7.66,-7.19,-7.23,-7.25,-7.22,-7.27,-6.91,-6.81,-6.83,-6.7,-6.64,-6.88,-6.51,-6.34,-6.15,-5.84,-5.52,-5.23,-5.13,-4.72,-4.48,-4.4,-4.13,-4.01,-3.89,-3.76,-3.5,-3.51,-3.56,-2.97,-2.35,-1.38,-0.07,1.07,1.11,1.3,2.9,1.9,0.87,0.6,0.93,1.71,1.39,0.28,0.58,0.46,0.4,1.36,0.57,1.11,0.72,1.69,2.38,2.51,1.34,1.15,1.49,0.84,1.18,0.14,1.21,1.38,2.39,1.79,1.17,2.79,1.97,2.9,-0.11,0.03,2.36,-0.26,-2.08,-0.95,-1.59,-3.64,-1.94,-4.98,-3.46,-1.74,-1.37,-3.07,-1.79,-0.4,1.67,2.19,2.92,1.57,-0.35,-0.15,-1.08,-1.07,-0.17,-1.07,-1.73,-5.56,-2.7,-1.3,-5.05,-3.16,-0.55,-0.22,-1.05,-1.58,-0.99,-0.73,-2.03,-2.88,-3.05,-3.55,-4.08,-4.27,-4.25,-4.01,-3.86,-3.7,-3.87,-4.02,-3.61,-3.13,-2.9,-2.56,-2.02,-1.33,-0.87,-0.92,-0.71,-0.06,0.73,2.15,-0.75,-0.75,-0.65,-3.84,-0.46,-0.47,-0.37,-0.32,-0.27,0.02,0.35,0.74,1.18,0.89,0.53,0.29,-0.67,-0.31,0.81,1.21,0.75,-0.41,0.45,-0.34,-1.21,-1.06,0.84,1.15,0.28,-0.02,0.46,-2.32,-3.0,-1.75,-2.86,-3.7,-3.23,-3.56,-3.05,-2.83,-2.75,-1.82,4.01,-3.16,-0.35,4.61,-3.99,-1.06,-5.54,-3.71,-3.94,-4.2,-4.53,-4.89,-5.21,-5.44,-5.72,-5.48,-5.25,-4.88,-5.12,-5.85,-5.89,-5.69,-5.67,-5.66,-5.32,-5.03,-4.65,-6.32,-6.92,-7.23,-7.46,-7.3,-6.76,-6.25,-6.28,-6.65,-7.11,-7.16,-7.15,-7.17,-7.18,-7.29,-7.45,-7.61,-7.54,-7.42,-7.6,-7.93,-8.26,-8.47,-8.82,-8.78,-8.42,-7.9,-7.54,-7.24,-7.4,-7.17,-6.96,-7.01,-7.04,-7.76,-7.93,-7.8,-7.77,-7.51,-7.25,-7.25,-6.95,-6.57,-6.37,-6.39,-6.57,-7.12,-8.19,-8.39,-8.08,-8.44,-8.23,-8.2,-8.26,-7.95,-8.01,-7.88,-7.68,-7.5,-7.31,-7.35,-7.7,-7.69,-7.63,-7.64,-7.86,-8.2,-8.52,-8.5,-8.15,-7.93,-7.37,-7.2,-7.44,-7.49,-7.64,-7.32,-6.62,-6.3,-6.78,-6.89,-6.54,-6.69,-6.82,-6.23,-5.84,-5.4,-5.86,-5.96,-5.83,-6.24,-6.09,-5.91,-5.9,-5.82,-5.46,-5.79,-5.95,-5.59,-5.22,-4.7,-4.32,-3.37,-2.29,-1.35,-0.83,-0.05,0.36,0.17,0.16,0.48,0.62,0.63,0.93,1.31,1.49,1.37,0.72,-0.39,-0.33,-1.08,-1.76,-1.11,-1.42,-1.16,-0.3,2.14,2.44,-0.43,-3.99,-1.45,-3.82,-3.72,-4.03,-4.37,-4.22,-3.58,-3.93,-4.06,-4.09,-1.44,0.14,-1.0,-2.35,-1.85,-0.09,-3.43,-4.84,-6.47,-7.58,-5.08,-5.72,-7.51,-8.44,-7.89,-8.05,-7.65,-7.69,-7.61,-7.61,-7.72,-7.91,-7.48,-7.65,-7.71,-7.42,-7.37,-7.18,-7.13,-7.24,-7.2,-7.17,-7.17,-7.0,-6.9,-6.63,-6.08,-5.64,-5.28,-4.92,-4.6,-4.38,-4.16,-4.09,-3.95,-3.73,-3.44,-3.48,-3.49,-3.11,-2.63,-2.12,-1.21,0.04,1.24,1.27,1.51,3.64,4.95,1.96,-0.29,0.4,1.5,1.24,1.86,2.08,0.9,1.33,1.4,0.87,0.62,0.66,1.29,2.07,1.46,0.98,0.69,1.88,1.63,1.15,0.11,-0.02,0.39,2.5,0.97,2.84,1.13,2.58,2.01,3.61,4.23,3.92,2.22,2.09,1.13,1.66,-1.35,-1.46,-3.26,-2.45,-0.9,0.34,1.57,1.39,1.25,1.82,2.02,0.85,-0.96,0.41,-0.26,-1.81,-0.08,0.65,-1.7,-2.0,-1.4,-3.36,-1.26,-0.15,0.07,-1.84,-0.52,-1.0,-0.96,-1.45,-1.03,-1.81,-2.85,-3.13,-3.84,-4.22,-4.34,-4.38,-4.36,-4.34,-4.49,-4.63,-4.24,-4.45,-4.14,-3.63,-3.36,-3.06,-2.35,-2.07,-1.8,-1.43,-0.82,0.38,3.53,-0.03,-1.86,-2.53,0.92,-0.08,-1.41,-1.05,-1.56,-1.71,-1.28,-1.05,-0.28,-0.19,-0.93,-0.93,-1.55,-1.03,-0.51,0.38,0.66,0.53,-0.27,-2.81,-1.26,-1.91,-2.1,-0.94,-1.79,2.83,-3.65,-4.2,-3.3,-2.55,-1.56,-2.82,-2.78,-2.64,-2.84,-3.17,-3.03,-1.97,2.17,-1.78,-0.22,-1.51,1.72,-2.42,-2.4,-5.66,-4.19,-4.25,-4.48,-4.84,-5.23,-5.33,-5.69,-6.3,-5.7,-5.15,-5.08,-5.3,-5.65,-5.68,-5.8,-6.11,-5.99,-5.42,-5.44,-5.1,-6.52,-6.86,-7.15,-7.51,-7.37,-6.71,-6.29,-6.19,-6.67,-7.22,-7.03,-6.9,-7.2,-7.48,-7.66,-7.62,-7.69,-7.58,-7.46,-7.62,-7.87,-8.17,-8.38,-8.67,-8.66,-8.35,-7.82,-7.57,-7.25,-7.09,-6.92,-6.7,-6.64,-6.98,-7.05,-7.03,-7.17,-7.32,-7.15,-7.47,-7.57,-7.58,-7.08,-7.47,-7.25,-7.27,-7.45,-8.06,-8.08,-8.35,-8.38,-8.42,-8.38,-8.14,-8.21,-8.02,-7.91,-7.61,-7.1,-6.67,-6.61,-6.82,-7.13,-7.5,-7.48,-7.71,-7.9,-8.01,-8.28,-8.02,-7.68,-7.66,-7.19,-7.0,-7.52,-7.63,-7.28,-6.83,-6.49,-6.52,-6.78,-6.04,-6.34,-6.16,-5.81,-5.28,-5.71,-5.94,-5.78,-6.6,-6.38,-6.17,-5.68,-5.77,-5.57,-4.87,-6.63,-6.25,-6.44,-5.49,-5.27,-4.72,-3.89,-3.0,-3.13,-0.86,-0.44,-0.52,-0.62,0.07,0.87,0.59,-0.8,-0.23,0.48,0.03,0.42,1.0,0.1,-0.32,-0.27,-1.94,-1.31,-1.3,-0.51,0.49,1.43,2.29,0.63,-0.46,-1.79,0.55,-2.43,-2.95,-3.39,-2.35,-1.87,-2.24,-1.87,0.69,0.07,-0.8,1.28,-0.96,-0.68,-0.73,0.09,0.58,1.11,1.26,-1.46,-0.11,-5.77,-7.52,-7.51,-7.91,-7.27,-7.23,-7.4,-7.75,-7.77,-8.06,-7.86,-7.84,-7.55,-7.48,-7.52,-7.3,-7.32,-7.37,-7.32,-7.35,-7.23,-6.95,-6.78,-6.43,-5.9,-5.37,-4.98,-4.86,-4.56,-4.38,-4.4,-4.2,-3.91,-3.57,-3.3,-3.47,-3.25,-2.87,-2.52,-1.8,-1.0,0.22,1.35,1.5,1.86,3.35,4.44,3.64,1.29,0.83,0.07,1.79,2.15,1.75,1.61,1.23,1.35,-0.46,0.01,1.17,1.37,1.63,1.22,0.7,0.27,0.75,1.83,1.09,0.91,-0.52,1.1,2.97,4.26,2.9,3.37,1.84,3.37,3.4,4.25,2.67,3.8,1.08,0.93,0.79,0.1,0.11,2.46,3.39,2.65,2.41,2.35,3.07,1.59,2.05,0.05,-0.61,-0.05,0.33,-1.65,-1.06,-1.63,-1.25,-1.28,-1.8,-0.63,-1.6,-2.2,-0.42,0.35,-0.47,-1.79,-1.41,-1.16,-1.26,-1.26,-2.08,-2.6,-2.96,-3.46,-3.61,-3.71,-4.35,-4.27,-4.49,-4.91,-5.11,-4.79,-4.78,-4.78,-4.59,-4.74,-4.11,-3.49,-3.06,-2.69,-1.98,-1.01,0.12,1.42,0.0,-2.04,0.97,2.97,-4.0,-1.04,-1.67,-2.75,-2.61,-2.09,-1.72,-1.46,-1.83,-1.6,-1.74,-1.94,-1.18,-0.46,0.02,0.32,0.59,1.37,-1.78,-4.78,-2.06,-2.23,-1.93,-1.05,-0.33,-3.17,-3.42,-3.17,-2.34,-2.36,-2.88,-2.94,-3.08,-3.18,-3.39,-2.57,3.19,-2.45,-0.33,-0.99,-0.22,-1.32,-3.37,-2.96,0.38,-2.64,-3.31,-4.42,-4.81,-4.8,-4.96,-5.58,-6.32,-5.6,-5.7,-5.25,-5.62,-6.3,-5.5,-6.05,-5.95,-5.82,-5.41,-5.1,-5.28,-6.3,-6.68,-7.07,-7.32,-7.41,-6.79,-6.38,-6.16,-6.72,-7.08,-6.78,-6.84,-6.91,-7.39,-7.71,-7.71,-7.77,-7.77,-7.61,-7.64,-7.81,-8.13,-8.48,-8.58,-8.43,-8.1,-7.65,-7.4,-7.26,-7.15,-6.93,-6.69,-6.48,-6.48,-6.47,-6.52,-6.44,-6.92,-7.03,-6.76,-7.6,-7.27,-7.51,-8.3,-7.79,-7.68,-7.76,-7.68,-7.98,-8.29,-8.26,-8.54,-8.49,-8.38,-8.09,-7.73,-7.68,-7.32,-7.04,-6.53,-6.36,-6.3,-6.76,-7.2,-7.46,-7.53,-7.55,-7.68,-7.58,-7.61,-7.8,-7.58,-7.36,-6.66,-6.57,-7.66,-6.86,-6.57,-8.0,-5.58,-5.11,-6.34,-5.78,-6.0,-5.35,-5.46,-5.77,-5.3,-4.99,-6.03,-5.82,-5.89,-5.24,-4.95,-5.61,-5.09,-6.49,-6.42,-5.29,-4.9,-5.74,-5.18,-4.31,-3.62,-3.05,-2.2,-1.44,-1.06,-0.1,0.53,1.0,-0.2,-2.04,-0.3,1.15,1.28,1.98,2.09,1.89,1.61,0.45,1.29,1.27,1.74,1.81,1.82,2.65,2.82,2.54,1.21,-1.02,0.04,0.63,0.36,0.17,-0.61,0.5,1.21,0.23,1.21,0.8,0.93,0.79,0.38,0.64,-0.73,-0.76,0.97,1.76,1.16,-3.87,-1.8,-0.96,-1.47,-7.07,-6.89,-7.46,-5.95,-7.32,-7.81,-7.83,-7.84,-7.85,-7.62,-7.4,-7.4,-7.34,-7.33,-7.29,-7.33,-7.25,-7.06,-7.11,-6.79,-6.4,-5.78,-5.72,-5.61,-5.53,-5.44,-5.01,-5.2,-4.81,-4.39,-3.94,-3.75,-3.54,-3.27,-2.83,-2.49,-2.24,-1.76,-0.95,0.23,1.29,1.79,2.29,2.94,3.58,4.27,3.47,1.38,0.33,0.61,0.69,0.79,0.91,0.77,0.85,0.15,0.1,1.48,1.63,1.07,0.8,1.03,0.44,0.18,0.35,1.64,1.22,1.26,1.68,2.71,2.79,0.57,2.02,0.43,0.84,2.13,1.74,2.32,1.9,0.57,-0.09,1.0,0.44,1.2,2.14,2.72,2.41,2.15,1.2,2.85,1.12,0.69,-0.41,-1.4,-0.66,-1.31,-0.96,-0.27,-0.79,-0.12,1.23,-1.33,-1.43,-2.29,-2.01,-1.64,-0.73,-0.34,-1.41,-1.32,-1.89,-1.3,-1.71,-2.29,-2.49,-2.56,-2.93,-3.11,-3.08,-3.15,-3.46,-4.24,-5.25,-5.34,-5.52,-4.5,-5.23,-5.09,-4.96,-4.83,-3.98,-3.67,-3.43,-2.68,-1.66,-1.05,0.03,2.37,1.69,0.27,1.08,-1.36,-0.46,-2.13,-3.62,-3.31,-2.5,-2.33,-2.28,-2.23,-1.09,-0.6,-1.1,-0.48,-0.1,-0.55,0.35,0.39,0.39,1.67,-2.33,-0.53,-2.07,-1.98,-1.41,-1.98,-3.25,-2.99,-3.03,-3.08,-3.31,-3.59,-3.4,-3.63,-3.13,-2.82,-3.38,-4.0,-2.61,-2.2,-2.08,-1.91,1.74,1.28,0.74,-2.59,-2.32,-0.99,-3.75,-4.76,-3.74,-3.5,-4.31,-6.88,-5.99,-6.43,-5.63,-5.41,-5.72,-5.44,-5.34,-5.15,-5.1,-4.92,-4.55,-5.26,-5.71,-6.38,-7.25,-7.42,-7.28,-7.15,-6.37,-5.77,-6.25,-6.51,-6.59,-6.59,-6.53,-7.14,-7.64,-7.51,-7.48,-7.9,-8.06,-7.72,-7.79,-7.91,-8.25,-8.42,-8.28,-7.95,-7.67,-7.38,-7.28,-7.01,-6.77,-6.74,-6.73,-6.47,-5.9,-5.8,-5.93,-6.22,-6.67,-6.89,-7.4,-7.6,-8.04,-8.14,-7.91,-7.42,-7.24,-7.47,-8.0,-8.19,-7.81,-8.12,-8.67,-8.38,-8.29,-7.77,-7.48,-7.17,-6.59,-6.08,-6.11,-6.14,-6.37,-7.11,-7.39,-7.45,-7.54,-7.07,-6.83,-7.7,-7.43,-8.3,-6.98,-7.31,-6.85,-6.43,-7.05,-5.58,-6.27,-5.49,-4.38,-5.21,-5.54,-5.88,-5.47,-5.34,-5.02,-4.88,-4.28,-5.22,-4.81,-4.41,-5.03,-4.47,-3.75,-3.98,-2.09,-2.84,-3.81,-3.92,-5.05,-5.95,-4.83,-4.39,-3.71,-2.8,-1.11,-0.45,0.44,1.31,1.12,1.95,1.43,2.72,3.78,3.08,2.35,1.95,2.14,2.88,3.49,4.98,4.57,4.26,3.03,2.37,2.79,2.68,3.18,2.22,2.36,1.61,-0.15,0.01,-0.71,-0.06,0.29,0.23,0.83,-0.06,0.55,0.38,-1.01,1.13,-0.2,-0.35,0.3,0.34,2.01,1.31,-2.9,-1.12,-1.26,-1.03,-0.12,-5.36,-5.83,-6.25,-6.99,-7.19,-7.18,-7.68,-7.69,-7.62,-7.7,-7.2,-7.11,-7.12,-7.08,-7.09,-7.09,-6.93,-6.59,-6.27,-5.55,-5.6,-5.78,-5.93,-5.97,-5.77,-5.58,-5.41,-4.86,-4.34,-4.19,-4.06,-3.7,-3.06,-2.26,-2.12,-2.18,-1.86,-1.24,-0.06,1.13,1.94,2.66,3.15,3.39,3.87,3.64,2.68,0.71,0.8,1.3,0.98,0.96,0.49,0.58,0.7,0.5,0.99,1.22,1.11,0.28,1.35,1.22,0.77,0.19,0.48,1.47,1.67,2.08,2.58,-0.07,-1.08,0.5,1.94,1.14,1.92,3.1,3.27,1.33,0.2,0.89,1.41,0.47,0.78,1.45,2.07,2.16,2.27,1.51,2.03,1.32,0.53,1.01,-0.84,-1.52,-1.21,-1.14,-0.61,-0.59,-1.48,-1.06,-1.39,-0.94,-1.5,-1.67,-0.61,-0.9,-1.24,-1.69,-1.27,-1.43,-1.27,-2.05,-2.15,-2.35,-2.21,-2.42,-2.56,-2.19,-2.26,-2.83,-4.6,-4.72,-5.67,-5.33,-5.42,-4.96,-4.53,-3.98,-4.35,-4.38,-4.01,-3.82,-3.12,-2.75,-1.9,-0.98,0.05,0.09,-0.2,0.82,-2.08,-3.56,-0.91,-3.63,-3.87,-3.11,-2.9,-2.98,-2.57,-2.07,-1.03,-0.26,0.09,-0.68,0.21,0.5,0.78,0.68,-1.57,0.57,-2.32,-2.5,-2.11,-1.69,-2.14,-2.53,-2.86,-3.09,-3.07,-3.27,-3.37,-3.28,-3.32,-3.11,-3.42,-2.45,-5.18,-2.47,-2.03,-1.72,0.32,0.66,1.6,4.53,-0.98,0.88,-1.59,-3.16,-2.4,-3.14,-2.62,-1.04,-5.73,-5.86,-5.4,-5.99,-5.79,-4.78,-4.84,-4.55,-4.75,-4.63,-4.49,-3.74,-5.29,-5.28,-6.27,-7.4,-7.56,-7.72,-7.65,-6.77,-4.79,-4.44,-5.44,-6.04,-5.75,-5.98,-6.95,-7.54,-7.62,-7.56,-7.5,-8.08,-7.87,-7.88,-7.88,-8.14,-8.09,-8.16,-7.94,-7.45,-7.34,-6.95,-6.82,-6.78,-6.8,-6.79,-6.31,-5.66,-5.05,-5.51,-5.57,-6.21,-6.59,-6.98,-7.35,-7.56,-7.18,-7.36,-7.23,-7.47,-7.85,-7.75,-7.39,-6.81,-7.4,-7.05,-8.14,-7.86,-7.72,-7.37,-6.94,-6.71,-6.56,-6.2,-5.89,-5.57,-6.55,-7.74,-7.22,-7.67,-6.65,-6.74,-6.62,-9.28,-8.02,-7.7,-6.87,-6.64,-5.8,-5.69,-5.65,-5.46,-4.6,-4.28,-4.8,-4.69,-4.65,-4.68,-3.66,-3.57,-4.04,-3.93,-3.88,-3.14,-2.95,-2.21,-2.74,-1.37,1.19,1.42,1.05,1.37,-0.57,-0.99,-0.51,1.25,-0.17,0.36,-0.45,0.27,0.62,2.37,1.29,0.47,2.58,4.23,4.65,4.53,3.28,2.27,2.51,3.0,4.27,4.82,5.34,5.41,4.55,3.77,3.15,2.91,2.52,3.22,2.03,2.55,2.39,0.94,0.26,0.55,0.9,1.13,0.97,-0.06,0.81,0.29,-0.51,-0.2,-1.13,-0.76,0.42,1.76,0.98,0.35,0.04,0.18,-1.52,-2.34,-1.04,-0.39,-1.19,-4.58,-6.46,-6.81,-6.56,-6.85,-7.28,-7.35,-7.13,-7.33,-6.97,-6.83,-6.61,-6.51,-6.49,-6.49,-6.53,-6.26,-5.92,-6.15,-5.67,-6.31,-6.26,-6.48,-5.77,-5.52,-5.51,-5.2,-4.87,-4.42,-4.3,-3.44,-2.93,-2.21,-1.89,-2.26,-2.08,-1.66,-0.54,0.84,2.07,2.82,3.22,3.15,3.32,3.81,4.05,3.38,0.69,0.78,0.73,0.65,0.49,0.65,0.88,0.63,0.64,0.49,1.12,1.81,2.81,4.74,4.48,3.7,1.61,0.17,1.02,0.64,0.08,-0.63,1.48,1.52,0.72,1.32,1.33,2.64,2.35,0.73,0.63,1.41,0.81,0.46,0.61,1.33,1.91,1.45,1.57,0.93,1.4,1.9,0.65,0.69,-1.35,-1.54,-1.93,0.44,0.1,0.31,-1.2,-1.34,-1.15,-0.02,0.01,-0.54,0.91,-0.17,-0.78,-0.98,-2.04,-1.28,-1.35,-1.86,-1.85,-1.9,-1.67,-1.91,-1.71,-1.85,-2.13,-1.86,-2.72,-2.88,-4.94,-4.94,-5.16,-4.91,-4.1,-3.94,-4.14,-4.28,-4.14,-3.65,-2.83,-2.67,-2.15,-1.39,-0.52,-0.57,-0.52,-0.75,-2.14,-0.36,-1.28,-2.22,-3.21,-2.84,-2.84,-3.42,-2.83,-2.81,-2.0,-0.86,-0.32,-0.48,-0.03,1.46,1.94,1.8,-0.29,1.33,0.45,-1.46,-2.36,-1.66,-1.85,-2.44,-3.45,-3.62,-3.42,-3.5,-3.27,-3.33,-2.88,-2.1,0.88,4.28,-1.42,-3.55,-2.28,-1.47,-0.93,-1.81,-1.74,1.36,-0.31,-2.21,-0.56,-3.55,-2.8,-2.42,-1.52,-2.37,-3.06,-5.4,-5.45,-4.49,-4.94,-4.48,-4.09,-4.53,-4.18,-4.26,-3.79,-4.36,-4.15,-4.23,-5.83,-6.88,-8.12,-7.72,-8.87,-7.7,-5.4,-2.95,-3.6,-4.12,-4.47,-4.93,-6.03,-6.99,-7.27,-6.85,-7.33,-6.83,-7.82,-8.53,-9.03,-7.3,-7.33,-8.28,-7.76,-6.94,-7.31,-6.96,-6.76,-6.61,-6.49,-6.4,-5.97,-5.18,-4.94,-5.05,-5.8,-6.26,-6.69,-6.77,-6.62,-6.47,-6.95,-6.88,-7.18,-6.73,-7.49,-7.18,-6.68,-6.41,-6.33,-6.6,-7.51,-7.53,-7.67,-7.48,-7.17,-7.16,-6.71,-6.29,-5.9,-5.59,-5.79,-6.19,-6.55,-6.6,-6.14,-7.46,-7.1,-7.21,-6.03,-6.98,-6.84,-6.83,-6.61,-4.84,-3.76,-2.8,-2.8,-3.93,-3.35,-2.96,-2.89,-3.07,-3.08,-2.73,-2.55,-4.38,-3.29,-1.24,-0.31,0.67,0.27,1.19,2.02,1.17,2.39,2.19,3.27,2.27,3.3,2.65,1.55,1.09,-0.07,1.54,2.54,2.23,2.54,4.05,5.05,4.63,3.78,4.18,4.24,2.04,3.03,3.26,3.26,3.77,4.46,4.87,5.32,4.79,3.96,2.45,3.03,3.22,2.06,2.25,2.21,2.13,1.08,1.12,2.02,2.35,0.96,-0.22,1.1,-1.0,-0.5,0.76,-0.38,-0.13,0.76,1.24,0.89,0.14,0.74,-0.17,0.1,-0.13,-3.02,-0.59,-0.88,-0.97,-3.63,-5.48,-4.05,-6.22,-6.54,-7.0,-6.9,-6.45,-6.62,-6.51,-6.75,-6.71,-6.63,-6.48,-6.26,-6.09,-6.44,-6.57,-6.29,-6.27,-6.09,-6.14,-5.3,-4.96,-5.13,-5.19,-4.99,-4.68,-4.15,-2.81,-2.94,-2.76,-2.52,-2.28,-2.34,-2.33,-1.56,-0.03,1.26,2.2,2.65,2.81,2.69,3.12,3.3,3.01,2.62,0.87,0.54,0.7,0.59,0.67,0.99,0.81,0.61,0.62,0.65,4.18,4.47,4.87,4.71,3.87,3.12,0.58,1.28,-0.28,-0.97,0.37,1.2,1.42,1.59,1.63,1.68,0.84,1.1,1.39,0.92,0.64,0.4,0.05,0.61,0.92,1.7,0.98,0.06,0.96,1.07,0.76,0.9,0.54,0.29,-2.86,-2.09,-1.83,-0.54,-0.99,-1.06,-2.29,-0.37,-0.57,0.38,1.21,-0.35,0.0,-0.67,-1.82,-1.35,-1.21,-0.87,-0.76,-1.14,-1.42,-1.11,-0.9,-0.94,-0.68,-0.18,-0.15,-1.23,-0.93,-1.86,-2.76,-5.12,-4.63,-5.05,-4.77,-4.29,-4.26,-4.0,-3.46,-3.15,-3.39,-2.52,-1.75,-0.94,-1.61,-0.92,-1.19,-0.24,0.36,-2.34,-2.01,-2.23,-0.55,0.13,-2.4,-2.48,-2.5,-1.86,-1.08,-0.84,-0.81,2.22,-0.28,0.28,2.5,3.12,2.19,1.18,-1.35,-2.11,-0.23,-1.17,-2.29,-3.84,-3.24,-3.79,-3.07,-3.03,-2.38,-2.11,0.05,1.65,-0.74,-0.93,-1.94,-2.38,-2.45,-2.17,-2.73,-3.12,-4.04,-5.57,-2.8,-1.67,-2.3,-2.25,-1.89,-1.75,-1.7,-2.08,-3.55,-2.41,-3.56,-3.49,-3.7,-3.52,-4.77,-4.06,-3.86,-3.87,-3.61,-2.86,-3.34,-3.99,-5.09,-6.58,-7.34,-8.66,-7.5,-5.55,-3.4,-2.4,-1.81,-3.19,-4.6,-4.2,-5.0,-6.97,-5.8,-5.91,-6.41,-5.27,-8.16,-7.05,-6.94,-5.07,-6.53,-8.33,-7.25,-7.31,-7.23,-6.89,-6.52,-6.32,-5.91,-5.65,-4.97,-5.0,-5.13,-5.64,-5.91,-6.29,-5.87,-5.88,-6.0,-6.14,-6.62,-6.66,-6.1,-7.29,-6.85,-6.33,-5.93,-5.75,-6.28,-6.71,-7.1,-7.92,-7.73,-7.7,-7.26,-6.72,-6.19,-5.71,-5.39,-5.13,-5.41,-6.08,-5.68,-6.22,-6.04,-5.93,-4.27,-4.01,-4.81,-4.78,-4.96,-4.06,-2.11,-2.33,-1.9,-2.01,-2.1,-1.74,-1.3,-1.82,-2.24,-2.27,-1.67,-2.04,-2.41,-0.94,-0.31,-0.21,-0.81,-0.89,-0.85,0.0,0.85,2.13,1.92,1.41,0.72,1.06,1.14,0.39,0.74,1.65,1.7,1.82,2.83,4.38,4.79,5.23,4.22,2.49,2.64,3.36,3.29,2.42,2.03,2.18,3.03,3.4,3.59,4.11,5.06,2.99,2.31,3.3,2.77,2.13,2.78,2.78,2.63,1.49,1.37,2.16,2.57,0.37,0.28,0.41,-0.63,0.44,0.56,0.64,0.58,0.65,0.33,-0.66,0.35,0.51,-0.91,0.25,0.62,0.15,-1.44,-0.27,0.04,-0.72,-1.06,-1.75,-0.89,-0.52,-4.72,-7.17,-5.92,-6.2,-5.86,-5.87,-6.78,-6.88,-7.05,-6.12,-7.12,-6.98,-6.23,-5.73,-6.0,-6.34,-5.36,-4.62,-4.12,-4.24,-4.88,-4.75,-5.11,-4.25,-2.67,-2.58,-2.1,-2.59,-2.89,-2.07,-3.7,-2.5,-1.45,-0.83,-0.14,1.04,1.94,2.34,2.69,3.05,3.05,2.81,2.44,1.71,0.73,0.96,2.14,3.18,2.86,2.56,1.17,3.21,3.6,3.92,4.23,3.9,3.69,3.81,2.8,2.0,1.13,1.84,-0.59,0.0,0.81,1.06,1.43,0.76,0.49,0.61,1.35,0.77,1.36,0.33,0.76,0.88,0.75,0.96,0.2,-0.58,0.72,0.19,0.79,0.45,-0.57,-0.4,-0.6,-3.37,-6.84,-5.18,-3.51,-0.64,-0.09,1.45,0.74,0.19,0.47,0.5,0.44,-0.74,-1.6,-1.48,-0.79,-0.41,0.2,0.54,0.06,-0.71,-0.45,-0.23,0.28,0.61,0.19,0.23,0.49,-0.65,-1.69,-2.29,-4.64,-4.17,-4.63,-4.31,-4.0,-4.06,-3.31,-2.39,-2.65,-2.61,-2.26,-1.52,-0.75,-0.38,-1.35,-0.06,-0.01,0.35,-2.75,-2.33,-0.93,-1.83,-1.7,-1.42,-1.67,-1.83,-0.91,-1.02,-0.85,-1.07,2.76,1.54,-0.19,4.45,2.37,1.81,-0.24,-1.24,-0.67,-0.71,-1.65,-2.49,-1.25,-3.44,-2.9,-2.14,-2.12,-1.87,1.02,-0.53,-1.25,-0.3,-4.48,-2.32,-2.57,-2.72,-3.0,-3.1,-3.49,-3.61,-1.31,-2.56,-1.29,-1.26,-1.07,-0.83,-0.42,0.29,-0.77,-0.37,-1.54,-1.93,-3.51,-3.94,-3.71,-3.95,-3.61,-3.48,-2.86,-1.94,-2.25,-2.48,-3.12,-4.45,-5.45,-6.11,-7.28,-5.05,-1.93,-1.16,-2.99,-2.48,-3.04,-3.05,-2.66,-3.0,-4.07,-4.29,-4.37,-3.8,-3.58,-3.45,-6.21,-6.26,-4.19,-4.63,-7.06,-6.22,-6.76,-7.17,-6.52,-5.99,-5.68,-5.31,-5.07,-5.2,-5.11,-5.23,-5.62,-5.63,-5.41,-5.18,-5.48,-6.65,-5.86,-6.26,-6.2,-6.14,-6.1,-5.67,-5.68,-5.83,-5.89,-6.08,-6.33,-7.26,-7.54,-7.47,-7.05,-6.35,-5.97,-5.24,-4.74,-4.38,-4.5,-5.46,-4.99,-5.12,-4.45,-3.84,-3.34,-2.86,-2.86,-3.55,-3.7,-2.81,-3.02,-3.33,-3.59,-3.11,-2.29,-1.75,-2.25,-2.05,-2.35,-2.22,-1.99,-2.54,-2.14,-2.21,-1.95,-1.95,-2.4,-2.44,-2.12,-1.16,0.02,1.66,-0.27,-0.34,-1.29,-0.28,0.65,-0.03,-0.08,0.89,0.27,1.38,2.37,3.54,5.16,2.78,2.38,0.73,1.44,2.28,2.2,1.72,1.28,1.34,1.85,2.33,2.81,3.35,3.97,2.71,2.42,2.97,3.19,2.65,3.36,2.9,2.64,2.44,1.98,1.99,2.1,0.13,-0.11,0.58,-0.55,0.67,-0.03,0.46,0.46,0.56,0.55,0.75,0.19,0.58,0.01,0.2,1.13,1.41,-0.08,-0.72,0.19,-1.09,-0.32,-0.72,-0.75,-0.62,-0.39,-3.41,-5.89,-6.87,-3.75,-6.6,-5.45,-6.51,-5.75,-5.73,-5.43,-5.51,-4.01,-3.47,-4.52,-4.8,-3.69,-2.36,-3.36,-3.41,-3.6,-3.84,-4.09,-4.54,-2.33,-1.94,-0.21,0.5,-1.64,0.0,-3.32,-2.87,-1.77,-0.08,1.25,1.6,2.21,2.36,2.18,2.15,1.69,1.5,2.22,2.28,2.38,2.45,3.49,2.79,2.4,1.97,2.66,3.54,2.5,2.77,3.19,3.05,3.83,3.56,1.75,0.61,0.08,2.61,-0.83,0.9,0.92,0.92,1.01,0.33,0.17,0.65,0.62,0.59,1.4,0.8,0.61,0.74,0.92,0.03,-0.04,-0.55,0.0,-0.09,0.5,0.96,0.22,-0.6,0.4,-1.26,-4.21,-5.98,-5.19,-2.23,0.1,0.81,1.1,0.34,0.67,1.18,0.3,-0.43,-1.15,-1.4,-0.41,-0.22,0.54,0.73,1.12,-0.01,0.08,1.58,1.84,0.84,0.18,-0.31,-0.79,-0.28,-0.63,-1.32,-2.71,-3.23,-4.27,-3.99,-2.91,-2.37,-2.56,-2.21,-2.16,-2.06,-2.48,-1.41,-0.98,-0.27,-0.85,-1.2,0.37,-1.09,-2.01,-1.62,-0.25,-1.54,-1.81,-3.17,-2.37,-1.44,-1.06,-0.99,-1.25,-1.6,-0.22,2.63,0.8,-0.58,1.75,2.79,0.75,-0.28,-0.55,-0.34,-0.35,-0.92,-2.14,-2.48,-2.85,-1.74,-0.83,0.01,-0.61,-0.61,-1.47,-1.17,-2.1,-2.71,-2.76,-3.31,-3.49,-2.89,-2.51,-1.3,-1.67,-0.66,-0.23,-0.37,-0.25,-0.06,0.26,1.05,1.11,0.41,-0.73,-1.86,-3.21,-3.53,-3.53,-3.96,-3.5,-2.98,-2.43,-1.44,-0.66,-0.05,-0.98,-1.71,-4.93,-4.73,-5.28,-3.23,-1.7,0.27,-4.37,-0.43,-2.15,-3.08,-3.86,-3.26,-2.54,-3.04,-3.6,-3.77,-2.86,-2.42,-2.28,-1.95,-3.59,-2.84,-5.67,-5.86,-5.7,-6.52,-6.1,-5.86,-5.46,-5.28,-5.17,-4.97,-5.0,-5.39,-5.14,-4.79,-5.25,-4.9,-5.3,-6.64,-6.06,-5.8,-5.73,-5.76,-5.46,-5.55,-5.66,-5.33,-5.27,-5.28,-5.88,-6.33,-7.16,-6.67,-5.97,-5.54,-5.2,-4.36,-3.94,-3.86,-3.83,-4.23,-3.78,-3.68,-3.12,-3.62,-3.52,-3.2,-3.56,-4.12,-4.48,-4.25,-4.26,-4.31,-3.86,-3.48,-2.81,-2.72,-2.59,-3.08,-2.76,-2.34,-2.45,-2.85,-2.77,-2.63,-2.82,-3.3,-3.71,-3.66,-3.05,-2.05,-1.18,-0.71,-1.03,-1.97,-2.19,-1.13,-0.47,-0.38,-0.64,-1.4,-0.9,0.22,1.14,2.24,2.74,1.53,-0.99,-0.17,0.71,1.39,1.38,0.75,0.61,0.5,0.82,1.56,2.5,2.91,2.95,2.53,2.48,3.02,2.94,3.05,3.43,3.15,2.83,3.31,2.26,1.69,1.76,0.14,-0.15,-1.41,0.5,0.91,0.68,0.64,0.44,0.54,0.42,0.8,0.85,0.95,1.0,0.0,0.57,1.02,0.78,1.39,1.29,-1.11,-0.12,-0.91,-0.45,-0.9,-0.58,0.62,-5.11,-5.11,-4.8,-4.84,-4.94,-5.13,-5.42,-5.28,-5.12,-4.91,-4.85,-4.81,-4.36,-4.17,-3.85,-3.17,-3.31,-2.26,-2.74,-2.77,-1.96,-2.62,-1.75,-0.4,1.49,2.22,2.29,3.28,2.54,-0.71,-1.68,-1.55,-0.29,-1.23,-0.44,-0.05,-0.53,0.0,-0.45,1.02,1.62,1.38,1.43,2.04,1.92,1.68,1.44,1.67,2.17,2.52,1.45,2.08,1.81,1.64,1.48,0.97,0.37,-1.0,-0.38,0.09,0.42,0.75,1.14,1.03,0.74,0.25,0.21,0.44,0.45,0.57,1.35,0.81,0.58,0.99,1.08,1.14,-0.09,-0.09,-0.56,-0.12,-0.1,1.44,0.5,-0.64,-0.21,-0.34,-1.11,-1.83,-4.26,-1.22,0.12,1.33,1.45,1.14,0.86,0.9,0.62,-0.92,-0.94,-1.0,-0.09,0.09,0.84,1.81,1.87,1.69,1.57,2.13,2.61,2.47,0.57,-0.05,0.0,-0.07,-0.52,-0.32,-0.21,-0.61,-2.09,-2.32,-1.65,-1.12,-1.75,-2.17,-2.11,-1.39,-2.22,-1.63,-0.9,-0.65,-1.2,-1.41,-0.18,-0.96,-1.09,-0.92,-0.78,-0.81,-1.69,-2.77,-3.01,-1.44,-0.91,-1.23,-1.42,-2.14,0.05,-0.05,2.33,-0.19,-0.38,0.11,-0.4,1.05,-2.17,0.26,0.1,-0.23,-0.39,-0.93,-2.68,1.43,-0.39,-1.24,-0.3,-1.26,-1.03,-0.65,-3.19,-3.62,-3.45,-3.88,-3.46,-2.85,-2.97,-3.29,-1.36,-0.42,-0.44,-1.43,0.17,0.39,0.68,1.1,1.0,1.08,-0.31,-1.64,-2.46,-2.98,-3.4,-3.67,-3.45,-2.62,-2.01,-0.85,-0.1,1.88,0.48,-0.27,-1.46,-3.26,-2.58,-2.65,2.25,-0.95,-2.67,-2.53,-2.37,-3.51,-3.43,-2.84,-2.27,-2.56,-3.25,-2.88,-2.27,-2.65,-2.6,-2.16,-2.17,-1.94,-5.05,-5.13,-4.56,-4.8,-5.62,-5.83,-5.4,-4.89,-5.13,-4.87,-4.53,-4.93,-4.93,-4.5,-5.24,-5.46,-5.58,-6.09,-5.92,-5.44,-5.21,-5.11,-4.99,-4.85,-5.38,-4.74,-4.45,-3.91,-4.28,-5.85,-5.52,-5.12,-4.87,-4.68,-4.51,-3.85,-3.62,-3.35,-3.0,-3.55,-2.99,-2.65,-2.97,-3.71,-3.99,-4.15,-4.5,-4.86,-5.03,-4.75,-4.64,-4.5,-3.74,-3.31,-3.22,-2.48,-2.43,-3.25,-2.92,-2.71,-3.02,-3.0,-2.4,-2.74,-3.44,-3.73,-4.1,-4.32,-3.65,-2.72,-1.59,-1.73,-2.15,-2.73,-3.05,-2.5,-1.97,-1.45,-1.63,-1.9,-1.16,-0.3,0.2,0.74,0.26,-1.08,-1.38,-0.45,0.04,0.2,0.15,-0.21,-0.61,-0.47,-0.12,1.03,2.22,2.21,1.77,1.43,1.97,2.24,2.52,2.69,2.97,3.29,3.21,3.28,1.81,1.0,-0.43,-1.08,1.3,0.87,0.91,1.14,0.65,0.67,0.67,0.78,0.65,1.22,1.42,-0.16,-0.34,1.11,0.96,0.95,0.85,1.12,0.3,0.5,-0.64,0.2,-0.79,-0.84,-0.41,0.68,-3.22,-5.44,-4.97,-5.31,-5.09,-4.89,-5.46,-5.66,-5.86,-6.16,-6.0,-5.65,-5.28,-4.88,-4.38,-4.07,-3.73,-3.59,-2.85,-2.61,-2.29,-1.96,-1.36,-0.3,0.2,0.76,0.81,0.91,-0.1,-2.27,-2.27,-1.91,-0.87,-2.78,-2.87,-2.83,-2.36,-1.82,-1.08,-0.68,-0.38,0.43,1.51,0.29,-0.36,0.46,0.12,0.94,1.6,1.45,0.3,1.2,0.92,0.58,-0.51,-0.71,-0.43,-1.96,-1.74,-0.67,-0.03,1.1,0.76,0.76,0.82,0.17,0.09,0.11,0.63,1.04,0.85,0.77,0.57,1.15,0.94,0.81,0.79,0.28,-0.14,-0.53,1.25,3.09,0.84,-0.72,-0.33,-1.55,-0.27,0.84,-1.3,-0.14,0.38,1.07,1.95,1.36,0.4,1.29,0.47,-0.45,-1.13,-0.67,0.32,0.95,1.47,2.54,3.31,3.02,2.7,3.31,3.15,2.86,1.62,1.13,1.07,0.61,0.8,0.88,1.39,0.75,-0.31,-0.57,-0.79,-0.81,-1.6,-1.84,-2.1,-1.75,-1.89,-1.69,-0.94,-1.09,-1.12,-0.59,-0.55,-0.25,-1.1,-1.18,-0.09,-1.19,-0.5,-2.75,-2.75,-1.6,-1.89,-0.29,-0.86,-0.62,-0.84,-0.01,-2.0,1.64,-0.74,-0.02,-0.25,-0.51,1.23,-0.26,0.54,0.6,0.73,2.06,-0.38,-0.6,-0.73,0.0,-1.2,-1.02,-0.66,-0.26,-0.99,-2.63,-1.23,0.01,-1.4,-1.5,0.44,-3.62,-0.72,1.83,0.13,-3.11,0.3,0.88,0.76,1.01,1.66,1.67,1.82,-0.45,-1.95,-2.47,-3.25,-3.41,-3.02,-2.45,-1.61,0.13,1.42,2.03,3.36,1.69,1.01,0.41,0.39,-0.42,0.1,-0.51,-3.41,-2.82,-3.13,-3.16,-2.86,-2.17,-1.66,-2.05,-2.81,-2.15,-2.06,-2.47,-2.43,-2.46,-2.34,-2.28,-4.59,-4.1,-4.7,-4.66,-4.88,-5.22,-5.45,-4.75,-4.64,-4.45,-4.36,-4.48,-3.76,-4.56,-5.18,-5.42,-5.15,-5.63,-5.55,-5.12,-4.98,-4.4,-4.68,-4.25,-4.89,-4.49,-4.13,-3.7,-3.34,-3.92,-4.22,-3.49,-3.65,-3.96,-3.57,-3.4,-3.05,-2.72,-2.8,-2.93,-2.71,-2.65,-3.0,-3.37,-3.68,-3.93,-4.37,-4.77,-5.08,-5.09,-5.04,-4.67,-3.97,-3.49,-2.94,-2.35,-2.6,-3.36,-2.97,-3.17,-3.25,-3.08,-1.57,-2.28,-3.94,-3.36,-3.72,-3.78,-3.25,-3.01,-2.17,-2.12,-2.7,-3.46,-3.6,-3.12,-3.01,-2.76,-2.07,-1.82,-1.66,-0.34,-0.57,-1.1,-1.57,-1.86,-1.36,-0.83,-0.41,-0.48,-0.79,-1.06,-1.53,-1.44,-0.75,0.63,1.41,1.42,-0.58,-0.03,0.73,1.08,1.44,1.52,2.1,2.97,3.41,2.89,2.46,-0.01,-1.88,0.21,0.6,-0.07,-0.05,0.68,0.55,0.71,1.03,0.89,0.67,0.74,-0.14,0.08,0.37,0.81,1.05,0.64,0.51,0.89,1.17,0.41,0.48,0.67,-0.95,-0.94,-0.72,-0.55,-1.83,-5.07,-5.21,-5.64,-5.81,-5.9,-6.39,-6.17,-6.36,-6.76,-6.32,-6.01,-5.64,-5.04,-4.63,-4.23,-3.96,-3.55,-3.38,-2.86,-2.36,-1.93,-1.59,-1.41,-0.92,-0.35,-1.53,-1.12,-1.8,-1.99,-2.86,-2.92,-3.02,-3.57,-3.85,-3.68,-2.92,-2.24,-1.46,-1.23,-0.84,-0.09,0.04,-0.89,-1.2,-0.6,-0.14,0.04,0.43,1.06,-0.62,-0.1,-0.33,-0.4,-1.13,-1.14,-2.87,-1.95,-1.6,-0.89,0.12,0.84,0.98,1.21,0.52,-0.27,-0.17,0.08,0.58,0.77,0.59,0.46,0.59,0.77,1.0,0.67,0.13,0.17,-0.11,0.38,0.39,2.13,2.7,-1.26,-1.69,-1.41,-0.72,1.06,0.07,0.88,0.59,1.09,1.68,1.13,-1.28,-0.3,-0.91,-0.23,-1.28,-1.53,-0.35,1.1,1.94,3.06,3.72,4.41,3.75,4.13,4.58,3.64,3.09,2.53,2.8,1.53,1.78,1.32,1.48,1.23,0.78,0.47,-1.17,-0.99,-1.23,-1.32,-1.32,-0.95,-1.02,-1.2,-0.82,-0.78,-0.38,-0.72,-0.35,-0.26,-0.91,-1.07,-1.21,-1.79,-1.17,-1.45,-2.01,-2.27,-2.07,-0.97,-0.75,0.38,0.25,0.48,-0.18,2.68,1.53,-0.71,0.0,0.28,-1.31,0.3,0.09,0.27,1.28,4.01,-0.98,0.03,-0.07,-0.35,-1.24,-0.88,-0.03,0.07,-1.79,-2.78,-2.3,-1.71,-3.13,-4.12,-2.97,-1.43,-0.23,2.02,-2.88,-1.79,1.09,0.33,0.84,1.18,0.96,1.27,0.87,-0.09,-1.94,-2.18,-2.64,-3.17,-2.86,-2.19,-1.58,-0.3,2.2,2.4,2.28,2.15,2.7,2.16,1.84,0.46,-1.02,-1.28,-3.16,-2.65,-3.55,-3.37,-2.91,-1.44,-1.66,-1.33,-2.42,-1.94,-1.16,-1.6,-2.49,-1.73,-1.93,-3.11,-3.55,-3.81,-4.02,-3.48,-4.98,-4.77,-4.37,-4.04,-3.87,-3.54,-3.96,-3.45,-2.89,-3.32,-3.48,-4.87,-3.89,-5.25,-4.99,-4.97,-4.49,-3.98,-3.92,-4.1,-4.63,-4.38,-3.64,-3.38,-3.18,-3.3,-3.06,-2.89,-3.03,-3.59,-3.17,-2.93,-2.81,-2.83,-2.52,-2.5,-2.56,-2.45,-2.71,-3.16,-3.37,-3.96,-4.56,-4.84,-5.29,-5.56,-5.33,-4.93,-4.36,-3.72,-3.13,-2.83,-3.03,-3.73,-3.29,-3.34,-3.28,-2.58,-1.8,-2.83,-3.67,-3.15,-3.57,-3.41,-2.69,-2.82,-2.77,-2.6,-3.0,-3.11,-3.55,-3.3,-3.09,-2.82,-2.18,-2.07,-1.63,-1.32,-1.48,-0.94,-1.51,-1.85,-1.52,-0.9,-0.79,-0.64,-1.15,-1.49,-1.91,-2.09,-1.51,-0.59,0.1,-1.5,-0.23,-0.17,0.16,0.03,0.36,0.42,1.44,2.36,3.01,2.61,0.9,0.4,-1.39,0.19,-0.37,-0.29,-0.26,0.46,0.84,0.7,1.11,0.75,0.49,0.52,0.7,0.94,0.72,0.74,0.64,0.62,0.84,1.01,1.27,0.7,0.68,-0.04,-0.43,-0.69,-0.7,-1.93,-1.83,-4.72,-5.89,-6.16,-6.49,-6.23,-6.82,-6.95,-7.12,-7.1,-6.87,-6.23,-5.89,-5.35,-4.96,-4.34,-3.86,-3.28,-3.08,-3.15,-2.83,-2.22,-2.57,-2.39,-2.15,-1.42,-1.89,-2.02,-2.24,-3.56,-3.91,-3.63,-4.53,-4.45,-3.99,-3.75,-3.3,-2.78,-2.01,-1.67,-1.51,-1.48,-1.58,-1.96,-1.68,-1.34,-1.21,-0.71,-0.22,0.3,-1.22,-0.65,-1.08,-1.45,-0.44,-1.46,-3.43,-2.55,-1.89,-1.23,-0.53,0.17,1.33,1.03,0.58,-0.33,-0.17,-0.2,0.11,0.7,0.61,0.06,0.35,0.47,0.56,-0.12,-0.08,-0.68,-0.46,0.9,0.28,1.6,1.09,-1.77,-1.13,-2.39,1.35,-0.99,0.88,0.7,0.39,1.49,1.13,-0.56,-2.05,-1.64,-1.03,-0.94,-3.38,-1.84,-1.24,0.36,1.87,2.85,3.9,4.43,4.49,4.04,4.65,4.67,3.47,3.26,2.74,2.65,1.69,1.32,1.48,0.68,0.42,0.33,-0.56,-0.4,-1.06,-1.31,-0.76,-0.8,-0.32,-0.97,-1.12,-0.88,-0.95,-0.41,-0.77,-0.37,-0.37,-2.09,-1.93,-2.16,-2.33,-2.25,-2.13,-1.98,-1.79,-1.53,-0.95,-0.4,0.91,0.87,1.14,1.33,1.89,-0.7,-0.71,0.03,0.43,0.98,-0.96,-0.12,0.01,1.58,0.24,0.15,-0.37,-0.37,-1.08,-0.08,-0.63,-0.26,0.41,0.74,-1.2,0.0,-0.27,-1.08,-0.91,-1.24,0.13,1.59,-0.36,-0.93,0.63,0.9,1.98,0.52,-1.54,1.08,-0.86,-0.13,-3.05,-2.81,-1.51,-1.21,-1.13,-1.5,-1.29,-0.34,1.77,3.11,2.56,1.82,2.32,1.1,1.49,-1.29,-3.2,-2.25,-2.63,-3.2,-3.58,-3.32,-2.92,-2.15,-1.97,-2.28,-1.95,-1.72,-1.16,-1.01,-2.71,-1.94,-1.32,-2.61,-2.72,-2.55,-2.85,-2.32,-3.31,-3.22,-3.68,-2.97,-3.68,-2.58,-1.55,-1.4,-1.03,-1.13,-1.53,-1.48,-1.85,-3.48,-5.84,-4.76,-4.0,-3.45,-3.57,-4.12,-4.18,-4.0,-3.49,-3.03,-2.95,-2.72,-2.74,-3.0,-3.33,-3.84,-3.6,-2.68,-2.93,-2.94,-2.71,-2.59,-2.61,-2.67,-2.9,-3.06,-3.35,-3.92,-4.49,-4.9,-5.43,-5.62,-5.66,-5.34,-4.37,-3.89,-3.39,-2.93,-3.31,-3.89,-3.59,-3.71,-3.27,-2.64,-2.62,-3.49,-3.77,-3.51,-3.25,-2.65,-2.41,-2.51,-3.02,-2.97,-3.44,-3.43,-3.42,-3.62,-3.68,-3.42,-2.81,-2.4,-2.14,-2.07,-2.13,-1.82,-1.78,-1.87,-1.47,-1.2,-1.53,-1.1,-1.18,-1.58,-1.58,-2.16,-2.39,-2.36,-2.88,0.02,0.48,0.23,-0.73,-0.46,-0.05,0.06,0.91,1.94,2.26,1.68,0.84,-1.29,0.2,-0.33,-0.56,-0.47,-0.49,-0.13,1.06,1.06,1.08,0.9,0.74,0.77,1.11,0.81,0.7,0.56,0.84,0.66,0.99,1.03,1.0,1.17,0.95,0.93,0.23,-0.54,-0.58,-0.86,-0.85,-1.2,-0.93,-0.52,-6.07,-6.73,-7.36,-7.62,-7.84,-7.87,-7.6,-7.06,-6.59,-5.79,-4.97,-4.81,-4.04,-3.49,-2.88,-2.99,-3.53,-3.35,-3.23,-3.31,-3.27,-2.58,-1.89,-1.74,-1.99,-6.5,-5.22,-5.57,-5.52,-4.94,-4.44,-3.98,-3.83,-3.42,-2.74,-2.16,-2.46,-2.24,-2.32,-2.85,-2.06,-1.52,-2.21,-1.61,-1.61,-0.74,-1.4,-1.28,-1.63,-1.71,-1.21,-1.17,-0.79,-3.05,-2.78,-2.32,-1.21,0.07,0.8,1.22,0.81,-0.31,-0.54,-0.56,0.43,0.84,0.63,-0.06,-0.13,0.26,0.21,-0.12,-0.58,-0.59,0.14,0.83,-0.02,1.28,0.96,-1.27,-0.74,-1.05,-0.86,-1.27,-0.7,0.07,-0.49,0.82,-1.41,-2.3,-2.3,-2.57,-2.0,-2.26,-2.72,-2.33,-2.05,-1.07,-0.23,1.57,2.61,3.48,4.35,5.04,5.01,4.88,4.96,3.19,3.14,2.97,2.83,1.52,1.06,0.76,0.28,-0.31,0.47,0.25,-0.01,-0.84,-0.17,-0.8,-0.39,-0.54,-1.19,-1.29,-0.96,-0.58,-0.8,-1.46,-1.21,-1.85,-2.37,-2.7,-2.89,-2.74,-2.99,-2.49,-2.37,-2.34,-1.18,-0.61,0.26,0.91,0.66,2.17,0.43,2.11,-1.01,0.16,-0.55,0.3,-0.76,-1.24,-0.5,-1.88,2.45,-0.46,-0.77,-0.69,-1.42,-0.54,-0.86,0.37,-0.53,1.58,-0.19,-1.63,-3.46,-0.21,0.15,-0.96,-1.43,-0.36,-1.74,-0.19,1.08,1.38,4.06,1.2,-1.84,0.95,3.7,2.26,-0.25,-1.8,-2.12,-0.5,0.07,-0.13,-0.23,0.18,1.74,0.81,1.83,1.86,2.66,1.27,-0.49,-2.29,-4.33,-3.47,-4.04,-3.87,-3.52,-3.56,-2.89,-2.59,-2.89,-1.92,-1.44,-1.85,-1.6,-1.39,-1.86,-1.95,-2.73,-2.31,-2.28,-1.61,-1.99,-1.07,-0.06,-1.49,-0.49,-2.38,-0.68,-0.63,0.56,0.43,1.06,0.56,-0.19,-0.92,-0.85,-1.92,-4.01,-4.03,-3.31,-3.3,-3.26,-3.98,-3.75,-3.07,-3.1,-2.65,-2.55,-2.27,-1.94,-2.43,-2.78,-2.7,-3.02,-2.47,-3.11,-3.08,-2.97,-2.72,-2.67,-2.83,-2.93,-3.08,-2.99,-3.22,-3.92,-4.88,-5.53,-5.74,-6.04,-5.44,-4.33,-3.61,-2.97,-2.8,-3.81,-4.1,-4.3,-4.12,-3.78,-3.7,-3.71,-3.75,-3.97,-3.89,-3.41,-3.08,-3.12,-3.62,-3.99,-4.0,-3.98,-4.41,-4.47,-4.74,-4.81,-4.36,-3.82,-3.28,-3.2,-3.09,-2.6,-2.43,-2.01,-1.71,-1.06,-1.32,-1.87,-1.71,-1.64,-1.32,-1.84,-3.07,-3.82,-3.11,-2.47,-1.39,-0.77,-0.83,-1.47,-1.23,-0.11,-0.14,0.37,1.24,1.77,2.03,0.23,-1.54,-0.15,-0.63,-0.53,-0.49,-0.67,-0.06,0.93,1.02,0.75,0.95,1.15,1.06,1.01,0.8,0.84,0.92,0.81,0.67,0.99,1.15,0.97,0.96,2.08,1.57,0.5,0.1,-0.68,-0.84,-0.46,-0.55,-0.79,-0.12,-0.93,-1.18,-7.13,-7.6,-8.26,-8.48,-8.26,-8.13,-7.28,-6.26,-5.16,-4.95,-4.49,-3.85,-3.02,-2.72,-3.77,-4.35,-4.2,-4.23,-3.91,-2.75,-2.01,-2.47,-4.35,-8.26,-6.95,-6.49,-5.97,-5.49,-5.05,-4.7,-4.4,-3.77,-3.77,-3.53,-3.17,-2.22,-2.19,-2.82,-3.2,-2.63,-2.74,-2.89,-2.59,-1.75,-1.73,-1.61,-1.58,-1.6,-1.41,-0.91,-0.46,-1.37,-2.04,-2.88,-2.72,-1.0,0.71,0.78,1.16,0.24,0.31,-0.53,0.06,0.46,0.53,-0.27,-0.29,-0.07,0.33,0.11,-0.61,-0.5,-0.58,-1.1,0.49,0.15,0.47,0.35,-0.28,-2.13,-1.13,-0.12,-0.22,-1.1,-0.92,-1.23,-1.64,-2.52,-3.08,-2.4,-3.01,-3.69,-2.74,-3.29,-2.04,-0.87,-0.2,-0.54,-0.91,1.38,3.84,4.59,4.2,4.95,5.17,4.45,3.36,3.88,3.09,2.46,1.68,1.17,0.27,-0.15,0.32,0.51,1.06,0.04,-0.13,-0.16,0.4,0.09,-0.31,-0.79,-0.77,-0.26,-0.59,-1.46,-1.33,-1.94,-1.84,-2.32,-3.52,-3.1,-3.5,-3.14,-2.88,-2.77,-1.72,-0.69,-0.09,0.23,0.34,0.52,1.71,1.44,1.25,-0.44,-0.1,-0.77,-0.61,-0.76,-1.66,-2.82,-2.3,-2.01,-1.16,-1.39,-1.06,-1.42,-1.49,-2.05,-1.81,0.61,-1.84,3.45,-1.87,-1.99,-3.42,-1.6,0.81,-4.45,2.2,0.04,-2.26,-0.97,2.43,0.91,0.46,-1.9,1.36,-0.53,-1.0,-1.35,-1.29,-1.19,-1.23,-0.97,-0.49,-0.35,0.02,0.93,0.94,2.02,2.6,2.14,0.39,-3.49,-3.32,-5.1,-4.28,-3.5,-4.49,-3.97,-3.54,-3.43,-2.84,-1.43,-1.83,-1.04,-2.19,-2.08,-1.91,-2.85,-3.75,-2.8,-2.39,-2.63,-1.38,0.87,1.02,1.85,2.23,1.08,2.19,2.62,3.12,2.35,2.93,2.67,2.31,1.45,-0.31,-2.06,-2.04,-3.0,-2.9,-2.56,-2.84,-3.33,-3.69,-2.54,-2.54,-2.38,-2.38,-1.9,-1.72,-0.95,-0.82,-1.88,-1.33,-2.01,-2.15,-2.55,-2.33,-2.52,-2.4,-2.55,-2.64,-2.36,-2.34,-2.67,-3.47,-3.85,-4.67,-5.93,-5.95,-5.55,-4.23,-2.98,-2.1,-2.28,-3.68,-4.16,-4.53,-4.29,-4.18,-4.61,-4.29,-4.29,-4.57,-3.87,-3.6,-3.71,-4.01,-4.47,-4.57,-5.01,-4.78,-5.18,-5.21,-5.47,-5.59,-4.98,-4.53,-4.06,-3.75,-3.66,-3.41,-2.5,-1.98,-1.51,-1.13,-1.06,-1.3,-1.84,-2.06,-2.09,-1.82,-3.44,-4.03,-3.86,-3.68,-2.52,-1.97,-1.65,-1.89,-1.46,-0.79,-0.43,-0.26,0.11,1.58,4.02,2.75,-0.69,-0.37,0.22,-0.41,-0.4,-0.48,0.36,0.81,1.13,0.75,0.41,1.13,1.09,0.99,0.84,0.76,0.85,0.9,0.45,1.09,1.25,1.18,0.87,0.73,0.45,0.36,0.47,0.5,0.54,0.66,-0.65,0.12,-0.08,-0.73,-0.71,-1.13,-1.49,-4.4,-3.91,-4.24,-8.59,-8.1,-6.69,-5.59,-5.08,-5.08,-4.23,-3.63,-3.31,-3.87,-4.55,-4.84,-4.97,-4.59,-3.37,-1.65,-6.54,-9.0,-8.21,-7.46,-7.11,-6.47,-6.03,-5.79,-5.44,-4.89,-4.18,-4.23,-4.44,-3.87,-3.48,-3.11,-2.84,-3.54,-3.74,-3.38,-3.22,-3.0,-2.52,-2.17,-1.9,-2.0,-1.6,-1.55,-0.51,-0.15,-0.9,-1.23,-1.93,-2.22,-1.45,0.17,0.45,1.33,-0.07,-0.47,0.71,-0.22,-0.63,-0.04,-0.3,-0.48,-0.06,0.25,0.06,-0.43,-0.42,-0.93,-1.32,0.0,0.64,0.39,-1.47,-1.28,-1.67,0.07,-1.3,0.52,-0.47,0.06,-3.57,-3.5,-3.46,-3.04,-2.96,-3.03,-3.02,-2.95,-3.98,-2.82,-1.52,-0.71,-0.21,-0.41,1.06,1.92,2.81,4.06,4.79,4.47,4.3,4.45,4.13,3.64,2.88,2.43,1.74,1.84,0.97,1.16,1.12,1.56,1.41,0.48,0.28,0.8,1.03,0.49,-0.03,-0.25,0.13,-0.21,-0.65,-0.71,-1.57,-1.62,-1.96,-2.13,-3.4,-3.12,-3.27,-2.57,-2.35,-2.33,-1.13,-0.67,-0.21,-0.57,-1.12,-0.98,-0.36,2.72,0.83,-1.07,-0.95,-1.61,-2.75,-3.35,-4.59,-4.82,-5.05,-5.53,-5.69,-4.73,-3.35,-4.07,-3.95,-4.18,-2.21,-2.35,5.2,-2.15,-3.56,-4.65,-4.57,-4.4,-3.98,-3.18,-1.96,-1.63,-0.6,-0.07,0.23,1.07,0.79,-0.61,0.06,-0.08,-1.16,-0.63,-0.98,-0.24,-1.03,-1.12,-2.66,-1.36,-0.1,0.54,2.6,3.33,2.98,-0.06,-2.08,-3.22,-4.99,-4.62,-3.95,-5.11,-4.35,-4.12,-3.66,-2.64,-2.18,-2.18,-2.72,-2.92,-3.49,-4.52,-4.34,-3.54,-3.56,-3.47,-2.64,-1.62,-0.6,1.14,1.53,2.2,1.89,1.06,-0.38,0.59,2.37,2.98,3.27,3.3,1.53,-1.7,-0.89,-0.21,-1.98,-2.19,-2.16,-2.04,-3.05,-2.46,-2.5,-2.27,-2.35,-1.76,-1.63,-0.71,-0.18,1.33,0.59,-1.19,-0.83,-1.38,-1.97,-1.52,-1.9,-1.7,-1.27,-2.47,-3.03,-2.61,-2.26,-3.25,-3.58,-3.61,-5.44,-6.11,-5.64,-4.64,-3.43,-3.18,-3.56,-4.04,-3.46,-4.73,-4.46,-4.61,-4.52,-4.3,-4.12,-3.63,-3.52,-3.91,-4.3,-4.5,-5.28,-5.79,-5.34,-5.32,-5.47,-5.74,-5.91,-5.92,-5.38,-4.86,-4.85,-4.2,-3.9,-3.8,-3.23,-2.61,-2.15,-1.48,-0.8,-1.16,-2.1,-2.67,-2.62,-2.48,-3.49,-3.93,-4.47,-4.23,-3.71,-2.96,-2.52,-1.94,-1.89,-0.82,-0.88,-1.67,-1.47,-0.4,1.99,-0.28,-0.38,0.04,0.47,0.04,0.15,-0.13,0.02,0.27,0.88,0.87,0.44,0.63,0.87,1.2,-0.32,0.59,0.78,0.98,0.09,1.5,1.27,0.91,0.56,0.38,0.04,0.18,0.38,0.64,0.69,0.89,-0.58,0.07,0.36,0.18,0.07,-0.07,0.09,-1.09,-5.85,-2.43,-2.34,-8.18,-7.14,-6.32,-5.25,-5.0,-4.99,-3.83,-3.49,-3.81,-4.42,-5.4,-5.55,-5.47,-4.66,-6.67,-9.89,-8.72,-7.98,-7.83,-7.72,-7.11,-6.68,-6.39,-5.83,-5.3,-4.67,-4.89,-4.78,-4.26,-4.41,-4.13,-3.59,-3.51,-3.89,-3.9,-3.77,-3.45,-2.76,-2.4,-2.15,-2.14,-1.92,-1.03,-0.85,-0.63,-0.47,-0.92,-1.03,-1.25,-0.99,-0.99,0.29,0.35,-0.47,-0.48,0.48,0.09,-0.94,-0.39,-0.25,-0.31,-0.05,-0.13,0.02,-0.07,-0.4,-0.61,-0.74,-1.08,0.64,-1.08,-2.72,-2.13,-3.78,-2.49,-1.97,-0.42,1.32,-0.09,-5.56,-5.2,-4.65,-4.28,-3.85,-3.5,-3.16,-3.3,-4.16,-3.07,-2.06,-0.94,-0.45,-0.87,0.22,1.47,3.14,4.26,5.09,5.1,4.31,4.19,4.29,4.25,3.85,3.25,2.79,2.93,2.79,2.41,2.19,1.88,1.96,1.57,1.73,1.94,1.4,0.96,0.98,0.61,0.96,0.29,0.41,0.16,-1.02,-1.1,-1.65,-1.62,-3.38,-2.41,-3.48,-2.46,-2.78,-3.42,-2.45,-2.33,-1.51,-2.1,-2.65,-2.03,-2.06,0.1,-0.26,-0.19,-1.83,-3.38,-3.3,-4.3,-5.64,-5.59,-5.95,-6.79,-6.56,-6.3,-6.97,-6.75,-5.19,-3.49,0.44,-2.89,-2.77,-3.4,-4.87,-4.66,-4.92,-4.57,-4.55,-2.45,-2.14,-2.55,-2.31,-2.58,-1.15,0.35,0.51,2.17,2.28,1.23,-0.9,0.29,-0.23,-0.19,0.02,-0.26,0.38,-2.95,-2.04,0.16,2.34,3.68,1.83,-1.88,-1.98,0.86,-5.41,-4.26,-4.98,-5.25,-4.78,-4.48,-4.26,-3.92,-3.93,-2.93,-2.91,-4.17,-4.7,-4.59,-4.62,-3.94,-4.01,-2.8,-2.71,-3.0,-2.13,-2.04,-1.55,-1.22,-0.49,-0.59,-0.57,1.5,2.78,3.44,3.38,3.71,2.33,0.62,-0.26,-0.19,-1.48,-1.65,-2.38,-1.76,-1.72,-2.16,-2.14,-1.72,-2.28,-1.78,-1.56,-0.31,0.29,1.33,-0.13,-1.39,-1.68,-1.45,-1.51,-1.37,-1.2,-0.85,-0.85,-2.14,-3.2,-2.5,-2.19,-3.34,-4.14,-4.08,-5.11,-5.45,-5.77,-5.2,-4.12,-3.8,-4.27,-5.2,-5.36,-4.05,-4.86,-4.76,-4.33,-3.93,-3.91,-3.59,-3.84,-4.35,-5.05,-5.78,-6.54,-5.76,-4.95,-5.54,-5.95,-6.06,-6.11,-5.89,-5.4,-5.16,-4.65,-4.33,-4.03,-3.95,-3.42,-2.86,-2.57,-2.35,-1.33,-0.97,-2.17,-2.99,-3.17,-3.13,-3.56,-4.2,-4.98,-4.78,-4.24,-3.85,-3.25,-2.57,-1.41,-1.09,0.14,-1.35,-2.1,-1.64,0.41,-0.32,1.48,-0.15,0.91,1.05,0.65,-0.1,-0.11,0.74,0.73,1.07,0.23,0.88,1.07,0.38,-0.35,0.35,0.94,0.99,0.5,-0.34,1.27,-0.15,0.45,-0.32,0.0,0.24,0.7,0.81,0.72,0.83,-0.38,-0.13,0.86,0.97,0.47,0.93,1.01,-0.17,-4.27,-5.42,-2.66,-3.29,-5.03,-4.22,-5.75,-5.06,-5.24,-5.01,-5.04,-4.54,-5.01,-5.61,-6.63,-6.9,-6.7,-8.89,-8.79,-8.44,-8.19,-8.31,-8.15,-7.59,-7.18,-6.79,-6.46,-5.96,-5.4,-5.08,-4.62,-4.82,-4.82,-4.61,-4.49,-4.06,-3.89,-4.26,-4.05,-3.68,-3.22,-2.95,-2.32,-1.67,-1.53,-1.61,-1.07,-0.69,-0.41,-0.33,0.02,-0.04,-0.43,-0.7,0.38,0.06,-0.87,0.18,-0.19,0.06,0.63,0.15,-0.04,-0.16,-0.68,-0.35,-0.82,0.14,-0.11,-0.88,-0.64,-0.53,-0.27,-1.72,-1.82,-3.31,-1.37,-2.34,-1.83,0.73,3.92,-1.2,-5.1,-6.48,-5.69,-5.28,-4.77,-4.08,-3.87,-3.93,-4.02,-3.29,-2.1,-1.46,-1.17,-0.93,0.24,0.83,2.69,3.81,4.87,4.44,4.64,3.93,2.83,3.52,3.97,4.04,4.18,3.67,3.89,3.82,3.55,3.41,3.0,2.32,1.84,1.62,1.86,1.82,1.66,1.18,1.47,1.17,1.38,0.7,-0.46,-0.71,-1.31,-1.64,-2.16,-1.76,-3.02,-2.1,-3.47,-3.84,-3.57,-3.26,-3.11,-3.4,-3.77,-3.52,-3.29,-1.96,-3.86,-3.12,-3.54,-1.15,-1.68,-4.97,-4.52,-4.53,-5.59,-6.09,-6.57,-6.08,-6.37,-6.77,-7.22,-6.68,-6.37,-5.9,-5.45,-5.14,-5.03,-4.44,-5.2,-4.85,-4.04,-2.52,-1.93,-3.08,-3.52,-4.15,-2.47,2.15,-2.6,0.87,1.71,4.69,-1.56,-0.32,-0.45,-0.56,0.87,-1.46,0.07,0.63,-1.22,-5.42,-1.2,-0.74,-2.68,-1.18,-1.62,-2.14,0.16,-4.93,-5.39,-5.25,-5.06,-5.0,-4.78,-5.03,-4.47,-3.79,-3.83,-4.59,-4.89,-5.1,-4.96,-4.65,-4.33,-3.9,-3.46,-3.07,-2.36,-1.51,-0.98,-0.68,-0.36,0.36,0.94,1.9,2.9,4.47,5.12,4.3,3.2,1.63,1.06,-0.24,-1.5,-1.47,-1.09,-1.3,-0.59,0.32,-0.48,-0.54,-0.51,-0.75,-0.29,0.26,0.68,1.02,1.12,-1.39,-1.16,-1.66,-1.69,-2.3,-1.3,-0.33,-1.08,-2.13,-3.02,-2.82,-2.91,-4.92,-5.29,-5.11,-6.4,-5.96,-6.09,-5.27,-4.48,-4.08,-4.41,-4.84,-6.04,-4.53,-4.06,-4.27,-4.21,-3.68,-3.59,-3.68,-4.11,-4.7,-6.2,-6.63,-6.49,-5.74,-6.09,-6.14,-6.54,-6.48,-6.55,-5.81,-5.25,-5.02,-4.58,-4.22,-4.12,-3.97,-3.19,-2.76,-2.74,-2.42,-1.61,-1.95,-2.38,-3.23,-4.02,-3.2,-4.45,-4.9,-5.47,-5.38,-4.63,-4.09,-3.41,-3.27,-1.98,-1.24,-0.81,-1.08,-1.33,-2.21,-1.23,1.47,-0.76,-0.62,-0.05,0.65,0.91,-0.5,-0.07,-0.16,-0.17,-0.36,-0.53,0.28,0.15,-0.37,-0.68,0.47,0.87,1.07,0.6,-0.01,-0.03,0.55,-0.53,-0.03,0.27,0.44,0.73,0.89,0.28,0.21,0.27,0.39,0.54,1.48,1.33,0.71,-0.16,-1.44,-5.72,-4.76,-1.35,-3.4,-2.39,-1.08,-4.05,-5.25,-5.43,-5.7,-5.69,-6.9,-6.64,-7.49,-7.9,-8.47,-8.69,-8.82,-8.67,-8.53,-8.6,-8.51,-8.22,-7.91,-7.39,-7.19,-6.82,-6.67,-6.22,-5.84,-5.64,-5.18,-5.25,-5.47,-5.28,-5.01,-4.45,-4.58,-4.64,-4.21,-3.71,-3.78,-3.09,-2.1,-1.23,-1.16,-1.16,-0.58,-0.01,0.33,0.26,0.23,0.12,-0.17,-0.99,-0.11,-1.04,0.21,-0.58,-0.36,0.42,0.37,0.14,-0.2,-0.53,-0.28,-0.68,0.42,0.24,-0.04,0.82,-1.46,-1.26,-0.39,-2.2,-2.31,-1.22,-0.61,-0.27,0.38,1.24,-1.68,-4.22,-7.18,-6.63,-6.57,-5.69,-5.16,-4.73,-4.41,-4.06,-3.65,-2.84,-1.86,-1.37,-1.25,-0.41,-0.02,1.39,1.75,4.25,4.4,2.93,3.78,3.55,2.95,2.71,2.55,3.37,3.68,4.03,4.06,3.14,3.15,3.14,2.86,2.65,2.95,2.82,2.79,2.22,1.34,0.97,1.07,1.78,0.48,-0.03,-0.68,-1.12,-0.87,-1.14,-1.52,-1.98,-2.55,-4.1,-4.29,-4.68,-4.17,-4.36,-4.27,-4.68,-6.48,-4.94,-4.18,-4.92,-4.13,-0.64,1.28,-0.73,-3.14,-1.74,-3.08,-2.58,-2.78,-2.47,-5.18,-4.6,-4.74,-5.57,-6.15,-5.67,-5.41,-5.51,-4.83,-3.78,-3.47,-3.06,-5.54,-4.97,-3.72,-3.61,-2.42,-2.72,-3.49,-2.21,-2.59,-1.51,0.03,1.07,3.1,0.05,-0.17,0.07,-0.25,-0.36,0.0,-0.83,-1.97,-2.87,-4.65,-3.9,-3.67,-2.83,-2.33,-2.4,-2.45,-4.41,-2.38,-2.53,-5.46,-5.25,-5.49,-5.47,-4.93,-4.44,-4.45,-4.08,-4.87,-4.99,-4.97,-5.13,-4.97,-4.53,-4.18,-4.21,-3.7,-3.5,-3.17,-2.95,-2.41,-1.67,-1.2,-0.34,0.43,1.62,4.06,5.7,4.92,3.07,2.25,3.0,0.15,-0.53,-0.08,0.12,-0.24,0.41,1.56,0.56,1.27,1.1,0.82,0.88,0.67,0.81,0.88,2.02,-0.79,-1.27,-0.98,-1.41,-2.33,-2.48,-1.57,-0.29,-2.79,-2.65,-2.34,-4.82,-5.91,-4.84,-5.73,-6.31,-5.7,-5.59,-5.2,-4.79,-4.22,-4.23,-4.25,-5.47,-6.28,-4.95,-3.76,-3.99,-4.77,-5.03,-5.37,-5.08,-5.81,-6.82,-6.27,-5.98,-5.87,-5.94,-6.0,-6.32,-6.19,-6.27,-5.51,-5.09,-5.01,-4.58,-3.91,-3.71,-3.47,-2.86,-2.84,-2.54,-2.51,-2.35,-2.65,-2.88,-3.54,-3.97,-4.21,-5.44,-6.03,-5.94,-5.6,-4.95,-4.9,-4.38,-3.88,-3.51,-2.4,-1.72,-1.37,-1.76,-2.12,-1.05,-1.38,-1.37,-0.58,0.53,-0.3,0.55,-0.93,-0.7,-0.74,0.06,-0.63,-0.46,-0.27,0.19,0.21,-0.42,0.29,0.93,0.75,0.22,-0.26,-0.53,0.0,0.17,-0.35,0.47,0.74,0.98,0.6,0.1,0.19,0.48,0.83,-0.1,1.45,1.55,1.35,-0.22,-2.32,-4.1,-3.1,-1.05,-1.25,-5.53,-3.09,-0.44,-5.44,-5.61,-6.54,-6.99,-6.58,-7.68,-8.6,-9.14,-9.19,-9.41,-9.17,-8.84,-8.77,-8.78,-8.64,-8.5,-8.11,-8.1,-7.86,-7.66,-7.16,-7.16,-6.74,-6.58,-6.42,-6.32,-6.31,-6.23,-6.2,-5.8,-5.43,-5.25,-4.38,-4.21,-4.33,-3.82,-2.99,-2.06,-1.42,-0.9,-0.35,0.16,0.23,-0.16,-0.45,0.18,0.06,-2.35,-0.71,-0.83,-0.24,-0.08,-0.52,0.63,0.88,0.36,0.01,-0.26,-0.08,-0.48,-0.07,0.55,-0.2,0.21,0.77,1.2,-1.41,-2.85,-1.93,-2.11,-2.76,0.05,0.44,-0.02,-2.55,-4.59,-6.44,-6.36,-6.7,-6.51,-6.27,-5.87,-4.86,-4.18,-3.93,-3.43,-2.49,-1.59,-1.54,-1.69,-0.99,-0.35,-0.36,-1.19,-0.35,1.82,1.9,2.24,2.12,2.64,3.37,3.08,3.42,3.58,3.79,3.29,3.23,3.17,2.65,2.63,3.4,3.53,2.02,1.68,0.48,0.43,0.04,0.59,0.12,-0.38,-0.68,-1.19,-0.82,-0.97,-1.65,-2.47,-3.82,-4.79,-5.17,-5.22,-5.08,-5.14,-5.11,-5.99,-6.83,-5.54,-6.35,-5.62,-6.1,-4.73,-6.68,-7.37,-7.47,-6.75,-5.62,-2.98,-1.73,-1.94,-0.16,-1.91,-1.67,-3.89,-3.49,-4.52,-1.77,-4.12,-2.29,-2.56,-2.49,-4.08,-3.68,-5.0,-4.04,-3.47,-3.66,-4.27,-2.59,-3.06,-3.55,-3.05,-1.97,0.39,1.31,-0.49,0.15,-0.61,-0.47,0.51,-0.92,3.44,2.14,-1.39,-4.14,-4.57,-4.06,-2.64,-2.0,-2.66,-3.51,-4.12,-2.2,-1.45,-3.71,-1.5,-4.13,-5.12,-5.35,-4.99,-4.88,-5.5,-5.9,-5.97,-5.28,-6.61,-6.39,-5.89,-5.42,-4.73,-5.15,-4.81,-4.43,-4.21,-3.89,-3.24,-2.55,-1.75,-0.49,0.65,0.82,-1.31,1.73,1.66,1.25,1.2,-0.31,0.26,0.79,1.14,1.52,3.94,1.25,-0.08,1.35,1.34,1.63,1.61,0.89,0.81,-0.04,0.0,-2.35,-1.41,-1.24,-1.63,-2.76,-3.21,-1.85,-1.18,-3.18,-3.83,-3.44,-5.79,-6.03,-6.66,-6.69,-6.5,-5.83,-5.14,-4.51,-4.6,-4.14,-4.11,-4.31,-4.44,-6.03,-5.92,-5.27,-4.85,-6.2,-6.09,-6.41,-6.25,-6.19,-6.35,-5.88,-5.57,-6.0,-5.87,-5.62,-5.64,-5.85,-5.48,-5.29,-4.95,-4.6,-4.27,-3.76,-3.45,-3.22,-2.96,-2.89,-2.46,-2.14,-2.75,-3.24,-3.33,-3.89,-4.38,-4.89,-6.32,-6.25,-5.94,-5.17,-4.53,-4.34,-4.56,-4.36,-4.02,-3.89,-2.79,-2.22,-2.2,-2.34,-1.46,-1.74,0.17,-2.28,0.88,-0.35,-0.45,-0.91,-0.95,-0.77,-0.73,-1.03,-0.56,-0.34,-0.05,0.17,0.19,0.12,0.36,0.47,0.56,-0.28,-0.7,0.35,-0.56,0.8,0.77,1.19,0.03,0.27,-0.24,0.75,0.42,0.1,-0.08,0.99,1.27,0.69,-0.22,-3.21,-5.41,-3.28,-2.69,-3.76,-2.92,-1.44,-1.42,-5.6,-5.97,-6.75,-7.5,-7.73,-7.96,-8.3,-9.07,-9.83,-9.37,-9.18,-9.06,-8.57,-8.71,-8.95,-8.5,-8.48,-8.48,-8.51,-8.23,-7.47,-7.74,-7.36,-7.33,-6.8,-6.8,-6.98,-6.76,-6.81,-6.49,-6.1,-5.88,-5.15,-4.74,-4.67,-4.47,-3.67,-2.94,-2.13,-1.12,-0.4,-0.13,-0.14,-0.26,-0.47,-0.49,-0.36,-1.31,-1.34,-0.87,-0.36,-0.2,-0.59,0.14,0.73,0.22,0.48,0.37,-0.15,-0.64,-0.13,-0.72,0.66,0.44,-0.43,-1.29,-0.56,-1.49,-0.9,-3.09,0.73,-0.58,-0.61,-0.14,-2.46,-3.94,-5.32,-5.57,-6.19,-6.67,-6.86,-6.63,-6.06,-5.1,-4.06,-3.67,-2.88,-1.94,-1.87,-2.27,-1.77,-1.42,-2.17,-2.7,-2.24,-1.04,-0.08,1.28,2.27,2.96,3.25,3.29,2.77,2.97,3.39,2.99,3.06,3.22,2.64,2.33,3.01,0.01,-0.64,-0.78,-0.09,-1.32,-1.58,-0.17,0.04,-0.72,-0.98,-1.03,-1.59,-1.59,-2.09,-3.69,-4.33,-5.03,-5.74,-5.85,-5.65,-5.44,-5.71,-6.8,-7.67,-8.23,-6.94,-6.59,-7.06,-7.34,-8.55,-8.28,-7.66,-7.28,-6.63,-6.17,-5.73,-5.12,-4.9,-4.41,-4.62,-2.89,-3.91,-3.83,-5.87,-2.47,-1.08,-0.04,2.19,0.91,-2.9,-3.23,-3.21,-2.58,-2.76,-3.19,-2.7,-3.73,-4.5,-4.06,-4.11,-3.84,-3.99,-3.97,-1.53,-1.35,-0.82,-1.55,0.38,3.16,3.74,2.15,-1.0,-3.31,-3.0,-3.2,-1.6,-3.49,-4.49,-5.04,-4.45,-5.01,-3.78,-0.84,-5.56,-1.83,-5.55,-5.56,-5.53,-5.88,-6.29,-6.85,-7.32,-7.01,-7.19,-6.72,-6.37,-5.63,-5.49,-5.0,-4.52,-4.27,-3.97,-3.52,-2.89,-2.11,-1.56,-1.28,-1.8,-3.99,-2.39,0.5,0.2,0.3,-0.75,-0.19,-0.05,0.21,0.26,-0.98,-0.99,0.1,1.23,1.53,1.3,0.8,1.42,0.99,-0.36,-2.23,-2.16,-1.96,-1.67,-1.23,-3.06,-3.31,-2.45,-2.84,-3.47,-5.03,-4.77,-5.63,-6.7,-6.19,-6.32,-5.55,-5.41,-4.94,-4.36,-3.98,-3.77,-3.65,-3.95,-4.33,-4.53,-5.48,-5.48,-5.76,-5.87,-6.31,-6.28,-6.43,-5.76,-6.06,-5.87,-5.49,-5.85,-5.75,-5.53,-5.26,-5.43,-5.31,-5.12,-4.58,-4.35,-4.24,-3.88,-3.7,-3.55,-3.47,-3.42,-3.15,-2.77,-3.0,-3.19,-3.74,-4.51,-5.24,-5.83,-6.97,-6.31,-6.32,-5.11,-4.31,-4.14,-3.88,-3.92,-3.93,-4.43,-3.85,-3.11,-2.91,-2.72,-2.38,-1.91,-2.15,0.17,-0.78,-1.09,0.05,-0.99,-0.83,-0.82,-1.04,-0.82,-0.66,-0.47,-0.01,-0.21,-0.13,0.03,-0.04,0.1,-0.01,0.25,-0.68,-0.36,-0.44,-0.04,1.2,0.48,0.09,0.18,-0.17,0.0,-0.16,0.88,-0.46,0.27,0.6,-0.39,-2.06,-6.58,-5.16,-3.41,-5.68,-3.3,-2.49,-0.89,-5.58,-6.09,-6.31,-6.77,-7.44,-8.06,-8.38,-9.0,-9.59,-9.38,-9.2,-8.95,-8.66,-8.81,-8.98,-8.89,-9.05,-8.83,-8.7,-8.68,-8.58,-8.31,-7.98,-7.83,-7.68,-7.7,-7.42,-7.49,-7.33,-7.22,-6.81,-6.38,-6.04,-5.63,-5.21,-5.32,-4.66,-4.13,-3.43,-2.72,-1.7,-1.18,-0.72,-0.85,-0.37,-0.19,-0.66,-0.94,-0.8,0.24,-1.26,0.06,0.27,-0.11,-0.39,0.4,0.55,0.85,0.03,0.46,-0.17,-0.84,0.32,-0.09,-0.71,-0.31,-1.48,-1.22,-2.08,-0.23,-1.69,-1.1,-0.69,-0.39,-0.76,-0.66,-3.55,-4.56,-4.69,-5.53,-6.54,-7.27,-7.59,-7.32,-6.57,-4.97,-3.5,-2.55,-2.11,-1.81,-2.04,-1.77,-2.18,-2.25,-2.16,-1.65,-1.19,-0.69,0.33,1.11,1.8,2.48,2.97,3.01,3.11,2.98,3.16,3.46,3.61,3.27,2.75,2.1,-0.5,-2.82,-2.63,-2.56,-2.41,-2.1,-0.6,-0.05,-0.66,-0.25,-0.68,-1.63,-2.11,-2.96,-4.2,-4.84,-5.25,-5.57,-6.21,-6.1,-6.63,-6.4,-7.39,-8.82,-8.49,-8.0,-8.08,-7.9,-7.53,-7.65,-7.43,-7.08,-6.83,-6.52,-5.94,-5.88,-5.22,-5.19,-5.41,-5.49,-5.41,-4.78,-3.97,-0.63,-3.88,-3.69,1.24,-1.55,-2.96,-2.27,-2.36,-2.37,-1.45,-1.8,-2.31,-2.82,-4.41,-5.3,-5.1,-4.85,-5.41,-5.72,-5.79,-5.57,-5.0,-5.63,-4.88,-3.7,-4.52,-5.68,-4.08,-1.72,-0.13,-3.46,-1.93,-2.51,-4.03,-4.21,-5.54,-5.69,-6.04,-5.88,-6.27,-5.23,-3.93,-6.13,-5.97,-6.15,-6.43,-6.59,-7.18,-7.18,-7.29,-7.15,-6.74,-6.41,-6.05,-5.84,-5.63,-5.23,-4.79,-4.35,-3.87,-3.21,-2.92,-2.31,-2.04,-3.08,-4.27,-4.06,-1.36,0.75,0.59,-0.66,-0.54,-0.64,-1.12,-1.16,-0.71,-0.17,0.31,1.32,1.59,1.87,2.02,2.32,1.93,0.34,-1.79,-1.94,-1.79,-0.36,-2.8,-2.18,-2.86,-2.27,-3.38,-4.38,-4.99,-4.5,-5.73,-5.87,-5.69,-5.16,-5.34,-5.31,-4.87,-4.2,-3.68,-3.44,-3.21,-3.44,-3.8,-4.27,-4.6,-4.78,-4.82,-5.24,-5.41,-5.51,-5.83,-5.87,-5.51,-5.05,-5.2,-5.52,-5.4,-5.83,-5.34,-5.18,-5.38,-5.16,-4.79,-4.22,-4.39,-3.95,-3.88,-4.04,-3.99,-3.85,-3.87,-3.5,-2.99,-3.38,-4.41,-4.86,-6.08,-6.41,-6.91,-6.26,-6.16,-5.23,-4.49,-4.29,-3.33,-3.47,-3.71,-3.71,-4.17,-3.6,-3.07,-3.19,-3.36,-2.4,-2.36,1.22,-2.94,-0.79,0.04,-0.37,-0.86,-0.5,-0.86,-0.74,-1.02,-0.97,-0.58,-0.24,0.04,-0.34,-0.38,0.16,0.09,-0.05,-0.69,-0.74,-0.28,0.26,0.5,0.15,0.62,0.13,0.66,0.24,-0.33,-0.08,-0.62,0.23,0.99,-0.35,-2.78,-3.11,-1.61,-1.46,-4.56,-2.99,-1.75,-4.0,-6.04,-6.38,-6.53,-6.85,-7.56,-7.94,-8.6,-9.2,-9.21,-8.95,-8.82,-8.86,-8.63,-8.78,-9.02,-9.29,-9.39,-9.22,-9.2,-8.94,-9.06,-8.48,-8.41,-8.17,-8.27,-8.25,-8.04,-8.06,-7.57,-7.36,-7.04,-6.6,-6.33,-6.12,-5.76,-5.82,-5.31,-4.7,-4.1,-3.25,-2.51,-2.1,-1.83,-1.37,-0.65,-0.15,-0.36,-0.51,-0.32,0.23,-1.1,0.09,0.22,-0.7,-0.26,0.31,-0.19,0.4,-0.33,-0.24,-0.37,-0.67,-0.82,-0.2,-1.55,-2.62,-1.27,-1.04,0.05,-2.0,-1.24,-0.83,-1.35,-0.66,-0.14,-0.48,-3.19,-3.43,-4.05,-3.76,-4.66,-5.15,-6.44,-7.83,-7.18,-5.72,-3.57,-2.1,-1.83,-1.43,-1.78,-1.8,-2.26,-2.85,-3.12,-1.84,-0.85,0.05,0.1,0.46,1.31,2.25,2.72,3.1,3.11,3.25,3.85,4.54,5.1,4.94,3.94,2.54,0.32,-2.82,-3.53,-3.33,-3.29,-2.51,-1.49,-0.91,-1.46,-1.06,-1.62,-1.91,-3.0,-4.05,-4.86,-5.52,-5.38,-5.11,-6.26,-6.43,-7.09,-7.14,-8.33,-8.97,-8.92,-8.44,-8.56,-8.86,-8.21,-7.76,-7.85,-7.17,-6.55,-5.99,-5.83,-5.94,-5.21,-4.8,-5.46,-5.06,-5.49,-5.02,-4.85,-4.73,-4.02,-3.95,-4.97,-4.23,-2.44,-1.3,-1.42,-1.13,-0.54,1.19,-1.33,-3.14,-5.67,-5.7,-5.25,-5.71,-6.07,-6.45,-6.75,-6.38,-5.25,-6.31,-6.33,-5.23,-5.57,-5.93,-6.09,-6.35,-6.91,-7.49,-3.63,-3.32,-4.32,-6.0,-6.46,-6.51,-6.69,-6.58,-6.37,-5.9,-7.49,-5.8,-6.48,-6.82,-6.78,-6.48,-6.51,-6.87,-7.22,-7.25,-6.92,-6.73,-6.35,-6.18,-6.12,-5.65,-5.3,-4.84,-4.45,-4.25,-3.64,-3.3,-3.11,-3.61,-4.26,-4.75,-4.19,-3.09,-0.73,-1.29,-0.9,-0.54,-0.92,-0.44,-0.22,-0.62,-1.05,0.0,1.52,2.46,3.27,2.89,1.85,0.66,-0.49,-0.77,-0.19,0.12,-1.31,-1.73,-1.53,-2.22,-3.16,-3.69,-4.15,-4.61,-4.72,-4.67,-4.38,-4.19,-4.27,-4.14,-4.38,-4.04,-3.47,-3.0,-3.01,-3.23,-3.1,-3.34,-3.81,-4.04,-3.85,-4.44,-4.99,-5.01,-5.05,-4.92,-4.74,-4.58,-4.43,-5.39,-5.4,-5.61,-5.52,-4.97,-4.52,-4.25,-4.94,-4.43,-4.36,-4.26,-3.89,-4.05,-4.12,-4.23,-4.26,-3.74,-4.12,-4.09,-4.84,-5.36,-6.07,-6.2,-6.69,-6.27,-6.01,-5.6,-5.26,-4.42,-3.73,-4.15,-4.16,-4.06,-4.26,-3.86,-3.55,-3.37,-3.72,-3.14,-2.78,-1.41,-2.03,-0.13,-0.81,0.07,-0.36,-1.18,-0.92,-1.48,-1.14,-1.11,-0.8,-0.53,-0.59,-0.7,0.28,0.02,0.19,-0.38,-0.53,-0.89,0.02,0.24,0.47,0.43,0.33,-0.17,0.53,0.65,0.67,0.05,-1.29,-0.06,1.28,-0.24,-7.54,-4.81,-3.77,-1.04,-2.82,-2.13,-4.05,-6.41,-6.4,-6.55,-6.59,-6.77,-7.39,-7.99,-8.19,-8.94,-9.06,-8.85,-8.76,-8.66,-8.55,-8.72,-8.81,-9.31,-9.53,-9.33,-9.32,-9.26,-9.02,-8.7,-8.86,-8.46,-8.81,-8.85,-8.54,-8.09,-7.84,-7.53,-7.26,-7.03,-6.67,-6.45,-6.22,-6.52,-6.06,-5.58,-4.88,-4.1,-3.46,-2.99,-2.58,-1.78,-1.27,-0.33,0.27,0.53,0.28,-1.51,-1.03,0.17,1.59,-0.31,0.09,0.54,-0.8,-2.39,-2.11,-1.36,0.13,0.0,-1.44,-1.09,-1.47,-1.64,-1.98,0.7,-0.06,-0.86,-2.08,-1.07,-1.15,-1.04,-1.42,0.03,-2.82,-3.1,-2.91,-1.72,-1.5,-1.44,-1.15,-1.92,-5.03,-4.99,-3.76,-1.75,-1.19,-1.41,-1.36,-2.14,-2.72,-3.34,-4.27,-3.43,-2.34,-1.52,-1.44,-0.9,-0.72,-0.99,-0.72,-0.24,-0.72,0.86,2.0,3.23,4.3,4.42,3.83,2.5,-0.22,-3.16,-3.76,-3.13,-3.23,-2.88,-2.42,-2.5,-2.08,-1.31,-2.0,-3.0,-3.88,-5.08,-5.84,-6.08,-5.87,-6.62,-7.61,-8.94,-8.84,-10.04,-9.0,-8.88,-8.92,-8.82,-8.72,-8.68,-8.37,-7.99,-7.7,-7.34,-6.7,-6.38,-5.77,-5.02,-4.53,-4.28,-4.69,-4.49,-5.16,-5.12,-4.85,-4.5,-3.62,-3.45,-3.95,-3.04,-1.57,-0.54,-0.19,-0.3,0.34,1.3,0.19,4.2,-3.01,-4.2,-5.57,-6.45,-6.01,-6.62,-6.59,-4.53,-0.18,-4.79,-5.18,-5.38,-5.67,-5.73,-5.53,-5.79,-6.1,-5.39,-4.47,-4.82,-5.92,-6.91,-6.16,-6.31,-6.7,-6.64,-6.02,-5.77,-5.72,-6.1,-6.62,-6.83,-6.94,-7.18,-7.34,-7.11,-7.26,-7.16,-7.05,-6.88,-6.63,-6.52,-6.27,-6.08,-5.63,-5.37,-4.82,-4.43,-4.06,-4.41,-4.04,-4.45,-4.17,-4.88,-5.12,-5.64,-4.68,-3.37,-1.4,-2.34,-1.77,-1.43,-1.02,-0.34,-0.08,0.46,1.21,1.88,2.81,1.99,4.0,1.45,0.47,0.44,0.51,0.84,0.03,-0.75,-1.24,-1.11,-3.03,-2.99,-3.4,-3.59,-3.57,-3.3,-3.28,-3.2,-2.96,-3.07,-3.13,-3.46,-3.2,-2.79,-2.42,-2.7,-2.64,-2.35,-2.59,-2.97,-3.06,-3.26,-3.88,-3.84,-4.09,-4.35,-4.54,-4.08,-4.58,-4.95,-5.45,-5.61,-5.01,-4.58,-4.48,-3.98,-4.33,-4.27,-4.44,-4.23,-3.71,-3.86,-3.77,-4.33,-4.48,-4.23,-4.16,-4.96,-5.39,-5.44,-6.01,-6.32,-6.38,-6.58,-6.56,-5.96,-5.15,-4.84,-4.72,-4.48,-4.36,-4.19,-4.46,-4.45,-4.26,-3.79,-4.06,-3.74,-3.34,-2.12,-0.35,-1.69,-1.04,0.42,0.18,-1.43,-0.59,-1.52,-1.19,-1.07,-0.83,-0.48,-0.27,-0.27,-0.03,-0.27,-0.15,-1.07,-0.32,-0.54,-0.4,0.37,0.73,0.61,0.33,-0.37,1.07,0.65,0.89,-0.4,0.46,0.86,1.1,0.38,-1.46,-3.4,-2.75,-1.42,-1.91,-0.96,-5.87,-7.09,-6.54,-6.76,-6.64,-6.63,-7.27,-7.65,-7.91,-8.29,-8.93,-8.82,-8.62,-8.58,-8.51,-8.69,-8.67,-9.4,-9.12,-9.38,-9.4,-9.1,-9.13,-9.13,-9.2,-9.01,-9.07,-9.35,-9.11,-8.55,-8.1,-7.8,-7.75,-7.58,-7.27,-7.1,-6.88,-7.14,-6.79,-6.29,-5.75,-4.93,-4.21,-3.71,-3.09,-2.19,-1.12,-0.18,0.64,1.37,-0.21,-1.6,-0.85,-0.28,2.04,0.74,-0.36,0.06,-0.03,-1.37,-1.86,-1.48,-1.1,-0.56,-1.03,-1.51,-1.05,-1.14,-0.84,-0.6,-2.27,-1.24,-0.99,-0.76,-1.49,-0.94,-0.95,-0.41,-2.79,-2.73,-2.66,-2.38,-0.71,0.25,0.74,-2.57,-1.59,-2.82,-3.16,-1.55,-0.89,-1.32,-1.49,-3.19,-3.71,-4.46,-5.56,-5.17,-4.29,-3.83,-3.72,-4.29,-5.01,-4.89,-4.76,-4.47,-3.57,-2.51,-1.3,0.34,1.97,3.67,3.74,1.53,-0.81,-3.22,-3.54,-3.14,-3.35,-2.53,-2.16,-2.34,-3.38,-3.09,-3.16,-3.58,-4.73,-5.99,-6.67,-7.35,-8.25,-8.24,-9.09,-10.48,-10.68,-9.25,-9.51,-9.43,-9.33,-8.97,-8.75,-8.42,-8.22,-7.97,-7.05,-6.63,-6.07,-5.79,-5.54,-5.14,-4.23,-3.77,-3.43,-3.63,-4.18,-4.74,-4.4,-4.17,-4.06,-4.15,-3.66,-2.28,-0.43,0.83,0.76,0.04,0.91,5.2,-1.19,-1.86,-4.08,-3.65,-3.55,-3.97,-5.82,-6.34,-5.77,-3.88,1.1,-3.49,-4.85,-5.52,-6.21,-5.87,-5.7,-5.43,-5.46,-4.93,-4.82,-5.36,-6.06,-6.69,-6.34,-6.56,-6.8,-6.48,-6.37,-6.23,-6.48,-6.35,-6.54,-6.94,-6.61,-7.05,-7.54,-6.76,-6.97,-6.84,-6.65,-6.5,-6.73,-6.93,-6.74,-6.48,-6.24,-5.71,-5.55,-4.98,-4.7,-4.52,-4.7,-4.81,-4.78,-4.43,-4.31,-4.85,-5.47,-5.33,-4.23,-2.76,-2.22,-1.79,-1.91,-0.17,1.15,0.84,-0.37,0.89,2.23,1.84,0.63,-1.0,0.57,1.68,1.78,2.27,1.57,-0.36,-1.21,-0.88,-1.72,-2.42,-2.52,-2.42,-2.47,-2.52,-2.56,-2.29,-1.81,-1.88,-2.0,-2.16,-2.46,-2.35,-1.87,-1.85,-1.81,-1.62,-1.65,-1.74,-2.05,-2.38,-2.58,-2.71,-2.95,-3.46,-3.69,-4.17,-4.81,-5.1,-5.03,-4.68,-4.4,-3.9,-3.83,-3.38,-4.24,-4.34,-4.45,-4.02,-3.53,-3.72,-4.09,-4.78,-4.85,-4.59,-4.7,-5.64,-5.43,-5.3,-5.75,-6.28,-6.29,-6.51,-6.75,-6.24,-5.57,-5.32,-5.28,-4.2,-4.17,-4.43,-4.74,-4.86,-4.73,-4.34,-4.55,-4.08,-3.53,-2.27,-1.09,1.07,-0.32,-0.92,0.02,-0.11,-0.94,-0.72,-1.79,-1.4,-1.23,-1.12,-0.6,-0.62,-0.29,-0.85,-0.9,-0.72,-0.71,-0.69,0.03,0.72,0.86,0.69,0.26,-0.22,0.41,0.02,0.55,0.04,-0.04,1.2,0.65,-1.53,-3.77,-4.16,0.51,-2.29,-0.54,-5.61,-6.45,-5.94,-6.49,-6.44,-6.75,-6.56,-6.97,-7.12,-7.69,-8.4,-8.6,-8.4,-8.26,-8.18,-8.15,-8.48,-8.45,-9.0,-8.87,-9.28,-9.31,-9.18,-9.16,-8.94,-9.19,-9.05,-9.12,-9.31,-9.02,-8.65,-8.4,-8.29,-8.23,-8.09,-7.96,-7.81,-7.34,-7.52,-7.49,-6.88,-6.56,-5.59,-4.95,-4.32,-3.63,-2.51,-0.96,0.49,0.73,1.9,-2.55,-1.3,0.53,0.79,0.66,0.04,-0.32,0.42,0.52,-0.17,-0.76,-1.52,-1.32,-0.88,-1.7,-2.02,-1.01,-0.74,-1.27,-0.28,-1.44,-1.19,1.19,-0.47,-0.29,-0.94,0.07,-0.09,-1.53,-2.44,-2.56,-2.11,-1.74,-1.08,-0.82,-0.43,-0.43,-0.37,-1.91,-1.2,-0.55,-1.71,-2.22,-4.3,-4.84,-5.25,-5.76,-6.57,-6.14,-5.67,-5.66,-5.41,-6.06,-6.06,-6.0,-5.78,-5.14,-4.86,-4.96,-4.61,-4.61,-4.63,-2.41,-0.78,-0.99,-4.34,-3.58,-2.91,-2.52,-2.3,-2.89,-4.41,-3.98,-4.23,-3.92,-3.89,-5.28,-5.84,-8.06,-8.17,-9.85,-9.34,-11.34,-10.58,-10.54,-10.43,-9.74,-9.58,-9.3,-8.74,-8.41,-8.14,-7.94,-7.51,-7.06,-6.58,-5.49,-4.45,-4.04,-3.75,-4.02,-4.06,-2.95,-2.77,-3.14,-3.61,-3.05,-3.36,-3.81,-3.22,-2.25,-1.45,1.05,3.81,-1.91,-1.6,1.71,0.63,-1.59,-2.56,-4.35,-4.28,-5.26,-4.87,-5.75,-6.4,-5.8,-3.6,-0.07,-3.59,-4.83,-8.98,-6.97,-6.09,-5.95,-6.17,-6.19,-6.01,-6.02,-6.62,-6.61,-6.8,-6.93,-7.12,-6.83,-6.48,-6.99,-6.91,-5.94,-5.56,-5.35,-5.42,-6.77,-8.59,-6.24,-6.22,-6.98,-6.88,-6.57,-6.8,-6.99,-6.96,-7.32,-6.64,-6.37,-6.1,-5.82,-5.21,-4.96,-5.08,-4.78,-5.07,-5.06,-4.97,-5.75,-3.9,-5.53,-5.74,-6.4,-6.54,-6.25,-5.65,-6.5,-6.2,-6.98,-7.68,-6.75,-7.91,-8.12,-8.81,-7.42,-5.48,-2.71,1.55,2.82,4.02,2.23,0.76,-0.88,-0.37,-1.2,-1.47,-1.7,-1.41,-1.38,-1.5,-1.62,-1.55,-0.97,-0.92,-0.93,-0.94,-1.16,-1.49,-1.72,-1.32,-1.14,-0.79,-0.6,-0.9,-1.2,-1.93,-1.66,-1.94,-2.43,-2.75,-3.14,-4.13,-4.21,-4.65,-4.6,-4.26,-4.07,-3.86,-3.33,-3.62,-3.92,-3.96,-3.85,-3.58,-3.4,-3.67,-4.09,-4.66,-4.93,-5.7,-5.84,-5.93,-5.36,-5.17,-5.42,-5.61,-5.92,-6.14,-7.05,-6.25,-6.0,-5.35,-4.86,-4.67,-5.03,-5.14,-5.02,-5.06,-5.02,-4.75,-4.79,-4.43,-4.02,-3.4,-2.77,0.4,-1.1,-1.36,-0.36,0.52,0.93,0.63,-0.42,0.04,-1.88,-1.63,-0.94,-1.19,-1.09,-0.01,-0.46,-0.63,-1.19,-0.82,0.61,0.46,1.2,0.56,0.44,0.6,0.77,0.44,1.23,0.22,1.47,-0.97,-0.52,-0.23,-3.1,-1.58,-1.27,-0.71,-0.51,-5.74,-5.94,-5.41,-6.48,-5.84,-6.15,-6.72,-6.71,-6.95,-7.31,-7.51,-8.19,-7.81,-7.8,-7.82,-7.77,-8.06,-8.43,-8.22,-8.35,-8.91,-9.25,-8.97,-9.25,-9.02,-9.28,-9.45,-9.27,-9.06,-9.08,-8.88,-8.72,-8.59,-8.47,-8.6,-8.54,-8.23,-7.95,-7.95,-7.7,-7.13,-6.96,-6.26,-5.55,-5.18,-4.45,-3.25,-1.33,-0.03,1.15,1.24,-0.64,-0.2,0.87,1.81,0.93,0.24,0.0,-0.52,-0.43,1.15,0.77,-0.67,-0.2,-0.29,-0.63,-1.15,0.22,0.13,-0.12,-0.03,0.76,-0.02,-0.18,-0.89,-0.22,0.38,0.39,0.21,-1.32,-2.35,-2.34,-1.91,-3.0,-6.28,-5.43,-0.92,-1.34,0.81,-0.61,-0.88,-0.96,-2.17,-3.04,-5.06,-5.86,-6.4,-6.73,-7.04,-7.09,-6.8,-6.28,-6.32,-6.88,-6.86,-6.66,-6.63,-6.63,-6.78,-7.23,-7.86,-9.13,-8.99,-7.27,-5.31,-5.04,-5.55,-3.17,-2.82,-2.12,-2.55,-4.36,-4.34,-4.51,-6.81,-7.26,-7.76,-8.37,-8.89,-9.27,-8.63,-10.69,-10.67,-10.67,-11.25,-10.82,-10.45,-9.99,-9.65,-9.28,-8.79,-8.46,-8.05,-7.73,-7.17,-6.68,-6.03,-4.91,-4.07,-3.02,-2.7,-2.71,-2.74,-2.96,-2.02,-2.32,-2.37,-1.67,-2.33,-2.3,-1.81,-0.85,1.31,7.49,-1.93,-2.22,-3.43,-1.65,-2.22,-1.43,-1.97,-3.91,-3.71,-6.52,-5.82,-4.88,-5.91,-5.69,-4.17,1.25,-4.32,-4.33,-4.84,-4.6,-5.33,-6.19,-6.5,-6.56,-5.94,-6.15,-6.17,-6.28,-6.99,-7.02,-7.04,-6.7,-6.72,-6.88,-7.02,-7.76,-7.57,-6.89,-6.93,-6.36,-3.44,-3.89,-6.88,-6.53,-7.08,-7.06,-7.03,-6.79,-6.98,-6.82,-5.92,-5.55,-6.14,-5.82,-5.61,-4.95,-5.23,-5.36,-5.61,-5.38,-5.6,-5.87,-5.9,-6.72,-7.35,-7.95,-8.14,-7.82,-8.58,-8.4,-8.75,-9.7,-9.44,-9.19,-9.6,-9.72,-8.33,-8.76,-7.5,-8.15,-8.08,-2.37,1.28,2.24,1.5,0.17,0.18,-0.3,-0.46,-0.15,-0.32,-0.1,-0.19,-0.3,-0.43,-0.48,0.12,0.09,0.08,-0.16,-0.24,-0.12,0.13,0.23,0.49,0.64,0.32,-0.96,-1.01,-1.06,-1.31,-1.54,-1.81,-2.66,-3.1,-3.41,-3.5,-3.53,-3.22,-3.06,-3.02,-3.64,-4.3,-3.95,-3.65,-3.13,-3.24,-3.08,-3.33,-4.19,-4.36,-4.86,-5.92,-5.88,-5.92,-5.07,-4.75,-4.96,-5.15,-5.57,-6.37,-6.65,-6.38,-6.32,-5.4,-5.36,-5.13,-5.31,-5.47,-5.28,-5.57,-5.25,-5.47,-5.02,-4.96,-4.97,-4.87,-3.98,-4.93,0.0,0.5,-0.44,0.11,1.26,0.09,0.5,0.1,0.67,-1.96,-0.84,-1.78,-1.68,-0.81,-0.78,-0.02,-1.28,1.0,0.14,0.93,-0.12,1.75,1.58,0.43,-0.08,-1.63,-0.26,-0.11,-0.11,-1.07,-0.49,-0.51,-3.0,-1.12,-2.01,0.01,0.5,-4.64,-5.32,-5.18,-5.23,-5.47,-5.63,-6.38,-6.46,-6.68,-7.29,-7.07,-7.11,-6.98,-7.22,-7.3,-7.24,-7.68,-7.86,-7.98,-7.59,-8.52,-9.11,-8.98,-9.05,-8.81,-8.96,-9.37,-9.17,-8.93,-9.35,-9.16,-8.79,-8.58,-8.82,-9.03,-8.89,-8.67,-8.2,-8.02,-7.77,-7.58,-7.12,-6.8,-6.4,-6.02,-5.39,-4.02,-2.54,-1.78,-0.73,0.4,-2.71,-0.8,1.14,1.65,-1.16,-0.86,0.18,0.62,-1.1,-0.72,-0.15,0.37,1.22,0.87,-0.83,-0.7,-0.41,-0.02,-0.16,0.86,0.61,0.75,-0.39,0.35,1.23,0.3,-0.32,0.13,-1.96,-2.55,-2.45,-2.01,-3.73,-2.14,-1.77,-1.99,-2.29,2.5,-0.62,-0.61,-1.45,-2.68,-4.53,-6.05,-6.52,-6.7,-7.1,-7.25,-6.86,-7.32,-6.97,-7.07,-7.12,-7.52,-7.72,-7.74,-8.06,-8.29,-8.79,-9.01,-9.93,-10.24,-10.79,-10.39,-8.94,-6.87,-5.05,-2.01,-2.03,-2.53,-4.79,-6.08,-6.74,-8.35,-9.05,-9.75,-9.49,-11.38,-10.4,-10.95,-10.47,-10.43,-11.48,-11.2,-11.13,-10.22,-9.77,-9.54,-9.26,-8.74,-8.49,-8.08,-7.55,-7.0,-6.35,-5.62,-4.53,-3.96,-3.22,-2.23,-1.58,-1.48,-1.36,-1.22,-0.8,-0.92,-0.72,-1.3,-1.22,-0.87,0.85,4.31,-0.83,-2.62,-2.91,-2.76,-1.92,-1.75,-1.93,-2.47,-2.28,-3.55,-2.91,-4.45,-4.39,-4.83,-5.43,-2.86,5.02,-3.25,-3.29,-2.78,-3.6,-4.25,-5.6,-5.83,-5.65,-5.62,-4.93,-5.64,-6.52,-7.21,-6.69,-6.76,-7.09,-7.57,-7.58,-8.05,-8.18,-7.92,-8.08,-8.42,-8.43,-8.2,-6.01,-6.18,-7.24,-6.94,-6.85,-6.71,-6.42,-5.98,-6.12,-5.93,-5.67,-4.88,-6.12,-5.77,-5.41,-4.94,-5.65,-6.13,-6.44,-6.11,-6.91,-7.71,-7.67,-7.94,-9.07,-9.41,-10.39,-10.17,-10.14,-10.24,-10.44,-10.25,-9.81,-9.53,-8.74,-8.65,-8.28,-7.67,-6.95,-5.93,-6.23,-5.89,-3.87,-2.93,-0.04,0.93,0.75,1.45,1.52,0.85,1.28,1.25,0.93,0.63,0.72,0.38,0.33,0.38,0.44,0.19,0.61,0.9,1.28,1.78,1.72,1.27,0.81,0.83,0.37,-0.16,-0.42,-0.93,-1.66,-2.03,-1.95,-2.24,-2.39,-2.54,-2.95,-3.14,-3.89,-4.02,-3.79,-2.97,-3.12,-2.73,-3.02,-3.14,-3.97,-3.88,-4.91,-5.45,-5.43,-4.95,-4.69,-4.57,-4.84,-4.8,-5.18,-6.09,-6.04,-6.12,-5.85,-5.45,-5.49,-5.36,-5.17,-5.25,-5.47,-5.49,-5.46,-5.59,-5.3,-5.83,-6.0,-5.69,-5.44,-5.28,-6.54,-2.89,0.53,-0.73,-0.31,-1.32,-1.18,0.06,-0.56,1.42,0.26,-1.92,-1.83,-1.48,-0.8,-0.22,0.33,0.8,0.58,0.43,1.44,1.14,1.27,-0.06,-1.5,-1.56,-0.96,0.63,1.28,-1.13,-1.0,-0.02,-2.54,-1.67,-0.49,-0.23,1.07,-3.51,-4.54,-4.2,-4.79,-5.08,-4.85,-5.94,-6.06,-6.33,-7.22,-7.31,-6.69,-6.72,-6.77,-6.92,-6.3,-6.78,-7.11,-7.14,-7.74,-7.7,-8.55,-8.78,-8.29,-8.83,-9.18,-9.4,-9.03,-9.17,-9.35,-8.99,-8.64,-8.46,-8.95,-9.13,-9.14,-8.6,-8.26,-8.31,-8.08,-7.73,-7.43,-7.37,-6.97,-6.79,-6.33,-4.4,-3.58,-3.05,-3.68,0.96,-1.23,-0.52,0.82,-1.46,-1.47,-1.63,-1.69,-1.89,-0.86,-1.45,-0.16,0.03,0.19,0.16,1.99,-1.34,-0.14,0.02,1.38,0.84,0.54,0.92,0.66,0.61,-0.22,-0.55,-1.16,-1.12,-1.84,-2.6,-2.91,-1.93,-2.4,-2.72,-2.56,-2.54,-1.29,3.03,-0.64,-0.6,-2.13,-3.36,-5.18,-5.93,-6.45,-6.53,-7.03,-7.82,-7.46,-7.61,-7.69,-8.13,-8.33,-8.53,-8.99,-9.51,-9.39,-9.59,-9.67,-9.59,-10.15,-10.22,-10.29,-10.0,-9.37,-8.36,-7.66,-6.68,-5.56,-6.44,-6.91,-8.08,-8.69,-9.33,-9.88,-10.4,-12.41,-11.4,-11.01,-10.47,-9.86,-10.38,-11.43,-11.74,-10.76,-9.85,-9.59,-9.43,-9.21,-8.81,-8.48,-8.05,-7.38,-6.72,-6.29,-5.65,-4.96,-4.44,-3.66,-2.83,-1.93,-0.76,-0.31,0.02,-0.19,0.11,-0.61,-1.23,-0.87,3.69,-2.37,0.58,-0.82,-1.1,-1.56,-3.36,-2.02,-3.13,-3.1,-3.01,-2.78,-3.15,-2.33,-2.6,-3.31,-2.74,-4.48,0.38,4.09,-2.58,-2.41,-2.57,-3.56,-2.48,-4.78,-5.72,-5.54,-5.55,-5.4,-5.84,-6.0,-6.43,-7.62,-8.35,-8.52,-8.5,-8.14,-8.45,-8.66,-8.63,-8.97,-8.85,-8.84,-8.36,-8.16,-7.56,-7.4,-7.59,-7.43,-7.23,-6.95,-6.18,-5.48,-3.58,-1.41,-7.91,-5.69,-5.51,-6.17,-5.78,-6.37,-6.63,-6.85,-7.4,-7.97,-8.71,-8.87,-9.32,-10.37,-10.35,-10.56,-10.39,-10.49,-10.53,-10.17,-9.84,-9.8,-9.47,-8.87,-8.54,-8.42,-7.91,-7.31,-6.82,-6.3,-7.2,-7.24,-7.17,-5.3,-2.54,-1.3,1.15,2.02,2.59,2.57,2.15,1.94,2.04,1.98,1.79,1.28,1.33,1.84,2.88,3.02,2.93,2.65,2.59,2.68,3.08,2.95,2.46,2.4,2.29,0.79,0.39,-0.83,-1.07,-1.75,-1.93,-2.59,-2.28,-2.72,-3.36,-3.33,-3.13,-3.07,-2.52,-2.74,-2.5,-2.56,-2.34,-3.35,-3.56,-4.14,-4.74,-4.81,-4.85,-4.95,-4.82,-4.57,-4.45,-5.32,-5.39,-5.51,-5.37,-5.73,-5.5,-5.77,-5.56,-4.89,-5.2,-5.77,-5.76,-5.46,-5.54,-5.38,-5.77,-6.52,-6.29,-5.57,-5.27,-5.46,-5.38,-5.54,-2.52,0.53,-0.87,0.34,-0.05,1.53,-0.17,1.0,-4.26,-1.79,-1.56,-0.1,-0.03,0.46,0.37,0.74,0.58,0.37,-0.42,0.4,-0.84,-1.05,-0.05,-0.47,0.35,1.36,0.18,-1.19,-1.77,-0.67,-1.73,-0.35,-0.11,1.98,-0.68,-2.5,-3.3,-3.93,-4.0,-3.63,-5.42,-5.81,-6.07,-6.71,-7.08,-6.47,-6.47,-6.41,-6.3,-6.33,-6.31,-6.44,-6.75,-7.3,-7.55,-7.74,-8.45,-8.37,-8.67,-9.15,-9.1,-8.94,-9.39,-9.33,-8.76,-8.63,-8.76,-8.88,-9.06,-8.94,-8.76,-8.35,-8.73,-8.44,-8.07,-7.91,-7.83,-7.29,-7.04,-6.76,-5.37,-4.77,-4.81,-5.59,-2.54,-0.93,0.45,0.56,-1.39,-2.39,-2.31,-0.58,-0.33,0.19,-1.04,-0.93,-0.06,0.78,0.88,0.92,0.24,0.01,0.37,1.92,1.58,1.57,1.1,0.71,-0.09,-0.82,-1.57,-1.36,-1.75,-1.96,-2.74,-3.15,-2.21,-2.49,-1.73,-2.1,-1.49,-0.34,1.61,-0.88,-1.0,-3.04,-4.28,-5.04,-5.72,-5.96,-6.95,-7.64,-7.68,-8.08,-8.28,-8.61,-9.27,-9.73,-10.32,-10.88,-10.98,-11.24,-10.97,-11.16,-10.84,-11.15,-10.69,-11.4,-10.72,-10.97,-10.48,-10.25,-10.08,-9.11,-8.55,-11.0,-9.88,-9.78,-9.93,-10.31,-11.39,-11.5,-10.71,-10.99,-10.0,-8.95,-11.01,-12.6,-12.15,-10.71,-10.13,-9.58,-9.58,-9.18,-8.91,-8.55,-7.92,-7.33,-6.74,-6.3,-5.85,-5.2,-4.73,-3.97,-3.29,-2.41,-1.24,0.17,0.73,0.79,0.65,0.39,-0.22,-0.29,6.19,-0.71,-0.24,-0.34,-0.71,0.15,-2.14,-0.43,-2.62,-2.42,-2.46,-2.75,-2.11,-2.32,-1.43,-2.74,-3.53,-2.83,-0.77,-3.14,-2.67,-1.87,-2.4,-3.06,-2.41,-5.46,-5.42,-5.27,-5.32,-5.52,-6.17,-6.59,-7.05,-7.64,-8.12,-8.87,-8.85,-8.68,-9.01,-8.91,-9.0,-9.4,-9.04,-8.84,-8.32,-7.78,-7.74,-7.72,-7.01,-7.03,-6.91,-6.73,-6.15,-5.59,-5.63,-7.43,-1.63,-5.52,-6.13,-6.76,-6.4,-6.88,-7.55,-7.88,-8.64,-8.91,-9.97,-10.25,-11.46,-11.33,-10.99,-10.42,-9.87,-9.22,-8.97,-9.13,-9.17,-9.18,-8.68,-8.42,-8.34,-8.22,-8.26,-7.96,-7.73,-7.53,-7.8,-8.58,-8.77,-7.68,-6.84,-7.1,-5.76,-4.51,0.11,2.38,2.42,3.42,3.7,2.78,3.26,2.79,3.17,3.22,3.94,3.86,4.67,4.14,4.35,4.41,4.37,4.33,4.79,4.62,3.86,2.52,-0.76,-0.04,-0.47,-0.87,-1.98,-2.5,-1.98,-1.56,-1.81,-1.97,-1.86,-1.45,-2.29,-2.89,-2.28,-2.32,-1.71,-2.41,-2.45,-3.25,-4.14,-4.15,-4.28,-4.47,-4.55,-3.94,-4.36,-5.24,-4.9,-5.02,-4.82,-5.42,-5.58,-5.47,-5.1,-4.84,-5.13,-5.57,-5.73,-5.62,-5.49,-5.12,-5.48,-6.33,-6.19,-5.82,-5.27,-4.86,-4.75,-4.51,-3.9,-2.58,-0.14,-0.51,1.03,-2.33,-0.5,-0.59,0.57,-0.28,-0.92,-0.59,-0.37,0.66,0.55,1.46,1.07,-0.05,0.37,-1.32,-0.29,0.78,0.24,0.74,0.13,0.93,-1.05,1.49,-2.33,-0.85,-0.95,-0.67,0.43,1.64,1.99,-0.21,-2.58,-2.86,-3.35,-2.91,-3.97,-5.41,-6.26,-6.39,-7.04,-6.38,-6.36,-6.33,-6.39,-6.66,-6.7,-6.52,-6.72,-7.18,-7.27,-7.43,-7.68,-8.27,-8.4,-8.85,-8.88,-9.03,-9.16,-9.09,-8.78,-8.74,-8.79,-8.99,-9.11,-9.12,-9.08,-8.81,-8.8,-8.47,-8.36,-8.15,-7.9,-7.25,-6.99,-6.81,-6.59,-5.89,-5.17,-5.34,-5.42,0.55,0.7,-0.43,-0.26,-1.75,-2.61,0.92,2.52,1.12,0.9,-0.94,-0.08,0.28,0.6,0.21,0.29,1.83,1.98,3.3,0.36,1.64,1.46,0.69,-0.33,-0.96,-0.65,-1.3,-1.64,-1.66,-2.29,-2.87,-2.92,-1.22,-1.08,-1.99,-0.69,0.97,0.0,-1.04,-1.89,-3.84,-5.11,-5.83,-5.87,-6.06,-6.53,-8.23,-8.08,-8.35,-8.6,-9.33,-10.07,-11.05,-11.58,-12.04,-12.65,-12.57,-12.19,-12.23,-12.11,-11.92,-11.39,-11.78,-11.44,-11.77,-11.33,-11.9,-12.0,-11.9,-11.86,-11.13,-11.5,-11.7,-11.93,-12.13,-12.19,-12.39,-12.38,-12.7,-12.96,-11.73,-12.67,-12.2,-11.64,-11.23,-10.81,-10.17,-9.75,-9.0,-8.71,-8.54,-7.76,-7.08,-6.69,-6.53,-6.12,-5.59,-4.96,-4.29,-3.19,-1.92,-1.28,0.01,0.62,0.83,1.13,1.57,1.08,1.53,1.47,0.49,0.79,0.55,-0.41,0.7,0.76,-0.46,-1.23,-0.9,-1.59,-1.85,-1.66,-2.34,-2.56,-1.81,-2.86,-2.09,-2.17,-2.38,-2.07,-2.86,-3.47,-3.96,-3.7,-6.07,-5.68,-4.87,-5.02,-5.65,-6.54,-6.86,-7.03,-7.67,-8.12,-8.08,-8.72,-9.07,-8.95,-9.14,-9.14,-9.06,-9.39,-9.06,-8.43,-7.71,-6.75,-5.86,-6.1,-6.36,-6.87,-6.63,-6.5,-6.5,-6.92,-7.11,-6.39,-6.43,-6.75,-7.64,-7.94,-7.71,-9.0,-9.17,-9.5,-10.16,-10.36,-10.94,-11.27,-10.35,-10.19,-9.52,-9.13,-8.45,-8.66,-8.35,-8.3,-8.24,-7.99,-7.65,-7.26,-7.23,-7.49,-7.96,-8.32,-8.09,-8.3,-8.8,-8.78,-8.17,-7.12,-6.19,-5.83,-5.71,-6.2,-6.07,-4.51,-4.39,-2.91,0.64,1.7,1.73,2.97,4.19,4.53,5.31,6.22,5.67,4.51,4.4,5.59,6.41,6.47,6.61,4.61,3.1,-0.06,0.64,0.7,0.87,0.72,-1.17,-0.62,-0.29,-1.55,-1.68,-0.44,1.1,0.58,-1.34,-1.82,-1.85,-0.56,-0.66,-1.22,-1.79,-2.67,-2.97,-3.39,-3.41,-3.66,-3.51,-3.74,-4.88,-4.8,-4.74,-4.09,-4.53,-5.78,-5.22,-4.68,-5.31,-5.21,-5.28,-5.57,-5.18,-5.21,-4.58,-4.89,-5.37,-5.44,-5.37,-5.01,-4.78,-4.26,-3.19,-2.3,-1.13,1.11,0.85,-1.11,-0.96,0.34,-0.95,0.08,-0.16,-0.56,-0.21,-0.04,0.67,1.22,1.58,1.52,-0.73,-0.99,-1.13,0.55,0.63,0.2,-0.34,-0.52,0.22,-0.12,1.66,-1.43,-0.74,0.37,0.23,0.94,3.74,2.5,2.1,-2.35,-2.0,-2.95,-2.2,-3.23,-5.51,-5.96,-5.57,-6.6,-6.24,-6.1,-6.02,-6.67,-7.12,-6.95,-6.91,-7.14,-7.01,-7.22,-7.35,-7.03,-8.02,-8.24,-8.42,-8.7,-8.76,-8.98,-8.87,-8.8,-8.9,-9.02,-9.14,-9.19,-9.1,-9.13,-8.78,-8.53,-8.77,-8.0,-7.55,-7.42,-7.07,-6.86,-6.64,-6.44,-6.5,-6.04,-4.53,-3.95,-2.83,-0.98,-0.28,0.21,-0.97,0.75,1.1,2.31,2.49,2.42,1.66,0.21,0.72,0.35,-0.68,0.5,2.64,2.71,3.05,0.94,1.86,0.0,-0.1,0.78,-0.01,-0.42,-1.16,-1.61,-1.51,-1.5,-2.35,-2.94,-1.47,-1.37,-0.7,-0.31,2.9,0.05,-1.19,-2.17,-3.15,-5.51,-5.71,-5.73,-6.11,-6.75,-8.24,-8.42,-8.22,-9.32,-11.13,-11.26,-11.71,-12.01,-12.62,-13.02,-12.92,-12.65,-12.32,-12.9,-12.49,-12.37,-12.35,-12.33,-12.5,-13.41,-13.25,-13.6,-14.1,-13.26,-13.13,-13.37,-13.39,-13.18,-13.14,-13.06,-12.69,-12.64,-12.32,-12.14,-11.77,-11.64,-11.67,-11.71,-11.37,-10.91,-10.35,-9.82,-8.97,-8.6,-7.97,-7.61,-7.14,-6.32,-6.36,-6.28,-5.77,-5.38,-4.74,-3.41,-2.15,-0.97,-0.23,-0.77,-0.41,0.79,2.97,2.49,1.61,0.39,1.19,1.55,1.86,1.16,1.24,1.03,1.34,-0.01,-0.14,-0.04,-0.66,-0.47,-0.64,-1.08,-1.1,-1.4,-1.59,-1.09,-1.48,-0.73,0.72,-2.81,-3.33,-3.54,-2.78,-4.15,-4.5,-4.45,-5.16,-6.18,-6.38,-6.62,-6.81,-7.48,-7.71,-7.91,-7.38,-6.93,-6.66,-5.61,-5.34,-8.94,-8.28,-7.8,-7.44,-6.31,-5.95,-5.6,-6.39,-6.47,-6.82,-6.69,-7.0,-7.61,-7.73,-7.7,-8.03,-9.47,-9.69,-9.01,-9.41,-10.05,-9.85,-9.41,-10.22,-10.24,-10.3,-9.89,-9.4,-8.86,-8.43,-8.1,-8.1,-8.26,-8.3,-8.05,-7.66,-7.71,-7.35,-6.98,-6.59,-6.57,-6.8,-7.65,-8.31,-8.22,-8.4,-8.7,-8.41,-8.08,-7.37,-5.97,-5.21,-4.96,-4.68,-5.32,-4.75,-4.27,-4.71,-3.86,-3.41,-3.31,-2.5,0.65,3.86,5.08,6.08,5.3,5.46,5.42,6.09,8.02,7.69,6.05,3.09,1.72,0.94,2.14,0.99,-1.91,-3.69,-4.32,-4.14,-3.89,-5.59,-5.26,-5.39,-4.8,0.38,-0.43,-0.86,0.35,1.01,0.06,-0.84,-0.72,-1.6,-2.36,-2.54,-2.83,-3.25,-3.6,-4.08,-4.63,-4.56,-4.33,-3.62,-4.66,-5.05,-4.44,-5.09,-4.97,-5.14,-5.31,-5.02,-4.88,-4.42,-4.58,-4.87,-4.78,-4.37,-4.22,-4.02,-3.73,-2.82,-1.89,-1.01,-0.1,0.19,1.76,0.64,-1.71,-0.36,1.0,1.4,0.78,0.63,0.2,0.99,0.94,0.99,0.0,0.11,-0.17,0.67,0.84,0.95,0.66,0.4,0.81,-0.84,1.31,-0.54,-1.01,0.07,0.59,1.09,1.79,4.23,1.1,1.97,-1.26,-0.8,-2.16,-1.76,-3.14,-5.32,-5.35,-6.14,-6.7,-6.23,-6.0,-6.25,-6.77,-6.91,-7.19,-7.82,-7.65,-7.56,-7.28,-7.16,-7.5,-7.33,-8.01,-8.36,-8.44,-8.56,-8.78,-8.66,-8.86,-8.94,-8.8,-8.74,-8.49,-8.46,-8.35,-8.41,-8.4,-7.72,-7.53,-7.13,-6.87,-6.45,-6.56,-6.58,-6.52,-6.39,-6.31,-5.37,-3.75,-3.37,0.27,-0.56,-1.01,0.71,0.27,1.16,1.78,2.09,1.9,3.49,2.38,2.72,2.33,2.42,3.17,2.3,2.46,2.36,2.22,0.45,-0.02,0.62,1.18,0.63,-0.26,-0.97,-1.17,-1.69,-1.28,-2.22,-0.96,-1.81,-1.43,-0.79,-0.02,1.74,0.35,-1.99,-2.05,-2.19,-1.43,0.75,-3.46,-7.08,-7.13,-8.22,-8.54,-8.86,-9.67,-10.13,-10.59,-11.99,-12.27,-12.26,-12.61,-12.98,-13.08,-12.66,-12.92,-13.23,-13.3,-13.43,-13.35,-13.73,-14.14,-14.31,-14.12,-13.92,-13.52,-13.33,-13.25,-12.64,-12.3,-12.07,-12.07,-11.78,-11.91,-11.76,-11.68,-11.79,-11.39,-11.58,-11.06,-10.85,-10.5,-9.88,-9.47,-8.84,-8.27,-7.76,-7.29,-6.8,-6.37,-6.28,-6.48,-5.91,-5.6,-5.33,-4.14,-2.27,-1.13,0.37,-2.54,-1.75,0.54,0.43,0.73,0.97,1.12,0.05,-0.3,0.37,1.08,2.05,1.24,2.75,1.76,0.97,1.49,1.78,-0.96,0.45,0.19,-0.92,0.51,0.33,-0.98,-0.96,-0.98,-1.71,-3.16,-3.77,-2.92,-0.91,-2.42,-2.65,-4.29,-4.56,-5.09,-5.33,-5.61,-6.33,-6.99,-7.54,-7.7,-8.16,-8.08,-7.66,-6.96,-5.86,-6.89,-2.96,-9.23,-6.04,-6.67,-6.14,-5.67,-6.27,-6.48,-6.54,-7.09,-7.29,-7.69,-8.07,-8.25,-9.14,-9.0,-8.86,-8.81,-9.27,-9.94,-9.76,-8.94,-9.19,-8.79,-9.09,-8.75,-8.54,-8.06,-7.78,-7.73,-8.23,-8.57,-8.25,-7.47,-7.14,-7.26,-7.56,-7.79,-7.7,-6.65,-6.37,-6.09,-7.06,-7.85,-7.9,-8.31,-8.06,-7.59,-7.07,-6.87,-6.59,-5.29,-3.98,-2.83,-2.26,-1.83,-0.93,-0.02,2.54,1.89,-0.41,-2.19,-2.95,-1.08,4.2,4.68,5.46,5.83,6.22,7.58,8.11,4.61,4.12,1.47,1.91,2.08,-0.45,-2.6,-4.02,-4.4,-3.75,-4.42,-4.63,-3.78,-4.01,-4.48,-4.42,-3.35,-0.41,1.68,2.62,1.73,0.95,0.56,-0.29,-1.57,-1.65,-1.55,-2.18,-2.82,-3.22,-3.71,-3.58,-4.21,-3.78,-2.88,-3.98,-3.79,-4.66,-4.61,-4.77,-4.88,-5.22,-4.62,-4.59,-3.97,-4.17,-4.24,-4.04,-3.92,-3.8,-3.43,-2.48,-1.01,-0.55,-0.7,-0.57,1.78,-2.62,-0.97,-1.02,-1.34,1.8,1.07,0.35,0.56,0.55,0.68,-1.2,0.77,-0.76,1.17,0.7,1.64,1.3,1.41,0.6,0.61,0.34,0.26,-0.31,-1.23,0.65,-0.54,1.4,6.57,6.48,1.98,0.34,-0.21,-0.1,-1.02,-1.03,-2.65,-4.69,-4.76,-6.52,-6.48,-6.23,-6.06,-6.49,-6.56,-6.3,-7.12,-7.88,-7.68,-7.82,-7.82,-7.58,-7.49,-7.77,-7.97,-8.14,-8.34,-8.33,-8.51,-8.57,-8.75,-8.33,-8.5,-8.49,-8.37,-7.6,-8.43,-8.36,-7.94,-7.43,-6.8,-6.52,-6.45,-5.92,-5.69,-5.88,-5.97,-5.69,-5.67,-5.1,-4.17,-3.06,-1.76,0.3,-0.36,0.14,-0.66,1.28,1.78,3.04,3.82,2.38,3.57,3.06,2.47,3.94,4.52,5.65,5.82,4.39,4.59,0.61,0.42,0.86,1.72,0.95,0.97,0.41,-0.69,-1.25,-1.32,-1.67,-1.41,-1.83,-1.57,-0.82,0.33,0.8,-0.87,-2.28,-2.98,-3.44,-4.38,-6.81,-6.52,-7.13,-7.17,-8.43,-8.64,-9.34,-9.61,-9.75,-10.82,-11.91,-12.16,-12.17,-12.17,-12.32,-12.45,-12.69,-12.76,-13.04,-13.54,-14.17,-14.57,-14.26,-13.94,-13.72,-13.49,-12.98,-12.72,-12.47,-12.17,-11.83,-11.89,-11.4,-11.11,-10.98,-10.9,-10.91,-10.85,-10.8,-11.07,-10.59,-10.5,-10.19,-10.02,-9.66,-9.1,-8.49,-7.82,-7.25,-6.98,-6.63,-6.24,-6.04,-6.12,-6.13,-5.99,-6.17,-4.97,-2.59,-4.01,-4.32,-3.43,-3.73,-3.2,-1.66,-1.44,-0.66,-2.2,-3.55,-5.04,-4.27,-3.39,-3.01,-1.58,1.18,4.02,3.37,2.49,2.37,1.04,1.02,-0.21,0.59,1.6,0.94,-0.71,-2.12,-1.89,-2.38,-2.93,-2.9,-2.49,-3.04,-2.57,-2.81,-5.43,-4.01,-4.05,-3.92,-3.96,-5.06,-7.51,-8.2,-8.34,-8.44,-8.11,-8.19,-8.19,-8.3,-8.27,-9.2,-5.68,-6.21,-6.95,-6.68,-6.23,-7.1,-7.22,-7.07,-7.04,-7.48,-7.49,-8.26,-8.31,-9.06,-8.93,-8.64,-8.32,-8.23,-9.63,-9.49,-8.22,-7.9,-7.55,-7.6,-7.94,-8.07,-8.21,-7.45,-7.42,-7.89,-8.14,-7.84,-7.47,-7.15,-7.05,-7.02,-6.94,-7.15,-7.1,-6.63,-6.66,-5.21,-6.26,-6.95,-7.45,-7.75,-7.23,-6.69,-6.34,-6.2,-5.98,-5.65,-5.75,-3.12,0.21,1.03,2.2,3.21,3.81,4.05,3.4,1.52,-0.3,-1.19,1.06,4.14,5.34,6.48,7.11,8.06,6.05,3.82,1.63,1.9,1.38,-1.16,-2.36,-3.14,-3.49,-3.1,-4.26,-4.83,-3.63,-2.43,-3.17,-2.71,-2.25,-2.93,-2.53,0.23,3.54,1.6,1.43,0.99,-0.84,-1.35,-0.9,-1.08,-1.77,-1.61,-2.5,-2.54,-3.38,-3.68,-3.96,-2.7,-2.93,-4.48,-4.06,-4.18,-4.48,-4.57,-4.57,-4.13,-3.59,-3.33,-3.15,-3.2,-3.69,-3.68,-3.32,-2.17,-0.56,1.04,-1.42,-0.97,0.86,-0.8,-0.88,-0.04,1.46,1.73,-0.35,0.17,0.42,0.36,0.0,-0.16,-0.89,0.63,0.85,1.27,1.13,1.32,1.2,0.69,0.51,0.25,0.96,-0.46,0.21,-0.05,1.15,2.51,6.55,2.25,4.37,-0.34,0.46,0.31,-0.91,-1.71,-2.83,-4.56,-4.73,-5.75,-6.57,-6.08,-5.82,-5.75,-5.58,-6.47,-7.36,-8.06,-7.91,-7.74,-8.12,-8.03,-8.08,-8.28,-8.05,-8.22,-7.8,-7.85,-8.35,-8.34,-8.29,-8.23,-8.29,-8.24,-7.97,-7.99,-8.43,-8.24,-7.4,-7.03,-6.1,-5.7,-4.97,-4.61,-4.3,-4.05,-3.98,-4.64,-4.7,-5.16,-3.72,-2.02,-1.0,0.59,-0.51,0.15,-0.43,-0.83,-0.53,-0.57,-0.03,0.93,2.05,2.86,3.79,2.94,1.84,2.29,1.58,2.22,2.16,1.06,0.93,0.99,2.86,2.72,2.84,2.55,0.99,-0.78,-1.08,-0.92,-0.35,-0.95,-1.9,0.65,2.03,-0.35,-1.8,-2.98,-4.1,-4.4,-4.63,-6.36,-6.82,-6.7,-7.59,-8.42,-9.08,-9.23,-9.25,-10.01,-10.11,-11.37,-11.7,-12.16,-12.16,-11.95,-12.0,-12.03,-12.09,-12.34,-12.94,-13.17,-13.32,-13.25,-12.81,-12.79,-12.48,-12.2,-12.33,-12.22,-11.55,-11.65,-12.13,-10.82,-10.7,-10.69,-10.55,-10.36,-10.34,-10.42,-10.44,-10.32,-10.15,-9.94,-9.61,-9.22,-8.66,-7.8,-6.88,-6.87,-6.68,-6.26,-5.88,-5.67,-5.78,-5.62,-5.62,-6.34,-5.75,-3.15,-4.73,-5.5,-6.41,-4.59,-4.63,-5.11,-3.37,-3.58,-3.88,-3.16,-4.05,-3.98,-2.61,-1.26,0.02,1.14,2.59,6.07,4.85,4.06,3.35,1.8,1.75,1.87,0.76,1.21,-0.59,-1.35,-2.81,-2.53,-2.72,-2.58,-2.66,-3.24,-2.13,-2.12,-3.45,-4.68,-2.75,-1.66,-2.66,-5.39,-8.29,-8.32,-8.34,-8.29,-8.18,-8.11,-7.98,-7.72,-7.82,-8.01,-7.85,-8.0,-8.46,-8.57,-7.92,-8.64,-7.34,-7.37,-7.32,-7.41,-7.72,-8.67,-8.03,-8.47,-8.33,-8.17,-8.11,-7.74,-8.54,-9.06,-7.43,-7.04,-7.32,-7.56,-7.74,-7.99,-7.71,-7.43,-6.91,-7.01,-7.26,-7.31,-7.27,-7.44,-7.54,-7.2,-6.95,-7.38,-6.93,-6.8,-6.2,-6.42,-5.95,-5.52,-5.64,-5.97,-6.12,-5.05,-4.94,-5.17,-5.22,-4.88,-5.41,-5.85,-4.57,-0.49,3.1,4.27,4.68,5.06,5.4,5.41,4.77,1.53,-1.34,-1.15,2.69,6.13,6.79,7.68,6.84,3.44,2.31,2.36,0.96,-0.18,-1.71,-2.58,-1.39,-2.06,-1.7,-1.62,-1.88,-2.43,-2.41,-3.1,-3.25,-3.0,-3.25,-2.66,0.12,2.84,2.21,1.25,-0.51,-1.14,-0.62,-0.33,0.32,0.21,-0.63,-0.86,-1.64,-2.87,-3.69,-3.22,-2.2,-3.47,-3.44,-3.49,-3.84,-4.01,-4.16,-3.53,-3.11,-2.84,-2.71,-2.81,-2.96,-2.98,-2.49,-1.48,-0.43,0.32,-0.33,-1.18,-0.62,1.44,-1.4,0.89,1.56,0.3,-0.7,-0.05,0.35,0.44,0.2,0.14,-0.43,0.85,1.3,1.22,0.64,1.11,0.38,-1.43,0.06,-1.23,-0.13,-0.89,1.47,2.16,3.93,-1.47,-0.71,-7.89,-1.47,0.99,0.32,0.35,0.78,-1.9,-1.93,-2.76,-4.58,-5.78,-5.62,-5.43,-5.48,-5.41,-5.44,-6.82,-7.44,-7.69,-7.99,-7.81,-7.75,-8.09,-8.05,-8.13,-8.4,-7.21,-8.25,-7.56,-7.81,-8.03,-7.97,-7.95,-7.98,-8.0,-8.1,-8.04,-7.94,-7.63,-6.45,-6.19,-4.94,-3.93,-3.89,-3.74,-3.68,-3.63,-3.83,-4.41,-5.29,-5.92,-4.74,-2.33,-1.5,0.4,-1.33,-3.63,-2.06,-2.87,-1.84,-0.45,0.29,0.75,0.08,1.38,3.99,1.39,1.38,0.8,1.86,-0.62,-1.41,2.13,2.27,1.6,3.93,3.63,3.56,3.42,2.32,0.53,-0.48,-0.78,-1.18,-2.42,-0.38,0.39,1.2,-1.09,-1.75,-3.43,-4.62,-5.12,-5.41,-6.21,-6.57,-6.81,-8.61,-8.87,-9.28,-9.17,-9.13,-9.96,-9.92,-11.25,-11.56,-12.54,-12.28,-12.03,-12.02,-11.95,-11.82,-12.11,-12.48,-12.91,-12.99,-12.68,-12.23,-11.64,-11.02,-11.44,-11.44,-11.48,-11.52,-11.63,-11.48,-10.79,-10.67,-10.04,-9.91,-9.67,-9.79,-9.89,-10.15,-10.36,-10.04,-9.54,-8.8,-8.27,-7.46,-6.53,-6.21,-6.33,-6.14,-5.77,-5.48,-5.31,-5.27,-5.17,-5.02,-5.62,-6.19,-2.61,-5.38,-5.59,-5.07,-6.23,-5.82,-5.33,-5.74,-4.13,-3.82,-1.44,-1.45,-1.47,-1.95,-0.9,0.63,0.9,0.93,3.74,7.79,5.26,5.96,2.78,1.01,2.76,1.48,1.51,0.03,-0.31,-2.65,-2.89,-2.31,-2.22,-0.89,-2.59,-1.62,-2.09,-2.4,-2.88,-5.06,-3.53,-4.01,-7.19,-8.14,-8.45,-8.04,-7.72,-7.86,-7.69,-7.49,-7.25,-7.41,-7.65,-8.46,-8.79,-8.91,-9.23,-9.52,-9.36,-8.39,-8.08,-8.34,-8.11,-8.55,-8.68,-8.19,-7.81,-7.44,-7.35,-7.2,-7.41,-7.38,-7.37,-6.94,-6.82,-6.74,-6.94,-7.22,-7.48,-7.47,-7.16,-7.31,-8.18,-8.24,-7.91,-7.53,-7.04,-6.58,-5.8,-6.99,-6.58,-6.28,-5.94,-5.89,-5.77,-5.83,-6.18,-5.9,-4.82,-3.72,-4.23,-3.92,-4.02,-3.95,-3.76,-3.81,-3.43,-3.04,-3.59,-2.72,-0.24,3.73,6.71,7.29,6.66,5.35,3.22,0.91,-0.39,-0.71,0.68,5.03,7.93,6.7,3.7,2.53,1.82,2.42,0.33,-0.47,-1.58,-0.91,-0.53,-1.27,-1.25,-0.69,-1.93,-1.16,-1.63,-2.82,-3.45,-3.74,-3.77,-5.16,-1.49,2.2,1.75,0.21,-0.17,0.9,1.09,1.45,2.23,2.17,1.51,0.09,-1.57,-2.96,-2.9,-2.15,-1.19,-1.9,-2.83,-3.06,-3.3,-3.42,-3.46,-3.33,-3.15,-3.21,-3.07,-2.95,-2.49,-1.84,-0.92,0.21,1.98,-0.73,-1.22,0.31,0.75,-2.15,1.83,0.08,-0.8,-0.56,-0.14,0.28,0.21,0.05,-0.24,-0.32,0.29,0.31,-0.23,-0.19,0.3,0.18,-0.61,-0.66,0.68,3.83,3.78,1.39,0.04,-1.51,-1.84,-3.07,-5.41,-7.8,-4.78,-0.14,-1.53,1.34,-0.77,-0.85,-2.25,-4.16,-5.46,-4.56,-4.45,-4.64,-5.2,-5.62,-6.12,-7.1,-6.82,-7.41,-7.73,-7.91,-8.37,-8.46,-8.36,-8.39,-8.32,-7.92,-7.71,-7.77,-7.88,-7.77,-7.58,-7.54,-7.78,-8.03,-7.49,-7.31,-6.68,-4.84,-4.24,-3.16,-3.32,-3.52,-3.43,-3.94,-3.9,-4.53,-5.94,-6.8,-6.64,-6.11,-4.0,-2.21,-0.35,-1.73,-2.1,-0.79,-2.88,-1.95,-0.36,1.0,1.84,-0.57,-1.9,0.18,-0.98,-0.53,-1.2,-0.07,-1.9,-3.54,-1.4,3.04,6.57,5.32,3.6,3.23,3.47,2.89,2.18,0.68,0.22,0.7,1.1,-0.55,-1.7,-1.57,-1.99,-2.32,-3.72,-4.53,-4.57,-5.15,-6.53,-7.14,-7.76,-7.91,-8.91,-9.14,-9.08,-9.35,-9.74,-10.61,-11.23,-12.1,-12.49,-12.15,-11.75,-11.83,-11.93,-11.85,-12.21,-12.72,-12.71,-12.48,-11.82,-11.17,-10.77,-10.49,-10.68,-10.59,-10.84,-11.04,-11.38,-11.45,-10.76,-10.32,-10.11,-10.23,-10.36,-10.42,-10.34,-10.28,-10.04,-9.41,-8.46,-7.9,-7.26,-6.65,-6.34,-5.71,-5.59,-5.53,-5.23,-5.18,-4.77,-4.74,-4.51,-4.52,-4.63,-5.06,-4.55,-4.11,-4.48,-4.94,-5.54,-4.83,-4.66,-3.48,-2.68,-1.94,-0.56,0.38,1.05,1.85,3.05,3.77,5.82,1.87,3.75,-1.06,2.08,-1.19,0.27,2.79,4.25,4.03,2.9,1.62,-0.23,-1.92,-1.61,-0.61,-0.97,-0.3,-1.19,-2.21,-1.81,-2.42,-3.39,-3.1,-4.2,-6.34,-7.84,-8.01,-8.17,-7.69,-6.91,-6.97,-6.85,-6.82,-6.76,-6.88,-7.66,-8.5,-9.07,-9.23,-9.82,-9.93,-9.45,-8.88,-8.45,-8.25,-8.49,-8.08,-7.9,-7.74,-7.29,-6.76,-6.97,-6.91,-6.98,-6.83,-6.72,-6.66,-6.93,-6.7,-6.54,-6.49,-6.44,-6.44,-5.99,-6.54,-6.64,-6.16,-6.3,-5.73,-5.95,-6.1,-5.67,-5.71,-5.54,-4.64,-5.05,-4.92,-5.37,-5.24,-5.23,-5.05,-5.03,-4.54,-4.14,-4.44,-3.94,-3.72,-3.19,-3.07,-2.96,-2.31,-1.72,-1.9,-2.2,-0.84,1.93,4.72,6.35,6.36,5.08,3.16,1.95,1.61,0.98,1.32,4.54,9.74,4.66,2.54,1.92,1.86,1.52,0.1,-0.75,-1.19,-0.78,-0.21,-1.25,-1.45,-1.67,-1.8,-1.7,-2.09,-1.38,-2.35,-3.68,-3.99,-4.68,-5.02,-4.91,-4.86,-4.05,-3.99,0.46,3.31,2.39,3.02,2.99,2.52,-0.21,-1.45,-2.04,-0.97,0.51,-0.41,-1.43,-2.21,-2.25,-3.02,-3.57,-3.72,-3.94,-3.99,-3.82,-3.47,-2.77,-1.82,-0.78,0.27,2.65,-1.2,-1.09,1.77,0.42,-2.87,0.81,0.41,-1.31,-0.63,-0.27,0.22,0.19,-0.01,-0.46,-0.35,0.02,-0.68,0.37,-0.75,-1.25,0.36,-0.32,1.39,2.44,4.47,7.29,5.18,0.97,-2.27,-2.6,-3.0,-4.59,-4.58,-4.54,-5.08,0.27,1.99,0.97,0.2,-1.44,-4.45,-4.67,-4.32,-2.8,-3.78,-4.63,-5.14,-5.25,-6.78,-6.12,-6.77,-7.27,-7.28,-7.67,-7.65,-8.15,-8.02,-7.83,-7.81,-7.6,-7.46,-7.25,-6.89,-7.39,-6.74,-7.24,-7.59,-6.97,-6.5,-5.49,-3.45,-3.27,-3.1,-3.08,-4.43,-4.64,-4.73,-5.45,-6.13,-7.15,-7.4,-6.32,-6.41,-7.13,-4.77,-2.04,-0.89,-1.85,0.72,-3.74,-1.88,-0.59,0.07,-0.95,-3.85,-3.32,-3.03,-1.29,0.09,-0.41,0.85,-0.85,-0.8,-0.35,2.2,6.64,6.1,3.02,2.62,3.19,2.74,2.12,1.62,1.63,2.73,3.79,2.08,-3.27,-2.93,-2.66,-2.69,-3.79,-4.48,-5.23,-5.73,-5.73,-7.49,-7.91,-8.01,-8.05,-8.53,-8.94,-9.55,-10.28,-10.72,-11.1,-12.24,-12.52,-11.69,-11.47,-11.73,-12.02,-12.57,-12.93,-12.8,-12.2,-11.63,-11.14,-10.61,-10.03,-10.17,-9.43,-11.09,-10.41,-10.46,-11.0,-10.91,-10.63,-10.36,-10.63,-10.68,-10.23,-9.62,-9.42,-9.3,-8.73,-8.2,-7.43,-6.75,-6.7,-6.62,-5.98,-5.38,-5.19,-4.9,-4.75,-4.41,-4.35,-4.05,-4.0,-3.89,-3.72,-3.44,-1.77,-1.93,-3.75,-3.81,-3.88,-3.62,-3.17,-2.21,-1.35,0.04,0.62,1.72,2.35,3.33,5.06,5.74,6.04,6.43,4.09,3.59,2.85,1.44,-2.1,-2.37,-1.48,2.0,3.69,2.42,1.44,-0.81,-0.99,-0.57,-0.28,-0.08,-0.65,-1.1,-2.21,-2.54,-1.85,-3.31,-2.84,-5.33,-6.81,-7.6,-7.46,-6.54,-6.15,-5.96,-5.88,-6.03,-6.56,-7.02,-7.5,-8.21,-9.08,-9.18,-9.27,-9.42,-9.26,-8.73,-7.9,-7.93,-7.65,-7.43,-7.58,-7.95,-6.74,-6.34,-6.12,-6.77,-6.6,-6.44,-6.23,-6.02,-6.14,-6.18,-6.05,-6.1,-6.06,-5.95,-5.58,-4.9,-4.28,-4.11,-5.43,-5.14,-5.4,-5.01,-4.61,-4.46,-4.64,-4.1,-3.54,-3.7,-3.83,-3.68,-3.75,-3.77,-3.46,-3.39,-3.48,-3.28,-3.29,-3.16,-3.28,-3.06,-2.63,-2.34,-1.73,-1.14,-0.66,-1.35,-1.44,0.06,0.68,2.03,4.25,4.25,3.38,3.82,3.96,3.16,2.88,4.44,10.38,3.11,2.43,2.32,1.06,0.08,-0.21,-0.59,-0.41,0.25,-0.55,-0.38,-0.34,0.13,-0.01,-0.01,-0.05,0.32,0.21,-0.84,-2.19,-3.53,-3.69,-2.6,-1.92,-1.14,-2.41,-2.9,-0.1,3.08,3.73,2.97,1.7,0.69,-0.68,-0.07,1.42,0.55,0.08,-1.38,-1.8,-2.6,-3.54,-4.23,-4.7,-4.59,-4.21,-3.51,-2.79,-2.15,-1.05,0.25,1.42,-0.51,-0.62,1.19,2.47,-0.98,-1.42,-0.06,-1.47,-0.72,-0.09,-0.07,0.49,0.24,-0.33,0.08,0.17,-0.38,-0.11,-0.79,1.25,0.99,1.38,2.48,3.16,2.69,5.15,7.9,4.2,-1.21,-2.45,-2.47,-3.23,-3.63,-4.09,-3.66,-4.58,0.02,1.87,-0.05,-1.22,-3.98,-3.8,-3.81,-2.85,-2.99,-3.91,-4.24,-4.89,-5.56,-5.32,-5.82,-6.43,-7.05,-6.99,-7.95,-7.7,-7.73,-8.23,-8.5,-8.2,-7.98,-7.7,-7.87,-7.7,-6.9,-6.63,-6.7,-6.5,-5.24,-4.15,-2.47,-3.13,-4.28,-5.06,-5.58,-5.78,-5.54,-6.28,-7.14,-7.48,-7.51,-7.04,-7.29,-8.53,-8.39,-5.24,-3.36,-1.74,1.03,-1.58,-2.56,-1.05,-0.37,-2.13,-3.62,-0.94,0.04,1.41,2.07,2.52,2.72,-1.62,-0.14,0.93,1.83,4.94,5.5,2.27,1.67,3.01,2.64,2.05,1.91,2.43,2.45,0.94,-2.95,-3.94,-3.23,-2.81,-2.96,-3.64,-4.47,-4.8,-4.74,-6.04,-7.29,-7.51,-7.59,-7.8,-8.19,-9.16,-9.3,-10.17,-10.67,-10.88,-11.8,-11.58,-10.93,-11.33,-11.73,-12.67,-12.83,-12.75,-12.02,-11.42,-11.21,-11.54,-12.08,-12.16,-11.96,-11.15,-11.19,-11.15,-10.99,-10.89,-10.62,-10.7,-10.69,-10.7,-10.41,-9.87,-9.44,-8.62,-8.27,-7.66,-7.84,-7.44,-6.93,-6.4,-6.25,-5.66,-5.01,-4.77,-4.7,-4.36,-3.9,-3.65,-2.99,-2.91,-3.21,-3.35,-2.95,-3.37,-0.5,-2.72,-2.77,-3.16,-2.5,-1.85,-0.97,0.23,1.2,1.67,3.32,2.84,4.03,4.55,5.6,7.27,7.41,6.71,6.45,6.31,4.41,2.16,1.99,1.12,-0.77,-1.41,0.56,2.93,0.45,-0.57,-0.13,-0.76,0.1,-1.36,-1.38,-1.8,-1.27,-1.68,-3.4,-3.86,-5.05,-7.23,-6.52,-5.9,-5.54,-5.33,-5.63,-5.71,-5.5,-6.22,-6.92,-7.55,-7.69,-8.81,-8.56,-8.61,-8.7,-8.98,-8.44,-7.95,-7.84,-7.57,-7.38,-7.6,-8.27,-7.78,-7.5,-7.34,-6.82,-6.51,-5.89,-5.1,-4.6,-4.39,-4.37,-4.89,-4.57,-4.57,-4.21,-3.78,-3.78,-3.96,-4.0,-4.01,-3.95,-3.72,-3.52,-3.12,-2.89,-1.99,-1.53,-1.41,-1.81,-1.9,-2.02,-1.72,-1.65,-1.52,-1.47,-1.54,-1.56,-1.28,-1.18,-1.47,-1.86,-2.02,-1.98,-1.33,-1.02,-0.26,0.46,-0.31,-1.14,-0.79,0.71,1.86,2.92,3.89,5.05,5.07,4.73,3.34,4.16,7.6,11.03,2.04,0.98,0.37,-0.03,0.11,0.57,0.43,1.02,1.08,1.78,1.66,1.72,2.45,2.17,2.07,1.9,2.09,2.67,2.08,1.32,0.3,-0.56,-0.37,1.22,2.16,2.62,2.86,2.15,3.14,3.95,3.41,1.9,0.96,0.65,1.26,0.8,0.82,-0.28,-1.24,-2.22,-3.51,-4.48,-4.97,-4.52,-3.71,-3.07,-2.1,-1.13,-0.49,0.47,1.61,-0.66,-1.46,0.28,0.97,-0.4,1.5,-1.03,-1.67,-0.81,-0.09,0.5,0.69,0.53,-0.1,-0.18,-0.49,0.4,-0.23,-1.24,0.34,2.24,1.62,0.86,3.54,3.54,1.42,5.02,5.77,0.96,-2.12,-3.11,-2.87,-2.94,-3.06,-5.25,-2.82,-5.16,-1.78,1.02,-1.26,-3.42,-3.0,-3.09,-2.03,-2.32,-2.54,-3.5,-4.03,-4.74,-4.69,-4.49,-5.79,-6.0,-6.87,-6.92,-7.22,-6.81,-6.7,-6.18,-6.76,-6.09,-5.97,-5.63,-6.1,-5.21,-5.59,-5.48,-4.91,-2.78,-2.57,-1.66,-5.86,-5.93,-6.11,-5.61,-5.69,-5.87,-7.04,-7.33,-7.32,-7.53,-7.82,-8.45,-9.48,-9.33,-8.98,-5.08,0.49,-3.33,-3.7,-1.09,-0.08,-0.17,-1.38,0.03,1.94,1.84,1.64,2.16,2.93,-2.72,-2.8,1.37,1.79,1.54,3.11,3.36,2.2,1.1,1.97,2.38,1.53,2.4,2.42,1.15,-2.49,-4.27,-3.77,-3.15,-2.63,-2.48,-3.2,-3.86,-4.17,-4.41,-5.18,-6.04,-7.83,-7.08,-7.82,-7.8,-8.72,-8.53,-9.16,-9.55,-9.41,-10.22,-10.44,-10.25,-10.7,-11.5,-12.49,-12.52,-12.0,-11.43,-10.96,-10.96,-11.45,-11.86,-12.42,-12.25,-12.33,-11.44,-11.12,-11.29,-10.87,-10.97,-10.82,-10.62,-10.08,-9.42,-8.86,-8.32,-8.07,-7.48,-7.1,-6.83,-6.31,-5.65,-5.83,-6.22,-5.93,-5.51,-5.33,-5.09,-4.74,-4.68,-4.81,-5.07,-4.75,-4.32,-4.17,-4.75,-4.72,-1.91,-1.59,-1.86,-1.95,-0.89,-0.95,0.07,1.06,1.49,2.59,3.76,4.71,5.79,6.07,6.08,6.9,8.22,8.73,8.27,7.34,7.99,7.0,3.37,1.03,2.96,3.69,-2.77,-2.44,-1.19,1.1,1.65,0.35,0.67,0.37,-0.6,-0.37,-0.2,-0.82,-1.88,-2.67,-3.95,-5.21,-5.03,-4.81,-4.79,-5.05,-5.33,-5.29,-5.19,-5.33,-6.76,-7.55,-7.47,-7.79,-7.62,-8.21,-8.35,-8.46,-8.19,-8.03,-7.85,-7.85,-7.46,-7.12,-7.23,-6.65,-6.34,-6.77,-6.41,-6.73,-5.73,-5.55,-5.22,-2.95,-2.65,-2.9,-3.81,-2.95,-2.68,-2.4,-1.99,-1.12,-0.42,-1.3,-0.95,0.0,0.69,1.25,2.2,2.13,1.47,2.23,2.63,3.37,3.39,2.4,1.2,0.91,1.06,1.11,0.88,1.5,1.02,0.53,0.35,-0.09,0.17,0.13,0.15,0.03,0.34,0.98,0.86,0.83,0.54,0.81,3.51,5.76,5.86,4.45,4.28,4.92,5.16,6.34,8.98,2.93,0.4,0.21,0.82,1.08,0.76,1.33,2.1,1.71,2.18,3.03,3.17,3.42,3.67,3.68,3.58,3.87,4.3,4.28,3.91,4.12,4.73,4.11,2.63,2.12,3.14,4.31,4.86,3.04,5.6,3.43,2.81,2.45,1.94,1.09,-0.26,1.45,0.86,-0.31,-1.76,-3.3,-4.28,-4.72,-4.1,-3.09,-2.28,-1.39,-0.14,0.32,0.27,-0.22,-1.21,1.54,0.66,1.08,-0.61,-1.69,-2.14,-1.47,-0.46,-0.14,0.42,0.14,0.25,-0.03,0.14,-0.37,-0.75,-0.57,0.1,0.17,-0.21,0.72,6.08,5.39,4.94,3.59,3.76,4.24,3.72,-0.98,-2.65,-2.86,-2.08,-2.56,-3.97,-2.9,-3.94,-4.82,-1.46,0.67,-0.62,-2.37,-1.68,-1.37,-1.41,-1.84,-1.87,-2.65,-3.33,-3.98,-3.94,-4.35,-4.71,-5.44,-6.37,-7.02,-6.89,-5.72,-6.29,-5.52,-4.98,-4.69,-4.21,-4.45,-4.32,-3.86,-3.16,-2.55,-1.66,-1.41,-6.58,-6.26,-6.45,-5.75,-5.04,-5.69,-6.94,-7.3,-7.14,-7.35,-7.88,-8.37,-9.02,-9.45,-9.05,-8.31,-7.13,-1.79,-3.92,-1.51,-3.0,-2.21,-5.85,-3.5,0.4,-0.43,-0.98,0.49,-0.05,-1.54,-2.82,-1.05,9.27,2.2,1.66,2.94,3.47,0.93,2.01,1.37,1.88,1.78,1.99,2.2,-0.26,-2.42,-2.34,-3.11,-2.76,-2.24,-2.63,-2.86,-3.66,-3.61,-4.24,-5.16,-5.56,-6.56,-6.85,-7.5,-7.91,-7.67,-7.71,-7.82,-8.11,-8.37,-9.27,-9.88,-9.44,-9.74,-10.4,-11.55,-11.5,-11.18,-10.85,-10.79,-10.88,-11.15,-11.04,-11.19,-10.77,-10.73,-10.28,-10.15,-10.04,-10.57,-10.91,-10.66,-9.86,-9.15,-8.56,-8.06,-7.39,-6.69,-6.33,-6.25,-6.48,-6.08,-6.9,-7.07,-6.41,-5.67,-5.34,-5.06,-4.64,-4.68,-4.2,-4.32,-4.54,-4.32,-3.97,-4.38,-4.54,-3.46,-3.65,-0.84,-1.12,-0.51,-0.79,0.98,0.84,1.86,2.23,3.47,3.98,4.59,5.55,6.36,7.82,8.29,9.11,9.26,9.51,9.15,7.72,8.45,7.62,5.51,3.19,5.26,7.19,2.91,-0.01,0.96,2.72,0.0,-0.24,-0.75,-0.22,0.42,0.42,0.89,0.52,-1.77,-3.35,-4.33,-4.25,-4.17,-3.79,-3.91,-4.55,-5.13,-4.96,-4.11,-7.01,-7.45,-7.32,-7.02,-7.04,-7.45,-7.67,-8.18,-8.02,-7.66,-7.52,-7.67,-7.47,-6.95,-6.67,-6.05,-5.57,-4.9,-4.6,-4.16,-4.05,-3.79,-3.44,-3.03,-3.19,-2.05,-2.95,-2.83,-2.76,-2.74,-1.94,-1.44,-1.0,-0.04,0.54,0.95,1.15,1.11,1.37,0.69,0.28,0.4,1.74,2.45,0.75,1.12,1.47,2.28,3.52,4.48,5.25,5.33,4.62,3.77,3.17,2.86,2.72,2.58,2.34,2.0,1.7,1.15,0.77,1.06,1.9,-0.16,0.1,0.15,1.26,2.93,4.43,6.13,5.28,6.59,7.85,9.58,-1.21,0.88,1.25,1.75,1.63,2.87,3.06,3.03,3.03,3.56,4.62,4.48,4.95,4.4,3.72,4.36,4.73,4.58,4.73,5.5,5.76,5.89,6.01,5.06,4.24,4.52,5.26,5.5,3.93,3.87,2.65,3.1,3.6,2.35,1.19,1.68,1.42,0.73,-1.24,-2.96,-3.91,-4.29,-3.73,-2.66,-1.74,-0.9,-0.14,-0.01,0.62,-0.01,-0.81,-0.64,-1.47,0.69,-0.47,-1.09,-3.18,-1.47,-0.83,-0.05,0.09,0.1,0.08,0.61,0.41,1.38,1.18,0.67,1.63,1.75,4.06,8.83,9.78,8.35,7.36,5.36,2.17,-0.4,4.37,0.44,-1.38,-1.56,-2.01,-1.45,-2.42,-3.42,-2.62,-4.54,-3.13,-4.84,1.74,-0.04,-0.03,-0.1,-0.19,-0.01,-0.72,-0.67,-1.86,-2.6,-2.64,-3.04,-3.37,-3.77,-4.69,-5.41,-5.65,-4.43,-4.79,-3.71,-4.48,-4.55,-4.08,-4.09,-4.26,-4.14,-3.36,-2.09,-1.83,-1.09,-6.65,-6.34,-6.3,-5.06,-5.19,-5.83,-6.95,-6.46,-7.15,-7.85,-8.3,-8.77,-9.18,-9.3,-8.87,-7.77,-6.33,-4.75,-2.22,-2.02,-3.83,-5.66,-6.33,-3.58,-2.83,-5.42,-3.31,0.86,-2.16,1.12,1.0,8.02,8.72,3.18,2.38,2.94,0.96,4.92,1.08,2.81,2.19,2.37,2.56,2.18,0.29,-2.85,-1.37,-2.39,-1.74,-1.86,-2.68,-3.49,-3.3,-3.89,-4.27,-4.31,-4.35,-5.44,-6.3,-7.16,-7.56,-6.76,-6.92,-6.59,-6.99,-8.81,-9.98,-9.46,-8.83,-8.72,-9.46,-10.51,-10.84,-10.64,-10.57,-10.88,-10.97,-10.95,-10.66,-10.68,-10.65,-10.69,-10.63,-10.43,-10.53,-10.8,-10.74,-10.1,-9.06,-8.24,-7.92,-7.69,-7.09,-6.44,-5.63,-6.43,-6.77,-6.62,-6.66,-6.27,-6.12,-5.41,-4.66,-4.19,-3.89,-3.89,-4.12,-4.17,-3.86,-3.64,-3.83,-3.66,-3.62,-2.54,-2.63,-1.03,-0.87,-0.51,1.39,1.64,1.5,2.83,2.86,3.89,4.14,4.5,5.19,6.51,7.66,9.24,10.4,10.57,10.79,10.59,10.42,7.75,8.98,7.42,6.4,7.06,6.62,6.21,3.07,2.85,1.33,1.2,-1.15,-0.32,-0.77,-2.19,1.72,2.36,-0.07,-1.33,-3.27,-4.13,-3.57,-3.47,-3.28,-3.33,-3.56,-5.64,-4.91,-4.02,-8.15,-7.82,-7.79,-7.59,-7.63,-7.6,-7.35,-7.16,-6.92,-6.55,-6.16,-6.21,-6.15,-5.56,-5.28,-4.79,-4.01,-3.19,-2.96,-2.48,-2.3,-1.77,-1.51,-1.49,-1.72,-2.07,-1.85,-2.38,-2.98,-2.73,-1.8,-1.21,-0.93,-0.63,0.32,1.31,1.82,1.54,0.95,-0.35,-0.15,-0.05,-0.22,-0.33,-0.74,-0.22,0.56,0.46,0.64,1.27,2.05,2.22,3.06,4.94,5.82,6.25,6.14,5.38,4.63,4.06,3.73,3.16,2.45,1.67,1.02,1.47,0.99,0.3,0.11,0.55,2.34,4.55,6.07,5.71,6.4,7.71,-0.97,1.16,1.84,2.64,2.12,3.25,3.69,3.38,3.4,4.72,4.92,5.23,5.82,5.78,6.44,6.27,6.0,5.91,6.21,6.57,6.99,7.57,7.32,6.98,6.38,5.55,5.01,5.51,5.41,4.92,4.98,4.01,3.47,2.62,1.71,1.58,1.55,1.26,-0.83,-2.86,-3.77,-3.75,-3.33,-2.22,-1.91,-1.39,-1.13,-0.58,1.11,-0.31,1.43,-2.96,-0.91,-1.66,-4.39,-2.57,-2.93,0.07,-0.96,-0.97,-0.23,-0.37,-0.05,0.36,0.26,0.86,2.37,3.07,4.35,4.54,11.73,13.49,11.37,8.93,7.12,6.24,3.81,-2.51,-6.53,-5.29,-2.57,-1.99,-1.12,-0.69,-1.2,-2.08,-3.13,-3.68,-3.68,-2.63,-3.28,-3.34,3.06,0.23,0.82,0.65,0.59,0.58,-1.31,-1.3,-1.75,-1.9,-2.11,-2.23,-2.28,-3.57,-3.81,-3.42,-2.43,-1.93,-3.05,-3.79,-3.05,-3.16,-3.11,-1.5,-0.97,-3.22,-2.76,-4.67,-6.87,-5.58,-5.29,-4.85,-5.34,-5.43,-6.16,-5.65,-7.21,-8.13,-8.42,-8.94,-9.35,-8.8,-8.08,-7.24,-6.5,-5.69,-1.74,0.78,-5.42,-6.2,-4.98,-3.74,-2.77,-3.44,-0.75,-2.84,0.16,2.75,6.0,13.28,6.94,5.29,3.92,2.85,1.19,-1.6,6.21,2.19,3.36,2.99,3.32,3.08,0.19,-1.1,-2.58,-2.49,-0.74,-0.95,-2.72,-3.4,-3.22,-3.8,-3.35,-3.48,-4.22,-5.05,-5.91,-6.29,-7.07,-6.32,-6.32,-5.52,-7.99,-9.19,-9.79,-9.06,-8.62,-8.32,-9.3,-10.0,-10.0,-9.84,-9.76,-10.26,-10.23,-9.88,-10.03,-10.29,-10.19,-9.72,-9.48,-9.8,-10.12,-10.12,-9.69,-8.97,-8.4,-7.87,-7.05,-6.59,-6.35,-6.12,-6.05,-5.98,-6.43,-6.28,-6.13,-5.74,-4.87,-4.38,-3.91,-3.2,-3.28,-3.29,-3.19,-3.26,-3.18,-3.27,-3.24,-2.86,-2.38,-2.03,-2.51,-2.51,0.14,-0.28,0.35,1.25,2.19,2.77,3.0,3.67,3.94,4.81,6.16,7.4,8.49,9.63,11.06,11.99,12.24,11.97,11.91,10.94,8.93,7.06,6.59,7.56,3.15,4.68,2.78,2.68,1.94,1.81,-0.41,-1.0,-0.55,-1.01,1.68,0.92,0.48,-2.02,-3.04,-3.44,-3.09,-2.99,-3.55,-4.3,-4.99,-5.05,-4.48,-4.95,-7.65,-7.5,-7.38,-7.46,-7.37,-6.96,-6.85,-6.43,-5.73,-4.92,-4.62,-4.37,-3.64,-3.18,-2.64,-2.12,-1.8,-1.32,-0.94,-0.58,-0.36,0.15,0.72,0.48,0.24,-0.96,-1.47,-2.23,-1.31,-0.89,-0.59,-0.77,-0.55,-0.79,-0.65,-0.12,0.65,0.55,0.18,0.27,0.79,0.06,-0.15,0.49,0.52,0.67,0.7,0.89,0.82,0.95,1.54,2.05,2.36,2.77,3.17,3.73,5.51,7.13,7.57,6.33,5.8,5.16,4.19,3.55,2.69,1.87,1.88,2.4,2.28,2.16,3.2,4.27,4.22,4.7,5.18,6.79,2.46,2.08,3.33,3.4,2.97,3.76,4.55,3.94,4.43,3.99,5.02,6.31,6.65,6.58,5.86,6.13,6.68,7.23,7.16,7.47,7.89,7.73,7.49,7.4,7.45,6.46,5.8,5.2,6.63,7.54,6.73,5.13,2.96,1.88,1.44,0.71,0.88,1.26,-0.28,-2.29,-3.2,-3.48,-3.02,-2.35,-2.27,-2.07,-2.15,-1.67,-0.4,-2.37,3.85,0.98,-0.01,0.4,-1.01,-1.31,1.11,-2.39,-2.99,-1.46,-1.55,-0.52,0.15,0.18,0.49,1.58,2.19,2.86,4.54,9.0,11.38,10.46,9.11,8.08,6.9,7.04,5.67,2.8,-2.1,-2.58,-0.4,-1.65,-0.98,-0.31,-0.4,-1.25,-2.33,-3.15,-2.89,-2.44,-2.07,-2.36,-2.59,1.41,1.08,1.23,1.03,-0.06,-0.54,-1.27,-0.49,-0.74,-0.23,0.12,-1.04,-1.19,-2.09,-2.26,-1.25,-0.28,-0.89,-2.16,-2.47,-1.02,-1.47,-1.8,-3.16,-4.75,-4.26,-4.78,-5.37,-5.49,-4.25,-4.14,-4.91,-4.7,-4.6,-4.91,-6.87,-7.71,-8.05,-8.6,-8.65,-8.2,-7.15,-6.53,-5.77,-5.87,-2.64,-2.88,-1.28,-2.63,-1.6,0.43,-1.23,2.74,1.12,2.28,5.41,8.09,9.82,6.83,7.1,6.63,5.49,3.75,1.9,-0.4,-1.7,5.71,1.85,1.86,2.53,3.98,1.21,0.25,-0.97,-1.37,-0.57,0.59,-1.74,-2.96,-3.25,-3.17,-3.3,-3.33,-3.35,-4.52,-5.62,-6.03,-6.52,-6.28,-6.3,-7.22,-8.26,-8.46,-8.86,-8.29,-8.36,-7.96,-8.61,-9.57,-9.23,-9.11,-8.75,-9.12,-9.31,-8.86,-9.03,-9.48,-8.89,-8.63,-8.61,-8.98,-9.08,-9.13,-8.92,-8.56,-8.01,-7.83,-6.41,-6.07,-5.63,-6.29,-5.78,-5.53,-5.7,-5.67,-5.16,-4.39,-3.81,-3.48,-3.09,-2.69,-2.11,-1.75,-2.47,-2.09,-2.5,-2.04,-1.87,-1.58,-1.66,-0.4,-1.15,-1.17,1.54,0.6,1.05,2.07,2.14,2.47,2.86,4.38,6.03,6.04,6.68,8.78,9.98,12.36,13.46,15.24,14.99,13.85,11.87,11.25,10.58,8.28,5.71,6.22,1.21,3.47,3.14,2.14,1.24,1.72,1.0,-0.41,0.49,1.84,1.04,-0.33,-0.96,-4.3,-2.52,-2.36,-2.15,-2.2,-3.56,-3.98,-4.12,-3.56,-3.11,-4.32,-6.26,-7.12,-6.91,-6.91,-6.42,-6.31,-6.39,-5.84,-5.44,-5.23,-4.56,-4.12,-3.79,-2.43,-0.97,-0.54,0.11,1.39,2.18,2.5,2.64,2.58,1.97,2.02,2.07,1.68,0.5,1.9,2.76,2.12,2.02,2.68,2.88,2.82,3.01,3.43,2.67,1.89,1.85,1.92,1.92,1.35,1.33,2.17,2.57,2.42,2.68,2.44,2.25,2.36,2.61,2.85,2.84,3.06,3.04,3.34,3.69,3.76,4.42,6.47,8.17,7.0,6.13,5.08,3.67,3.29,2.94,3.12,3.23,3.6,4.38,5.19,5.74,5.27,5.46,7.21,4.06,4.14,3.98,3.44,3.64,4.68,4.1,4.59,4.23,4.88,6.08,6.96,7.0,6.77,7.49,8.22,8.3,8.31,8.41,8.64,8.21,7.9,7.29,7.26,7.39,6.63,6.5,5.87,6.47,7.6,7.89,5.62,3.47,2.03,3.21,1.49,0.75,1.06,0.98,-0.81,-2.51,-2.88,-2.73,-2.6,-2.49,-2.08,-2.17,-1.51,-0.71,-1.28,3.23,-0.35,3.43,0.23,-3.48,-2.09,-1.21,-2.44,-2.56,-1.06,-0.5,0.23,1.58,1.34,2.33,2.59,3.25,4.83,8.48,8.8,8.71,6.5,4.39,1.67,4.75,6.36,7.46,5.26,4.25,0.6,1.23,3.85,1.46,1.99,0.55,-0.47,-0.33,-0.76,-1.68,-2.53,-2.83,-2.37,-1.72,-2.88,-1.91,2.55,0.72,-0.31,-0.1,-0.51,-0.29,0.55,0.57,0.65,0.54,0.89,-0.53,-0.72,0.53,1.47,1.19,0.98,0.21,0.27,-1.25,-1.89,-4.14,-5.03,-3.85,-2.85,-2.95,-4.39,-3.5,-3.01,-2.99,-3.77,-3.29,-3.82,-5.92,-6.6,-6.76,-6.9,-7.1,-7.0,-6.32,-5.73,-5.91,-5.48,-2.24,-1.79,0.09,0.52,1.41,2.45,1.94,2.14,4.78,6.23,12.11,7.21,6.76,6.33,6.05,6.48,7.46,5.72,5.21,2.87,0.57,0.17,3.98,0.54,3.19,4.52,3.19,1.44,-0.78,-0.81,-0.63,1.33,-0.97,-1.61,-2.71,-3.24,-3.28,-3.21,-2.97,-4.4,-5.01,-4.83,-5.19,-5.54,-5.58,-6.23,-7.26,-7.14,-6.28,-6.46,-7.65,-8.07,-7.95,-8.98,-8.53,-8.17,-7.87,-8.12,-8.25,-7.6,-7.88,-8.36,-7.82,-7.32,-7.22,-8.02,-8.11,-8.19,-8.1,-7.66,-7.19,-6.88,-6.4,-5.25,-6.1,-5.86,-6.07,-4.66,-4.07,-3.68,-3.33,-3.07,-2.72,-2.16,-2.04,-1.35,-1.24,-0.64,-1.11,-1.28,-1.04,-0.33,-0.29,-1.12,0.25,0.06,0.07,0.8,1.49,1.8,2.04,2.67,3.13,2.78,4.32,5.78,5.64,7.96,9.76,10.59,11.89,13.08,13.96,13.99,13.97,16.2,13.06,12.32,9.07,8.84,4.44,4.86,5.05,3.39,2.42,1.67,1.63,1.18,1.18,1.77,1.37,1.44,2.08,1.5,-1.94,-1.99,-1.32,-1.26,-1.09,-2.06,-3.03,-3.55,-3.81,-2.99,-2.38,-2.99,-4.05,-6.5,-5.96,-5.47,-4.85,-4.58,-4.42,-4.2,-4.27,-4.73,-4.71,-4.49,-3.78,-2.83,-2.23,-1.67,-0.53,0.46,1.44,3.02,3.82,4.16,4.27,4.2,3.81,4.22,4.44,4.27,4.67,4.73,4.84,5.07,5.43,5.62,5.86,5.82,5.63,5.44,5.11,4.0,4.32,4.57,4.47,3.87,3.98,4.17,3.99,3.72,3.98,4.16,4.67,4.57,4.09,3.72,3.45,3.27,3.62,4.28,5.07,6.05,6.65,8.27,7.43,6.22,5.02,4.47,4.02,4.13,4.53,4.76,4.96,5.84,6.44,6.85,7.85,6.77,8.78,4.76,3.79,2.63,4.02,4.15,3.72,4.73,4.94,5.19,6.66,7.52,8.66,7.68,7.03,7.08,7.27,7.51,7.27,7.23,7.34,7.49,8.17,8.04,7.56,6.89,6.75,6.36,6.12,6.45,6.63,5.24,5.15,2.78,3.8,2.38,1.59,1.65,1.79,0.13,-1.26,-1.48,-1.73,-1.79,-2.12,-1.78,-1.42,-0.54,0.43,-1.19,2.4,0.19,0.54,-1.88,-1.51,-2.54,-0.93,-1.72,-2.17,0.58,1.1,1.13,1.08,1.35,2.14,2.93,4.39,5.41,6.81,8.25,9.03,5.71,4.33,3.51,3.21,4.03,5.95,6.15,5.7,5.58,4.35,4.48,4.36,4.89,4.88,2.51,0.94,1.35,0.72,0.34,-0.1,-0.67,-1.58,-1.32,-1.47,-1.14,1.7,0.57,1.01,0.98,0.4,0.8,1.39,1.66,1.95,2.07,1.7,1.77,2.09,2.73,1.73,1.79,1.72,1.68,-0.19,-1.31,-1.91,-3.82,-2.27,-1.06,0.26,-0.34,-1.39,-1.89,-2.02,-2.07,-2.01,-2.28,-4.7,-5.45,-5.19,-4.96,-5.38,-5.41,-5.2,-5.24,-4.88,-5.81,-6.31,-2.37,0.16,1.4,2.04,1.9,2.57,4.97,7.15,7.35,6.55,6.83,7.73,8.12,8.7,8.99,8.4,9.37,6.96,5.78,4.06,2.55,0.95,2.89,3.9,5.11,3.36,1.49,-0.12,-0.1,-0.66,0.55,1.23,-0.1,-1.27,-2.14,-2.66,-3.02,-2.62,-5.01,-4.46,-3.94,-3.9,-4.52,-4.75,-4.93,-5.72,-5.95,-5.25,-5.22,-6.54,-7.3,-7.47,-7.58,-7.39,-7.18,-6.99,-6.88,-6.52,-6.0,-6.33,-6.52,-6.57,-6.07,-6.27,-6.54,-6.93,-6.48,-6.35,-5.95,-5.68,-4.93,-4.9,-4.77,-4.37,-4.71,-4.24,-4.45,-2.5,-1.86,-1.11,-0.97,-1.15,-0.85,-0.45,-0.45,0.23,0.36,0.07,0.01,0.21,1.42,1.14,-0.08,1.26,0.45,0.38,1.1,1.44,1.78,2.53,2.57,4.93,6.82,7.91,8.58,9.43,9.7,10.73,11.71,12.28,13.03,13.65,13.6,13.69,14.58,14.65,11.01,9.57,6.31,5.0,6.06,4.83,3.74,2.73,2.88,2.25,1.3,1.5,1.62,2.18,2.16,1.99,0.14,1.48,2.23,0.34,-0.17,-0.31,-1.72,-2.83,-3.32,-3.56,-3.01,-3.39,-3.91,-5.07,-5.28,-4.78,-3.86,-3.01,-2.55,-2.56,-2.98,-2.75,-3.09,-4.28,-4.52,-5.25,-5.52,-4.53,-3.44,-2.47,-0.87,0.69,2.41,3.36,3.58,4.3,5.48,6.07,6.09,6.6,6.33,6.65,6.97,6.98,6.94,6.93,7.06,7.34,7.46,7.5,7.47,7.15,6.9,6.75,6.73,6.57,6.48,6.2,4.99,4.24,4.23,4.76,5.11,5.82,4.98,4.51,4.45,4.33,4.33,4.76,4.79,5.25,6.3,7.15,7.7,8.14,6.88,5.9,5.18,4.78,4.7,4.88,5.36,5.84,6.62,7.35,8.37,9.77,8.57,10.77,5.59,3.23,0.1,3.61,3.45,4.28,4.81,4.77,5.76,7.52,7.71,6.71,7.26,7.34,7.25,7.79,8.56,9.19,9.21,9.0,8.34,8.16,8.14,7.76,7.48,5.96,5.96,4.17,-0.27,-3.2,-2.59,-8.82,-4.19,2.19,3.86,2.41,2.39,1.93,1.59,1.03,0.46,0.47,0.15,-0.95,-1.17,-0.6,0.1,-0.76,-1.0,2.19,-3.55,-2.5,-5.12,-4.79,-2.63,-2.44,-2.06,-1.07,-0.12,-0.1,0.26,-0.56,1.81,2.69,3.1,3.46,3.48,6.28,6.07,4.83,5.52,3.75,4.1,5.38,5.8,5.44,6.17,6.97,7.01,6.79,6.29,6.49,6.41,6.6,4.88,3.87,3.79,3.29,2.31,1.63,1.06,-0.71,-2.45,-2.06,-3.44,-2.58,-1.56,-0.56,2.5,2.11,2.35,2.48,2.75,3.18,3.57,3.16,3.1,3.65,3.86,3.09,3.27,3.07,2.6,2.11,0.49,-0.48,-1.64,-1.64,0.55,3.51,2.23,0.28,0.85,0.34,-0.5,-0.57,-0.18,-3.16,-4.15,-1.65,-2.39,-3.45,-3.97,-3.71,-4.05,-3.15,-4.14,-4.32,-4.06,-1.86,-0.36,1.05,2.03,3.84,5.99,5.37,5.15,6.57,7.03,7.71,8.5,9.54,10.3,9.78,9.23,9.73,6.69,5.04,4.98,3.79,1.65,-1.43,8.36,4.92,3.14,1.61,0.1,0.35,0.7,1.55,0.84,-0.66,-0.77,-1.37,-1.81,-2.72,-3.34,-3.4,-3.29,-2.95,-3.14,-3.83,-3.64,-4.31,-3.93,-3.77,-4.05,-4.83,-5.34,-5.82,-6.02,-5.96,-5.94,-5.79,-5.6,-5.02,-4.68,-4.66,-5.0,-5.33,-4.96,-4.77,-4.87,-4.57,-4.45,-3.9,-3.16,-3.04,-2.73,-2.51,-2.01,-2.36,-1.91,-1.46,-0.87,-1.87,0.17,0.98,1.48,1.28,1.11,0.86,0.77,1.25,1.39,1.38,0.88,1.42,2.01,1.77,1.5,2.16,2.0,2.27,2.73,3.47,3.81,4.55,6.9,6.88,8.12,8.21,8.94,9.34,10.09,11.09,12.53,13.47,13.97,13.4,13.45,12.03,11.27,14.43,11.48,10.68,2.38,3.1,3.73,3.84,3.2,1.8,2.22,1.5,1.35,1.48,1.4,0.89,2.25,3.07,-0.62,2.75,0.73,1.15,0.2,0.25,-0.84,-1.71,-2.73,-3.34,-3.03,-3.98,-4.45,-3.85,-3.55,-3.2,-3.56,-2.73,-1.91,-1.53,-1.54,-1.92,-1.68,-4.73,-5.66,-7.21,-7.83,-7.18,-6.31,-5.54,-4.46,-3.06,-1.37,0.41,1.64,2.63,4.48,5.9,8.19,8.57,8.32,8.27,8.25,8.13,8.0,7.97,8.09,8.24,8.47,8.8,8.82,8.5,8.07,8.0,7.52,7.24,7.34,7.67,7.18,6.23,6.03,5.97,5.8,5.21,4.19,4.16,4.48,5.11,5.44,5.42,5.14,5.58,6.14,6.79,7.32,8.17,7.76,5.7,5.15,4.91,4.68,5.14,5.7,6.26,7.23,8.59,10.48,11.45,10.23,5.94,3.73,-1.46,0.4,1.6,3.47,3.89,4.25,5.34,7.03,6.08,6.79,7.33,7.92,8.66,9.31,9.79,10.16,9.96,9.98,10.05,8.55,8.79,8.26,6.97,8.03,5.21,5.21,3.05,2.97,-0.26,-1.49,-2.8,-8.34,-5.69,0.94,4.09,3.62,1.45,1.73,2.19,1.96,2.1,1.92,0.38,-0.38,0.09,1.42,-1.29,-0.99,2.85,-3.71,-1.19,-3.38,-3.56,-2.79,-2.53,-2.01,-1.79,-0.92,-0.49,0.0,0.93,2.64,3.55,2.26,2.09,5.2,5.55,3.47,1.64,2.32,4.15,4.53,5.21,6.12,6.83,7.0,7.23,7.15,7.31,7.36,7.7,7.5,6.96,7.07,6.42,6.06,5.33,4.02,3.24,1.6,0.11,-1.57,-3.02,-3.48,-2.82,-2.99,-3.23,-2.44,1.51,5.26,3.91,4.0,4.15,4.49,4.82,4.37,4.11,3.96,2.99,3.6,3.74,4.37,4.57,3.15,2.71,2.85,2.0,2.97,5.5,3.96,2.73,2.68,2.53,1.91,1.72,1.88,0.35,-1.73,0.12,-0.8,-1.68,-2.35,-2.13,-2.59,-1.78,-2.02,-2.54,-2.31,-0.41,0.74,1.57,2.13,4.17,4.97,3.54,5.17,6.59,6.65,8.07,8.85,8.89,9.11,9.77,10.11,10.21,9.26,6.74,5.16,5.9,5.78,4.56,2.03,4.62,8.04,4.08,3.12,2.39,2.45,2.39,2.26,-0.4,-0.45,0.02,-0.66,-1.24,-1.79,-2.08,-2.14,-2.25,-1.89,-2.4,-2.61,-2.63,-2.49,-2.57,-2.55,-2.68,-2.94,-3.47,-3.86,-3.89,-3.69,-3.48,-3.42,-2.93,-2.76,-3.07,-3.26,-3.35,-3.4,-2.95,-2.65,-1.84,-1.44,-0.78,-0.23,-0.08,-0.54,0.06,0.63,1.2,1.29,1.05,1.67,1.88,1.7,2.45,3.52,3.63,3.09,2.77,2.22,2.37,2.83,2.4,2.06,2.83,3.06,2.96,2.65,3.3,2.91,3.42,3.94,4.95,5.44,6.27,7.37,7.64,7.8,8.14,8.57,9.58,10.19,11.54,12.85,13.81,14.04,13.92,13.16,11.95,11.18,11.44,13.07,8.89,7.09,2.54,2.96,1.91,2.68,2.37,2.37,1.13,1.48,0.76,1.32,0.17,2.11,-0.61,0.19,3.49,2.04,1.6,0.66,0.74,-0.05,-0.66,-2.42,-3.06,-2.6,-3.28,-3.82,-3.85,-4.17,-4.88,-3.36,-3.13,-2.62,-1.76,-1.73,-1.57,-2.35,-1.77,-4.44,-6.36,-8.93,-8.01,-7.3,-6.64,-5.72,-4.95,-4.21,-2.85,-1.03,1.12,3.12,5.1,6.25,7.86,10.14,10.6,10.13,9.84,9.57,9.41,9.27,9.55,9.81,10.03,9.76,9.23,8.72,8.35,8.05,7.84,8.25,8.73,8.51,8.02,7.99,7.44,6.67,5.68,4.84,4.73,5.62,5.89,5.63,5.55,5.61,5.84,6.23,6.5,6.66,7.1,7.35,5.88,3.99,5.19,4.38,4.94,5.24,6.08,7.3,8.69,11.22,11.55,9.2,3.9,-0.94,-2.27,-1.23,2.01,2.19,2.1,5.19,6.01,5.34,6.17,7.42,8.62,9.99,10.86,11.14,10.77,10.32,10.78,11.06,9.16,8.23,8.13,7.9,7.42,6.33,4.05,3.96,2.13,1.74,0.25,-0.96,-1.66,-5.49,-6.26,-5.98,-9.51,-1.85,-3.75,-1.6,0.64,0.03,-0.14,0.99,-0.06,-0.12,1.13,0.79,1.99,-3.32,1.07,2.15,-3.53,-2.65,-2.98,-2.49,-2.27,-2.12,-1.37,-0.04,0.94,1.38,1.98,2.84,2.46,1.66,2.9,5.56,4.0,1.94,1.15,0.89,1.45,2.23,3.8,5.58,7.0,7.75,7.9,8.01,7.39,8.6,8.58,8.54,8.38,8.28,8.45,7.69,5.91,4.02,3.62,2.66,1.01,0.69,1.0,0.47,-0.41,-0.04,0.92,1.37,1.02,-1.24,2.11,5.7,4.49,5.03,4.98,5.33,5.25,4.74,4.24,3.76,4.46,5.28,5.54,5.4,5.14,4.66,4.3,4.63,7.06,5.51,5.78,4.79,4.06,3.76,3.62,3.82,3.64,2.72,1.67,1.01,-0.3,-1.13,-0.17,-0.19,0.05,-0.51,-1.56,-2.34,0.94,1.0,1.5,3.83,3.57,3.48,3.59,4.76,4.69,6.55,7.14,7.77,8.16,9.23,10.04,10.85,11.02,10.4,10.02,8.31,6.79,7.75,8.13,7.46,6.1,2.77,8.64,5.01,4.8,4.04,4.32,3.76,1.8,-0.01,0.75,0.81,0.22,-0.23,-0.59,-0.93,-1.17,-1.3,-1.18,-1.18,-1.19,-1.14,-1.27,-1.12,-1.29,-1.43,-1.31,-1.1,-0.88,-0.87,-0.54,-0.36,-0.32,-0.24,-0.18,-0.31,-0.39,-0.06,0.59,1.2,1.63,2.08,2.56,2.84,2.96,2.82,2.68,2.79,3.19,3.99,3.93,3.83,3.91,4.35,4.47,4.75,5.37,5.39,5.3,4.66,4.24,4.41,3.97,3.78,3.82,4.08,3.91,4.18,4.31,4.01,4.23,5.22,5.75,6.04,6.57,7.37,7.17,7.22,7.89,8.64,9.95,9.45,11.28,12.34,12.74,13.15,13.25,12.38,11.45,9.69,10.15,9.46,8.78,5.79,-0.13,-1.17,0.97,0.3,2.0,2.13,0.57,-0.41,-0.16,1.15,1.52,1.28,-1.7,0.95,3.45,2.63,2.25,2.21,1.31,0.07,-0.02,-1.9,-2.22,-2.72,-3.71,-3.6,-4.47,-4.43,-3.87,-3.06,-3.37,-2.93,-1.38,-0.96,-0.03,-1.27,-0.8,-2.42,-1.79,0.38,-8.64,-5.42,-4.67,-4.08,-3.58,-3.09,-2.53,-1.51,-0.18,1.72,3.69,5.46,7.03,7.91,8.82,11.32,12.92,11.75,11.28,10.87,10.51,10.4,10.38,9.93,9.5,9.01,8.6,8.46,8.01,8.79,9.33,9.49,9.44,9.44,8.97,8.01,6.91,6.31,6.56,6.75,6.41,6.02,5.6,5.62,5.94,6.26,6.62,6.51,6.27,6.3,5.98,4.36,5.38,4.66,4.47,4.09,5.23,6.04,6.94,7.71,-0.46,-4.56,-5.05,-4.44,-4.22,-0.53,-1.31,0.12,4.16,4.82,4.52,5.59,7.32,8.71,9.89,10.77,11.33,11.57,11.02,10.79,10.29,9.76,8.46,5.95,6.16,7.25,6.9,5.8,4.66,3.43,0.76,0.66,-0.74,-2.99,-5.01,-6.35,-7.02,-7.39,-7.0,-6.77,-4.24,-3.05,-1.35,-0.34,-0.04,-0.52,-0.43,0.12,1.65,-0.98,-1.29,0.26,1.22,-1.02,-3.49,-2.63,-2.7,-2.33,-1.51,-1.12,-0.28,1.19,1.97,2.15,2.53,2.43,1.45,1.59,3.89,4.53,3.92,1.39,1.02,-0.24,1.31,2.64,4.06,5.32,6.14,6.58,7.72,8.89,9.52,9.62,9.77,9.52,8.84,9.08,9.34,8.32,7.09,4.85,3.24,4.13,3.27,2.19,2.07,2.48,2.85,2.73,2.32,2.36,2.84,2.88,2.84,1.21,4.55,6.86,5.98,6.14,6.42,6.74,6.91,6.54,5.89,5.62,6.41,6.21,5.94,5.93,6.42,7.3,8.36,8.05,7.87,5.89,5.84,5.31,5.11,5.02,5.12,5.04,4.12,2.4,1.86,1.11,1.4,3.31,1.98,0.43,-1.79,-0.38,1.3,1.82,3.17,3.77,3.4,2.87,3.27,2.52,3.16,4.97,6.56,8.63,10.48,11.2,11.49,11.42,11.71,12.33,12.04,10.3,8.44,7.76,8.19,9.36,8.76,5.98,3.29,7.59,4.96,3.97,4.11,4.88,3.71,1.19,0.72,1.51,1.95,1.11,0.77,0.67,-0.13,-0.4,-0.41,-0.47,-0.02,0.32,0.46,0.54,0.63,1.01,1.25,1.35,1.82,1.92,1.87,2.13,2.47,2.69,2.6,2.86,3.22,3.76,4.01,4.03,4.25,4.67,5.0,5.36,5.48,5.29,4.96,5.05,5.34,5.45,5.45,6.32,6.55,6.55,6.56,6.92,6.93,6.97,7.17,7.35,6.88,6.39,5.96,5.8,5.75,5.63,5.5,5.72,5.63,5.52,5.49,6.5,6.3,6.49,7.11,7.13,6.37,7.15,7.74,8.92,8.11,9.44,10.06,11.17,10.9,11.66,11.14,10.66,9.69,8.5,7.4,7.66,6.11,5.64,2.74,-0.66,1.11,0.2,1.04,1.2,0.73,-0.05,1.1,1.06,-1.93,-4.69,-3.12,-2.18,-1.1,0.16,1.46,3.43,2.19,1.71,0.72,-0.19,-1.19,-2.12,-2.96,-3.19,-3.13,-2.57,-2.37,-2.35,-2.31,-2.28,-3.46,-3.51,-4.43,-3.85,-1.25,-0.93,-2.04,-2.05,-1.18,-2.91,-2.74,-2.32,-2.01,-1.65,-0.98,0.2,1.55,3.15,4.9,6.55,7.94,8.83,9.6,10.42,11.68,13.11,13.4,12.12,11.61,10.62,9.71,9.29,9.37,9.15,8.98,8.72,8.34,8.8,9.34,9.46,10.15,10.31,10.15,9.37,8.56,8.28,8.0,7.66,7.22,6.51,6.08,6.0,6.25,6.53,6.77,6.45,6.08,6.01,6.13,5.98,5.04,4.99,3.81,3.35,3.48,3.33,3.35,1.16,-6.08,-6.4,-5.24,-4.77,-3.0,-2.95,-0.59,2.33,3.55,3.71,4.77,6.65,7.97,8.82,9.91,11.05,11.87,12.13,10.91,9.71,7.41,7.56,7.08,5.46,4.64,5.64,4.99,5.28,4.73,2.94,0.66,0.3,0.31,-3.88,-3.8,-4.03,-4.45,-5.39,-4.23,-2.36,-1.22,-1.39,-0.19,-0.59,-1.28,-0.77,-0.21,0.37,1.0,-0.22,-3.26,-1.46,-0.54,-1.79,-3.73,-3.36,-2.17,-1.39,-1.03,-0.06,0.7,2.69,2.47,2.6,0.51,1.78,1.61,3.49,4.61,4.38,4.67,2.3,2.23,2.83,3.88,4.72,5.46,6.11,5.82,5.78,6.72,8.08,10.05,10.58,10.3,11.29,10.96,9.65,9.59,8.52,5.21,4.07,3.45,3.47,3.11,2.58,2.94,3.55,3.64,3.93,4.48,4.22,3.74,3.96,4.01,4.02,4.04,3.43,5.87,7.1,6.88,7.76,7.85,8.24,8.01,7.39,8.0,7.57,7.12,7.83,8.72,8.51,10.37,10.37,9.27,7.3,7.69,7.32,6.28,6.0,6.29,6.7,5.18,3.68,3.41,3.16,3.61,5.39,2.53,0.94,-0.59,0.9,2.07,2.73,4.51,3.33,4.71,3.62,3.56,0.98,3.85,5.68,7.39,9.66,10.65,11.28,11.87,11.52,11.91,13.06,12.88,11.27,8.07,6.45,4.13,5.82,8.0,8.42,6.58,3.65,6.45,3.78,3.68,5.06,5.34,3.35,1.75,2.6,2.45,1.98,1.62,1.57,1.65,1.15,0.94,1.11,1.33,1.87,2.24,2.5,2.64,2.89,3.25,3.44,3.52,3.48,3.48,4.01,4.47,4.78,4.88,5.01,4.99,5.13,5.19,5.48,5.81,6.15,6.48,7.01,7.22,6.91,6.72,6.88,7.31,7.26,7.22,7.66,8.66,8.91,8.93,8.8,8.62,7.64,7.45,8.48,8.87,8.86,8.23,7.96,7.72,7.58,7.29,7.3,7.16,6.67,7.09,7.22,7.05,6.65,7.16,7.28,6.65,7.35,8.13,7.4,7.85,9.34,8.83,8.59,9.52,8.9,8.8,8.92,8.83,7.67,8.03,7.25,7.31,3.55,5.45,3.7,2.45,2.56,2.08,1.45,0.25,-1.41,2.53,-3.69,-2.22,-1.99,-1.54,-1.48,-0.75,0.24,0.23,4.14,3.18,3.26,0.36,-0.22,-0.78,-1.38,-1.36,-0.92,-0.68,0.05,-0.65,-1.82,-1.88,-2.37,-4.61,-5.84,-6.8,-3.99,1.34,-0.7,-2.17,-1.21,-1.46,-1.27,-1.1,-1.08,-0.86,-0.14,0.86,2.04,3.6,5.39,6.88,8.42,9.64,10.54,11.0,11.32,11.24,11.81,12.35,13.6,12.69,11.18,10.52,9.95,9.71,9.86,9.66,8.9,7.93,8.66,9.26,9.9,10.51,11.0,11.23,10.93,10.14,9.52,8.85,8.6,8.12,7.39,7.1,7.0,6.75,6.65,6.22,5.8,5.85,5.65,5.56,5.57,5.12,4.95,3.37,2.85,2.3,1.47,1.51,1.0,-6.8,-3.78,-5.01,-3.82,-3.39,-0.49,1.5,1.65,1.88,3.76,5.49,6.37,7.24,7.89,7.21,6.89,7.31,7.06,6.51,5.92,6.78,6.26,4.0,3.12,3.91,4.36,4.01,4.26,5.11,0.98,0.54,-1.63,-2.21,-2.92,-4.32,-4.68,-4.02,-3.58,-2.5,-1.42,-0.36,-0.88,-1.87,-1.9,-1.13,-0.58,-0.35,-0.52,-1.57,-1.66,-3.74,-1.98,-1.13,-3.41,-2.4,-1.66,-0.61,0.48,-0.32,-0.05,2.79,3.43,2.6,2.72,1.95,2.17,2.78,5.1,4.92,6.75,6.54,3.95,2.57,3.89,5.13,6.57,7.49,6.59,5.41,5.95,7.04,8.26,9.48,9.79,10.67,10.09,11.16,10.99,9.39,8.41,7.0,5.87,5.41,4.4,3.1,2.96,3.31,3.71,4.24,4.6,4.93,5.5,5.54,5.2,4.91,5.25,5.12,5.18,5.42,5.5,6.73,8.52,8.54,9.17,9.45,9.19,9.27,9.27,9.52,9.77,9.84,10.32,11.09,10.8,9.85,8.21,8.29,8.57,8.01,7.24,7.17,7.92,6.04,5.42,4.71,4.22,4.81,6.57,2.85,1.76,1.21,2.2,2.46,3.9,3.48,4.63,5.37,4.04,2.38,3.0,4.24,6.5,7.59,8.07,8.96,9.83,11.16,10.52,11.41,11.46,13.17,10.61,7.39,2.45,-3.16,-3.61,-2.51,3.1,-1.43,-3.67,0.83,3.57,4.51,4.21,5.98,6.4,6.77,6.01,4.09,3.12,2.36,2.52,2.39,2.61,2.9,2.93,3.26,3.73,4.05,4.3,4.63,4.92,5.07,4.79,4.56,4.55,4.69,5.11,5.48,5.73,6.1,6.3,6.29,6.28,6.47,6.71,6.87,6.97,7.3,7.78,8.1,8.03,7.78,8.2,8.61,8.72,8.79,9.09,9.76,10.62,11.06,10.92,10.16,9.06,8.56,8.9,9.97,10.08,10.32,10.33,10.14,9.66,9.54,9.26,8.62,8.73,8.39,7.87,7.72,7.3,7.22,7.65,7.44,7.73,7.77,7.56,8.03,7.81,7.59,7.3,7.69,8.69,8.35,7.44,7.68,8.04,8.16,7.77,8.02,7.18,2.68,4.59,4.55,3.6,3.17,2.29,1.97,1.45,1.34,-1.19,-0.15,0.26,0.5,0.62,1.02,1.35,2.64,2.83,4.05,4.56,4.16,-0.04,0.08,0.09,-0.04,0.41,1.09,1.0,-0.39,-1.6,-1.52,-0.83,-4.05,-5.73,-8.17,-6.89,-6.32,-6.02,-2.6,-0.33,-0.51,-0.54,-0.58,-0.24,0.37,1.24,2.37,3.8,5.5,7.17,8.48,9.81,11.31,12.05,12.05,12.12,12.2,11.92,10.89,11.32,13.04,14.15,13.05,11.84,10.88,10.34,9.99,9.01,8.17,8.32,9.74,10.11,10.56,10.99,11.13,11.02,10.57,10.12,9.7,9.51,9.34,8.74,8.36,8.16,7.58,6.92,6.3,5.78,5.64,5.55,4.42,5.91,5.65,5.14,3.72,3.42,2.85,1.72,1.04,0.53,-2.15,-3.12,-5.43,-3.94,-1.45,1.27,0.45,1.3,3.19,3.79,4.38,4.52,4.58,2.33,0.6,-0.28,-0.71,-0.43,1.33,2.18,1.79,2.83,3.96,4.49,4.64,3.77,3.5,3.67,0.71,-1.67,-2.47,-3.22,-3.36,-3.81,-4.1,-4.64,-3.29,-2.79,-2.48,-2.27,-2.31,-1.6,-1.23,-1.23,-0.74,-0.12,-0.01,-0.8,-2.34,-0.31,-2.55,-0.63,-5.06,-1.83,0.88,1.05,2.16,1.78,1.78,1.49,4.89,3.5,3.01,2.71,1.95,2.57,4.83,5.14,6.06,6.2,4.04,1.89,3.21,4.88,6.75,7.28,8.21,7.4,8.29,8.46,8.53,8.52,8.59,9.73,10.22,10.43,9.45,8.93,9.63,9.47,9.18,6.97,5.84,5.16,3.48,3.86,4.77,5.05,5.16,5.42,5.88,6.09,5.9,6.47,6.62,6.1,6.59,6.8,6.66,6.81,7.11,7.49,8.34,9.79,10.25,10.27,10.49,10.46,10.41,10.67,10.95,11.16,11.76,11.73,11.01,10.22,9.59,8.63,8.18,8.23,8.15,8.65,7.07,6.44,5.92,5.54,6.06,6.81,2.7,2.69,2.67,3.01,4.22,4.05,3.85,5.93,4.39,4.34,3.17,3.29,6.21,6.27,6.73,7.75,6.79,6.11,5.92,6.73,9.0,7.71,11.18,8.78,3.95,-1.66,-3.52,-4.93,-7.45,-8.95,-7.45,-6.34,-6.92,-4.76,6.15,4.97,5.33,5.85,5.45,5.99,5.81,5.37,4.72,3.8,3.99,4.29,4.47,4.8,5.06,5.44,5.5,6.0,6.08,6.73,6.68,6.03,6.28,6.47,6.26,6.29,6.44,6.65,7.16,7.32,7.52,7.86,7.69,7.79,7.5,7.07,7.04,7.02,7.32,7.31,7.2,8.31,7.61,7.84,8.01,8.68,9.16,10.04,10.59,10.98,10.87,10.64,10.64,11.23,12.03,11.49,10.86,11.47,12.03,12.16,11.98,11.38,10.96,10.16,9.98,9.1,8.31,8.26,7.86,7.86,7.87,7.75,7.48,7.39,7.18,7.49,7.16,6.66,6.82,6.02,6.38,6.16,6.79,8.45,8.52,8.85,8.62,8.83,7.19,2.67,5.02,6.05,3.7,3.79,3.56,1.68,4.42,2.98,2.46,2.66,3.55,3.93,3.07,0.52,2.06,3.95,4.78,2.89,3.85,1.38,0.65,1.08,0.79,0.96,0.83,0.67,-0.53,-0.69,-0.26,1.42,-1.34,-2.3,-0.7,-0.83,-2.72,-1.6,-0.63,0.13,-0.23,-0.34,0.14,0.81,1.17,2.1,3.43,4.78,5.9,7.16,8.1,9.21,9.65,10.6,11.04,11.42,12.59,12.47,12.32,11.15,10.69,11.67,14.29,14.11,12.02,11.08,10.79,10.82,9.75,9.05,10.16,10.89,11.13,11.15,10.81,9.94,9.74,10.27,11.17,10.35,10.34,10.17,9.75,9.12,8.5,7.86,7.37,6.68,5.86,5.57,5.98,6.19,5.52,4.92,4.35,4.24,4.0,3.44,2.63,1.74,0.44,-4.65,-5.14,-2.76,-0.17,0.66,0.7,1.54,1.37,2.18,1.57,1.52,0.23,-1.04,-1.87,-2.46,-2.36,-2.21,-1.06,1.3,3.44,5.03,5.69,5.4,4.41,3.43,3.08,-0.91,-4.02,-5.19,-4.18,-4.36,-3.19,-3.7,-5.15,-4.56,-3.43,-3.09,-3.09,-2.88,-1.69,-0.94,-0.8,-0.47,0.07,-0.05,0.13,-1.21,-4.09,-0.73,-2.16,-0.95,0.75,0.85,1.41,3.46,4.74,6.72,3.2,3.59,5.24,3.99,3.58,2.87,2.22,4.09,6.36,4.26,4.47,4.46,2.37,0.47,2.4,3.93,4.31,5.75,6.47,6.34,8.18,10.07,10.14,9.55,8.33,8.7,10.08,11.0,9.6,8.17,9.47,8.51,6.9,7.06,7.84,6.6,4.25,3.49,3.87,4.83,5.45,5.8,5.77,5.72,6.05,6.66,7.04,7.49,7.97,8.43,8.41,8.07,7.83,8.19,8.78,9.06,9.11,10.03,11.47,12.15,11.81,11.44,11.7,11.85,12.57,12.83,12.69,11.87,10.97,9.48,8.96,8.42,9.1,8.61,7.06,6.74,6.91,7.1,7.24,6.95,4.93,4.43,4.66,4.52,5.45,5.01,5.24,5.78,4.33,4.48,4.03,5.34,6.31,6.36,6.55,6.71,5.76,4.9,4.78,4.61,4.79,2.88,3.41,5.32,-2.55,-6.74,-5.43,-5.48,-6.31,-7.12,-6.43,-5.74,-6.11,-4.6,-4.55,-6.88,1.57,4.17,4.72,5.94,6.83,6.44,5.67,5.32,5.64,6.04,6.23,6.09,6.42,6.28,6.11,7.16,6.81,6.18,6.63,6.4,6.67,6.94,6.82,6.98,7.33,7.84,8.66,9.03,9.22,9.03,8.81,8.48,7.58,7.06,7.0,6.57,7.17,7.68,8.13,7.24,6.13,7.04,8.6,9.05,8.92,9.03,9.33,9.54,9.8,10.52,11.13,11.83,12.6,13.09,13.09,13.34,12.84,12.57,13.34,13.12,12.46,11.64,11.18,10.28,9.51,8.61,8.53,8.32,7.97,7.89,7.91,7.65,7.05,7.25,7.52,7.23,7.14,6.41,6.21,7.09,8.03,8.75,10.33,9.85,9.69,9.76,9.04,5.62,4.01,5.6,7.68,4.27,3.73,4.14,4.65,4.26,4.09,2.89,3.27,2.01,2.01,1.6,2.51,3.33,1.7,0.26,0.9,2.77,0.81,1.2,0.24,-0.05,-0.32,-0.13,-0.36,0.32,0.28,0.13,-1.67,-1.49,0.09,1.11,-0.72,-1.77,-0.86,-0.67,-0.32,0.32,0.89,1.03,1.56,2.45,3.93,5.02,6.09,6.96,8.14,8.92,9.82,10.69,11.82,12.08,11.5,11.8,11.9,12.22,11.79,10.83,10.33,10.68,12.25,13.59,13.01,12.29,11.49,10.58,10.23,10.23,10.75,11.23,11.22,10.92,9.56,11.22,11.64,10.34,9.82,10.43,10.33,9.58,9.05,8.72,8.21,7.5,6.78,6.34,6.83,8.04,7.23,4.32,5.04,4.45,4.8,4.83,4.41,3.27,2.54,-4.42,-3.62,-0.81,-0.24,-0.66,0.33,0.56,0.38,-0.34,-0.32,-1.39,-1.79,-1.65,-1.46,-1.48,-1.72,-0.56,2.05,4.51,5.41,6.14,4.65,2.85,1.63,0.83,-4.84,-5.62,-6.95,-6.71,-6.59,-6.14,-5.72,-5.72,-5.84,-4.18,-3.58,-3.36,-2.81,-1.03,-0.25,-0.14,0.16,0.46,1.23,0.8,0.44,-0.97,-2.26,-0.92,-0.49,1.35,0.03,2.4,5.59,4.51,4.69,4.74,5.39,5.44,5.13,4.89,4.34,3.12,3.04,5.29,4.99,4.56,4.13,4.43,1.5,1.32,2.96,2.99,3.25,3.9,4.17,4.95,5.98,8.72,11.09,10.37,9.68,7.84,6.79,9.13,11.25,9.65,9.39,7.82,8.38,8.76,7.06,5.29,3.44,4.4,4.98,5.32,6.32,7.1,7.11,6.93,6.48,6.47,7.32,7.88,8.28,9.04,9.34,8.85,9.08,9.29,9.28,9.74,9.59,9.33,9.71,10.53,11.39,11.75,12.42,12.63,12.29,12.04,11.4,11.44,11.68,11.28,9.28,8.62,8.89,7.95,7.38,6.23,7.69,8.19,8.13,7.59,5.98,5.74,5.02,5.95,6.09,5.93,6.24,5.4,5.97,4.91,5.32,6.19,7.75,6.61,5.96,6.74,6.61,6.69,6.74,5.45,3.98,6.04,3.65,1.29,-5.0,-5.24,-3.21,-3.16,-2.65,-1.42,-1.55,-2.22,-2.99,-2.41,-0.31,-1.84,-1.33,-4.21,2.61,6.69,6.8,6.76,7.45,7.86,7.47,7.35,7.43,7.1,7.35,7.06,6.31,7.5,7.85,7.34,6.08,6.14,7.18,7.81,7.52,7.23,7.03,7.89,8.98,9.26,9.6,9.55,9.42,9.31,8.1,7.46,7.29,7.67,8.06,8.29,8.23,7.26,6.67,6.55,7.03,8.1,7.87,7.67,7.35,7.28,8.01,8.94,9.61,9.74,10.38,11.35,12.81,14.11,14.33,13.44,12.41,13.61,13.61,13.24,12.43,11.35,10.25,9.73,9.1,9.28,9.0,8.41,8.35,8.36,7.75,7.7,7.69,7.89,7.52,7.19,8.12,9.0,9.65,10.66,11.46,12.97,11.06,10.79,10.48,7.78,6.02,5.87,6.49,8.29,5.25,5.61,3.9,2.05,1.0,1.36,2.06,1.58,2.23,3.44,2.79,2.63,1.75,1.29,0.36,1.17,2.44,1.87,0.15,-0.24,-0.15,0.53,1.15,1.72,-2.33,-4.24,-4.63,-0.73,0.46,-4.74,-4.71,-3.09,-2.28,-1.54,0.12,0.65,1.0,1.24,1.87,3.06,4.31,5.63,6.42,7.34,8.12,8.8,9.78,10.58,10.87,11.16,12.25,12.23,12.09,12.32,12.21,12.15,11.49,10.96,10.34,9.98,10.43,12.1,13.08,12.08,11.93,11.26,10.72,11.89,11.8,11.22,10.94,11.57,11.88,10.95,10.78,10.75,9.76,9.66,9.58,8.87,8.25,7.75,7.24,7.35,7.74,8.06,7.51,2.81,3.28,4.83,5.3,5.13,5.59,4.52,3.56,-2.45,-2.62,0.18,-1.85,-0.95,0.08,-0.32,-1.29,-0.53,-1.99,-1.97,-1.83,-0.91,0.27,1.75,2.11,1.6,-0.29,1.16,3.67,1.42,-1.23,-2.73,-5.38,-9.1,-9.31,-8.13,-7.86,-7.24,-6.0,-5.68,-6.68,-6.97,-5.62,-4.43,-3.38,-2.21,-0.12,-0.48,-0.13,0.62,1.41,1.88,2.02,1.93,1.1,0.53,-0.7,-4.35,-0.44,0.28,-0.85,2.17,3.27,0.1,0.32,1.26,3.44,5.16,5.5,5.19,4.54,2.55,4.38,4.19,5.47,4.32,5.28,4.37,2.75,2.31,3.16,2.35,3.46,3.62,3.42,3.8,4.28,5.36,5.94,6.14,8.0,8.1,7.42,7.54,9.04,10.1,8.25,8.34,8.5,8.46,6.92,4.51,3.39,5.33,5.66,4.85,6.22,8.67,8.13,7.99,8.42,8.4,8.09,7.97,8.21,8.92,9.54,9.58,9.63,9.58,9.97,10.58,10.3,10.42,9.94,9.62,10.16,10.86,11.52,11.88,10.94,10.88,10.89,11.45,11.95,11.47,9.76,10.08,7.98,6.27,6.28,6.44,7.12,8.21,8.81,8.07,6.59,6.59,6.66,5.57,5.98,7.1,6.8,6.93,5.67,5.59,6.14,7.69,7.1,6.67,6.85,7.27,7.7,6.97,7.56,7.48,5.85,5.16,7.52,3.49,3.28,1.52,1.7,2.12,1.34,0.38,0.18,0.61,1.49,2.45,2.34,3.26,1.12,1.54,2.9,0.0,3.97,7.57,7.83,8.05,7.07,7.43,8.3,8.54,8.35,8.47,7.07,7.35,7.22,7.83,8.17,9.25,9.84,10.28,9.27,8.95,8.76,8.99,9.95,9.24,8.9,9.71,10.0,9.18,7.86,8.18,9.07,9.25,9.17,8.64,7.61,6.87,6.11,6.37,6.46,7.31,6.52,7.17,7.78,8.26,8.08,8.37,7.63,8.22,8.8,9.46,10.23,10.75,12.34,13.94,14.53,14.39,14.0,13.46,13.23,12.36,11.66,10.87,10.25,9.84,9.9,9.38,8.95,9.09,8.34,8.07,8.04,7.49,7.12,8.1,8.53,9.49,10.98,12.66,13.48,13.5,14.65,12.33,11.64,10.37,8.84,7.91,6.73,7.32,8.3,7.18,7.14,5.0,0.39,1.8,2.96,2.76,3.29,3.61,3.19,3.39,3.1,2.92,1.5,1.04,2.21,2.91,1.31,1.28,1.33,2.0,2.18,0.55,-4.2,-0.51,2.17,-1.59,-6.49,-5.41,-4.56,-3.24,-1.73,-0.55,0.57,1.19,1.28,1.63,2.59,3.74,4.96,6.15,6.56,7.71,7.6,8.1,8.61,8.61,8.78,9.16,9.58,10.71,11.72,11.99,11.92,11.44,11.31,11.34,11.36,11.46,11.08,10.24,10.72,12.82,14.07,12.41,11.46,11.37,11.88,12.15,11.77,11.23,11.16,10.85,11.79,12.85,10.6,9.82,10.03,9.61,8.91,8.22,7.92,8.18,8.68,8.77,7.75,2.06,1.68,4.32,5.68,5.79,6.55,5.64,4.66,-0.45,-2.43,0.15,-2.3,-1.24,-0.88,-1.4,-1.04,-2.38,-2.31,-0.67,-0.72,0.02,-0.05,-0.77,-3.28,-3.39,-3.74,-5.94,-12.75,-11.73,-11.07,-11.82,-11.54,-9.42,-7.96,-8.58,-8.74,-7.79,-8.14,-8.59,-8.27,-7.0,-5.08,-4.14,-3.17,-2.5,-2.68,-1.5,-0.49,1.52,2.45,2.54,2.63,2.09,0.56,-0.18,-0.9,-2.15,-0.22,0.81,0.39,0.23,1.13,0.99,1.92,4.09,4.85,5.04,5.51,5.18,3.85,3.75,4.85,4.81,5.39,4.91,6.03,5.8,3.53,3.29,2.45,2.29,3.3,3.48,3.52,4.14,4.55,4.57,5.61,7.26,8.48,8.5,8.54,8.2,9.43,9.27,7.48,6.71,7.18,7.37,6.02,4.24,4.82,6.11,5.52,5.69,7.09,8.94,9.85,9.81,10.14,10.26,9.94,9.15,8.41,8.93,9.61,9.47,9.52,10.25,10.8,11.03,11.64,11.39,10.83,9.7,9.6,10.15,10.52,10.82,11.52,11.41,11.11,11.51,12.38,12.87,11.38,9.81,6.28,5.44,4.89,5.35,6.8,7.62,8.19,7.46,6.92,7.42,6.36,5.88,6.63,7.4,8.08,6.62,5.54,6.33,7.1,6.82,7.08,6.98,6.21,7.69,7.65,6.66,6.96,7.84,6.98,5.69,8.05,4.38,4.94,4.22,2.98,2.57,1.99,1.15,1.65,3.3,4.31,5.14,4.78,4.29,4.51,3.5,3.07,4.26,4.35,3.91,5.97,8.67,8.85,8.09,8.01,8.46,8.44,8.09,7.19,8.02,8.96,9.09,9.03,8.77,8.09,9.23,9.07,9.34,9.66,10.19,10.58,11.09,9.95,9.45,9.93,9.61,8.32,8.95,10.9,11.55,10.54,9.1,7.7,6.81,6.23,5.62,6.43,6.54,5.66,5.77,7.25,7.82,8.2,8.44,8.67,9.58,10.46,11.37,11.77,12.3,12.22,12.14,13.71,15.08,14.07,13.6,13.64,13.24,12.76,11.84,10.72,10.71,10.22,9.82,9.47,9.28,8.92,8.62,8.04,7.45,7.69,7.84,8.83,10.52,11.36,13.5,15.9,15.98,14.8,14.91,12.41,11.62,10.07,8.77,7.06,6.67,8.65,9.45,8.0,9.19,5.92,2.95,2.95,2.5,2.9,3.0,2.7,2.83,3.04,3.03,2.36,2.05,2.7,3.21,3.09,2.63,2.54,2.17,3.69,-3.68,1.71,2.3,0.22,-1.99,-4.34,-3.86,-2.61,-1.08,0.03,0.79,1.72,2.03,1.99,2.48,3.37,4.56,5.78,6.49,6.82,7.43,6.78,7.69,8.14,8.25,8.64,8.73,9.82,9.99,9.12,9.21,9.95,10.88,11.56,11.93,11.71,11.42,11.24,11.01,11.49,11.05,9.67,10.22,12.73,13.87,12.74,12.26,12.12,12.49,12.38,11.61,10.72,10.45,10.87,10.78,10.03,9.39,9.46,9.23,8.85,9.1,9.85,9.95,6.24,0.8,1.71,4.65,6.57,7.32,7.64,6.09,4.71,1.31,-2.08,-1.2,-2.07,-2.27,-1.84,-1.87,-2.75,-3.64,-1.86,-1.92,-1.99,-2.02,-2.96,-3.93,-4.98,-6.18,-6.4,-8.5,-9.42,-10.45,-11.58,-11.24,-9.57,-9.44,-9.61,-8.98,-8.64,-8.63,-8.73,-8.03,-7.25,-5.64,-4.73,-3.7,-2.88,-2.44,-1.96,-0.87,0.72,2.2,2.74,2.41,1.77,0.35,-0.55,-1.63,-1.14,-1.33,-0.14,2.86,-0.44,1.13,0.67,3.44,4.53,4.36,4.99,5.22,5.74,4.92,3.96,4.26,5.31,5.56,5.37,6.07,6.48,6.1,4.48,4.41,3.17,2.55,3.57,3.49,3.6,4.31,4.68,4.2,3.38,3.68,4.59,7.31,8.61,6.87,5.15,2.18,6.14,8.36,7.28,6.55,5.44,5.0,5.5,5.68,4.65,4.84,7.09,10.22,10.9,9.94,9.65,10.32,9.58,9.14,8.78,8.56,9.12,9.96,10.51,10.49,10.5,10.77,11.31,11.46,11.15,10.18,10.05,11.25,11.98,11.46,12.18,12.13,11.83,11.33,11.82,11.87,11.08,8.21,6.13,4.87,4.77,5.39,5.89,5.94,6.76,7.14,7.04,6.97,6.67,7.0,7.49,7.58,7.83,7.0,6.57,6.7,6.66,6.6,6.98,6.09,6.9,8.92,7.72,6.73,6.63,6.1,6.48,4.34,6.66,7.08,6.06,5.76,4.53,1.99,1.78,2.99,4.47,5.44,5.62,6.14,6.33,6.81,6.71,5.6,4.99,4.55,6.31,6.6,3.79,4.56,8.53,10.62,10.47,9.6,8.8,8.74,8.34,8.03,8.24,8.57,9.17,8.97,9.51,10.9,11.34,12.18,11.56,10.56,10.36,10.54,10.46,10.79,11.0,11.07,10.1,10.13,11.91,12.08,10.72,9.2,8.3,7.6,6.76,6.5,6.42,6.38,6.23,7.41,8.04,8.37,8.56,8.78,8.92,9.18,9.71,10.64,11.77,12.68,12.12,11.11,12.69,14.85,15.78,14.54,14.6,14.31,13.46,12.73,11.96,10.94,10.7,9.63,9.18,9.52,9.41,9.35,8.14,7.75,8.38,8.9,10.03,9.24,9.47,11.54,11.7,13.92,15.2,14.0,13.69,11.64,9.33,7.35,6.56,6.65,7.31,8.45,7.29,8.75,8.41,6.38,3.94,2.49,2.06,2.12,1.98,1.83,1.96,2.87,2.72,2.86,3.91,4.73,3.81,3.77,3.88,2.64,1.78,1.47,0.9,-0.79,-0.35,-2.45,-1.4,-1.05,-0.16,0.59,1.19,2.27,2.89,3.07,3.12,3.51,4.23,5.38,6.36,6.84,6.81,6.86,7.31,8.02,8.54,8.73,8.01,7.47,7.81,7.38,7.55,7.69,7.35,6.87,7.43,8.13,9.75,11.23,11.88,11.81,11.84,12.02,11.61,10.81,10.34,10.15,9.58,9.41,9.61,9.71,9.64,10.92,12.39,12.5,11.94,10.84,10.13,8.34,8.58,9.31,9.23,9.28,8.79,4.55,-0.39,0.82,3.72,6.68,8.44,8.81,7.7,6.26,4.2,1.85,-2.4,-2.92,-2.79,-3.26,-2.78,-3.36,-5.99,-3.28,-4.29,-4.03,-3.8,-3.96,-4.83,-6.59,-7.45,-8.25,-8.22,-8.7,-9.61,-10.99,-10.89,-10.83,-10.05,-9.91,-9.09,-8.61,-8.57,-7.92,-6.51,-5.46,-5.4,-4.31,-3.48,-2.35,-2.05,-1.82,-1.55,-0.14,1.7,2.43,2.02,0.62,-1.08,-1.48,-2.03,-1.42,-0.48,-0.87,0.93,1.14,0.71,-0.88,3.37,2.06,3.33,4.13,4.84,5.82,6.35,5.36,4.59,4.79,6.08,6.75,6.41,7.14,6.95,6.23,5.41,5.87,5.1,3.01,3.9,3.92,4.01,4.84,4.9,4.59,4.69,3.65,3.45,5.06,5.84,6.19,5.49,4.88,4.45,4.83,5.44,7.24,6.37,6.0,5.88,4.6,3.22,5.66,8.27,9.98,9.32,8.52,9.12,8.81,7.92,7.92,8.43,8.67,9.09,9.97,10.66,11.47,11.62,11.46,11.71,12.0,11.95,11.37,10.69,11.33,11.57,11.93,13.05,13.45,13.19,12.98,12.43,11.88,9.38,6.55,5.92,5.76,5.33,5.12,5.37,5.64,6.04,6.56,6.89,7.33,7.36,7.98,8.04,7.74,7.75,7.35,6.55,6.7,6.22,6.45,6.81,7.1,7.86,8.94,7.71,6.47,5.67,5.6,6.18,5.47,6.85,6.07,5.25,4.84,2.06,2.72,3.8,4.46,5.4,6.17,5.97,6.3,7.02,7.5,8.26,8.66,7.36,7.43,6.61,6.06,5.86,5.03,2.67,2.85,7.55,10.69,10.65,10.39,10.37,10.32,10.45,10.47,10.55,10.42,10.4,10.64,10.66,10.99,11.27,10.75,10.85,11.21,11.86,11.26,10.81,11.11,10.21,10.16,11.74,11.94,10.49,8.73,9.14,9.17,8.87,8.27,7.26,6.95,6.97,8.44,9.42,9.47,8.03,7.93,9.27,10.06,10.74,10.57,11.58,12.34,11.82,11.69,12.73,14.23,16.09,15.15,14.63,14.2,13.73,12.94,12.0,11.22,10.55,9.86,9.66,9.9,9.9,9.4,8.69,8.23,9.22,9.74,9.5,8.15,8.31,7.78,9.67,11.62,12.02,13.15,12.69,12.34,8.85,6.43,6.53,7.05,7.17,7.45,6.16,6.17,5.07,4.21,3.22,1.29,0.92,1.18,1.39,1.38,1.22,1.56,2.33,3.48,5.02,5.46,6.08,4.64,4.78,4.29,4.74,7.0,-0.61,-2.02,-3.66,-2.02,-0.07,0.6,1.26,1.41,2.5,3.48,4.09,4.12,4.14,4.34,5.04,6.0,6.55,6.52,6.6,7.27,8.05,9.04,9.52,9.39,9.03,8.56,8.59,8.25,9.03,9.22,8.52,7.52,6.92,7.49,8.06,8.38,8.74,9.82,11.24,11.57,11.34,11.14,10.58,10.09,9.86,10.0,10.27,10.78,11.43,12.35,13.17,13.64,12.95,10.86,9.73,7.88,7.99,8.51,8.74,8.71,5.63,0.22,1.75,4.64,7.59,9.54,10.28,9.8,7.31,5.91,2.66,1.16,-3.41,-4.05,-3.47,-3.72,-3.59,-5.63,-5.01,-4.87,-5.2,-6.15,-5.96,-6.57,-7.89,-9.06,-9.91,-10.27,-9.52,-9.33,-9.53,-10.84,-11.27,-11.06,-11.09,-10.47,-9.42,-8.47,-7.25,-5.99,-5.15,-4.39,-3.3,-2.26,-1.67,-0.95,-2.37,-0.97,-0.35,1.83,3.07,2.78,1.32,-0.09,-1.34,-1.63,-1.39,-0.6,-0.18,-0.76,0.29,2.6,1.26,3.45,3.43,3.3,4.48,4.44,5.63,6.43,6.45,5.27,5.22,5.79,7.05,7.41,7.31,7.58,7.09,6.38,6.29,6.57,6.87,4.37,3.8,4.49,4.58,5.47,5.41,5.28,4.97,4.27,5.71,5.34,5.67,4.42,3.86,3.96,4.53,6.05,8.24,8.32,7.63,6.3,5.14,3.21,3.16,3.03,2.46,2.16,2.48,2.79,2.74,2.8,2.35,2.71,2.62,3.29,4.08,4.86,5.79,6.92,8.08,9.64,11.1,11.59,12.03,12.68,12.63,12.01,11.85,12.3,14.18,14.17,14.16,13.56,13.02,12.56,9.81,8.12,7.59,5.65,5.2,4.51,4.92,6.02,6.54,7.39,7.92,8.05,8.18,8.36,7.75,7.89,7.73,7.02,6.55,6.13,6.55,6.42,6.8,8.55,9.28,8.44,7.8,6.62,4.87,5.4,5.92,6.38,5.64,5.64,5.47,4.77,4.09,4.63,5.06,5.66,6.64,7.87,7.49,7.35,8.52,9.46,8.67,8.21,8.74,8.67,7.94,6.64,5.95,5.32,5.32,5.33,3.75,1.53,3.11,8.05,12.32,12.49,11.6,11.32,11.34,11.28,10.84,11.29,11.81,12.1,12.23,12.45,13.01,13.31,13.42,12.78,12.01,12.32,11.67,11.4,12.49,11.92,10.12,9.7,10.25,9.7,8.84,7.84,7.61,8.53,9.04,9.77,9.86,8.85,8.54,8.84,9.4,10.11,10.03,9.99,11.28,12.3,12.5,12.84,13.43,13.84,14.76,14.92,14.42,14.65,13.47,12.81,11.67,10.97,10.79,10.0,9.74,9.91,9.77,8.91,8.67,8.98,9.24,9.33,8.05,7.1,7.58,7.29,6.74,9.64,9.46,11.08,10.83,11.55,9.38,6.69,7.02,8.74,7.57,7.87,5.26,4.68,3.66,2.87,2.2,1.1,1.12,1.78,2.26,2.4,2.54,2.44,2.66,3.6,4.28,6.99,6.65,6.36,5.73,5.15,5.33,6.4,0.25,-1.43,-1.86,-0.52,0.84,1.27,1.54,2.45,3.68,4.44,4.98,5.0,4.95,5.18,5.8,6.37,6.32,6.41,6.83,7.87,8.5,9.75,10.13,10.1,10.07,9.88,9.19,9.1,9.1,8.73,8.03,8.06,7.89,8.76,9.08,9.1,9.03,8.94,8.69,8.95,9.89,10.86,11.32,11.38,11.08,11.23,11.47,11.79,12.12,12.3,12.51,13.2,13.94,13.38,12.02,7.39,7.24,7.53,8.08,7.16,2.67,2.94,5.26,7.73,10.33,12.54,13.87,12.48,8.59,6.34,1.08,-0.46,-5.17,-4.2,-3.31,-4.28,-4.04,-6.33,-5.18,-5.83,-5.51,-7.23,-7.99,-8.58,-9.55,-9.71,-10.17,-10.07,-9.61,-8.9,-8.66,-9.65,-10.11,-10.15,-9.62,-9.1,-8.65,-8.28,-7.63,-6.8,-5.86,-5.16,-4.08,-2.97,-2.97,-3.75,-1.36,1.03,2.84,4.4,4.45,3.63,1.46,0.02,-0.55,-0.36,-0.63,-0.66,-0.16,0.16,2.28,2.62,0.86,4.71,2.11,2.58,4.19,5.46,5.62,5.39,5.2,5.75,5.83,6.07,6.75,7.45,7.34,7.58,7.42,7.15,7.36,7.04,7.24,7.14,5.77,5.4,6.12,6.06,6.02,5.57,5.0,6.02,6.37,5.41,4.44,2.65,3.83,4.72,3.95,5.43,5.5,10.12,5.11,1.39,-0.97,-1.27,-1.47,0.08,1.9,4.28,5.27,4.78,4.95,4.82,4.2,4.56,4.54,6.16,6.82,6.41,6.74,7.94,8.67,9.2,10.1,11.14,12.26,13.93,15.06,14.67,14.14,14.16,16.56,16.37,15.41,14.76,14.32,13.04,10.36,7.97,7.26,5.8,4.17,3.75,3.9,4.98,6.7,7.73,7.98,8.91,9.02,8.35,8.11,8.11,7.76,7.73,7.48,7.38,7.29,7.41,7.78,9.06,9.05,6.01,5.98,6.35,6.01,6.11,6.32,6.6,7.31,5.99,4.56,4.49,5.47,5.39,5.67,6.22,7.69,8.91,9.67,8.6,6.42,6.59,7.39,7.01,7.04,7.66,8.04,7.12,6.75,7.45,7.75,7.43,6.42,5.51,5.59,6.0,5.87,5.62,6.91,12.81,13.42,12.3,11.36,11.46,12.18,12.57,12.57,13.73,14.56,14.44,14.62,14.56,13.45,12.94,12.72,12.2,11.66,11.16,10.61,10.31,10.27,9.7,9.29,9.62,9.87,9.47,9.56,10.85,10.38,9.74,10.2,10.24,9.3,10.23,10.7,9.79,9.92,11.3,11.86,12.32,12.6,13.25,14.63,14.89,14.31,13.99,13.49,12.68,11.43,10.55,10.3,9.84,9.66,9.43,9.2,9.0,8.97,9.03,8.71,8.39,7.02,6.42,6.55,5.84,6.69,6.75,10.37,8.39,9.01,7.66,7.77,6.93,6.77,8.43,6.97,7.05,4.6,3.86,2.85,0.85,1.42,1.64,1.94,2.62,3.08,3.42,3.6,3.91,3.84,3.9,4.99,6.36,8.43,7.88,6.87,6.08,4.06,2.41,1.11,-0.3,-0.07,1.15,1.7,1.84,2.47,3.51,4.33,5.09,5.59,5.63,5.73,6.05,6.31,6.49,6.35,7.11,7.6,8.96,9.41,10.1,10.15,10.22,10.42,10.52,10.36,9.87,8.6,7.68,7.78,8.04,8.1,7.88,7.91,7.59,7.7,7.88,8.23,8.61,8.93,9.16,9.68,10.39,11.18,11.74,11.85,12.17,12.27,12.25,12.02,12.71,12.69,12.02,12.74,7.88,5.29,6.69,6.56,3.69,2.3,5.31,6.99,9.13,12.43,15.16,17.5,13.97,6.33,4.13,-1.34,-3.59,-6.48,-3.79,-4.27,-4.56,-5.0,-6.0,-5.55,-5.56,-5.85,-7.4,-9.15,-9.86,-10.06,-10.22,-10.02,-9.67,-9.42,-9.09,-8.99,-9.35,-9.5,-9.86,-9.81,-9.54,-9.3,-9.14,-8.83,-8.34,-7.13,-5.93,-4.61,-2.99,-1.49,0.21,1.84,3.03,3.73,4.5,4.34,3.71,2.24,0.9,0.72,0.74,0.24,-1.16,-1.15,-0.66,1.91,0.23,2.78,2.51,2.37,3.01,2.65,3.33,4.05,4.38,5.34,6.27,6.39,6.09,6.12,6.36,6.22,6.61,7.23,7.71,8.25,7.93,8.12,8.08,7.01,7.21,7.27,6.97,6.98,5.85,5.56,6.16,6.03,5.11,4.83,4.74,4.78,5.13,4.56,4.0,2.76,-7.11,-5.84,-6.91,-4.83,-2.36,-0.32,1.9,3.5,5.01,5.04,4.91,5.15,4.93,5.24,5.62,6.7,8.09,7.99,7.74,8.69,9.7,10.24,10.52,11.37,13.11,14.67,15.83,16.64,16.49,16.18,16.39,16.77,16.76,16.11,15.21,14.0,12.75,9.63,6.68,5.02,2.91,2.18,2.32,3.0,4.05,6.46,8.07,9.15,9.55,8.65,8.12,8.67,8.88,7.36,8.25,8.53,8.41,8.2,8.61,8.82,8.68,6.88,6.13,5.84,6.28,5.91,6.22,6.44,4.77,4.28,5.12,6.08,6.26,4.62,5.18,7.04,9.21,10.7,11.07,11.22,9.39,6.22,5.33,2.97,0.8,1.67,3.43,4.79,6.25,7.24,7.74,8.17,8.05,7.96,8.08,8.97,9.48,9.64,9.45,9.3,10.45,9.99,9.44,10.74,12.61,13.1,13.38,13.83,14.65,15.36,15.16,14.95,14.75,13.81,12.95,12.61,11.88,10.89,10.56,10.61,10.34,10.85,10.24,9.78,10.64,11.21,10.39,9.9,11.15,10.84,10.58,10.97,10.99,10.55,10.38,10.27,9.56,9.27,10.04,10.96,11.92,12.4,12.69,13.22,13.62,13.71,13.09,12.63,11.6,10.91,9.89,9.51,9.17,9.02,8.84,9.08,9.38,9.08,8.73,8.44,7.68,6.36,5.7,5.39,4.75,4.35,5.54,6.92,7.87,7.03,5.48,4.21,5.53,5.79,7.27,7.37,5.8,3.84,2.51,1.61,-0.37,-0.5,-0.6,-0.14,1.07,2.2,3.0,3.73,3.93,3.88,4.44,5.32,6.71,8.19,9.57,7.82,4.78,2.95,0.62,0.52,0.87,1.45,2.11,2.54,2.79,3.53,4.68,5.32,5.66,6.05,6.33,6.57,7.03,7.08,7.24,7.42,8.43,9.36,9.68,10.49,10.11,10.26,10.52,10.98,11.19,10.87,9.7,8.77,8.53,8.47,8.71,8.26,7.58,7.43,7.52,7.62,7.92,8.26,8.84,9.59,10.0,10.17,10.32,10.5,11.2,12.08,12.46,13.05,12.48,11.84,11.79,12.0,10.89,10.65,3.08,4.03,5.9,4.26,1.22,3.5,5.38,6.55,9.05,10.17,12.68,9.03,2.6,-3.34,-4.57,-5.31,-7.52,-6.38,-4.79,-5.31,-5.01,-5.5,-5.72,-5.29,-6.2,-6.66,-7.23,-7.63,-8.6,-9.01,-9.26,-9.51,-9.62,-9.72,-9.65,-9.65,-9.53,-9.17,-8.79,-8.4,-8.08,-7.95,-7.53,-6.97,-5.76,-4.14,-3.17,-2.32,-1.32,-0.53,-0.82,-0.43,0.26,1.05,1.84,2.51,2.73,2.23,1.77,1.38,0.96,1.04,0.2,-1.54,2.34,1.51,1.99,2.4,1.95,3.58,2.42,3.12,3.87,4.38,5.39,6.21,6.41,6.43,6.43,6.59,6.11,6.45,7.47,7.51,7.72,8.04,7.76,8.01,8.25,8.98,9.25,8.53,7.96,7.28,6.32,5.69,5.18,5.25,5.34,4.93,4.15,5.53,5.77,6.53,4.49,1.56,-0.7,-1.39,-0.7,0.15,1.14,2.26,3.16,4.02,5.32,5.53,5.13,5.17,5.88,6.87,7.52,7.78,8.23,8.56,8.48,9.1,10.24,10.89,11.71,13.1,14.78,16.03,16.78,17.14,17.07,16.96,17.09,16.32,15.91,15.19,13.88,12.14,10.05,6.52,3.73,2.02,0.07,0.09,1.08,2.24,3.52,4.75,6.46,8.13,8.57,8.68,9.31,9.91,9.88,9.5,9.18,8.91,8.83,8.86,8.45,8.17,7.55,6.19,5.88,6.07,6.19,6.2,6.21,6.21,5.4,3.74,4.12,5.85,6.06,6.17,7.17,7.87,10.54,12.51,12.38,11.68,9.14,5.77,5.26,4.62,3.9,3.19,3.06,3.68,4.35,4.83,5.75,6.19,6.4,6.85,7.69,8.79,10.1,11.36,12.5,13.2,13.48,14.08,12.34,12.68,12.93,13.39,14.65,15.66,15.9,16.31,16.8,16.52,15.47,14.64,14.41,13.62,12.67,11.59,10.53,10.81,11.0,11.86,11.31,10.05,9.79,10.1,9.71,9.17,9.75,10.0,10.11,11.05,11.54,11.04,10.44,10.11,9.72,9.46,10.07,10.73,11.16,11.4,11.99,12.26,12.88,13.08,12.44,11.36,10.12,9.12,7.45,7.57,8.71,8.95,9.42,9.44,9.28,9.27,8.97,8.72,6.98,5.55,4.98,4.61,4.09,3.33,2.42,2.76,6.42,2.08,4.0,4.61,2.81,5.35,7.62,6.84,5.09,3.38,1.25,0.37,-0.13,0.2,0.65,1.42,2.49,2.58,2.49,3.96,4.75,5.64,6.19,6.77,6.77,7.26,8.89,8.75,4.45,2.74,1.83,1.78,2.06,2.77,3.33,3.61,4.03,4.78,5.71,6.02,6.25,6.64,7.02,7.42,7.99,8.11,8.48,9.09,10.01,10.81,10.45,10.65,10.1,10.43,10.37,10.55,10.03,9.48,9.27,9.63,9.68,9.89,9.3,8.51,8.3,8.19,8.27,8.36,8.51,8.7,8.9,8.57,8.87,9.01,9.03,8.99,9.69,10.6,11.81,12.54,12.89,13.06,12.21,10.76,6.26,5.34,2.14,3.27,3.1,0.19,0.45,3.36,4.08,5.04,5.69,3.46,-2.01,-9.44,-12.12,-11.81,-10.16,-9.59,-8.78,-6.4,-5.96,-5.55,-5.47,-5.46,-5.11,-5.16,-5.69,-5.75,-6.09,-6.35,-7.0,-7.77,-8.17,-8.36,-8.71,-8.82,-8.78,-8.54,-7.97,-7.6,-7.5,-7.61,-7.7,-7.68,-6.75,-5.75,-4.34,-3.63,-3.63,-3.49,-2.71,-2.81,-2.07,-1.49,-1.05,-0.84,-0.76,-0.35,1.2,2.44,2.49,2.59,2.49,2.82,1.3,-1.74,4.32,3.51,2.41,4.53,4.48,3.27,3.97,4.67,5.34,6.23,6.92,7.36,7.15,7.08,7.05,6.72,7.28,7.97,7.74,8.71,8.9,8.96,8.8,9.06,8.76,8.52,9.37,9.55,8.78,7.73,6.64,5.54,4.9,4.89,5.35,5.19,4.82,4.77,5.68,4.9,4.77,3.83,2.49,1.99,2.04,2.83,4.02,4.68,5.37,5.85,6.69,7.22,6.41,5.89,6.19,7.21,8.21,8.63,8.56,8.53,8.83,9.86,10.36,10.55,11.43,13.02,14.81,16.19,17.44,17.73,17.93,17.76,17.05,14.6,13.71,12.23,10.62,8.53,5.68,1.75,-1.03,-2.42,-1.86,-0.46,1.14,2.76,4.58,6.06,7.39,8.36,8.19,8.53,9.11,10.3,10.82,10.54,10.07,9.37,8.71,8.29,7.71,7.95,6.79,5.87,6.08,6.32,6.47,6.97,7.19,6.73,7.47,7.85,7.15,6.57,6.56,7.08,7.42,7.88,8.46,8.95,10.58,9.99,6.87,6.09,5.38,4.75,4.29,4.09,4.25,4.76,5.61,6.41,6.71,7.36,8.24,8.64,9.35,10.49,11.63,13.03,14.36,15.62,16.38,16.93,17.0,16.28,16.11,16.26,16.36,17.17,17.48,17.55,17.32,16.51,15.78,15.26,14.93,14.03,12.91,12.6,12.02,11.56,11.87,11.58,10.82,9.25,8.49,8.77,9.42,9.62,10.13,10.85,11.07,11.13,11.2,10.77,10.51,10.52,10.26,10.27,10.49,10.68,10.92,10.87,10.92,10.99,11.79,12.49,12.19,11.76,10.62,9.8,9.04,8.88,9.2,9.49,9.92,9.75,9.66,9.81,9.33,8.12,6.74,5.75,5.16,4.95,4.23,2.94,1.08,-0.33,-0.52,3.87,2.55,3.51,3.74,4.84,5.66,5.73,3.41,2.27,1.45,0.84,-0.36,-0.05,0.33,1.52,3.3,3.6,3.15,4.54,5.84,6.83,8.06,7.69,7.31,7.4,8.35,7.92,5.96,3.09,2.37,2.6,3.14,3.85,4.77,4.8,5.12,5.81,6.41,6.42,6.66,7.02,7.5,8.07,8.82,9.15,9.89,10.77,11.27,11.43,10.71,10.43,10.09,9.84,9.79,9.05,8.68,9.27,10.05,9.95,10.05,9.95,10.32,10.09,9.89,9.32,8.68,8.72,8.57,8.63,8.95,9.52,9.76,9.69,10.04,10.49,9.97,10.51,11.3,12.08,12.3,11.86,9.44,7.74,4.37,3.32,1.44,0.79,-0.84,-2.22,-0.32,1.95,1.48,1.9,1.63,-1.8,-9.8,-12.16,-14.14,-12.64,-11.49,-10.31,-8.01,-6.58,-6.19,-5.76,-5.25,-4.97,-4.69,-5.16,-4.63,-5.07,-5.3,-5.07,-5.44,-6.58,-7.05,-7.33,-7.48,-7.42,-7.22,-6.9,-7.27,-7.48,-7.6,-7.54,-7.2,-6.82,-6.4,-5.62,-4.88,-4.43,-3.9,-3.41,-2.07,-1.64,-1.68,-1.78,-1.59,-1.37,-1.79,-2.4,-2.39,-1.68,-0.45,1.08,2.88,4.45,3.07,2.07,3.68,3.24,4.27,4.57,3.92,6.07,6.25,6.61,7.17,7.81,7.99,7.84,6.87,5.23,4.39,8.21,8.9,9.07,9.87,10.18,10.27,10.22,10.1,9.96,9.52,8.94,8.56,9.04,9.4,8.66,7.86,6.96,6.47,5.92,5.16,5.11,5.04,5.45,6.84,6.54,5.42,4.89,4.9,5.02,5.25,5.85,6.42,7.0,7.18,6.76,7.75,8.08,7.55,6.61,6.7,7.56,8.3,7.88,7.73,8.49,9.45,9.9,9.76,9.49,10.17,11.71,13.51,15.15,16.65,16.95,16.37,16.01,15.45,10.29,9.3,7.14,3.13,-1.47,-4.31,-5.05,-4.77,-3.21,-1.25,-0.01,1.45,3.35,4.69,6.11,7.37,8.26,9.0,9.83,11.28,11.1,10.57,10.5,9.99,9.24,8.15,7.97,8.0,7.98,6.82,6.53,6.88,6.93,7.47,8.25,7.1,7.65,8.83,8.96,9.39,8.41,8.44,8.78,8.96,8.44,7.02,5.42,3.65,3.5,4.65,4.75,4.71,5.09,5.28,5.6,6.41,7.08,7.86,8.98,9.55,9.66,10.07,10.45,11.15,12.25,13.58,15.42,17.09,18.28,18.95,19.45,19.93,19.92,18.71,19.65,18.98,18.48,18.57,18.8,18.57,17.1,15.92,15.41,14.73,13.89,13.31,12.93,12.91,12.87,12.41,11.93,10.87,9.31,8.26,8.27,9.03,9.96,11.26,12.37,12.63,12.23,11.46,10.87,11.05,11.63,11.73,11.68,11.56,11.21,10.77,10.24,10.49,10.51,10.85,12.09,12.69,12.34,11.31,10.6,9.67,8.81,9.26,9.57,10.49,10.36,10.12,9.53,8.99,8.02,7.49,6.75,6.35,5.9,5.04,3.91,1.93,0.17,-0.64,-2.21,5.44,4.76,5.47,5.4,4.93,3.01,2.19,1.41,0.44,0.27,0.15,1.42,2.06,2.93,4.55,6.28,6.32,6.63,6.7,7.01,8.76,8.65,7.56,7.55,7.76,7.17,5.12,3.56,3.27,3.81,4.25,4.54,5.65,5.47,5.39,5.96,6.23,6.31,6.7,7.19,7.85,8.77,9.46,10.34,11.05,11.74,11.8,11.47,10.64,10.41,10.21,9.5,9.21,9.09,9.33,9.77,10.14,10.66,11.11,11.53,11.27,11.1,10.33,9.68,9.21,8.77,8.64,8.42,8.97,9.42,9.55,9.67,10.69,11.08,10.92,10.17,9.93,10.46,9.73,7.48,5.12,3.06,2.3,3.27,1.09,-3.64,-4.23,-3.11,-1.41,-0.35,-0.59,-1.27,-0.68,-5.22,-8.0,-11.2,-12.13,-12.01,-10.51,-8.66,-7.33,-6.67,-5.94,-5.33,-4.65,-4.53,-4.67,-4.53,-4.27,-4.8,-5.23,-5.21,-5.05,-5.27,-5.66,-5.85,-5.84,-6.05,-6.03,-5.88,-5.79,-5.75,-5.61,-5.25,-4.44,-3.34,-2.55,-1.94,-1.44,-0.97,-1.03,-1.08,-1.15,-0.88,-0.76,-0.39,-0.31,-0.34,-0.11,0.21,0.66,1.27,2.18,3.1,3.68,4.67,5.56,3.93,2.97,2.96,3.47,2.81,3.79,5.98,7.13,7.55,7.63,7.39,7.0,6.85,7.04,7.43,7.82,8.63,9.89,10.79,10.73,10.77,11.03,10.74,10.31,10.25,9.72,9.46,8.7,8.35,8.85,10.01,9.88,8.11,7.55,7.49,7.05,6.65,6.51,7.68,7.77,7.65,7.06,6.42,6.67,6.77,7.28,8.24,8.78,8.88,9.36,9.42,8.87,8.77,8.49,7.7,7.68,8.89,9.42,9.04,9.03,8.96,8.97,8.53,8.66,8.25,8.59,9.53,10.49,11.55,12.66,13.22,12.07,11.47,11.06,0.1,-3.78,-6.39,-7.58,-7.62,-6.68,-5.42,-4.4,-2.95,-1.38,0.39,2.33,4.18,5.74,7.31,8.49,9.4,10.11,11.01,11.42,10.91,10.67,10.61,10.25,9.4,8.96,8.97,8.43,7.8,7.02,6.95,7.14,6.99,6.54,5.98,6.63,6.72,7.13,6.59,5.66,6.81,7.3,7.72,7.95,8.13,6.98,5.74,4.93,4.5,4.57,5.11,5.7,6.03,6.39,7.33,8.62,9.51,9.87,10.05,10.34,10.76,10.48,10.8,12.1,13.35,14.66,16.04,17.42,18.78,20.18,21.28,22.06,22.28,22.02,21.29,20.86,19.69,19.03,18.86,18.77,18.48,17.92,16.85,15.74,15.17,14.45,14.43,13.88,13.36,12.69,11.16,10.07,9.46,9.09,9.04,9.12,9.82,10.47,10.98,11.76,11.48,11.09,11.03,10.98,12.25,13.11,13.04,12.67,11.96,11.03,10.5,10.42,10.55,10.99,11.61,12.56,12.72,11.55,10.22,9.3,8.12,8.41,9.12,9.98,10.06,9.51,9.54,9.18,8.76,8.14,7.95,7.37,6.64,6.19,4.94,3.75,2.22,0.86,-0.35,-2.38,0.2,3.78,2.74,1.83,0.5,-0.61,-2.23,-2.49,-1.95,0.23,3.35,3.32,3.56,4.47,6.05,7.44,7.59,7.64,8.81,8.74,7.04,6.47,6.77,6.95,6.81,5.75,4.3,4.55,5.39,5.96,5.67,5.69,5.09,4.93,5.33,5.84,6.15,6.87,7.56,8.54,9.4,10.17,11.03,11.81,11.95,11.83,11.56,10.91,10.67,10.19,10.04,9.6,9.84,10.17,10.38,10.72,11.27,11.67,11.61,11.33,10.85,10.25,9.62,9.27,9.26,9.03,8.89,9.06,8.77,7.6,6.95,8.59,8.97,6.93,6.37,8.46,8.38,6.43,2.8,-0.41,-2.91,-6.61,-7.79,-7.52,-6.37,-5.08,-4.87,-3.17,-2.2,-0.71,-0.94,-1.27,-4.58,-5.88,-7.14,-9.1,-9.11,-7.83,-6.92,-5.94,-5.43,-5.3,-4.66,-3.81,-3.91,-4.11,-4.0,-4.69,-5.16,-5.44,-5.1,-5.63,-5.49,-5.0,-4.67,-4.26,-4.39,-4.62,-4.4,-4.26,-4.28,-3.7,-3.03,-2.36,-1.73,-0.9,0.01,0.91,1.55,1.63,2.54,3.35,3.34,2.71,2.51,2.71,2.58,2.48,2.77,3.46,4.3,5.09,5.87,6.63,7.19,7.6,7.74,5.95,1.86,3.29,3.29,4.78,2.88,4.59,4.38,3.39,4.06,4.55,5.03,5.74,7.0,8.76,10.12,11.36,12.12,11.4,11.15,11.11,10.96,10.27,10.77,10.17,10.51,9.39,9.23,9.64,10.35,11.27,10.74,9.45,9.03,9.0,8.09,9.06,10.06,10.02,8.53,7.4,7.04,7.53,7.77,8.01,8.07,8.38,8.55,8.83,9.09,8.92,8.85,8.6,8.98,10.1,10.31,9.89,9.27,8.92,8.63,8.72,8.92,8.57,7.47,7.13,6.48,6.29,5.29,4.21,6.28,5.86,4.95,3.42,-8.34,-9.08,-8.68,-7.92,-7.04,-5.81,-4.28,-2.82,-1.0,1.12,3.47,5.51,7.32,8.62,9.55,10.19,10.64,10.77,11.14,11.16,11.07,11.1,11.23,11.01,10.32,9.52,8.58,8.65,8.35,7.51,7.13,6.98,6.55,6.34,6.21,5.95,5.95,5.95,6.09,6.59,7.21,6.45,5.42,7.77,8.02,8.05,5.45,7.43,7.8,7.84,7.95,7.95,8.07,8.61,9.53,10.29,10.94,11.13,10.79,10.8,11.1,11.54,12.11,12.57,13.49,14.5,15.82,17.56,19.55,21.2,22.35,22.88,23.16,23.25,22.71,21.48,20.74,19.93,19.45,18.67,18.16,18.04,17.6,16.97,15.66,14.72,13.81,13.21,12.41,11.8,11.48,10.71,9.29,8.16,8.35,8.8,8.97,9.62,10.87,12.15,12.2,12.2,12.11,12.4,12.99,13.65,13.95,13.52,12.49,11.88,11.26,11.24,11.17,11.43,11.82,12.0,12.71,11.68,9.9,7.69,5.52,6.22,7.37,8.46,8.96,8.92,8.89,9.12,8.8,8.69,8.6,8.19,7.59,7.08,5.87,5.02,4.37,3.15,1.93,0.01,-1.22,-4.61,-4.34,-4.18,-4.78,-5.01,-4.32,-2.62,-0.72,1.84,3.48,3.31,4.01,5.42,7.01,8.49,10.11,10.11,9.19,8.65,7.91,6.85,6.61,7.32,7.65,7.21,6.04,6.08,6.28,7.01,5.62,5.3,4.57,4.68,5.12,5.54,6.47,7.53,8.47,9.25,9.96,10.85,11.41,12.05,12.18,12.17,11.54,11.48,10.73,10.88,10.44,10.67,11.05,10.92,11.42,11.77,11.87,11.61,11.33,10.81,10.65,10.4,10.02,9.62,9.76,9.69,9.2,8.24,7.87,8.49,9.08,8.49,7.58,6.23,6.04,7.74,7.68,3.31,-4.59,-5.09,-6.99,-6.24,-7.14,-6.4,-5.88,-5.32,-4.75,-3.29,-2.42,-0.44,-0.31,-0.42,-2.05,-3.37,-3.87,-5.43,-5.76,-6.25,-5.52,-4.98,-5.22,-5.24,-4.89,-4.97,-4.51,-4.19,-4.37,-3.86,-3.59,-3.15,-3.51,-4.47,-4.52,-4.33,-4.58,-4.75,-4.25,-3.55,-3.89,-3.44,-2.08,-1.17,-0.81,-1.1,-1.13,-0.31,0.59,1.02,1.97,2.39,2.67,2.86,3.17,3.69,4.36,5.05,5.78,6.26,6.45,6.66,6.88,6.86,6.84,7.27,7.99,8.65,9.24,9.84,10.21,10.38,6.43,3.83,1.26,2.46,5.3,6.32,6.7,7.03,6.97,8.54,10.57,12.43,14.05,14.4,13.02,11.82,11.65,12.25,11.38,10.71,11.05,11.55,11.22,9.93,10.54,10.79,11.06,11.17,11.57,11.47,10.32,10.07,10.32,10.36,12.55,10.96,7.58,6.72,7.07,7.16,7.0,6.82,7.39,8.47,9.44,9.21,8.66,8.16,8.64,9.17,10.05,10.82,11.3,10.8,9.89,9.12,9.48,9.56,9.04,8.26,7.66,5.94,3.72,2.08,0.33,-2.58,-5.06,-5.52,-6.63,-7.74,-9.28,-8.51,-7.5,-6.17,-4.59,-2.91,-1.2,0.46,2.21,4.32,6.22,7.74,8.94,9.68,10.06,10.51,11.13,11.54,11.48,11.12,11.03,11.15,11.21,11.21,10.58,9.75,9.4,9.64,9.31,8.1,7.41,7.01,6.62,6.25,5.35,4.65,4.32,4.65,5.37,5.86,6.85,7.41,7.32,7.13,7.24,7.15,5.38,7.64,9.18,9.84,10.35,10.92,10.9,10.56,10.71,11.55,11.73,10.97,11.13,11.45,11.44,11.57,11.77,12.25,12.9,13.6,14.26,15.15,16.16,18.4,21.0,22.77,23.36,23.27,22.67,21.81,21.08,20.42,19.45,18.7,17.87,17.22,16.71,16.36,15.46,13.5,12.1,11.09,10.65,10.22,9.22,7.24,6.73,6.66,6.98,7.95,9.04,10.25,11.35,12.9,13.54,13.64,13.62,13.85,14.44,15.07,15.13,14.51,13.57,12.88,12.84,12.43,11.91,12.0,12.5,11.88,11.46,10.69,7.11,4.42,3.86,4.36,5.79,7.05,8.07,8.53,8.43,8.75,8.71,8.91,8.89,8.26,8.19,8.17,7.58,6.66,5.92,5.57,4.64,2.91,1.27,0.19,-0.98,-2.55,-2.91,-1.94,-0.45,0.92,2.21,3.65,4.17,4.06,4.39,5.19,7.07,8.15,9.27,9.3,9.49,8.84,8.66,8.26,7.57,7.79,7.96,8.4,7.08,5.86,5.29,5.46,5.44,4.97,4.96,4.92,5.38,6.31,7.4,8.35,9.24,9.77,10.44,11.15,11.75,12.18,12.26,12.12,11.88,11.31,11.57,11.24,11.31,11.52,12.58,12.73,12.61,12.47,12.31,12.15,11.87,11.38,11.12,10.72,10.26,10.21,9.56,8.88,8.89,9.22,9.21,8.8,9.53,9.42,6.8,5.65,5.92,6.53,3.68,-5.77,-4.74,-4.74,-4.56,-4.13,-3.65,-3.02,-2.64,-1.95,-1.47,-0.23,-0.41,0.87,0.71,1.02,0.13,-2.42,-1.99,-2.61,-3.75,-5.33,-5.54,-5.62,-6.13,-6.17,-5.86,-5.23,-5.19,-5.08,-4.44,-4.07,-3.98,-4.17,-4.23,-3.61,-3.35,-2.4,-1.9,-2.06,-2.52,-2.74,-1.52,-0.86,-0.85,-1.28,-1.01,-0.11,0.57,1.49,2.23,2.53,2.0,1.42,1.47,1.55,1.73,2.24,2.89,3.84,4.8,5.88,6.78,7.27,7.74,8.17,8.55,8.7,9.01,9.05,9.09,9.37,10.14,11.27,12.51,14.2,15.57,15.18,14.12,11.99,11.36,11.88,12.47,13.51,14.5,15.38,15.62,14.33,12.73,12.38,12.81,12.99,13.76,13.88,13.02,12.19,11.78,11.75,12.19,12.47,12.58,12.17,11.62,12.05,12.38,11.85,12.05,12.74,13.01,13.22,12.56,10.63,9.83,10.07,9.27,8.45,8.39,8.49,8.3,8.78,9.23,9.29,9.74,10.02,10.51,11.19,11.42,10.97,9.84,9.41,9.3,9.06,8.72,8.12,7.53,6.32,3.97,1.58,-0.95,-3.47,-5.42,-7.33,-8.8,-9.24,-3.25,-2.47,-1.42,-0.28,0.75,1.75,2.74,4.17,5.8,7.2,8.22,8.92,9.6,10.43,11.21,11.59,11.66,11.42,10.97,10.62,10.25,9.98,10.11,10.4,10.49,10.2,9.97,9.91,9.49,8.61,8.19,8.12,8.02,7.35,6.56,6.31,6.19,5.61,4.26,3.85,3.05,2.96,3.59,4.83,6.44,6.91,5.46,3.72,7.84,8.8,9.9,9.05,6.5,5.4,5.45,6.39,8.53,10.83,11.97,11.47,11.52,8.96,7.67,7.65,7.87,9.14,10.16,10.23,10.86,11.44,13.31,17.14,20.56,21.36,20.83,19.99,19.49,18.85,17.85,16.71,15.68,14.63,13.59,12.49,11.45,10.45,9.26,8.67,8.2,7.11,4.75,3.9,4.32,5.59,7.09,8.52,9.89,11.28,12.46,13.47,14.17,14.8,15.09,15.55,16.11,16.09,16.14,15.97,15.12,14.31,14.09,13.93,12.95,12.16,12.54,11.52,11.15,9.38,5.4,2.74,1.89,3.24,4.69,6.23,7.35,7.9,8.11,8.15,8.22,7.98,8.06,8.12,8.75,9.3,9.49,8.98,8.19,7.39,6.87,5.95,5.11,3.33,2.15,2.56,3.18,4.09,4.61,4.9,5.03,5.44,6.05,5.94,5.89,6.6,7.86,10.04,10.98,10.9,10.94,10.34,9.57,9.15,8.66,8.37,8.16,8.22,7.42,4.61,3.63,4.01,4.49,5.12,5.36,5.44,6.04,6.91,7.93,8.9,9.37,9.71,10.72,11.52,11.57,11.7,11.95,11.72,11.61,11.69,11.52,11.85,12.29,12.49,14.12,13.73,13.09,13.14,13.3,12.92,12.47,11.68,10.74,9.9,9.14,8.78,8.38,8.82,9.39,9.05,9.41,9.82,9.83,7.93,5.71,5.2,5.07,-0.33,-7.17,-6.15,-3.92,-2.91,-0.71,2.08,3.56,3.56,4.31,4.69,4.16,4.36,3.32,3.24,2.76,1.85,2.1,-2.09,-1.68,-2.12,-4.35,-4.6,-6.43,-5.93,-5.9,-5.61,-5.24,-4.62,-4.21,-4.31,-3.96,-3.83,-3.53,-3.37,-3.06,-2.57,-1.78,-1.71,-1.17,-1.32,-1.46,-1.57,-1.57,-0.87,0.87,1.76,2.03,3.04,3.87,3.33,1.83,0.83,0.98,1.24,1.26,0.47,0.8,1.19,1.39,2.17,2.87,3.29,3.62,4.35,5.01,5.52,5.87,6.85,7.89,8.99,9.72,10.42,11.3,11.99,12.58,13.39,13.96,14.0,13.57,13.03,13.07,13.86,14.74,15.47,15.71,15.48,15.49,15.22,14.65,14.31,14.45,14.81,15.39,15.61,15.37,14.09,13.47,13.22,13.61,13.52,13.66,13.54,13.48,13.14,13.21,13.77,13.85,13.28,14.06,12.4,12.29,12.23,11.46,10.17,9.15,9.03,8.97,8.84,8.26,7.92,7.89,8.56,9.66,10.46,10.95,10.94,10.2,9.54,9.1,9.04,9.17,8.83,8.16,7.51,7.09,6.7,6.14,4.78,2.97,0.89,-0.96,-2.34,-3.23,-3.51,3.35,3.63,3.99,4.47,5.06,5.81,6.7,7.71,8.67,9.59,10.41,11.06,11.67,12.15,12.33,11.97,11.01,10.23,9.84,9.84,10.24,10.68,11.04,11.58,11.7,11.15,10.17,9.54,9.18,8.72,8.71,8.87,8.77,8.03,6.63,5.98,6.37,4.92,4.31,4.31,4.77,5.44,5.59,5.49,5.36,4.92,4.81,5.03,3.46,0.68,0.91,3.01,4.07,4.09,4.38,3.85,2.97,4.42,4.23,-1.04,-2.49,2.65,4.79,6.61,7.68,8.13,8.46,8.22,7.6,6.87,6.55,7.27,10.92,17.01,17.89,16.76,16.11,15.41,14.21,12.64,11.41,10.32,9.36,8.39,7.65,7.12,6.26,5.31,3.8,2.03,1.34,2.11,3.67,5.75,7.89,9.69,10.95,12.21,13.77,14.82,15.4,15.73,15.97,16.36,16.67,17.11,16.99,17.14,16.76,15.86,15.31,15.11,14.24,13.2,12.81,11.86,10.46,7.13,1.99,0.43,0.62,1.89,3.69,5.22,6.17,6.64,6.62,6.82,7.53,8.44,8.9,9.23,9.4,9.79,10.21,10.49,10.41,9.73,8.88,8.22,8.14,7.78,6.79,5.61,5.33,6.0,5.85,5.63,5.39,5.41,5.68,7.03,7.29,8.08,9.68,10.36,10.18,10.8,11.24,10.69,10.0,9.8,9.23,8.53,7.84,7.52,6.33,4.42,3.54,4.34,3.82,4.22,5.44,5.74,6.3,7.3,8.25,8.79,9.28,10.21,11.02,11.06,11.32,11.6,11.82,11.65,11.51,11.78,12.28,12.58,13.22,14.36,14.15,14.11,14.33,14.62,13.99,12.87,12.17,11.04,10.26,9.58,8.92,8.39,8.68,9.04,8.67,8.82,10.71,11.31,7.63,4.93,4.13,-2.46,-7.47,-7.42,-6.24,-3.16,0.57,3.54,5.98,7.19,8.57,9.0,9.17,8.87,8.86,8.39,6.44,5.42,4.82,2.67,2.55,-2.44,-2.98,-3.66,-5.75,-4.85,-5.68,-5.77,-4.44,-4.81,-4.06,-3.79,-3.08,-2.66,-2.36,-2.34,-2.41,-2.62,-1.99,-0.7,0.48,1.09,1.59,2.13,2.57,2.9,3.4,3.76,4.18,4.92,3.94,1.94,0.46,0.51,1.31,1.98,2.46,2.75,3.06,3.14,3.23,3.56,4.07,4.71,5.42,5.86,6.28,6.61,6.93,7.38,7.78,7.92,8.22,8.45,8.67,8.87,8.57,8.16,8.4,8.97,9.29,9.1,9.0,9.25,9.77,10.75,12.1,12.83,13.08,13.24,13.72,14.34,14.72,14.77,14.45,14.26,14.43,14.91,15.38,15.53,15.43,16.31,15.85,14.72,14.27,14.35,14.82,15.21,15.34,15.05,14.9,14.35,13.5,14.08,12.87,11.07,10.61,9.79,9.17,8.43,8.22,8.66,8.69,8.62,9.24,8.63,8.05,8.02,7.66,6.41,5.85,5.56,5.28,5.49,6.17,6.81,7.21,7.1,6.86,6.66,6.05,5.48,5.27,4.92,4.31,3.68,3.27,3.18,6.39,6.77,7.22,7.73,8.24,8.87,9.51,10.21,10.85,11.39,11.72,11.94,12.0,11.55,10.56,9.4,8.62,8.82,9.56,10.38,10.99,11.16,10.61,10.02,10.29,10.32,8.93,8.47,8.09,7.77,7.87,7.99,7.1,5.78,5.52,4.99,4.01,3.95,4.45,4.85,5.34,5.79,5.95,6.42,7.12,7.26,7.08,6.11,4.52,4.43,3.55,3.88,5.46,4.18,-1.86,-2.0,-0.76,-0.09,0.39,1.82,3.79,6.06,7.87,9.41,10.5,10.85,10.49,9.74,9.12,7.83,6.67,5.84,4.39,3.47,8.95,13.76,12.95,11.6,10.59,9.51,8.15,6.96,6.19,5.42,4.5,2.8,0.41,-1.59,-2.59,-2.01,-0.35,1.78,4.54,7.2,9.57,11.49,12.87,13.89,14.84,15.82,16.56,17.11,17.54,17.7,17.77,17.75,17.63,17.46,17.38,16.59,16.2,15.65,14.95,14.2,13.13,11.94,9.46,3.05,-0.95,-1.47,-0.39,1.24,3.15,4.52,5.27,5.66,5.74,6.78,7.67,8.49,9.29,9.81,10.33,10.67,10.74,10.93,10.87,10.76,10.74,10.42,9.8,9.09,9.05,8.66,7.69,6.87,6.47,5.32,4.89,5.17,6.24,7.48,8.29,9.27,10.31,10.14,9.93,9.76,9.81,9.6,9.22,8.51,8.2,6.92,5.77,5.41,4.56,2.55,2.13,2.69,2.78,3.4,4.93,5.65,6.42,7.38,7.95,8.92,9.86,10.28,10.5,10.9,11.01,11.2,11.49,11.75,11.89,12.0,12.6,12.8,14.2,15.2,15.06,14.66,14.21,13.18,12.15,11.37,10.78,10.24,9.47,8.92,8.28,7.47,7.37,7.77,8.65,10.06,8.58,4.74,1.16,-4.87,-8.53,-8.12,-7.26,-5.47,-2.62,1.63,5.86,9.06,11.42,13.13,14.07,14.51,13.89,12.61,10.92,7.64,5.95,4.42,3.77,2.33,0.95,-3.95,-4.08,-4.5,-5.59,-4.88,-4.35,-4.37,-3.44,-4.24,-3.55,-2.84,-2.18,-1.72,-1.54,-1.41,-1.06,-0.36,0.38,1.06,1.4,1.56,2.27,2.53,3.01,2.97,2.41,0.97,-1.08,-1.32,0.14,1.74,2.9,3.76,4.46,5.03,5.56,5.93,6.04,6.21,6.41,6.71,7.34,8.02,8.6,9.06,9.3,9.29,9.3,9.35,9.47,9.7,10.22,10.74,10.96,11.1,11.02,11.41,11.61,11.64,11.6,11.41,11.99,11.45,11.45,12.2,12.67,12.63,12.4,12.4,12.92,13.81,14.59,14.97,14.39,14.14,14.37,14.88,15.41,15.57,17.5,17.33,16.37,15.58,15.3,15.62,16.07,16.43,16.54,16.05,15.03,14.15,12.75,12.16,11.94,10.72,9.93,9.19,8.75,8.06,7.14,7.9,7.01,2.84,2.67,2.93,2.08,-0.15,-2.3,-2.46,-1.13,0.69,2.75,4.67,5.49,5.04,4.69,5.51,6.78,6.9,6.47,6.33,6.13,5.82,5.6,5.6,5.79,6.06,7.26,8.03,8.66,9.24,9.66,10.03,10.4,10.64,10.75,10.54,10.04,9.32,8.66,8.12,7.96,8.12,8.38,8.84,9.44,9.92,10.22,10.38,10.44,10.32,9.82,9.23,7.69,7.27,6.94,6.78,6.81,6.5,4.98,4.6,4.69,4.14,4.11,4.35,4.74,5.31,5.83,5.91,6.03,6.32,6.8,7.27,7.16,6.97,5.9,6.4,1.15,-3.35,-3.72,-2.5,-1.35,0.17,1.6,2.75,3.95,5.13,6.39,7.79,9.1,10.25,11.15,11.56,11.54,11.31,11.01,10.05,7.93,6.6,4.7,0.62,-3.65,-5.85,-0.99,4.85,5.66,3.2,-0.08,-2.93,-5.52,-7.51,-8.4,-8.22,-7.05,-5.41,-3.08,-0.31,2.72,5.51,7.86,9.71,11.26,12.84,14.37,15.68,16.68,17.39,17.91,18.54,19.11,19.65,20.04,19.98,19.64,19.0,18.17,17.29,16.45,15.63,15.05,14.81,12.98,11.49,5.48,-0.45,-2.45,-1.67,-0.4,1.64,3.34,4.37,4.52,5.5,6.49,7.52,8.63,9.67,10.3,10.87,11.32,11.2,11.18,11.24,10.77,11.14,11.17,11.16,10.91,10.3,9.51,9.25,8.97,8.26,6.92,5.53,4.97,5.0,5.9,7.27,8.93,9.81,10.49,11.18,10.18,9.51,9.01,8.0,7.21,5.87,4.64,4.08,3.12,2.51,0.6,-1.01,-1.24,0.21,0.7,1.53,3.76,5.21,6.54,7.34,8.4,9.05,9.63,9.74,9.9,10.09,10.2,11.02,11.52,11.52,11.8,12.46,13.01,13.41,13.82,14.02,15.13,14.75,13.5,11.9,11.27,10.4,9.5,8.11,6.89,6.93,6.85,6.85,7.13,7.92,8.37,6.59,0.69,-6.6,-9.3,-9.08,-8.39,-7.95,-6.33,-3.58,0.2,4.1,8.01,11.68,15.05,17.88,19.0,17.92,15.53,11.52,8.01,4.94,2.28,1.07,0.56,-0.05,-2.52,-5.13,-4.45,-5.26,-5.3,-4.06,-3.57,-3.76,-4.03,-3.91,-3.07,-2.17,-1.31,-0.73,-0.55,-0.25,-0.07,0.37,-0.16,-0.17,0.22,-0.12,-0.62,-1.16,-1.42,-1.22,-0.52,0.52,1.56,2.69,3.78,4.52,5.03,5.45,5.9,6.58,7.13,7.37,7.06,7.24,7.81,8.48,9.26,9.91,10.33,10.32,10.15,10.32,10.66,10.97,11.15,11.23,11.7,12.18,12.48,12.4,12.11,11.86,12.16,12.95,13.26,13.97,14.03,13.67,13.93,14.32,14.47,14.74,14.96,14.99,15.25,16.0,16.62,16.77,16.82,16.4,16.0,16.91,17.32,17.41,16.92,16.38,15.63,15.33,14.99,15.01,14.72,14.69,14.51,13.78,12.96,12.73,11.82,9.65,9.29,9.18,8.97,8.54,8.56,7.98,7.24,7.76,7.61,6.17,5.79,6.26,4.94,3.45,2.27,1.8,1.93,2.15,2.05,1.77,1.4,1.58,1.6,1.14,0.48,0.52,0.81,0.99,1.45,2.23,3.21,4.35,5.4,6.35,3.57,3.97,4.28,4.41,4.4,4.22,4.16,4.26,4.5,4.92,5.49,6.17,6.83,7.58,8.37,9.07,9.44,9.59,9.71,9.75,9.75,9.65,9.4,8.81,8.64,7.72,6.52,6.36,6.15,6.32,6.36,5.7,4.69,4.83,4.77,4.7,4.74,4.62,5.04,5.23,5.06,5.54,5.7,6.27,7.16,6.29,4.28,2.75,4.49,-1.33,-3.7,-1.75,-0.69,0.92,2.16,3.7,5.05,6.57,7.55,8.46,8.99,9.48,9.93,10.22,10.07,10.04,10.3,10.29,10.02,9.83,9.38,7.89,5.24,3.0,-0.85,-5.15,-8.39,-11.63,-13.43,-13.72,-13.5,-12.66,-11.27,-9.74,-7.75,-5.53,-3.02,-0.52,1.81,4.21,6.47,8.52,10.23,11.52,12.8,13.94,15.12,16.13,17.01,18.24,19.71,21.19,22.4,23.27,23.76,23.59,22.57,21.01,19.31,17.62,16.12,14.61,13.8,13.31,12.16,6.76,-1.16,-3.38,-3.15,-1.62,0.14,1.46,2.48,4.01,5.54,6.65,8.03,9.28,10.26,11.22,11.8,11.79,11.78,11.61,11.24,10.69,11.33,11.16,8.83,7.85,8.06,8.33,8.24,7.56,7.31,6.52,6.24,5.55,4.93,5.32,6.49,7.91,8.67,10.14,11.19,11.37,10.27,8.45,6.77,5.26,3.67,2.81,1.96,0.68,0.08,-1.48,-2.95,-3.11,-2.42,-1.45,-0.73,1.3,3.63,5.44,6.43,7.39,8.14,8.33,8.5,8.89,8.89,9.07,9.85,10.74,11.38,11.29,11.43,12.12,12.33,12.31,12.72,13.78,12.7,8.78,6.24,6.65,6.7,6.66,6.34,4.75,4.18,4.61,5.66,6.22,6.11,7.23,3.15,-5.59,-9.06,-10.05,-9.01,-8.57,-8.1,-6.97,-5.44,-2.88,0.26,3.26,5.94,8.49,8.93,3.39,0.75,-0.46,-2.15,-2.21,-2.39,-2.9,-3.2,-3.35,-2.74,-3.6,-5.31,-5.79,-4.53,-4.53,-3.81,-3.61,-3.73,-3.67,-3.58,-3.21,-2.42,-1.52,-0.72,-0.24,0.21,0.64,1.61,1.76,0.98,0.31,0.28,0.51,0.63,0.87,1.27,1.84,2.65,3.47,4.26,4.98,5.58,6.09,6.52,6.87,7.2,7.56,7.9,8.3,8.85,9.41,9.87,10.21,10.54,10.79,10.87,10.8,10.74,11.18,11.79,12.11,12.31,12.41,12.72,13.08,13.37,13.49,13.15,12.73,12.53,13.29,14.43,14.95,15.17,15.21,15.33,15.75,16.48,17.15,17.4,17.71,18.14,18.57,18.82,18.86,18.7,18.07,17.33,14.82,13.91,13.7,14.18,14.39,14.32,14.23,12.72,11.97,12.9,12.64,11.74,11.16,10.75,10.52,9.09,7.3,7.12,7.3,7.57,7.71,7.62,7.48,6.94,7.21,7.24,6.63,6.05,5.9,4.84,3.74,2.91,2.65,2.81,2.9,3.07,3.27,3.51,3.78,3.86,3.76,3.68,3.15,0.27,-0.29,1.13,2.08,2.42,2.62,2.87,3.18,5.41,5.5,5.68,5.91,6.21,6.58,6.96,7.34,7.75,8.18,8.54,8.96,9.34,9.71,10.02,10.23,10.33,10.33,10.14,9.76,9.31,8.89,8.6,8.31,7.85,6.45,5.27,5.42,5.68,6.09,6.2,6.02,5.64,5.74,5.83,5.89,5.83,5.45,5.24,4.33,3.62,3.4,3.46,4.09,2.51,-0.24,-0.39,-1.48,-4.28,-2.53,-1.24,-0.24,1.59,4.32,7.07,8.67,8.8,9.63,10.91,10.57,9.84,9.26,9.03,8.08,7.74,7.87,7.97,7.38,7.04,7.37,7.34,6.23,5.12,4.85,3.75,1.99,-0.26,-2.68,-4.53,-5.64,-5.87,-5.28,-4.22,-2.75,-1.4,-0.73,0.59,3.26,4.78,6.02,7.45,9.07,10.62,11.91,12.88,13.99,13.32,15.45,15.71,13.12,13.21,13.38,14.43,16.05,18.91,21.61,21.25,18.44,15.43,13.67,12.45,12.66,14.77,13.18,1.79,-6.05,-7.01,-5.68,-4.11,-2.8,-0.53,1.66,3.66,5.48,7.04,8.36,9.77,10.98,11.85,12.3,12.58,12.53,11.94,11.3,10.87,11.36,10.03,5.48,4.61,4.57,4.93,4.65,4.02,3.3,3.13,3.2,3.48,3.96,4.77,5.89,6.45,7.38,8.66,9.66,9.53,8.7,7.24,5.63,3.66,2.16,1.08,0.1,-0.78,-1.38,-2.35,-2.87,-2.95,-2.58,-1.88,-1.51,-0.17,2.31,4.28,5.67,6.44,7.03,7.37,7.57,7.47,7.49,7.99,8.57,9.85,10.44,10.4,10.35,10.48,10.75,10.89,11.22,10.0,10.02,5.04,2.8,3.28,2.36,1.78,1.57,1.31,1.87,2.83,3.26,3.28,3.96,4.73,-3.56,-9.67,-10.62,-10.65,-9.41,-9.18,-8.43,-8.0,-7.17,-5.83,-4.22,-1.88,-0.55,0.56,0.28,-3.64,-6.83,-9.93,-10.98,-11.71,-11.36,-10.18,-9.3,-8.18,-6.65,-5.87,-6.42,-6.18,-5.45,-4.24,-3.62,-3.21,-3.06,-3.1,-2.83,-2.54,-2.18,-1.54,-0.76,-0.03,0.38,1.41,2.27,2.23,1.45,0.79,0.56,0.68,0.92,1.29,1.85,2.53,3.26,4.03,4.78,5.48,6.15,6.8,7.37,7.98,8.23,8.33,8.46,8.79,9.15,9.91,10.46,10.87,11.11,11.15,11.11,11.02,11.14,11.35,11.41,11.68,12.14,12.75,13.17,12.87,12.58,12.33,12.67,13.17,13.43,13.71,14.04,14.41,14.82,15.34,15.9,16.48,17.08,17.71,17.54,18.16,17.43,16.95,16.94,16.51,16.98,16.91,14.48,14.03,13.33,11.9,11.56,10.66,9.52,8.62,7.9,7.89,8.81,9.03,8.32,8.13,7.97,8.82,9.0,7.31,5.37,4.7,5.21,6.08,6.38,6.8,6.85,6.24,5.92,5.81,5.83,5.69,4.98,4.37,4.07,3.99,4.33,4.57,4.89,5.1,5.36,5.65,5.8,5.8,5.82,5.91,5.93,5.98,5.9,5.79,5.68,5.56,5.43,5.33,5.34,6.49,6.44,6.48,6.59,6.75,7.0,7.28,7.58,7.92,8.26,8.57,8.86,9.1,9.29,9.42,9.48,9.49,9.51,9.57,9.55,9.42,9.19,8.76,7.97,7.0,5.65,4.83,5.14,5.64,6.02,6.03,5.94,5.69,5.26,4.84,4.55,4.53,5.03,5.09,3.44,2.57,1.54,1.02,1.11,-1.21,-1.69,-1.42,-0.01,1.35,1.06,2.47,4.13,5.89,7.72,8.89,8.45,8.83,11.61,12.07,8.25,7.56,6.49,5.21,4.0,3.65,3.53,4.16,3.68,4.01,5.56,5.46,5.73,5.78,5.17,4.15,3.75,4.47,3.89,2.25,0.97,0.1,-0.07,-0.04,-0.06,-0.29,0.68,1.68,2.86,4.43,6.83,7.79,7.71,8.01,6.57,4.52,2.22,0.69,0.31,0.33,0.08,-0.03,-0.2,-0.36,-1.53,-4.86,-7.78,-7.45,-3.61,1.51,4.65,2.55,-4.39,-10.88,-12.68,-12.11,-10.67,-8.15,-5.89,-3.32,-0.63,1.49,3.17,4.31,5.53,7.16,8.6,9.67,10.86,12.38,13.35,12.89,11.4,10.39,9.32,10.72,7.9,2.96,2.74,1.74,0.52,-0.29,-1.49,-2.13,-1.47,0.14,1.5,2.74,3.84,4.92,5.92,6.7,7.45,8.28,8.51,7.75,6.14,3.76,1.69,0.33,-0.79,-1.48,-2.26,-2.53,-3.05,-3.09,-2.32,-2.04,-1.99,-1.71,-1.27,0.33,2.0,3.51,4.69,5.92,6.69,6.62,6.43,6.28,6.72,7.6,8.14,9.03,9.41,9.4,9.16,9.09,9.11,9.85,9.13,7.49,7.13,4.51,3.53,3.18,2.77,2.1,1.68,1.5,1.33,1.35,1.6,2.17,-1.8,-9.49,-11.63,-12.35,-11.45,-10.14,-9.9,-9.59,-9.42,-8.77,-7.88,-6.86,-6.05,-5.11,-4.77,-5.06,-6.69,-9.32,-11.37,-14.44,-14.73,-14.76,-13.79,-12.5,-11.14,-9.26,-8.32,-7.65,-7.1,-6.19,-5.1,-4.73,-4.07,-3.45,-3.11,-2.83,-2.7,-2.45,-1.96,-0.79,0.19,0.71,0.87,1.04,1.21,0.51,-0.49,-1.32,-1.67,-1.49,-0.8,-0.08,0.78,1.91,3.07,4.08,5.01,5.88,6.65,7.26,7.79,8.62,9.38,9.8,9.85,10.25,10.71,11.35,11.89,12.27,12.29,11.93,11.72,12.04,12.26,12.28,12.38,12.45,12.27,11.86,11.89,12.4,12.79,13.07,13.2,13.28,13.28,13.32,13.5,14.03,14.41,14.59,14.76,15.6,15.51,15.06,16.13,16.64,17.06,15.02,15.77,15.41,13.58,12.07,9.4,8.94,8.27,7.55,7.67,7.89,8.22,8.46,8.7,9.03,9.24,8.77,7.93,8.41,7.84,6.73,4.85,4.84,3.65,3.74,4.59,5.49,5.77,5.65,6.02,6.0,5.2,5.18,5.21,5.17,5.02,5.18,5.43,5.91,6.48,6.89,7.2,7.56,7.86,8.06,8.15,8.09,7.93,7.71,7.59,7.56,7.56,7.43,7.19,7.03,6.92,6.77,6.59,8.62,8.4,8.27,8.18,8.11,8.09,8.13,8.28,8.5,8.73,8.96,9.05,9.18,9.33,9.49,9.69,9.81,9.83,9.86,9.73,9.44,9.08,8.58,7.42,6.04,4.96,4.65,5.08,5.58,5.76,5.69,5.37,4.91,4.7,4.99,5.53,5.91,5.76,5.05,4.46,3.93,3.47,2.76,2.77,3.37,3.19,3.71,3.8,4.33,6.11,7.88,9.14,9.86,10.48,8.48,7.79,8.34,6.2,4.82,7.0,5.27,3.2,2.07,1.15,0.8,1.49,2.62,3.34,3.9,4.52,5.31,4.67,5.4,5.43,5.05,4.23,2.26,1.3,2.58,3.57,0.53,0.35,2.35,1.51,-0.19,0.75,2.04,2.45,1.69,-0.08,-1.62,-2.48,-3.08,-3.88,-4.14,-4.01,-3.41,-3.17,-2.92,-3.0,-4.24,-6.09,-7.44,-8.25,-9.95,-11.73,-13.11,-14.49,-15.51,-15.76,-16.04,-15.05,-13.56,-12.32,-11.11,-7.5,-5.82,-3.94,-2.66,-1.51,-0.5,0.95,2.18,2.94,4.38,5.26,5.04,3.47,-2.17,-6.33,-6.71,-4.59,-0.47,0.2,-6.69,-8.49,-8.0,-8.24,-7.3,-6.44,-5.66,-4.42,-1.79,1.27,3.25,3.54,3.9,4.66,5.41,6.11,6.31,6.7,6.77,6.1,4.44,2.07,-0.08,-1.39,-2.28,-2.92,-3.54,-4.12,-4.0,-3.28,-2.7,-2.91,-2.68,-2.32,-1.79,-0.39,1.46,2.87,3.17,3.62,4.49,4.74,5.07,5.35,5.67,6.42,7.09,7.73,8.28,8.32,8.15,8.27,8.17,8.05,8.91,7.98,6.88,6.81,4.94,2.56,2.98,3.82,3.8,3.08,1.96,0.2,-2.58,-6.09,-10.08,-11.95,-12.58,-13.12,-12.24,-11.4,-10.75,-10.47,-10.32,-9.46,-8.4,-8.24,-8.63,-8.85,-8.57,-9.04,-10.06,-11.51,-13.22,-14.21,-13.39,-14.11,-14.0,-12.98,-12.01,-10.85,-9.66,-8.77,-8.2,-7.9,-6.95,-5.7,-4.8,-4.86,-4.67,-4.18,-3.49,-2.23,-1.15,-0.9,0.02,0.32,-0.61,-1.5,-2.13,-2.69,-3.47,-4.28,-4.51,-3.54,-2.08,-0.83,0.43,1.7,2.91,4.08,5.17,6.03,6.91,7.89,8.71,9.47,10.19,10.96,11.84,11.82,11.82,11.97,12.45,12.86,13.16,13.02,12.52,12.28,12.47,12.79,12.72,12.37,11.79,11.01,10.8,11.55,12.05,12.12,12.41,12.49,12.49,12.71,13.21,13.53,13.64,13.47,13.11,13.18,13.82,13.31,9.4,4.14,2.08,2.33,4.72,2.4,4.37,6.22,6.89,7.52,8.07,8.37,8.43,8.32,7.86,7.63,7.92,8.38,8.51,8.02,8.06,8.36,7.5,4.93,2.01,0.47,0.31,1.0,1.64,1.29,0.71,2.52,5.58,6.84,6.81,6.39,5.7,5.52,5.9,6.32,6.84,7.57,8.1,8.49,8.9,8.86,8.53,8.64,9.07,9.36,9.44,9.26,9.27,9.35,9.37,9.35,9.29,9.26,9.1,8.97,8.94,8.86,9.15,8.92,8.71,8.64,8.54,8.5,8.66,8.84,8.98,9.13,9.32,9.58,9.84,9.98,10.05,10.1,10.09,9.96,9.65,9.47,9.5,9.07,7.24,4.95,3.82,3.61,3.98,4.37,4.73,4.9,4.72,4.46,4.62,5.03,5.39,5.76,6.19,6.63,7.01,6.97,6.76,6.89,6.75,6.45,6.18,7.93,8.71,8.19,9.47,9.5,10.03,10.68,6.38,5.76,6.35,5.61,2.48,2.46,4.03,4.44,3.83,2.85,2.3,2.43,2.1,1.76,2.25,1.85,1.84,2.58,3.59,5.59,5.87,3.95,3.15,2.64,1.78,0.96,0.64,0.56,-2.11,-2.57,-2.89,-3.78,-4.79,-5.7,-5.94,-5.94,-6.29,-6.89,-7.15,-7.01,-7.08,-6.7,-6.7,-6.99,-6.63,-7.12,-7.63,-7.18,-9.09,-11.6,-12.84,-14.92,-13.7,-12.04,-11.34,-10.94,-11.34,-11.54,-11.41,-11.54,-10.44,-8.72,-6.61,-5.16,-4.22,-3.55,-3.01,-2.57,-1.75,-0.88,0.19,-0.71,-2.35,-2.99,-4.48,-5.32,-6.07,-7.26,-8.87,-9.15,-9.89,-9.92,-9.8,-8.76,-7.49,-7.06,-6.69,-5.66,-4.54,-3.43,-2.07,-0.44,1.33,3.21,4.54,4.56,4.46,4.68,4.44,3.64,2.85,1.68,-0.34,-1.91,-3.52,-4.28,-4.82,-5.12,-4.8,-4.31,-3.97,-3.42,-3.06,-3.05,-2.93,-2.42,-1.21,-0.86,-1.56,-1.23,0.43,1.93,2.53,3.09,4.09,4.44,5.29,6.2,6.82,7.33,7.62,7.69,7.9,8.17,8.25,8.56,7.64,7.35,7.28,6.67,4.66,2.38,0.7,-0.85,-3.07,-5.77,-7.59,-8.85,-10.26,-11.66,-12.35,-12.68,-12.72,-11.79,-11.21,-10.68,-10.41,-10.71,-9.84,-9.19,-9.59,-10.03,-10.74,-10.95,-11.44,-11.85,-12.64,-13.86,-15.22,-16.31,-16.8,-15.89,-14.13,-12.25,-10.92,-10.19,-9.64,-8.93,-8.36,-8.26,-7.95,-7.28,-6.87,-6.04,-5.11,-5.02,-4.9,-4.51,-4.07,-3.8,-4.08,-4.74,-5.41,-5.77,-5.85,-5.53,-4.65,-3.23,-1.51,0.1,1.71,3.26,4.54,5.46,6.11,6.8,7.55,8.46,9.38,10.3,11.05,11.74,12.53,13.28,13.84,14.0,13.69,13.58,13.53,13.66,13.79,13.56,13.09,13.18,13.64,12.92,11.93,11.38,10.84,10.77,11.19,11.51,11.68,11.89,12.14,12.61,12.56,12.24,12.35,12.37,12.74,13.38,12.32,12.34,9.91,7.74,2.59,0.06,-0.93,-0.55,1.33,2.64,3.56,4.63,5.52,6.31,6.98,7.59,8.19,8.55,8.66,8.47,8.04,7.57,7.24,6.75,5.57,2.86,0.13,-1.83,-3.26,-3.43,-2.75,-3.4,-5.96,-6.7,-6.53,-6.22,-6.08,-6.33,-6.7,-7.1,-5.69,-1.8,1.97,3.6,4.46,4.5,3.52,2.4,3.03,5.34,7.52,8.48,8.75,8.91,9.07,9.4,9.62,9.83,10.03,10.2,10.3,10.21,9.99,9.76,9.57,9.39,8.5,7.93,7.54,7.4,7.53,7.85,8.21,8.46,8.71,9.2,9.74,9.82,9.32,8.74,8.38,8.42,8.91,9.47,9.3,7.67,4.63,1.7,0.83,1.42,1.88,2.1,2.49,3.21,3.88,4.26,4.79,5.25,5.31,5.11,5.11,5.74,6.82,8.14,8.8,7.47,6.12,6.92,7.92,7.12,6.2,5.67,2.55,0.7,0.06,-1.31,0.35,3.22,3.03,2.51,0.44,-0.32,0.66,1.03,1.15,0.86,0.53,0.91,1.61,0.63,-0.88,0.19,0.05,-1.76,-2.67,-2.57,-2.52,-2.64,-4.95,-4.28,-1.19,0.26,-1.96,-6.35,-9.38,-9.95,-9.2,-9.19,-8.96,-8.81,-8.96,-9.26,-9.05,-8.74,-8.35,-8.35,-8.33,-8.75,-8.6,-7.88,-7.21,-6.0,-4.02,-4.51,-2.8,-0.12,1.21,1.58,-9.51,-12.67,-9.56,-12.78,-12.42,-11.79,-8.75,-5.72,-1.44,0.48,-8.12,-10.29,-6.62,-5.23,-3.63,-3.73,-3.13,-2.89,-2.56,-1.92,-1.69,-1.72,-3.78,-5.66,-6.18,-5.75,-5.99,-6.85,-8.22,-7.81,-9.88,-12.55,-8.58,-6.41,-6.19,-6.07,-5.63,-5.52,-6.74,-7.41,-7.29,-5.56,-3.66,-1.6,1.03,2.91,2.79,2.23,1.85,0.3,-1.31,-3.0,-4.41,-5.51,-6.19,-6.01,-5.9,-5.37,-4.96,-4.99,-4.99,-4.66,-4.03,-3.41,-4.5,-5.99,-6.39,-5.09,-3.82,-3.05,-1.99,-0.5,0.82,1.35,2.15,3.37,4.87,5.82,6.28,6.88,7.43,7.91,8.42,8.65,8.65,8.78,8.23,7.79,7.58,7.14,4.51,1.81,-1.43,-4.71,-6.96,-8.67,-9.95,-11.07,-11.77,-12.02,-12.1,-11.29,-10.4,-10.23,-10.04,-10.24,-10.69,-10.28,-10.29,-10.65,-10.38,-10.62,-11.1,-11.56,-12.06,-12.57,-12.89,-13.45,-14.42,-15.68,-16.91,-18.03,-18.88,-19.3,-19.07,-18.42,-17.54,-16.19,-14.94,-13.86,-13.33,-13.17,-12.63,-12.13,-11.88,-11.8,-11.22,-10.68,-10.09,-9.5,-8.82,-7.86,-6.51,-4.86,-3.18,-1.49,0.35,2.08,3.59,4.8,5.88,7.02,7.99,8.74,9.32,9.7,10.29,10.52,10.86,11.4,11.9,12.38,12.76,13.05,13.44,13.69,13.75,13.81,13.92,14.03,14.19,14.48,14.43,13.53,12.5,12.23,12.21,12.15,11.91,10.83,10.49,10.97,11.64,11.6,11.89,10.43,9.58,9.86,10.51,10.86,10.79,13.22,11.98,4.71,9.09,5.15,-1.94,0.91,1.94,2.64,3.28,4.24,4.54,4.71,4.87,5.07,5.48,6.17,7.14,8.25,9.16,9.6,8.97,7.43,6.58,5.42,3.05,-0.59,-3.02,-4.22,-4.37,-4.38,-5.19,-6.73,-6.71,-6.01,-5.67,-5.52,-5.4,-5.92,-5.99,-6.02,-5.81,-5.17,-4.18,-2.96,-1.57,0.11,1.86,3.4,4.84,5.96,6.93,7.5,8.12,8.79,9.32,9.7,10.11,10.35,10.23,9.99,9.81,9.76,9.85,9.91,9.64,9.15,5.28,6.81,7.77,8.38,9.05,9.86,10.29,9.71,8.46,8.24,7.75,8.69,8.2,7.09,3.9,0.12,-3.32,-4.83,-4.65,-4.18,-3.71,-2.96,-1.92,-0.89,-0.07,0.52,0.99,1.34,1.92,3.18,4.17,4.51,4.8,4.77,3.91,2.46,1.09,2.03,4.72,4.51,-0.04,-5.29,-7.0,-5.77,-4.0,-2.39,-1.69,-2.08,-1.71,-1.53,-2.74,-4.47,-1.67,-1.67,0.95,5.32,6.57,0.44,-1.67,-1.91,-1.71,-1.83,-2.52,-2.51,-1.41,-0.12,-0.8,-1.15,-4.77,-8.15,-7.33,-4.76,-3.2,-5.99,-8.13,-8.53,-9.67,-10.83,-11.12,-10.99,-11.33,-11.48,-11.39,-10.58,-10.91,-10.19,-8.9,-8.78,-8.62,-7.47,-8.73,-10.06,-8.87,-7.63,-7.92,-9.81,-10.75,-9.76,-7.93,-2.36,-11.72,-11.2,-11.13,-12.51,-11.42,-8.67,-7.46,-5.36,-6.01,-6.69,-11.35,-10.14,-9.59,-2.75,4.69,4.54,-1.23,-4.14,-3.18,-3.52,-3.67,-2.98,-3.27,-4.05,-4.96,-6.92,-3.56,-1.1,-3.14,-2.73,-8.89,-7.42,-8.97,-6.45,-5.44,-7.75,-7.28,-8.11,-8.0,-7.95,-7.35,-7.35,-6.47,-11.58,-7.72,-10.57,-9.97,-7.37,-6.0,-4.48,-4.69,-6.28,-7.39,-8.12,-8.62,-9.06,-9.35,-9.45,-9.68,-10.21,-10.47,-10.49,-10.38,-9.71,-9.05,-8.4,-7.31,-6.5,-5.61,-5.17,-4.52,-3.91,-3.29,-2.57,-1.72,-0.19,1.82,3.58,4.44,4.7,5.79,6.61,7.26,8.64,8.86,9.04,8.89,8.81,8.16,7.9,8.32,7.73,4.96,0.96,-1.94,-4.75,-6.92,-8.37,-9.34,-9.96,-10.4,-10.31,-9.36,-9.03,-9.59,-9.75,-9.69,-9.95,-10.11,-10.54,-10.66,-10.27,-10.26,-10.64,-11.05,-11.25,-11.32,-11.58,-11.85,-12.19,-12.83,-13.67,-14.69,-15.88,-17.0,-17.89,-18.6,-19.04,-19.13,-19.01,-18.68,-18.49,-17.87,-17.3,-16.49,-15.26,-13.89,-12.42,-11.18,-9.87,-8.39,-6.95,-5.57,-4.24,-2.94,-1.56,-0.25,0.93,2.45,3.96,5.04,6.13,7.14,8.03,8.69,9.24,9.87,10.57,11.19,11.71,12.13,12.52,12.77,12.94,13.17,13.4,13.63,13.94,14.16,14.32,14.43,14.46,14.43,14.37,13.78,13.52,13.42,12.77,11.91,10.09,8.33,9.91,11.42,9.96,9.34,9.65,10.28,10.42,10.34,10.39,10.34,9.97,8.22,0.24,5.7,2.99,-2.86,-0.18,-1.15,0.48,1.49,2.27,2.38,2.01,2.31,2.63,2.78,3.03,3.42,4.09,4.53,4.6,5.23,6.04,5.54,4.98,4.66,1.0,-3.77,-5.38,-5.43,-5.52,-5.93,-6.06,-6.33,-6.2,-5.68,-5.4,-5.12,-4.72,-4.52,-4.38,-4.15,-3.83,-3.35,-2.61,-1.64,-0.61,0.5,1.66,2.69,3.36,4.14,4.63,4.13,1.67,-0.67,-1.34,-1.3,-1.8,-1.56,-1.32,-1.45,-0.83,-0.74,-1.43,-1.58,-0.74,0.96,3.26,7.18,7.99,7.57,7.08,8.05,8.61,6.08,0.84,-5.39,-7.93,-7.25,-6.77,-7.12,-7.11,-7.1,-7.17,-7.23,-6.63,-6.6,-6.55,-6.09,-5.49,-4.76,-3.64,-2.36,-0.84,1.05,2.79,3.14,3.12,3.44,-1.42,-7.15,-6.93,-3.58,-1.85,-3.22,-6.84,-8.5,-6.44,-4.59,-2.72,-2.65,-2.21,-2.19,-4.89,-4.87,-5.68,3.4,-3.98,-6.01,-5.87,-4.48,-5.59,-2.95,1.43,-0.94,-6.33,-2.43,-1.45,-4.34,-4.05,-4.38,-4.61,-5.01,-5.55,-4.6,-4.56,-4.34,-4.6,-0.85,0.51,1.03,-0.57,-5.9,-7.32,-7.67,-8.79,-10.74,-11.65,-11.51,-11.54,-10.68,-10.33,-10.93,-10.0,-9.63,-9.32,-9.18,-10.28,-10.46,-10.26,-10.46,-10.08,-9.72,-10.25,-12.21,-11.45,-3.75,-6.2,-10.07,-9.14,-12.21,-12.29,-11.57,-8.04,-5.44,-5.09,-5.54,-6.32,-6.92,-4.72,-4.65,-5.33,-6.45,-6.83,-6.26,-5.71,-5.86,-6.69,-7.21,-7.21,-6.53,-6.48,-6.61,-5.89,-5.02,-4.51,-5.8,-6.61,-6.92,-7.18,-8.75,-8.31,-7.51,-7.41,-7.93,-8.71,-9.03,-8.26,-7.99,-7.41,-8.29,-3.78,-10.51,-18.02,-10.67,-9.97,-16.71,-20.13,-19.59,-18.83,-20.77,-21.61,-18.59,-16.1,-16.07,-15.45,-13.69,-12.48,-11.7,-10.57,-9.58,-8.39,-7.39,-6.57,-5.76,-5.11,-4.5,-4.05,-3.75,-3.21,-2.35,-1.18,0.23,1.7,2.86,3.83,4.75,5.41,6.27,6.4,6.55,6.72,7.28,7.93,8.08,7.85,7.59,7.77,7.62,6.92,3.74,0.63,-1.39,-4.42,-6.31,-7.45,-7.99,-8.13,-7.96,-7.84,-8.49,-8.92,-8.99,-8.29,-8.67,-9.08,-9.74,-10.59,-10.55,-10.13,-10.07,-10.2,-10.33,-10.51,-10.85,-11.13,-11.43,-11.78,-12.15,-12.51,-12.88,-13.41,-13.82,-14.07,-14.15,-14.13,-14.01,-13.85,-13.63,-13.28,-12.82,-12.3,-11.63,-10.75,-9.75,-8.84,-8.01,-7.15,-6.32,-5.46,-4.48,-3.33,-2.0,-0.47,1.15,2.64,3.76,4.67,5.66,6.66,7.65,8.7,9.72,10.5,11.19,11.82,12.38,12.92,13.34,13.72,13.98,14.13,14.23,14.29,14.42,14.62,14.68,14.63,14.64,13.71,11.39,11.18,10.75,10.46,10.43,10.2,9.43,8.76,8.74,9.05,9.29,9.59,9.66,10.39,10.86,10.49,9.88,11.37,15.11,13.53,6.63,1.9,9.48,-4.51,-1.47,-2.97,-1.16,-0.89,-0.25,0.13,-0.17,0.42,1.1,1.23,1.32,1.44,1.68,2.1,1.84,0.81,-1.02,-3.02,-5.13,-6.72,-7.75,-7.94,-7.31,-6.7,-6.43,-6.19,-5.87,-5.62,-5.41,-5.17,-4.78,-4.42,-3.99,-3.54,-3.22,-2.87,-2.41,-1.95,-1.32,-0.51,0.32,0.99,1.59,2.02,2.11,1.39,-0.75,-1.56,-0.95,0.16,1.48,1.97,1.9,2.44,2.68,2.67,2.61,2.53,2.54,2.76,4.1,5.17,6.01,6.51,4.65,6.76,1.72,-7.54,-10.83,-9.98,-9.03,-9.15,-9.68,-9.66,-9.29,-8.64,-8.01,-7.63,-7.3,-7.01,-6.48,-5.8,-5.41,-4.71,-4.04,-3.73,-3.23,-1.83,0.69,2.46,2.19,1.22,-0.9,-5.13,-6.61,-3.75,-7.14,-10.02,-3.41,-4.3,-5.1,-3.76,-2.76,-1.43,-2.82,-5.05,-5.61,-5.72,-5.66,-5.82,-6.48,-5.41,-4.47,-5.19,-7.21,-7.89,-8.07,-7.4,-4.39,-4.7,-5.17,-5.06,-2.71,-0.11,-0.17,-1.55,-2.28,-1.34,-2.41,-2.54,-0.39,1.94,2.22,1.71,2.67,2.21,1.86,2.59,0.38,-4.17,-4.82,-4.9,-5.73,-9.95,-11.31,-10.02,-9.55,-8.8,-8.59,-8.55,-8.57,-8.3,-8.94,-9.82,-9.85,-9.64,-10.27,-10.83,-10.74,-10.78,-9.71,-6.25,-5.88,-5.77,-7.09,-9.47,-10.2,-9.84,-7.33,-6.5,-5.47,-5.21,-5.8,-5.24,-4.15,-4.17,-4.28,-4.59,-5.13,-5.73,-5.66,-5.8,-6.04,-6.07,-5.94,-6.38,-6.4,-6.52,-6.67,-6.44,-5.39,-5.37,-5.91,-6.5,-6.94,-8.04,-9.13,-8.2,-8.69,-6.26,-6.35,-7.23,-8.01,-7.63,-7.24,-6.96,-6.45,-6.86,-8.72,-10.38,-11.05,-12.05,-15.3,-17.43,-16.02,-13.41,-17.04,-20.83,-18.01,-13.78,-15.27,-13.68,-14.92,-11.26,-8.53,-6.99,-6.31,-5.73,-5.16,-4.73,-4.63,-4.54,-4.33,-4.0,-3.76,-3.08,-1.7,0.04,1.33,2.2,2.9,3.57,4.25,4.73,5.21,5.81,5.81,6.25,6.97,7.04,6.9,6.76,6.62,6.72,6.55,5.62,2.65,-0.65,-1.66,-2.64,-3.81,-5.16,-6.73,-7.2,-7.33,-7.69,-7.71,-7.76,-8.28,-8.88,-8.83,-8.42,-8.36,-8.26,-7.45,-6.71,-6.26,-6.25,-6.77,-9.04,-9.73,-9.88,-10.08,-10.43,-10.51,-9.0,-8.8,-11.34,-11.37,-11.37,-11.25,-11.05,-10.76,-10.35,-9.88,-9.4,-8.82,-8.18,-7.5,-6.75,-5.97,-5.15,-4.26,-3.25,-2.07,-0.72,0.71,2.1,3.36,4.47,5.45,6.31,7.1,7.9,8.72,9.45,10.07,10.63,11.21,11.8,12.46,12.54,13.38,13.97,14.47,14.77,15.02,15.27,15.51,14.0,12.49,11.56,10.99,10.63,11.41,12.0,12.08,12.04,12.14,11.23,9.57,8.92,9.23,9.48,9.39,9.55,9.48,9.06,8.97,9.44,8.14,6.25,2.09,2.67,3.47,-1.38,0.62,2.09,4.93,5.37,-0.11,-1.81,-1.75,-1.57,-1.17,-0.79,-0.42,-0.21,0.12,0.63,0.77,0.58,0.37,0.11,-0.12,-0.48,-1.65,-3.63,-5.39,-6.43,-6.54,-6.52,-6.37,-5.91,-5.37,-4.9,-4.59,-4.21,-4.24,-4.04,-3.62,-3.33,-3.02,-2.71,-2.31,-1.89,-1.39,-0.68,0.03,0.68,1.09,1.27,1.37,1.19,0.89,0.94,1.33,1.84,2.36,2.83,3.11,3.39,3.47,3.59,3.71,4.14,4.82,4.94,4.88,4.79,4.81,4.6,4.64,4.09,-12.21,-11.5,-10.97,-12.06,-12.23,-12.12,-11.48,-10.78,-10.35,-9.51,-8.34,-7.68,-7.7,-6.15,-4.78,-5.67,-5.98,-4.48,-4.68,-4.08,-3.88,-5.17,-6.5,-6.15,-6.85,-6.25,-6.81,-5.35,-5.23,-5.26,-5.29,-3.93,-2.72,-6.78,-8.47,-5.23,-6.43,-5.55,-1.86,-3.98,-7.58,-7.93,-6.81,-7.52,-7.37,-7.16,-7.71,-7.08,-4.62,-5.63,-7.92,-8.01,-6.73,-6.17,-5.93,-4.75,-3.72,-2.55,-1.13,-0.27,-0.11,0.54,3.04,4.47,6.15,7.98,7.83,7.29,4.52,2.55,2.03,2.23,4.53,1.73,-4.82,-4.89,-5.43,-6.96,-7.59,-8.3,-8.08,-8.12,-8.55,-8.74,-8.03,-7.48,-7.65,-7.88,-7.96,-8.18,-8.59,-8.79,-9.34,-8.97,-8.99,-8.2,-6.15,-5.38,-6.06,-5.76,-6.02,-6.92,-7.01,-7.09,-7.21,-7.28,-6.26,-4.41,-4.01,-4.05,-3.88,-3.81,-3.56,-3.96,-3.82,-4.34,-4.98,-5.12,-5.02,-5.07,-5.27,-5.48,-5.48,-5.73,-6.13,-6.08,-5.92,-5.18,-4.86,-5.73,-6.75,-7.52,-7.45,-7.36,-5.33,-4.9,-6.43,-7.27,-7.92,-6.76,-5.43,-4.78,-4.64,-5.91,-7.28,-8.54,-9.33,-9.58,-10.33,-11.24,-11.03,-10.04,-8.43,-10.11,-12.53,-11.2,-10.21,-8.43,-10.45,-6.04,0.04,-4.1,-6.39,-5.87,-4.33,-4.72,-4.38,-3.78,-3.3,-2.92,-2.57,-1.73,-0.67,0.37,1.15,1.86,2.55,3.08,3.51,3.99,4.51,4.75,4.96,5.3,5.18,4.93,5.17,5.24,5.16,5.45,5.46,4.64,1.85,-1.34,-2.41,-3.15,-4.2,-5.53,-7.23,-7.8,-7.72,-8.47,-8.67,-8.76,-8.87,-8.65,-8.17,-7.37,-6.82,-6.67,-6.58,-5.92,-5.24,-4.88,-4.95,-6.2,-7.97,-8.02,-6.46,-5.24,-5.32,-5.89,-6.08,-8.55,-9.01,-6.47,-8.39,-8.41,-7.14,-7.62,-7.18,-6.67,-6.07,-5.35,-4.54,-3.53,-2.28,-1.07,0.05,1.24,2.35,3.53,4.55,5.38,6.15,6.95,7.6,8.33,7.67,5.59,5.41,6.72,8.97,10.26,10.67,10.48,10.32,10.1,10.59,11.04,11.56,11.62,11.88,12.09,12.3,12.88,12.88,12.79,12.46,12.08,12.11,12.22,12.02,11.05,9.81,9.62,9.82,10.04,10.14,9.88,10.03,9.65,9.4,9.69,8.25,8.86,4.85,3.73,3.0,1.07,3.42,6.91,-4.13,1.6,1.45,3.95,9.56,-1.05,0.77,1.02,-2.14,-0.84,-0.36,-0.05,0.4,0.71,0.68,0.29,-0.15,-0.5,-0.93,-1.43,-1.89,-2.46,-3.02,-3.41,-3.93,-4.31,-4.6,-4.36,-3.75,-3.57,-3.4,-2.87,-2.62,-2.78,-2.91,-2.88,-2.57,-2.06,-1.58,-1.18,-0.5,0.29,0.91,1.33,1.54,1.59,1.55,1.55,1.66,1.84,2.09,2.5,2.99,3.57,4.29,4.21,3.73,4.12,5.34,6.05,5.85,5.54,5.17,3.65,1.59,-1.32,-5.8,-10.66,-7.8,-9.28,-11.16,-11.01,-8.65,-7.61,-6.32,-4.6,-5.81,-5.77,-5.09,-4.44,-2.34,-3.45,-4.17,-3.75,-4.16,-4.76,-5.05,-3.57,-4.85,-8.14,-8.96,-9.63,-9.61,-7.47,-7.4,-8.96,-9.7,-10.22,-10.17,-9.55,-9.84,-10.0,-9.54,-10.63,-11.98,-10.58,-8.28,-8.93,-10.69,-10.76,-9.89,-9.63,-9.34,-8.25,-7.21,-6.79,-6.14,-5.91,-6.28,-6.16,-5.52,-4.7,-3.95,-2.76,-0.61,1.65,3.42,4.49,5.17,6.06,7.02,9.03,10.29,10.23,10.62,12.45,11.01,5.29,3.48,4.08,0.53,-4.61,-6.61,-5.76,-6.51,-6.54,-6.57,-6.96,-7.44,-7.23,-6.78,-6.92,-7.18,-7.1,-6.77,-6.68,-6.86,-7.03,-6.88,-6.85,-7.05,-6.91,-6.68,-5.69,-4.9,-4.86,-5.16,-4.93,-4.57,-4.87,-5.34,-5.29,-5.17,-5.09,-3.69,-2.1,-1.98,-2.23,-2.46,-2.3,-2.33,-3.2,-3.87,-4.17,-4.11,-4.05,-3.99,-4.06,-4.41,-4.58,-4.71,-4.83,-5.1,-5.33,-5.46,-5.41,-5.08,-4.8,-4.81,-5.29,-5.38,-5.02,-4.21,-4.33,-5.01,-4.65,-4.08,-3.84,-3.38,-3.71,-3.58,-4.69,-6.09,-6.7,-6.63,-6.4,-6.35,-6.78,-7.25,-6.98,-6.68,-6.51,-6.47,-6.48,-6.31,-6.1,-5.15,-4.54,-0.48,4.77,-0.47,0.81,-1.05,-3.75,0.74,1.73,-0.09,0.51,2.23,2.01,1.95,2.29,2.35,2.36,2.31,2.44,2.68,2.9,3.06,3.35,3.4,2.89,2.51,2.71,2.89,2.75,2.61,2.9,3.08,2.46,-0.58,-3.3,-3.36,-4.62,-5.84,-6.36,-7.08,-8.1,-8.98,-8.52,-8.02,-8.08,-7.86,-7.31,-6.51,-5.87,-5.75,-5.73,-5.36,-5.31,-5.67,-5.94,-5.83,-5.6,-5.49,-5.38,-5.34,-5.42,-5.45,-5.54,-5.72,-5.64,-5.33,-5.19,-4.76,-4.8,-4.85,-4.21,-3.89,-3.61,-3.15,-2.56,-1.81,-1.16,-0.63,-0.04,0.86,2.0,3.04,3.68,4.14,4.72,5.3,5.74,6.52,6.86,7.01,7.4,7.97,8.49,8.99,9.41,9.97,10.82,11.61,12.12,12.75,13.06,12.96,13.35,13.73,13.82,13.57,13.67,13.71,13.31,12.54,11.6,10.95,10.48,10.12,10.43,11.13,11.38,11.01,10.64,10.48,9.99,9.29,8.92,9.2,8.03,7.95,9.2,6.61,2.04,1.82,1.97,2.14,10.0,5.76,0.53,5.0,5.62,10.93,3.08,-0.8,0.18,-0.43,-0.02,0.17,0.35,0.6,0.79,0.72,0.52,0.4,0.18,-0.24,-0.73,-1.1,-1.4,-1.79,-2.45,-3.03,-3.49,-3.73,-3.96,-3.92,-3.61,-3.19,-3.03,-3.12,-3.07,-2.69,-2.17,-1.62,-1.22,-0.77,-0.1,0.46,0.81,1.07,1.2,1.17,1.19,1.46,1.73,1.71,1.7,1.9,2.55,3.12,2.97,3.25,2.51,-1.61,-7.18,-9.9,-10.06,-13.64,-14.53,-12.78,-13.2,-12.24,-11.28,-9.49,-8.11,-1.23,-3.14,-2.84,-3.27,-3.26,-3.12,-3.46,-1.51,-1.78,-4.05,-3.62,-4.94,-5.65,-3.11,-3.33,-3.05,-6.91,-6.07,-3.18,-3.84,-3.63,-2.24,-1.95,-0.77,-1.04,-2.82,-3.73,-7.22,-9.21,-7.51,-7.04,-8.26,-7.78,-7.85,-9.23,-13.26,-13.5,-9.6,-8.36,-8.54,-8.65,-8.87,-8.9,-8.68,-7.95,-7.09,-6.19,-6.07,-5.97,-5.73,-5.48,-4.55,-3.15,-1.36,0.42,1.94,3.28,4.79,6.37,7.37,7.49,7.61,8.49,9.45,10.67,12.23,14.25,13.7,9.4,8.45,4.08,-1.38,-4.65,-7.03,-6.84,-6.32,-7.06,-7.0,-6.2,-6.11,-5.94,-5.9,-5.99,-5.85,-5.66,-5.67,-5.94,-5.97,-5.67,-5.45,-5.2,-4.95,-4.97,-4.78,-4.38,-4.02,-3.8,-3.84,-3.81,-3.77,-3.6,-3.47,-3.54,-3.66,-3.4,-2.68,-1.92,-1.91,-2.01,-2.11,-2.49,-2.73,-2.89,-3.4,-3.26,-2.8,-3.0,-3.34,-3.53,-3.58,-3.7,-3.95,-3.97,-4.1,-4.15,-3.88,-3.46,-3.1,-2.94,-3.0,-2.9,-2.87,-3.08,-2.86,-2.8,-2.54,-1.76,-1.47,-1.11,-0.96,-1.61,-1.83,-1.94,-2.21,-2.8,-3.13,-3.32,-3.61,-3.72,-3.85,-3.97,-3.86,-3.89,-3.82,-3.44,-3.18,-2.78,-2.13,-0.71,0.79,0.76,0.7,1.85,-2.2,-1.05,-0.29,0.69,3.4,2.47,2.77,0.47,-3.18,0.29,0.87,1.02,1.03,1.22,1.47,1.67,1.84,2.08,2.07,1.46,0.91,0.65,0.43,0.4,0.13,-0.42,-0.51,-0.65,-1.44,-2.79,-4.41,-5.33,-5.7,-6.6,-7.8,-8.61,-8.44,-8.02,-7.86,-7.4,-6.94,-6.73,-6.35,-5.98,-5.93,-6.26,-6.93,-7.14,-6.97,-7.06,-7.15,-6.75,-5.99,-5.64,-5.51,-5.41,-5.04,-4.75,-4.38,-4.1,-3.87,-3.61,-3.28,-2.84,-2.24,-1.65,-0.91,-0.27,0.58,1.68,2.69,3.47,4.06,4.45,4.67,4.83,5.05,5.39,5.81,6.27,6.77,7.15,7.45,8.04,8.76,9.35,9.37,9.68,9.96,10.62,11.48,11.95,12.08,12.34,12.3,12.34,12.9,11.67,12.02,11.71,10.82,9.37,7.77,8.77,10.45,11.57,12.53,13.38,13.83,13.34,12.49,11.32,10.36,9.01,7.93,7.43,7.14,6.68,7.03,7.64,8.49,7.67,7.66,11.15,7.5,3.58,4.8,8.37,10.85,0.74,0.73,5.59,6.21,9.06,0.32,-1.64,3.33,1.25,0.23,0.93,1.29,1.63,1.86,1.98,1.97,1.85,1.63,1.4,1.18,0.87,0.41,-0.1,-0.62,-1.13,-1.59,-2.06,-2.55,-3.03,-3.54,-3.65,-3.53,-3.28,-2.79,-2.14,-1.33,-0.63,-0.23,0.07,0.4,0.6,0.79,0.86,0.65,0.68,1.15,1.53,1.19,0.96,1.08,1.7,2.06,1.18,0.16,-1.03,-2.44,-2.01,-9.02,-12.3,-6.09,-10.23,-14.61,-14.62,-10.99,-4.38,-3.41,-0.54,1.72,-4.39,-4.74,-5.34,-6.09,-6.41,-6.92,-7.43,-7.19,-7.05,-7.35,-8.0,-8.4,-8.63,-8.09,-6.95,-6.1,-6.26,-6.6,-7.35,-7.69,-8.09,-9.31,-10.41,-10.19,-10.89,-11.0,-5.19,-1.89,-4.07,-5.74,-7.55,-10.0,-9.13,-8.04,-8.9,-9.86,-9.29,-8.17,-7.35,-6.9,-6.82,-6.77,-6.65,-6.03,-5.53,-5.38,-4.99,-4.72,-4.19,-3.46,-2.45,-1.05,0.42,1.65,2.5,3.38,4.46,5.78,7.0,8.27,9.81,10.89,9.89,9.5,10.44,11.52,13.09,10.28,0.74,-3.52,-4.52,-5.39,-6.72,-7.31,-7.11,-7.81,-7.22,-6.04,-5.47,-5.14,-4.77,-4.7,-4.95,-4.82,-4.71,-4.67,-4.55,-4.37,-4.07,-3.68,-3.27,-2.86,-2.34,-1.59,-0.93,-0.44,-0.15,-0.06,-0.12,-0.24,-0.44,-0.58,-0.87,-1.5,-2.04,-2.3,-2.07,-1.86,-2.1,-2.47,-2.44,-2.58,-2.55,-2.53,-2.72,-2.76,-2.65,-2.6,-2.75,-2.79,-2.62,-2.54,-2.31,-2.01,-1.51,-0.96,-0.51,0.03,0.58,1.34,1.87,1.92,2.25,2.79,3.87,3.52,2.83,2.54,2.06,1.98,2.07,1.75,1.33,1.07,0.85,0.71,0.64,0.52,0.49,0.4,0.4,0.57,1.11,1.72,2.22,2.64,2.85,3.31,4.18,5.48,5.2,3.13,0.06,0.13,-1.28,2.98,5.08,-2.16,3.64,-1.26,-0.87,-3.25,-0.91,-0.67,-0.21,0.11,0.28,0.43,0.48,0.49,0.39,0.09,-0.36,-0.67,-0.92,-1.33,-1.77,-2.31,-3.26,-4.21,-4.58,-5.03,-5.79,-6.55,-7.38,-8.03,-8.24,-8.2,-8.09,-8.42,-8.8,-8.56,-8.13,-8.06,-8.04,-7.94,-7.74,-7.66,-7.83,-7.79,-7.43,-7.15,-6.68,-6.13,-5.39,-4.9,-4.61,-4.24,-3.82,-3.52,-3.14,-2.66,-2.0,-1.17,-0.28,0.57,1.36,2.14,2.77,3.38,3.58,3.3,5.31,7.77,8.03,6.06,5.05,4.18,4.24,5.07,5.78,6.2,6.48,7.05,7.56,7.91,8.39,9.03,9.23,9.65,9.95,8.79,7.24,6.61,7.14,8.74,8.9,10.1,10.77,8.46,8.06,10.42,10.03,7.15,7.28,11.29,14.59,13.24,9.11,8.6,8.39,8.02,7.33,6.57,7.92,7.21,4.25,4.16,5.62,5.25,3.33,2.63,5.14,7.42,6.49,5.23,5.19,2.87,1.26,0.03,-0.62,-2.23,-2.01,0.66,3.41,5.82,4.82,-0.62,-0.32,1.85,1.18,1.61,2.48,2.55,2.83,3.26,3.58,3.71,3.7,3.67,3.63,3.51,3.29,3.01,2.79,2.61,2.44,2.2,1.88,1.54,1.27,1.06,0.91,0.81,0.75,0.67,0.54,0.44,0.54,0.77,0.78,0.77,0.87,0.84,0.49,0.11,0.33,0.76,0.99,0.79,0.15,-0.43,0.12,0.66,-3.03,-5.78,-3.86,-3.02,-1.8,-5.79,-11.13,-9.64,-8.47,-10.31,-9.65,-5.12,-2.18,-3.06,-4.04,-3.38,-4.25,-5.87,-7.01,-7.08,-7.0,-7.37,-7.53,-7.5,-7.76,-7.93,-7.71,-7.57,-7.66,-7.49,-7.13,-6.89,-6.84,-6.88,-7.02,-7.3,-7.53,-7.6,-7.47,-7.2,-6.8,-6.16,-5.25,-4.47,-4.4,-4.81,-5.09,-6.18,-7.73,-7.79,-7.02,-7.05,-7.16,-7.24,-6.86,-5.98,-5.18,-4.59,-4.35,-4.06,-3.67,-3.24,-2.92,-2.59,-2.08,-1.18,-0.16,0.88,1.9,2.77,3.44,4.15,5.02,5.59,6.31,6.92,6.87,6.59,5.79,5.08,5.93,7.0,2.57,-2.99,-5.65,-4.92,-4.17,-4.99,-5.76,-5.79,-5.99,-6.68,-6.87,-5.95,-5.05,-4.57,-4.15,-4.04,-3.85,-3.6,-3.45,-3.0,-2.6,-2.12,-1.62,-1.21,-0.77,-0.31,0.33,1.12,1.87,2.43,2.72,2.94,3.19,3.41,3.45,3.15,2.44,1.48,0.42,-0.59,-1.19,-1.15,-0.92,-0.82,-0.99,-0.97,-1.02,-1.03,-1.03,-0.87,-0.67,-0.54,-0.33,0.0,0.26,0.56,0.98,1.41,1.99,2.52,3.09,3.54,4.02,4.69,4.69,4.86,5.09,4.86,5.79,6.03,5.12,4.72,4.57,5.15,5.38,4.7,4.13,3.99,4.02,4.03,4.17,4.36,4.55,4.83,5.23,5.72,6.11,6.45,6.95,7.36,6.53,6.65,9.24,8.68,3.31,-0.65,5.86,5.73,0.29,0.0,-1.24,-1.81,-1.59,-2.71,-2.88,-1.76,-1.09,-0.94,-0.71,-0.41,-0.17,-0.12,-0.29,-0.5,-0.72,-0.98,-1.32,-1.92,-2.51,-2.88,-3.37,-4.25,-5.37,-6.31,-6.73,-7.11,-7.75,-8.41,-8.78,-9.03,-9.33,-9.57,-9.52,-9.53,-9.56,-9.43,-9.29,-9.13,-8.88,-8.56,-8.26,-7.96,-7.56,-6.85,-6.24,-5.68,-5.19,-4.43,-3.99,-3.54,-3.13,-2.67,-2.12,-1.42,-0.6,0.18,0.84,1.74,2.91,3.73,4.29,5.05,4.87,4.9,4.73,4.03,4.52,5.34,5.86,6.8,7.73,3.57,2.62,6.29,5.17,5.34,4.45,3.47,3.37,0.53,2.01,3.69,4.75,2.85,-1.55,0.37,4.51,6.16,6.45,6.37,6.07,5.92,5.04,4.18,3.24,3.24,5.08,5.39,4.66,5.34,7.5,8.39,7.19,6.73,7.74,8.23,7.3,7.82,9.16,8.72,6.43,3.13,-1.79,-5.13,-2.13,2.15,2.78,-1.49,-6.2,-4.15,-3.5,-5.89,-6.7,-5.37,-4.32,-3.58,-3.9,-2.98,-0.41,0.42,1.09,0.4,0.95,0.7,2.47,4.2,4.24,4.44,4.72,4.91,5.06,5.16,5.18,5.11,5.11,5.0,4.86,4.77,4.7,4.52,4.22,3.85,3.6,3.36,2.96,2.57,2.27,2.0,2.09,1.91,1.84,1.56,1.07,0.8,0.59,0.23,0.1,0.26,0.25,0.02,-0.04,0.12,-0.12,-1.25,-2.49,-2.84,-1.51,0.42,-0.31,-4.04,-6.31,-6.25,-6.1,-7.16,-8.58,-8.65,-7.55,-5.87,-5.62,-6.19,-5.51,-4.13,-3.54,-3.28,-4.82,-5.29,-5.41,-5.57,-5.99,-6.37,-6.44,-6.42,-6.41,-6.37,-6.23,-6.11,-6.07,-6.09,-6.06,-6.0,-6.03,-6.06,-6.06,-6.02,-5.95,-5.89,-5.76,-5.55,-5.25,-4.84,-4.42,-4.17,-4.01,-3.92,-4.05,-4.17,-4.31,-4.53,-4.62,-4.62,-4.91,-5.13,-4.88,-4.3,-3.71,-3.25,-2.81,-2.42,-2.05,-1.64,-1.15,-0.75,-0.34,0.26,0.89,1.67,2.42,3.26,3.39,3.15,3.33,2.5,1.79,2.26,2.15,1.41,0.83,-0.42,-1.97,-2.85,-3.5,-4.11,-4.35,-5.21,-6.01,-6.07,-5.88,-5.48,-5.52,-5.85,-5.72,-5.06,-4.18,-3.55,-3.31,-3.04,-2.76,-2.52,-2.13,-1.7,-1.25,-0.88,-0.49,-0.13,0.14,0.75,1.56,2.35,3.05,3.5,3.68,3.85,4.15,4.37,4.35,4.13,3.67,2.94,1.99,1.2,0.87,0.88,0.9,0.93,0.94,0.92,0.99,1.04,1.02,1.08,1.34,1.55,1.72,1.98,2.27,2.66,3.13,3.69,4.21,4.56,4.85,5.26,5.7,5.82,5.61,5.61,5.62,5.55,5.81,6.31,6.8,6.42,5.65,6.05,6.68,6.42,6.04,5.85,5.56,5.69,5.79,5.87,6.23,6.62,7.16,7.84,8.49,9.27,10.08,10.74,10.78,10.82,12.65,15.49,17.42,17.97,20.24,15.1,10.58,10.69,8.47,4.85,2.58,1.98,1.6,0.89,0.5,0.18,-0.22,-0.5,-0.63,-0.71,-0.84,-1.19,-1.97,-2.53,-2.9,-3.38,-4.13,-4.83,-5.4,-5.94,-6.37,-6.74,-7.2,-7.68,-8.03,-8.25,-8.56,-8.96,-9.23,-9.4,-9.56,-9.51,-9.25,-8.95,-8.61,-8.23,-7.85,-7.47,-6.99,-6.34,-5.72,-5.08,-4.63,-4.07,-3.7,-3.48,-3.44,-2.89,-1.87,-1.12,-0.23,0.95,1.68,1.54,1.37,-0.2,-0.77,0.86,-1.12,-2.0,-0.28,-0.5,-1.54,-1.6,-1.38,-1.33,-0.86,-1.52,-1.82,-2.25,-2.88,-2.67,-1.14,-1.48,-1.36,0.55,2.76,4.15,1.91,0.79,-0.44,-0.27,1.7,1.33,1.32,2.49,3.3,2.64,1.61,1.45,1.26,1.35,1.4,1.18,3.64,6.82,8.22,7.47,6.27,5.83,5.53,5.17,5.23,5.34,5.8,8.34,10.89,10.04,7.87,7.29,6.5,5.68,6.49,6.28,3.42,1.56,2.11,1.53,-0.11,-0.11,1.12,1.15,1.24,1.11,1.7,3.51,3.94,1.81,0.51,0.59,3.77,5.18,5.1,5.49,5.32,5.48,5.86,6.26,6.55,6.61,6.56,6.64,6.66,6.63,6.51,6.19,5.9,5.55,5.07,4.76,4.63,4.46,3.89,2.68,2.06,1.66,1.24,0.93,0.69,0.54,0.27,0.18,-0.03,-0.35,-0.29,-0.39,-1.29,-2.31,-2.62,-2.99,-3.89,-4.11,-2.48,-0.54,-1.94,-5.01,-6.06,-5.96,-5.63,-4.14,-2.67,-3.76,-4.73,-4.25,-3.35,-3.19,-3.48,-2.97,-2.43,-2.6,-3.15,-3.95,-2.85,-3.31,-3.78,-4.18,-4.51,-4.77,-4.82,-4.72,-4.67,-4.7,-4.58,-4.42,-4.1,-3.96,-4.05,-4.13,-4.19,-4.13,-3.99,-3.96,-3.97,-4.01,-4.09,-4.17,-4.26,-4.22,-4.03,-3.83,-3.63,-3.42,-3.3,-3.18,-3.06,-2.97,-2.94,-3.07,-3.2,-3.1,-2.84,-2.44,-2.13,-1.95,-1.55,-1.09,-0.81,-0.5,-0.15,0.22,0.63,1.0,1.27,1.78,1.92,1.86,2.07,1.94,1.63,1.54,1.26,0.39,-0.26,0.35,0.84,0.53,-0.46,-2.46,-4.51,-5.79,-6.62,-6.67,-6.22,-5.81,-5.58,-5.46,-5.17,-4.75,-4.32,-4.0,-3.59,-3.57,-3.65,-3.19,-2.67,-2.25,-1.88,-1.51,-0.96,-0.45,-0.02,0.34,0.64,1.23,1.97,2.69,3.37,3.93,4.11,4.12,4.11,3.86,3.28,2.45,1.77,1.64,1.86,2.11,2.2,2.25,2.25,2.24,2.27,2.26,2.26,2.36,2.48,2.55,2.71,2.94,3.18,3.54,3.98,4.38,4.78,5.17,5.46,5.73,6.24,6.86,7.38,7.39,6.89,6.7,6.79,6.62,6.43,6.48,7.05,7.36,7.16,6.89,6.58,6.49,6.73,6.72,6.44,6.4,6.55,6.59,6.6,6.77,7.27,7.88,8.12,8.36,9.19,9.91,7.07,4.23,8.1,10.84,8.7,7.27,2.17,-1.88,0.83,2.68,2.56,2.04,0.32,-1.82,-2.99,-3.0,-2.41,-1.88,-1.91,-2.35,-2.62,-2.63,-2.72,-2.84,-3.0,-3.46,-4.26,-4.83,-5.19,-5.39,-5.57,-5.78,-6.0,-6.2,-6.38,-6.48,-6.54,-6.49,-6.35,-6.32,-6.37,-6.53,-6.65,-6.71,-6.7,-6.78,-6.63,-6.36,-5.9,-5.35,-5.06,-4.68,-4.3,-3.65,-3.49,-4.17,-2.98,-2.73,-4.21,-3.86,-3.87,-3.75,-1.89,-3.03,-4.65,-3.17,-1.15,-0.46,-0.63,1.07,1.07,1.05,3.78,0.56,-2.28,-0.85,1.54,2.64,3.88,4.02,3.98,2.72,1.33,1.9,3.04,3.86,3.85,2.86,4.24,5.71,3.23,1.84,3.2,2.79,2.75,3.72,3.06,1.49,0.64,1.01,1.3,1.14,1.23,1.33,0.61,-0.02,0.54,0.92,1.1,1.26,0.72,0.7,1.66,2.19,3.05,4.6,5.87,6.96,7.44,6.01,3.91,2.61,2.96,4.5,4.84,3.25,0.71,-1.59,-2.91,-2.55,-1.73,-0.59,1.11,1.96,3.59,4.2,4.58,5.44,3.59,3.34,4.81,5.3,5.4,5.62,5.87,6.08,6.26,6.59,6.96,7.2,7.47,6.87,6.49,6.72,6.74,6.66,6.58,6.37,6.1,5.74,5.38,4.88,4.35,3.6,2.43,1.27,0.7,0.58,0.32,-0.06,-0.2,-0.3,-0.49,-0.92,-1.98,-3.96,-6.15,-7.78,-8.54,-9.33,-9.68,-8.77,-6.9,-5.96,-6.1,-5.89,-5.5,-5.29,-4.65,-3.93,-4.22,-4.49,-3.94,-3.44,-3.44,-3.57,-3.48,-3.08,-2.79,-2.67,-2.51,-2.56,-2.75,-2.74,-3.18,-2.95,-2.93,-3.05,-3.2,-3.42,-3.66,-3.7,-3.49,-3.29,-3.31,-3.37,-3.13,-2.65,-2.4,-2.36,-2.16,-1.92,-1.7,-1.44,-1.16,-0.92,-0.76,-0.8,-1.15,-1.67,-2.08,-2.32,-2.44,-2.43,-2.29,-2.09,-1.85,-1.64,-1.52,-1.48,-1.45,-1.33,-1.14,-0.96,-0.77,-0.5,-0.17,0.05,0.17,0.36,0.56,0.77,0.96,1.04,1.02,1.12,1.28,1.42,1.58,1.43,1.01,0.74,0.94,1.29,1.27,0.37,-0.84,-2.23,-4.09,-6.0,-7.2,-7.86,-8.38,-8.54,-8.15,-7.62,-7.72,-7.54,-6.52,-5.83,-5.34,-5.14,-5.34,-5.39,-5.0,-4.59,-4.2,-3.71,-3.15,-2.71,-2.32,-1.81,-1.22,-0.69,-0.02,0.57,1.05,1.77,2.45,2.86,2.61,1.68,0.6,-0.13,-0.26,0.04,0.46,0.84,1.37,2.08,2.92,3.42,3.44,3.52,3.59,3.63,3.69,3.83,4.03,4.21,4.41,4.64,4.85,5.11,5.37,5.48,5.59,5.8,6.09,6.42,6.93,7.77,8.17,7.99,7.9,7.89,7.92,7.81,7.6,7.49,7.54,7.46,7.25,7.25,7.34,7.24,7.03,6.73,6.47,6.5,6.69,6.77,6.86,7.04,7.23,7.42,7.59,7.55,7.62,8.07,7.96,6.94,6.97,7.23,5.9,3.87,0.96,-1.31,-2.12,-3.0,-4.6,-4.64,-4.29,-3.68,-3.06,-2.62,-2.58,-3.19,-3.95,-4.15,-4.01,-3.56,-3.49,-3.63,-3.99,-4.19,-4.07,-4.01,-4.02,-4.22,-4.77,-4.81,-4.86,-4.81,-4.72,-4.66,-4.65,-4.57,-4.47,-4.3,-4.09,-3.77,-3.39,-3.19,-3.46,-3.92,-5.07,-5.2,-5.78,-4.84,-3.48,-3.01,-3.01,-2.84,-2.13,-1.58,-1.19,-0.58,-0.97,-1.69,-1.34,-1.27,-0.29,1.48,2.36,2.44,2.66,2.68,2.87,3.45,4.33,4.65,4.09,3.54,3.46,3.51,3.0,2.07,3.93,5.32,5.38,5.65,5.84,5.99,5.85,4.92,5.52,7.42,7.54,6.88,6.17,5.06,4.32,3.82,3.51,3.33,2.95,2.6,2.48,2.4,2.36,2.3,2.25,2.47,2.59,2.47,2.07,1.18,0.38,0.43,1.13,1.96,2.99,4.16,4.97,4.65,2.96,0.79,-0.13,0.18,0.92,1.4,0.66,-0.25,0.99,3.21,3.29,1.52,1.54,3.45,5.1,5.72,6.12,6.69,6.91,6.82,6.76,6.6,6.41,6.26,6.17,6.14,6.14,6.18,6.16,6.14,6.15,6.22,6.27,6.35,6.51,6.61,6.54,6.29,5.91,5.49,4.89,3.98,2.84,1.81,0.77,-0.62,-1.92,-2.47,-2.5,-2.22,-1.67,-1.41,-2.24,-4.22,-6.58,-7.93,-8.16,-8.83,-9.42,-9.14,-8.41,-8.05,-8.24,-8.15,-7.24,-6.08,-5.35,-5.17,-5.09,-4.66,-4.08,-3.86,-4.06,-4.15,-3.91,-3.52,-3.08,-2.59,-2.49,-2.8,-3.01,-3.02,-3.04,-3.06,-2.96,-2.88,-3.02,-3.21,-3.66,-3.56,-3.44,-3.43,-3.5,-3.33,-3.14,-3.11,-3.06,-2.91,-2.7,-2.37,-2.03,-1.74,-1.4,-1.08,-0.92,-0.7,-0.37,-0.12,0.14,0.52,0.83,1.04,1.11,0.96,0.61,0.12,-0.2,-0.4,-0.54,-0.46,-0.26,-0.19,-0.19,-0.22,-0.3,-0.37,-0.32,-0.18,-0.07,0.01,0.15,0.25,0.23,0.29,0.37,0.29,0.18,0.2,0.31,0.24,0.12,0.14,0.11,-0.12,-0.47,-0.74,-1.17,-1.72,-2.15,-2.66,-3.59,-4.8,-5.91,-6.77,-7.11,-6.94,-7.06,-7.81,-8.47,-8.27,-7.64,-7.63,-8.63,-9.88,-10.06,-9.1,-8.34,-8.46,-8.46,-7.86,-7.17,-6.77,-6.54,-6.34,-6.06,-5.53,-4.82,-4.53,-4.39,-4.02,-3.74,-3.55,-3.2,-2.57,-1.8,-1.01,-0.26,0.48,1.24,1.87,2.31,2.69,2.99,3.1,3.37,4.05,4.48,4.48,4.63,4.86,4.97,5.03,5.1,5.15,5.21,5.33,5.42,5.54,5.65,5.71,5.8,5.99,6.16,6.38,6.82,7.42,7.77,7.9,8.0,8.08,8.1,8.01,7.76,7.49,7.41,7.39,7.33,7.34,7.32,7.05,6.89,6.92,6.83,6.76,6.88,7.06,7.2,7.51,7.82,8.05,8.46,9.1,9.49,8.98,6.57,5.33,8.3,8.13,4.32,0.91,-0.01,1.07,-2.13,-4.3,-1.92,-0.63,-0.84,-1.51,-1.82,-1.48,-1.5,-1.97,-2.09,-1.52,-0.74,-0.59,-1.41,-2.43,-2.8,-2.71,-3.0,-3.1,-3.14,-3.15,-3.29,-3.2,-3.16,-2.93,-2.72,-2.6,-2.45,-2.2,-1.83,-1.46,-1.29,-1.4,-1.66,-2.1,-2.17,-1.98,-2.03,-1.14,0.33,0.7,-0.64,-1.88,-2.07,-1.91,-2.27,-2.62,-2.44,-1.56,-1.04,-2.01,-1.74,0.48,1.53,1.2,0.67,0.42,0.56,0.92,1.21,1.59,2.15,2.75,3.06,3.17,3.41,3.82,4.29,4.61,4.85,5.23,5.53,5.66,5.76,5.72,5.63,5.69,5.93,6.16,6.33,6.35,6.22,5.84,5.14,4.26,3.54,3.11,2.73,2.38,2.19,2.15,1.93,1.42,1.14,1.19,1.21,1.11,1.21,1.68,2.12,2.29,2.38,2.17,1.73,1.55,0.81,-1.27,-3.22,-2.4,1.2,0.71,-2.73,-2.6,0.12,1.71,2.24,3.01,3.91,4.27,4.67,5.94,6.6,5.64,4.61,4.6,4.9,5.15,5.38,5.53,5.54,5.46,5.34,5.24,5.17,5.11,5.03,4.98,5.09,5.16,5.07,4.93,4.89,4.7,4.37,4.61,4.78,2.52,-2.37,-6.2,-5.75,-2.97,-1.99,-3.22,-5.21,-6.49,-6.51,-6.35,-6.34,-6.12,-6.15,-7.37,-7.21,-5.13,-2.75,-2.14,-2.98,-3.92,-4.32,-4.6,-5.11,-5.63,-5.97,-6.28,-6.67,-6.93,-6.95,-6.92,-6.53,-5.38,-3.84,-2.86,-3.03,-3.85,-4.47,-4.74,-4.97,-5.24,-5.35,-5.11,-4.76,-4.54,-4.31,-3.98,-3.9,-3.86,-3.86,-3.98,-4.01,-4.0,-4.0,-3.82,-3.63,-3.43,-3.17,-3.03,-2.81,-2.37,-1.86,-1.51,-1.35,-1.18,-0.96,-0.75,-0.48,-0.09,0.35,0.64,0.76,0.82,0.88,0.98,1.05,1.03,0.99,0.96,0.93,0.89,0.79,0.69,0.61,0.49,0.34,0.23,0.09,-0.16,-0.48,-0.74,-0.91,-0.97,-0.95,-0.91,-0.9,-0.92,-0.92,-0.89,-0.92,-1.02,-1.16,-1.27,-1.36,-1.55,-1.84,-2.14,-2.47,-2.95,-3.4,-3.69,-4.0,-4.55,-5.25,-5.97,-6.61,-6.92,-6.62,-6.18,-6.2,-6.59,-6.94,-7.22,-7.74,-8.31,-8.34,-7.85,-7.7,-8.04,-8.23,-7.81,-7.1,-6.54,-6.12,-5.79,-5.49,-5.26,-5.07,-4.85,-4.57,-4.3,-3.93,-3.31,-2.42,-1.48,-0.65,0.22,1.08,1.63,2.0,2.41,2.77,3.01,3.29,3.59,3.82,4.05,4.32,4.49,4.63,4.8,4.89,4.91,4.96,4.99,4.96,4.97,5.02,5.11,5.19,5.32,5.44,5.51,5.62,5.81,6.07,6.42,6.73,6.88,6.94,7.03,7.0,6.81,6.65,6.57,6.58,6.61,6.67,6.7,6.61,6.41,6.25,6.27,6.41,6.58,6.75,6.95,7.17,7.46,7.98,8.63,9.05,9.17,9.77,10.69,8.5,6.23,4.18,3.71,5.19,7.05,5.56,3.22,1.71,1.46,1.82,2.05,1.66,1.02,0.54,0.3,0.21,0.15,0.09,0.06,0.12,0.28,0.44,0.61,0.8,0.94,0.94,0.82,0.64,0.52,0.45,0.38,0.28,0.21,0.2,0.1,-0.16,-0.16,0.39,0.12,-1.24,-1.52,-1.0,-1.9,-2.74,-2.47,-1.95,-1.65,-1.67,-1.78,-1.19,-0.14,0.47,0.74,0.99,1.55,1.78,1.48,1.67,2.79,3.99,4.11,3.29,2.43,2.21,2.37,2.2,1.72,1.47,1.69,2.18,2.54,2.68,2.71,2.84,3.26,3.96,4.65,4.99,5.02,5.01,4.89,4.67,4.4,4.27,4.47,4.75,4.89,4.99,5.37,5.87,6.16,5.82,5.0,4.25,4.07,4.09,3.8,3.31,2.93,2.75,2.67,2.67,2.78,3.01,3.34,3.68,3.94,3.99,3.79,3.37,2.58,1.53,0.82,0.84,1.36,3.27,6.64,8.68,8.84,6.02,4.11,1.82,2.05,3.73,5.19,5.63,5.38,5.01,4.84,4.93,5.0,4.48,3.86,4.42,5.29,4.88,3.79,3.47,3.67,3.76,3.67,3.62,3.63,3.67,3.72,3.81,3.99,4.18,4.26,3.94,3.32,2.99,2.73,1.8,-0.17,-2.9,-5.26,-6.22,-5.86,-4.77,-4.13,-3.5,-2.13,-1.07,-0.58,0.28,1.45,1.32,-0.75,-3.34,-5.13,-5.84,-6.35,-7.46,-8.64,-9.24,-8.96,-8.12,-7.21,-6.6,-6.4,-6.5,-6.57,-6.29,-5.69,-5.1,-4.77,-4.75,-5.16,-5.57,-5.67,-5.35,-5.0,-4.84,-4.89,-4.93,-4.74,-4.32,-4.01,-3.99,-3.83,-3.64,-3.7,-3.96,-4.07,-4.12,-4.02,-3.84,-3.68,-3.43,-3.11,-2.75,-2.35,-1.97,-1.7,-1.54,-1.5,-1.48,-1.42,-1.29,-1.08,-0.83,-0.61,-0.41,-0.22,-0.01,0.24,0.45,0.61,0.7,0.72,0.76,0.9,1.07,1.18,1.18,1.15,1.13,1.13,1.09,0.99,0.83,0.62,0.31,-0.12,-0.59,-1.03,-1.38,-1.63,-1.76,-1.77,-1.71,-1.7,-1.75,-1.84,-1.97,-2.1,-2.23,-2.37,-2.54,-2.78,-3.06,-3.34,-3.63,-3.95,-4.35,-4.78,-5.03,-5.09,-5.17,-5.31,-5.42,-5.49,-5.54,-5.57,-5.61,-5.77,-6.2,-6.88,-7.19,-6.62,-5.51,-4.7,-4.33,-4.14,-3.83,-3.32,-2.92,-2.77,-2.7,-2.59,-2.4,-2.11,-1.69,-1.24,-0.78,-0.31,0.18,0.65,1.08,1.49,1.88,2.27,2.66,3.03,3.26,3.41,3.49,3.57,3.65,3.74,3.79,3.85,3.99,4.18,4.28,4.36,4.46,4.5,4.45,4.41,4.36,4.32,4.32,4.3,4.18,4.03,3.95,3.92,3.86,3.85,3.95,4.01,3.88,3.77,3.89,4.02,3.85,3.36,2.75,2.12,1.53,1.02,0.74,0.76,1.12,1.88,2.8,3.65,4.43,5.32,6.28,6.85,6.77,6.93,7.27,6.62,3.85,2.28,2.29,1.59,1.18,2.25,2.89,1.45,0.33,0.68,1.57,2.07,1.95,1.5,1.04,0.66,0.22,-0.2,-0.4,-0.29,-0.03,0.23,0.49,0.75,1.04,1.36,1.69,2.01,2.28,2.49,2.61,2.68,2.71,2.69,2.61,2.5,2.42,2.41,2.44,2.41,2.29,2.28,2.48,2.77,3.03,3.28,3.37,3.15,2.88,2.77,2.79,2.8,2.77,2.64,2.39,2.09,1.71,1.29,0.97,0.86,0.81,0.78,0.95,1.3,1.58,1.61,1.47,1.3,1.08,0.68,0.32,0.23,0.56,1.21,1.78,2.05,2.32,2.69,3.24,3.85,4.2,4.27,4.23,4.28,4.45,4.59,4.62,4.59,4.6,4.8,5.1,5.29,5.15,4.79,4.45,4.24,4.15,4.13,4.07,4.0,4.02,4.14,4.29,4.46,4.65,4.83,4.95,4.93,4.73,4.31,3.76,3.43,3.59,4.18,5.19,6.6,8.02,8.82,9.03,8.93,8.83,8.64,8.62,7.76,12.15,11.84,8.83,5.13,3.15,2.49,2.23,2.4,2.93,3.22,3.15,3.1,3.14,3.09,2.95,2.8,2.53,2.23,2.18,2.16,1.85,1.55,1.45,1.36,1.34,1.55,2.21,3.22,3.39,1.59,-1.68,-4.37,-5.54,-5.81,-5.98,-5.26,-2.9,0.24,2.51,3.04,2.89,2.63,0.91,-2.44,-5.73,-7.07,-7.12,-7.43,-8.48,-9.82,-11.12,-12.21,-12.94,-13.08,-12.55,-11.61,-10.86,-10.18,-9.22,-8.22,-7.8,-8.23,-9.02,-9.22,-8.58,-7.53,-6.97,-6.97,-6.9,-6.36,-5.86,-5.64,-5.6,-5.69,-5.8,-5.65,-5.08,-4.56,-4.3,-4.22,-4.14,-4.02,-4.27,-3.95,-3.45,-2.9,-2.34,-1.8,-1.28,-0.84,-0.61,-0.63,-0.84,-1.09,-1.26,-1.35,-1.39,-1.35,-1.21,-1.03,-0.86,-0.69,-0.55,-0.44,-0.32,-0.14,0.04,0.11,0.09,0.1,0.18,0.27,0.36,0.52,0.69,0.75,0.81,0.97,1.16,1.25,1.2,1.06,0.91,0.74,0.51,0.23,-0.07,-0.35,-0.63,-0.95,-1.31,-1.65,-1.94,-2.2,-2.45,-2.64,-2.79,-2.91,-3.02,-3.15,-3.31,-3.49,-3.67,-3.85,-4.01,-4.13,-4.22,-4.3,-4.38,-4.46,-4.51,-4.52,-4.55,-4.72,-5.01,-5.18,-5.03,-4.59,-3.97,-3.31,-2.77,-2.34,-1.94,-1.5,-1.09,-0.77,-0.51,-0.24,0.07,0.41,0.73,1.01,1.27,1.54,1.82,2.05,2.23,2.4,2.56,2.69,2.77,2.9,3.12,3.34,3.54,3.8,4.13,4.36,4.42,4.47,4.51,4.42,4.21,4.05,3.98,3.95,3.94,3.97,4.05,4.11,4.15,4.1,4.01,3.87,3.74,3.56,3.35,3.18,3.22,3.55,4.02,4.36,4.37,4.07,3.48,2.68,1.85,1.23,0.93,0.76,0.56,0.28,-0.13,-0.59,-1.02,-1.3,-1.51,-1.8,-2.13,-2.14,-1.69,-1.12,-1.02,-1.51,-1.73,-0.7,1.04,1.23,-1.64,-4.12,-4.18,-1.5,-0.19,-0.54,-1.61,-2.21,-2.24,-2.24,-2.27,-2.14,-1.7,-1.08,-0.58,-0.26,-0.05,0.14,0.37,0.63,0.94,1.26,1.59,1.88,2.12,2.29,2.4,2.44,2.47,2.5,2.56,2.65,2.79,2.95,3.11,3.23,3.27,3.29,3.3,3.29,3.29,3.33,3.37,3.37,3.38,3.36,3.14,2.55,1.81,1.32,1.09,0.86,0.61,0.52,0.66,0.94,1.3,1.84,2.3,2.51,2.59,2.67,2.75,2.73,2.55,2.13,1.48,0.85,0.62,0.94,1.66,2.15,2.12,1.92,1.81,1.8,1.91,2.15,2.43,2.71,3.1,3.53,3.91,4.14,4.24,4.2,4.11,3.96,3.74,3.6,3.65,3.92,4.23,4.41,4.39,4.29,4.19,4.1,4.1,4.18,4.37,4.55,4.72,5.11,5.87,6.94,7.94,8.58,8.8,8.82,8.92,9.13,9.33,9.43,9.5,9.73,10.35,11.34,11.86,11.2,10.0,9.41,9.65,9.93,9.61,8.84,7.85,6.65,5.21,3.95,3.31,2.91,2.27,1.4,0.53,-0.19,-0.67,-0.79,-0.53,-0.1,0.17,0.24,0.5,0.98,1.25,1.1,0.91,0.83,0.75,0.64,0.69,1.25,2.18,2.77,2.49,1.84,1.65,1.93,2.08,1.6,0.32,-1.47,-3.69,-5.45,-6.32,-6.46,-6.13,-6.35,-7.49,-8.97,-9.54,-9.01,-7.96,-6.98,-6.59,-6.9,-7.25,-7.17,-6.63,-5.98,-5.57,-5.54,-5.89,-6.42,-6.98,-7.5,-7.57,-6.91,-5.88,-5.19,-4.99,-4.85,-4.51,-4.01,-3.59,-3.47,-3.64,-3.86,-3.98,-4.07,-4.3,-4.41,-4.42,-4.37,-4.15,-4.08,-3.98,-3.96,-4.03,-4.08,-3.99,-3.79,-3.58,-3.39,-3.16,-2.89,-2.58,-2.28,-1.97,-1.65,-1.37,-1.16,-1.03,-0.96,-0.95,-0.99,-1.1,-1.22,-1.25,-1.13,-0.92,-0.72,-0.6,-0.55,-0.59,-0.67,-0.71,-0.65,-0.47,-0.25,-0.06,0.1,0.3,0.57,0.88,1.09,1.16,1.06,0.9,0.75,0.6,0.42,0.19,-0.06,-0.3,-0.51,-0.67,-0.81,-0.95,-1.1,-1.25,-1.43,-1.62,-1.84,-2.08,-2.31,-2.48,-2.6,-2.67,-2.71,-2.71,-2.69,-2.66,-2.65,-2.61,-2.5,-2.27,-1.91,-1.47,-1.02,-0.57,-0.15,0.26,0.62,0.94,1.22,1.45,1.66,1.86,2.03,2.16,2.23,2.29,2.36,2.42,2.5,2.62,2.8,3.03,3.28,3.49,3.61,3.71,3.79,3.87,3.92,3.93,3.89,3.85,3.87,3.99,4.07,4.06,3.94,3.73,3.49,3.24,3.07,3.01,3.06,3.15,3.21,3.23,3.19,3.07,2.88,2.7,2.57,2.44,2.23,1.92,1.52,1.04,0.54,0.19,0.08,0.17,0.32,0.4,0.37,0.23,-0.02,-0.39,-0.93,-1.56,-2.18,-2.72,-3.21,-3.65,-4.03,-4.28,-4.37,-4.31,-4.24,-4.3,-4.71,-5.36,-5.87,-5.8,-5.14,-4.1,-2.74,-1.41,-0.4,0.3,0.53,0.53,0.38,-0.3,-1.44,-2.24,-2.47,-2.39,-2.28,-2.18,-2.04,-1.72,-1.29,-0.85,-0.5,-0.23,-0.01,0.22,0.48,0.71,0.87,0.94,0.94,0.88,0.79,0.71,0.66,0.63,0.63,0.64,0.71,0.82,1.01,1.23,1.46,1.67,1.82,1.92,1.89,1.72,1.43,1.09,0.94,1.12,1.47,1.6,1.51,1.61,1.86,1.94,1.78,1.78,2.0,2.17,1.94,1.35,0.5,-0.07,-0.25,-0.1,0.15,0.33,0.3,0.23,0.25,0.39,0.58,0.76,0.94,1.16,1.4,1.57,1.71,1.9,2.14,2.3,2.31,2.18,1.9,1.53,1.35,1.57,2.07,2.48,2.66,2.68,2.77,3.07,3.54,4.01,4.27,4.31,4.38,4.76,5.6,6.92,8.18,9.08,9.49,9.59,9.53,9.34,9.12,8.99,9.23,9.78,10.39,10.72,10.81,10.84,10.87,10.75,10.33,9.78,9.47,9.38,9.0,8.05,6.89,6.01,5.37,4.69,3.76,2.6,1.35,0.25,-0.5,-0.75,-0.39,0.23,0.67,0.63,0.27,-0.24,-0.66,-0.85,-0.82,-0.63,-0.42,-0.23,-0.05,0.3,0.93,1.7,1.98,1.04,-1.51,-4.82,-7.45,-7.93,-6.87,-5.07,-3.5,-2.88,-3.48,-5.45,-8.11,-10.67,-11.93,-11.91,-11.39,-11.06,-10.82,-10.65,-10.62,-10.79,-11.09,-11.31,-11.2,-10.6,-9.49,-8.34,-7.66,-7.79,-8.38,-8.97,-9.2,-9.05,-8.67,-8.19,-7.74,-7.43,-7.31,-7.25,-7.03,-6.55,-6.0,-5.56,-5.25,-5.08,-4.93,-4.83,-4.76,-4.7,-4.6,-4.43,-4.24,-4.13,-4.13,-5.61,-5.45,-5.27,-5.08,-4.94,-4.78,-4.64,-4.47,-4.27,-4.04,-3.83,-3.7,-3.63,-3.62,-3.66,-3.71,-3.75,-3.74,-3.71,-3.66,-3.62,-3.6,-3.53,-3.45,-3.37,-3.33,-3.33,-3.31,-3.19,-2.95,-2.63,-2.31,-2.06,-1.86,-1.71,-1.58,-1.45,-1.29,-1.06,-0.75,-0.36,0.04,0.36,0.56,0.68,0.78,0.87,0.96,1.05,1.13,1.2,1.24,1.26,1.24,1.18,1.11,1.03,0.97,0.92,0.88,0.86,0.86,0.87,0.89,0.89,0.9,0.91,0.93,0.94,0.96,1.0,1.08,1.2,1.37,1.54,1.7,1.84,1.97,2.1,2.2,2.29,2.35,2.42,2.47,2.55,2.61,2.68,2.75,2.82,2.89,2.95,3.0,3.05,3.15,3.27,3.41,3.54,3.61,3.64,3.67,3.68,3.68,3.61,3.47,3.31,3.17,3.05,2.98,2.94,2.96,3.05,3.15,3.19,3.06,2.74,2.28,1.76,1.28,0.87,0.57,0.35,0.22,0.13,0.04,-0.03,-0.12,-0.21,-0.26,-0.24,-0.13,-0.03,0.02,-0.07,-0.24,-0.43,-0.58,-0.7,-0.8,-0.91,-1.03,-1.2,-1.45,-1.79,-2.18,-2.56,-2.88,-3.15,-3.34,-3.43,-3.31,-2.88,-2.06,-1.11,-0.32,0.25,0.84,1.67,1.81,0.8,-0.77,-1.81,-0.94,1.13,1.49,0.09,-0.79,0.07,0.95,0.09,-2.15,-3.66,-3.53,-2.77,-2.36,-2.41,-2.51,-2.42,-2.18,-1.92,-1.72,-1.58,-1.47,-1.35,-1.26,-1.24,-1.29,-1.34,-1.29,-1.18,-1.06,-1.01,-0.96,-0.89,-0.79,-0.74,-0.76,-0.84,-0.96,-1.12,-1.26,-1.35,-1.32,-1.19,-1.06,-0.95,-0.78,-0.48,-0.01,0.61,1.31,1.93,2.21,1.96,1.17,0.11,-0.99,-1.85,-2.12,-1.84,-1.11,-0.15,0.69,1.14,1.18,0.98,0.69,0.45,0.33,0.3,0.31,0.3,0.24,0.13,-0.04,-0.28,-0.54,-0.74,-0.85,-0.88,-0.8,-0.55,-0.02,0.74,1.53,2.15,2.47,2.51,2.48,2.67,3.14,3.61,3.82,3.79,3.98,4.85,6.51,8.59,10.31,11.2,11.15,10.58,9.9,9.43,9.32,9.59,10.12,10.68,11.01,10.89,10.39,9.77,9.35,9.04,8.54,7.7,6.56,5.39,4.45,3.83,3.46,3.22,2.97,2.55,1.99,1.42,0.92,0.42,-0.14,-0.71,-1.18,-1.5,-1.78,-2.05,-2.23,-2.18,-1.79,-1.21,-0.61,-0.07,0.4,0.46,-0.54,-2.59,-5.49,-8.41,-10.31,-11.17,-11.15,-10.25,-8.49,-6.22,-3.94,-2.98,-4.03,-6.23,-8.68,-10.97,-12.99,-14.47,-14.87,-14.08,-12.55,-11.18,-10.54,-10.59,-10.74,-10.63,-10.28,-9.86,-9.51,-9.3,-9.19,-9.09,-8.95,-8.79,-8.6,-8.45,-8.34,-8.29,-8.29,-8.35,-8.46,-8.58,-8.68,-8.67,-8.5,-8.2,-7.83,-7.49,-7.22,-7.0,-6.8,-6.62,-6.45,-6.33,-6.22,-6.13,-6.04,-5.91,-5.77,-5.43,-5.33,-5.2,-5.06,-4.9,-4.73,-4.61,-4.52,-4.44,-4.35,-4.26,-4.17,-4.04,-3.89,-3.73,-3.53,-3.34,-3.17,-3.03,-2.91,-2.81,-2.74,-2.69,-2.64,-2.59,-2.54,-2.52,-2.56,-2.64,-2.69,-2.68,-2.58,-2.44,-2.31,-2.2,-2.05,-1.82,-1.5,-1.1,-0.7,-0.31,0.05,0.37,0.65,0.86,1.04,1.18,1.33,1.49,1.64,1.82,1.97,2.12,2.24,2.35,2.45,2.54,2.62,2.69,2.74,2.79,2.85,2.92,3.02,3.14,3.25,3.37,3.47,3.58,3.69,3.78,3.88,3.97,4.07,4.16,4.21,4.24,4.22,4.21,4.2,4.21,4.22,4.22,4.2,4.17,4.14,4.12,4.13,4.14,4.18,4.2,4.21,4.18,4.11,4.02,3.94,3.87,3.81,3.75,3.68,3.63,3.59,3.55,3.49,3.4,3.27,3.08,2.87,2.65,2.45,2.27,2.11,1.96,1.82,1.69,1.55,1.4,1.26,1.13,1.01,0.91,0.76,0.6,0.41,0.22,0.02,-0.19,-0.4,-0.58,-0.71,-0.75,-0.7,-0.59,-0.48,-0.41,-0.42,-0.52,-0.7,-0.89,-1.06,-1.16,-1.2,-1.19,-1.21,-1.26,-1.34,-1.44,-1.5,-1.53,-1.49,-1.41,-1.29,-1.14,-1.01,-0.99,-1.16,-1.51,-1.83,-1.79,-1.11,0.06,1.3,1.94,1.52,0.09,-1.27,-1.61,-0.95,0.18,0.49,-0.5,-2.0,-2.46,-1.53,-0.53,0.21,0.12,-0.7,-1.8,-2.73,-3.19,-3.21,-3.1,-3.05,-3.08,-3.09,-2.97,-2.7,-2.31,-1.89,-1.47,-1.1,-0.79,-0.57,-0.45,-0.4,-0.43,-0.48,-0.53,-0.57,-0.6,-0.62,-0.6,-0.52,-0.38,-0.18,0.08,0.37,0.66,0.94,1.2,1.43,1.62,1.68,1.53,1.16,0.65,0.06,-0.54,-1.14,-1.7,-2.2,-2.58,-2.78,-2.79,-2.69,-2.61,-2.59,-2.59,-2.52,-2.26,-1.83,-1.35,-0.93,-0.65,-0.46,-0.24,0.07,0.43,0.81,1.17,1.51,1.79,1.98,2.09,2.23,2.45,2.78,3.12,3.42,3.66,3.91,4.29,4.84,5.53,6.23,6.99,7.39,7.54,7.52,7.38,7.27,7.16,7.17,7.18,7.09,6.81,6.32,5.74,5.15,4.47,3.58,2.52,1.51,0.82,0.6,0.77,1.16,1.58,2.0,2.4,2.82,3.24,3.62,3.9,4.11,4.26,4.35,4.32,4.15,3.96,3.94,4.18,4.53,4.55,3.81,2.24,0.14,-2.07,-4.17,-6.14,-8.05,-9.72,-9.95,-11.35,-10.58,-9.66,-8.66,-8.03,-7.8,-7.97,-8.47,-9.2,-10.15,-11.22,-12.27,-13.01,-13.25,-13.0,-12.48,-11.95,-11.57,-11.38,-11.31,-11.29,-11.24,-11.16,-11.0,-10.82,-10.63,-10.39,-10.18,-9.93,-9.76,-9.65,-9.66,-9.73,-9.78,-9.77,-9.65,-9.39,-9.06,-8.69,-8.37,-8.09,-7.83,-7.63,-7.44,-7.27,-7.09,-6.85,-6.64,-6.4,-6.2,-6.07,-5.95,-5.86,-5.76,-5.65,-5.55,-5.09,-4.98,-4.89,-4.76,-4.65,-4.57,-4.44,-4.35,-4.24,-4.15,-4.03,-3.92,-3.8,-3.67,-3.53,-3.39,-3.26,-3.13,-3.01,-2.89,-2.77,-2.66,-2.58,-2.5,-2.44,-2.38,-2.31,-2.23,-2.15,-2.03,-1.92,-1.81,-1.7,-1.57,-1.42,-1.22,-0.96,-0.63,-0.29,0.05,0.36,0.63,0.89,1.15,1.43,1.71,1.96,2.2,2.37,2.49,2.57,2.66,2.73,2.81,2.89,2.99,3.09,3.19,3.29,3.39,3.49,3.6,3.71,3.82,3.93,4.02,4.12,4.22,4.3,4.39,4.48,4.57,4.64,4.73,4.81,4.9,4.98,5.04,5.08,5.09,5.1,5.09,5.07,5.04,5.0,4.93,4.86,4.79,4.71,4.66,4.63,4.6,4.56,4.5,4.42,4.33,4.21,4.09,3.97,3.86,3.76,3.67,3.58,3.48,3.41,3.32,3.24,3.15,3.06,2.96,2.85,2.76,2.66,2.53,2.36,2.16,1.89,1.61,1.31,1.02,0.76,0.5,0.24,-0.01,-0.27,-0.51,-0.73,-0.92,-1.07,-1.19,-1.3,-1.4,-1.54,-1.68,-1.84,-1.98,-2.09,-2.16,-2.19,-2.15,-2.09,-2.03,-1.98,-1.96,-1.96,-2.0,-2.05,-2.11,-2.14,-2.14,-2.11,-2.02,-1.85,-1.58,-1.21,-0.77,-0.26,0.31,0.94,1.67,2.5,3.33,3.94,3.97,3.52,2.9,1.99,0.97,-0.09,-0.94,-1.24,-1.14,-0.99,-0.48,0.03,0.38,0.61,0.75,1.03,1.61,2.21,2.25,2.33,1.55,0.23,-0.84,-1.03,-0.38,0.44,0.67,0.28,-0.5,-1.3,-1.89,-2.07,-2.12,-2.39,-2.84,-3.29,-3.59,-3.64,-3.54,-3.44,-3.43,-3.49,-3.57,-3.62,-3.64,-3.63,-3.69,-3.83,-4.04,-4.31,-4.57,-4.77,-4.86,-4.82,-4.67,-4.47,-4.3,-4.18,-4.14,-4.16,-4.18,-4.16,-4.14,-4.16,-4.21,-4.28,-4.34,-4.36,-4.32,-4.25,-4.17,-4.1,-3.96,-3.65,-3.07,-2.21,-1.17,-0.13,0.78,1.47,1.98,2.5,3.11,3.78,4.37,4.75,4.85,4.61,4.2,3.77,3.4,3.1,2.86,2.68,2.58,2.64,2.79,2.82,2.78,2.75,2.6,2.62,2.85,3.24,3.42,3.66,4.42,4.57,4.33,3.98,3.7,3.61,3.73,4.02,4.36,4.55,4.44,3.97,3.19,2.18,1.06,-0.06,-1.14,-2.34,-3.71,-5.19,-6.64,-7.97,-9.1,-9.7,-9.74,-9.39,-8.52,-7.48,-7.16,-6.81,-7.27,-8.1,-9.05,-9.87,-10.42,-10.7,-10.65,-10.38,-10.08,-9.75,-9.47,-9.31,-9.27,-9.42,-9.58,-9.79,-9.98,-10.13,-10.17,-10.1,-9.93,-9.8,-9.7,-9.66,-9.63,-9.59,-9.47,-9.3,-9.04,-8.78,-8.5,-8.24,-8.05,-7.95,-7.94,-8.06,-8.17,-8.28,-8.35,-8.35,-8.3,-8.17,-8.0,-7.83,-7.63,-7.43,-7.21,-7.0,-6.79,-6.59,-6.42,-6.27,-6.13,-5.99,-5.86,-5.72,-5.58,-5.45,-5.34,-5.26,-5.16,-3.86,-3.73,-3.61,-3.49,-3.37,-3.26,-3.14,-3.02,-2.89,-2.77,-2.64,-2.52,-2.42,-2.32,-2.24,-2.18,-2.12,-2.05,-1.97,-1.9,-1.82,-1.74,-1.68,-1.63,-1.58,-1.54,-1.49,-1.42,-1.32,-1.18,-1.01,-0.81,-0.61,-0.39,-0.17,0.08,0.35,0.66,1.0,1.34,1.67,1.96,2.21,2.41,2.55,2.67,2.77,2.87,2.97,3.06,3.16,3.26,3.36,3.44,3.53,3.6,3.67,3.73,3.81,3.89,3.98,4.08,4.2,4.31,4.43,4.54,4.63,4.72,4.79,4.85,4.9,4.94,4.98,5.01,5.05,5.08,5.1,5.12,5.13,5.13,5.13,5.12,5.11,5.09,5.08,5.05,5.02,4.99,4.95,4.9,4.84,4.78,4.71,4.64,4.57,4.49,4.4,4.3,4.19,4.08,3.97,3.84,3.72,3.6,3.48,3.35,3.22,3.1,2.96,2.82,2.69,2.57,2.44,2.32,2.19,2.05,1.89,1.73,1.55,1.35,1.16,0.96,0.77,0.58,0.4,0.25,0.1,-0.03,-0.16,-0.29,-0.43,-0.59,-0.75,-0.94,-1.11,-1.29,-1.45,-1.6,-1.73,-1.84,-1.94,-2.05,-2.16,-2.28,-2.39,-2.5,-2.6,-2.67,-2.73,-2.77,-2.78,-2.8,-2.81,-2.82,-2.84,-2.84,-2.84,-2.82,-2.82,-2.86,-2.96,-3.14,-3.33,-3.52,-3.6,-3.6,-3.54,-3.5,-3.61,-3.88,-4.32,-4.81,-5.19,-5.45,-5.36,-5.03,-4.55,-3.95,-3.54,-3.32,-3.35,-3.67,-3.93,-4.06,-3.72,-2.83,-1.64,-0.24,0.96,1.86,2.42,2.58,2.86,3.32,4.06,4.6,5.09,5.86,5.16,3.78,2.41,0.95,0.03,-0.27,0.14,0.47,0.49,0.15,-0.87,-1.87,-2.61,-3.19,-3.04,-2.31,-1.64,-0.76,-0.04,0.35,0.35,0.22,0.07,0.08,0.3,0.64,1.01,1.32,1.36,1.01,0.13,-0.97,-1.73,-2.1,-2.47,-2.37,-1.36,-0.42,0.56,1.69,2.68,3.35,3.68,3.58,3.27,2.81,2.23,1.65,1.08,0.52,-0.04,-0.59,-1.11,-1.48,-1.67,-1.64,-1.15,-0.36,0.67,1.88,2.89,3.65,4.02,3.81,3.38,2.81,2.34,2.14,2.19,2.56,3.12,3.69,4.21,4.33,4.11,3.54,2.46,1.09,-0.4,-1.89,-3.02,-3.81,-4.24,-4.25,-4.13,-3.98,-3.98,-4.44,-5.22,-6.35,-7.79,-9.22,-10.55,-11.57,-12.18,-12.5,-12.49,-12.21,-11.81,-11.29,-10.72,-10.13,-9.56,-9.05,-8.63,-8.32,-8.13,-8.06,-8.07,-8.14,-8.25,-8.35,-8.46,-8.53,-8.54,-8.53,-8.53,-8.51,-8.47,-8.45,-8.44,-8.45,-8.46,-8.47,-8.45,-8.37,-8.21,-8.02,-7.78,-7.52,-7.26,-7.04,-6.87,-6.81,-6.83,-6.91,-7.05,-7.16,-7.24,-7.24,-7.16,-7.03,-6.85,-6.64,-6.41,-6.2,-5.99,-5.81,-5.65,-5.5,-5.36,-5.22,-5.1,-4.97,-4.85,-4.74,-4.61,-4.49,-4.37,-4.24,-4.1,-3.98,-3.29,-3.23,-3.17,-3.1,-3.03,-2.94,-2.84,-2.73,-2.6,-2.46,-2.31,-2.16,-2.01,-1.87,-1.72,-1.57,-1.43,-1.28,-1.14,-0.99,-0.84,-0.69,-0.55,-0.4,-0.24,-0.09,0.06,0.22,0.37,0.53,0.68,0.83,0.97,1.11,1.24,1.37,1.5,1.64,1.78,1.93,2.1,2.26,2.42,2.56,2.71,2.84,2.96,3.07,3.18,3.26,3.35,3.44,3.5,3.58,3.65,3.71,3.78,3.84,3.91,3.97,4.03,4.1,4.16,4.23,4.29,4.35,4.41,4.47,4.51,4.56,4.6,4.63,4.66,4.69,4.71,4.72,4.73,4.74,4.74,4.74,4.73,4.72,4.7,4.68,4.65,4.61,4.56,4.52,4.48,4.44,4.4,4.35,4.31,4.28,4.23,4.18,4.13,4.08,4.01,3.95,3.88,3.81,3.73,3.65,3.56,3.49,3.4,3.31,3.22,3.13,3.02,2.93,2.82,2.71,2.58,2.45,2.31,2.17,2.02,1.87,1.71,1.55,1.4,1.25,1.11,0.97,0.84,0.71,0.58,0.46,0.34,0.21,0.07,-0.07,-0.21,-0.35,-0.5,-0.65,-0.8,-0.95,-1.11,-1.27,-1.42,-1.58,-1.73,-1.89,-2.03,-2.18,-2.33,-2.47,-2.61,-2.74,-2.87,-3.01,-3.13,-3.26,-3.37,-3.49,-3.58,-3.66,-3.73,-3.77,-3.79,-3.79,-3.76,-3.72,-3.66,-3.59,-3.52,-3.45,-3.4,-3.36,-3.34,-3.32,-3.32,-3.32,-3.3,-3.23,-3.14,-2.95,-2.73,-2.37,-1.98,-1.49,-0.98,-0.43,0.08,0.55,0.87,1.1,1.02,0.84,0.29,-0.36,-1.22,-2.12,-3.03,-3.72,-4.22,-4.22,-4.02,-3.28,-2.46,-1.42,-0.49,0.23,0.56,0.53,-0.01,-0.8,-1.91,-3.04,-4.02,-4.76,-4.96,-5.15,-5.36,-5.15,-4.7,-4.09,-3.45,-2.82,-2.25,-1.84,-1.55,-1.43,-1.45,-1.55,-1.72,-1.9,-2.08,-2.25,-2.38,-2.49,-2.58,-2.66,-2.72,-2.77,-2.82,-2.84,-2.86,-2.85,-2.85,-2.84,-2.81,-2.77,-2.71,-2.62,-2.5,-2.35,-2.14,-1.92,-1.65,-1.36,-1.07,-0.78,-0.48,-0.21,0.04,0.23,0.4,0.44,0.43,0.26,-0.01,-0.43,-1.0,-1.68,-2.47,-3.32,-4.21,-5.09,-5.89,-6.63,-7.23,-7.71,-8.05,-8.27,-8.42,-8.48,-8.5,-8.52,-8.56,-8.63,-8.71,-8.83,-8.93,-9.02,-9.08,-9.14,-9.12,-9.11,-9.02,-8.94,-8.85,-8.73,-8.6,-8.47,-8.34,-8.16,-7.98,-7.8,-7.63,-7.47,-7.34,-7.26,-7.22,-7.22,-7.24,-7.29,-7.32,-7.35,-7.37,-7.38,-7.36,-7.31,-7.24,-7.15,-7.06,-6.94,-6.83,-6.73,-6.64,-6.58,-6.52,-6.47,-6.43,-6.41,-6.41,-6.42,-6.42,-6.4,-6.36,-6.31,-6.26,-6.19,-6.13,-6.06,-5.99,-5.91,-5.82,-5.73,-5.61,-5.48,-5.34,-5.2,-5.03,-4.86,-4.7,-4.53,-4.38,-4.23,-4.09,-3.95,-3.83,-3.71,-3.61,-3.51,-3.43,-3.36,-3.22,-3.1,-2.99,-2.87,-2.75,-2.64,-2.52,-2.41,-2.29,-2.19,-2.09,-1.99,-1.89,-1.8,-1.73,-1.65,-1.58,-1.52,-1.46,-1.41,-1.36,-1.32,-1.27,-1.24,-1.21,-1.18,-1.15,-1.14,-1.12,-1.09,-1.06,-1.02,-0.95,-0.88,-0.77,-0.63,-0.46,-0.24,-0.01,0.25,0.54,0.84,1.14,1.45,1.74,2.01,2.27,2.49,2.68,2.85,2.97,3.08,3.16,3.22,3.26,3.31,3.35,3.39,3.44,3.5,3.56,3.64,3.72,3.81,3.9,4.0,4.1,4.2,4.29,4.37,4.45,4.51,4.57,4.62,4.66,4.7,4.71,4.73,4.75,4.75,4.75,4.75,4.74,4.73,4.72,4.7,4.68,4.66,4.63,4.61,4.58,4.55,4.52,4.48,4.44,4.4,4.37,4.32,4.28,4.24,4.19,4.15,4.1,4.06,4.02,3.97,3.92,3.87,3.81,3.75,3.68,3.62,3.54,3.47,3.38,3.29,3.19,3.07,2.96,2.83,2.7,2.56,2.42,2.27,2.12,1.97,1.81,1.66,1.51,1.36,1.23,1.1,0.98,0.86,0.75,0.66,0.57,0.49,0.41,0.33,0.25,0.17,0.09,0.0,-0.09,-0.19,-0.3,-0.4,-0.52,-0.63,-0.76,-0.87,-0.99,-1.1,-1.21,-1.32,-1.41,-1.51,-1.59,-1.67,-1.75,-1.81,-1.87,-1.92,-1.97,-2.01,-2.05,-2.08,-2.11,-2.14,-2.16,-2.18,-2.2,-2.21,-2.23,-2.25,-2.25,-2.27,-2.27,-2.28,-2.27,-2.26,-2.24,-2.21,-2.16,-2.12,-2.05,-1.97,-1.89,-1.79,-1.7,-1.61,-1.53,-1.44,-1.36,-1.28,-1.22,-1.16,-1.09,-1.03,-0.96,-0.9,-0.82,-0.75,-0.67,-0.6,-0.53,-0.47,-0.42,-0.4,-0.4,-0.41,-0.49,-0.58,-0.69,-0.84,-1.01,-1.2,-1.4,-1.6,-1.81,-2.01,-2.19,-2.37,-2.52,-2.64,-2.74,-2.79,-2.81,-2.81,-2.76,-2.68,-2.58,-2.46,-2.33,-2.18,-2.03,-1.89,-1.76,-1.63,-1.53,-1.45,-1.38,-1.34,-1.29,-1.27,-1.25,-1.23,-1.21,-1.19,-1.17,-1.15,-1.13,-1.13,-1.14,-1.16,-1.23,-1.3,-1.42,-1.56,-1.73,-1.94,-2.15,-2.38,-2.61,-2.85,-3.07,-3.29,-3.48,-3.66,-3.84,-3.97,-4.1,-4.22,-4.32,-4.42,-4.53,-4.63,-4.74,-4.86,-4.98,-5.11,-5.24,-5.37,-5.51,-5.65,-5.78,-5.92,-6.05,-6.17,-6.28,-6.38,-6.47,-6.54,-6.59,-6.65,-6.66,-6.66,-6.64,-6.6,-6.54,-6.48,-6.38,-6.27,-6.17,-6.06,-5.97,-5.88,-5.81,-5.74,-5.69,-5.64,-5.61,-5.58,-5.56,-5.55,-5.55,-5.55,-5.56,-5.56,-5.58,-5.59,-5.61,-5.63,-5.66,-5.68,-5.71,-5.74,-5.77,-5.8,-5.82,-5.84,-5.84,-5.84,-5.82,-5.79,-5.75,-5.7,-5.64,-5.57,-5.49,-5.41,-5.32,-5.22,-5.11,-5.01,-4.9,-4.8,-4.68,-4.55,-4.43,-4.31,-4.19,-4.07,-3.94,-3.82,-3.7,-3.58,-3.46,-3.34,-4.53,-4.46,-4.4,-4.33,-4.27,-4.2,-4.11,-4.02,-3.95,-3.86,-3.77,-3.68,-3.58,-3.48,-3.38,-3.28,-3.17,-3.07,-2.95,-2.85,-2.74,-2.62,-2.51,-2.4,-2.29,-2.18,-2.07,-1.96,-1.86,-1.75,-1.65,-1.54,-1.43,-1.32,-1.22,-1.12,-1.0,-0.88,-0.76,-0.64,-0.52,-0.37,-0.21,-0.05,0.1,0.26,0.46,0.67,0.87,1.07,1.29,1.53,1.77,2.01,2.25,2.5,2.75,3.0,3.25,3.49,3.73,3.95,4.18,4.41,4.6,4.79,4.96,5.14,5.28,5.4,5.51,5.61,5.7,5.74,5.77,5.81,5.83,5.81,5.77,5.72,5.68,5.62,5.55,5.49,5.42,5.35,5.26,5.17,5.08,4.98,4.89,4.8,4.7,4.61,4.53,4.44,4.36,4.28,4.2,4.12,4.06,4.01,3.95,3.89,3.84,3.8,3.76,3.72,3.68,3.66,3.63,3.61,3.59,3.57,3.55,3.54,3.52,3.5,3.48,3.47,3.45,3.43,3.41,3.38,3.37,3.34,3.31,3.28,3.24,3.21,3.17,3.13,3.08,3.03,2.99,2.94,2.89,2.83,2.78,2.73,2.67,2.62,2.58,2.53,2.48,2.44,2.41,2.38,2.34,2.31,2.3,2.28,2.26,2.25,2.25,2.25,2.25,2.25,2.25,2.26,2.27,2.28,2.29,2.3,2.32,2.33,2.34,2.35,2.36,2.37,2.38,2.39,2.39,2.4,2.41,2.42,2.42,2.41,2.41,2.41,2.4,2.39,2.37,2.36,2.35,2.33,2.31,2.29,2.27,2.24,2.21,2.18,2.15,2.12,2.08,2.04,2.0,1.96,1.93,1.89,1.85,1.81,1.78,1.74,1.7,1.67,1.64,1.61,1.59,1.57,1.55,1.53,1.51,1.5,1.49,1.48,1.46,1.45,1.44,1.44,1.43,1.42,1.39,1.37,1.36,1.34,1.31,1.27,1.23,1.2,1.15,1.09,1.03,0.98,0.92,0.84,0.76,0.69,0.61,0.54,0.45,0.37,0.29,0.21,0.13,0.05,-0.03,-0.1,-0.18,-0.24,-0.31,-0.38,-0.44,-0.5,-0.56,-0.61,-0.67,-0.72,-0.77,-0.83,-0.88,-0.93,-0.99,-1.04,-1.09,-1.15,-1.21,-1.27,-1.34,-1.41,-1.47,-1.55,-1.63,-1.71,-1.8,-1.88,-1.97,-2.06,-2.16,-2.25,-2.35,-2.45,-2.56,-2.66,-2.77,-2.87,-2.98,-3.09,-3.2,-3.31,-3.43,-3.54,-3.65,-3.77,-3.87,-3.98,-4.09,-4.2,-4.29,-4.39,-4.48,-4.58,-4.67,-4.74,-4.82,-4.9,-4.98,-5.04,-5.11,-5.18,-5.24,-5.3,-5.33,-5.38,-5.42,-5.45,-5.48,-5.5,-5.52,-5.53,-5.55,-5.55,-5.56,-5.57,-5.57,-5.58,-5.57,-5.57,-5.56,-5.55,-5.53,-5.52,-5.5,-5.48,-5.46,-5.44,-5.42,-5.39,-5.37,-5.34,-5.32,-5.29,-5.27,-5.24,-5.21,-5.18,-5.15,-5.12,-5.09,-5.05,-5.02,-4.98,-4.93,-4.89,-4.84,-4.8,-4.75,-4.69,-4.64,-4.58,-2.75,-2.69,-2.63,-2.57,-2.51,-2.45,-2.38,-2.32,-2.26,-2.19,-2.13,-2.06,-2.0,-1.93,-1.86,-1.79,-1.72,-1.66,-1.59,-1.52,-1.45,-1.37,-1.3,-1.23,-1.16,-1.09,-1.01,-0.94,-0.87,-0.79,-0.72,-0.64,-0.57,-0.5,-0.42,-0.35,-0.27,-0.2,-0.12,-0.05,0.03,0.1,0.18,0.25,0.33,0.4,0.48,0.55,0.63,0.7,0.78,0.85,0.92,1.0,1.07,1.14,1.22,1.29,1.36,1.43,1.5,1.57,1.64,1.71,1.78,1.85,1.91,1.98,2.05,2.11,2.18,2.24,2.31,2.37,2.43,2.49,2.56,2.62,2.67,2.73,2.79,2.85,2.9,2.96,3.01,3.07,3.12,3.17,3.22,3.27,3.32,3.37,3.41,3.46,3.5,3.54,3.59,3.63,3.67,3.71,3.74,3.78,3.82,3.85,3.88,3.92,3.95,3.98,4.0,4.03,4.06,4.08,4.11,4.13,4.15,4.17,4.19,4.2,4.22,4.23,4.25,4.26,4.27,4.28,4.29,4.29,4.3,4.3,4.31,4.31,4.31,4.31,4.3,4.3,4.29,4.29,4.28,4.27,4.26,4.25,4.24,4.22,4.21,4.19,4.17,4.15,4.13,4.11,4.09,4.06,4.04,4.01,3.98,3.95,3.92,3.89,3.86,3.82,3.79,3.75,3.71,3.68,3.64,3.6,3.55,3.51,3.47,3.42,3.38,3.33,3.28,3.23,3.18,3.13,3.08,3.02,2.97,2.92,2.86,2.8,2.75,2.69,2.63,2.57,2.51,2.45,2.38,2.32,2.26,2.19,2.13,2.06,2.0,1.93,1.86,1.79,1.72,1.66,1.59,1.52,1.45,1.37,1.3,1.23,1.16,1.09,1.01,0.94,0.87,0.79,0.72,0.64,0.57,0.5,0.42,0.35,0.27,0.2,0.12,0.05,-0.03,-0.1,-0.18,-0.25,-0.33,-0.4,-0.48,-0.55,-0.63,-0.7,-0.78,-0.85,-0.92,-1.0,-1.07,-1.14,-1.22,-1.29,-1.36,-1.43,-1.5,-1.57,-1.64,-1.71,-1.78,-1.85,-1.91,-1.98,-2.05,-2.11,-2.18,-2.24,-2.31,-2.37,-2.43,-2.49,-2.56,-2.62,-2.67,-2.73,-2.79,-2.85,-2.9,-2.96,-3.01,-3.07,-3.12,-3.17,-3.22,-3.27,-3.32,-3.37,-3.41,-3.46,-3.5,-3.54,-3.59,-3.63,-3.67,-3.71,-3.74,-3.78,-3.82,-3.85,-3.88,-3.92,-3.95,-3.98,-4.0,-4.03,-4.06,-4.08,-4.11,-4.13,-4.15,-4.17,-4.19,-4.2,-4.22,-4.23,-4.25,-4.26,-4.27,-4.28,-4.29,-4.29,-4.3,-4.3,-4.31,-4.31,-4.31,-4.31,-4.3,-4.3,-4.29,-4.29,-4.28,-4.27,-4.26,-4.25,-4.24,-4.22,-4.21,-4.19,-4.17,-4.15,-4.13,-4.11,-4.09,-4.06,-4.04,-4.01,-3.98,-3.95,-3.92,-3.89,-3.86,-3.82,-3.79,-3.75,-3.71,-3.68,-3.64,-3.6,-3.55,-3.51,-3.47,-3.42,-3.38,-3.33,-3.28,-3.23,-3.18,-3.13,-3.08,-3.02,-2.97,-2.92,-2.86,-2.8]},{"header":{"discipline":0,"disciplineName":"Meteorological products","gribEdition":2,"gribLength":76936,"center":7,"centerName":"US National Weather Service - NCEP(WMC)","subcenter":0,"refTime":"2016-04-30T06:00:00.000Z","significanceOfRT":1,"significanceOfRTName":"Start of forecast","productStatus":0,"productStatusName":"Operational products","productType":1,"productTypeName":"Forecast products","productDefinitionTemplate":0,"productDefinitionTemplateName":"Analysis/forecast at horizontal level/layer at a point in time","parameterCategory":2,"parameterCategoryName":"Momentum","parameterNumber":3,"parameterNumberName":"V-component_of_wind","parameterUnit":"m.s-1","genProcessType":2,"genProcessTypeName":"Forecast","forecastTime":0,"surface1Type":103,"surface1TypeName":"Specified height level above ground","surface1Value":10.0,"surface2Type":255,"surface2TypeName":"Missing","surface2Value":0.0,"gridDefinitionTemplate":0,"gridDefinitionTemplateName":"Latitude_Longitude","numberPoints":65160,"shape":6,"shapeName":"Earth spherical with radius of 6,371,229.0 m","gridUnits":"degrees","resolution":48,"winds":"true","scanMode":0,"nx":360,"ny":181,"basicAngle":0,"subDivisions":0,"lo1":0.0,"la1":90.0,"lo2":359.0,"la2":-90.0,"dx":1.0,"dy":1.0},"data":[-1.36,-1.44,-1.52,-1.6,-1.68,-1.76,-1.83,-1.91,-1.98,-2.06,-2.13,-2.21,-2.28,-2.35,-2.42,-2.49,-2.56,-2.63,-2.7,-2.77,-2.84,-2.9,-2.97,-3.03,-3.09,-3.16,-3.22,-3.28,-3.34,-3.4,-3.45,-3.51,-3.57,-3.62,-3.67,-3.72,-3.77,-3.82,-3.87,-3.92,-3.97,-4.01,-4.05,-4.1,-4.14,-4.18,-4.22,-4.25,-4.29,-4.32,-4.36,-4.39,-4.42,-4.45,-4.48,-4.5,-4.53,-4.55,-4.58,-4.6,-4.62,-4.64,-4.65,-4.67,-4.68,-4.69,-4.71,-4.72,-4.72,-4.73,-4.74,-4.74,-4.74,-4.74,-4.74,-4.74,-4.74,-4.73,-4.73,-4.72,-4.71,-4.7,-4.69,-4.68,-4.66,-4.65,-4.63,-4.61,-4.59,-4.57,-4.54,-4.52,-4.49,-4.47,-4.44,-4.41,-4.38,-4.34,-4.31,-4.27,-4.24,-4.2,-4.16,-4.12,-4.08,-4.04,-3.99,-3.95,-3.9,-3.85,-3.8,-3.75,-3.7,-3.65,-3.6,-3.54,-3.49,-3.43,-3.37,-3.31,-3.25,-3.19,-3.13,-3.07,-3.0,-2.94,-2.87,-2.81,-2.74,-2.67,-2.6,-2.53,-2.46,-2.39,-2.32,-2.25,-2.17,-2.1,-2.03,-1.95,-1.87,-1.8,-1.72,-1.64,-1.57,-1.49,-1.41,-1.33,-1.25,-1.17,-1.09,-1.01,-0.93,-0.85,-0.76,-0.68,-0.6,-0.52,-0.44,-0.35,-0.27,-0.19,-0.11,-0.02,0.06,0.14,0.23,0.31,0.39,0.47,0.56,0.64,0.72,0.8,0.88,0.96,1.04,1.13,1.21,1.29,1.36,1.44,1.52,1.6,1.68,1.76,1.83,1.91,1.98,2.06,2.13,2.21,2.28,2.35,2.42,2.49,2.56,2.63,2.7,2.77,2.84,2.9,2.97,3.03,3.09,3.16,3.22,3.28,3.34,3.4,3.45,3.51,3.57,3.62,3.67,3.72,3.77,3.82,3.87,3.92,3.97,4.01,4.05,4.1,4.14,4.18,4.22,4.25,4.29,4.32,4.36,4.39,4.42,4.45,4.48,4.5,4.53,4.55,4.58,4.6,4.62,4.64,4.65,4.67,4.68,4.69,4.71,4.72,4.72,4.73,4.74,4.74,4.74,4.74,4.74,4.74,4.74,4.73,4.73,4.72,4.71,4.7,4.69,4.68,4.66,4.65,4.63,4.61,4.59,4.57,4.54,4.52,4.49,4.47,4.44,4.41,4.38,4.34,4.31,4.27,4.24,4.2,4.16,4.12,4.08,4.04,3.99,3.95,3.9,3.85,3.8,3.75,3.7,3.65,3.6,3.54,3.49,3.43,3.37,3.31,3.25,3.19,3.13,3.07,3.0,2.94,2.87,2.81,2.74,2.67,2.6,2.53,2.46,2.39,2.32,2.25,2.17,2.1,2.03,1.95,1.87,1.8,1.72,1.64,1.57,1.49,1.41,1.33,1.25,1.17,1.09,1.01,0.93,0.85,0.76,0.68,0.6,0.52,0.44,0.35,0.27,0.19,0.11,0.02,-0.06,-0.14,-0.23,-0.31,-0.39,-0.47,-0.56,-0.64,-0.72,-0.8,-0.88,-0.96,-1.04,-1.13,-1.21,-1.29,-1.16,-1.2,-1.25,-1.3,-1.35,-1.4,-1.45,-1.5,-1.54,-1.59,-1.65,-1.69,-1.75,-1.8,-1.85,-1.9,-1.95,-2.01,-2.06,-2.12,-2.17,-2.22,-2.28,-2.33,-2.39,-2.44,-2.49,-2.55,-2.6,-2.65,-2.71,-2.75,-2.81,-2.87,-2.93,-2.99,-3.04,-3.1,-3.16,-3.22,-3.27,-3.33,-3.39,-3.45,-3.5,-3.56,-3.61,-3.66,-3.71,-3.76,-3.81,-3.87,-3.92,-3.98,-4.03,-4.08,-4.13,-4.18,-4.23,-4.27,-4.31,-4.35,-4.39,-4.43,-4.47,-4.51,-4.55,-4.58,-4.62,-4.65,-4.69,-4.71,-4.75,-4.78,-4.8,-4.84,-4.86,-4.88,-4.9,-4.91,-4.93,-4.94,-4.94,-4.94,-4.94,-4.94,-4.94,-4.93,-4.93,-4.93,-4.93,-4.91,-4.89,-4.88,-4.86,-4.85,-4.82,-4.8,-4.77,-4.75,-4.71,-4.68,-4.64,-4.61,-4.57,-4.52,-4.48,-4.43,-4.38,-4.33,-4.28,-4.22,-4.16,-4.1,-4.04,-3.97,-3.91,-3.85,-3.77,-3.7,-3.62,-3.55,-3.47,-3.39,-3.3,-3.23,-3.14,-3.05,-2.96,-2.87,-2.79,-2.7,-2.61,-2.51,-2.42,-2.33,-2.23,-2.14,-2.04,-1.95,-1.85,-1.75,-1.65,-1.56,-1.46,-1.36,-1.26,-1.16,-1.06,-0.96,-0.86,-0.76,-0.66,-0.55,-0.46,-0.35,-0.25,-0.15,-0.05,0.05,0.15,0.25,0.35,0.45,0.55,0.65,0.74,0.84,0.94,1.03,1.13,1.23,1.32,1.41,1.5,1.6,1.69,1.78,1.87,1.96,2.04,2.13,2.21,2.3,2.38,2.47,2.55,2.63,2.71,2.8,2.87,2.95,3.02,3.1,3.17,3.25,3.32,3.4,3.46,3.54,3.6,3.67,3.73,3.8,3.86,3.92,3.98,4.04,4.09,4.15,4.2,4.25,4.29,4.33,4.37,4.41,4.44,4.48,4.51,4.55,4.58,4.6,4.63,4.65,4.67,4.7,4.71,4.72,4.74,4.75,4.76,4.76,4.76,4.76,4.76,4.75,4.75,4.74,4.73,4.73,4.71,4.7,4.68,4.67,4.65,4.63,4.6,4.58,4.55,4.53,4.5,4.47,4.44,4.4,4.37,4.33,4.29,4.25,4.21,4.17,4.12,4.08,4.03,3.98,3.94,3.89,3.84,3.79,3.74,3.69,3.64,3.59,3.53,3.48,3.43,3.37,3.32,3.27,3.21,3.16,3.1,3.05,2.99,2.93,2.88,2.82,2.76,2.7,2.64,2.59,2.53,2.47,2.41,2.35,2.29,2.23,2.17,2.11,2.05,1.99,1.93,1.87,1.81,1.75,1.69,1.63,1.57,1.51,1.45,1.39,1.34,1.27,1.22,1.16,1.11,1.05,0.99,0.93,0.87,0.82,0.76,0.71,0.66,0.6,0.55,0.49,0.45,0.39,0.34,0.29,0.24,0.19,0.14,0.09,0.04,0.0,-0.05,-0.1,-0.15,-0.19,-0.24,-0.29,-0.33,-0.38,-0.42,-0.47,-0.52,-0.56,-0.6,-0.65,-0.7,-0.74,-0.79,-0.83,-0.88,-0.93,-0.97,-1.02,-1.06,-1.11,-0.91,-0.93,-0.96,-0.99,-1.02,-1.05,-1.08,-1.12,-1.15,-1.19,-1.22,-1.27,-1.3,-1.35,-1.39,-1.44,-1.48,-1.53,-1.58,-1.63,-1.68,-1.73,-1.79,-1.84,-1.9,-1.96,-2.01,-2.08,-2.13,-2.19,-2.25,-2.31,-2.38,-2.44,-2.5,-2.56,-2.62,-2.68,-2.74,-2.8,-2.86,-2.92,-2.98,-3.04,-3.09,-3.15,-3.2,-3.26,-3.31,-3.37,-3.43,-3.49,-3.55,-3.6,-3.66,-3.72,-3.78,-3.84,-3.89,-3.95,-4.0,-4.06,-4.11,-4.16,-4.21,-4.26,-4.31,-4.35,-4.39,-4.43,-4.47,-4.5,-4.53,-4.56,-4.59,-4.62,-4.64,-4.66,-4.68,-4.7,-4.72,-4.73,-4.75,-4.75,-4.76,-4.77,-4.77,-4.77,-4.77,-4.76,-4.76,-4.75,-4.74,-4.72,-4.7,-4.68,-4.66,-4.64,-4.62,-4.59,-4.57,-4.54,-4.52,-4.49,-4.45,-4.41,-4.36,-4.33,-4.29,-4.23,-4.17,-4.11,-4.04,-3.98,-3.89,-3.81,-3.73,-3.63,-3.54,-3.42,-3.3,-3.19,-3.1,-3.0,-2.89,-2.77,-2.66,-2.56,-2.46,-2.36,-2.25,-2.14,-2.03,-1.92,-1.8,-1.7,-1.59,-1.48,-1.36,-1.24,-1.12,-0.99,-0.87,-0.76,-0.64,-0.51,-0.39,-0.26,-0.13,0.0,0.13,0.25,0.37,0.5,0.63,0.76,0.87,0.99,1.1,1.21,1.32,1.43,1.55,1.66,1.75,1.87,1.97,2.07,2.16,2.24,2.31,2.37,2.42,2.49,2.56,2.63,2.69,2.76,2.83,2.91,2.99,3.07,3.15,3.22,3.3,3.37,3.42,3.49,3.55,3.6,3.65,3.71,3.76,3.81,3.85,3.88,3.94,4.0,4.07,4.13,4.19,4.26,4.31,4.37,4.42,4.46,4.5,4.54,4.58,4.61,4.63,4.66,4.69,4.71,4.73,4.75,4.77,4.79,4.83,4.85,4.87,4.89,4.9,4.92,4.94,4.95,4.95,4.95,4.94,4.93,4.92,4.89,4.87,4.84,4.81,4.77,4.72,4.68,4.63,4.59,4.53,4.48,4.43,4.37,4.31,4.25,4.19,4.12,4.05,3.98,3.91,3.83,3.75,3.67,3.58,3.49,3.4,3.31,3.22,3.13,3.04,2.95,2.86,2.77,2.67,2.59,2.5,2.41,2.33,2.24,2.15,2.07,1.98,1.88,1.8,1.71,1.62,1.53,1.44,1.34,1.25,1.15,1.05,0.95,0.86,0.76,0.66,0.57,0.47,0.37,0.28,0.18,0.09,-0.01,-0.09,-0.18,-0.26,-0.34,-0.42,-0.49,-0.56,-0.62,-0.68,-0.74,-0.79,-0.83,-0.87,-0.91,-0.94,-0.96,-0.99,-1.01,-1.02,-1.03,-1.04,-1.05,-1.05,-1.05,-1.04,-1.04,-1.03,-1.02,-1.01,-1.0,-0.99,-0.97,-0.96,-0.95,-0.93,-0.91,-0.9,-0.88,-0.87,-0.85,-0.83,-0.82,-0.81,-0.8,-0.79,-0.77,-0.77,-0.76,-0.76,-0.75,-0.75,-0.74,-0.74,-0.74,-0.74,-0.75,-0.75,-0.76,-0.77,-0.78,-0.79,-0.81,-0.83,-0.84,-0.86,-0.88,0.64,0.63,0.61,0.58,0.55,0.5,0.44,0.37,0.3,0.22,0.14,0.04,-0.05,-0.14,-0.24,-0.33,-0.42,-0.51,-0.6,-0.69,-0.78,-0.86,-0.95,-1.02,-1.09,-1.16,-1.25,-1.32,-1.4,-1.48,-1.56,-1.64,-1.73,-1.82,-1.91,-2.0,-2.08,-2.17,-2.25,-2.35,-2.43,-2.51,-2.58,-2.66,-2.74,-2.81,-2.9,-2.97,-3.04,-3.11,-3.2,-3.28,-3.38,-3.46,-3.53,-3.61,-3.72,-3.82,-3.9,-3.98,-4.08,-4.13,-4.19,-4.26,-4.33,-4.4,-4.46,-4.51,-4.56,-4.61,-4.66,-4.71,-4.77,-4.82,-4.84,-4.86,-4.88,-4.89,-4.88,-4.85,-4.83,-4.81,-4.79,-4.76,-4.74,-4.74,-4.73,-4.72,-4.71,-4.68,-4.66,-4.65,-4.65,-4.64,-4.61,-4.58,-4.56,-4.54,-4.52,-4.5,-4.46,-4.41,-4.36,-4.35,-4.32,-4.27,-4.22,-4.17,-4.12,-4.06,-4.0,-3.95,-3.87,-3.8,-3.73,-3.65,-3.57,-3.47,-3.37,-3.27,-3.18,-3.07,-2.97,-2.87,-2.76,-2.64,-2.52,-2.4,-2.29,-2.18,-2.06,-1.94,-1.82,-1.7,-1.61,-1.5,-1.41,-1.34,-1.27,-1.21,-1.17,-1.15,-1.12,-1.09,-1.07,-1.05,-1.01,-0.96,-0.88,-0.8,-0.67,-0.54,-0.35,-0.17,0.05,0.27,0.49,0.73,0.96,1.16,1.35,1.51,1.66,1.78,1.87,1.94,2.01,2.09,2.17,2.26,2.33,2.4,2.5,2.61,2.72,2.84,2.99,3.12,3.26,3.4,3.54,3.69,3.83,3.98,4.12,4.27,4.41,4.54,4.68,4.83,4.98,5.11,5.2,5.28,5.35,5.4,5.43,5.44,5.45,5.42,5.37,5.33,5.28,5.26,5.23,5.22,5.22,5.23,5.26,5.28,5.3,5.33,5.36,5.4,5.43,5.45,5.45,5.44,5.43,5.4,5.37,5.32,5.26,5.19,5.13,5.09,5.04,5.01,4.97,4.95,4.91,4.88,4.83,4.78,4.71,4.65,4.57,4.48,4.38,4.28,4.18,4.06,3.95,3.83,3.71,3.59,3.46,3.34,3.21,3.08,2.95,2.81,2.67,2.53,2.39,2.24,2.09,1.95,1.81,1.67,1.53,1.39,1.26,1.14,1.01,0.89,0.77,0.66,0.54,0.44,0.32,0.21,0.11,-0.01,-0.11,-0.22,-0.33,-0.44,-0.55,-0.67,-0.78,-0.9,-1.01,-1.12,-1.23,-1.33,-1.44,-1.53,-1.62,-1.71,-1.79,-1.86,-1.93,-1.99,-2.04,-2.09,-2.12,-2.16,-2.19,-2.21,-2.23,-2.24,-2.25,-2.28,-2.3,-2.31,-2.33,-2.35,-2.37,-2.38,-2.36,-2.35,-2.37,-2.38,-2.37,-2.32,-2.27,-2.23,-2.21,-2.16,-2.12,-2.08,-2.04,-2.0,-1.96,-1.92,-1.88,-1.82,-1.77,-1.71,-1.65,-1.58,-1.51,-1.43,-1.35,-1.27,-1.18,-1.09,-1.01,-0.91,-0.82,-0.73,-0.63,-0.53,-0.44,-0.33,-0.24,-0.15,-0.05,0.03,0.12,0.2,0.28,0.35,0.42,0.48,0.53,0.57,0.6,0.62,0.94,1.06,1.17,1.29,1.39,1.49,1.58,1.68,1.76,1.82,1.88,1.95,1.99,2.01,2.0,1.96,1.9,1.81,1.67,1.51,1.32,1.11,0.89,0.67,0.45,0.24,0.05,-0.14,-0.32,-0.48,-0.63,-0.77,-0.89,-1.01,-1.13,-1.25,-1.36,-1.48,-1.6,-1.71,-1.83,-1.95,-2.06,-2.18,-2.29,-2.4,-2.5,-2.6,-2.71,-2.82,-2.94,-3.06,-3.18,-3.3,-3.42,-3.54,-3.66,-3.77,-3.89,-4.0,-4.11,-4.24,-4.36,-4.48,-4.6,-4.72,-4.83,-4.93,-5.03,-5.1,-5.18,-5.23,-5.27,-5.3,-5.3,-5.28,-5.24,-5.21,-5.14,-5.06,-4.96,-4.88,-4.83,-4.78,-4.74,-4.71,-4.68,-4.66,-4.65,-4.64,-4.63,-4.61,-4.6,-4.59,-4.56,-4.54,-4.52,-4.49,-4.45,-4.41,-4.37,-4.32,-4.26,-4.19,-4.1,-3.99,-3.92,-3.84,-3.75,-3.66,-3.57,-3.49,-3.41,-3.33,-3.28,-3.19,-3.11,-3.04,-2.96,-2.89,-2.82,-2.74,-2.65,-2.56,-2.49,-2.41,-2.33,-2.26,-2.17,-2.1,-2.03,-1.95,-1.86,-1.76,-1.66,-1.54,-1.42,-1.29,-1.15,-1.01,-0.86,-0.71,-0.57,-0.43,-0.29,-0.14,0.01,0.18,0.37,0.57,0.78,1.0,1.22,1.44,1.66,1.86,2.04,2.22,2.37,2.51,2.62,2.72,2.8,2.89,2.96,3.03,3.1,3.16,3.21,3.27,3.31,3.34,3.37,3.38,3.39,3.41,3.43,3.45,3.48,3.55,3.66,3.79,3.94,4.1,4.29,4.41,4.49,4.55,4.56,4.57,4.6,4.61,4.65,4.72,4.83,5.0,5.18,5.34,5.51,5.62,5.67,5.74,5.78,5.8,5.8,5.78,5.76,5.76,5.75,5.73,5.7,5.71,5.71,5.72,5.75,5.78,5.81,5.84,5.87,5.88,5.88,5.86,5.82,5.76,5.68,5.58,5.48,5.36,5.23,5.09,4.96,4.83,4.71,4.61,4.51,4.41,4.3,4.17,4.03,3.87,3.69,3.5,3.31,3.1,2.9,2.69,2.48,2.27,2.06,1.85,1.64,1.43,1.22,1.01,0.81,0.62,0.43,0.25,0.09,-0.06,-0.2,-0.33,-0.45,-0.57,-0.68,-0.77,-0.87,-0.96,-1.05,-1.12,-1.21,-1.29,-1.36,-1.44,-1.53,-1.61,-1.71,-1.79,-1.89,-1.99,-2.08,-2.18,-2.28,-2.38,-2.47,-2.57,-2.68,-2.79,-2.9,-3.0,-3.09,-3.18,-3.26,-3.35,-3.43,-3.55,-3.68,-3.8,-3.99,-4.15,-4.25,-4.3,-4.3,-4.31,-4.29,-4.29,-4.32,-4.34,-4.42,-4.48,-4.48,-4.51,-4.5,-4.49,-4.49,-4.47,-4.45,-4.46,-4.41,-4.32,-4.24,-4.17,-4.11,-4.03,-3.96,-3.87,-3.77,-3.66,-3.55,-3.44,-3.33,-3.22,-3.1,-2.97,-2.84,-2.71,-2.58,-2.43,-2.28,-2.14,-1.98,-1.81,-1.65,-1.48,-1.32,-1.16,-1.0,-0.85,-0.7,-0.56,-0.42,-0.28,-0.14,0.01,0.14,0.29,0.42,0.56,0.69,0.82,2.63,2.75,2.84,2.9,2.95,3.0,3.05,3.11,3.09,3.1,3.13,3.17,3.18,3.18,3.08,3.08,3.08,3.06,3.04,3.02,3.01,2.96,2.87,2.75,2.58,2.37,2.12,1.83,1.52,1.18,0.85,0.53,0.22,-0.07,-0.31,-0.54,-0.75,-0.92,-1.09,-1.26,-1.42,-1.56,-1.69,-1.83,-1.96,-2.07,-2.19,-2.3,-2.43,-2.57,-2.72,-2.87,-3.04,-3.2,-3.36,-3.5,-3.64,-3.78,-3.91,-4.05,-4.19,-4.33,-4.47,-4.6,-4.72,-4.84,-4.97,-5.12,-5.26,-5.37,-5.41,-5.43,-5.42,-5.38,-5.33,-5.26,-5.19,-5.13,-5.06,-5.02,-4.99,-4.98,-4.99,-5.0,-4.98,-4.94,-4.9,-4.86,-4.83,-4.81,-4.8,-4.76,-4.72,-4.64,-4.57,-4.49,-4.42,-4.31,-4.21,-4.14,-4.07,-3.99,-3.91,-3.86,-3.81,-3.78,-3.78,-3.77,-3.76,-3.73,-3.73,-3.69,-3.63,-3.55,-3.44,-3.28,-3.09,-2.86,-2.6,-2.29,-1.94,-1.56,-1.16,-0.73,-0.28,0.16,0.58,0.95,1.28,1.56,1.78,1.95,2.1,2.2,2.28,2.31,2.32,2.34,2.34,2.31,2.3,2.27,2.24,2.21,2.2,2.21,2.19,2.25,2.27,2.3,2.33,2.34,2.36,2.37,2.39,2.43,2.51,2.59,2.67,2.78,2.84,2.91,2.97,3.0,2.99,3.0,2.98,2.98,2.96,2.98,3.01,3.04,3.11,3.19,3.28,3.35,3.41,3.45,3.46,3.44,3.37,3.24,3.09,2.96,2.87,2.86,2.97,3.23,3.66,4.06,4.41,4.65,4.77,4.83,4.82,4.81,4.81,4.86,4.96,5.07,5.2,5.36,5.53,5.62,5.71,5.79,5.85,5.92,6.0,6.09,6.18,6.24,6.29,6.31,6.29,6.26,6.23,6.22,6.2,6.2,6.22,6.2,6.12,6.07,6.0,5.91,5.79,5.65,5.48,5.29,5.09,4.88,4.67,4.46,4.27,4.09,3.91,3.72,3.52,3.3,3.06,2.8,2.52,2.23,1.93,1.64,1.34,1.06,0.77,0.49,0.21,-0.06,-0.32,-0.57,-0.8,-1.01,-1.2,-1.37,-1.51,-1.64,-1.75,-1.84,-1.92,-1.98,-2.02,-2.05,-2.07,-2.08,-2.09,-2.09,-2.1,-2.11,-2.13,-2.16,-2.21,-2.26,-2.32,-2.4,-2.5,-2.6,-2.71,-2.82,-2.94,-3.07,-3.25,-3.38,-3.51,-3.66,-3.83,-4.03,-4.26,-4.56,-4.82,-5.09,-5.3,-5.48,-5.63,-5.75,-5.87,-6.0,-6.11,-6.18,-6.25,-6.3,-6.33,-6.34,-6.34,-6.31,-6.28,-6.24,-6.21,-6.18,-6.14,-6.1,-5.99,-5.88,-5.76,-5.63,-5.54,-5.48,-5.34,-5.19,-5.06,-4.93,-4.8,-4.66,-4.5,-4.35,-4.2,-4.04,-3.89,-3.73,-3.56,-3.39,-3.2,-3.01,-2.81,-2.58,-2.34,-2.1,-1.83,-1.55,-1.27,-0.98,-0.71,-0.44,-0.19,0.06,0.3,0.55,0.8,1.04,1.26,1.46,1.67,1.84,2.02,2.19,2.36,2.51,5.03,4.78,4.63,4.43,4.28,4.18,4.15,4.16,4.16,4.1,4.1,4.17,4.14,4.14,4.16,4.16,4.1,4.05,4.01,3.94,3.87,3.79,3.7,3.59,3.51,3.34,3.17,3.0,2.83,2.55,2.24,2.0,1.63,1.22,0.84,0.45,0.11,-0.21,-0.49,-0.75,-0.99,-1.2,-1.39,-1.59,-1.76,-1.91,-2.03,-2.16,-2.29,-2.44,-2.6,-2.77,-2.96,-3.15,-3.33,-3.51,-3.68,-3.85,-4.02,-4.19,-4.33,-4.48,-4.61,-4.69,-4.78,-4.89,-5.01,-5.13,-5.21,-5.27,-5.31,-5.32,-5.32,-5.31,-5.29,-5.27,-5.25,-5.21,-5.14,-5.08,-5.02,-4.97,-4.93,-4.89,-4.9,-4.89,-4.9,-4.91,-4.92,-4.93,-4.88,-4.81,-4.75,-4.69,-4.65,-4.62,-4.6,-4.59,-4.59,-4.54,-4.44,-4.29,-4.12,-3.88,-3.61,-3.34,-3.05,-2.73,-2.45,-2.16,-1.9,-1.69,-1.48,-1.33,-1.21,-1.11,-1.03,-0.93,-0.83,-0.72,-0.61,-0.49,-0.37,-0.25,-0.13,0.0,0.12,0.24,0.36,0.48,0.59,0.69,0.79,0.87,0.95,1.02,1.09,1.15,1.22,1.27,1.34,1.4,1.42,1.43,1.46,1.53,1.59,1.66,1.72,1.78,1.85,1.91,1.98,2.06,2.14,2.23,2.32,2.41,2.48,2.54,2.6,2.64,2.66,2.68,2.69,2.7,2.7,2.7,2.71,2.73,2.76,2.8,2.82,2.84,2.84,2.8,2.75,2.7,2.66,2.68,2.78,2.9,3.06,3.18,3.22,3.15,2.99,2.83,2.76,2.93,3.23,3.83,4.45,4.89,5.11,5.19,5.15,5.09,5.01,5.09,5.28,5.5,5.73,5.9,6.08,6.21,6.32,6.42,6.49,6.57,6.68,6.76,6.74,6.73,6.7,6.67,6.64,6.62,6.61,6.57,6.5,6.41,6.31,6.21,6.1,6.0,5.85,5.69,5.5,5.29,5.06,4.81,4.54,4.29,4.03,3.77,3.5,3.22,2.92,2.6,2.26,1.91,1.55,1.18,0.8,0.43,0.07,-0.27,-0.61,-0.93,-1.25,-1.54,-1.82,-2.08,-2.31,-2.51,-2.67,-2.8,-2.89,-2.95,-2.99,-3.0,-2.98,-2.93,-2.87,-2.78,-2.68,-2.58,-2.48,-2.39,-2.34,-2.31,-2.3,-2.32,-2.33,-2.37,-2.42,-2.48,-2.53,-2.6,-2.66,-2.7,-2.8,-2.94,-3.01,-3.08,-3.3,-3.51,-3.74,-4.01,-4.29,-4.57,-4.93,-5.26,-5.59,-5.87,-6.14,-6.38,-6.59,-6.77,-6.91,-7.02,-7.09,-7.12,-7.09,-7.0,-6.86,-6.69,-6.53,-6.39,-6.27,-6.17,-6.1,-5.99,-5.9,-5.81,-5.69,-5.52,-5.3,-5.06,-4.78,-4.5,-4.24,-3.99,-3.75,-3.51,-3.28,-3.05,-2.83,-2.58,-2.28,-1.93,-1.53,-1.14,-0.79,-0.49,-0.21,0.1,0.43,0.86,1.35,1.88,2.44,3.03,3.56,4.07,4.46,4.83,5.05,5.21,5.37,5.5,5.59,5.74,5.8,5.77,5.67,5.48,5.42,5.21,7.01,6.94,6.93,6.85,6.65,6.38,6.03,5.67,5.33,5.17,5.06,4.84,4.63,4.47,4.34,4.26,4.15,3.91,3.85,3.83,3.8,3.76,3.72,3.66,3.59,3.55,3.45,3.31,3.18,2.97,2.76,2.5,2.14,1.76,1.36,0.97,0.59,0.23,-0.11,-0.42,-0.73,-1.02,-1.33,-1.59,-1.77,-1.96,-2.19,-2.5,-2.77,-3.0,-3.22,-3.41,-3.58,-3.66,-3.8,-4.05,-4.25,-4.42,-4.56,-4.69,-4.84,-5.01,-5.16,-5.28,-5.35,-5.35,-5.38,-5.42,-5.44,-5.47,-5.48,-5.47,-5.46,-5.46,-5.44,-5.44,-5.4,-5.36,-5.32,-5.29,-5.29,-5.29,-5.29,-5.29,-5.27,-5.25,-5.21,-5.17,-5.13,-5.15,-5.19,-5.22,-5.29,-5.31,-5.32,-5.28,-5.07,-4.83,-4.5,-4.16,-3.82,-3.5,-3.22,-3.02,-2.83,-2.67,-2.49,-2.31,-2.13,-1.97,-1.81,-1.69,-1.56,-1.46,-1.37,-1.31,-1.26,-1.21,-1.15,-1.09,-1.01,-0.9,-0.79,-0.66,-0.55,-0.44,-0.36,-0.28,-0.24,-0.19,-0.15,-0.1,-0.05,0.02,0.07,0.13,0.19,0.26,0.31,0.36,0.41,0.48,0.58,0.71,0.85,1.0,1.15,1.3,1.44,1.56,1.68,1.8,1.9,2.0,2.09,2.19,2.27,2.36,2.43,2.5,2.56,2.62,2.67,2.7,2.72,2.73,2.73,2.72,2.71,2.69,2.66,2.62,2.58,2.54,2.5,2.49,2.49,2.5,2.47,2.38,2.19,1.91,1.67,1.55,1.62,1.85,2.16,2.37,2.44,2.45,2.61,3.01,3.73,4.66,5.29,5.51,5.45,5.28,5.15,5.39,5.68,5.9,6.04,6.16,6.4,6.54,6.64,6.7,6.78,6.83,6.88,6.87,6.75,6.62,6.57,6.59,6.59,6.54,6.49,6.42,6.36,6.29,6.25,6.15,6.03,5.89,5.71,5.5,5.29,5.04,4.81,4.57,4.3,3.99,3.65,3.29,2.9,2.49,2.08,1.66,1.22,0.78,0.33,-0.13,-0.58,-0.98,-1.36,-1.71,-2.03,-2.34,-2.63,-2.92,-3.17,-3.39,-3.58,-3.72,-3.82,-3.89,-3.92,-3.92,-3.89,-3.83,-3.76,-3.7,-3.65,-3.64,-3.65,-3.67,-3.7,-3.71,-3.71,-3.73,-3.73,-3.78,-3.88,-4.02,-4.06,-3.93,-3.46,-2.76,-2.04,-1.24,-0.54,-0.08,0.21,0.23,0.07,0.01,0.15,0.23,0.02,-0.64,-1.5,-2.31,-3.11,-4.11,-5.3,-6.42,-7.24,-7.64,-7.71,-7.63,-7.45,-7.17,-6.79,-6.38,-6.0,-5.77,-5.65,-5.58,-5.46,-5.2,-4.67,-3.87,-2.95,-1.91,-0.79,-0.07,0.27,0.54,0.83,1.22,1.7,1.91,1.64,0.87,0.18,-0.38,-0.75,-0.56,0.16,1.03,1.59,1.48,1.34,0.87,0.28,0.05,0.14,0.49,1.07,1.88,3.0,4.33,5.56,6.63,7.54,8.18,8.6,8.68,8.7,8.68,8.69,8.63,8.38,8.21,7.9,7.6,7.28,7.1,7.69,7.41,7.14,6.86,6.53,6.23,5.99,5.82,5.65,5.41,5.14,4.8,4.45,4.2,4.09,4.06,4.01,3.87,3.72,3.55,3.44,3.32,3.17,2.94,2.75,2.63,2.53,2.47,2.52,2.52,2.52,2.44,2.29,1.99,1.54,1.06,0.61,0.22,-0.14,-0.5,-0.86,-1.2,-1.52,-1.78,-2.0,-2.18,-2.39,-2.6,-2.82,-3.04,-3.27,-3.51,-3.72,-3.91,-4.11,-4.25,-4.29,-4.17,-4.04,-4.12,-4.45,-4.77,-4.98,-5.14,-5.32,-5.51,-5.61,-5.62,-5.61,-5.61,-5.67,-5.74,-5.81,-5.88,-5.89,-5.91,-5.93,-5.98,-6.03,-6.04,-6.03,-5.99,-5.92,-5.84,-5.77,-5.72,-5.74,-5.8,-5.88,-5.94,-6.0,-6.02,-5.95,-5.75,-5.35,-4.89,-4.36,-3.83,-3.4,-3.09,-2.97,-2.99,-3.03,-3.04,-2.98,-2.86,-2.74,-2.62,-2.53,-2.46,-2.41,-2.35,-2.27,-2.15,-1.96,-1.76,-1.55,-1.34,-1.16,-1.01,-0.9,-0.85,-0.83,-0.85,-0.87,-0.87,-0.85,-0.81,-0.76,-0.71,-0.65,-0.59,-0.52,-0.43,-0.34,-0.24,-0.16,-0.09,-0.01,0.09,0.21,0.33,0.46,0.55,0.62,0.72,0.83,0.97,1.13,1.3,1.46,1.6,1.76,1.91,2.06,2.2,2.34,2.47,2.58,2.68,2.76,2.83,2.87,2.91,2.93,2.96,2.97,2.96,2.95,2.92,2.89,2.84,2.78,2.69,2.59,2.45,2.3,2.16,2.07,2.04,2.02,1.93,1.7,1.36,1.01,0.84,0.91,1.16,1.37,1.42,1.38,1.58,2.3,3.54,4.59,5.24,5.3,5.16,5.18,5.41,5.64,5.81,5.93,6.13,6.42,6.58,6.55,6.33,6.23,6.29,6.31,6.34,6.37,6.4,6.44,6.46,6.48,6.48,6.44,6.37,6.27,6.12,5.96,5.8,5.62,5.43,5.27,5.1,4.93,4.71,4.46,4.18,3.87,3.53,3.14,2.71,2.23,1.73,1.21,0.66,0.11,-0.43,-0.94,-1.42,-1.85,-2.24,-2.59,-2.91,-3.19,-3.45,-3.69,-3.9,-4.1,-4.27,-4.41,-4.53,-4.6,-4.64,-4.65,-4.64,-4.65,-4.68,-4.76,-4.85,-4.94,-5.01,-5.11,-5.26,-5.57,-5.86,-5.92,-5.1,-4.04,-3.3,-2.31,-2.37,-2.28,-1.55,-0.87,-0.81,-1.33,-2.43,-3.47,-4.04,-4.67,-5.08,-5.71,-6.36,-6.85,-6.86,-6.85,-6.7,-6.31,-6.17,-6.64,-7.86,-9.67,-10.1,-10.84,-10.47,-9.61,-8.11,-6.78,-4.94,-3.47,-3.08,-3.01,-2.55,-1.38,0.56,2.3,3.6,3.41,2.49,1.79,1.61,2.7,4.19,5.13,4.96,3.99,2.25,0.19,-1.65,-2.74,-3.0,-3.65,-4.3,-4.99,-4.14,-1.89,0.73,2.25,1.82,-0.09,-2.77,-4.31,-3.52,-0.96,2.38,5.95,9.07,11.34,12.56,12.9,12.58,12.05,11.74,11.49,11.24,10.89,10.42,9.97,9.54,9.19,8.92,8.68,8.52,8.23,7.96,7.48,7.13,6.87,6.74,6.46,6.13,5.84,5.66,5.49,5.17,4.79,4.47,4.21,3.95,3.6,3.22,2.85,2.58,2.45,2.38,2.25,2.1,1.98,1.97,1.99,1.93,1.82,1.63,1.42,1.21,1.03,0.92,0.88,0.89,0.87,0.75,0.52,0.2,-0.18,-0.52,-0.79,-1.01,-1.25,-1.54,-1.84,-2.07,-2.26,-2.5,-2.72,-2.78,-2.66,-3.21,-4.22,-4.93,-4.89,-3.81,-3.05,-2.33,-2.33,-2.84,-4.15,-4.8,-5.59,-5.65,-5.65,-6.03,-6.78,-6.95,-6.84,-6.7,-6.66,-6.69,-6.81,-6.94,-7.09,-7.18,-7.13,-7.0,-6.87,-6.77,-6.77,-6.8,-6.77,-6.71,-6.67,-6.73,-6.8,-6.85,-6.79,-6.57,-6.26,-5.86,-5.42,-4.69,-3.78,-3.1,-2.85,-3.04,-3.4,-3.65,-3.73,-3.66,-3.44,-3.21,-3.01,-2.91,-2.9,-2.93,-2.95,-2.91,-2.83,-2.68,-2.49,-2.26,-2.05,-1.84,-1.65,-1.47,-1.27,-1.08,-0.9,-0.75,-0.65,-0.6,-0.6,-0.62,-0.63,-0.63,-0.58,-0.49,-0.36,-0.2,-0.05,0.11,0.27,0.43,0.57,0.71,0.82,0.9,1.02,1.18,1.34,1.48,1.61,1.77,1.98,2.23,2.44,2.61,2.68,2.71,2.64,2.65,2.74,2.85,2.95,3.02,3.08,3.13,3.18,3.22,3.29,3.34,3.38,3.39,3.38,3.36,3.32,3.25,3.18,3.07,2.96,2.83,2.69,2.52,2.35,2.16,1.95,1.77,1.65,1.56,1.47,1.26,0.93,0.59,0.39,0.39,0.41,0.23,-0.07,-0.02,0.9,2.6,4.13,4.87,4.82,4.72,4.89,5.1,5.55,5.88,6.03,6.11,6.11,6.13,5.77,5.68,5.69,5.78,5.87,5.92,5.96,6.0,6.03,6.01,5.93,5.85,5.76,5.66,5.54,5.4,5.26,5.16,5.04,4.89,4.73,4.57,4.4,4.22,4.01,3.78,3.49,3.12,2.68,2.13,1.52,0.85,0.17,-0.51,-1.14,-1.69,-2.16,-2.55,-2.88,-3.18,-3.43,-3.67,-3.89,-4.12,-4.32,-4.52,-4.69,-4.85,-4.95,-5.0,-5.02,-5.04,-5.09,-5.13,-5.13,-5.04,-4.86,-4.62,-4.13,-3.08,-1.79,-1.27,-2.73,-5.01,-5.56,-3.39,-1.6,-0.48,-0.02,0.13,0.12,0.14,0.11,0.03,0.25,0.77,0.64,-0.41,-1.42,-1.19,-0.45,-0.08,-0.96,-2.04,-3.45,-5.18,-6.65,-6.69,-6.33,-6.42,-6.91,-7.8,-7.56,-5.61,-3.43,-1.68,-0.35,0.54,0.62,0.22,-0.22,-0.48,-0.54,-0.47,-0.35,-0.24,-0.11,-0.03,-0.01,0.19,1.14,2.82,4.6,5.33,4.54,2.73,0.56,-1.69,-3.7,-5.17,-5.44,-3.96,-1.15,2.15,4.81,6.01,6.37,6.34,5.77,7.62,9.57,12.07,11.29,13.42,15.25,15.58,14.99,13.47,12.08,11.35,10.81,10.3,9.84,9.62,9.51,9.38,9.19,9.03,8.93,8.77,8.45,8.16,7.95,7.71,7.38,6.95,6.26,5.64,5.35,5.65,5.8,5.53,5.41,5.71,5.92,5.2,3.65,2.21,1.68,1.9,2.32,2.74,2.54,2.02,1.59,1.44,1.51,1.68,1.07,-0.25,-0.73,-0.04,1.25,1.95,1.55,0.58,-0.28,-0.84,-1.16,-1.38,-1.51,-1.46,-1.25,-1.02,-0.96,-1.24,-1.78,-2.36,-2.82,-3.16,-3.42,-3.55,-3.44,-3.28,-3.0,-3.49,-4.3,-5.03,-5.64,-5.91,-5.45,-5.0,-4.55,-4.43,-4.89,-5.4,-5.77,-6.21,-6.6,-6.84,-7.05,-7.33,-7.55,-7.66,-7.72,-7.76,-7.79,-7.82,-7.83,-7.76,-7.62,-7.46,-7.34,-7.23,-7.11,-6.96,-6.8,-6.67,-6.57,-6.45,-6.33,-6.17,-6.09,-6.18,-6.41,-6.18,-5.05,-3.05,-1.29,-1.32,-3.01,-4.85,-4.84,-4.23,-4.08,-3.96,-3.6,-3.24,-3.11,-3.12,-3.15,-3.15,-3.11,-3.01,-2.88,-2.72,-2.57,-2.45,-2.32,-2.13,-1.88,-1.63,-1.41,-1.29,-1.23,-1.2,-1.18,-1.16,-1.12,-1.06,-0.99,-0.9,-0.8,-0.67,-0.52,-0.35,-0.17,0.01,0.2,0.39,0.58,0.78,0.97,1.15,1.33,1.52,1.64,1.8,1.98,2.09,2.2,2.31,2.46,2.6,2.75,2.88,3.02,3.17,3.37,3.38,3.44,3.5,3.58,3.62,3.63,3.63,3.6,3.58,3.58,3.6,3.6,3.59,3.55,3.5,3.44,3.35,3.23,3.1,2.93,2.73,2.51,2.27,2.03,1.78,1.51,1.28,1.1,0.95,0.72,0.37,-0.01,-0.23,-0.23,-0.27,-0.65,-1.15,-0.77,1.14,3.38,4.53,4.45,4.23,4.27,4.59,4.95,5.43,5.65,5.36,4.8,4.7,4.8,4.9,4.98,5.03,5.07,5.09,5.08,5.06,5.03,5.0,4.97,4.94,4.9,4.83,4.72,4.58,4.44,4.28,4.11,3.93,3.75,3.57,3.42,3.3,3.22,3.14,3.04,2.87,2.56,2.06,1.32,0.47,-0.4,-1.21,-1.92,-2.48,-2.9,-3.18,-3.42,-3.64,-3.84,-4.03,-4.22,-4.4,-4.58,-4.75,-4.93,-5.09,-5.17,-5.22,-5.29,-5.4,-5.49,-5.51,-5.53,-6.16,-7.56,-8.57,-7.92,-5.89,-3.91,-3.87,-5.14,-5.4,-5.15,-5.01,-3.95,-3.5,-1.73,-0.22,0.27,-0.19,-2.28,-4.08,-3.93,-2.93,-2.34,-2.44,-2.3,-1.71,-1.25,-0.55,-0.69,-3.06,-6.96,-9.9,-10.09,-7.86,-5.0,-3.66,-4.26,-6.56,-8.0,-7.31,-4.6,-0.51,3.07,4.95,5.24,5.11,5.25,5.53,5.61,5.35,5.01,5.0,5.62,6.56,7.29,7.49,7.05,6.34,5.6,5.18,5.19,5.63,6.22,6.53,6.31,5.61,4.15,2.29,-0.03,-1.36,-0.67,1.87,4.99,7.41,8.48,8.45,8.03,7.07,5.8,3.56,2.13,3.29,6.26,8.4,8.92,9.01,9.02,8.97,8.53,8.27,8.29,8.6,8.9,8.88,8.69,8.43,8.28,8.23,8.0,7.68,5.52,5.53,5.27,4.82,4.32,3.77,3.29,3.14,3.41,3.94,3.86,2.78,1.24,0.39,0.34,1.12,2.19,1.81,0.6,0.24,0.87,1.53,1.76,1.71,1.79,1.81,1.63,1.34,1.01,0.6,0.14,-0.37,-0.87,-1.35,-1.98,-2.54,-2.69,-2.38,-1.94,-1.76,-1.83,-2.04,-2.32,-2.53,-2.7,-2.9,-3.16,-3.43,-3.69,-3.91,-4.07,-4.28,-4.56,-4.9,-5.26,-5.61,-5.87,-6.05,-6.25,-6.63,-6.85,-7.18,-8.11,-8.51,-8.15,-8.38,-8.88,-8.77,-8.58,-8.53,-8.52,-8.47,-8.26,-8.03,-7.79,-7.51,-7.25,-7.1,-7.0,-6.89,-6.73,-6.51,-6.29,-6.14,-6.03,-5.97,-5.96,-5.98,-6.01,-5.96,-5.84,-5.92,-6.2,-5.91,-4.6,-2.5,-1.53,-1.91,-3.26,-4.85,-4.87,-3.57,-2.89,-2.61,-2.65,-3.19,-3.6,-3.51,-3.26,-3.13,-3.02,-2.89,-2.78,-2.73,-2.75,-2.79,-2.78,-2.62,-2.3,-1.96,-1.71,-1.56,-1.44,-1.35,-1.29,-1.24,-1.21,-1.16,-1.09,-0.98,-0.85,-0.71,-0.55,-0.35,-0.14,0.08,0.32,0.56,0.84,1.12,1.4,1.66,1.91,2.15,2.33,2.48,2.53,2.56,2.68,2.86,3.06,3.25,3.39,3.48,3.47,3.4,3.42,3.52,3.62,3.71,3.77,3.81,3.78,3.72,3.64,3.59,3.55,3.55,3.52,3.49,3.43,3.36,3.25,3.11,2.94,2.72,2.47,2.19,1.9,1.6,1.31,1.02,0.73,0.47,0.24,-0.06,-0.47,-0.9,-1.16,-1.24,-1.52,-2.18,-2.22,-0.4,2.51,3.84,3.6,3.12,3.28,3.78,4.11,4.17,3.93,3.82,3.74,3.69,3.71,3.79,3.9,3.92,3.9,3.88,3.88,3.88,3.88,3.86,3.84,3.81,3.78,3.75,3.72,3.65,3.57,3.47,3.33,3.16,2.93,2.68,2.45,2.24,2.04,1.85,1.76,1.77,1.74,1.7,1.42,0.83,0.03,-0.78,-1.45,-2.01,-2.48,-2.92,-3.31,-3.62,-3.88,-4.08,-4.22,-4.31,-4.41,-4.56,-4.67,-4.74,-4.8,-4.84,-4.72,-4.36,-4.44,-4.91,-5.54,-5.87,-5.99,-6.05,-5.47,-3.93,-1.59,0.72,1.9,0.68,-2.2,-3.65,-2.25,-1.26,-1.09,-2.49,-2.65,-2.93,-1.47,-0.04,0.42,-0.18,-0.4,0.31,0.34,-1.78,-5.39,-8.04,-9.0,-8.29,-6.77,-5.06,-3.53,-2.55,-1.91,-1.71,-1.98,-1.71,0.02,2.47,4.49,5.51,6.0,6.35,6.65,7.01,7.51,7.89,7.78,7.53,7.54,7.81,7.96,7.79,7.52,7.37,7.25,6.9,6.3,5.61,5.11,4.93,4.88,4.7,4.37,4.2,4.29,4.56,5.03,6.0,7.58,9.27,10.58,11.37,11.92,12.24,11.64,9.47,6.71,5.85,6.88,9.93,9.86,9.08,8.77,8.65,8.37,8.12,8.13,8.35,8.66,8.78,8.68,8.54,8.46,8.36,7.99,7.18,6.16,5.52,4.82,4.39,3.93,3.62,3.76,3.93,3.95,3.87,3.62,3.15,2.59,2.21,1.92,1.67,1.26,0.8,0.26,-0.23,-0.21,1.18,3.37,3.16,1.77,0.66,0.25,0.57,1.24,1.59,1.46,1.11,0.62,-0.05,-0.74,-1.19,-1.54,-1.86,-2.19,-2.51,-2.72,-2.69,-2.51,-2.7,-3.19,-3.77,-4.24,-4.67,-5.06,-5.42,-5.75,-6.05,-6.24,-6.23,-6.59,-6.99,-7.43,-7.81,-8.06,-8.26,-8.52,-8.84,-9.14,-9.38,-9.54,-9.65,-9.78,-9.96,-10.17,-10.33,-10.37,-10.27,-10.1,-9.92,-9.58,-8.95,-7.41,-6.91,-6.78,-6.72,-6.53,-6.27,-6.04,-5.86,-5.69,-5.59,-5.5,-5.48,-5.55,-5.74,-6.04,-6.35,-6.51,-6.12,-4.87,-3.24,-1.99,-2.07,-3.13,-3.92,-3.64,-2.35,-0.73,0.29,0.17,-0.9,-2.28,-3.33,-3.82,-3.83,-3.59,-3.28,-3.15,-3.18,-3.29,-3.4,-3.47,-3.48,-3.38,-3.06,-2.51,-1.82,-1.2,-0.84,-0.78,-0.89,-1.01,-0.94,-0.66,-0.22,0.29,0.72,1.07,1.4,1.71,1.99,2.19,2.33,2.44,2.54,2.71,3.0,3.28,3.51,3.66,3.66,3.5,3.3,3.08,3.09,3.12,3.22,3.31,3.35,3.39,3.42,3.5,3.61,3.61,3.63,3.65,3.7,3.74,3.91,4.05,4.01,3.87,3.73,3.64,3.56,3.51,3.47,3.42,3.35,3.24,3.07,2.87,2.64,2.35,2.03,1.65,1.26,0.88,0.49,0.11,-0.24,-0.58,-0.9,-1.3,-1.77,-2.12,-2.24,-2.44,-3.16,-3.39,-1.53,1.47,2.62,2.17,1.78,2.13,2.67,3.06,3.16,2.91,2.68,2.59,2.56,2.56,2.56,2.56,2.49,2.48,2.5,2.52,2.53,2.54,2.59,2.64,2.65,2.64,2.57,2.45,2.32,2.21,2.11,2.04,2.03,2.04,2.03,1.98,1.88,1.73,1.54,1.35,1.26,1.36,1.63,1.51,0.87,0.52,0.21,-0.26,-0.88,-1.53,-2.09,-2.56,-2.95,-3.26,-3.41,-3.5,-3.79,-4.01,-4.1,-4.13,-4.17,-4.21,-4.27,-4.15,-3.68,-3.42,-3.74,-4.14,-4.32,-4.23,-3.75,-3.09,-2.85,-3.32,-3.42,-2.85,-2.11,-0.54,1.67,3.32,2.95,1.63,0.22,-0.22,-0.82,-2.27,-4.49,-4.71,-3.63,-2.63,-3.4,-7.81,-14.71,-16.58,-13.41,-6.59,-3.34,-1.23,0.61,2.42,2.99,3.18,4.36,5.91,6.96,7.53,8.03,8.45,8.55,8.16,7.8,7.61,7.35,7.01,6.75,6.62,6.62,6.83,7.16,7.43,7.37,6.93,6.33,5.84,5.49,5.22,4.9,4.51,4.09,3.85,3.78,3.87,4.02,4.18,4.56,5.36,6.41,7.33,7.79,7.78,7.52,6.48,3.51,0.39,0.81,3.61,5.58,5.68,6.05,7.2,7.65,7.28,6.95,6.82,6.83,7.2,7.75,7.88,7.84,7.5,6.84,5.91,5.29,5.12,5.56,5.47,5.17,3.3,3.22,3.2,3.16,3.06,2.94,2.84,2.71,2.63,2.58,2.54,2.66,3.16,3.56,3.04,1.29,0.29,0.72,2.73,4.88,5.16,4.12,3.16,2.4,2.15,2.11,1.79,1.43,1.09,0.74,0.31,-0.2,-0.77,-1.36,-1.91,-2.43,-2.85,-3.12,-3.25,-3.27,-3.22,-3.22,-3.51,-4.13,-4.73,-5.09,-5.33,-5.55,-5.79,-6.04,-6.29,-6.51,-6.69,-6.89,-7.1,-7.36,-7.64,-7.87,-8.05,-8.19,-8.32,-8.52,-8.78,-9.07,-9.12,-8.71,-7.92,-7.47,-8.52,-10.04,-10.33,-10.13,-9.97,-9.41,-8.04,-7.16,-6.71,-6.51,-6.32,-6.02,-5.76,-5.59,-5.43,-5.28,-5.14,-5.16,-5.4,-5.77,-6.11,-6.12,-5.86,-5.17,-4.34,-3.88,-4.08,-4.6,-4.61,-3.57,-2.67,-2.27,-2.39,-2.58,-2.45,-2.18,-2.14,-2.14,-2.0,-1.89,-1.73,-1.64,-1.84,-2.31,-2.85,-3.23,-3.32,-3.05,-2.46,-1.65,-0.9,-0.42,-0.19,-0.13,-0.16,-0.15,0.09,0.7,1.52,2.14,2.36,2.26,2.07,1.98,1.99,2.0,1.97,1.93,2.05,2.34,2.66,2.88,2.94,2.92,2.94,2.88,2.75,2.71,2.64,2.64,2.86,3.07,3.09,2.99,2.91,3.0,3.14,3.29,3.37,3.34,3.44,3.72,4.16,4.62,4.91,5.0,4.74,4.3,3.94,3.73,3.63,3.51,3.39,3.28,3.15,3.0,2.82,2.58,2.28,1.89,1.42,0.91,0.43,-0.04,-0.52,-1.03,-1.49,-1.89,-2.26,-2.64,-2.92,-3.0,-3.14,-3.73,-3.63,-1.41,0.97,1.03,0.23,0.31,0.92,1.29,1.49,1.9,2.14,1.92,1.63,1.46,1.3,1.14,1.05,1.04,1.09,1.21,1.32,1.33,1.21,1.14,1.19,1.35,1.44,1.22,0.99,0.97,0.96,0.91,0.87,0.87,0.87,0.88,0.9,0.91,0.9,0.9,0.91,0.9,0.89,0.95,1.08,0.75,0.09,-0.08,0.02,0.07,0.12,0.07,-0.36,-0.96,-1.55,-2.08,-2.41,-2.6,-2.74,-2.89,-3.11,-3.23,-3.29,-3.36,-3.29,-3.17,-3.0,-2.75,-2.59,-2.53,-2.33,-1.65,-0.65,-0.63,-1.37,-1.76,-1.26,-0.29,0.76,1.6,1.41,0.6,-0.06,-1.23,-2.5,-3.11,-1.92,-0.5,0.01,-0.17,-0.72,-2.67,-6.26,-9.71,-9.75,-5.5,0.4,3.47,4.05,3.84,3.13,2.68,4.15,5.6,4.84,3.74,3.98,4.49,4.38,3.87,2.96,1.77,1.44,2.07,2.98,3.87,5.01,6.22,7.26,7.78,7.75,7.44,7.12,6.82,6.53,6.12,5.46,4.64,4.14,4.26,4.74,5.11,5.22,5.37,5.91,6.82,7.42,7.28,6.83,7.06,8.12,8.93,8.06,5.42,3.22,2.73,1.92,0.95,2.29,4.74,5.79,5.64,5.33,4.85,4.72,5.95,6.46,5.99,5.26,4.78,4.37,4.37,4.93,5.11,4.86,4.39,3.91,3.53,0.67,0.78,0.95,1.15,1.51,1.97,2.27,2.68,3.25,3.61,3.67,3.67,3.9,4.13,4.16,4.17,4.44,4.73,4.83,4.6,4.16,4.08,3.98,3.74,3.41,2.99,2.46,1.78,0.96,-0.16,-1.32,-2.32,-3.05,-3.4,-3.35,-3.1,-2.93,-2.95,-3.09,-3.33,-3.68,-4.11,-4.52,-4.89,-5.19,-5.38,-5.52,-5.65,-5.8,-5.97,-6.16,-6.34,-6.49,-6.63,-6.66,-6.6,-6.75,-6.97,-6.43,-4.91,-3.77,-4.44,-6.75,-10.58,-12.68,-12.76,-10.96,-8.45,-6.77,-7.44,-8.6,-8.81,-8.38,-7.91,-7.6,-7.3,-6.98,-6.79,-6.67,-6.39,-6.06,-5.85,-5.75,-5.79,-5.94,-5.87,-5.73,-5.49,-5.18,-4.85,-4.54,-4.19,-3.86,-3.81,-4.02,-4.27,-4.29,-3.81,-3.35,-2.79,-2.33,-2.3,-2.59,-2.71,-2.39,-2.3,-2.07,-1.49,-0.84,-0.59,-0.75,-1.51,-3.02,-4.63,-4.19,-2.42,-1.47,-1.45,-1.16,-0.56,-0.12,0.14,0.48,0.86,1.12,1.29,1.4,1.49,1.55,1.59,1.63,1.67,1.66,1.62,1.55,1.47,1.47,1.61,1.84,2.03,1.91,1.72,1.76,1.83,1.89,1.9,2.01,2.19,2.28,2.35,2.56,2.72,2.93,3.12,3.5,3.92,4.22,4.32,4.5,4.72,4.98,5.08,5.07,5.01,4.73,4.39,4.05,3.79,3.64,3.44,3.24,3.1,3.0,2.89,2.72,2.47,2.14,1.67,1.09,0.48,-0.09,-0.63,-1.22,-1.81,-2.3,-2.67,-3.02,-3.34,-3.49,-3.49,-3.75,-4.32,-3.37,-0.8,0.14,-0.58,-0.98,-0.58,-0.05,0.35,0.55,0.69,0.84,0.84,0.47,0.09,0.03,0.19,0.48,0.79,1.12,1.19,1.22,1.28,1.3,1.34,1.4,1.4,1.25,1.14,1.23,1.25,1.21,1.2,1.28,1.47,1.56,1.54,1.42,1.23,1.14,1.13,1.13,1.16,1.27,1.62,2.11,1.84,0.89,0.26,-0.58,-0.95,-1.08,-1.08,-0.7,-0.31,0.15,0.65,0.61,-0.25,-1.17,-1.28,-0.78,-0.85,-1.42,-2.35,-2.26,-1.54,-1.5,-1.73,-1.64,-2.39,-2.99,-2.92,-2.51,-2.73,-1.69,-1.81,-2.21,-1.39,-0.25,0.13,-0.76,-1.62,0.17,3.63,5.42,3.86,0.07,-4.04,-4.76,-1.99,-1.5,-1.26,-1.28,-1.45,-1.56,-1.4,-0.97,-0.93,-1.44,-2.33,-2.93,-2.53,-1.32,0.25,1.19,1.42,1.44,2.1,2.89,3.19,3.72,4.13,4.47,5.51,6.65,7.79,8.84,9.04,8.55,8.35,8.53,8.75,8.9,8.94,8.9,8.65,8.09,7.38,6.64,6.13,6.01,5.96,6.07,6.43,6.88,7.11,6.92,6.47,5.72,4.73,3.43,1.03,-0.52,1.37,4.44,6.75,6.13,3.91,2.84,3.68,4.72,4.28,3.72,3.56,3.49,3.42,2.98,2.42,2.09,2.1,2.42,2.34,1.79,1.22,0.92,0.84,0.8,0.7,-0.58,-0.49,-0.4,-0.18,0.11,0.56,1.24,1.88,2.21,2.35,2.53,2.74,3.15,3.58,3.99,4.4,4.66,4.54,4.02,3.45,3.35,3.36,3.33,3.34,3.3,3.29,3.51,3.39,2.97,2.51,2.1,1.76,1.44,1.04,0.57,0.06,-0.68,-1.73,-2.74,-3.4,-3.79,-4.07,-4.3,-4.5,-4.74,-5.04,-5.33,-5.61,-5.9,-6.16,-6.34,-6.48,-6.55,-6.61,-6.8,-7.01,-5.74,-4.33,-6.98,-8.92,-6.84,-4.56,-3.43,-2.68,-2.76,-4.23,-5.75,-6.45,-6.57,-6.64,-7.07,-7.75,-8.1,-7.98,-7.71,-7.52,-7.48,-7.44,-7.32,-7.18,-7.08,-7.08,-7.17,-7.04,-6.64,-6.2,-5.75,-5.35,-4.97,-4.96,-5.32,-5.72,-5.61,-5.22,-4.82,-4.59,-3.82,-2.96,-2.64,-2.52,-2.57,-2.78,-2.38,-1.76,-1.15,-0.3,0.22,0.22,0.41,0.78,0.15,-1.93,-3.99,-4.52,-3.44,-2.02,-1.35,-0.8,0.24,1.18,1.49,1.3,0.87,0.53,0.54,0.77,0.96,1.02,1.04,1.01,0.87,0.68,0.48,0.25,-0.02,-0.11,0.11,0.33,0.21,-0.14,-0.45,-0.36,-0.11,0.07,0.32,0.84,1.39,1.86,2.29,2.72,3.08,3.5,4.01,4.47,4.81,5.1,5.48,5.88,6.18,6.21,6.16,5.97,5.77,5.52,5.05,4.56,3.98,3.49,3.14,2.82,2.63,2.58,2.53,2.46,2.37,2.18,1.84,1.34,0.69,-0.05,-0.82,-1.54,-2.16,-2.57,-2.86,-3.18,-3.51,-3.72,-3.7,-3.64,-4.12,-4.8,-3.33,-1.36,-1.36,-2.03,-2.04,-1.76,-1.25,-0.78,-0.48,-0.26,0.0,0.3,0.64,0.87,0.81,0.55,0.27,0.04,0.04,0.11,0.06,-0.1,-0.25,-0.31,-0.24,-0.27,-0.4,-0.53,-0.6,-0.67,-0.76,-0.74,-0.74,-0.73,-0.61,-0.36,-0.12,0.13,0.35,0.59,0.78,0.97,1.23,1.53,1.8,1.81,1.8,2.1,2.41,3.02,3.23,2.15,0.15,-1.12,-0.81,-0.29,0.07,0.11,-0.55,-1.07,-1.54,-1.55,-0.81,-0.5,-1.02,-1.55,-1.67,-1.62,-2.06,-1.93,-1.12,-0.92,-1.58,-1.81,-1.9,-2.05,-2.04,-2.97,-3.88,-3.18,-2.43,-2.94,-5.18,-9.27,-8.77,-5.11,-2.09,-0.38,1.58,2.82,2.3,0.98,-0.67,-0.92,-0.61,-0.41,-0.37,-0.23,-0.09,-0.1,-0.22,-0.3,-0.54,-0.84,-0.67,-0.46,-0.48,-0.48,-0.82,-1.09,-0.39,1.23,2.98,3.19,3.69,5.24,5.94,6.96,9.52,11.63,11.57,10.69,10.29,10.07,9.6,8.94,8.25,7.62,6.95,6.47,6.18,5.91,5.15,3.95,3.08,2.61,1.65,0.33,-0.42,-0.56,-0.41,-0.07,-0.23,-1.3,-2.14,-1.07,-0.17,-0.74,0.16,2.21,2.86,2.3,1.87,1.45,0.86,0.07,-0.61,-0.9,-1.11,-1.36,-1.47,-1.3,-1.07,-1.02,-1.08,-1.05,-0.9,-0.72,0.41,0.5,0.72,1.02,1.22,1.36,1.53,1.76,1.96,2.27,2.73,3.19,3.56,3.92,4.33,4.89,5.22,5.05,4.52,4.23,4.35,4.54,4.71,4.66,4.5,4.28,4.01,3.71,3.35,2.96,2.55,2.12,1.63,1.09,0.49,-0.13,-0.73,-1.3,-1.83,-2.33,-2.78,-3.2,-3.62,-4.06,-4.59,-5.1,-5.53,-5.96,-6.38,-6.7,-7.1,-7.64,-7.79,-7.79,-8.46,-7.23,-3.54,-1.21,-1.5,-3.26,-4.56,-5.59,-5.82,-5.52,-5.24,-5.36,-5.82,-6.1,-6.41,-6.38,-6.33,-6.71,-7.55,-7.94,-7.77,-7.43,-7.38,-7.75,-7.9,-7.79,-7.81,-8.02,-8.12,-7.76,-7.31,-7.09,-6.91,-6.24,-5.45,-5.41,-5.23,-4.8,-4.67,-4.29,-3.8,-3.03,-2.26,-2.12,-2.18,-2.12,-2.13,-2.02,-1.6,-1.38,-0.89,-0.05,-0.07,-0.87,-1.28,-1.33,-1.47,-1.65,-1.58,-1.32,-0.78,0.18,1.08,1.46,1.45,1.27,0.92,0.37,-0.06,-0.14,-0.05,-0.08,-0.2,-0.23,-0.37,-0.73,-1.1,-1.27,-1.29,-1.39,-1.57,-1.73,-1.85,-1.91,-1.84,-1.68,-1.45,-1.06,-0.39,0.45,1.21,1.81,2.39,3.03,3.72,4.38,4.96,5.39,5.82,6.21,6.55,6.72,6.71,6.62,6.49,6.14,5.78,5.56,5.32,4.71,4.05,3.62,3.29,2.92,2.47,2.03,1.89,1.76,1.87,1.92,1.95,1.87,1.47,0.82,0.05,-0.86,-1.82,-2.54,-2.91,-3.15,-3.36,-3.45,-3.65,-3.7,-3.68,-3.92,-4.88,-4.75,-2.93,-2.37,-3.23,-3.57,-3.2,-2.75,-2.24,-1.76,-1.25,-0.68,-0.21,0.09,0.21,0.13,-0.2,-0.77,-1.17,-1.16,-1.01,-0.9,-0.92,-1.07,-1.2,-1.28,-1.39,-1.55,-1.6,-1.56,-1.64,-1.71,-1.71,-1.64,-1.48,-1.24,-0.93,-0.56,-0.08,0.46,0.85,1.26,1.7,2.17,2.67,3.06,3.22,3.26,2.09,1.18,1.51,3.48,3.4,1.53,0.88,0.91,0.46,-0.39,-0.65,-0.37,-0.11,0.1,0.22,0.2,0.39,0.48,0.06,-0.67,-1.28,-1.53,-1.54,-1.37,-0.97,-1.19,-1.13,-0.02,0.48,0.17,0.17,-0.87,-3.43,-3.8,-2.08,-1.14,-1.37,-1.77,-0.4,1.5,2.54,3.93,3.97,1.11,-1.26,-2.67,-3.54,-3.38,-2.48,-1.73,-1.31,-1.18,-1.19,-1.34,-1.39,-1.47,-1.55,-1.62,-1.73,-1.96,-2.29,-2.71,-3.08,-3.34,-4.0,-3.8,-0.04,7.39,10.76,10.79,11.11,10.73,9.85,9.48,9.54,9.24,8.69,8.23,7.75,7.16,6.71,6.65,6.67,6.41,5.74,5.03,4.59,4.39,4.6,4.61,3.72,2.38,0.52,-0.76,-1.44,-1.55,-1.5,-3.65,-2.2,-0.19,-0.65,-2.18,-1.53,-0.42,-1.06,-2.21,-2.47,-2.8,-3.45,-4.29,-4.98,-4.62,-3.93,-3.25,-2.72,-2.31,-1.84,-1.3,-0.81,-0.47,-0.11,0.24,1.43,1.74,1.94,2.09,2.29,2.43,2.43,2.36,2.25,2.16,2.12,2.3,2.64,3.08,3.45,3.76,4.02,4.21,4.37,4.67,4.94,5.12,5.22,5.16,4.99,4.81,4.63,4.42,4.14,3.79,3.41,3.02,2.63,2.28,1.84,1.3,0.63,-0.15,-0.91,-1.59,-2.13,-2.63,-3.11,-3.61,-4.14,-4.81,-5.77,-6.75,-7.52,-8.04,-8.4,-8.65,-8.82,-8.56,-7.08,-5.18,-4.46,-4.51,-4.51,-4.68,-5.03,-4.83,-4.77,-4.57,-3.77,-3.03,-2.79,-2.97,-3.52,-4.3,-4.87,-5.47,-6.59,-7.65,-7.74,-7.94,-7.82,-8.3,-9.78,-8.88,-8.35,-7.53,-7.8,-7.89,-7.38,-7.11,-7.39,-6.78,-5.82,-5.27,-4.81,-4.18,-3.44,-2.5,-1.58,-1.22,-1.41,-1.77,-1.98,-1.93,-1.63,-1.32,-1.15,-0.94,-0.74,-0.93,-1.47,-1.72,-1.72,-1.66,-1.51,-1.25,-1.03,-0.86,-0.63,-0.28,-0.02,-0.01,-0.16,-0.32,-0.35,-0.24,-0.17,-0.36,-0.62,-0.9,-1.18,-1.34,-1.49,-1.93,-2.22,-2.26,-2.4,-2.59,-2.66,-2.65,-2.66,-2.6,-2.27,-1.66,-0.9,-0.07,0.72,1.61,2.67,3.7,4.58,5.32,5.94,6.47,6.72,6.72,6.73,6.7,6.53,6.32,6.14,5.97,5.66,5.27,4.92,4.59,4.15,3.58,3.15,2.89,2.59,2.23,1.9,1.61,1.37,1.27,1.34,1.54,1.68,1.48,0.74,-0.24,-1.13,-1.87,-2.54,-3.02,-3.28,-3.42,-3.5,-3.56,-3.65,-3.77,-3.88,-4.88,-5.44,-4.24,-3.04,-3.67,-4.66,-4.54,-4.26,-3.62,-2.39,-1.22,-0.56,-0.31,-0.24,-0.12,0.01,-0.11,-0.43,-0.74,-0.95,-1.06,-1.15,-1.25,-1.28,-1.41,-1.61,-1.85,-2.08,-2.26,-2.41,-2.59,-2.77,-2.92,-2.92,-2.68,-2.14,-1.25,-0.11,0.99,1.76,2.05,2.16,2.23,2.56,3.23,3.69,3.64,3.55,3.51,2.91,1.68,1.26,0.08,-2.04,-2.08,0.12,0.79,-0.29,0.71,0.95,0.09,0.46,1.32,1.5,1.95,0.63,-1.05,-1.11,-1.1,-0.93,-0.71,-0.89,-1.82,-1.97,-1.83,-2.73,-3.86,-4.18,-4.68,-3.6,-1.84,-1.16,-1.84,-3.69,-3.7,-0.81,0.63,-0.82,-0.44,-0.1,-1.49,-3.3,-1.64,0.49,1.01,-0.35,-1.52,-2.98,-3.9,-3.8,-3.26,-2.8,-2.62,-2.63,-2.7,-2.9,-3.18,-3.32,-3.41,-3.71,-4.07,-4.71,-6.21,-4.96,-4.74,-3.66,-1.1,1.94,4.97,7.28,9.62,10.6,10.81,10.8,9.94,9.43,8.85,7.98,7.57,7.19,6.51,6.18,6.1,5.74,4.95,4.25,3.48,1.98,0.68,-0.86,-2.25,-1.93,-1.78,-1.71,0.02,-1.0,-2.74,-2.33,-3.08,-3.42,-3.12,-3.85,-4.96,-5.51,-5.77,-6.13,-7.34,-8.16,-6.9,-6.3,-5.34,-4.51,-3.6,-2.56,-1.63,-0.99,-0.51,-0.04,0.37,0.72,1.06,3.53,3.68,3.81,3.88,3.88,3.74,3.43,3.06,2.7,2.38,2.11,1.8,1.4,0.99,0.8,1.23,1.98,2.44,2.37,2.19,2.29,2.7,3.24,3.83,4.41,4.85,4.97,4.89,4.82,4.6,4.32,3.98,3.55,3.08,2.61,2.1,1.48,0.8,0.03,-0.81,-1.62,-2.14,-2.5,-3.21,-4.32,-5.45,-6.39,-7.17,-7.71,-8.23,-8.89,-9.22,-7.33,-7.35,-7.6,-5.93,-4.54,-3.79,-3.27,-2.91,-2.99,-2.86,-2.64,-2.48,-2.46,-2.57,-2.85,-3.27,-3.75,-3.71,-4.11,-4.75,-5.23,-7.13,-7.82,-7.04,-7.72,-7.93,-8.54,-7.84,-7.88,-8.45,-7.98,-6.38,-5.53,-4.4,-3.14,-2.79,-3.5,-3.97,-3.61,-3.05,-2.54,-1.95,-1.62,-1.77,-1.95,-1.99,-1.97,-1.88,-1.9,-1.85,-2.03,-2.26,-2.17,-2.14,-1.8,-1.88,-2.04,-2.15,-2.2,-2.11,-2.0,-1.91,-1.98,-1.87,-1.8,-1.69,-1.52,-1.39,-1.36,-1.26,-1.19,-1.26,-1.43,-1.35,-1.54,-2.05,-1.96,-3.11,-3.74,-3.3,-2.5,-1.95,-1.71,-1.71,-1.9,-1.88,-1.39,-0.75,-0.14,1.02,2.67,3.88,4.7,5.51,6.08,5.29,5.64,7.05,7.7,7.71,7.44,6.84,6.09,5.6,5.25,4.91,4.46,4.11,3.75,3.39,2.9,2.57,2.24,1.99,1.86,1.67,1.42,1.19,1.11,1.21,1.33,1.33,1.12,0.52,-0.44,-1.35,-1.8,-1.98,-2.35,-2.95,-3.38,-3.49,-3.47,-3.5,-3.65,-3.79,-4.55,-5.51,-4.68,-3.4,-3.54,-4.53,-4.66,-4.6,-4.65,-4.28,-2.66,-0.62,0.25,0.22,0.19,0.23,0.17,-0.02,-0.34,-0.69,-0.91,-0.96,-0.94,-0.89,-0.91,-1.01,-1.18,-1.45,-1.81,-2.1,-2.22,-2.15,-1.97,-1.7,-1.36,-0.85,-0.04,0.86,1.48,1.72,1.79,2.09,2.63,3.47,3.99,2.97,2.4,1.75,1.51,2.44,2.3,0.99,-0.25,1.14,2.61,2.92,2.54,1.87,1.41,2.27,2.47,2.94,2.97,0.98,0.19,-0.41,-1.36,-1.54,-1.07,-0.97,-1.16,-1.33,-1.84,-2.26,-2.19,-3.64,-3.12,-1.89,-2.98,-3.36,-3.56,-3.27,-2.56,-2.37,-3.03,-3.36,-3.64,-2.69,-0.82,-0.65,-0.51,1.43,2.04,-0.27,-1.8,-0.98,0.04,1.09,0.52,-1.36,-2.62,-3.03,-3.09,-3.2,-3.35,-3.66,-3.94,-4.2,-4.47,-4.89,-5.69,-5.97,-6.72,-6.49,-6.08,-6.94,-5.47,-0.69,0.46,-0.48,2.2,4.85,5.34,5.55,6.27,7.03,6.71,5.88,5.34,4.57,4.02,3.71,3.68,3.73,3.62,3.15,2.21,0.82,-0.9,-2.67,-3.29,-4.18,-6.15,-3.78,-2.55,-2.51,-1.62,-1.01,-2.25,-3.93,-5.48,-6.05,-7.11,-8.03,-8.49,-9.82,-11.21,-10.45,-8.89,-7.21,-5.38,-3.62,-2.38,-1.73,-0.95,0.23,1.41,2.24,2.75,3.05,3.24,3.39,3.49,3.75,4.02,4.08,4.04,3.91,3.79,3.75,3.68,3.31,2.65,1.91,1.44,1.38,1.13,0.08,-1.62,-2.59,-0.67,2.3,2.97,2.31,2.09,2.63,3.16,2.84,2.8,2.84,2.31,3.92,4.27,4.15,3.57,3.2,3.1,2.87,2.48,1.94,1.3,0.61,-0.07,-0.8,-1.77,-2.94,-4.0,-4.89,-5.77,-6.51,-7.06,-7.7,-8.39,-8.88,-8.83,-7.64,-5.66,-3.6,-2.56,-2.5,-2.86,-3.0,-3.21,-3.3,-3.51,-3.67,-3.89,-4.07,-4.26,-4.1,-3.84,-3.76,-4.02,-4.5,-5.13,-6.66,-6.41,-6.53,-7.58,-8.3,-8.98,-7.69,-7.18,-6.81,-6.34,-6.39,-5.54,-5.5,-5.53,-5.39,-4.96,-4.34,-3.59,-2.65,-1.83,-1.55,-1.45,-1.2,-1.12,-1.51,-1.98,-2.15,-2.14,-2.06,-2.15,-2.64,-2.52,-2.4,-3.65,-4.8,-3.07,-0.58,-0.14,-1.03,-1.72,-2.01,-2.32,-2.43,-2.36,-2.23,-1.94,-1.8,-2.0,-2.15,-2.1,-1.26,-1.12,-1.53,-1.72,-1.79,-0.91,-1.51,-2.46,-3.05,-2.43,-1.58,-0.88,-0.99,-1.26,-1.11,-1.08,-0.84,0.09,1.58,3.37,4.43,4.85,5.42,6.04,6.47,5.18,5.74,6.47,6.45,6.54,6.84,5.87,4.86,4.06,3.76,3.77,3.71,3.2,2.48,2.03,1.89,1.83,1.77,1.74,1.76,1.75,1.59,1.39,1.33,1.27,1.01,0.49,-0.29,-1.36,-2.84,-3.83,-2.95,-2.4,-3.03,-4.16,-3.91,-3.54,-3.51,-3.6,-3.95,-5.32,-5.1,-4.02,-3.93,-3.87,-3.56,-4.08,-4.8,-4.86,-3.69,-1.8,-0.63,0.32,0.8,0.64,0.13,-0.04,0.19,0.45,0.59,0.59,0.53,0.5,0.56,0.41,0.02,-0.37,-0.72,-1.02,-1.3,-1.59,-1.8,-1.88,-1.4,-0.29,0.7,1.34,1.48,1.61,1.72,1.84,1.99,2.63,2.86,2.49,2.32,2.61,3.33,2.39,-0.42,-0.26,1.15,1.6,1.91,2.93,4.16,3.86,2.61,0.93,0.81,0.46,-0.76,-1.81,-1.92,-0.97,-0.4,-0.61,-1.0,-1.26,-1.29,-1.41,-1.7,-2.11,-2.82,-3.64,-3.38,-1.47,-0.28,-0.11,-0.97,-1.92,-2.49,-2.77,-2.22,-1.69,-1.98,-1.65,-1.6,-1.73,-1.47,-2.01,-2.71,-2.74,-1.14,0.6,-0.07,0.21,1.19,2.31,1.68,1.36,-0.46,-2.7,-3.18,-3.53,-3.79,-4.2,-4.7,-5.19,-5.61,-6.14,-6.67,-7.32,-7.91,-8.81,-9.88,-9.68,-3.09,0.84,-1.35,-2.23,3.02,4.74,5.47,7.01,7.25,7.35,7.01,6.22,5.35,4.28,3.48,3.1,3.06,2.79,1.98,0.8,-0.56,-2.01,-3.47,-4.77,-6.41,-8.79,-4.92,-3.35,-3.38,-3.01,-0.76,-1.42,-4.39,-5.89,-9.29,-10.36,-10.91,-13.04,-12.88,-11.02,-8.55,-6.45,-5.31,-4.1,-2.25,-0.74,0.17,0.54,1.12,1.94,2.51,2.96,3.08,3.14,3.27,4.4,5.06,5.69,6.13,6.38,6.53,6.5,6.14,5.44,4.46,3.4,2.26,1.03,0.73,0.32,-1.68,-3.29,-2.92,-2.38,-1.56,-0.42,1.53,1.45,1.13,1.82,3.13,2.45,1.17,0.41,0.57,0.62,1.24,1.79,2.43,2.47,2.44,2.41,2.25,1.99,1.41,0.59,-0.29,-1.14,-2.05,-3.04,-3.97,-4.73,-5.46,-6.12,-6.75,-7.26,-7.64,-8.2,-7.76,-5.16,-2.85,-3.25,-3.85,-3.49,-3.4,-3.69,-4.6,-4.27,-4.59,-4.91,-4.94,-5.32,-5.56,-4.8,-4.78,-5.4,-6.45,-6.35,-7.65,-6.79,-6.9,-6.98,-7.08,-7.25,-7.16,-7.43,-7.39,-7.28,-7.21,-6.66,-6.68,-6.69,-6.83,-7.65,-5.14,-4.01,-3.97,-2.48,-1.87,-1.59,-1.63,-1.94,-2.19,-2.48,-2.45,-2.57,-3.07,-2.83,-3.07,-4.04,-4.03,-3.66,-3.28,-0.5,0.42,-0.98,-2.18,-2.57,-2.77,-3.1,-3.27,-3.26,-3.18,-3.2,-3.0,-2.67,-2.5,-2.55,-2.49,-2.57,-2.66,-2.64,-2.26,-1.59,0.11,0.58,-0.03,-1.88,-1.86,-0.94,-1.41,-2.08,-1.88,-1.88,-1.8,-1.48,-0.5,2.18,3.23,3.91,4.27,4.94,5.96,4.71,5.45,6.38,6.91,6.05,4.67,4.99,4.01,3.46,3.0,3.0,3.32,3.81,3.02,2.0,2.18,2.48,2.42,2.24,2.17,2.18,1.92,0.65,-0.06,0.61,0.87,0.3,-0.37,-1.12,-1.86,-2.0,-1.68,-1.47,-1.86,-2.81,-3.4,-3.59,-3.74,-3.87,-5.18,-6.01,-4.85,-4.45,-4.22,-3.91,-4.08,-4.45,-4.71,-4.46,-3.76,-1.93,-0.97,-0.66,-0.57,-0.47,-0.27,-0.23,-0.09,0.4,0.9,0.78,0.83,0.89,0.26,-0.98,-2.12,-2.01,-1.17,-0.91,-0.69,-1.23,-1.83,-2.13,-2.44,-2.04,-0.45,0.59,0.5,0.77,1.64,2.45,2.04,1.27,1.82,1.89,0.46,-0.36,-0.03,-0.19,-0.03,1.26,1.92,1.76,0.74,-0.45,0.1,1.22,1.92,1.94,1.74,1.66,0.83,0.21,-0.52,-0.86,-0.81,-1.17,-2.02,-2.17,-2.04,-1.92,-1.89,-1.97,-1.78,-1.19,-0.62,-0.38,-0.49,-0.99,-1.48,-1.79,-1.73,-1.72,-1.73,-1.99,-2.44,-2.27,-0.43,-1.77,-2.91,-2.7,-3.18,-3.86,-4.08,-3.87,-1.71,-2.05,-3.65,-3.07,-1.59,-0.41,-0.4,-0.14,-0.28,-2.42,-4.98,-5.47,-5.29,-5.61,-5.79,-5.98,-6.28,-6.62,-6.76,-6.81,-6.01,-6.57,-1.73,2.03,1.0,-2.64,2.77,9.5,10.81,8.94,7.26,7.13,5.85,4.81,4.25,3.23,2.29,1.67,1.11,0.2,-1.19,-2.47,-3.66,-4.69,-5.41,-5.93,-3.96,0.37,1.49,0.2,0.9,-0.83,-8.48,-8.8,-10.66,-11.86,-12.99,-13.65,-14.99,-14.57,-12.3,-10.1,-8.22,-6.89,-5.45,-4.15,-3.24,-2.47,-1.65,-0.65,0.43,1.39,2.05,2.44,2.85,3.29,3.76,4.63,5.2,5.7,5.95,6.07,6.23,6.22,5.94,5.75,5.73,5.8,5.89,5.15,2.9,0.04,-0.8,1.02,0.86,0.54,1.8,1.91,1.51,1.11,1.19,1.06,-0.2,-1.09,-1.13,-0.55,0.03,-0.25,-0.66,-0.59,0.17,1.29,0.95,0.85,1.59,1.85,1.49,0.99,0.5,-0.09,-0.7,-1.29,-2.05,-2.76,-3.62,-4.12,-3.73,-5.59,-6.48,-5.11,-3.26,-3.04,-3.94,-4.25,-4.07,-4.14,-4.44,-4.9,-4.1,-3.98,-4.54,-4.71,-5.13,-5.66,-6.03,-5.93,-5.73,-6.16,-6.34,-6.62,-7.92,-7.87,-8.07,-8.33,-8.26,-7.69,-7.77,-7.96,-7.89,-7.7,-7.64,-7.67,-7.83,-8.5,-7.69,-4.91,-4.07,-2.47,-1.58,-0.61,-1.06,-2.03,-1.31,-1.41,-2.5,-2.35,-2.95,-3.26,-2.89,-3.34,-4.4,-4.76,-3.76,-1.6,-0.07,-1.53,-2.39,-2.63,-2.97,-3.23,-3.31,-3.36,-3.31,-3.16,-3.01,-2.56,-1.91,-1.83,-2.25,-2.77,-2.91,-3.32,-2.91,-1.37,1.02,2.34,2.05,0.68,-0.82,-0.75,-0.65,-1.13,-0.49,0.3,1.1,0.79,0.13,0.5,0.82,1.5,2.35,2.7,2.83,3.11,2.63,2.79,3.17,3.68,3.86,4.0,4.07,3.85,3.54,3.29,3.32,3.04,3.45,4.78,3.73,1.23,0.98,1.27,1.65,1.17,0.95,0.85,1.44,1.96,0.81,-0.39,-0.73,-1.2,-1.6,-1.21,-1.17,-1.33,-1.79,-2.47,-2.81,-3.14,-3.37,-3.55,-3.93,-5.42,-6.58,-5.87,-5.15,-5.67,-5.81,-6.12,-6.37,-5.51,-5.94,-4.63,-2.93,-1.83,-1.11,-0.2,-0.17,-0.27,-0.78,-1.5,-1.54,-1.72,-1.31,-0.96,-1.32,-1.15,-1.32,-0.47,1.43,1.84,1.62,1.86,1.76,1.14,0.27,-0.55,-0.84,-0.52,-0.62,-0.05,0.61,0.58,0.87,1.81,2.04,1.92,1.71,1.48,1.09,0.9,1.28,1.45,1.62,1.37,1.68,1.83,1.33,1.01,1.1,0.84,0.53,1.07,1.57,1.69,2.04,2.26,1.89,0.62,0.06,0.73,0.36,0.27,0.02,-0.08,-0.02,0.21,0.72,1.03,0.48,-0.28,-0.89,-1.57,-0.9,0.77,-0.16,-1.63,0.1,1.17,0.61,-0.42,-0.45,-0.52,-1.72,-2.64,-4.66,-6.81,-5.21,-6.41,-6.3,-3.85,-3.48,-1.95,-0.2,-0.31,0.83,1.12,0.14,-0.1,-2.28,-4.49,-4.81,-4.82,-5.18,-5.44,-5.72,-5.95,-6.17,-6.14,-5.83,-6.16,-6.65,-3.79,-2.99,1.23,5.8,9.93,11.59,9.66,9.19,10.06,9.15,6.38,4.26,3.86,2.64,1.05,-0.95,-2.76,-3.62,-4.44,-7.09,-6.31,-7.67,-8.83,-8.1,-6.68,-5.7,-7.69,-9.39,-7.91,-5.92,-4.35,-11.41,-16.43,-18.14,-18.35,-17.17,-14.73,-12.12,-10.02,-8.67,-8.02,-7.27,-6.64,-6.03,-4.51,-2.37,-0.39,1.25,2.33,2.96,3.35,3.6,3.87,4.24,6.0,6.3,6.94,7.34,7.6,7.82,8.0,7.87,7.61,7.43,6.4,4.76,4.48,3.12,-0.08,-1.1,1.66,2.37,1.86,1.16,1.6,1.54,1.37,1.35,0.92,0.78,1.23,1.05,0.12,-0.93,-1.61,-1.1,-0.64,-0.88,-0.49,-0.8,-0.24,-0.33,-1.01,-0.75,-0.39,-0.71,-1.32,-1.95,-2.01,-2.34,-2.88,-3.47,-3.28,-2.8,-2.15,-2.07,-2.63,-3.0,-3.15,-3.42,-3.81,-4.15,-4.35,-4.54,-4.53,-4.41,-4.36,-4.38,-5.01,-5.62,-4.5,-6.12,-7.4,-6.98,-7.02,-8.14,-7.73,-7.98,-8.89,-8.03,-7.97,-8.26,-7.62,-7.37,-7.62,-7.62,-7.68,-7.84,-7.96,-8.28,-8.02,-5.1,-2.87,-2.98,-2.1,-1.95,-2.2,-1.6,-1.23,-0.41,-0.5,-0.93,0.06,0.77,-1.38,-3.92,-4.29,-4.48,-4.59,-4.66,-4.48,-3.59,-3.95,-3.84,-3.57,-3.81,-3.91,-3.64,-3.68,-3.58,-3.29,-2.69,-2.1,-2.34,-2.64,-2.2,-2.56,-4.15,-3.35,-1.1,-0.41,0.49,1.7,2.63,2.86,2.4,1.56,1.2,1.7,1.89,2.45,4.07,3.2,1.49,0.9,1.49,2.07,2.22,1.98,2.27,2.56,2.36,1.78,2.16,3.44,3.3,3.16,3.04,3.37,3.2,2.29,2.57,3.22,2.04,1.43,2.5,1.46,0.24,0.08,0.13,-0.3,0.27,0.63,-0.14,-0.21,-0.14,-0.84,-1.71,-2.98,-3.47,-2.84,-2.81,-1.9,-1.81,-1.47,-2.93,-4.64,-4.34,-5.02,-5.47,-6.01,-6.19,-5.96,-6.4,-7.0,-7.68,-8.09,-7.39,-6.1,-5.13,-2.99,-1.52,-0.69,0.0,0.21,0.68,-0.95,-1.0,0.38,1.88,1.85,1.84,1.73,1.19,0.56,0.45,0.43,0.26,-0.55,-0.74,-1.28,-2.55,-2.17,-1.05,-2.23,-2.66,-0.02,1.31,1.46,0.94,1.16,1.2,0.54,0.24,-0.18,-0.16,0.83,1.59,1.4,1.1,0.94,0.72,1.14,1.73,1.07,-0.46,-0.11,0.4,0.02,0.19,1.17,1.57,1.72,1.45,1.83,2.83,3.03,3.23,3.05,2.45,2.47,2.87,2.81,2.65,2.69,2.78,2.83,2.9,3.54,3.71,3.22,2.75,1.49,0.61,0.21,0.27,0.72,1.4,1.17,-0.15,-0.9,-1.46,-2.4,-3.9,-3.76,-4.57,-4.44,-4.06,-3.89,-4.04,-3.72,-2.7,-1.32,-1.44,-3.07,-3.63,-1.28,-0.57,-0.8,-2.24,-4.79,-5.65,-5.52,-5.79,-6.31,-6.62,-7.14,-8.29,-6.87,-6.9,-4.65,-0.99,0.45,5.8,7.46,8.52,10.14,10.76,8.49,7.24,6.75,6.25,3.81,1.1,-0.56,-2.54,-3.93,-5.02,-7.15,-8.3,-9.67,-4.73,-4.33,-3.97,-2.91,-1.52,-2.73,-3.4,-4.41,-6.32,-9.32,-13.98,-18.53,-19.31,-18.71,-16.93,-14.49,-12.08,-10.27,-9.75,-9.83,-9.82,-9.37,-7.41,-4.97,-2.82,-0.5,1.82,3.64,4.98,5.75,6.02,6.01,6.06,9.53,8.36,6.95,6.86,7.86,8.25,8.55,9.25,9.96,10.46,10.45,8.78,4.61,1.7,2.0,2.5,1.78,2.32,0.45,0.92,1.21,0.76,0.41,-0.1,-0.88,-0.87,-0.68,-0.49,-0.65,-0.64,-0.2,-0.41,-0.31,-0.29,-0.54,-0.72,-0.91,-1.17,-0.91,-0.77,-1.09,-2.46,-2.61,-2.4,-2.73,-2.82,-4.04,-3.61,-1.67,-2.3,-2.48,-2.43,-2.56,-3.11,-3.44,-3.77,-4.17,-4.67,-4.09,-4.24,-4.43,-4.61,-5.32,-5.55,-5.09,-3.67,-3.11,-5.74,-7.18,-7.01,-6.97,-7.41,-8.68,-9.17,-7.17,-6.64,-7.14,-7.36,-6.58,-6.65,-6.47,-6.29,-6.34,-6.43,-6.44,-5.95,-4.73,-4.3,-3.08,-1.13,-1.44,-2.27,-1.1,-0.23,-1.14,0.25,1.37,1.57,0.78,-0.68,-2.16,-4.05,-4.97,-5.2,-5.28,-5.56,-5.03,-4.33,-3.81,-3.66,-3.85,-3.21,-2.72,-2.73,-3.04,-2.91,-2.2,-2.0,-1.63,-1.41,-1.64,-2.29,-3.44,-3.44,-1.6,-0.14,0.37,1.01,1.77,1.58,1.75,2.3,1.06,1.63,2.7,2.97,3.28,4.66,4.09,3.53,1.9,1.85,1.71,3.25,3.65,1.74,1.97,0.72,-0.87,0.14,1.94,2.13,2.03,2.17,2.69,3.22,3.03,2.69,1.93,1.79,1.11,1.48,1.11,-0.05,-0.51,-0.03,0.27,0.06,-0.04,-0.43,-1.05,-1.82,-2.62,-2.39,-1.87,-1.03,-1.25,0.79,2.01,1.74,-0.52,-1.53,-2.73,-4.76,-3.44,-4.73,-5.82,-5.4,-5.42,-6.59,-7.3,-7.93,-7.82,-6.62,-4.77,-3.29,-1.99,0.6,1.51,0.15,-0.97,-1.85,-0.25,1.0,0.18,-1.85,-1.03,-0.08,-0.88,-1.54,0.02,-0.06,-1.82,-2.33,-2.56,-2.43,-1.4,-0.52,0.16,0.23,0.76,1.48,1.16,0.91,0.82,0.14,-0.09,1.05,1.08,0.01,-0.26,-0.57,-0.07,0.16,1.04,1.11,1.01,0.95,0.1,-0.16,0.76,1.3,1.95,1.91,1.77,2.28,3.11,2.98,2.88,2.72,3.04,3.36,3.83,4.3,3.8,4.0,4.18,4.15,3.51,3.69,3.72,3.77,3.74,3.67,4.38,5.06,4.07,2.57,2.51,2.22,1.3,0.24,0.21,1.47,0.32,-0.03,-1.31,-2.77,-3.44,-2.97,-3.45,-3.58,-3.59,-3.7,-3.71,-3.73,-3.65,-3.52,-3.44,-4.64,-4.3,-5.63,-3.11,0.35,-0.16,-1.47,-0.03,0.12,-0.5,-8.03,-9.4,-8.82,-8.56,-8.98,-9.37,-9.37,-5.91,-1.62,-0.27,5.39,7.61,7.97,9.89,8.81,7.34,7.23,6.55,6.31,4.02,-0.74,-3.21,-5.24,-6.27,-7.17,-11.15,-11.0,-5.41,-3.82,-5.3,-7.17,-8.49,-8.39,-7.39,-6.89,-9.02,-11.65,-14.1,-15.5,-16.55,-17.2,-16.81,-15.01,-12.76,-10.79,-9.21,-9.27,-10.47,-11.44,-11.12,-9.32,-6.69,-3.71,-0.45,2.63,4.99,6.49,7.86,9.86,10.96,10.52,13.25,12.38,9.96,6.88,5.46,7.93,8.52,8.66,9.81,10.65,11.37,9.77,3.18,0.85,1.02,1.04,1.55,1.84,0.95,0.73,0.12,-0.12,-0.57,-1.19,-1.59,-1.94,-2.16,-2.1,-2.11,-1.25,-0.68,-1.02,-0.72,-0.65,-0.21,1.17,1.18,0.52,-0.4,-1.12,-2.81,-3.3,-2.09,-2.87,-3.33,-2.19,-2.54,-2.56,-2.23,-1.94,-1.92,-2.26,-2.54,-3.11,-3.52,-3.75,-4.15,-4.51,-3.5,-3.14,-3.1,-3.92,-5.0,-6.24,-6.04,-4.82,-2.5,-4.88,-5.81,-5.58,-5.87,-6.64,-6.66,-6.32,-6.49,-6.72,-7.22,-7.45,-6.62,-5.99,-6.09,-6.15,-5.71,-5.55,-4.9,-4.59,-4.25,-3.79,-3.01,-1.88,-0.97,-0.57,0.28,-0.26,0.47,0.92,0.2,-0.05,-0.86,-2.0,-3.42,-3.95,-5.23,-5.35,-5.26,-4.74,-4.97,-4.79,-3.89,-3.31,-3.22,-2.7,-1.83,-1.78,-1.92,0.19,0.86,0.0,-0.49,-0.17,0.18,-0.07,0.69,1.83,2.67,2.73,2.57,0.33,1.78,4.6,4.81,4.47,4.32,3.67,2.55,3.27,4.35,4.06,4.39,2.53,2.17,1.37,2.4,2.38,0.23,-0.16,1.15,0.96,0.95,2.26,3.39,3.09,2.23,3.35,2.51,3.28,3.52,2.45,2.31,1.81,1.4,1.38,1.61,1.88,2.12,1.46,0.36,0.08,0.23,-0.61,-1.53,-1.9,-1.15,-1.63,-2.42,-1.27,-0.42,0.04,0.04,0.04,0.57,-0.85,-1.64,-4.57,-4.75,-4.4,-5.23,-5.4,-5.65,-5.32,-8.93,-8.66,-7.44,-4.72,-2.23,-1.42,-1.59,-1.31,-0.46,0.27,0.4,1.34,0.71,-0.64,-1.93,-1.87,-0.83,-0.99,0.29,0.89,-0.05,-0.56,-0.37,0.26,0.85,0.48,1.18,1.08,1.14,0.9,1.36,1.71,1.44,0.79,0.28,-0.1,-0.44,0.52,0.45,0.08,-0.57,-0.94,-1.07,-0.68,0.23,-0.19,-0.64,-0.37,-0.62,1.13,1.79,1.43,1.43,1.7,1.75,1.95,2.0,3.73,3.97,4.29,4.51,3.67,4.34,4.44,4.22,4.09,4.2,3.97,3.7,3.65,3.82,4.23,4.55,4.7,5.69,6.05,4.99,3.64,2.31,0.98,0.09,0.33,-0.11,-0.81,0.39,0.23,-0.74,-1.69,-2.37,-2.68,-3.02,-3.26,-3.34,-3.37,-3.48,-3.57,-4.09,-3.13,-3.09,-2.32,-2.98,-4.83,-5.77,-2.91,-0.57,-1.93,-4.76,-3.74,-0.57,-5.24,-12.91,-11.68,-10.53,-9.84,-10.75,-10.63,-7.28,1.64,0.93,3.81,8.98,10.4,11.07,10.65,11.52,10.47,7.32,5.96,3.92,0.27,-2.77,-4.8,-1.93,-1.87,-5.22,-6.86,-9.8,-9.45,-8.18,-8.57,-8.88,-9.22,-8.65,-7.48,-6.95,-8.17,-7.97,-7.56,-9.56,-12.87,-11.02,-7.6,-6.4,-6.97,-3.19,-5.03,-8.61,-9.41,-10.51,-10.83,-9.23,-5.79,-1.07,4.72,9.57,10.53,9.07,7.93,10.22,12.62,14.9,14.61,12.51,9.23,5.49,2.84,7.61,10.4,10.0,9.45,10.23,9.09,5.71,3.36,2.14,1.49,1.12,1.19,0.58,0.0,0.02,-0.59,-1.93,-3.15,-3.23,-2.69,-2.05,-1.93,-1.52,-1.59,-0.59,0.09,-0.17,-0.41,-0.37,0.29,0.08,-0.13,-0.81,-0.83,-0.75,-1.11,-1.3,-1.56,-1.87,-1.98,-2.04,-2.19,-2.48,-2.55,-2.49,-2.56,-2.7,-2.69,-2.79,-2.96,-3.2,-3.46,-3.56,-3.35,-1.97,-2.84,-3.64,-5.15,-6.54,-3.97,-3.99,-5.26,-4.98,-5.28,-6.08,-6.52,-6.94,-7.07,-7.0,-7.11,-7.05,-7.15,-7.11,-6.85,-6.66,-6.38,-6.2,-5.75,-5.25,-4.76,-4.48,-4.07,-3.14,-1.52,-0.65,-0.38,-0.14,-0.02,-0.15,-0.36,0.12,-0.15,-1.44,-2.53,-3.4,-4.05,-3.97,-3.77,-3.9,-3.8,-3.5,-2.3,-0.61,0.15,0.95,1.29,1.7,1.58,1.23,0.63,0.11,-0.04,-0.51,-0.82,-1.42,-1.04,0.8,2.99,4.1,5.95,5.3,4.0,3.18,5.07,4.93,3.8,2.76,2.61,3.05,3.97,4.95,4.35,2.76,2.16,0.92,2.08,2.47,2.23,1.47,2.07,1.43,0.34,0.32,0.32,0.91,2.8,2.42,1.79,1.52,1.1,1.63,0.98,0.31,0.3,1.23,1.52,1.35,1.05,1.34,1.34,0.58,-0.01,-0.77,-0.93,1.13,0.4,-0.7,-1.23,-1.89,0.15,-0.33,-1.05,-1.07,-1.05,-2.69,-5.35,-4.68,-6.89,-6.92,-5.83,-6.29,-3.1,-5.5,-6.39,-9.62,-10.31,-8.77,-7.24,-2.61,-2.03,-2.35,-1.02,-1.41,-1.3,0.24,0.55,-0.14,-0.99,-0.21,0.87,0.36,0.52,1.28,-0.69,-1.82,-1.46,1.41,2.26,1.84,2.59,2.39,2.28,1.52,1.15,1.51,2.39,2.32,1.36,2.41,3.16,1.94,0.79,0.5,-1.16,-1.03,-1.16,-0.21,-0.95,-1.14,-1.07,-0.38,-0.91,1.12,0.07,1.86,2.13,1.4,1.79,1.96,2.19,2.57,2.72,3.15,3.63,3.47,3.45,3.32,3.31,3.21,3.25,2.88,3.04,3.17,3.47,3.91,4.38,4.44,4.52,5.24,5.06,4.29,3.24,1.61,-0.2,-1.44,-1.13,-0.33,0.17,0.38,0.09,-0.31,-0.57,-2.37,-2.44,-2.23,-2.36,-1.94,-1.52,-3.81,-4.71,-3.52,-2.0,-3.96,-3.76,-4.24,-4.01,-4.14,-3.0,-1.91,-4.28,-1.96,-1.2,-1.34,-3.66,-6.62,-8.67,-10.69,-12.1,-12.28,-13.63,-1.42,5.34,3.26,6.61,7.85,7.39,8.92,7.7,5.51,3.1,2.32,0.44,-1.52,-2.27,-4.27,-4.32,-6.21,-8.63,-9.88,-10.98,-11.72,-11.05,-10.91,-10.89,-9.9,-7.55,-5.91,-4.33,-3.7,-4.87,-5.84,-5.94,-4.93,-5.09,-5.21,-3.82,-1.76,0.88,0.1,-2.82,-2.74,-7.3,-8.26,-6.63,-5.4,-2.42,1.34,5.21,7.68,7.73,8.26,7.28,9.18,13.2,14.88,13.52,11.27,8.2,6.9,5.41,2.75,7.93,6.94,8.03,6.06,4.97,4.93,4.78,3.71,2.19,1.79,2.01,1.26,0.18,-0.84,-1.3,-1.15,-3.2,-2.31,-2.55,-2.63,-2.26,-1.81,-1.48,-0.38,-0.02,-0.21,-0.66,-0.65,-0.55,-0.25,0.22,0.29,-0.3,-0.49,-0.53,-0.74,-1.14,-1.38,-1.46,-1.62,-1.71,-1.71,-1.79,-1.69,-2.04,-2.18,-2.5,-2.66,-2.57,-2.8,-2.55,-2.25,-1.1,-2.58,-2.46,-3.21,-5.68,-6.22,-4.66,-4.42,-4.62,-4.83,-5.15,-5.12,-5.61,-6.29,-6.77,-7.19,-7.25,-7.08,-7.49,-7.49,-6.76,-6.44,-6.51,-5.78,-4.35,-3.4,-3.17,-2.14,-0.81,0.07,1.17,1.88,1.42,0.97,0.21,0.11,0.2,0.17,-0.3,-1.67,-2.36,-3.27,-3.11,-2.94,-2.61,-2.1,-1.33,0.46,2.76,3.08,2.11,1.8,1.01,1.42,2.15,1.15,-0.36,-1.49,-1.42,-0.92,-1.49,-0.74,1.17,2.49,2.87,3.15,3.59,3.49,3.3,2.82,2.26,1.63,1.75,1.37,1.19,3.05,3.02,3.13,3.26,3.68,1.73,0.93,2.21,2.24,1.41,1.05,-0.16,0.55,0.52,0.86,1.61,1.66,1.44,1.88,2.12,1.19,1.27,2.2,2.65,3.1,2.33,2.19,1.83,1.79,0.52,0.19,-0.36,-0.85,0.31,0.42,-0.16,-0.44,-0.54,-0.58,-0.67,-1.77,-1.34,-0.88,-1.64,-2.06,-1.97,-4.73,-6.55,-7.16,-8.06,-6.58,-7.57,-0.85,-1.08,-8.22,-7.65,-8.88,-9.12,-9.05,-5.15,-1.98,-2.5,-1.34,-0.63,2.13,2.13,0.44,-0.09,-0.89,-1.06,-1.08,-1.75,0.65,1.99,1.86,1.9,3.39,3.33,4.66,3.3,5.44,1.76,0.93,1.75,2.44,2.14,1.89,0.83,-0.15,-0.4,-1.31,-0.09,0.26,1.07,0.87,0.73,-0.17,-1.02,-1.24,-2.15,-1.83,0.04,-0.22,0.52,0.82,0.93,1.48,1.77,1.61,1.84,1.83,1.67,1.72,1.74,1.97,2.01,2.33,2.66,2.85,3.19,3.21,2.8,2.27,2.93,3.87,3.57,3.62,4.59,5.06,4.59,4.28,3.87,3.54,2.92,1.3,-0.5,-0.68,-1.19,-0.64,-0.12,-1.31,-2.5,-2.37,0.79,-0.72,-2.3,-3.09,-3.6,-3.72,-2.56,-4.55,-5.5,-5.08,-3.52,-3.88,-4.66,-4.15,-5.83,-6.01,-6.96,-5.06,-0.16,-4.56,-7.28,-4.29,-3.49,-11.65,-11.83,-11.83,-11.3,-10.91,-11.32,0.72,9.85,7.85,4.83,8.85,7.6,5.56,3.92,2.49,1.24,-0.58,-3.04,-7.17,-8.09,-11.71,-10.19,-10.87,-10.78,-10.02,-9.25,-9.16,-8.99,-8.53,-7.59,-6.31,-5.07,-4.19,-3.81,-3.72,-3.33,-4.57,-6.92,-4.66,-2.8,-0.6,-2.94,-6.89,-3.35,-1.46,0.27,-2.22,-4.35,-4.86,-5.04,-4.13,-2.47,-0.46,1.85,4.66,5.83,6.76,8.47,10.2,13.53,10.23,9.27,7.22,5.03,8.66,9.04,5.95,2.55,2.98,2.13,5.97,5.69,3.87,4.81,4.06,2.23,1.71,1.11,0.3,0.07,-1.76,-2.65,-1.31,-1.09,-2.03,-2.67,-2.97,-2.43,-2.38,-1.38,-0.43,-0.22,-0.66,-0.49,0.03,0.39,0.58,0.55,0.69,0.77,0.55,-0.07,-0.02,0.32,0.07,-0.38,-0.68,-0.84,-0.93,-1.06,-1.23,-0.86,-0.77,-0.67,-1.33,-1.57,-2.11,-2.35,-2.2,-1.86,-2.48,-3.82,-3.37,-3.46,-3.93,-4.2,-3.84,-3.5,-3.67,-4.11,-5.03,-5.12,-4.51,-4.52,-5.28,-5.85,-6.08,-6.13,-5.69,-4.97,-3.97,-3.61,-2.85,-2.08,-1.75,-1.4,-1.28,-0.37,1.3,3.01,3.39,3.47,3.21,2.65,1.13,0.38,-0.06,-0.27,-0.48,-1.42,-2.23,-2.02,-1.63,-2.06,-1.43,-1.06,-0.31,0.24,0.37,0.83,1.33,1.71,2.56,1.95,1.26,0.48,-0.18,-0.66,-0.45,-1.31,-0.82,1.47,3.04,2.94,3.64,4.66,3.85,2.08,2.1,2.01,1.97,2.15,2.37,2.74,2.66,2.43,0.82,0.48,1.75,3.0,2.64,0.76,0.08,-0.05,-0.12,0.69,0.63,0.8,0.32,0.88,1.03,1.25,1.88,2.44,2.19,2.23,2.55,2.72,2.65,2.59,1.89,1.2,0.76,1.08,0.83,0.38,0.48,0.36,-0.66,-0.84,-0.82,-0.98,-1.26,-1.38,-1.49,-2.03,-1.96,-2.5,-2.4,-2.32,-6.17,-8.0,-8.27,-8.06,-6.47,-4.2,-2.42,-7.32,-9.45,-8.89,-8.89,-8.03,-6.59,-6.12,-6.17,-4.5,-2.28,2.78,2.97,1.12,-0.33,-0.97,-1.49,-1.28,-1.98,0.07,3.69,3.73,4.47,1.94,0.35,0.96,0.54,-0.38,0.35,-0.11,0.95,2.56,1.11,-0.47,0.71,0.28,-0.04,0.87,2.0,2.3,1.9,1.33,0.67,0.77,0.7,1.79,2.08,1.45,0.98,-0.18,-0.93,-1.17,0.37,0.82,0.24,1.64,2.6,1.5,1.08,1.44,1.39,1.56,1.43,-0.3,-0.74,1.01,2.07,2.63,3.09,2.59,2.84,3.18,4.4,4.91,4.57,4.25,4.75,4.85,4.3,4.22,3.51,2.55,1.09,0.17,-0.15,-0.92,-1.69,-2.33,-2.42,-2.62,-1.49,-0.03,-2.02,-2.89,-3.35,-3.66,-3.29,-2.74,-2.36,-3.03,-3.62,-4.06,-5.77,-4.3,-5.56,-5.07,-3.49,-2.66,-2.35,0.91,-1.44,-5.07,-3.6,-8.31,-12.32,-10.73,-10.18,-9.6,-8.18,-5.14,1.04,2.44,3.31,0.59,-0.29,0.68,1.25,0.86,0.56,0.3,-2.56,-3.1,-7.25,-14.25,-10.46,-9.66,-8.62,-8.04,-7.38,-6.59,-5.79,-5.09,-4.54,-4.0,-3.33,-2.71,-2.21,-1.96,-2.09,-2.56,-3.39,-4.1,-3.76,-4.56,-6.47,-5.21,-6.55,-3.63,-0.8,-0.57,-1.74,-2.86,-3.16,-2.38,-1.2,0.0,1.4,3.28,5.25,6.7,7.51,8.09,9.33,10.84,5.84,5.65,5.45,7.68,8.95,4.55,1.41,2.11,1.82,2.52,2.5,3.52,3.58,2.53,2.55,2.06,1.27,0.93,2.84,2.07,0.63,-0.69,-1.44,-1.91,-1.45,-1.49,-2.63,-3.01,-2.52,-1.88,0.04,0.1,-0.19,-0.31,-0.01,1.16,1.08,0.63,1.15,1.26,1.25,1.22,1.29,1.08,0.42,0.52,0.66,0.52,0.1,-0.03,0.0,0.27,0.53,0.38,-0.07,-0.16,-0.37,-0.41,-0.59,-0.49,-2.66,-2.93,-2.54,-2.71,-2.85,-2.92,-2.92,-2.75,-2.85,-3.27,-3.49,-3.95,-3.98,-5.27,-4.13,-3.81,-3.73,-3.29,-2.93,-2.68,-2.42,-1.84,-1.71,-0.9,-0.65,-0.16,0.16,0.68,1.41,2.52,3.5,3.87,3.33,2.6,1.97,0.95,0.12,-0.84,-1.54,-1.71,-1.08,-1.16,-1.52,-1.1,-0.61,-0.06,-0.13,0.08,0.44,0.36,0.08,0.16,0.76,2.12,1.9,0.96,-0.04,-0.48,-0.94,-1.06,-1.53,-0.04,2.02,2.37,2.1,2.43,3.52,5.05,5.31,5.23,5.48,4.83,5.11,5.23,5.41,5.43,3.92,2.32,2.32,2.27,2.05,0.34,1.26,0.04,-0.2,-0.62,0.45,0.66,1.02,0.75,1.93,1.49,2.43,2.25,2.57,2.52,2.51,2.21,2.05,2.38,-0.9,-1.63,0.85,0.09,-1.67,-0.49,0.18,-0.47,-1.19,-0.69,0.73,0.15,-0.58,-1.75,-0.81,-0.29,0.8,-0.54,-1.26,-0.45,-5.66,-8.58,-8.39,-7.87,-6.5,-5.21,-5.77,-8.23,-10.03,-9.39,-7.7,-6.12,-6.93,-7.49,-6.26,-3.69,0.86,1.11,2.57,2.43,1.46,1.01,0.41,-0.86,0.12,-0.01,0.51,-0.26,-0.09,-0.72,0.16,2.34,1.53,3.02,4.55,3.6,1.99,3.29,2.87,2.85,2.37,2.7,2.08,2.84,2.69,2.6,2.62,1.49,1.48,1.35,1.52,1.49,0.43,0.3,2.08,2.23,0.84,2.47,3.39,3.81,3.14,1.86,0.91,1.1,0.83,1.12,0.79,0.41,0.89,3.21,3.18,2.82,2.77,2.63,2.84,2.9,2.59,2.64,3.59,4.06,4.6,4.7,4.92,3.64,3.14,3.19,2.5,1.64,1.03,0.39,-0.65,-1.45,-2.07,-2.64,-2.89,-2.67,-2.24,-2.27,-2.93,-3.13,-3.11,-3.44,-3.65,-1.64,-0.89,-2.15,-2.2,-3.05,-4.99,-5.92,-5.99,-6.6,-4.83,-0.96,-2.91,-3.71,-3.27,-4.54,-5.7,-9.96,-9.65,-9.73,-9.88,-8.6,-6.27,-3.45,-2.28,-0.32,-2.32,-2.9,-6.46,-3.83,-2.16,-4.05,-8.06,-9.2,-8.36,-10.85,-13.85,-11.29,-9.52,-8.44,-7.79,-6.5,-5.09,-3.77,-2.56,-1.32,-0.18,0.75,1.32,1.44,1.36,1.24,0.74,0.06,-0.64,-1.51,-2.43,-3.28,-3.6,-3.67,-3.43,-2.36,-0.93,-1.12,-2.2,-3.59,-4.59,-3.18,-0.85,0.74,2.08,3.88,5.53,6.19,6.25,6.17,5.84,5.15,3.04,2.64,3.27,5.36,7.02,0.45,0.11,0.5,1.51,1.24,0.98,1.79,1.98,1.94,1.92,2.38,1.47,0.98,3.11,1.9,0.85,-0.68,-1.54,-2.15,-2.06,-1.46,-2.86,-2.98,-2.51,-1.73,-0.68,2.5,2.17,0.94,0.52,0.48,1.47,1.5,1.21,1.49,1.46,1.38,1.22,1.24,1.08,0.87,0.96,0.95,0.71,0.56,0.65,0.87,0.7,0.44,0.41,-0.08,-0.41,-0.11,-0.03,-0.47,-1.89,-1.48,-1.43,-1.68,-1.98,-1.85,-1.58,-1.71,-1.75,-1.41,-1.46,-1.85,-2.11,-2.4,-2.53,-2.94,-2.96,-2.82,-2.39,-2.32,-1.95,-1.78,-1.57,-1.31,-0.97,-0.75,-0.33,0.28,1.28,2.19,3.5,3.98,2.99,2.1,1.41,1.1,0.54,-0.39,-0.5,-1.31,-1.94,-1.92,-1.12,-0.76,-1.26,-1.59,-1.79,-1.75,-0.78,0.18,0.79,1.06,1.75,2.91,2.81,1.99,1.35,0.05,-1.47,-1.63,-1.56,-0.71,1.56,1.94,3.1,4.88,5.11,4.35,4.87,5.35,5.56,5.14,5.16,5.34,5.93,6.03,5.2,1.64,2.21,1.65,1.09,0.39,0.07,0.19,-0.48,0.53,1.08,0.02,0.41,1.6,0.94,1.9,1.92,3.27,3.04,2.07,1.12,0.66,0.09,-3.32,-1.83,0.01,-2.22,-2.16,-1.38,-0.24,-1.35,-1.97,-0.7,0.77,0.81,0.3,1.56,1.27,-0.28,-1.66,-2.87,-2.19,-0.86,-2.9,-7.14,-8.05,-8.28,-7.46,-6.19,-5.44,-6.19,-8.23,-8.16,-8.79,-8.58,-7.53,-7.48,-7.15,-5.6,-4.43,0.49,5.2,4.73,2.65,3.21,3.92,2.36,2.36,1.75,0.72,-1.27,0.23,-1.84,1.21,3.01,0.58,-3.71,-5.21,-1.03,0.39,0.61,1.61,1.11,0.12,3.52,2.57,2.83,4.2,3.66,3.36,2.18,2.3,3.08,1.74,0.75,1.51,1.67,2.75,2.83,3.31,1.05,4.11,4.53,3.89,2.94,2.35,1.33,1.35,2.5,3.62,2.75,1.26,1.9,2.8,3.18,3.36,3.26,2.98,2.62,2.49,2.44,2.34,2.11,3.26,3.76,3.25,3.56,3.15,2.71,2.61,2.76,1.69,0.64,-0.36,-1.5,-2.44,-3.08,-3.4,-3.15,-1.96,-1.21,-0.74,-0.71,-1.29,-2.36,-2.72,-2.89,-1.58,-1.52,-3.16,-4.25,-4.13,-3.55,-5.8,-6.82,-7.45,-6.86,-3.96,-2.82,-3.9,-4.05,-5.12,-7.49,-9.5,-9.27,-9.21,-7.36,-7.33,-7.73,-7.15,-5.82,-4.17,-4.21,-2.31,-1.73,-7.34,-1.22,-4.09,-5.83,-6.42,-12.93,-14.52,-15.97,-11.31,-6.98,-4.03,-1.54,-0.34,0.31,0.94,1.12,1.16,1.21,1.19,1.37,2.64,3.69,4.24,4.63,4.61,3.89,2.41,0.81,-0.82,-2.07,-2.43,-2.33,-1.92,-2.15,-2.73,-3.62,-4.32,-4.49,-3.18,-1.32,0.86,2.93,4.31,5.74,5.34,4.09,3.37,3.05,3.39,-1.46,-0.44,0.11,2.8,4.73,0.42,-2.98,-1.07,-0.37,-1.66,-1.83,-0.24,2.18,2.98,3.0,2.68,2.19,2.39,2.81,2.02,0.35,-1.35,-2.21,-2.43,-2.11,-2.84,-3.39,-4.35,-4.23,-2.11,0.03,1.03,1.19,1.35,1.58,1.74,1.58,1.4,1.38,1.4,1.54,1.44,1.33,1.22,1.15,1.26,1.38,1.43,1.31,1.08,0.97,0.87,0.57,0.44,0.04,0.11,0.0,-0.11,0.32,-1.21,-1.55,-0.53,0.03,0.01,-0.07,-0.44,-0.87,-0.94,-0.82,-0.82,-0.6,-0.55,-0.65,-0.84,-1.11,-1.37,-1.47,-1.44,-1.41,-1.25,-0.98,-0.54,-0.09,0.24,0.34,0.59,0.75,1.07,1.52,2.22,2.32,2.46,2.8,1.82,0.91,0.33,-0.12,-0.62,-0.58,-0.99,-1.22,-1.36,-1.65,-1.61,-1.64,-2.15,-1.64,0.42,1.02,0.39,0.57,1.39,2.48,3.38,2.27,0.89,-0.25,-2.05,-1.62,-1.36,-1.64,-0.87,-0.68,4.0,6.03,5.48,5.32,5.79,5.4,4.98,4.79,4.02,3.69,4.37,5.13,6.08,5.3,1.88,1.85,1.77,1.44,0.26,0.5,-0.44,-0.49,-0.5,0.13,-0.51,-2.11,-1.02,0.28,0.71,0.62,0.05,-0.39,-0.22,0.07,-0.85,-2.75,-3.47,-4.65,-5.78,0.48,0.92,1.64,1.04,1.54,2.79,1.55,0.06,0.33,2.47,1.75,1.38,-0.8,-3.31,-4.08,-4.03,-3.63,-3.82,-6.41,-7.86,-7.73,-6.66,-6.49,-6.46,-8.65,-9.91,-10.05,-9.77,-8.3,-7.47,-7.09,-4.96,0.01,2.17,2.59,1.77,1.08,0.72,-0.2,-0.65,0.41,1.52,2.08,0.74,-0.37,-1.58,-3.73,1.44,3.25,0.0,-0.61,2.17,3.51,3.22,2.28,2.41,0.51,-0.17,0.68,1.23,2.54,3.56,4.55,3.62,2.38,2.48,3.88,3.14,2.58,1.83,1.81,2.1,1.97,0.35,1.68,2.9,2.15,1.44,1.3,1.2,-0.9,-2.67,-0.21,2.63,2.42,2.04,1.74,2.95,3.8,2.58,3.11,3.68,3.59,2.32,2.7,2.68,2.91,1.88,2.54,3.31,3.49,2.49,2.5,2.93,3.25,1.64,0.31,-1.1,-2.37,-3.34,-3.47,-3.17,-1.92,0.59,0.89,0.0,-0.36,-0.71,-1.38,-1.78,-1.76,-1.28,-1.73,-3.39,-3.49,-2.93,-2.67,-2.63,-3.79,-8.87,-7.02,-5.39,-2.15,0.22,-1.48,-5.75,-6.78,-7.33,-9.49,-8.56,-9.47,-9.98,-7.62,-4.95,-4.16,-3.26,-3.67,-5.75,-1.79,0.52,-0.54,-1.01,-0.52,-5.1,-5.58,2.75,8.56,5.92,4.21,4.26,4.01,3.49,2.97,2.6,2.51,2.47,2.36,1.87,4.17,9.33,8.61,7.83,8.01,7.45,6.97,6.32,5.54,4.04,2.08,0.16,-1.41,-2.62,-3.05,-3.31,-3.48,-3.67,-4.06,-4.0,-3.67,-1.99,1.1,4.79,7.3,5.77,2.52,1.13,0.91,1.09,-4.32,-3.11,-2.85,0.99,2.33,1.77,0.14,-1.01,-1.39,-1.37,0.02,0.86,1.96,5.19,3.86,3.24,3.5,3.08,3.35,2.49,0.93,-1.32,-0.84,-0.14,-0.63,-1.25,-1.43,-1.51,-2.91,-2.77,-0.88,0.15,0.47,1.18,1.28,1.03,1.27,1.49,1.77,1.31,1.37,1.2,1.08,0.94,0.52,0.89,0.83,0.91,1.01,1.35,1.09,0.41,-0.27,-0.83,-1.0,-0.99,-0.44,-0.13,-0.53,-1.61,-1.14,-0.19,0.37,0.37,0.2,0.28,0.17,-0.15,-0.26,-0.06,-0.18,-0.31,-0.36,-0.38,-0.35,-0.43,-0.5,-0.52,-0.54,-0.41,-0.13,0.11,0.47,0.69,0.85,1.07,1.41,1.72,1.85,1.63,1.34,0.98,0.74,0.69,0.02,-0.51,-0.52,-0.26,-0.52,-0.76,-1.72,-1.88,-2.07,-2.67,-2.49,0.36,1.69,1.45,0.88,1.53,3.0,2.55,2.5,1.69,0.75,-0.28,-0.69,-0.81,-1.0,-2.06,-1.45,-1.95,4.35,5.66,6.08,5.63,4.25,5.07,4.11,3.97,3.17,2.83,3.94,5.58,5.88,6.02,5.37,2.86,2.52,2.3,1.67,0.56,2.19,3.01,0.84,-0.25,-0.86,-0.26,0.43,-0.24,-1.29,-2.37,1.3,2.27,1.72,-0.88,-3.59,-3.84,-4.41,-6.67,-1.88,1.14,1.59,2.54,1.38,3.14,1.11,-0.36,-0.17,0.06,0.19,0.33,0.7,0.45,-0.73,-2.29,-2.75,-3.03,-4.02,-5.31,-6.39,-7.7,-8.39,-8.3,-8.34,-8.33,-8.68,-10.08,-10.23,-9.15,-7.78,-7.09,-7.39,-5.06,-0.08,0.24,0.31,-1.9,-0.07,-0.11,-1.0,-0.68,-1.15,-2.06,-2.06,-1.98,-1.89,0.89,-0.15,-1.04,2.3,2.25,2.76,3.49,4.5,5.26,5.72,5.84,5.27,4.61,5.07,4.23,0.67,1.34,1.35,1.46,4.09,2.46,2.06,1.75,1.62,2.23,2.17,1.93,2.46,1.42,-1.95,-2.2,-1.8,-1.22,-1.19,-2.25,-0.78,-1.67,-1.66,1.21,1.43,2.92,3.18,3.79,4.5,5.61,5.81,3.75,2.68,3.31,2.95,1.97,1.62,1.61,1.87,1.98,1.92,2.23,1.97,2.16,2.83,1.83,0.27,-1.34,-2.89,-3.16,-2.94,-2.67,-0.97,0.16,1.07,0.93,0.2,-1.02,-1.75,-1.56,-1.09,-1.3,-1.92,-3.37,-3.27,-3.03,-3.71,-3.57,-2.44,-3.16,-4.41,-2.86,-1.13,-2.46,-0.46,-2.3,-8.74,-8.28,-8.3,-10.13,-11.4,-9.3,-5.93,-5.06,-5.61,-6.79,-6.91,-5.82,-0.88,2.42,3.41,5.14,5.85,7.09,7.19,6.92,6.72,6.23,5.85,5.26,4.23,3.2,2.37,1.68,1.16,0.89,0.76,0.8,1.8,1.6,3.18,11.81,11.36,10.81,10.13,9.36,8.2,6.7,4.9,2.99,1.2,-0.35,-1.95,-3.5,-4.08,-3.99,-3.73,-3.39,-2.88,-1.8,0.88,4.06,7.28,5.07,0.73,-2.0,-1.22,-2.56,-6.16,-5.3,-6.19,-0.92,2.09,2.0,5.78,7.88,8.32,7.58,6.53,8.52,3.95,6.06,4.9,4.05,3.41,5.16,4.1,2.87,1.7,0.16,-0.88,-0.78,-0.57,-0.9,-1.4,-1.81,-3.26,-3.19,-1.59,-1.39,-1.14,0.83,0.36,0.82,1.11,1.36,1.11,1.41,0.88,0.52,0.36,0.25,-0.18,-0.1,0.08,0.1,0.12,0.38,0.43,0.16,0.07,0.05,-0.26,-0.85,-1.35,-1.06,-1.23,-1.16,-1.01,-0.73,-0.47,-0.13,0.07,0.1,0.13,0.3,0.32,0.31,0.28,0.39,0.3,0.12,0.05,-0.04,-0.08,-0.06,-0.07,0.05,0.25,0.62,0.81,1.01,1.28,1.39,1.42,1.36,1.24,0.92,0.33,-0.21,-0.13,-0.29,-0.41,-0.2,0.12,-0.39,-0.87,-1.15,-1.06,-0.53,-0.71,-0.11,0.19,-0.18,-0.08,0.24,1.78,2.97,2.03,1.39,0.87,-0.27,-1.01,-0.92,0.23,0.32,0.05,-0.86,-1.75,3.29,6.93,6.6,6.43,7.98,7.69,5.09,6.71,4.52,4.46,3.13,3.53,4.37,4.63,5.2,4.54,2.91,2.85,2.81,1.55,3.46,0.87,-0.55,-1.66,-2.34,-2.89,-3.38,-3.31,-3.31,-3.68,-3.92,-2.31,-2.69,-3.95,-5.0,-5.87,-6.05,-3.51,-1.08,0.66,0.8,0.42,2.51,4.28,2.47,2.13,1.19,0.51,0.43,0.48,0.3,-0.15,-0.97,-1.77,-2.02,-2.67,-3.31,-4.0,-5.91,-6.92,-7.76,-8.64,-8.83,-8.58,-8.43,-9.32,-9.99,-10.16,-8.94,-8.01,-7.92,-7.88,-6.39,-2.4,-1.93,-2.97,-2.7,-2.58,-2.75,-2.66,-1.25,0.14,0.01,-0.77,-3.23,-5.87,-1.46,-0.73,0.95,2.21,2.94,3.65,4.26,4.79,5.23,5.6,5.82,5.97,6.25,6.73,6.74,7.36,6.0,0.95,2.18,1.72,1.91,0.85,0.77,0.32,1.4,0.92,1.34,0.39,0.46,0.9,-0.49,-1.47,-1.54,-1.25,-1.71,-1.51,-0.49,2.71,3.07,4.39,4.88,3.79,3.87,4.41,4.34,4.39,3.25,4.2,3.02,2.16,2.47,2.56,2.39,2.02,1.51,2.61,2.93,2.35,1.89,2.04,1.22,0.26,-1.02,-2.39,-2.23,-2.43,-2.25,-1.22,1.17,2.11,1.17,1.21,1.11,0.24,-0.98,-1.6,-2.21,-2.55,-2.99,-2.85,-2.51,-2.82,-2.93,-2.82,-2.1,-1.37,-1.44,-5.25,-3.34,-1.63,-0.02,-5.55,-9.17,-9.49,-10.53,-13.32,-10.85,-7.89,-6.22,-4.96,-2.71,-0.52,1.31,2.33,3.28,4.93,6.38,6.98,7.28,7.2,6.88,6.57,5.81,4.97,4.52,3.94,3.21,2.39,1.65,1.15,0.81,0.9,1.05,1.09,1.16,1.26,2.06,10.24,12.35,12.01,11.66,10.64,9.03,7.14,5.19,3.02,0.86,-0.57,-1.65,-2.8,-3.67,-3.78,-3.5,-3.0,-1.85,0.92,4.26,7.11,2.69,0.33,-2.57,-3.73,-4.35,-6.27,-6.59,-7.32,-7.06,1.06,3.32,10.62,11.15,12.16,6.47,3.46,7.7,6.36,2.66,3.56,3.85,3.61,5.36,4.43,3.23,1.6,-0.18,-0.91,-1.07,-0.33,-1.16,-2.73,-3.08,-3.1,-2.75,-2.92,-1.98,-1.05,0.67,1.1,-0.98,0.44,1.51,1.61,1.05,1.04,0.67,0.12,-0.42,-0.89,-0.84,-0.62,-0.45,-0.51,-0.69,-0.3,0.28,0.84,0.52,0.26,0.75,1.13,0.69,0.4,-0.33,-0.6,-0.81,-0.85,-0.75,-0.62,-0.62,-0.34,0.09,-0.03,0.22,0.18,0.2,0.18,0.11,0.14,0.32,0.35,0.43,0.56,0.59,0.58,0.57,0.71,0.87,1.16,1.18,0.87,0.94,0.7,0.29,-0.2,-0.48,-0.57,-0.4,-0.07,-0.35,-0.23,-0.64,-0.48,-0.47,-1.24,-1.82,-1.6,-1.67,-1.23,-0.79,-0.4,0.55,2.77,1.83,1.02,0.43,-0.15,-0.6,-2.58,-1.36,-1.52,-1.82,1.38,0.32,2.26,2.51,4.67,6.07,4.94,6.3,4.83,4.48,4.62,4.21,2.96,1.85,1.14,2.16,3.5,4.03,4.64,3.63,2.7,1.76,-0.38,-1.19,-1.27,-2.18,-3.28,-3.97,-4.11,-4.85,-4.6,-5.56,-5.93,-5.23,-5.53,-6.55,-7.38,-8.4,-7.52,-1.42,-1.04,-0.17,2.22,-2.02,1.91,2.38,4.09,2.88,2.51,2.21,1.56,0.94,0.51,0.13,-0.27,-1.18,-2.41,-2.74,-3.4,-4.1,-3.5,-5.39,-7.28,-7.97,-8.25,-8.43,-8.41,-8.48,-9.7,-10.52,-10.19,-9.22,-8.59,-9.01,-9.28,-8.57,-5.25,-4.74,-4.88,-4.34,-3.92,-3.59,-1.52,0.56,-0.2,-0.41,-2.73,-3.44,-3.4,-5.33,-2.94,-0.94,1.11,2.78,3.92,4.6,5.16,5.72,6.22,6.76,7.37,7.75,8.02,8.31,8.56,8.62,7.02,1.36,2.82,0.09,2.15,1.6,0.96,0.4,1.3,0.85,0.53,0.09,0.0,0.18,0.14,-0.03,1.1,1.26,0.9,2.54,2.1,3.1,1.88,3.13,2.82,3.06,3.46,2.88,3.7,4.27,4.23,3.47,2.65,3.17,3.72,2.35,1.79,1.23,2.51,2.37,2.35,1.93,0.54,0.43,0.46,-0.36,-1.57,-1.71,-1.86,-2.44,-1.95,-0.56,1.48,1.25,1.02,0.43,-0.29,-1.17,-1.65,-1.43,-1.28,-2.15,-3.03,-2.87,-2.78,-2.84,-2.96,-2.44,-2.32,-2.95,-3.89,-3.06,-3.39,-2.15,-2.5,-8.95,-11.61,-12.28,-12.98,-10.81,-8.57,-6.24,-3.29,-2.65,-0.97,1.48,2.87,4.01,5.29,6.22,6.69,6.79,6.75,6.52,6.24,5.29,4.61,4.61,5.02,4.57,3.69,2.74,1.97,1.47,1.02,0.95,0.72,0.47,0.59,0.48,3.89,9.99,11.31,11.04,11.12,10.37,8.83,7.0,5.09,3.01,0.94,-0.81,-2.1,-2.94,-3.58,-3.8,-3.66,-1.94,1.32,2.48,4.19,1.9,0.48,-1.46,-5.12,-5.9,-6.36,-6.62,-5.74,-5.55,-2.55,4.43,9.34,10.98,10.13,5.77,3.54,5.68,2.76,2.48,3.01,6.77,6.01,6.03,5.36,3.15,1.06,-0.63,-1.13,-1.52,-1.4,-1.16,-2.07,-2.85,-3.41,-3.41,-3.7,-3.55,-2.2,0.94,0.97,-0.07,-0.93,-0.03,-0.25,-1.02,-1.4,-1.13,-1.21,-1.2,-0.87,-0.89,-0.67,-0.6,-0.69,-0.72,-0.5,-0.02,0.0,0.27,0.89,0.96,0.99,1.81,1.78,1.12,0.5,0.24,-0.42,-0.94,-0.8,-1.03,-1.22,-1.16,-1.06,-0.85,-0.65,-0.76,-0.91,-0.73,0.06,0.16,0.31,0.38,0.33,0.36,0.56,0.5,0.31,0.44,0.92,0.56,0.48,0.87,0.42,-0.06,-0.35,-0.31,-0.09,-0.23,-0.63,-0.07,0.04,-0.73,-1.17,-1.51,-1.37,-1.29,-1.78,-1.31,-1.1,-0.64,0.23,0.33,2.09,0.9,3.04,0.64,-0.68,-1.43,-0.87,-0.59,-0.01,0.29,1.95,1.28,1.22,1.51,1.39,3.17,3.09,4.3,4.14,3.2,3.15,3.26,1.55,1.4,2.74,2.9,3.98,4.07,3.8,1.82,-1.21,-2.05,-1.9,-2.34,-3.32,-3.86,-4.57,-5.33,-6.02,-6.45,-6.79,-7.12,-7.29,-7.46,-7.65,-7.94,-8.02,-6.41,-1.37,-1.1,1.45,1.24,-3.5,2.81,2.5,1.8,2.36,1.82,2.67,2.64,1.54,0.59,0.08,-0.25,-0.71,-1.53,-2.44,-3.39,-3.94,-4.97,-4.16,-5.4,-6.5,-7.28,-8.05,-7.92,-8.26,-8.77,-9.67,-9.88,-9.63,-9.4,-9.73,-10.4,-10.32,-9.33,-7.05,-5.69,-5.45,-5.38,-4.89,-2.63,0.57,-2.13,-5.33,-5.15,-6.38,-7.03,-6.96,-6.33,-4.37,-1.5,1.31,3.25,4.42,5.33,6.29,7.14,7.78,8.12,8.4,8.88,9.36,9.63,9.63,9.27,8.42,6.5,5.19,1.0,0.32,0.76,0.64,1.5,0.44,-0.11,-0.33,0.01,0.47,0.89,1.51,1.89,1.86,1.38,0.63,0.66,2.23,1.55,2.81,2.99,3.21,2.73,3.16,3.06,3.51,3.72,3.46,3.39,3.22,3.09,2.82,2.3,1.65,0.4,1.67,1.79,2.23,1.24,0.72,0.77,-0.3,-1.04,-0.9,-0.97,-1.64,-2.47,-2.68,-2.76,-0.67,-0.01,-0.35,-0.88,-1.34,-1.79,-2.1,-0.82,-0.79,-1.68,-2.39,-3.04,-2.98,-2.45,-2.75,-2.12,-1.65,-3.21,-3.57,-3.33,-2.89,-2.58,-0.15,-6.05,-13.09,-12.91,-13.14,-8.98,-7.01,-6.67,-6.38,-4.0,-1.62,0.94,3.16,4.91,6.14,7.1,7.82,7.93,7.8,7.17,6.3,4.67,3.81,4.98,5.41,5.07,4.45,3.81,3.06,2.37,1.5,0.79,0.09,-0.46,-0.25,0.21,2.21,6.34,9.61,9.37,8.53,9.04,9.36,8.13,6.19,4.11,2.06,0.44,-0.85,-1.84,-2.61,-3.02,-3.22,-1.98,0.55,1.18,1.2,-0.48,0.08,0.81,-1.9,-5.02,-4.41,-5.31,-5.47,-3.5,-0.88,1.64,4.25,6.47,7.5,5.68,4.96,3.76,3.48,6.82,7.55,5.47,7.62,4.82,3.96,3.63,1.08,-0.17,-0.92,-1.49,-2.0,-1.41,-1.35,-1.84,-2.58,-2.96,-3.53,-3.96,-3.05,0.98,0.2,-0.6,-1.76,-1.87,-2.0,-1.44,-1.25,-1.18,-1.11,-0.82,-0.65,-0.76,-0.63,-0.46,-1.08,-2.25,-0.91,-0.73,1.23,2.25,2.58,1.83,2.66,3.25,2.32,2.48,3.39,1.32,0.34,-0.46,-0.98,-0.57,-1.36,-2.0,-2.35,-2.28,-1.35,-1.16,-1.42,-1.58,-0.92,-0.51,-0.4,-0.25,0.64,-0.34,-0.47,-0.48,-0.23,0.2,0.18,-0.01,0.3,0.61,1.09,-0.26,-1.0,-0.49,-0.7,-0.66,-0.08,-0.57,-1.7,-2.29,-1.82,-2.54,-2.42,-2.74,-3.1,-2.78,-2.04,-1.44,-1.0,-1.6,-1.08,3.11,0.42,-0.24,-1.06,-1.29,0.08,1.11,1.22,0.32,-0.87,0.71,4.32,4.82,5.04,3.9,2.49,2.05,1.39,1.86,2.06,2.41,2.47,2.08,1.64,0.51,1.19,1.3,0.95,-2.36,-2.76,-3.81,-3.63,-3.55,-3.73,-4.49,-5.76,-6.49,-7.02,-7.48,-7.76,-7.87,-7.92,-8.01,-7.91,-7.57,-7.24,-5.0,-1.2,-0.33,1.13,0.78,2.98,-0.18,-0.08,2.02,3.31,4.04,2.35,2.79,1.65,0.07,-0.58,-1.09,-1.44,-1.2,-2.21,-3.74,-3.76,-4.9,-5.37,-5.58,-6.42,-7.02,-7.57,-7.67,-8.09,-8.56,-9.31,-9.48,-9.52,-9.67,-10.34,-11.08,-11.19,-9.59,-8.35,-6.54,-4.77,-3.5,-2.21,-4.71,-5.7,-7.19,-9.25,-10.17,-10.24,-8.65,-7.19,-4.66,-0.65,2.85,5.19,6.25,7.04,8.17,9.17,9.78,10.77,11.55,11.78,11.09,10.64,10.52,10.6,10.4,9.79,8.67,7.96,1.03,1.51,0.82,0.65,0.22,1.2,-0.01,-0.28,-0.68,-0.78,-0.06,0.98,1.22,0.47,0.49,-0.11,-0.51,0.84,0.75,2.47,2.48,2.64,2.65,3.01,3.11,2.96,3.93,3.74,4.06,2.75,3.15,3.01,2.59,1.58,0.68,2.08,2.85,1.87,1.38,0.7,0.18,-0.44,-0.94,-0.25,-0.6,-1.42,-2.14,-1.86,-1.7,-1.8,-1.72,-1.67,-1.75,-1.96,-1.81,0.89,1.6,0.7,-1.09,-1.69,-2.72,-2.96,-2.55,-2.72,-3.13,-3.48,-3.33,-3.39,-3.77,-3.21,-4.22,-4.53,-6.02,-8.89,-12.08,-13.16,-6.25,-6.87,-8.04,-6.93,-5.23,-2.02,1.38,4.79,7.51,9.36,10.08,10.26,9.61,8.72,7.54,6.15,4.7,4.84,5.41,5.3,5.0,4.63,4.1,3.18,2.1,0.99,0.13,-0.43,-0.79,-1.24,-0.36,1.95,5.12,7.79,8.92,8.21,6.62,7.07,8.53,7.92,5.7,3.46,1.19,-0.84,-2.0,-2.66,-3.02,-3.18,-2.67,0.64,2.34,0.96,-1.41,-1.92,0.7,0.9,-1.69,-0.46,-3.22,-4.5,-4.59,-2.47,0.57,2.96,4.7,5.64,3.89,2.02,2.9,3.62,4.55,5.91,4.21,4.83,4.52,1.91,1.22,0.39,-0.33,-0.91,-2.04,-2.15,-1.69,-1.32,-0.79,-0.9,-1.53,-2.68,-3.3,-2.49,-0.31,-0.74,-2.19,-3.02,-3.16,-2.78,-1.46,-0.09,-0.1,-1.56,-1.52,-1.28,0.16,-0.32,-1.05,-2.03,-2.53,-2.3,-1.23,-0.25,0.85,2.44,3.51,4.83,4.46,4.05,3.64,3.37,2.25,1.47,0.84,0.07,-0.61,-1.48,-1.95,-2.67,-3.14,-3.09,-2.21,-2.47,-2.71,-2.49,-1.99,-1.9,-1.48,-1.53,-1.96,-2.09,-1.92,-1.45,-1.05,-0.77,-0.37,-0.32,-0.78,-0.41,0.71,-0.97,-1.95,-2.23,-1.5,-0.38,0.52,0.6,-0.78,-3.5,-3.64,-4.39,-4.15,-3.26,-2.23,-1.86,-2.16,-2.12,-1.65,-1.3,0.28,-0.55,-1.82,-1.7,-1.71,0.54,1.11,0.15,-1.16,2.35,2.9,3.28,0.76,-0.15,2.07,2.43,3.37,4.88,3.16,2.7,2.91,1.59,0.12,0.42,-2.71,-2.62,1.92,-0.09,-3.08,-4.02,-3.26,-3.45,-6.0,-4.73,-4.7,-7.17,-7.63,-7.73,-7.91,-8.24,-8.28,-8.09,-7.54,-6.37,-5.1,-4.65,-4.27,-2.32,-0.32,-1.23,-0.01,-1.94,-1.26,-1.08,1.3,2.43,2.71,2.86,2.9,2.53,1.89,0.07,-1.46,-2.27,-1.83,-2.5,-3.24,-3.72,-4.32,-5.21,-6.6,-6.98,-6.79,-6.41,-6.47,-7.78,-9.21,-10.04,-10.11,-10.13,-10.4,-11.26,-11.82,-10.96,-7.0,-5.6,-8.3,-5.52,-4.27,-5.62,-6.65,-8.51,-9.69,-11.65,-12.47,-11.8,-10.68,-3.18,4.7,8.43,9.54,9.85,10.37,10.54,10.42,10.97,12.38,13.31,14.0,14.13,13.93,13.59,13.04,12.47,11.83,11.04,10.04,8.93,3.13,2.48,5.5,0.71,1.04,0.61,0.62,0.46,-0.38,0.34,-0.14,-0.1,0.04,0.89,0.49,-0.96,-1.23,-2.04,1.25,3.77,3.65,3.28,3.41,4.11,3.45,2.63,2.74,2.97,2.68,2.16,2.13,2.08,2.23,2.46,1.61,1.08,2.23,1.6,1.15,0.44,-0.18,-0.34,-0.43,-0.69,-0.87,-1.49,-1.78,-1.82,-1.86,-2.2,-1.98,-2.74,-2.08,0.18,0.72,0.75,0.17,-0.31,-0.98,-1.59,-1.59,-2.6,-2.76,-3.07,-2.8,-2.89,-3.35,-3.33,-4.54,-6.87,-4.62,-5.26,-5.84,-7.6,-4.98,-6.65,-8.48,-10.21,-11.61,-11.02,-6.85,0.57,6.53,10.3,12.27,12.88,12.19,11.02,9.62,8.94,8.24,7.35,6.42,4.9,4.42,3.89,3.84,4.57,4.96,3.38,1.78,0.76,0.47,-0.35,-1.35,-1.03,-0.07,2.93,7.29,8.0,8.43,7.79,6.57,5.87,6.72,8.45,7.01,4.26,1.81,0.08,-1.23,-1.91,-1.87,-2.04,0.93,1.79,1.32,-0.4,-3.36,-5.12,-3.94,0.37,-0.12,-0.98,-2.63,-3.24,-3.24,-2.87,-0.9,1.4,3.13,3.26,1.01,0.29,1.47,2.45,3.72,2.77,2.51,3.35,3.86,2.17,1.42,-0.02,-0.98,-1.1,-1.09,-1.31,-1.17,-1.13,-1.33,-1.35,-1.73,-2.38,-2.42,-2.26,-2.39,-2.7,-2.69,-3.83,-3.92,-3.88,-3.08,-1.03,0.24,0.01,0.47,0.12,-0.51,-0.87,-1.66,-2.52,-2.86,-2.76,-1.34,0.18,1.47,3.04,3.51,3.37,3.24,3.41,4.6,4.56,3.51,2.16,1.5,1.19,0.08,-0.59,-1.58,-2.19,-3.27,-3.84,-3.93,-3.91,-4.29,-3.76,-3.89,-3.82,-2.99,-2.64,-2.77,-2.36,-2.37,-2.13,-1.63,-0.58,-0.56,-0.53,0.57,0.63,0.25,-0.31,-0.55,-0.68,-2.27,-2.71,-3.85,-3.47,-2.99,0.0,0.04,-1.68,-2.53,-2.45,-2.15,-2.89,-2.31,-3.44,2.96,2.25,-2.74,-3.15,-2.9,-1.79,-0.64,-0.63,-1.81,-0.61,3.43,3.46,3.85,4.2,4.71,3.9,3.36,3.18,2.97,3.76,3.55,2.37,1.43,0.34,-0.09,-0.91,1.06,0.56,-0.03,-2.37,-3.25,-3.97,-3.49,-3.93,-5.23,-5.38,-5.29,-8.53,-9.42,-9.22,-9.25,-9.08,-8.83,-8.68,-8.39,-7.58,-6.86,-6.58,-5.84,-3.47,-1.26,-0.47,-6.51,-3.28,-0.36,1.04,1.62,2.06,2.51,3.1,3.52,3.7,3.37,2.77,1.2,-1.26,-1.95,-3.59,-3.64,-3.71,-4.69,-5.15,-6.32,-6.75,-6.37,-5.66,-6.26,-8.57,-9.68,-10.1,-10.32,-9.97,-9.9,-9.82,-10.33,-6.59,-9.19,-3.67,-7.45,-7.17,-7.06,-6.75,-8.15,-8.25,-10.69,-12.79,-13.29,-14.16,-4.27,5.94,9.55,9.77,10.41,10.57,10.51,10.61,9.3,10.44,11.62,12.79,13.67,14.01,14.52,14.92,14.83,14.45,13.76,12.55,10.89,9.2,7.34,1.73,4.84,2.28,-0.26,-0.14,0.14,-0.28,0.14,0.14,-0.31,-1.76,-1.53,-1.37,-0.84,-1.35,-0.99,-1.92,1.81,4.17,3.92,3.42,3.0,3.59,2.58,1.97,2.42,2.88,2.76,2.44,2.34,1.29,2.73,2.27,1.77,1.3,1.14,0.54,0.2,-0.16,-0.81,-0.9,-0.33,-0.4,-1.21,-1.75,-1.88,-2.31,-2.13,-2.13,-1.33,-1.88,-1.84,0.09,0.66,-0.22,-0.97,-0.02,-0.95,-1.34,-1.43,-2.81,-3.02,-2.71,-3.24,-3.1,-3.23,-3.4,-4.05,-4.28,-3.2,-4.5,-5.73,-7.84,-7.0,-5.72,-6.64,-8.46,-14.3,-10.83,-3.74,5.96,11.02,14.62,15.49,14.63,13.22,12.0,10.59,10.47,10.15,8.12,5.5,3.98,3.87,4.63,3.81,2.83,3.47,4.3,4.46,3.42,1.39,0.14,-0.78,-1.68,1.52,8.51,9.01,8.8,8.04,6.86,5.64,5.09,5.46,7.41,7.57,5.5,2.79,0.59,-0.9,0.09,0.45,-0.36,0.09,1.51,0.32,-1.46,-4.63,-0.76,0.05,-0.26,-0.12,-1.93,-2.54,-5.03,-4.91,-3.74,-0.21,2.74,1.65,0.17,0.23,0.79,1.25,2.55,3.04,2.29,1.8,2.52,2.61,1.81,0.7,-0.18,-0.79,-1.19,-2.21,-2.75,-3.07,-1.55,-1.03,-0.63,-0.8,-1.33,-1.99,-3.1,-3.66,-2.67,-2.8,-3.24,-3.35,-5.59,-4.82,-1.86,-0.37,0.1,0.06,0.74,-0.01,-0.97,-2.06,-3.05,-2.73,-2.49,-2.01,-0.47,1.57,2.84,4.96,4.43,3.18,2.94,3.98,4.99,4.42,2.8,1.09,0.0,-0.18,-0.77,-1.09,-1.3,-1.76,-2.11,-2.68,-3.43,-4.4,-4.97,-4.99,-4.91,-4.56,-3.9,-3.56,-3.84,-3.74,-2.6,-0.55,0.4,0.03,0.13,0.17,0.79,-1.03,-1.99,-3.46,-3.13,-4.15,-6.96,-4.72,-4.37,-2.3,-2.3,-2.99,-2.89,-1.96,0.91,-1.13,0.04,1.23,4.81,-3.15,-4.26,-4.55,-3.29,-2.78,-2.33,-2.16,-3.08,-0.63,-2.08,0.54,3.27,4.76,5.02,4.75,4.21,3.38,3.13,2.96,2.82,2.84,1.66,0.92,0.55,1.59,2.78,0.88,0.95,-1.14,-3.48,-3.62,-3.73,-3.98,-4.76,-5.14,-4.82,-6.19,-9.9,-11.03,-10.92,-10.55,-10.44,-10.15,-9.92,-9.94,-8.93,-7.41,-6.17,-5.99,-5.46,-1.33,-2.79,-4.19,-1.29,0.78,2.25,2.99,3.71,4.18,4.39,4.56,4.75,4.83,4.52,3.66,2.84,2.14,-0.71,-3.7,-4.96,-4.88,-5.57,-6.66,-6.02,-5.5,-3.91,-5.47,-6.19,-8.03,-6.36,-10.02,-7.29,-8.86,-9.05,-9.85,-7.38,-6.79,-4.31,-4.87,-6.11,-7.79,-7.16,-7.56,-8.6,-11.58,-13.7,-14.36,-10.72,3.41,7.54,8.5,10.22,11.79,11.79,10.89,9.69,8.66,10.09,11.18,11.13,11.69,12.61,13.78,14.73,15.06,15.23,14.79,13.09,11.34,9.57,7.81,5.71,2.82,0.98,-2.82,-0.77,-1.0,-0.97,-1.68,-1.73,-2.65,-1.94,-1.86,-1.06,-1.78,-0.99,-0.54,-1.21,1.96,3.55,3.23,3.05,3.41,2.02,3.34,3.47,2.85,3.32,3.25,2.77,1.61,0.78,1.88,1.11,-0.33,0.25,0.25,-0.19,-0.36,-0.46,0.09,-0.29,-0.78,-0.53,-0.99,-1.74,-1.76,-1.98,-2.08,-2.24,-0.79,-0.76,-0.79,-0.56,0.34,-0.14,-1.16,-0.16,-0.79,-1.45,-1.7,-2.04,-2.99,-2.21,-1.72,-1.33,-2.2,-3.2,-3.74,-4.3,-4.95,-5.03,-5.98,-6.64,-6.51,-6.16,-5.27,-6.9,-12.22,-11.2,-0.85,8.97,11.42,16.62,16.1,14.52,12.92,12.08,11.83,12.35,10.88,8.38,6.54,5.73,5.27,4.9,4.48,4.84,4.8,4.07,2.82,2.37,2.05,0.83,-1.58,1.76,8.77,9.29,9.05,8.3,7.19,5.89,4.35,3.19,4.24,5.2,6.96,6.33,4.14,1.87,0.25,0.55,-0.17,-0.45,0.49,-0.89,-1.88,-4.25,-2.29,-1.29,-0.49,-0.49,-1.63,-3.11,-5.09,-5.7,-2.75,-0.18,1.79,0.55,-2.57,0.48,1.14,0.41,0.92,2.32,3.41,3.73,2.1,2.18,2.43,0.83,0.3,-0.78,-1.22,-2.27,-2.63,-2.33,-1.4,1.35,0.55,-0.02,-0.41,-0.66,-1.46,-2.61,-3.43,-3.21,-2.98,-3.13,-3.48,-4.67,-4.65,-3.8,-0.33,2.5,2.35,0.79,-0.38,-1.82,-2.32,-3.23,-3.02,-2.6,-1.34,1.8,3.65,4.99,5.18,4.17,3.58,3.34,4.84,5.48,5.19,3.77,2.03,0.82,0.42,-0.39,-1.12,-1.14,-1.04,-1.34,-1.52,-2.32,-3.71,-4.39,-5.18,-5.61,-5.58,-4.99,-4.61,-4.47,-3.96,-3.0,-1.5,-1.04,-1.69,-1.52,-0.6,-3.04,-2.37,-3.12,-5.07,-6.51,-7.86,-7.14,-3.73,-0.95,-3.07,-5.1,-2.25,-1.28,-1.87,-0.82,-0.88,-2.41,-2.05,-3.86,-5.11,-4.99,-3.76,-2.92,-2.91,-3.37,-4.35,-3.88,-4.81,9.64,10.49,6.93,4.58,4.55,3.97,3.31,3.28,4.17,4.01,3.15,1.93,3.21,1.12,1.41,1.1,0.67,0.17,0.36,-2.1,-3.3,-4.45,-2.88,-3.87,-4.1,-9.94,-8.33,-5.28,-12.24,-13.41,-12.76,-12.22,-11.94,-11.57,-10.73,-9.06,-6.96,-5.57,-4.18,-1.92,-0.24,-4.0,-2.67,-0.79,0.22,1.29,2.71,4.12,5.56,6.53,6.88,6.76,6.52,6.23,5.83,5.59,5.48,4.72,2.72,-0.36,-3.13,-4.85,-6.35,-6.97,-6.14,-6.34,-5.2,-6.29,-6.07,-9.26,-8.21,-7.45,-7.32,-6.06,-6.56,-7.29,-6.95,-5.27,-4.5,-5.08,-6.37,-8.57,-7.41,-7.8,-9.85,-12.69,-13.78,-14.57,0.13,4.82,7.28,9.18,11.48,12.91,12.93,11.53,10.58,11.5,11.21,11.11,11.27,12.46,13.19,13.67,15.82,17.38,16.79,15.47,13.98,12.09,9.92,7.94,5.86,3.48,-0.24,-3.16,-5.69,-0.56,-0.78,-1.87,-2.23,-2.17,-2.19,-2.27,-0.86,-0.76,-0.14,1.0,1.05,1.39,2.94,2.12,1.5,3.17,1.5,2.25,3.36,3.07,2.33,3.18,2.97,2.58,2.08,0.87,0.45,-0.83,-1.28,-0.9,-0.7,-1.0,-0.94,-0.39,-0.56,-1.1,-0.79,-0.7,-1.42,-1.62,-2.12,-2.63,-1.27,-0.44,-0.66,-0.32,-0.43,0.68,0.16,-1.69,-0.79,-1.1,-1.9,-1.55,-1.92,-2.32,-2.0,-1.95,-2.6,-1.82,-2.65,-4.14,-5.53,-6.02,-3.51,-4.31,-3.58,-4.05,-5.85,-4.22,-2.9,-4.15,-2.59,1.15,7.64,13.55,15.63,14.95,12.85,11.98,11.67,12.44,12.2,10.94,9.0,6.66,5.44,5.18,5.05,4.62,3.53,2.4,2.47,4.28,3.22,0.84,-1.34,1.65,8.3,9.5,9.56,8.77,7.61,6.47,5.03,3.92,4.06,3.4,2.98,4.67,7.03,5.42,2.77,0.97,-0.15,-1.13,-2.68,-2.97,-3.65,-4.64,-4.63,-4.02,-1.57,-1.83,-2.11,-2.94,-7.97,-5.62,-2.34,-1.78,-2.15,-2.99,-1.52,0.87,0.96,0.35,-0.75,0.81,0.87,-0.98,1.01,0.84,0.94,-0.42,-0.92,-0.03,-0.58,-1.31,-1.61,-1.56,0.52,0.99,3.39,1.85,0.96,0.24,-0.65,-1.27,-2.11,-2.35,-3.23,-3.79,-3.94,-3.89,-3.91,-3.73,-2.96,-1.45,-0.69,2.58,1.87,-0.49,-2.39,-2.44,-2.71,-2.65,-2.13,-0.77,2.39,4.4,4.19,5.24,5.34,6.52,5.45,4.38,3.94,4.08,3.32,1.95,1.03,0.99,0.29,-0.5,-0.85,-1.04,-1.0,-1.2,-1.49,-1.96,-3.05,-4.21,-5.14,-6.17,-6.0,-5.48,-5.11,-4.58,-4.43,-4.6,-1.66,-1.08,-2.16,-2.74,-2.84,-3.13,-6.5,-6.33,-10.39,-1.56,-3.34,-4.77,-5.82,-3.11,-2.86,0.18,-0.76,0.02,1.53,1.4,1.2,-1.08,-3.71,-4.57,-3.53,-2.74,-2.19,-2.66,-5.24,-7.93,-10.87,5.38,10.05,12.69,8.1,4.07,4.1,3.51,2.74,3.15,4.25,3.61,2.36,2.57,1.74,2.86,2.04,1.12,0.9,-0.39,1.92,-1.5,-2.94,-4.53,-3.73,-3.47,-4.44,-13.23,-10.89,-5.11,-12.82,-14.83,-14.69,-14.62,-13.89,-13.15,-11.58,-9.83,-7.55,-5.16,-2.16,-1.38,-1.99,-0.13,1.29,3.04,4.63,5.49,5.7,5.36,5.61,6.3,7.26,8.04,7.91,7.63,7.35,7.08,6.92,6.1,4.34,2.13,-0.31,-2.61,-4.35,-6.24,-6.88,-6.5,-6.51,-6.31,-6.24,-6.23,-6.34,-5.48,-5.32,-5.02,-5.79,-6.08,-6.08,-5.07,-5.1,-5.87,-7.61,-7.89,-7.35,-8.03,-10.33,-12.8,-14.16,-9.9,1.84,5.89,8.12,10.1,12.15,14.4,14.38,13.6,12.92,12.34,11.81,11.62,12.34,13.75,13.79,13.55,14.22,15.8,15.78,15.47,13.97,12.24,10.62,8.18,5.62,2.99,-0.6,-4.41,-7.74,-2.43,-1.4,-3.98,-0.66,0.23,1.23,0.56,-1.68,0.79,-0.28,0.66,1.56,0.68,1.46,2.32,2.24,2.47,2.33,2.73,3.2,3.1,2.82,2.63,2.28,2.16,1.26,0.16,-1.5,-1.81,-2.26,-1.07,-0.55,-0.49,0.29,0.32,0.23,-0.11,-0.5,-1.46,-1.43,-1.86,-3.11,-1.88,0.1,-0.53,-0.02,0.42,0.46,0.03,-0.77,-1.3,-1.77,-0.92,-1.52,-2.06,-1.79,-1.47,-1.75,-2.7,-2.01,-3.38,-2.4,-1.36,-0.82,-1.33,-2.51,-3.79,-5.49,-5.24,-2.45,-3.05,-1.36,-0.43,2.05,8.1,10.94,13.26,13.15,11.86,10.98,10.22,10.86,11.6,11.31,10.2,8.74,6.66,5.11,4.43,3.96,3.0,3.05,4.36,4.42,2.49,0.99,-1.55,3.78,10.21,10.1,9.74,8.96,7.93,6.76,5.94,5.22,4.36,3.02,2.82,1.23,1.85,6.38,6.52,4.0,1.52,-0.42,-2.03,-3.29,-4.06,-4.44,-5.17,-5.74,-4.98,-4.55,-5.77,-6.77,-7.5,-0.82,-2.67,-3.87,-2.65,-2.68,-0.53,-0.07,2.06,1.56,0.9,1.56,1.57,1.53,0.81,0.95,2.19,-0.46,-1.16,0.56,0.26,-1.17,-2.16,-2.22,-0.3,-1.09,-1.09,2.51,2.63,1.08,0.34,-0.33,-1.76,-1.89,-2.56,-2.65,-3.05,-3.71,-3.77,-3.27,-3.12,-2.43,-2.3,-1.16,2.25,2.31,0.15,-1.16,-2.62,-3.67,-3.68,-3.47,-2.48,3.53,2.83,3.16,4.12,5.54,5.29,5.18,4.44,4.11,3.03,2.03,1.59,1.07,1.16,0.97,0.92,-0.05,-0.71,-0.57,-0.81,-1.16,-1.84,-2.89,-4.09,-4.72,-5.93,-6.18,-6.4,-6.1,-6.12,-7.54,-7.17,-8.32,-4.55,-2.78,-1.72,-2.94,-5.01,-5.58,-9.57,-9.78,-12.53,-8.16,-6.28,-6.41,-3.66,1.35,1.41,0.95,-1.75,-1.25,-0.12,-0.21,-2.11,-4.42,-3.91,-2.47,-3.49,-3.95,-5.22,-6.32,-9.45,4.78,9.41,12.34,8.72,7.25,5.84,4.64,2.63,2.19,3.47,4.32,3.58,3.37,2.37,0.37,-0.95,1.64,2.01,1.91,1.12,-0.44,-2.66,-4.03,-4.23,-2.86,-3.15,-5.4,-15.36,-8.04,-7.91,-11.57,-16.63,-17.05,-16.78,-16.26,-14.95,-12.9,-9.42,-3.2,0.33,2.9,4.9,6.4,7.14,7.57,7.32,6.94,7.42,8.19,8.61,8.81,8.41,8.38,8.46,9.12,9.08,8.76,8.65,7.84,6.3,4.9,3.45,1.14,-0.82,-2.56,-4.41,-6.08,-6.79,-7.31,-6.46,-6.3,-5.1,-5.27,-4.83,-5.25,-5.29,-6.11,-6.53,-5.77,-5.43,-6.09,-6.72,-7.22,-6.82,-7.13,-8.34,-9.49,-11.8,-14.17,-6.43,-0.12,3.69,7.15,11.36,14.37,16.12,15.78,14.07,12.8,11.96,11.53,12.03,14.04,14.18,13.43,13.26,13.55,14.58,15.54,15.53,14.33,12.18,10.31,7.96,5.24,2.17,-1.01,-4.44,-7.65,-9.67,-5.81,0.28,0.03,-0.12,-0.33,-0.98,-1.77,-1.43,1.17,0.63,0.39,-0.23,-0.05,3.14,0.99,1.66,0.36,1.62,2.28,2.38,2.73,2.2,1.96,0.39,-0.81,-1.14,-1.55,-1.79,-1.11,-0.42,-0.75,0.19,0.33,-0.76,-1.14,-1.46,-1.71,-2.01,-2.7,-2.92,-2.75,-2.29,-0.43,-0.26,0.3,0.55,0.21,-0.18,-0.79,-1.26,-1.62,-1.65,-1.71,-1.52,-1.59,-1.13,-0.92,-1.79,-3.84,-0.06,-0.83,-1.85,-6.49,-5.42,-2.68,-4.0,-4.86,-3.36,-1.45,-1.08,1.72,3.48,3.43,7.48,8.26,8.58,8.81,9.8,9.18,8.99,9.3,8.78,9.01,8.17,6.61,4.88,4.38,4.36,4.19,4.64,4.22,2.7,0.62,-0.19,-5.27,6.44,11.12,10.29,9.7,8.82,8.27,7.51,6.81,6.16,5.9,5.38,4.32,2.39,0.75,-1.01,3.47,5.8,4.95,2.09,-0.4,-2.58,-3.94,-4.73,-5.22,-5.94,-6.98,-7.45,-6.98,-7.52,-8.17,-3.01,-6.8,-1.92,-2.29,-1.93,-0.43,0.49,0.06,0.01,1.41,1.04,1.86,1.31,1.63,1.51,1.64,1.01,-0.12,2.18,1.33,0.14,-1.08,-1.78,-3.03,-0.34,0.15,1.02,1.1,1.88,-0.44,-1.86,-1.54,-1.49,-1.77,-2.2,-2.76,-2.87,-3.27,-3.89,-4.27,-4.28,-3.61,-0.79,2.29,1.75,0.05,-0.48,0.03,-2.86,-3.82,-4.48,-4.44,-3.17,1.02,3.93,4.15,6.49,6.68,4.24,3.83,4.11,3.39,2.2,1.61,0.99,1.45,1.67,2.06,1.03,0.09,-0.53,-0.37,-0.1,0.09,-0.63,-1.08,-2.23,-3.61,-4.4,-5.62,-6.31,-7.87,-6.97,-6.87,-6.59,-4.32,-2.27,1.52,0.34,-2.07,-3.12,-5.02,-5.24,-8.62,-8.45,-8.14,-7.74,-3.88,-0.6,-2.55,0.43,-2.3,-1.95,2.5,-0.75,-3.48,-4.68,-6.11,-4.04,-3.89,-5.33,-6.98,-7.42,-4.5,-1.34,4.77,9.42,11.14,9.92,8.88,7.29,5.23,2.75,1.9,3.4,3.2,3.23,2.92,1.01,-1.72,-0.69,2.34,1.19,-0.43,-0.84,-2.41,-3.86,-4.94,-3.92,-2.37,-3.05,-6.08,-14.79,-11.65,-7.81,-15.04,-17.53,-18.59,-18.66,-17.17,-15.11,-10.11,-6.48,-2.82,2.09,4.87,6.22,6.68,6.77,6.92,6.93,8.25,11.11,12.48,12.0,11.62,10.9,10.57,9.8,9.36,9.44,9.84,9.22,8.62,7.39,5.57,4.51,3.26,0.6,-1.46,-2.7,-4.24,-5.87,-7.19,-7.15,-6.24,-6.01,-6.11,-4.77,-5.2,-5.41,-6.18,-6.41,-6.24,-5.98,-5.81,-5.84,-6.31,-5.88,-6.47,-7.95,-8.71,-10.62,-12.5,-7.18,-3.67,-0.06,7.77,13.91,17.16,17.57,16.81,15.12,12.79,12.09,11.66,13.24,14.11,14.04,13.53,13.72,13.49,13.25,13.95,14.94,14.15,11.89,9.49,7.82,4.98,1.9,-1.58,-4.31,-6.74,-8.17,-7.59,-5.7,1.22,0.38,-2.42,-2.53,-1.84,-1.94,1.0,0.29,-0.04,-0.63,-0.53,0.14,-0.38,0.41,2.83,1.96,2.88,1.9,0.87,1.3,0.81,0.4,0.22,-0.2,-1.11,-1.19,-1.09,-0.34,-0.01,0.26,-0.04,-0.61,-1.01,-1.03,-2.31,-4.83,-6.34,-5.61,-3.59,-1.24,0.47,0.19,0.4,0.29,-0.57,-0.82,-1.11,-0.9,-1.04,-1.29,-1.38,0.15,-0.69,-1.57,-1.05,-1.54,-0.57,-0.24,-0.78,-1.35,-1.48,-0.63,-0.3,-0.27,-1.38,0.09,-0.35,1.7,2.33,3.17,4.13,5.0,7.35,8.18,8.53,8.65,8.77,8.55,7.4,6.57,6.3,6.02,5.01,4.51,4.16,4.01,3.61,2.98,1.43,0.1,-1.19,-4.81,9.47,10.16,10.11,8.87,8.23,7.9,7.47,6.84,6.29,6.15,5.86,4.49,2.88,1.38,-0.25,-1.81,-3.02,2.84,5.05,2.84,-0.63,-3.11,-4.94,-5.4,-6.06,-6.98,-8.01,-8.72,-2.43,-3.48,-3.68,-3.44,2.21,0.73,1.29,0.92,-0.41,-2.54,0.58,0.95,1.62,2.65,2.74,3.2,2.71,1.57,-0.21,-0.34,-0.12,1.48,0.19,-0.27,-1.15,-2.12,-1.1,-0.84,0.38,1.31,2.18,1.78,-0.51,-2.55,-3.11,-2.36,-1.94,-1.99,-2.3,-2.83,-3.77,-4.44,-4.43,-2.54,0.52,1.3,1.87,1.14,-0.9,1.1,-0.42,-4.27,-4.13,-4.47,-4.3,-3.48,4.38,2.2,4.47,1.74,-3.11,3.01,3.81,3.78,2.54,1.75,1.11,0.95,1.23,1.46,1.06,-0.25,-0.94,-1.2,-0.52,0.19,0.32,-0.75,-1.71,-2.42,-3.13,-4.17,-4.77,-5.35,-7.57,-5.83,-4.67,-5.58,-4.6,-7.12,-5.6,-10.53,-9.88,-6.31,-3.66,-3.89,-6.29,-6.12,-8.53,-7.11,-8.1,-6.85,-4.17,-1.04,2.72,5.41,2.47,1.18,-2.4,-4.81,-5.58,-5.87,-5.41,-4.43,-2.49,-1.91,-1.91,0.06,3.13,7.21,12.45,10.47,9.92,7.94,5.93,3.52,3.89,2.53,-0.46,-0.05,1.13,0.98,-1.23,-1.32,-1.31,-1.82,-1.82,-2.4,-4.15,-3.83,-4.23,-2.92,-3.01,6.06,-6.31,-13.38,-10.84,-7.86,-16.14,-17.61,-18.38,-19.05,-17.38,-13.34,-11.16,-9.17,-3.2,4.46,9.84,11.4,11.25,9.71,8.19,7.51,7.09,6.79,9.13,12.75,13.63,13.59,12.11,11.11,10.27,10.01,9.46,9.41,9.17,8.07,6.3,4.85,3.66,2.05,-0.26,-2.09,-3.14,-4.26,-6.02,-7.11,-7.01,-6.91,-7.15,-5.83,-4.76,-4.98,-4.99,-5.08,-4.77,-5.25,-5.25,-4.75,-3.98,-4.69,-5.46,-7.06,-7.79,-8.79,-9.94,-6.86,-3.78,-0.23,9.34,15.89,18.49,17.83,16.86,15.03,12.82,11.69,12.22,13.68,13.98,13.94,14.19,13.64,13.38,12.89,12.48,13.32,13.5,11.76,9.48,7.69,4.78,1.26,-1.75,-4.43,-6.4,-7.57,-7.94,-7.94,-4.55,0.0,-1.48,-3.25,-2.67,0.27,3.06,0.65,0.26,0.3,-0.38,-1.3,-0.6,2.52,3.05,3.16,2.45,2.07,0.91,-0.09,0.58,-0.5,-0.99,-1.5,-2.48,-2.67,-1.82,0.02,0.61,0.09,-0.15,-0.04,-1.55,-1.24,-1.79,-0.55,-0.13,-1.69,-2.99,-1.51,-0.17,-0.15,-0.1,-0.97,-1.02,-0.49,-0.66,-0.88,-1.51,-1.26,-0.97,-0.95,-2.48,-1.91,-1.13,-1.38,-1.43,-1.36,-1.22,-0.51,-1.46,-1.19,-0.25,2.41,1.17,2.37,2.43,2.38,2.24,2.8,2.72,3.6,7.03,8.22,8.7,8.86,7.79,6.94,5.48,4.44,3.4,3.26,2.69,2.34,1.69,1.11,0.31,-1.08,-1.18,-2.28,5.88,9.5,9.03,9.22,9.07,8.18,7.45,7.16,6.7,6.0,5.5,5.51,4.89,3.78,2.47,1.05,-0.44,-1.89,-2.8,-4.05,4.26,3.13,-0.87,-3.39,-5.38,-5.99,-6.66,-7.62,-8.33,-8.68,-9.08,-10.58,-8.0,-10.86,6.16,2.85,2.74,1.07,-1.1,1.63,0.54,2.46,1.29,-2.03,-0.13,-0.02,1.96,-0.7,-1.11,-0.48,0.08,-0.19,-1.28,-1.45,-1.09,-2.63,-0.29,0.37,0.18,-0.81,-0.06,1.07,0.29,-0.95,-1.21,-1.47,-0.81,-0.16,-0.04,-0.33,-2.01,-3.17,-0.89,0.05,-0.46,0.04,0.42,-0.22,-1.11,-1.74,-2.17,-3.2,-3.83,-3.44,-3.77,-2.65,0.71,-2.07,2.84,4.2,3.35,4.09,4.47,2.85,0.11,1.32,1.16,0.64,0.25,-0.14,0.25,0.06,0.08,0.24,-0.03,-0.07,-0.36,-0.77,-3.95,-3.36,-3.75,-4.26,-4.97,-4.9,-4.71,-3.31,-3.7,-3.59,-6.67,-11.59,0.69,2.22,-6.0,-7.44,-6.42,-5.41,-2.43,0.59,1.28,-8.51,-7.77,-0.94,-0.9,1.6,2.35,1.57,2.32,1.79,-0.78,-7.02,-7.31,-7.19,-6.46,-4.61,-2.02,0.3,2.52,4.15,3.52,5.49,12.26,10.5,9.1,6.85,4.29,2.37,2.13,1.06,0.19,0.07,0.58,0.86,1.23,0.06,-3.03,-2.72,-2.09,-1.21,-3.65,-3.64,-3.44,-2.88,5.04,2.61,-5.36,-12.3,-8.1,-5.38,-14.64,-15.48,-17.19,-17.7,-16.32,-13.1,-6.89,-12.01,-6.54,10.3,16.27,15.89,14.25,11.86,9.95,9.48,8.38,7.35,5.84,6.47,10.26,13.15,14.51,13.8,12.4,11.96,11.57,10.82,9.94,8.6,6.82,5.19,4.09,2.63,0.76,-1.07,-2.52,-3.38,-3.58,-4.93,-7.78,-6.78,-7.22,-6.32,-5.83,-5.48,-4.78,-5.0,-4.06,-4.26,-4.55,-3.92,-3.34,-3.61,-3.94,-5.52,-6.51,-6.53,-6.59,-4.55,-0.57,3.82,9.95,15.64,17.09,16.17,15.52,13.64,12.08,11.35,12.04,12.88,13.72,14.4,14.24,13.51,12.25,11.42,11.56,11.54,11.72,10.39,8.27,6.72,4.56,1.06,-2.0,-4.34,-6.26,-7.59,-8.36,-8.63,-4.75,-1.2,-1.38,-1.32,-1.88,4.07,1.87,-0.93,-0.16,-0.26,-1.35,-1.24,-0.74,-0.22,0.04,0.65,1.23,2.55,2.98,1.23,0.62,-0.24,-0.84,-1.22,-1.92,-2.16,0.42,0.92,-0.48,-1.1,-1.56,-2.57,-1.47,-1.43,-1.14,-0.55,-1.55,-2.47,-1.88,-2.27,-0.78,-2.28,-1.93,-2.21,-1.11,-0.14,-0.79,-1.57,-1.61,-1.73,-2.39,-1.88,-1.37,-0.58,-1.19,-1.17,-1.32,-1.46,-1.65,-0.81,-0.81,-0.42,-0.2,0.21,0.74,2.42,3.55,3.72,3.71,3.85,4.8,5.76,6.58,6.91,6.85,5.65,6.03,4.88,2.75,1.99,1.2,1.4,0.6,0.08,1.26,-0.66,-1.2,-0.12,5.2,9.01,8.64,8.22,7.74,7.93,7.58,6.81,6.53,6.62,6.04,5.27,4.25,3.84,3.52,2.94,2.42,1.39,0.03,-1.23,-2.24,-2.05,0.82,2.31,-1.37,-3.8,-5.65,-6.65,-7.19,-7.72,-8.11,-8.57,-9.97,-12.13,-16.44,-5.25,5.55,3.13,1.64,0.46,1.91,1.63,1.15,0.67,-0.66,0.25,1.55,1.04,-0.15,0.29,-0.96,-0.97,-0.47,-0.2,-0.55,-0.43,-0.93,-0.56,-0.49,0.56,-0.66,0.27,-0.81,-1.16,-0.76,-0.87,-1.13,-1.42,-2.19,-0.43,0.11,-1.09,-2.06,-2.64,-2.81,-2.36,-1.55,-0.33,0.4,0.63,0.1,-0.84,-1.39,-1.42,-2.82,-3.33,-3.09,-1.3,-2.13,-2.85,-0.7,-1.73,2.27,3.15,2.34,0.91,1.61,0.36,1.17,-0.07,-1.28,-1.75,-1.3,0.46,0.62,0.07,-0.4,-0.38,-1.2,-2.84,-2.63,-3.25,-4.39,-5.68,-7.29,-2.57,-1.88,-1.11,-1.89,-6.98,7.15,-3.29,-5.47,-1.33,1.95,-6.12,-5.87,-4.48,-5.61,-5.24,-5.37,-2.95,-7.77,-1.72,1.33,0.44,-0.27,-2.42,-3.05,-1.06,-0.47,-0.44,-1.83,-3.44,-3.2,-1.55,-0.4,-4.07,-5.13,-4.66,-2.32,3.34,8.26,9.85,8.67,6.82,4.06,1.2,-1.1,-0.75,-0.56,0.84,2.21,0.34,-1.01,1.8,0.74,-1.7,1.75,-0.01,-2.3,-2.21,-2.07,7.5,4.38,0.15,-5.81,-9.98,-2.7,-8.17,-8.72,-13.77,-14.79,-15.0,-9.69,-9.88,-9.67,-9.49,-2.96,13.96,19.1,18.47,14.93,12.41,10.1,10.53,9.01,7.57,6.62,4.99,5.02,9.99,13.89,16.01,16.93,15.37,13.05,11.55,10.54,8.99,7.67,7.22,5.41,3.0,1.23,-0.58,-1.96,-3.11,-3.87,-4.07,-4.87,-6.05,-7.01,-7.16,-6.79,-5.84,-5.12,-5.15,-3.57,-3.74,-4.13,-3.07,-2.9,-3.07,-3.37,-3.7,-4.49,-4.3,-4.14,-2.48,1.19,5.56,9.77,14.57,13.08,13.9,13.49,11.73,11.1,10.69,11.24,13.12,14.07,14.58,12.82,11.77,11.35,10.91,10.61,10.85,10.6,8.91,6.75,4.87,3.04,0.37,-2.31,-4.5,-6.47,-8.29,-9.06,-9.03,-5.1,-0.89,-0.76,1.06,0.57,-0.23,-2.14,-1.79,-1.66,-1.32,-1.81,-1.76,-1.39,-0.8,-0.21,-2.69,1.99,1.88,2.16,1.5,-0.05,-0.33,-1.33,-2.06,-2.0,-2.21,-1.4,-1.45,-1.64,-2.09,-2.54,-0.77,-0.56,-0.63,-0.83,-1.13,-1.44,-4.48,-0.63,1.27,0.29,-2.38,-5.6,-3.13,-1.18,-1.46,-2.04,-2.41,-2.18,-0.93,0.91,-0.24,-0.65,-1.28,-2.04,-1.44,-0.66,-1.84,-1.75,0.07,-0.67,-1.45,-1.25,0.99,3.6,3.59,2.95,2.58,2.37,2.21,2.28,3.0,3.23,3.07,3.14,3.24,2.34,0.65,-0.22,-0.3,0.85,1.0,0.59,-0.58,-0.55,-0.39,3.6,8.81,8.98,8.93,8.14,7.57,7.44,6.9,6.08,5.7,6.06,5.54,4.57,3.99,2.98,2.33,2.04,2.37,2.76,1.65,0.28,-0.62,-1.54,-2.57,-0.88,-0.74,-3.04,-4.57,-6.03,-6.79,-7.03,-6.99,-7.12,-7.84,-9.63,-11.91,-12.36,-3.55,4.03,2.42,-0.27,0.43,-0.36,0.54,-0.14,-0.84,-2.22,-2.66,0.16,-0.64,1.02,0.93,-1.73,0.1,-1.1,-0.31,-0.16,0.22,-0.2,-0.65,-1.06,-1.91,0.12,-0.18,-1.26,-0.15,-0.58,-0.91,-0.35,-1.41,-2.56,-2.81,-2.88,-4.17,-2.78,-2.31,-3.71,-2.59,-1.6,-1.81,-1.52,-0.3,0.57,-0.01,-0.25,-1.11,-1.6,-2.31,-2.37,-3.4,-3.84,-3.9,-2.6,-1.25,1.8,1.16,-0.48,-1.08,-1.04,1.21,-0.02,-0.71,-1.74,-2.61,-2.02,-0.26,-1.54,1.22,-1.04,-2.04,-2.39,-2.31,-3.25,-2.78,-5.21,-5.36,-5.92,-0.44,4.96,0.91,0.17,0.3,-0.32,-3.78,-3.7,-4.47,-1.77,-5.97,0.66,-1.95,-5.25,-2.14,-6.13,-8.25,-5.36,-2.64,-4.05,-2.48,0.88,1.36,0.79,-0.68,-3.2,-3.19,-2.37,-2.04,-1.16,-4.01,-4.48,-0.61,-0.19,1.04,1.15,0.21,2.19,9.53,8.16,4.22,3.82,1.2,-1.89,-3.56,-3.41,-1.6,0.98,1.03,0.13,-0.84,0.94,1.06,6.31,1.59,-2.65,-0.76,9.18,5.12,3.29,0.28,-5.83,-9.63,-4.6,-1.86,-4.82,-9.2,-12.56,-12.45,-12.22,-10.02,-7.28,-1.61,6.36,12.45,15.53,15.46,12.68,10.99,9.89,10.87,8.85,7.75,6.68,5.0,3.73,4.14,10.15,14.69,14.14,12.61,13.19,12.04,11.52,10.52,8.92,6.77,5.41,3.77,1.45,-0.31,-1.49,-2.96,-4.29,-4.43,-5.03,-5.2,-4.91,-5.27,-6.05,-6.0,-5.24,-5.11,-4.06,-3.77,-4.22,-3.47,-2.61,-2.52,-2.53,-2.48,-2.79,-3.27,-2.7,-0.3,2.21,5.47,9.5,9.31,10.18,10.86,9.99,9.67,9.62,8.8,11.5,13.85,14.17,12.18,11.34,10.93,10.31,9.52,9.8,9.83,9.61,8.21,6.22,4.25,2.11,-0.51,-3.13,-5.22,-7.24,-9.04,-10.05,-9.53,-2.94,0.01,-0.47,-1.1,-4.05,-5.2,-0.91,-1.98,-2.08,-1.47,-3.13,-5.31,-2.38,0.01,0.38,-0.3,2.1,-0.79,0.35,-1.16,-1.21,-3.46,-2.37,-1.96,-1.86,-1.75,-1.07,-0.73,-0.75,-0.15,0.32,0.33,-0.11,-0.23,0.39,-0.16,-0.66,-3.2,1.63,0.18,-0.47,-2.12,-2.74,-0.87,-1.43,-1.05,-1.47,-2.58,-1.68,-0.63,-0.43,-0.57,-1.36,-0.43,0.29,0.72,0.21,-0.68,-0.51,-0.98,-4.78,0.42,0.76,0.19,0.41,0.81,0.88,0.53,-0.31,-0.78,-0.55,-0.05,0.58,0.86,0.53,0.8,-0.31,-0.53,-0.69,-0.92,-0.34,-2.43,-1.49,-1.84,2.19,7.95,8.53,9.6,8.79,7.67,7.03,6.9,6.49,5.74,5.74,5.47,4.54,3.72,3.21,4.02,3.9,3.46,3.17,2.98,1.77,0.84,-0.29,-1.28,-2.75,-4.92,-3.76,-4.28,-4.99,-5.86,-6.42,-6.71,-6.72,-7.06,-7.16,-7.88,-9.44,-10.21,-8.86,-1.29,-0.48,-0.1,-1.58,-3.32,3.26,3.61,0.33,0.47,-0.43,0.58,-1.31,-1.23,-0.9,0.33,-1.41,-2.11,-3.04,-2.63,-1.14,-0.89,0.11,-0.64,-1.03,-1.0,-1.43,-2.14,-2.1,-0.82,-1.7,-0.9,-1.74,-2.65,-2.05,0.22,0.71,0.93,-0.84,-2.24,-1.73,-1.53,-2.21,0.87,1.78,1.81,-2.23,-2.06,-1.67,-1.19,-1.98,-2.72,-4.03,-5.37,-3.51,-3.67,-1.26,4.3,2.32,0.63,0.57,1.24,1.62,0.24,-0.91,-0.76,-1.34,-2.19,-0.88,-0.08,-3.0,-4.81,-1.49,-3.01,-2.86,-3.87,-4.15,-3.06,0.84,-3.88,-0.09,-1.03,-2.25,2.58,-1.38,-3.78,-4.32,-2.87,-0.52,-1.16,-19.65,-3.4,0.9,-10.42,-20.58,-8.33,-5.76,-5.86,-7.44,-8.61,-9.11,-6.87,-6.94,-2.53,-1.16,-1.39,-1.59,-1.68,-1.19,-1.3,-2.2,-0.62,0.73,0.87,2.01,1.81,1.18,0.16,-1.03,4.49,4.1,5.39,2.4,-1.37,-3.35,-4.04,-3.11,-1.89,0.12,-0.45,0.33,-0.79,2.03,2.82,4.78,2.74,4.15,7.16,5.11,3.83,1.35,-2.33,-4.72,-4.45,-6.69,-5.8,-4.99,-6.58,-8.55,-10.22,-8.81,-6.62,-3.4,0.49,4.6,8.18,9.95,11.4,12.3,11.45,9.37,9.0,10.11,8.15,6.53,4.4,3.29,2.45,3.41,9.89,13.83,13.82,15.35,14.89,13.21,12.17,10.0,7.67,6.31,4.44,2.89,0.59,-1.56,-3.01,-4.16,-4.92,-5.35,-5.76,-5.82,-5.54,-5.4,-5.07,-4.68,-4.41,-4.56,-4.62,-3.15,-2.55,-2.33,-2.1,-1.75,-1.37,-1.49,-1.53,-1.01,0.86,3.37,5.83,5.73,6.5,7.53,7.7,7.56,7.66,7.08,8.05,13.07,13.82,12.02,11.0,10.88,10.15,8.51,7.69,8.5,9.04,8.52,7.45,5.39,3.16,0.73,-1.65,-4.04,-6.32,-8.26,-9.92,-10.81,-9.91,-1.21,-1.22,-3.25,-2.66,-6.65,-3.5,-3.62,-3.02,-4.47,-2.06,-3.2,-0.92,-0.24,0.49,-0.01,-0.49,-0.27,-2.07,-0.06,-2.27,-2.54,-3.61,-2.32,-2.19,-2.81,-2.73,-2.38,-3.04,-2.63,-1.67,-0.73,-0.26,0.16,-0.11,0.22,0.29,-0.73,0.33,0.89,-0.69,0.45,-2.58,-2.09,-1.78,-1.37,0.38,0.98,-0.06,0.18,0.71,0.55,-0.05,1.03,1.07,1.97,1.75,1.08,0.04,-1.47,-3.74,-2.33,-1.86,-2.63,-3.11,-2.7,-1.37,0.77,-0.12,-0.96,-1.04,-0.92,-0.67,0.25,-0.18,-1.28,-1.43,-3.16,-3.97,-3.68,-3.46,-4.46,-1.36,3.65,8.93,8.41,8.09,9.49,8.3,7.58,6.74,6.34,5.99,5.57,5.57,5.05,3.9,3.41,3.25,4.18,4.66,4.15,3.36,2.31,1.4,0.53,-0.57,-1.46,-2.76,-4.4,-6.18,-5.82,-6.55,-6.71,-7.56,-8.35,-4.2,-2.11,-1.99,-4.6,-4.79,-5.65,-4.67,-3.35,-1.1,0.3,-0.06,0.65,0.73,5.28,3.85,1.61,-1.54,-3.09,-0.78,-4.57,-1.39,-1.0,0.16,0.37,-0.71,-2.09,-4.95,-3.92,-2.33,-1.69,-1.47,-1.4,-2.22,-1.25,-1.46,-2.06,-1.76,-1.13,-1.99,-2.96,-3.44,-2.22,-1.23,-0.42,-0.39,-1.62,-2.02,-1.58,-1.15,-2.13,-3.38,-1.62,-1.21,-0.39,0.64,3.05,1.46,-0.32,-3.64,-4.81,-5.21,-4.3,-2.44,2.41,2.66,1.49,1.68,2.1,1.57,0.34,-1.99,-2.56,-2.51,-2.19,-1.76,-2.6,-2.79,-2.92,-2.51,0.26,2.04,-0.1,2.93,1.51,3.62,0.42,-1.38,-4.3,-0.5,-2.46,-4.83,-5.11,-6.47,-5.04,-7.15,-0.72,-1.0,-3.71,-12.06,-4.74,-6.04,-14.25,-6.88,-5.29,-5.82,-8.2,-11.95,-9.58,-5.7,-1.69,-0.98,-1.76,-2.35,-2.44,-0.68,1.36,1.59,1.71,0.58,0.35,1.6,2.02,1.05,1.92,2.34,5.55,8.48,5.99,6.53,3.43,-2.44,-3.57,-4.01,-2.96,0.9,0.25,-0.17,0.15,-1.11,2.12,3.05,3.92,3.4,3.54,3.59,3.18,2.58,1.61,-1.05,-2.72,-6.41,-8.5,-7.0,-4.33,-6.01,-3.85,-4.2,-4.4,-3.59,-2.12,-0.25,2.31,4.53,6.63,8.22,8.89,8.92,7.05,7.22,9.54,8.6,6.7,4.12,2.65,1.4,0.17,5.93,11.36,15.49,17.41,15.72,13.67,12.64,10.94,9.88,7.89,5.42,3.29,1.11,-0.56,-2.37,-3.84,-4.57,-5.25,-5.63,-5.86,-5.8,-5.64,-5.23,-4.95,-4.74,-4.68,-4.67,-3.71,-2.96,-2.35,-1.77,-1.27,-0.9,-0.87,-0.75,-0.03,1.39,2.82,2.42,3.12,4.67,5.64,5.19,5.57,5.05,4.0,11.83,13.26,11.8,11.1,10.67,9.99,8.5,7.18,7.26,7.63,8.29,7.59,6.52,4.15,1.39,-0.85,-2.99,-5.02,-7.27,-9.22,-10.89,-12.11,-13.83,-2.6,-3.14,-1.78,-4.28,-7.08,-7.93,-7.28,-7.51,-2.93,-3.03,-2.61,-3.52,-1.66,-0.01,0.89,-3.92,-2.79,-2.35,-0.42,-2.95,-2.15,-2.85,-2.97,-3.38,-4.11,-3.55,-3.74,-3.33,-1.8,-1.53,-1.24,-1.44,-0.98,-0.4,0.29,-0.14,-1.69,-0.72,0.45,1.46,0.99,-1.01,-1.97,-0.94,-0.28,-0.67,-0.24,-0.49,0.19,0.21,1.04,0.79,0.7,0.48,1.09,0.71,0.26,-0.95,-2.52,-3.96,-4.48,-4.48,-4.78,-4.42,-2.67,-1.59,-2.69,-2.47,-2.65,-3.74,-2.28,-2.39,-3.13,-3.34,-4.49,-5.64,-4.94,-5.66,-6.86,-2.26,6.35,8.56,8.46,7.61,8.15,8.57,7.78,7.19,6.5,6.14,5.49,4.93,5.01,4.42,4.45,4.74,4.61,4.26,3.97,3.48,2.99,2.07,0.61,-0.34,-0.97,-1.86,-2.8,-4.36,-5.54,-7.03,-7.61,-8.08,-8.23,-8.87,-10.02,-9.61,-2.0,-2.95,-4.22,-3.38,-4.65,-4.9,-6.32,-7.74,-5.02,1.3,2.62,4.04,4.46,1.75,-1.34,-3.43,-3.1,0.14,-0.95,-2.93,-0.98,0.85,-1.32,-0.76,-0.74,-3.87,-6.0,-4.42,0.24,-0.33,-2.05,-1.25,-0.27,-2.16,-2.7,-1.34,-2.82,-2.53,-1.66,-1.1,-0.78,-1.53,-1.34,0.27,-0.41,0.14,-2.16,-2.23,-3.68,-0.94,0.62,1.95,1.36,-1.57,-0.55,2.43,2.63,-2.79,-5.99,-5.52,-4.93,-1.92,-1.45,-2.65,-3.09,0.54,1.62,1.44,-1.66,-2.91,-3.93,-3.44,-2.55,-3.48,-2.03,-0.24,-2.66,0.62,-1.31,2.51,-0.85,-0.03,1.77,-2.67,-3.17,-2.55,-3.35,-3.69,-0.21,-1.19,-4.22,-5.11,-4.4,-2.32,-4.48,3.88,3.32,-4.03,-6.87,-9.0,-11.48,-10.53,-6.32,-2.42,-0.01,0.56,-1.81,-3.48,-2.37,-2.69,-2.12,-2.7,-2.97,-2.5,-1.26,1.04,0.24,1.42,1.92,3.15,6.23,4.15,2.6,6.66,6.58,6.73,5.01,4.68,3.51,0.05,-0.81,-2.18,-0.05,4.54,5.66,2.6,-0.76,2.19,2.13,3.22,3.37,3.67,3.91,3.93,3.08,1.56,-0.27,-0.79,-0.62,-1.66,-6.15,-8.76,-9.4,-7.36,-6.2,-4.62,-1.8,-2.92,-2.6,-1.41,0.08,2.03,3.64,4.77,6.11,6.08,5.17,6.5,8.21,8.49,6.39,3.97,2.07,-0.3,0.19,4.73,10.81,14.96,16.51,16.49,14.16,12.23,10.45,8.84,7.84,5.66,3.29,0.85,-0.78,-2.33,-3.15,-4.32,-5.31,-5.76,-5.79,-5.63,-5.24,-5.16,-4.97,-4.93,-4.82,-4.44,-3.63,-3.07,-2.31,-1.68,-1.16,-0.82,-0.51,0.05,0.77,1.21,0.66,1.56,2.62,3.78,2.93,3.69,2.64,0.81,10.47,12.76,11.64,11.25,11.2,9.79,8.68,7.69,6.99,6.91,7.06,7.69,6.47,4.71,2.27,-0.32,-2.47,-4.34,-6.2,-8.13,-10.11,-12.11,-14.22,-16.06,-4.24,-5.2,-2.84,-5.91,-7.09,-4.95,-6.04,-5.53,-3.44,-2.36,-3.84,-1.54,-0.97,-0.63,0.74,-2.65,-3.66,0.57,-1.12,-3.0,-3.47,-2.44,-2.9,-4.74,-4.67,-4.26,-2.57,-2.83,-2.56,-2.2,-2.35,-2.06,-1.78,-0.42,-0.39,-0.99,-2.02,-1.02,-0.05,0.69,0.32,-0.79,-1.15,-1.32,-1.65,-1.19,-0.51,0.26,0.82,-0.22,-1.45,-1.57,-1.52,-1.76,-0.87,-1.16,-2.33,-4.1,-4.29,-4.31,-4.82,-5.9,-7.25,-5.23,-2.85,-3.29,-3.64,-4.21,-4.69,-3.92,-3.92,-5.51,-5.48,-7.09,-7.54,-4.62,-4.82,-6.13,3.05,7.27,8.37,7.48,7.32,7.99,7.98,7.19,6.24,5.76,5.24,4.5,4.36,4.16,4.55,4.93,5.28,4.79,4.32,3.7,2.85,1.97,1.45,1.01,0.12,-0.96,-1.63,-3.07,-4.13,-5.57,-6.63,-8.04,-8.82,-9.02,-9.08,-9.78,-11.53,-12.22,-1.47,-2.33,-3.42,-1.94,-1.03,-2.77,-1.94,-6.73,0.8,2.88,-0.22,-0.29,-2.18,-4.24,-4.51,-4.34,0.36,1.03,-0.67,-1.78,-2.22,-2.54,-0.93,0.4,-0.64,-4.29,-6.4,-8.68,-0.82,-0.48,-0.59,-4.45,-2.76,-3.5,-5.1,-1.47,-2.41,-0.83,-0.59,-0.61,-0.36,-0.04,0.95,2.17,2.35,1.87,1.91,1.23,0.69,1.67,2.02,2.44,-1.15,1.41,1.19,0.96,3.44,-0.5,-8.85,-7.39,-5.06,-3.48,-3.76,-3.31,-2.28,0.14,-1.44,-1.21,-1.78,-2.3,-1.35,-0.27,-0.74,0.89,1.72,-1.88,-3.63,-2.15,-1.28,-1.41,-2.05,-2.07,-1.7,-4.28,-6.94,-2.8,-4.15,-3.07,-2.81,-1.7,-3.82,-4.78,-4.06,-2.57,-1.84,-1.28,-1.82,-7.35,-8.75,-6.91,-2.85,-2.2,-0.59,4.44,1.68,-0.29,-3.1,-4.04,-3.08,-1.43,-1.65,-2.44,-1.56,-2.05,-2.39,1.8,2.48,1.94,1.73,0.4,2.42,1.22,1.92,2.56,3.1,3.63,4.3,4.61,3.49,-2.0,-4.19,1.8,6.59,4.77,4.42,0.59,3.11,-0.38,-0.22,2.83,4.94,4.52,4.33,4.69,4.74,3.49,1.71,0.03,-0.7,-0.71,-6.38,-9.05,-7.01,-6.78,-6.61,-6.14,-5.32,-4.47,-3.9,-3.38,-2.1,-0.35,1.55,2.95,3.77,4.45,4.97,5.28,7.17,7.62,5.11,2.75,0.36,-0.42,1.28,6.41,10.18,12.21,16.29,17.06,14.84,12.64,10.03,9.29,8.4,6.11,4.16,2.11,-0.06,-2.13,-3.86,-4.56,-4.88,-5.29,-5.39,-5.59,-5.58,-5.56,-5.59,-5.28,-5.24,-4.81,-4.07,-3.13,-1.93,-1.0,-0.48,-0.22,-0.01,0.41,0.08,-0.7,0.37,0.9,2.04,0.87,1.81,0.45,-1.57,8.77,11.97,11.68,11.32,11.42,9.78,8.43,7.66,6.91,6.75,6.27,5.48,6.9,4.6,2.7,0.36,-1.69,-3.6,-5.32,-7.06,-9.01,-10.97,-13.22,-14.66,-15.33,-4.54,-2.59,-5.33,-3.46,-5.88,-8.12,-5.93,-4.0,-2.94,-1.43,-2.31,-3.46,-0.04,-0.54,1.2,0.87,-0.76,-0.58,0.09,-1.15,-2.0,-3.07,-3.65,-4.51,-4.25,-4.14,-3.63,-1.88,-1.62,-2.13,-2.62,-1.87,-0.54,0.55,0.31,-0.93,-2.31,-1.23,-0.16,-0.32,-1.61,-2.16,-1.88,-1.07,-1.22,-0.57,0.64,0.65,-0.68,-2.06,-3.32,-3.93,-4.44,-3.95,-5.22,-6.04,-5.61,-3.97,-3.43,-3.94,-5.79,-7.85,-7.31,-1.61,-3.2,-4.78,-6.25,-6.83,-5.13,-5.25,-5.82,-6.68,-6.28,6.34,2.99,4.26,6.14,6.65,6.85,7.15,6.53,7.74,7.3,7.7,6.68,5.7,5.1,4.48,3.49,3.61,3.81,4.15,4.55,3.89,4.31,4.1,3.76,3.03,2.23,1.33,0.6,-0.16,-0.81,-1.52,-2.83,-3.88,-5.04,-6.38,-7.43,-8.82,-9.73,-9.92,-10.1,-10.38,-12.41,-9.22,-2.26,-4.16,-3.28,-0.3,-1.69,-0.08,-2.3,-2.41,2.33,1.17,-2.04,-3.6,-2.89,-2.88,-2.24,-1.59,3.45,2.03,1.26,0.69,-1.73,-2.25,0.21,1.94,0.93,-5.18,-7.67,-8.94,-4.26,-1.12,-1.63,-2.46,-6.08,-7.1,-3.63,-2.01,-1.37,1.73,2.2,2.26,0.45,-0.2,0.24,1.02,1.76,1.51,0.49,0.77,1.31,2.01,2.37,1.31,1.75,-0.71,0.81,-1.96,-0.62,1.46,-4.29,-5.3,-5.44,-5.26,-2.8,0.79,2.22,-1.28,-3.56,-2.3,-2.67,-2.12,0.52,3.55,1.79,0.47,0.55,-0.92,0.16,1.53,-0.08,0.0,1.85,2.45,2.19,4.25,-3.52,-4.24,-4.96,-4.63,-2.11,-1.36,-0.2,0.92,2.93,4.81,6.47,5.42,6.92,-1.52,-2.76,-0.67,1.06,3.58,4.37,4.22,1.47,2.13,0.7,0.83,-2.38,-0.29,-1.12,-0.5,2.7,3.65,4.92,1.65,-3.83,-4.9,-1.62,4.12,0.29,3.47,4.15,1.45,0.93,2.47,3.48,2.45,0.42,-1.52,2.92,3.11,3.73,7.47,5.79,4.71,2.67,4.29,3.49,2.32,0.33,1.5,4.09,6.55,4.47,2.95,3.25,1.66,0.02,-1.91,-1.3,-3.86,-5.52,-5.48,-6.07,-6.22,-6.16,-4.08,-2.56,-1.5,-0.44,0.13,0.95,2.12,3.2,4.3,5.6,5.14,5.76,5.79,3.7,1.53,-0.18,0.82,4.91,8.42,11.39,15.0,16.46,16.32,15.92,14.77,12.07,9.47,8.65,6.75,4.52,2.53,0.3,-1.56,-3.16,-4.53,-5.25,-5.07,-5.19,-5.56,-5.61,-5.3,-5.15,-5.17,-5.01,-4.56,-3.83,-2.98,-1.98,-1.0,-0.43,0.0,-0.18,-0.94,-1.2,-0.85,-1.06,-0.15,-0.63,0.2,-1.26,-3.27,7.55,10.86,11.17,11.42,10.86,9.91,8.49,7.51,6.86,5.86,5.28,4.02,3.18,5.33,2.22,0.71,-1.16,-2.79,-4.26,-5.93,-7.47,-9.45,-11.43,-13.17,-13.8,-14.15,-13.22,-1.32,-8.39,-1.66,-4.24,-6.57,-1.52,-2.11,-4.9,-2.89,-2.15,-2.08,0.78,-1.87,-1.36,-1.15,0.66,-0.56,1.11,-1.19,-4.26,-3.21,-4.16,-4.88,-3.41,-4.71,-3.19,-1.53,-1.88,-1.24,-0.11,2.37,2.45,1.69,0.17,-1.32,-1.31,0.17,0.08,-0.53,-0.83,-1.41,-1.76,-1.45,-0.26,0.08,0.57,-0.47,-1.96,-4.43,-6.63,-7.49,-6.72,-7.32,-7.42,-4.71,-3.9,-3.38,-4.28,-5.61,-6.41,-6.63,-2.51,-1.6,-4.1,-6.48,-6.17,-2.63,8.48,5.12,4.24,7.03,7.52,6.62,5.56,5.52,5.2,6.59,6.7,5.73,6.94,6.18,6.71,6.09,5.05,4.45,3.56,3.11,2.79,2.91,3.37,3.27,3.49,3.6,3.26,2.36,2.55,2.34,1.68,0.78,0.02,-0.46,-1.09,-1.94,-3.16,-4.2,-5.53,-7.31,-8.3,-9.41,-10.22,-10.75,-10.71,-10.8,-10.94,-2.51,-1.08,-2.26,-0.36,0.97,0.95,1.77,-0.4,-0.62,-2.63,-2.82,-3.23,-3.41,-2.25,-1.38,-0.12,1.41,2.34,3.25,1.24,-0.19,-3.01,-0.05,-0.15,0.37,-0.73,-7.21,-7.85,-9.33,-8.02,-5.73,-1.29,-3.47,-7.3,-9.73,-5.96,-2.9,-0.83,-0.07,0.52,0.29,1.87,0.59,1.06,0.81,-1.46,-0.69,-0.31,-0.96,-0.84,-0.62,0.5,1.52,1.03,-1.63,0.81,-0.49,0.46,-2.73,-3.68,-4.37,-4.21,-3.87,-2.26,1.35,-0.75,0.72,-2.5,-2.9,-3.07,-1.39,3.02,2.33,0.68,1.48,0.54,-0.38,-2.62,-0.13,0.41,1.15,1.06,1.4,2.08,-0.02,2.6,0.83,-2.72,-2.51,0.39,2.28,2.4,2.08,2.78,2.73,5.82,4.59,3.59,0.34,5.7,1.39,1.17,-0.13,-0.71,0.0,-0.62,-0.92,-0.6,-1.04,-1.43,-1.11,-4.98,2.69,3.35,-1.3,-4.69,-8.06,-7.12,-3.3,0.99,6.27,0.02,4.63,1.85,1.74,1.39,1.43,-2.26,-1.07,-1.21,-6.13,-3.43,6.0,7.43,5.28,4.95,3.75,3.29,-0.45,5.51,4.71,3.86,3.63,4.14,8.82,9.39,3.38,-0.73,-0.74,0.05,-2.05,-5.23,-4.49,-3.79,-4.35,-4.56,-6.27,-6.41,-4.98,-3.25,-1.65,-0.52,0.06,1.28,2.65,4.06,4.25,3.86,3.66,4.15,3.1,1.72,0.9,1.77,4.22,6.05,9.2,13.27,14.26,15.52,15.83,15.47,14.52,12.46,9.93,9.21,7.37,5.25,2.89,0.44,-1.45,-3.32,-4.6,-5.14,-5.23,-5.25,-5.44,-5.64,-5.59,-5.28,-4.89,-4.71,-4.48,-4.06,-3.55,-2.78,-2.11,-1.34,-1.73,-2.16,-2.05,-2.02,-2.27,-1.98,-2.04,-1.53,-3.05,-5.15,7.3,9.92,11.33,10.82,10.17,9.32,8.58,7.6,7.06,6.08,4.43,4.08,3.12,2.94,3.22,-0.11,-1.48,-2.65,-3.85,-5.0,-6.12,-7.59,-9.68,-11.37,-12.55,-13.57,-14.07,-13.83,-8.47,0.79,-1.25,-0.3,-0.32,-6.03,-5.5,-2.17,-2.32,0.5,1.07,-3.02,-2.33,-0.23,-0.89,1.75,1.08,1.09,0.07,0.02,-2.5,-3.59,-2.65,-2.41,-3.41,-3.43,-1.01,2.35,1.73,2.39,1.24,0.92,0.52,0.63,1.25,2.39,1.48,0.66,-0.47,-0.6,-0.62,-0.38,0.0,0.67,1.24,-0.98,-1.2,-3.87,-6.14,-8.61,-8.07,-6.4,-7.57,-5.15,-3.66,-3.24,-5.74,-5.21,-4.12,-1.83,-1.24,-2.68,-2.4,4.18,6.24,7.6,8.68,7.88,6.98,6.35,6.22,6.44,6.13,5.97,5.59,5.48,5.84,5.33,6.18,5.82,5.6,4.86,4.24,3.2,2.52,2.52,2.41,2.12,2.5,2.55,2.62,3.0,3.01,2.19,1.2,0.93,1.11,0.49,0.94,-0.05,-0.71,-1.32,-2.23,-2.88,-4.46,-6.05,-7.55,-8.54,-9.39,-10.46,-11.13,-11.05,-10.38,-9.59,-5.06,-1.42,-1.16,-1.48,0.19,1.06,-0.27,-1.06,-0.84,-4.42,-4.76,-3.65,-2.41,-0.94,-0.75,2.68,3.0,2.42,3.31,1.81,-1.84,-3.77,0.63,0.4,-1.06,-3.73,-5.73,-8.16,-9.81,-9.73,-7.65,-1.06,-4.74,-12.42,-8.52,-4.8,-1.31,1.43,1.7,0.62,-0.46,2.36,-0.17,-2.91,0.44,-0.32,-1.01,-0.72,1.12,2.02,1.44,0.75,1.64,0.49,1.2,0.95,2.07,0.75,-1.12,-2.2,-4.95,-0.58,-0.39,-1.37,-1.82,-2.68,-0.17,0.86,3.52,-2.93,-3.43,-0.3,0.53,0.98,1.1,0.37,-0.2,-0.23,-0.6,1.49,2.12,1.72,1.18,2.58,2.96,1.45,2.55,-1.0,-1.57,-0.58,-1.6,0.2,1.71,-0.04,-0.79,3.95,5.07,3.06,4.02,4.87,1.97,2.06,1.52,-0.72,-1.23,-1.98,-1.57,-1.71,-0.65,-0.8,-0.77,0.07,3.22,-0.92,-4.93,-5.75,-3.34,1.35,2.5,5.57,4.11,2.54,2.26,3.02,3.2,2.25,2.11,0.36,-1.32,2.59,6.48,7.68,7.52,7.83,7.6,7.42,4.82,2.11,1.31,6.03,8.38,6.98,5.71,5.51,8.49,8.68,3.82,-1.29,-1.94,-2.36,-1.5,-1.18,-1.13,-2.11,-3.74,-5.01,-5.67,-6.25,-5.82,-4.58,-3.2,-2.08,-0.82,0.22,0.57,1.2,1.82,2.03,2.75,2.14,1.3,0.62,1.5,3.69,5.49,7.63,9.21,11.72,12.33,13.09,13.77,13.86,12.51,10.11,8.25,8.53,6.94,5.18,2.82,0.65,-1.19,-2.97,-4.62,-5.25,-5.11,-5.12,-5.31,-5.6,-5.75,-5.66,-5.57,-5.4,-5.1,-4.69,-3.89,-2.94,-2.26,-2.48,-2.97,-3.07,-3.13,-3.37,-3.15,-3.23,-3.71,-4.37,-6.52,7.12,9.36,10.04,10.2,9.54,8.9,8.33,7.47,6.77,6.43,5.11,3.62,3.49,2.07,2.01,0.9,-1.83,-3.26,-4.1,-4.77,-5.67,-6.83,-7.86,-9.22,-10.59,-11.49,-12.08,-12.48,-12.68,-12.45,-4.14,2.96,-3.31,0.49,-2.12,-9.81,-5.03,-1.78,-2.19,-0.98,-0.5,0.69,0.7,0.54,-0.87,1.21,2.42,-0.97,-1.11,-5.62,-5.36,-3.64,-2.51,-2.94,-2.35,-1.5,1.64,2.29,1.09,-2.04,-3.2,-2.19,-1.04,0.43,1.62,1.12,0.07,0.03,-0.46,0.43,-0.02,-0.35,0.05,-1.46,-1.11,-2.2,-6.08,-7.32,-8.68,-8.45,-8.92,-5.0,-1.91,2.44,2.33,2.31,1.52,6.03,8.93,7.38,5.89,5.0,4.79,5.39,6.38,6.72,6.47,6.16,6.17,5.91,6.33,6.43,5.83,5.58,4.79,4.85,4.91,5.71,4.76,4.13,3.27,1.93,1.49,1.53,1.37,1.3,1.32,1.57,1.93,1.83,2.08,2.11,1.5,0.92,0.53,0.3,-0.06,-0.23,-0.7,-1.4,-1.99,-2.48,-3.44,-4.8,-6.23,-7.53,-8.56,-9.37,-10.34,-11.08,-10.98,-10.41,-9.5,-6.31,-2.96,-3.2,-0.87,0.15,-1.62,-0.87,-0.2,-4.49,-3.3,-0.27,-0.53,-0.08,1.62,2.28,0.43,0.91,0.4,2.27,0.71,-3.77,-3.82,0.29,1.0,-2.0,-3.55,-5.78,-7.78,-8.89,-9.33,-6.88,-1.74,-10.17,-11.22,-2.72,2.08,2.22,1.25,3.88,0.87,0.67,2.52,1.6,0.68,2.29,0.05,-0.4,0.67,1.05,0.31,-0.86,-0.85,0.38,1.61,-1.22,2.92,0.37,0.54,0.72,-2.24,1.86,3.56,-2.44,1.63,-3.23,-5.23,2.53,3.05,1.86,1.13,-1.86,-2.62,1.17,-1.0,-2.47,-1.82,-1.93,-2.56,1.73,-1.73,-0.02,0.8,0.36,0.8,0.83,1.61,0.58,2.24,2.36,1.09,-1.41,1.31,-0.01,4.48,4.21,2.61,3.32,1.8,0.78,0.1,0.27,1.59,0.2,-1.6,-1.2,-3.99,-6.1,-3.69,-3.23,-5.08,-4.09,-0.17,-0.28,-3.35,-2.22,3.51,2.61,5.37,4.47,3.8,4.59,2.26,1.95,5.59,5.73,5.08,4.58,3.7,4.71,6.56,6.77,7.64,7.99,7.55,6.78,6.81,4.34,1.83,2.2,9.53,8.23,7.37,7.51,3.08,0.78,2.87,0.41,1.81,2.13,6.49,4.52,2.62,1.46,-1.35,-3.71,-5.16,-5.85,-5.94,-5.48,-5.11,-4.46,-3.49,-2.73,-1.63,-0.4,0.38,1.19,1.83,1.05,0.31,-0.6,1.59,4.5,5.45,5.95,7.74,9.96,11.22,12.46,13.76,14.05,12.53,11.38,10.34,9.54,8.48,7.13,5.14,2.96,0.54,-1.15,-2.74,-4.2,-5.06,-5.3,-5.34,-5.31,-5.39,-5.55,-5.7,-5.49,-5.09,-4.87,-4.45,-3.83,-3.48,-3.69,-3.88,-4.02,-4.29,-4.63,-4.39,-4.43,-4.79,-5.46,-6.12,6.78,9.1,9.51,9.11,8.38,7.78,7.27,6.76,6.25,5.96,5.15,4.31,3.42,2.01,1.16,0.17,-1.27,-2.99,-4.12,-4.83,-5.47,-6.17,-6.98,-8.02,-9.31,-10.28,-10.83,-11.41,-12.18,-12.16,-11.66,-9.04,-1.49,1.63,-1.81,-0.07,-2.5,1.18,2.95,3.28,1.74,0.41,-1.46,-1.84,-0.18,2.52,2.19,1.24,1.26,-1.62,-4.81,-4.53,-3.5,-3.25,-3.65,-2.72,-3.25,1.79,2.67,2.91,4.77,1.58,-0.52,0.19,0.92,0.91,0.8,0.37,0.21,-0.84,0.87,-1.35,-1.55,-1.81,0.08,-0.9,-1.59,-5.38,-7.36,-7.0,-9.41,-8.27,-3.62,2.79,4.37,7.74,8.1,8.51,7.72,6.83,5.81,4.71,4.16,4.94,4.85,5.47,5.48,5.04,4.81,4.37,4.95,5.85,5.79,5.07,4.18,4.01,4.38,5.04,4.14,3.17,2.48,1.65,0.91,0.54,0.17,-0.09,0.04,0.6,1.38,1.43,1.16,1.46,1.58,1.11,0.64,0.44,0.02,-0.54,-1.3,-1.75,-2.47,-2.98,-3.38,-4.15,-5.08,-6.34,-7.3,-8.59,-9.42,-10.34,-11.04,-10.68,-9.92,-9.42,-6.05,-1.77,-3.71,-1.77,-0.31,0.0,-0.53,-2.52,-3.96,-0.73,-2.25,-1.91,-1.58,2.81,7.61,2.13,1.17,0.9,-1.06,-2.1,-2.85,-2.45,-0.77,-1.07,-1.95,-3.17,-5.28,-7.14,-8.62,-7.97,-6.06,-8.14,-11.45,-5.19,-1.34,1.34,3.36,3.52,3.43,2.88,3.56,3.81,0.61,1.74,2.35,-0.09,1.69,-0.26,-1.36,-0.19,-0.96,-1.31,-2.65,-1.59,-0.58,-0.17,1.63,2.47,-0.65,1.22,-4.21,-2.66,0.64,-1.95,-5.15,-1.71,3.04,2.55,3.56,2.08,-1.99,-1.11,-1.7,0.14,0.01,0.27,0.13,-2.76,-0.88,2.07,3.3,2.31,-1.8,-1.99,-2.05,-0.82,1.09,0.55,1.36,1.37,2.4,1.87,1.99,1.43,-0.31,-0.98,-2.01,-0.01,0.29,0.18,-1.01,-0.02,-1.12,-2.93,-0.7,-2.27,-3.14,-2.83,-4.78,-3.28,-6.31,-5.68,-4.19,-4.53,1.32,4.57,5.04,3.42,2.74,1.65,1.27,0.12,3.11,5.11,6.61,6.58,6.0,6.16,6.28,6.18,8.18,7.82,7.78,7.13,6.15,5.25,4.15,3.57,3.58,4.29,6.12,4.17,1.69,5.81,3.31,2.75,-0.46,0.04,4.56,8.21,4.75,1.33,-0.14,-0.92,-3.36,-5.13,-5.96,-5.52,-5.1,-4.12,-2.74,-1.72,-0.84,-0.4,-0.19,-0.15,0.05,-0.51,-0.5,-0.74,3.03,4.27,3.98,3.1,6.2,7.76,10.15,11.7,12.04,12.54,12.76,12.19,9.87,8.56,8.13,7.46,6.49,5.01,2.71,0.63,-0.95,-2.65,-3.98,-4.86,-5.0,-5.36,-5.53,-5.74,-6.02,-6.08,-6.07,-5.78,-5.34,-5.09,-4.93,-4.65,-4.83,-5.25,-5.58,-5.4,-5.0,-5.15,-5.66,-6.34,-3.83,6.15,9.09,8.53,8.11,7.83,7.31,6.66,6.17,5.84,5.5,4.61,3.94,3.31,2.24,0.49,-0.35,-1.05,-2.32,-3.76,-4.69,-4.86,-5.29,-6.37,-7.08,-8.0,-9.08,-10.23,-10.61,-11.14,-12.04,-12.32,-11.58,-10.06,-7.64,1.22,-0.51,2.26,3.15,0.86,2.31,5.47,3.1,0.97,3.01,1.77,2.85,1.82,1.96,1.6,0.89,0.35,-3.88,-5.66,-6.31,-3.91,-1.35,-2.64,-2.75,0.65,2.6,5.79,3.63,1.21,-0.99,1.25,2.42,2.37,1.6,0.54,-1.53,-0.94,-1.96,-0.88,-0.67,1.24,1.97,0.35,-0.81,-4.41,-6.09,-6.45,-6.63,-3.35,0.35,1.99,6.26,7.41,6.98,6.71,6.83,6.17,4.54,3.69,4.64,4.06,4.52,4.29,3.85,3.86,3.58,3.3,3.64,5.07,4.98,4.73,4.23,3.98,4.34,3.75,2.35,1.69,0.98,0.18,-0.49,-0.7,-1.25,-1.02,-0.47,0.43,0.58,0.76,0.76,0.64,0.68,0.36,0.11,0.25,0.19,0.09,-0.96,-1.98,-3.1,-3.72,-4.05,-4.46,-5.14,-6.27,-7.42,-8.78,-9.37,-10.05,-10.11,-9.55,-8.85,-8.15,-6.93,-3.73,-1.86,1.69,-0.95,-1.71,-1.53,-1.11,-0.83,-2.68,-2.89,0.55,-0.09,-1.31,0.41,1.58,2.48,0.64,-2.39,-1.64,-1.07,-0.56,0.03,-1.02,-1.85,-2.36,-3.67,-5.16,-6.65,-7.26,-6.43,-8.75,-10.04,-3.63,6.12,9.84,9.09,8.22,6.37,5.68,5.9,5.9,4.37,2.51,1.25,-0.3,0.76,-0.04,0.33,-0.04,-1.74,-1.48,-0.59,-2.76,-1.86,-0.91,0.93,2.78,3.67,0.38,1.16,-2.97,-1.62,-3.52,-4.26,0.21,2.93,9.46,6.35,2.2,-3.33,1.84,-1.2,-0.46,1.0,0.8,0.51,-1.36,0.49,1.71,-0.78,-0.4,-0.46,-0.86,0.81,-1.86,0.24,-1.13,0.46,0.84,1.27,0.62,-1.47,-3.17,-4.97,-1.27,-2.72,-2.38,-0.93,0.01,0.14,-0.9,-1.69,-2.52,-0.36,-1.47,-3.29,-4.03,-4.73,-3.03,-3.45,-7.28,-1.07,0.88,3.09,5.48,5.39,0.79,0.87,3.24,3.65,1.76,4.64,6.39,6.58,6.32,6.38,5.71,6.17,5.94,7.75,7.83,8.16,7.81,6.98,6.7,2.36,5.26,4.14,0.93,-1.05,1.94,0.49,-1.13,6.92,0.67,6.89,0.92,3.31,5.57,3.72,0.63,0.13,-1.88,-3.65,-4.8,-5.66,-5.81,-5.14,-4.44,-3.43,-2.7,-2.34,-1.86,-1.54,-1.38,-1.91,-2.05,-0.7,2.83,3.22,2.11,1.75,5.03,6.72,8.71,9.79,9.81,11.2,11.77,10.68,9.43,7.71,7.61,7.17,6.2,5.37,4.37,3.02,1.04,-0.71,-2.22,-3.61,-4.48,-4.98,-5.0,-5.32,-6.09,-6.56,-6.44,-6.17,-5.94,-5.77,-5.74,-5.54,-5.53,-5.84,-6.09,-6.0,-5.56,-5.82,-6.23,-6.28,-2.27,5.04,7.94,8.12,7.5,7.03,6.9,6.31,5.61,5.38,5.17,4.76,3.67,3.3,2.81,0.85,-1.11,-2.17,-2.48,-3.51,-4.3,-4.81,-4.69,-5.32,-5.73,-6.71,-7.7,-8.67,-9.44,-10.18,-10.4,-11.6,-11.89,-11.44,-9.79,-8.0,-8.5,0.96,1.8,-0.3,0.69,0.31,5.49,3.38,1.2,0.66,1.64,1.36,2.31,0.68,1.26,1.44,-1.71,-1.74,-5.74,-6.02,-5.19,-3.9,-0.76,-3.4,-0.66,0.85,3.49,3.31,0.01,3.32,3.72,3.91,4.23,2.44,0.22,-1.59,-1.31,1.42,3.12,3.14,2.96,2.57,1.17,-0.01,-2.85,-4.24,-5.48,-6.19,-4.28,-2.73,3.47,6.33,5.4,5.39,5.94,6.32,4.8,2.88,3.89,3.61,3.6,3.28,2.58,2.72,3.44,4.48,4.93,5.75,5.6,4.88,4.32,4.08,3.49,3.13,1.96,0.77,0.17,-0.39,-1.17,-1.23,-1.33,-1.22,-1.02,-0.79,-0.9,-1.33,-1.18,-0.9,-0.22,0.38,0.48,0.3,0.26,0.17,-0.06,-0.41,-2.02,-3.36,-3.96,-4.3,-4.62,-5.16,-6.15,-7.22,-8.58,-9.53,-9.38,-9.05,-8.15,-7.62,-6.99,-5.29,-2.92,2.73,1.29,0.02,0.71,-1.52,-3.7,-3.58,-3.52,-2.95,-2.66,1.11,-0.81,-0.5,0.42,0.89,-0.34,-0.02,1.03,-0.85,-0.23,0.88,1.52,-1.37,-3.04,-3.61,-3.83,-4.57,-4.65,-3.52,-1.66,-6.78,-3.27,3.9,8.59,9.72,8.95,7.76,6.38,5.65,4.72,2.64,1.14,-0.24,1.39,0.45,0.29,0.69,2.54,3.26,1.06,-2.09,-2.64,-3.05,-3.45,-0.1,1.93,2.89,2.84,2.19,4.39,-0.12,-2.13,-0.37,-0.77,1.58,7.91,10.15,6.1,-1.59,2.34,1.56,-0.55,-0.7,1.26,0.21,2.03,0.93,2.15,3.07,-0.99,-2.13,0.35,-0.79,-1.38,-1.54,-0.7,-0.35,-2.82,-2.67,-1.99,-2.48,-5.28,-3.28,-3.51,-1.82,-1.72,-0.75,0.15,1.12,-1.23,-2.44,-3.99,-1.68,-2.87,-1.95,-4.34,-4.96,-7.41,-5.01,-4.09,-2.04,-2.4,2.91,4.13,0.06,-1.01,2.47,1.91,2.85,2.86,5.51,5.45,4.73,4.88,5.14,4.97,4.93,4.99,4.69,8.4,7.94,7.7,7.0,5.68,5.4,5.07,4.17,1.88,0.27,4.85,2.74,4.19,2.88,1.35,1.89,-1.55,-1.5,2.64,4.54,2.06,-0.05,-1.83,-3.94,-5.49,-5.91,-5.78,-5.09,-4.37,-3.94,-3.83,-3.47,-2.07,-2.14,-4.01,-3.83,-1.75,1.57,1.13,-0.13,1.46,5.5,6.41,8.82,9.95,8.97,9.44,9.97,10.33,9.15,7.61,6.48,6.72,6.16,5.3,4.31,3.67,2.42,1.6,-0.28,-1.86,-2.89,-3.57,-3.99,-4.27,-4.89,-5.74,-6.11,-6.0,-5.7,-5.64,-5.56,-5.58,-5.79,-6.08,-6.62,-6.84,-6.67,-6.69,-6.3,-6.02,-1.75,4.82,7.43,8.38,6.82,6.39,6.44,5.99,5.36,5.24,4.92,4.4,3.45,2.36,1.95,1.57,0.12,-1.63,-2.31,-3.06,-3.05,-3.89,-4.32,-5.13,-5.0,-5.04,-5.86,-6.58,-7.07,-8.21,-9.31,-9.88,-10.2,-10.28,-9.98,-9.67,-9.11,-7.49,-2.95,0.27,0.39,0.24,2.55,3.72,6.15,3.15,0.85,-0.11,-0.88,-0.51,0.92,1.53,-0.63,-1.06,-1.23,-3.14,-3.79,-5.37,-4.8,-4.88,-4.4,-1.25,0.59,4.05,0.47,2.65,3.12,3.56,3.32,3.6,2.63,0.71,-0.62,1.82,3.64,4.33,2.12,1.16,2.15,0.64,-1.97,-3.52,-5.2,-5.54,-5.0,-4.07,1.72,5.77,4.27,4.34,4.49,4.7,4.59,3.38,3.28,2.83,2.66,1.82,0.19,0.64,2.89,5.42,6.24,5.83,5.09,4.57,3.92,3.48,3.53,2.9,1.77,0.25,-0.51,-0.82,-1.46,-1.91,-2.03,-1.99,-1.84,-2.23,-2.37,-3.0,-2.62,-2.03,-1.64,-1.25,-1.25,-1.35,-1.03,-0.47,-0.17,-0.38,-1.13,-1.82,-2.29,-3.61,-4.75,-5.49,-6.18,-6.68,-6.1,-8.03,-8.48,-8.37,-8.22,-7.79,-7.57,-6.88,-4.26,-1.28,-1.64,-0.16,-0.49,0.17,-3.08,-4.24,-3.56,-4.61,-1.07,2.29,0.6,-0.62,-0.12,1.63,0.05,1.89,4.25,3.27,0.39,3.52,4.17,-1.13,-3.47,-5.91,-5.71,-5.9,-6.57,-6.74,-6.5,-4.02,-4.66,-0.37,5.49,6.63,7.27,8.22,6.93,5.38,3.28,1.34,-0.32,-1.61,-1.04,0.49,2.14,-0.92,2.52,4.74,3.35,0.43,-1.98,-3.3,-4.04,-5.4,-3.77,-1.84,1.46,1.15,2.12,0.93,2.94,-1.89,2.49,5.46,1.56,6.4,9.76,5.5,-2.77,2.35,2.27,0.21,0.01,2.07,1.79,1.76,1.02,1.11,2.67,1.1,-0.58,-1.56,-0.35,-1.29,2.31,-2.35,-2.11,-2.86,-1.95,-3.63,-3.32,-4.97,-4.27,-2.41,0.57,5.06,5.84,3.83,2.39,3.26,1.37,-0.52,-2.15,-2.78,-2.25,-3.72,-4.34,-5.28,-3.01,-1.2,-1.26,0.89,1.85,2.74,1.46,1.13,-0.43,-2.26,1.84,5.52,6.08,5.76,4.08,1.47,2.72,4.23,3.42,3.42,4.01,7.4,7.08,6.61,5.98,4.99,5.01,4.25,3.22,1.46,2.58,8.75,4.99,3.32,1.94,-0.63,-0.76,-4.12,-4.22,-0.54,2.13,2.08,0.1,-2.71,-4.19,-5.34,-5.62,-5.27,-4.87,-4.54,-4.36,-4.57,-4.64,-4.11,-5.09,-5.06,-2.29,-0.66,-1.94,-1.65,3.39,5.48,7.03,10.21,9.1,8.06,7.52,8.14,8.79,8.72,7.63,6.52,6.67,5.61,4.77,3.91,3.35,2.36,1.96,0.95,-0.21,-1.13,-1.79,-2.42,-2.96,-3.48,-4.14,-4.82,-5.1,-5.11,-5.28,-5.55,-5.89,-6.38,-6.81,-7.06,-7.29,-7.38,-6.83,-6.3,-5.13,-0.36,5.06,6.69,7.7,6.5,5.88,5.32,5.36,5.09,5.18,4.98,4.2,3.83,2.7,1.86,1.31,1.16,0.07,-1.0,-1.79,-2.16,-2.94,-3.52,-3.65,-4.42,-4.87,-5.75,-6.9,-7.48,-8.02,-8.14,-8.69,-9.22,-9.38,-9.77,-9.38,-7.99,-7.32,-6.14,-5.31,-3.49,-2.06,-0.43,5.02,3.82,4.19,3.6,2.41,-0.43,-1.31,-3.0,-2.74,-2.22,-2.64,-0.78,-1.79,-2.17,-5.28,-6.97,-7.34,-4.09,-0.83,1.41,2.02,3.98,3.83,1.47,4.16,3.25,3.37,3.23,2.33,1.84,1.07,0.68,4.47,3.14,0.94,1.58,0.74,-0.89,-2.64,-4.3,-5.31,-5.23,-3.55,-0.41,5.67,3.36,3.31,3.9,3.87,2.84,3.22,3.89,3.1,2.14,0.99,-1.17,-0.72,1.84,6.44,7.08,6.39,5.4,4.44,3.21,2.36,3.24,2.67,1.46,0.32,-0.38,-1.05,-1.55,-2.27,-2.7,-2.7,-2.66,-3.5,-4.21,-4.8,-4.48,-3.65,-2.42,-1.39,-0.96,-0.53,-0.67,-1.11,-1.24,-0.4,-0.84,-1.55,-2.12,-2.68,-3.42,-3.99,-4.9,-5.68,-5.07,-7.76,-7.86,-8.11,-8.34,-8.49,-8.61,-8.73,-7.48,-2.67,-2.88,-0.13,-0.82,-1.94,-2.21,-5.23,-3.78,-3.82,2.04,3.25,3.1,4.95,4.17,2.57,4.08,0.63,4.99,2.45,1.88,2.81,0.78,-0.81,-3.79,-5.19,-5.56,-5.54,-6.02,-6.89,-7.71,-7.14,-6.14,-0.8,7.39,10.14,9.8,8.07,5.76,4.32,2.33,0.08,-1.05,-1.54,-2.15,-1.08,0.74,-1.13,-3.19,2.61,4.27,0.01,-1.91,-0.35,0.03,-2.18,-3.7,-4.43,-4.57,-2.07,0.08,0.72,1.84,2.82,2.38,3.64,1.87,3.2,3.21,10.62,4.86,-1.63,1.65,1.32,1.19,0.06,3.2,3.09,2.24,1.66,0.2,1.23,1.43,0.26,-1.18,-1.59,-1.44,-0.98,1.03,-3.2,-5.18,-2.09,-2.56,-3.29,-3.34,-1.95,1.68,1.1,2.58,1.89,1.41,3.87,1.65,1.36,1.04,1.07,1.59,0.16,0.2,0.43,-0.61,-2.16,-1.61,0.86,0.84,1.4,2.62,2.17,1.21,0.51,-0.36,2.67,5.8,5.51,4.8,2.98,2.58,4.24,1.5,0.71,0.45,3.76,6.28,6.65,5.73,4.9,3.76,1.64,3.55,2.31,0.22,5.8,5.23,3.8,1.8,-0.28,-1.69,-2.05,-5.28,-5.34,-2.94,-1.19,-1.34,-0.54,-1.0,-2.74,-4.05,-4.8,-5.15,-5.16,-5.37,-5.54,-5.55,-5.64,-5.87,-4.66,-2.54,-3.21,-5.11,-0.22,5.13,6.22,8.31,8.32,7.56,7.03,6.62,6.33,6.42,6.37,5.81,5.85,5.27,5.01,4.13,3.22,2.36,1.98,2.13,1.09,0.05,-0.74,-1.45,-2.07,-2.41,-2.88,-3.56,-3.97,-4.37,-4.87,-5.34,-5.75,-6.34,-6.83,-7.05,-7.19,-7.38,-7.06,-6.32,-5.41,-3.05,1.98,4.98,4.79,6.86,5.76,5.35,4.7,4.24,4.56,4.37,4.5,4.42,3.36,2.75,1.74,1.32,0.89,0.21,-0.41,-1.03,-1.95,-2.93,-3.49,-3.68,-4.33,-5.38,-5.63,-6.05,-6.69,-7.38,-7.85,-8.72,-9.66,-9.75,-9.64,-8.98,-7.88,-7.27,-7.87,-7.56,-6.56,-5.81,-5.86,-1.17,0.77,8.09,4.09,0.34,-0.28,0.04,0.94,1.38,-1.32,-0.14,-0.33,-0.05,1.12,-3.2,-3.73,-4.22,1.49,2.84,2.84,2.96,4.59,-0.84,1.42,5.99,3.29,2.68,2.73,2.2,1.63,1.2,0.69,0.6,2.41,2.04,2.09,0.69,-1.02,-1.52,-2.58,-3.65,-2.65,-1.38,0.26,5.04,2.68,2.08,4.36,4.62,4.1,4.32,3.71,2.89,2.0,0.75,-0.9,-1.8,1.14,3.75,6.17,7.83,6.11,4.49,3.11,1.87,1.55,2.89,2.13,1.15,-0.3,-1.38,-1.7,-2.46,-3.1,-3.56,-3.35,-4.15,-5.46,-5.68,-5.87,-5.16,-3.45,-2.01,-1.09,-0.67,-0.77,-0.46,1.87,3.33,0.68,-0.68,-1.51,-2.34,-3.33,-3.97,-4.21,-4.74,-4.07,-5.31,-5.58,-6.37,-7.63,-8.45,-9.18,-9.91,-11.06,-10.23,-0.81,-0.92,-1.89,-1.49,-1.95,-2.14,-3.77,2.49,2.96,0.5,1.78,3.05,4.38,3.61,4.72,4.99,4.01,0.38,-0.28,0.96,-1.32,-2.59,-4.57,-5.71,-6.4,-5.69,-6.23,-7.22,-7.11,-5.55,-3.57,-2.45,2.44,6.22,7.56,6.61,1.97,1.64,1.74,-0.73,-2.98,-1.95,-0.47,-1.26,-2.84,1.64,0.35,-3.72,-1.16,2.66,0.23,-0.24,0.22,-1.21,-2.17,-3.11,-3.05,-4.11,-4.89,-4.62,-0.35,-0.16,2.34,3.56,1.45,4.04,0.15,-1.39,10.44,8.98,0.24,0.26,1.49,-0.36,0.98,2.19,1.37,0.96,0.35,1.1,0.35,4.58,3.92,-1.63,-3.9,-2.11,0.48,3.43,0.48,2.17,-0.03,2.11,3.0,3.63,4.05,4.18,3.16,1.57,2.0,2.41,1.49,2.53,1.25,3.11,0.59,0.64,1.72,0.04,-1.05,-1.3,-1.49,-0.07,-0.64,-0.06,0.99,1.04,0.71,-0.03,1.31,1.16,2.98,5.36,5.76,2.16,1.27,2.67,2.29,1.4,1.12,0.43,0.68,6.09,5.61,4.45,3.11,1.6,0.04,4.18,2.91,3.92,4.6,3.79,2.2,0.21,-1.07,-2.04,-2.19,-4.44,-4.77,-3.72,-2.4,-2.41,-2.9,-3.16,-3.92,-3.93,-3.61,-3.91,-4.49,-4.97,-5.3,-5.5,-5.58,-4.86,-4.15,-5.59,-5.96,3.24,6.49,7.88,8.26,7.8,7.8,6.97,6.12,5.57,5.42,5.33,4.79,4.35,4.12,3.89,3.19,2.61,1.86,1.26,0.44,-0.2,-0.49,-1.03,-1.35,-1.93,-2.14,-2.44,-2.8,-3.31,-4.05,-4.89,-5.4,-5.81,-6.34,-6.69,-7.0,-7.64,-6.89,-6.07,-5.21,-3.09,-0.57,1.57,4.72,3.27,5.49,4.92,4.65,4.27,4.11,4.29,5.07,4.53,4.57,3.67,2.45,1.63,0.95,0.69,0.11,-0.41,-0.66,-1.1,-1.81,-2.72,-3.62,-4.08,-5.17,-6.04,-6.55,-6.33,-6.58,-6.76,-7.22,-8.08,-8.61,-9.14,-9.34,-8.8,-8.12,-7.88,-7.95,-7.71,-7.73,-7.58,-7.65,-7.5,0.31,3.81,4.45,0.95,-2.02,1.5,2.05,2.06,1.56,-1.15,-2.04,-2.14,-5.01,-5.2,-4.32,-2.13,0.06,1.81,1.9,4.99,3.77,6.85,6.24,5.04,2.3,5.16,5.65,4.21,2.73,1.77,-0.27,-2.0,-1.0,1.91,2.11,0.99,-0.12,0.02,-0.07,-0.27,0.26,1.8,3.74,1.82,1.03,3.55,4.29,4.42,3.81,2.96,2.48,1.76,0.85,-0.15,-1.01,0.22,2.87,3.82,5.12,6.8,5.28,3.2,2.52,1.2,2.98,3.0,1.87,0.59,-0.69,-1.6,-2.41,-3.22,-3.58,-4.35,-4.66,-5.59,-6.65,-7.39,-7.2,-5.4,-3.45,-2.01,-1.1,-0.47,-0.18,0.55,2.41,3.44,2.26,0.32,-0.84,-1.61,-2.43,-3.68,-4.79,-5.14,-4.67,-4.57,-4.94,-5.59,-7.28,-8.37,-9.36,-10.5,-11.87,-5.13,0.41,-4.47,-1.27,0.16,1.06,2.88,2.67,2.45,1.07,1.11,2.11,3.45,3.81,5.06,5.29,0.37,-1.91,-1.9,-2.12,-2.9,-3.85,-4.0,-4.32,-5.03,-3.46,-3.05,-4.66,-4.69,-6.35,-5.1,-4.01,0.0,4.86,7.12,6.36,3.95,3.44,2.58,-0.72,-3.39,-3.22,-1.25,-3.51,0.55,-2.4,-0.85,1.83,-2.43,-2.81,-0.57,-0.16,-0.28,1.62,2.92,4.06,-1.23,-1.64,-4.93,-7.53,-7.84,-3.98,-2.39,1.72,3.32,1.82,2.26,-1.21,2.97,4.15,9.72,4.76,2.04,1.83,2.03,-0.27,2.16,1.24,-1.75,2.52,3.21,2.27,5.07,3.97,0.34,-2.92,-2.89,-0.94,1.97,1.85,2.4,2.38,4.22,2.56,2.24,5.54,3.5,4.31,1.46,-0.9,3.21,0.6,-0.17,1.16,2.67,1.94,2.59,3.53,0.05,1.52,0.25,0.25,1.72,-1.13,-0.76,-0.09,-0.87,-0.43,0.41,0.66,1.64,0.97,2.71,5.73,2.3,2.09,2.89,1.79,-0.18,-0.1,0.92,1.64,5.68,4.11,2.57,0.82,-0.5,3.29,3.97,3.02,3.1,2.97,2.73,1.06,-0.35,-1.6,-2.65,-2.9,-3.82,-4.63,-4.19,-4.16,-4.37,-4.49,-4.64,-4.51,-4.35,-4.35,-4.21,-4.26,-4.73,-5.24,-5.77,-5.33,-5.6,-7.73,-4.6,6.47,7.4,7.97,7.42,7.34,7.17,6.81,6.01,4.99,4.27,4.52,4.61,3.83,2.45,2.41,2.09,1.64,1.1,-0.15,-0.99,-1.1,-1.81,-2.62,-3.01,-3.4,-3.02,-3.57,-3.86,-4.56,-5.0,-5.5,-5.88,-5.9,-5.93,-6.58,-7.56,-7.56,-5.86,-4.96,-3.47,-2.35,-0.18,1.16,3.16,3.54,4.74,4.01,3.83,3.97,3.72,3.85,4.75,4.87,4.03,3.57,2.38,1.33,0.84,0.47,0.03,-0.45,-0.64,-0.57,-0.96,-1.81,-2.79,-4.07,-4.54,-5.66,-5.97,-5.96,-5.91,-5.96,-6.39,-6.94,-7.29,-7.47,-7.74,-7.86,-7.7,-7.24,-6.87,-7.05,-7.2,-7.6,-7.85,-7.5,-7.46,-5.02,2.14,0.68,-0.08,1.8,-0.16,2.37,-0.4,-0.02,-1.3,0.34,-0.57,-1.81,-2.49,-4.51,-4.0,-0.47,3.71,5.01,5.86,7.39,6.92,7.32,7.75,5.57,6.28,4.15,3.93,2.27,1.73,0.63,-0.53,-0.75,2.05,2.07,2.99,2.4,2.36,1.81,1.33,1.56,2.04,0.59,-0.78,1.22,3.32,4.14,3.45,2.96,2.33,1.71,0.97,0.47,0.0,0.18,1.32,3.04,3.51,4.37,6.16,4.7,3.02,2.07,1.86,3.76,2.54,1.06,-0.05,-0.96,-1.95,-2.83,-3.79,-4.36,-4.83,-5.5,-6.96,-8.02,-8.52,-7.92,-6.07,-2.86,-0.38,-0.29,0.06,1.57,2.63,4.62,6.24,5.18,3.32,1.01,-1.15,-2.22,-3.16,-4.08,-4.85,-5.11,-3.75,-5.2,-6.32,-7.28,-7.8,-8.92,-9.88,-9.77,-1.43,-1.5,2.72,0.56,0.66,2.08,1.39,1.04,0.15,-0.11,0.71,1.33,1.8,0.54,-0.02,-2.67,-4.38,-6.33,-4.42,-4.32,-3.93,-2.49,-2.13,0.62,-3.05,-1.84,-1.73,-2.01,-4.08,-7.91,-1.43,-0.03,3.62,4.87,6.03,5.7,3.99,2.5,0.56,-1.89,-4.19,-3.53,-1.47,-2.83,-2.36,-4.25,-1.58,2.14,-1.25,-2.52,-0.69,-1.02,-1.18,3.49,4.86,5.53,3.28,-3.04,-5.89,-7.84,-8.16,-6.97,0.55,0.75,0.43,0.38,1.18,1.45,-0.93,5.04,5.74,2.91,1.85,-1.03,-1.34,1.42,3.37,1.07,-0.01,1.82,1.68,1.97,2.39,2.16,-0.67,-3.28,-4.34,-3.45,-0.94,-0.3,1.28,0.56,0.72,3.37,-0.91,1.17,5.78,5.69,4.4,4.89,4.12,4.95,6.1,1.76,2.32,-0.83,-1.13,0.4,3.29,2.05,1.43,2.53,3.19,2.07,-2.04,-2.53,-0.1,0.94,0.86,1.71,1.85,1.36,3.47,4.57,1.06,3.73,1.74,1.02,0.17,0.65,0.59,2.6,2.63,2.24,0.32,-0.89,3.58,3.78,3.56,2.66,2.32,1.9,1.56,0.03,-0.82,-1.55,-1.94,-3.18,-4.66,-5.05,-4.73,-4.35,-4.15,-4.56,-5.31,-5.45,-5.18,-4.65,-4.31,-4.92,-5.28,-5.33,-6.08,-7.31,-7.64,2.66,6.71,7.12,8.03,7.06,7.06,6.46,5.73,5.32,4.7,4.11,3.58,3.92,3.28,3.01,1.62,0.47,0.53,0.92,-0.89,-1.85,-1.93,-1.69,-2.29,-3.28,-3.73,-4.18,-4.4,-4.55,-4.48,-4.8,-5.57,-6.02,-6.19,-6.24,-6.54,-6.55,-5.82,-4.37,-2.53,-2.01,-0.72,0.12,0.72,2.04,3.07,3.84,3.5,3.48,3.94,4.3,4.06,4.09,4.06,4.04,3.29,2.71,1.54,0.39,-0.06,-0.34,-0.68,-0.85,-0.92,-1.14,-1.95,-2.73,-3.5,-4.32,-5.15,-5.62,-5.73,-5.37,-5.1,-5.56,-6.15,-6.65,-7.17,-7.29,-7.37,-7.37,-7.2,-6.96,-6.78,-6.87,-7.2,-7.32,-7.24,-6.97,-6.93,-5.07,-5.83,1.63,1.04,-1.21,-0.12,-0.37,0.66,0.26,-0.54,-1.41,-1.01,-3.19,-1.87,-3.0,0.16,5.38,5.54,7.94,5.51,5.19,6.08,6.49,6.12,5.81,5.75,5.01,3.6,2.7,2.73,1.65,0.18,-0.66,2.53,2.04,4.12,2.98,2.17,1.33,0.75,0.36,-0.93,-1.71,-1.52,0.75,3.06,3.7,2.56,2.05,1.71,1.13,0.37,-0.2,-0.56,0.52,2.42,3.26,3.34,2.85,6.29,5.75,3.31,1.75,2.13,2.73,2.11,0.96,-0.12,-1.4,-2.59,-3.49,-4.12,-4.64,-5.16,-5.65,-7.56,-8.86,-9.57,-9.25,-6.51,-1.21,1.11,1.77,3.15,4.96,3.13,4.17,6.91,5.97,3.5,1.29,-0.36,-1.66,-2.97,-3.98,-5.74,-4.89,-7.09,-4.06,-9.18,-8.11,-7.63,-8.68,-7.11,-6.89,-1.77,-1.36,-0.96,0.34,1.14,0.76,-0.35,-1.32,0.17,-0.59,2.31,2.69,0.21,-1.1,-2.65,-3.06,-1.99,-2.07,-1.92,2.5,0.97,2.25,0.91,-0.03,1.63,1.38,1.28,1.24,-4.26,-2.23,5.5,6.39,6.19,5.5,6.37,4.85,2.97,2.21,-0.36,-3.07,-4.18,-2.65,-0.74,-1.75,-6.58,-7.09,-0.9,-0.43,-0.49,1.07,1.44,0.92,1.42,4.58,4.09,1.69,0.77,1.22,-4.74,-6.56,-6.28,-3.51,-2.64,-0.96,1.98,2.47,1.31,1.81,-1.8,0.31,0.15,-2.48,-0.37,0.03,-0.29,-0.72,0.48,1.76,-0.31,2.45,3.21,1.52,-1.24,0.33,0.69,-0.31,-0.67,-1.25,-1.14,-0.47,-0.48,-0.3,0.19,-0.24,-1.54,-0.13,3.32,4.43,4.41,4.24,6.02,3.6,4.03,1.67,-0.56,-1.82,0.56,0.67,2.51,0.23,0.23,2.72,2.64,1.77,1.22,0.28,0.94,1.3,1.28,1.62,1.72,2.08,3.4,4.19,1.32,3.42,3.29,1.57,1.55,1.27,1.75,-0.32,0.51,0.96,2.4,3.14,3.67,3.93,1.43,3.09,1.86,0.9,1.55,-0.7,-2.23,-2.37,-2.4,-3.72,-5.32,-5.77,-4.95,-4.11,-3.92,-4.08,-4.71,-5.04,-5.14,-4.73,-5.22,-4.69,-5.22,-6.0,-7.87,-0.4,4.71,5.8,6.66,6.81,6.25,5.82,5.6,5.5,5.03,4.56,4.22,4.34,3.83,3.37,2.87,1.87,1.03,0.15,-0.9,-1.99,-1.03,-0.4,-1.6,-1.47,-1.37,-1.41,-2.22,-3.61,-3.71,-2.78,-4.36,-5.42,-5.36,-4.86,-4.39,-3.3,-2.71,-2.91,-3.28,-3.0,-3.12,-1.15,0.71,0.82,1.33,2.29,2.53,2.52,3.13,3.42,3.56,3.76,3.48,3.53,3.31,3.05,2.36,1.63,0.68,0.06,-0.47,-0.69,-1.09,-1.16,-1.0,-1.59,-2.49,-2.89,-3.76,-4.74,-4.57,-4.68,-4.86,-4.92,-4.89,-5.22,-5.53,-5.92,-6.39,-6.48,-6.52,-6.7,-7.01,-6.92,-6.56,-6.25,-7.05,-7.21,-7.21,-7.39,-7.01,-7.28,-5.02,-3.15,0.42,-1.97,-2.88,-1.08,0.17,2.11,0.69,-2.2,-4.73,-2.68,-1.33,0.25,3.15,6.07,5.42,8.25,7.6,7.26,7.55,7.46,7.0,6.35,5.77,5.43,4.89,4.17,3.51,1.7,-0.12,-0.05,0.27,2.56,3.34,3.3,2.5,0.83,-0.75,-1.79,-2.37,-2.7,-1.56,1.73,3.04,2.65,2.81,2.02,1.41,0.49,-0.35,-0.81,-0.74,-0.24,1.72,4.56,3.17,2.87,4.51,5.88,3.95,1.5,1.36,1.66,1.66,0.51,-0.38,-1.19,-2.51,-3.55,-3.7,-4.34,-5.32,-5.8,-7.93,-9.43,-9.87,-9.49,-6.38,-0.45,2.69,3.15,4.91,6.19,5.09,5.75,7.54,6.27,3.54,1.25,-0.46,-1.73,-3.28,-4.85,-4.89,-5.39,-3.16,-6.68,-6.92,-7.7,-8.24,-5.81,-5.69,-5.17,-2.59,-3.65,-2.39,-0.73,-1.4,-1.08,-2.38,-0.53,-0.6,0.43,2.29,2.33,1.06,-1.32,-1.38,-2.91,-1.09,3.28,3.0,1.85,1.37,2.99,3.88,1.59,0.37,2.6,4.59,1.65,0.84,1.26,5.68,6.95,6.72,5.71,4.14,3.14,2.57,0.81,-1.48,-2.78,-3.36,-4.5,-0.83,-1.11,-2.26,-6.68,-1.02,1.4,0.75,0.95,1.95,1.41,-0.27,0.43,0.86,1.55,1.81,-0.21,-6.13,-7.54,-6.55,-3.14,-2.37,-1.49,-0.22,0.54,-0.66,0.79,1.95,1.03,-0.64,1.01,1.89,2.48,0.59,1.53,1.74,1.19,0.84,3.59,3.07,0.5,-0.25,-0.87,-1.56,-0.88,1.75,0.99,0.24,0.68,1.49,1.56,2.36,1.27,-1.1,-2.86,-2.94,0.87,2.24,1.99,-0.39,-2.05,-2.32,0.91,-0.43,0.69,0.38,0.5,2.15,1.38,2.72,2.09,3.25,1.67,3.16,-0.14,2.54,2.45,2.03,1.65,2.73,3.34,3.16,3.3,1.96,4.39,4.05,3.04,1.79,2.05,-2.67,-3.06,0.52,1.63,2.2,2.73,2.64,2.36,2.02,2.22,1.29,0.69,0.92,-1.16,-2.9,-3.18,-2.85,-3.47,-4.68,-4.97,-4.47,-3.86,-4.04,-4.55,-5.3,-5.94,-5.76,-5.81,-5.58,-5.97,-7.55,-3.22,3.41,4.53,5.26,6.0,6.23,5.87,5.4,4.95,5.39,5.16,4.92,4.66,4.54,4.18,3.34,2.53,1.9,1.26,0.94,0.71,0.44,0.72,0.84,0.22,-0.36,-0.6,-0.84,-1.25,-1.32,-1.1,-0.82,-2.12,-3.2,-1.62,-2.55,-1.88,-2.48,-2.63,-3.2,-3.92,-4.08,-3.56,-0.95,0.3,0.05,0.1,0.69,0.75,1.2,1.96,2.81,3.18,3.5,3.23,3.2,2.94,2.75,2.2,1.64,1.06,0.22,-0.27,-0.52,-1.09,-1.28,-1.31,-1.9,-2.32,-2.51,-3.11,-4.2,-4.02,-4.1,-4.4,-4.33,-4.12,-3.97,-4.32,-4.69,-5.61,-6.16,-6.01,-6.18,-6.41,-6.42,-5.91,-5.66,-5.75,-6.19,-6.63,-6.78,-6.92,-7.25,-7.04,-7.68,-7.65,-1.48,-1.29,-2.87,-2.73,-0.42,1.15,0.44,-0.1,-1.24,-4.36,2.08,0.97,1.78,4.52,4.63,6.42,8.05,8.15,8.16,7.76,7.44,7.25,6.57,6.09,5.56,4.58,3.71,3.01,1.4,0.97,0.9,0.92,1.72,1.35,0.6,-0.54,-1.98,-2.85,-2.93,-1.89,0.4,2.36,2.94,2.45,2.13,1.68,1.29,0.49,-0.52,-1.14,-1.26,0.33,3.02,5.16,5.24,3.64,3.94,5.36,4.6,1.9,0.91,0.83,1.1,0.09,-1.04,-1.44,-2.71,-3.16,-3.2,-4.05,-5.39,-6.33,-7.49,-8.88,-9.21,-8.68,-6.48,-1.98,2.17,3.67,5.78,6.4,5.24,5.8,6.39,6.0,3.94,1.35,-0.65,-2.3,-3.64,-4.47,-5.07,-4.27,-5.86,-5.96,-7.69,-8.38,-5.25,-6.47,-3.82,-5.85,-5.58,-4.13,-3.47,-3.09,-3.55,-3.94,-0.09,0.06,2.2,2.58,-0.03,-0.95,-0.56,-3.01,-2.41,-0.79,0.87,1.88,0.64,1.02,2.85,1.75,1.93,1.03,4.33,5.15,2.03,1.66,3.3,2.0,6.9,5.11,5.63,3.05,1.57,0.9,1.44,0.57,-2.75,-3.34,-3.21,-3.85,-2.16,-2.51,-0.99,-5.42,-4.21,-2.5,0.92,3.43,0.62,1.19,0.19,3.03,7.69,6.85,3.6,-2.77,-4.39,-4.99,-4.08,-2.16,-2.47,-0.98,-0.55,-0.13,-0.3,0.88,0.11,-0.36,0.08,0.98,1.8,2.52,1.91,1.99,1.51,1.8,3.55,3.52,2.17,1.92,0.9,-2.35,-1.95,-1.33,1.26,1.14,-1.08,-0.79,0.42,1.96,2.13,-0.55,-1.62,-2.82,-2.67,-3.53,-1.94,4.37,2.04,0.8,0.3,1.51,0.41,1.87,1.38,1.41,-0.97,1.2,2.68,1.96,2.64,2.77,2.16,3.14,1.14,1.05,1.15,0.68,0.97,1.21,2.25,1.45,1.32,2.29,0.95,0.54,1.11,-3.37,-8.57,-5.56,6.0,4.08,3.49,2.91,2.53,1.92,1.75,1.31,1.01,0.62,-0.45,-1.7,-2.76,-3.11,-3.13,-3.49,-4.16,-4.6,-4.29,-4.13,-4.68,-5.23,-5.54,-6.29,-7.02,-7.04,-7.28,-6.91,3.31,4.12,5.2,5.35,6.02,6.0,5.79,5.38,4.98,4.69,4.79,4.57,4.73,4.55,4.01,3.24,2.38,1.82,1.44,1.09,0.83,0.68,0.55,0.43,0.12,-0.37,-1.03,-1.47,-1.77,-2.16,-2.24,-2.28,-2.57,-2.93,-3.41,-3.65,-2.3,-3.31,-3.24,-3.74,-4.23,-4.46,-3.76,-1.22,-0.89,-1.1,-0.99,-0.92,-0.38,0.26,0.84,1.66,2.37,2.73,2.85,2.86,2.67,2.44,1.95,1.52,1.08,0.26,-0.65,-1.05,-1.27,-1.63,-1.4,-1.6,-2.02,-2.39,-2.83,-3.62,-3.74,-3.74,-3.75,-3.73,-3.57,-3.39,-3.47,-4.07,-4.7,-5.23,-5.85,-6.3,-6.33,-6.34,-6.31,-5.84,-5.95,-6.55,-6.99,-7.48,-7.72,-7.71,-7.69,-8.08,-8.27,-7.28,-3.93,-0.35,-3.79,-5.05,-2.48,-0.47,0.92,0.36,2.01,1.29,2.42,2.41,1.38,4.15,7.4,8.02,6.57,7.38,7.97,7.03,7.01,7.05,7.18,6.67,5.01,3.83,3.26,3.88,3.57,2.94,1.89,0.26,0.2,0.13,-0.46,-1.82,-2.62,-2.04,-1.6,-0.69,0.58,2.26,2.79,2.56,2.11,2.23,2.05,1.04,-0.37,-0.81,0.88,3.27,3.91,3.83,3.86,2.9,3.59,5.32,4.86,2.58,0.81,0.46,0.21,-0.14,-1.11,-2.27,-2.98,-3.1,-3.25,-4.14,-5.13,-6.0,-6.93,-8.0,-8.24,-7.94,-6.35,-2.74,1.02,4.83,5.47,5.72,4.4,4.51,6.64,5.29,2.95,0.88,-0.93,-2.91,-4.11,-4.75,-5.21,-5.83,-5.82,-7.35,-7.64,-6.89,-5.89,-6.26,-4.73,-6.72,-6.17,-5.83,-4.5,-3.69,-4.08,-3.55,1.74,1.92,1.73,0.84,-1.96,-4.54,-7.35,-5.02,0.87,0.7,0.97,1.43,0.71,-1.47,-0.36,1.1,0.34,3.64,2.02,1.87,4.03,5.77,5.31,6.66,6.93,4.18,4.3,1.31,0.16,1.01,0.16,-2.92,-4.17,-4.52,-5.01,-3.42,-2.27,-2.95,-0.2,-1.16,-5.52,-4.39,1.69,-0.56,1.39,1.88,1.4,2.76,3.91,2.27,-0.42,-4.26,-4.82,-3.49,-0.51,-2.03,-1.42,-0.66,-0.41,-0.06,1.9,-0.05,-2.72,-0.69,0.72,2.23,1.44,1.14,1.22,1.83,1.72,2.1,3.42,2.74,2.09,-0.39,-0.01,-0.96,0.95,-1.36,-3.75,-1.31,0.17,-1.09,-0.14,2.73,2.85,3.27,0.8,0.1,-1.35,-2.79,-1.3,3.24,3.28,2.51,0.85,-0.31,0.19,1.17,1.68,0.02,-0.39,1.12,0.43,1.58,2.35,2.27,1.91,0.6,0.78,0.99,0.42,0.9,1.14,-0.71,-0.07,0.52,1.34,0.94,2.43,1.2,-4.04,-7.83,-7.63,-0.65,2.53,2.69,2.25,2.06,1.52,0.78,0.56,0.37,0.21,-0.23,-1.07,-1.94,-2.99,-3.52,-3.8,-4.14,-4.55,-4.52,-4.35,-4.5,-4.66,-5.4,-6.38,-7.45,-7.93,-7.61,1.29,3.64,4.64,5.19,5.6,6.07,5.55,5.72,5.36,4.83,4.38,4.5,4.0,4.2,4.09,3.67,3.1,2.31,1.6,1.07,0.79,0.33,0.3,0.73,0.78,0.13,-0.32,-0.68,-1.1,-1.61,-2.27,-2.72,-2.96,-2.95,-2.96,-3.32,-4.08,-4.01,-4.47,-3.87,-4.34,-4.76,-4.19,-3.47,-2.93,-1.84,-2.07,-1.73,-1.72,-1.89,-0.74,0.02,0.44,1.22,1.9,1.92,2.03,1.92,1.87,1.7,1.18,0.74,0.22,-0.57,-1.38,-2.0,-2.06,-1.99,-1.85,-1.85,-2.08,-2.42,-2.79,-3.44,-3.49,-3.55,-3.35,-3.18,-3.08,-3.13,-3.36,-3.87,-4.47,-5.11,-5.85,-6.12,-6.15,-6.05,-5.92,-5.69,-5.74,-5.89,-6.6,-7.26,-7.59,-7.71,-7.13,-6.74,-6.16,-5.73,-6.26,-5.4,-0.99,-4.39,-3.62,-0.94,-0.7,1.13,1.27,2.08,3.26,2.2,3.19,1.62,5.22,7.0,7.21,8.24,7.54,6.94,6.74,7.28,7.7,7.16,4.95,2.91,2.04,2.54,3.38,3.48,2.86,1.63,-0.29,-0.73,-1.32,-1.9,-1.96,-1.46,-0.92,-1.18,0.33,1.29,1.46,2.09,2.45,2.91,2.38,1.76,1.31,1.83,3.14,3.96,3.75,2.83,2.12,1.76,2.36,5.01,4.29,2.67,0.75,0.11,-0.83,-0.52,-1.11,-1.71,-2.71,-3.31,-3.83,-4.26,-5.19,-5.89,-6.72,-7.35,-7.47,-7.22,-5.47,-2.21,3.0,4.03,5.88,5.31,5.1,4.66,5.58,4.22,1.68,-0.12,-1.64,-2.93,-3.97,-5.04,-5.8,-6.46,-6.96,-7.37,-8.19,-4.56,-6.09,-4.6,-5.6,-6.08,-4.6,-4.83,-3.97,-4.15,-3.81,-2.69,-0.14,-0.66,-1.03,-1.03,-3.15,-3.99,-5.12,-2.77,-1.09,1.45,-0.42,-1.6,-3.5,-2.17,-0.22,0.49,0.6,2.79,1.42,6.5,4.45,3.68,3.65,3.06,2.79,2.57,1.53,1.06,0.66,0.74,-2.37,-4.41,-4.4,-4.18,-4.73,-3.33,-2.13,-1.6,-0.23,-0.25,-2.1,-3.02,-3.16,-1.7,3.03,2.61,3.2,3.5,2.92,-1.19,-2.87,-4.03,-5.15,-7.47,-5.8,-6.12,-3.21,-1.28,-1.85,-2.89,-3.19,1.13,3.72,1.66,2.39,5.54,1.76,0.82,0.89,0.96,1.42,1.62,1.54,2.15,2.83,0.7,-1.05,-0.38,0.2,-1.6,-2.39,-1.9,-0.12,0.09,1.09,3.61,2.88,2.04,2.87,3.22,1.53,0.66,-0.42,2.33,2.98,5.2,1.18,0.47,0.46,0.72,1.55,-1.41,-0.19,-0.14,-0.3,1.43,2.44,1.44,2.43,2.05,2.56,0.31,0.14,-2.64,-2.82,-0.31,0.06,1.37,1.72,0.78,-0.98,-4.92,-5.4,-5.19,-3.39,1.75,1.1,1.43,1.11,0.66,0.21,-0.39,-0.47,-0.66,-1.15,-1.64,-2.38,-3.34,-3.68,-4.14,-4.53,-4.9,-4.9,-4.79,-4.97,-4.98,-5.29,-5.55,-6.32,-6.3,-1.14,3.88,3.48,4.63,5.26,5.57,5.7,5.25,5.3,5.06,4.41,3.77,3.64,3.64,3.79,3.57,3.1,2.73,2.21,1.74,1.08,0.14,0.74,1.32,0.7,-0.09,-0.51,-0.82,-0.69,-0.83,-1.26,-1.67,-2.2,-2.7,-3.0,-3.21,-3.68,-4.17,-4.81,-4.82,-4.54,-4.74,-4.75,-3.91,-3.38,-3.11,-3.17,-2.32,-2.12,-1.96,-1.83,-1.53,0.0,-0.41,0.11,0.34,0.8,0.94,1.18,1.47,1.06,0.86,0.29,-0.33,-0.66,-0.92,-1.63,-2.13,-2.08,-1.76,-2.43,-2.93,-2.87,-2.63,-2.77,-3.3,-3.53,-3.57,-3.37,-3.15,-2.85,-2.85,-3.03,-3.7,-4.02,-4.62,-5.13,-5.55,-5.63,-5.7,-5.68,-5.51,-5.44,-5.69,-6.17,-6.52,-6.6,-6.7,-6.26,-6.38,-6.43,-6.42,-6.73,-5.88,-3.74,-3.25,-2.45,-1.01,-0.16,-0.83,0.42,2.74,2.32,-0.39,-1.41,1.18,1.98,6.57,7.98,6.64,5.38,4.81,5.34,7.78,8.12,7.04,4.53,2.94,0.29,1.63,3.2,2.05,0.63,0.55,0.94,-0.91,-1.44,-1.47,-1.3,-1.23,-0.95,-0.77,-0.72,0.25,1.33,2.25,3.09,3.05,2.73,2.94,3.96,3.49,3.52,4.15,3.76,3.1,1.73,0.65,0.85,4.17,3.7,2.42,0.52,-0.41,-0.53,-1.43,-1.38,-1.93,-2.55,-3.09,-3.58,-3.92,-4.79,-5.51,-5.92,-6.34,-6.36,-5.31,-2.85,0.78,2.53,3.87,4.97,4.6,3.91,3.1,4.14,2.09,0.39,-0.99,-2.06,-3.03,-4.13,-5.3,-6.36,-6.99,-7.72,-7.98,-5.36,-4.09,-5.9,-6.25,-5.31,-3.56,-6.69,-4.5,-3.36,-2.26,0.18,-0.71,-1.73,-1.42,-1.05,-2.19,-3.51,-3.62,0.16,3.68,2.07,1.11,-0.13,-2.43,-1.96,-0.63,-1.54,-0.33,0.53,1.27,4.65,2.7,2.19,2.2,1.9,1.9,1.94,0.17,0.58,0.02,-0.35,-0.48,-3.14,-4.77,-4.61,-4.38,-4.07,-3.83,-2.07,-2.2,-0.81,0.16,-1.56,-5.35,-4.7,-2.41,1.79,3.23,4.51,4.71,2.32,1.66,-1.73,-5.08,-5.56,-4.19,-6.85,-7.81,-4.58,-3.09,-3.07,-4.8,-3.6,1.14,2.03,-1.21,6.52,4.54,2.77,0.78,-0.1,0.48,1.02,0.97,0.54,0.27,-0.12,-0.14,1.03,1.18,-0.19,-1.44,-0.38,0.15,-1.29,0.3,2.9,3.12,1.83,0.33,1.82,1.49,0.18,-0.71,1.22,3.99,5.08,4.28,3.52,1.19,-0.33,1.3,4.12,-0.07,-0.5,-0.21,0.23,1.74,1.2,0.49,1.01,1.56,2.98,2.96,0.94,2.25,3.27,2.99,2.49,1.4,-1.53,-1.57,-1.66,0.51,1.64,1.23,3.12,-1.56,-0.84,-0.47,-0.77,-0.88,-0.92,-1.35,-1.81,-1.71,-1.82,-2.56,-2.96,-4.09,-4.23,-4.22,-4.28,-4.24,-4.43,-4.51,-4.05,-3.7,-3.26,-3.2,-1.26,2.04,4.36,3.3,3.82,4.63,4.84,5.0,4.99,4.74,4.59,3.85,3.16,3.14,2.97,3.0,2.96,2.7,2.28,1.79,1.39,1.03,0.45,0.79,1.04,0.22,-0.01,0.33,-0.04,-0.29,-0.45,-1.07,-1.6,-1.96,-2.28,-2.72,-3.33,-3.85,-4.21,-4.62,-4.92,-4.77,-4.63,-4.67,-4.35,-4.01,-3.55,-2.81,-2.5,-1.97,-1.65,-1.77,-1.82,-1.87,-1.89,-1.11,-1.05,-1.5,0.25,0.83,1.05,0.87,0.87,0.29,-0.01,-0.34,-0.86,-1.25,-1.77,-2.44,-2.58,-1.97,-2.25,-2.39,-2.59,-2.86,-3.06,-3.11,-2.97,-2.71,-2.47,-2.33,-2.37,-2.57,-2.77,-2.9,-3.38,-3.82,-4.34,-4.62,-5.01,-5.27,-5.33,-5.31,-5.31,-5.37,-5.72,-6.0,-6.23,-6.29,-6.16,-5.71,-6.06,-6.67,-7.09,-7.52,-7.0,-4.38,-3.11,0.31,-0.25,-0.8,-0.6,-0.04,0.23,0.91,1.46,-0.91,1.51,5.72,6.93,4.88,3.06,2.57,4.86,8.8,8.34,6.04,4.41,2.62,2.5,1.93,0.22,1.14,-1.4,-1.44,-0.23,-0.61,-0.37,-1.19,-1.25,-1.0,-0.99,-0.85,0.22,0.45,1.2,1.29,2.51,3.07,3.46,3.83,3.58,3.16,3.81,5.15,4.28,2.69,1.97,1.91,2.03,4.6,4.39,2.27,0.6,-0.57,-1.14,-1.31,-1.8,-2.48,-2.83,-3.35,-3.69,-3.96,-4.03,-4.53,-5.02,-4.58,-3.98,-2.7,-1.06,0.54,1.59,3.05,3.72,3.05,0.74,3.06,3.07,0.94,-0.91,-2.27,-3.24,-3.83,-4.66,-5.74,-6.82,-7.6,-8.32,-8.85,-5.73,-6.86,-5.75,-4.05,-3.37,-3.24,-4.65,-4.68,-4.71,-2.36,-2.63,-0.73,-0.89,-1.0,-1.67,-2.84,-2.91,3.46,3.85,1.03,2.52,2.37,3.41,-1.14,-2.01,-0.5,-1.94,0.29,2.51,2.73,3.14,2.42,1.23,-0.86,1.27,-0.45,-1.85,-0.64,-0.18,0.9,0.08,-3.08,-4.21,-4.51,-4.49,-5.33,-5.12,-2.63,-2.56,-3.54,-0.9,-0.64,-0.99,-2.23,-4.65,-0.22,1.38,3.41,4.63,3.23,0.03,-0.91,-3.36,-5.52,-5.61,-5.05,-5.6,-5.47,1.63,2.32,-1.04,-1.16,1.12,1.42,1.03,2.41,2.05,2.61,2.43,1.7,0.77,0.5,0.47,0.1,-0.27,-0.33,0.15,1.31,4.99,2.66,-1.53,-1.67,0.14,1.36,0.2,1.93,2.08,2.41,1.21,0.99,2.84,0.67,0.76,2.31,4.86,5.51,5.16,5.34,5.19,1.81,1.43,2.61,5.37,1.52,1.46,0.97,2.21,1.32,1.65,1.27,-0.63,0.7,2.64,3.77,2.21,2.7,1.73,1.78,3.74,3.85,3.35,2.98,3.28,3.02,1.32,0.46,0.06,-0.54,-1.2,-1.4,-1.98,-1.95,-1.94,-2.04,-2.33,-2.81,-2.94,-3.08,-3.47,-3.84,-4.38,-3.88,-3.0,-2.22,-1.67,-0.7,-0.08,0.74,0.89,1.39,3.46,3.78,3.46,3.36,3.61,4.11,4.38,4.71,4.27,3.95,3.68,2.91,2.58,2.3,2.32,2.25,2.05,1.84,1.45,0.99,0.46,0.16,0.21,0.61,0.16,0.08,-0.1,0.1,-0.58,-0.87,-1.03,-1.59,-2.22,-2.41,-2.73,-3.23,-3.78,-4.15,-4.49,-4.75,-4.68,-4.68,-4.9,-4.86,-4.91,-4.62,-3.43,-2.21,-1.62,-1.24,-1.09,-1.3,-1.48,-1.69,-0.96,0.12,-1.53,-0.02,-0.47,-2.12,2.05,1.37,0.6,-0.02,-0.52,-0.69,-1.15,-1.53,-2.01,-2.58,-2.84,-2.29,-1.95,-2.36,-2.57,-2.6,-2.92,-3.21,-3.55,-3.77,-3.81,-3.84,-3.62,-3.25,-2.63,-2.7,-3.03,-3.39,-3.8,-4.17,-4.52,-4.65,-4.94,-4.97,-5.01,-5.52,-5.88,-5.95,-6.13,-6.24,-6.27,-6.74,-7.25,-7.44,-7.27,-7.12,-6.13,-4.86,-3.1,0.22,-0.67,-0.36,-0.08,0.83,1.36,1.14,1.69,1.14,0.41,5.9,6.55,4.36,2.41,2.41,4.73,6.59,5.53,3.91,1.27,1.45,3.94,3.69,2.88,1.04,-0.98,-1.18,-2.04,-1.41,-0.58,-0.57,-0.28,-0.08,-1.49,-0.85,0.43,0.4,0.05,1.08,2.57,3.04,3.05,3.85,5.37,5.16,4.87,4.95,4.52,4.25,4.17,3.01,2.36,3.25,3.23,1.71,0.73,-0.59,-1.57,-2.23,-2.36,-3.01,-3.61,-3.71,-4.04,-4.09,-3.9,-3.95,-3.87,-3.36,-2.88,-1.97,-0.81,0.32,1.5,2.37,2.27,0.22,2.04,4.27,2.08,0.16,-1.58,-2.86,-3.66,-4.3,-5.25,-6.37,-7.31,-8.1,-8.77,-8.53,-6.83,-6.3,-6.61,-4.83,-3.68,-5.39,-5.02,-4.73,-2.94,-3.15,-0.69,-1.27,-2.54,-1.31,-3.11,-3.68,1.52,0.01,2.36,2.01,1.34,2.46,3.81,1.8,1.55,2.81,2.18,3.48,3.02,3.55,3.04,3.37,2.89,-1.1,-2.58,-3.0,-3.95,-0.58,0.9,-0.08,-1.1,-3.23,-4.06,-4.8,-5.6,-6.2,-6.66,-4.61,-4.14,-3.39,-2.61,-1.82,-0.43,-1.49,-4.22,0.56,5.43,0.44,2.17,0.61,2.3,-1.15,-4.05,-5.97,-6.22,-6.25,-3.82,1.83,1.51,-1.95,-0.83,1.05,1.86,2.46,2.48,2.96,3.07,2.69,1.95,1.78,1.15,0.31,0.17,0.25,0.11,0.0,-0.54,-0.58,2.65,0.18,-1.24,-2.14,-1.53,-1.51,-0.55,0.22,1.35,1.28,0.74,0.45,-0.5,0.93,4.66,6.69,4.4,4.01,3.39,4.14,3.42,2.62,1.27,2.25,4.52,2.12,1.22,1.26,1.43,0.61,0.4,0.34,0.92,1.6,5.47,1.89,3.64,0.28,-3.19,6.5,5.57,3.76,2.86,3.64,2.52,0.91,-0.39,-0.65,-0.57,-1.09,-1.87,-2.45,-2.59,-2.73,-2.79,-2.93,-3.18,-2.94,-2.47,-2.12,-2.66,-1.59,0.07,0.42,0.57,0.71,3.04,3.17,3.4,3.0,2.39,2.29,2.37,3.29,3.0,2.72,3.24,4.12,4.39,3.79,3.41,3.37,3.06,2.09,1.69,1.65,1.55,1.29,1.0,0.78,0.21,-0.11,0.33,0.18,0.12,-0.36,-0.28,-0.06,-0.24,-0.34,-0.6,-0.71,-1.6,-2.42,-2.8,-2.86,-2.98,-3.35,-3.83,-4.33,-4.58,-4.66,-4.91,-5.01,-4.93,-4.89,-4.56,-4.15,-2.23,-1.93,-1.15,-0.94,-1.05,-1.39,-1.57,-1.37,-1.04,-1.35,-0.18,-0.31,-1.23,-1.65,-2.25,3.41,0.52,-0.1,-0.62,-1.2,-1.61,-2.24,-2.94,-3.03,-2.77,-2.61,-2.45,-2.43,-2.34,-2.45,-2.62,-3.08,-3.57,-3.71,-3.48,-3.37,-2.86,-3.13,-3.35,-3.46,-3.11,-3.52,-3.72,-4.3,-4.64,-4.93,-4.76,-4.92,-5.08,-5.55,-6.03,-5.94,-5.91,-5.85,-6.19,-6.55,-6.91,-6.81,-6.19,-5.73,-5.15,-3.86,-2.7,-1.75,-3.79,-0.2,-0.24,1.12,1.42,2.33,2.76,1.81,3.35,1.12,6.69,6.08,4.08,2.92,6.08,5.77,2.89,2.01,0.62,3.43,3.28,3.21,2.44,1.98,0.71,-1.39,-2.68,-2.25,-2.28,-0.42,-1.38,-1.69,-4.55,-0.29,2.38,1.41,0.21,2.11,3.64,4.32,2.79,3.83,4.43,5.1,4.82,4.06,4.31,3.95,3.36,2.72,1.54,1.14,1.83,1.08,-0.39,-1.49,-2.33,-2.43,-3.29,-3.41,-3.65,-3.89,-4.04,-4.21,-4.21,-4.0,-3.67,-3.03,-2.38,-1.58,-0.48,0.19,0.63,0.76,-0.22,1.45,3.08,2.08,0.77,-0.92,-2.29,-3.31,-4.29,-5.12,-5.92,-6.64,-7.43,-8.27,-8.52,-8.62,-4.72,-4.85,-5.61,-3.56,-4.47,-4.35,-5.41,-2.48,-0.02,-0.05,-2.56,-4.14,-2.89,-4.02,-2.72,-1.2,1.09,1.59,1.59,1.66,2.2,4.39,2.99,1.33,1.33,1.8,2.68,2.56,2.88,3.14,2.92,1.85,0.64,0.41,-0.46,-4.34,-2.52,-0.46,-0.91,-0.38,-1.69,-3.17,-4.23,-5.35,-5.6,-6.18,-5.24,-5.12,-5.1,-4.12,-2.31,-2.11,-0.1,-1.64,-3.4,0.3,2.48,2.21,0.84,2.03,3.01,0.3,-4.8,-6.82,-3.92,0.76,2.54,2.22,-1.85,-2.22,0.3,0.64,3.91,5.32,5.04,4.41,3.47,2.27,1.69,1.57,1.22,0.71,0.38,0.2,0.11,-0.62,-1.41,-0.05,0.87,-0.15,-0.88,-1.92,-2.16,-1.34,-0.07,1.93,4.24,0.82,-0.48,-2.37,-2.04,3.32,2.91,5.33,5.85,5.08,3.41,2.45,1.63,1.0,1.45,1.71,3.55,0.92,1.06,1.78,2.27,0.91,1.3,0.57,0.98,2.08,2.85,3.43,5.31,1.61,1.7,5.67,4.56,3.83,3.63,3.42,1.08,-0.61,-1.18,0.32,-0.95,-1.2,-0.02,-0.53,-1.39,-0.91,-1.53,-1.82,-1.43,-1.08,-0.92,-0.15,2.89,2.13,1.65,1.02,2.24,3.44,4.15,3.36,2.72,2.35,2.1,2.06,2.31,2.16,1.99,2.38,3.21,3.76,3.42,2.92,2.82,2.95,2.34,1.65,1.53,1.16,0.31,-0.18,-0.4,-0.7,-0.67,0.08,0.24,-0.05,-0.63,-0.81,-0.66,-0.5,-0.24,-0.44,-0.76,-1.35,-2.18,-2.8,-2.92,-3.05,-3.29,-3.58,-3.83,-4.04,-4.31,-4.49,-4.54,-4.51,-4.18,-4.21,-4.23,-3.06,-2.13,-2.25,-1.38,-1.31,-0.68,-0.92,-1.42,-1.35,-1.32,-1.28,-1.67,-0.68,0.97,2.29,0.02,-4.79,-0.91,-0.51,-1.1,-1.35,-1.71,-2.22,-2.59,-2.75,-2.8,-2.69,-3.17,-3.38,-3.15,-2.95,-3.04,-3.13,-2.94,-2.46,-2.31,-2.25,-2.36,-2.45,-2.79,-3.39,-4.21,-4.59,-4.51,-5.08,-5.19,-5.3,-5.58,-5.56,-5.85,-5.57,-5.45,-5.92,-6.37,-6.57,-6.14,-5.61,-5.23,-5.02,-4.85,-4.38,-4.23,-3.88,-2.91,-2.92,-4.02,-5.22,-0.07,0.9,0.94,0.4,-1.29,1.69,2.99,0.58,2.58,4.19,5.41,3.65,5.43,2.14,1.41,0.74,0.72,3.81,3.29,2.64,2.07,1.36,1.36,0.91,0.07,-0.48,0.8,1.6,-1.05,-4.84,-4.42,0.75,-0.33,1.42,0.05,1.95,-0.89,0.44,2.25,3.09,3.73,4.07,3.37,3.85,4.08,3.46,2.82,2.06,1.29,0.78,1.44,0.83,-0.83,-1.29,-2.4,-3.29,-3.67,-4.27,-4.14,-3.96,-3.77,-3.52,-3.25,-3.06,-2.93,-2.64,-2.26,-1.9,-1.58,-1.24,-1.09,-0.76,2.3,2.2,0.98,0.38,-0.56,-1.88,-2.83,-3.68,-4.42,-5.15,-5.97,-6.5,-6.91,-6.99,-7.83,-7.67,-4.94,-4.2,-4.41,-3.75,-3.68,-5.1,-3.8,-0.56,1.51,0.77,-0.77,2.08,1.41,-1.78,-0.88,1.21,0.55,1.17,0.91,1.38,2.59,2.25,0.46,1.36,1.52,0.7,-0.53,2.17,1.76,1.67,0.72,-0.34,-0.82,-0.69,-2.64,-2.58,-0.61,-0.79,-0.21,0.49,-2.19,-3.66,-3.85,-5.55,-7.05,-6.21,-6.08,-4.74,-4.29,-2.98,-0.73,0.69,-0.51,-1.51,-1.91,0.01,2.28,2.55,2.41,2.06,2.43,0.85,-3.59,-5.45,1.28,3.29,0.99,-1.2,-0.79,-0.2,0.94,-1.74,6.65,5.0,3.77,3.16,2.52,2.03,1.83,1.4,0.89,0.4,0.13,-0.36,-1.16,-2.1,-1.75,-0.76,-0.13,-0.38,-1.43,-2.21,-0.9,-0.26,1.21,2.75,2.66,0.12,-2.34,0.64,3.81,1.11,3.23,3.95,3.88,3.56,3.22,1.78,0.27,-0.76,-1.97,1.31,5.16,2.58,1.25,1.19,3.5,1.8,1.48,-0.35,-0.34,0.42,0.49,2.93,4.06,3.45,3.08,4.78,4.31,2.75,3.1,3.36,1.38,-1.89,-2.05,3.58,0.92,-0.54,0.32,2.62,3.96,3.5,3.35,3.41,2.92,3.01,3.28,3.82,3.95,2.67,1.79,2.75,2.72,2.37,1.86,1.7,1.58,1.62,1.73,1.31,0.57,0.52,1.04,1.77,2.86,3.09,2.88,2.34,2.25,2.3,1.55,1.18,0.58,-0.33,-1.04,-1.2,-1.11,-0.43,-0.26,0.08,-0.2,-0.49,-0.84,-0.73,-0.65,-0.48,-0.4,-0.73,-1.16,-1.89,-2.58,-2.83,-2.96,-3.08,-3.18,-3.33,-3.56,-3.87,-4.19,-4.38,-4.47,-4.4,-4.48,-3.96,-3.71,-3.52,-3.14,-2.48,-1.29,-0.28,0.31,-0.18,-0.98,-1.48,-1.35,-1.98,-2.06,-1.28,-0.05,-0.74,-1.86,-3.18,-1.8,-1.23,-1.75,-2.09,-2.54,-2.66,-2.58,-2.69,-2.91,-3.27,-3.36,-2.52,-1.64,-2.32,-2.4,-2.46,-2.24,-2.35,-2.59,-2.84,-3.0,-2.74,-3.32,-3.79,-4.11,-4.46,-5.11,-5.52,-5.25,-4.74,-5.33,-5.79,-5.91,-6.11,-6.33,-6.39,-6.0,-5.93,-5.47,-4.92,-4.8,-4.74,-4.82,-4.66,-4.27,-3.51,-2.91,-3.17,-4.14,-4.72,-4.35,-0.68,-0.11,2.0,0.41,2.01,2.09,1.41,-0.57,3.15,1.44,-0.96,1.66,1.39,1.43,0.64,3.67,4.28,4.4,3.33,2.27,1.6,0.93,-0.07,-0.26,1.54,-1.05,-1.42,-3.42,-3.95,-0.74,1.0,0.25,-1.51,-0.99,1.05,2.23,-0.26,0.18,3.09,4.15,4.07,4.64,3.78,3.25,3.09,2.16,1.52,1.43,1.34,0.85,0.6,-0.54,-1.87,-2.51,-3.27,-3.68,-4.04,-3.98,-4.13,-3.92,-3.57,-3.36,-3.18,-2.94,-2.77,-2.54,-2.38,-2.27,-1.27,0.4,1.49,1.14,0.28,-0.04,-0.79,-1.8,-2.68,-3.26,-3.8,-4.53,-5.18,-5.59,-5.75,-5.76,-7.16,-7.77,-7.43,-6.0,-3.35,-3.37,-4.55,-4.61,-6.33,-1.86,2.0,-0.56,-1.3,0.35,1.74,-1.8,-3.51,-1.1,2.45,-1.19,2.05,-0.24,-0.06,-0.24,-1.73,-1.49,2.3,-0.03,-2.41,-1.09,1.39,-0.11,-1.02,-2.1,-1.45,-1.14,-1.01,-2.27,-1.25,-1.24,-0.93,-2.53,-3.03,-3.81,-3.26,-3.31,-3.44,-5.35,-5.8,-6.48,-5.87,-4.75,-2.64,-0.37,0.93,-0.71,-3.23,-0.77,-3.06,0.05,2.84,4.78,-1.75,0.67,3.12,-0.99,-3.97,-1.06,3.14,3.19,2.92,3.36,1.26,2.82,3.36,3.78,3.35,2.67,2.2,1.76,1.63,1.28,0.58,-0.03,-0.21,-0.88,-1.63,-2.15,-2.29,-1.17,-0.56,-0.46,0.24,-0.16,-1.73,-0.51,-0.04,2.03,2.66,2.89,1.63,1.25,2.5,1.78,2.79,2.93,2.79,2.52,2.19,1.63,0.76,-0.57,-1.18,-0.99,0.28,3.49,6.48,1.54,1.04,3.21,3.04,2.19,2.71,1.11,-0.31,0.28,0.31,4.07,4.38,4.75,3.68,2.67,2.09,1.75,2.04,1.69,-0.03,0.99,2.85,0.79,0.26,0.74,3.12,4.71,4.89,4.36,3.92,3.37,3.54,3.66,3.15,2.94,2.28,2.51,1.9,1.23,0.5,0.37,0.44,0.6,1.0,0.29,-0.3,-0.42,0.02,0.52,1.58,2.35,2.15,1.98,1.63,1.52,1.24,0.8,0.22,-0.57,-1.45,-1.67,-1.23,-0.69,-0.27,0.04,-0.17,-0.44,-0.79,-0.98,-0.9,-0.98,-0.82,-0.99,-1.37,-1.74,-2.45,-2.9,-3.29,-3.46,-3.45,-3.53,-3.63,-3.94,-3.97,-4.12,-4.28,-4.64,-4.81,-4.69,-3.72,-3.3,-3.81,-3.74,-2.83,-1.65,-0.13,0.1,-0.32,-1.16,-1.69,-2.09,-2.12,-1.65,-1.51,-2.04,-2.36,-2.47,-2.42,-2.23,-2.44,-2.91,-3.26,-3.43,-3.45,-3.78,-3.75,-3.23,-2.7,-2.28,-2.0,-1.89,-1.87,-2.03,-2.13,-2.24,-2.46,-2.69,-2.8,-3.34,-3.78,-3.96,-4.44,-5.29,-5.15,-4.9,-5.05,-4.91,-4.71,-4.88,-5.7,-6.14,-6.46,-6.14,-5.96,-6.0,-5.83,-5.13,-4.77,-4.57,-4.73,-4.54,-4.36,-3.71,-3.01,-2.79,-2.96,-3.61,-4.26,-4.5,-3.17,-2.56,-2.77,-0.33,-0.39,-0.2,1.12,1.57,7.78,3.59,1.93,1.25,1.06,-0.05,0.93,1.82,3.1,5.27,4.81,2.76,1.72,1.08,0.57,0.45,0.8,-0.32,-1.57,-1.82,-1.12,-0.34,-0.23,0.08,0.51,1.21,2.17,2.12,2.48,2.49,3.71,3.21,3.64,4.12,3.16,2.65,1.87,1.6,1.25,0.79,0.44,0.58,0.3,-0.71,-2.32,-2.9,-3.12,-3.27,-3.43,-3.72,-3.8,-3.54,-3.28,-3.25,-3.26,-3.04,-2.79,-2.55,-1.93,-0.28,0.15,0.21,-0.26,-0.38,-0.46,-0.91,-1.69,-2.44,-3.08,-4.55,-4.27,-4.35,-5.12,-5.28,-5.74,-6.95,-7.11,-7.85,-7.6,-5.4,-3.72,-3.81,-4.72,-3.71,-3.77,1.65,2.91,1.68,1.95,2.07,-0.93,1.91,-1.04,-0.31,0.45,1.3,1.8,-0.3,-1.73,-0.56,0.08,1.69,0.63,0.0,-2.05,0.48,-0.22,-1.78,-2.55,-1.82,-1.24,-1.83,-0.57,-0.88,-0.93,-0.91,-1.11,-0.89,-3.87,-3.31,-3.23,-3.3,-4.61,-6.49,-5.18,-5.98,-7.09,-6.16,-3.74,-1.91,-1.34,-0.83,-2.97,0.29,-2.06,-0.15,6.25,7.02,3.23,0.04,-0.93,-2.02,1.06,1.1,1.83,0.57,1.44,0.87,1.89,1.8,1.98,2.17,2.14,1.72,1.61,1.47,0.94,0.34,-0.24,-0.85,-1.22,-1.55,-2.05,-2.24,-1.83,-0.68,-0.67,-0.12,0.5,0.18,-2.46,-2.73,1.01,2.15,3.7,3.41,4.83,3.47,3.46,4.13,4.2,3.76,2.69,1.41,0.81,0.92,0.16,-0.77,-0.53,-0.1,3.5,6.66,2.21,0.69,-0.49,2.36,4.04,0.79,0.41,-0.21,0.49,0.14,0.37,-0.5,4.86,4.45,3.51,2.82,1.86,1.53,1.7,1.66,1.55,1.86,2.93,1.78,1.01,1.13,2.83,4.18,4.72,4.2,3.98,3.51,3.21,3.12,2.73,2.28,2.36,1.06,0.56,0.01,-0.12,0.01,0.15,0.15,-0.63,-1.18,-0.9,-0.23,-0.39,0.54,0.89,1.44,1.61,1.31,1.2,1.05,0.79,0.16,-0.56,-1.28,-2.19,-2.23,-0.99,0.0,0.09,-0.08,-0.08,-0.61,-1.06,-1.19,-1.03,-0.88,-1.03,-1.22,-1.65,-2.32,-2.9,-3.35,-3.62,-3.69,-3.64,-3.54,-3.51,-3.55,-3.95,-4.35,-4.7,-4.58,-5.22,-4.88,-3.66,-4.0,-3.43,-3.32,-2.28,-1.43,-0.48,0.32,-0.52,-1.43,-1.6,-1.85,-1.96,-2.01,-2.21,-2.53,-2.78,-2.92,-2.71,-2.63,-3.46,-3.58,-3.67,-3.49,-3.43,-3.11,-2.63,-2.58,-2.39,-2.24,-2.24,-2.03,-2.03,-1.86,-1.87,-2.05,-2.34,-2.59,-2.96,-3.12,-3.29,-2.95,-4.18,-4.6,-3.15,-4.09,-4.31,-4.26,-4.64,-5.62,-5.4,-5.23,-5.37,-5.44,-5.55,-4.87,-5.19,-4.37,-4.19,-4.26,-4.41,-4.33,-3.76,-3.19,-2.8,-2.81,-2.91,-3.55,-4.12,-3.66,-2.97,-2.84,-3.24,-2.43,-1.74,-1.81,-0.9,-0.01,6.31,0.71,1.64,-0.01,-1.05,1.29,-1.02,-0.29,0.79,2.73,5.53,3.37,1.5,0.7,0.41,0.41,-0.13,-0.71,-1.3,-1.56,-1.43,-1.66,-1.11,-0.6,0.15,0.83,2.18,3.31,3.58,4.2,4.5,3.52,3.87,2.63,2.69,1.83,1.33,0.8,0.46,-0.03,-0.2,-0.3,-0.45,-1.03,-1.99,-2.67,-3.14,-3.3,-3.29,-3.46,-3.5,-3.33,-3.18,-3.22,-2.82,-2.65,-1.39,-1.09,-1.2,-0.87,-0.77,-0.76,-0.6,-0.67,-0.93,-1.36,-2.02,-2.51,-2.56,-1.64,-3.13,-4.83,-4.78,-5.72,-6.65,-7.19,-7.57,-7.64,-6.95,-3.5,-3.73,-3.97,-4.25,-3.01,-1.99,0.94,2.52,3.47,1.9,2.1,3.01,2.27,1.11,3.04,2.05,1.97,1.35,-0.82,-1.18,1.49,2.32,1.38,0.54,-0.59,-0.58,0.15,-0.84,-2.13,-1.6,-2.38,-2.39,-1.94,-2.22,-1.58,-1.7,-2.04,-0.99,-0.84,-1.36,-2.48,-3.15,-3.37,-8.61,-7.33,-7.06,-6.48,-7.53,-6.57,-3.73,-4.12,2.29,6.29,3.96,1.2,1.23,2.22,3.22,9.98,7.11,0.5,0.11,-1.89,1.84,4.0,3.81,2.39,1.7,1.3,1.17,1.15,1.36,1.65,1.17,0.3,0.29,0.54,0.42,0.04,-0.55,-1.07,-1.3,-1.65,-1.62,-1.42,-0.99,-0.77,-1.04,-0.65,0.56,0.81,-1.48,-1.6,0.0,1.63,3.19,4.17,7.29,6.53,5.68,5.15,4.24,3.28,1.81,1.16,1.27,0.91,0.16,-0.5,0.03,0.69,0.46,0.82,1.09,0.54,-0.03,2.76,3.98,-1.36,-2.24,-2.22,-1.55,0.07,0.55,0.95,4.62,3.9,3.21,2.2,1.51,1.78,2.4,1.56,0.91,0.71,4.87,3.54,1.4,-1.67,0.98,4.22,4.01,3.37,3.07,2.74,2.71,2.08,1.93,2.06,0.92,0.39,0.03,-0.21,-0.22,-0.17,-0.31,-0.99,-1.75,-1.26,-0.53,-0.3,-0.51,0.18,0.79,1.7,0.86,0.63,0.61,0.57,0.26,-0.21,-0.7,-1.47,-2.08,-2.25,-1.53,-0.66,-0.16,-0.11,-0.65,-0.83,-1.16,-1.48,-1.66,-1.32,-1.05,-1.33,-1.76,-2.41,-3.17,-3.68,-4.06,-3.95,-4.0,-4.2,-4.24,-4.29,-4.35,-4.6,-5.29,-4.59,-4.99,-4.99,-3.12,-1.21,-2.33,-2.17,-2.19,-1.51,-1.27,-1.03,-0.77,-1.1,-1.54,-1.96,-2.24,-2.56,-2.91,-2.92,-2.91,-2.97,-2.73,-2.82,-3.34,-2.81,-2.8,-2.66,-2.45,-1.66,-1.93,-2.14,-1.97,-2.04,-1.86,-1.68,-1.62,-1.7,-1.79,-1.91,-2.22,-2.94,-3.78,-4.44,-4.6,-4.97,-4.97,-4.21,-3.68,-4.33,-4.25,-4.82,-5.34,-4.87,-4.99,-5.28,-4.96,-5.26,-4.78,-4.95,-4.52,-4.23,-4.17,-4.07,-4.0,-4.17,-3.81,-3.46,-3.22,-3.32,-3.48,-3.46,-3.26,-3.16,-2.71,-2.35,-2.39,-2.7,-2.37,-1.53,-0.56,1.26,3.0,1.98,-1.86,0.39,0.86,1.09,0.26,0.26,1.52,1.13,0.02,0.88,1.03,0.21,-0.53,-0.64,-1.07,-1.4,-1.57,-1.66,-1.96,-2.3,-1.67,-0.36,0.43,1.12,2.26,3.5,4.36,4.22,4.11,3.4,3.1,2.31,1.94,0.98,0.33,-0.08,-0.59,-0.75,-0.93,-1.06,-1.35,-1.53,-1.66,-1.97,-2.29,-2.41,-2.38,-2.42,-2.38,-2.31,-2.31,-2.06,-1.8,-1.56,-1.39,-1.38,-1.28,-1.24,-0.9,-0.82,-1.1,-1.27,-1.52,-1.93,-2.2,-2.59,-3.24,-3.42,-4.98,-4.54,-5.41,-5.84,-6.37,-7.03,-7.49,-7.48,-4.17,-3.31,-2.91,-3.04,-3.54,-3.14,0.09,1.53,1.65,1.55,-1.49,2.87,2.78,2.13,2.55,1.76,1.43,2.0,0.97,0.52,0.58,0.68,2.16,1.17,2.5,-1.51,-1.53,-2.06,-2.37,-1.67,-2.49,-2.92,-2.67,-1.51,-0.7,-0.72,-0.83,-1.77,-1.71,-3.66,-3.82,-2.14,-4.57,-6.93,-8.49,-9.01,-7.23,-4.9,-5.23,-4.41,-2.08,-0.84,5.47,5.3,2.34,2.42,2.17,2.62,4.09,6.75,10.33,0.07,1.3,1.67,1.48,1.54,-0.16,0.28,1.06,0.43,0.4,0.69,1.27,0.82,0.32,-0.36,-0.69,-0.33,-0.21,-0.42,-0.74,-0.91,-1.12,-0.96,-0.7,-0.55,-0.85,-1.2,-1.31,-0.89,-0.76,-0.97,-0.42,-1.47,-0.58,-0.4,1.43,3.95,6.98,6.48,5.83,5.06,3.66,2.48,1.93,1.66,1.64,1.22,0.65,0.16,0.29,0.51,-0.38,-0.9,-0.34,0.6,-0.31,2.56,3.16,0.2,-1.3,-1.26,-0.68,0.54,-0.03,0.58,1.62,2.83,2.35,1.77,2.31,2.03,1.98,1.13,0.2,0.76,2.63,2.91,1.41,-3.86,-0.86,1.38,3.59,2.83,2.44,2.09,1.54,1.18,1.4,0.56,0.25,0.0,-0.19,-0.32,-0.6,-0.89,-1.16,-1.7,-1.88,-0.6,-0.22,-0.87,0.13,0.19,1.5,0.3,0.0,0.04,0.14,-0.01,-0.34,-0.71,-0.97,-1.27,-1.61,-1.88,-1.65,-1.03,-0.76,-0.65,-0.75,-0.93,-1.53,-1.52,-0.96,-1.4,-1.07,-1.37,-1.77,-2.33,-2.98,-3.7,-3.81,-4.05,-3.73,-3.27,-3.43,-4.2,-4.21,-4.4,-3.31,-3.32,-4.05,-4.25,-3.74,-2.83,-2.26,-2.76,-2.21,-1.8,-1.24,-0.57,-0.97,-1.67,-1.74,-1.84,-2.3,-2.77,-3.27,-3.15,-3.16,-3.28,-3.3,-3.08,-3.16,-2.97,-2.5,-1.91,-1.71,-2.16,-2.55,-2.51,-2.21,-2.26,-2.03,-2.03,-1.86,-1.68,-1.71,-2.23,-3.28,-4.16,-4.7,-5.19,-6.16,-5.59,-4.81,-4.49,-4.88,-4.66,-4.63,-4.75,-4.77,-5.15,-5.43,-5.47,-5.13,-5.18,-4.92,-4.78,-4.96,-4.75,-4.37,-4.28,-4.14,-4.2,-4.38,-4.04,-3.87,-3.69,-3.34,-3.19,-3.18,-2.96,-2.92,-3.0,-3.12,-2.92,-2.05,-0.96,0.11,0.78,1.25,1.4,-0.24,-1.13,-1.06,-0.22,0.15,-0.32,1.43,0.31,0.64,-0.26,0.01,-0.66,-1.02,-1.36,-1.41,-1.3,-1.9,-2.03,-2.31,-1.87,-0.66,-0.41,-0.05,0.99,2.2,3.04,3.53,4.16,3.75,3.41,2.24,1.57,0.95,0.27,-0.04,-0.48,-0.81,-0.87,-1.17,-1.62,-2.04,-2.42,-2.63,-2.58,-2.5,-2.54,-2.59,-2.63,-2.75,-2.83,-2.6,-2.44,-2.08,-1.95,-1.65,-1.41,-1.2,-0.89,-0.86,-1.01,-1.61,-2.13,-2.59,-2.59,-2.72,-3.34,-3.81,-4.36,-1.76,-4.08,-5.39,-5.77,-6.09,-6.63,-7.23,-6.94,-5.85,-2.99,-2.38,-2.98,-0.85,-1.49,-0.51,-0.04,1.96,2.7,2.32,2.83,2.3,2.3,2.81,3.54,2.41,1.95,1.21,0.89,0.74,1.96,1.84,1.89,2.39,2.02,3.09,0.66,1.8,1.3,-1.46,-2.91,-3.3,-2.78,-1.88,-0.18,-0.2,-1.03,-2.01,-4.2,-2.99,-0.96,-5.78,-5.09,-3.83,-4.82,-5.44,-4.33,-4.07,-3.76,-2.12,2.84,4.71,3.61,0.97,1.41,-0.38,1.45,1.55,3.18,7.08,3.14,0.42,-1.39,-2.18,-1.38,-1.17,0.76,1.53,0.72,0.79,0.03,0.94,0.01,-0.61,-1.18,-1.07,-0.75,-0.75,-0.79,-0.59,-0.45,-0.51,-0.33,-0.28,-0.56,-0.9,-1.06,-0.94,-0.71,-0.7,-0.77,0.12,-0.73,-0.1,0.69,1.13,3.81,5.02,5.71,5.54,4.8,3.95,3.24,2.52,1.98,1.92,1.47,0.63,0.58,-0.01,0.46,-1.84,-2.02,-1.26,-1.79,0.66,4.06,3.34,1.17,-1.32,0.9,1.32,0.19,-0.23,-0.89,0.42,1.51,0.64,0.9,1.68,2.19,1.57,0.69,0.14,0.22,1.48,2.72,0.05,0.72,1.32,-0.93,2.08,2.88,1.93,1.42,1.22,1.0,0.25,0.17,0.1,-0.09,-0.42,-0.62,-0.64,-0.54,-1.04,-1.34,-0.96,-0.67,-0.87,0.04,0.56,1.6,0.39,0.09,-0.2,-0.23,-0.36,-0.53,-0.85,-1.19,-1.63,-1.84,-1.65,-1.54,-1.42,-1.4,-1.42,-1.11,-1.19,-1.51,-1.72,-1.64,-1.97,-1.62,-1.85,-1.4,-1.78,-2.5,-3.12,-3.48,-3.99,-4.2,-4.2,-3.96,-4.05,-3.29,-3.94,-3.99,-3.43,-3.35,-3.66,-4.16,-3.98,-3.32,-3.08,-2.62,-2.04,-1.92,-1.45,-1.1,-0.97,-1.38,-1.95,-1.95,-2.18,-2.64,-3.12,-3.03,-2.82,-2.54,-2.88,-3.2,-3.38,-3.32,-3.17,-2.96,-2.99,-3.32,-3.01,-2.84,-2.68,-2.34,-2.08,-2.07,-1.56,-1.6,-1.83,-2.63,-4.02,-4.65,-4.61,-5.06,-5.8,-5.53,-5.05,-5.31,-4.97,-4.83,-4.3,-4.61,-4.75,-5.04,-5.02,-5.14,-5.25,-5.21,-5.14,-5.38,-5.2,-5.34,-5.25,-4.89,-4.82,-4.81,-4.83,-4.84,-4.41,-3.92,-3.53,-3.37,-3.42,-3.2,-3.97,-4.01,-3.78,-3.19,-2.18,-0.83,-0.1,0.14,0.93,0.44,-0.07,1.35,1.67,1.24,-0.77,-0.99,0.27,1.3,-0.43,-0.05,-0.82,-1.38,-1.39,-1.64,-1.81,-1.99,-2.16,-3.08,-3.17,-3.0,-2.49,-1.75,-0.57,0.71,2.26,2.81,2.39,2.71,2.62,2.26,2.12,1.67,0.62,0.52,-0.21,-0.34,-0.66,-0.89,-1.42,-1.71,-1.81,-2.27,-2.87,-3.06,-3.12,-3.1,-3.11,-3.25,-3.22,-3.09,-2.98,-2.61,-2.12,-2.35,-2.24,-2.11,-1.82,-1.85,-2.05,-2.27,-2.5,-2.9,-3.14,-3.06,-3.3,-3.5,-3.71,-3.24,-3.2,-4.94,-5.67,-5.78,-5.97,-6.48,-6.85,-6.69,-7.06,-2.53,-0.69,1.13,1.54,-0.08,-0.04,0.37,0.85,1.99,2.26,1.27,1.57,1.94,2.33,2.53,2.45,1.83,1.48,1.83,1.58,2.12,1.97,2.29,2.05,0.78,0.94,0.1,1.95,1.96,0.35,0.73,-2.05,-2.96,-2.69,-0.78,-0.67,-1.22,-0.38,0.2,1.59,-0.27,-5.05,-4.7,-3.59,-4.32,-4.01,-2.01,-1.39,-2.64,0.67,4.17,3.82,2.12,0.01,-1.63,-0.77,1.09,0.54,2.89,1.62,2.42,-0.38,-1.68,-1.82,-2.48,-1.31,-0.26,0.4,1.99,0.8,0.52,0.31,-0.42,-0.85,-1.09,-0.98,-1.08,-1.37,-1.23,-0.65,-0.31,-0.24,-0.3,-0.32,-0.24,-0.56,-1.22,-1.59,-1.65,-1.82,-1.6,-0.67,-0.6,-1.25,1.2,2.07,5.23,5.02,5.18,4.33,3.33,2.81,2.51,2.09,1.66,1.42,1.12,0.65,-0.01,0.07,0.26,-2.34,-2.82,-2.26,-1.86,-0.45,5.85,4.76,4.58,-0.18,0.3,1.34,1.03,-0.74,0.44,0.19,-1.8,-1.31,0.71,1.67,1.83,1.39,0.47,0.0,0.04,0.54,1.26,2.74,-1.76,4.55,1.07,0.91,2.87,1.64,1.0,0.47,0.42,0.37,0.17,0.0,-0.34,-0.61,-0.77,-0.96,-1.2,-1.39,-1.43,-1.24,-1.02,-1.25,-0.94,0.26,0.75,0.44,0.09,-0.29,-0.59,-0.86,-1.06,-1.26,-1.66,-2.23,-2.51,-2.39,-2.21,-2.0,-2.04,-2.23,-2.17,-2.18,-2.28,-1.94,-1.73,-1.88,-1.75,-1.82,-1.89,-2.07,-2.35,-2.62,-3.07,-3.57,-3.76,-4.06,-3.96,-3.17,-2.75,-3.17,-3.3,-3.27,-3.39,-3.62,-3.93,-4.22,-4.12,-3.75,-2.92,-2.46,-2.25,-2.14,-2.05,-1.61,-1.58,-1.81,-2.43,-2.84,-2.83,-2.72,-2.57,-2.52,-2.43,-2.48,-3.15,-3.71,-3.93,-4.02,-3.96,-3.79,-3.72,-3.67,-3.44,-2.75,-2.17,-2.38,-2.1,-2.26,-3.35,-3.75,-3.83,-4.44,-4.42,-4.47,-4.77,-4.95,-5.22,-4.78,-5.2,-5.11,-4.09,-4.58,-4.61,-4.72,-4.94,-5.45,-5.68,-5.95,-5.71,-5.85,-5.7,-5.79,-5.88,-5.89,-5.91,-5.64,-5.31,-5.2,-4.6,-4.0,-3.89,-3.86,-4.12,-3.91,-4.43,-4.65,-3.94,-3.85,-3.2,-1.53,-0.42,0.4,0.73,0.2,-0.77,0.07,1.18,2.01,2.29,2.27,2.1,0.77,1.77,-0.76,0.16,-0.78,-1.76,-2.28,-2.55,-2.67,-2.65,-2.98,-2.94,-3.6,-4.13,-3.44,-1.28,-1.34,1.03,2.05,2.04,2.26,1.9,2.0,2.39,1.85,0.9,0.52,0.3,-0.12,-0.72,-0.61,-0.98,-1.17,-1.56,-2.15,-2.62,-3.05,-3.46,-3.56,-3.68,-3.77,-3.69,-3.61,-3.42,-3.28,-3.0,-3.07,-2.9,-2.56,-2.28,-2.23,-2.44,-2.61,-2.72,-3.25,-3.18,-3.44,-3.3,-3.51,-3.5,-3.19,-3.29,-4.32,-5.05,-5.44,-5.76,-6.06,-6.37,-6.56,-6.27,-6.89,-1.81,0.53,1.75,0.75,0.0,1.46,2.2,1.5,2.03,1.9,2.11,2.01,1.53,1.87,3.06,2.82,1.62,1.81,1.21,2.17,1.91,2.88,2.27,2.65,2.42,1.6,-0.14,2.1,0.42,0.04,-0.49,-2.35,-0.88,1.63,0.46,-0.91,0.58,-0.42,3.36,3.34,-0.85,-3.1,-3.58,-3.55,-3.42,-2.31,-1.57,-1.47,-0.02,0.35,2.22,1.61,-0.28,-2.34,-0.93,-0.13,-1.95,-0.32,-0.61,0.32,-1.85,-1.12,-0.7,-2.28,-1.22,1.09,-0.21,0.17,0.19,-0.47,-0.33,-0.62,-0.82,-1.14,-1.37,-1.46,-1.61,-1.64,-1.3,-0.95,-0.83,-1.06,-0.78,-0.34,-0.35,-0.97,-1.57,-1.9,-1.81,-1.86,-2.22,-2.04,0.32,0.05,0.82,2.03,4.42,5.21,4.75,3.91,3.31,2.7,2.34,2.2,1.79,1.35,0.42,-0.56,-1.39,-0.98,-0.53,-2.99,-3.64,-3.33,-2.46,-0.38,2.96,3.27,3.15,-0.39,-0.08,1.43,0.38,0.83,1.76,-0.91,-2.12,-0.81,0.85,1.07,0.65,0.24,-0.48,-1.23,-0.47,-3.93,-0.46,0.61,-0.87,-0.37,3.05,1.79,1.87,0.89,0.6,0.24,-0.13,-0.34,-1.24,-0.95,-1.1,-1.19,-1.49,-1.92,-1.81,-1.46,-1.45,-1.27,-1.07,-1.3,-1.42,-0.28,0.14,-0.31,-0.62,-0.9,-0.96,-1.37,-1.56,-1.68,-1.93,-2.26,-2.4,-2.67,-2.95,-2.98,-2.8,-2.58,-2.38,-2.24,-2.27,-2.13,-1.92,-2.07,-2.12,-2.33,-2.56,-2.73,-2.83,-2.88,-2.82,-3.26,-3.65,-3.9,-3.93,-3.23,-2.8,-2.71,-3.35,-3.92,-4.54,-4.85,-4.96,-4.89,-4.69,-4.32,-3.58,-2.97,-2.47,-1.97,-2.24,-2.71,-2.56,-2.43,-2.59,-2.9,-2.9,-3.06,-3.22,-3.14,-2.98,-2.97,-3.23,-3.79,-4.3,-4.31,-4.14,-3.93,-3.86,-3.79,-3.42,-2.62,-2.25,-2.25,-2.67,-3.43,-3.71,-3.97,-4.3,-4.57,-4.46,-4.6,-4.96,-5.31,-5.09,-5.21,-5.69,-5.34,-5.42,-5.32,-5.14,-5.33,-5.62,-6.03,-6.6,-6.69,-6.98,-6.96,-6.52,-5.84,-5.67,-5.97,-5.99,-5.78,-5.62,-5.04,-4.52,-4.23,-4.32,-4.81,-4.56,-4.69,-4.79,-4.61,-4.37,-3.35,-1.73,-0.13,0.59,0.71,0.95,-0.33,-0.63,0.14,1.42,2.18,2.41,2.22,2.91,1.67,0.35,2.64,0.26,-0.35,-2.09,-2.55,-2.4,-2.8,-3.12,-3.54,-3.65,-4.95,0.96,-0.89,-0.82,-0.63,0.62,0.67,3.35,1.88,3.8,-0.22,1.15,1.42,0.86,0.62,-0.67,-0.63,-0.92,-1.91,-2.1,-2.56,-2.84,-2.98,-3.06,-2.98,-3.37,-3.91,-3.97,-4.01,-4.03,-3.75,-3.59,-3.55,-3.39,-3.23,-2.94,-2.85,-2.84,-2.73,-2.69,-2.96,-3.1,-3.42,-3.22,-3.3,-3.46,-3.49,-3.49,-3.6,-4.18,-4.54,-4.62,-4.96,-5.52,-6.12,-6.47,-6.33,-5.83,-5.11,-3.7,-0.22,1.2,0.54,0.58,1.32,1.72,1.3,2.39,3.28,1.58,2.72,2.6,2.3,1.54,1.66,2.65,1.69,1.53,3.08,2.24,2.56,2.09,1.67,2.49,0.87,1.17,4.16,1.17,-0.42,-0.25,2.86,2.39,1.97,1.4,2.23,1.0,2.52,1.97,0.55,-1.44,-2.15,-2.14,-2.57,0.15,-0.26,-1.08,-0.53,-0.37,1.33,1.02,0.0,0.41,0.12,1.22,0.45,0.31,-0.61,0.76,3.32,-0.74,-0.65,0.61,3.11,0.86,-0.28,-0.46,-0.48,-1.5,-1.63,-1.17,-1.51,-1.37,-1.61,-1.98,-2.26,-2.24,-2.13,-1.93,-1.76,-1.7,-1.56,-1.17,-0.82,-0.66,-0.71,-1.05,-1.04,-1.14,-1.6,-2.21,-1.95,0.41,0.76,0.92,2.96,1.34,4.68,3.4,3.13,2.56,2.04,1.69,1.36,0.72,-0.2,-0.91,-0.91,-0.75,-1.24,-1.85,-3.16,-3.68,-3.88,-3.48,-0.05,2.83,2.33,1.95,1.97,2.31,0.28,1.74,1.66,-1.16,-1.4,-2.13,-1.05,-0.33,0.32,-0.36,-0.97,-0.77,-1.68,-2.95,1.95,-0.28,0.56,1.84,0.21,-2.0,0.33,0.68,0.67,-0.05,-0.78,-1.27,-1.57,-1.31,-1.54,-1.77,-2.14,-2.28,-1.95,-1.07,-1.13,-1.1,-0.84,-0.78,-1.29,-1.77,-1.59,-1.07,-1.32,-1.36,-1.56,-1.63,-1.96,-2.09,-2.2,-2.23,-2.22,-2.65,-3.22,-3.6,-3.7,-3.61,-3.52,-3.38,-2.97,-2.74,-2.53,-2.58,-2.54,-2.45,-2.72,-3.14,-3.47,-3.65,-3.78,-3.88,-3.95,-3.87,-4.02,-3.96,-3.67,-3.3,-3.13,-3.64,-4.24,-5.02,-4.92,-4.78,-4.83,-4.37,-3.96,-3.48,-3.03,-2.45,-2.41,-2.92,-3.11,-3.37,-3.56,-3.39,-3.04,-3.22,-3.47,-4.02,-4.27,-4.34,-4.09,-3.87,-4.2,-4.47,-4.66,-4.46,-4.35,-4.05,-3.8,-3.36,-3.06,-3.07,-2.94,-3.22,-3.13,-3.38,-3.26,-4.01,-3.96,-4.18,-4.36,-4.85,-4.63,-5.24,-5.54,-5.51,-5.57,-4.8,-4.9,-5.31,-5.85,-6.31,-6.76,-7.33,-7.5,-7.32,-7.88,-7.07,-5.49,-6.07,-5.81,-5.42,-5.33,-5.8,-6.17,-5.69,-5.86,-5.65,-4.99,-4.75,-4.7,-4.96,-5.28,-3.87,-0.79,1.42,1.77,1.13,0.56,0.22,-0.43,0.11,0.24,1.06,2.22,2.89,2.76,2.55,2.81,2.2,1.88,0.23,0.44,-1.82,-1.55,-2.07,-2.19,-3.01,-3.6,-4.29,-0.71,-0.81,-0.04,-1.77,0.6,1.1,1.91,3.07,0.53,1.49,2.2,0.48,-0.64,0.43,-0.33,-0.36,-1.49,-1.3,-2.0,-2.85,-2.4,-2.63,-2.84,-3.04,-3.25,-3.53,-3.67,-3.84,-4.21,-4.16,-4.1,-3.98,-3.88,-3.88,-3.9,-3.8,-3.76,-3.66,-3.57,-3.7,-4.43,-3.65,-2.99,-3.25,-3.11,-3.32,-3.57,-3.88,-4.14,-4.51,-4.86,-5.09,-5.3,-5.68,-6.03,-6.11,-6.08,-5.81,-5.02,-3.19,-0.97,-0.47,-0.1,0.52,0.93,1.09,0.82,1.64,1.77,2.75,3.23,2.4,1.55,1.6,1.72,2.91,1.19,1.29,1.88,2.5,2.0,2.14,1.33,0.51,-0.15,2.18,2.2,1.32,0.41,1.03,0.71,2.15,3.53,3.63,2.7,2.99,3.02,2.35,0.98,1.02,0.29,-1.24,-0.93,-0.14,0.9,1.52,0.23,0.28,2.31,0.64,0.22,-0.08,1.1,-0.1,0.2,-0.11,1.72,0.44,1.77,3.1,1.78,1.51,1.18,1.04,-0.27,-0.69,-1.35,-1.96,-2.32,-2.25,-2.21,-1.88,-2.18,-2.52,-2.67,-3.14,-2.93,-2.71,-2.12,-2.15,-2.09,-1.63,-1.13,-0.73,-0.75,-0.89,-1.13,-1.07,-1.24,-1.53,-1.97,-1.76,-0.47,0.99,3.75,1.44,0.39,2.3,1.55,1.12,1.28,0.75,0.46,0.74,-0.08,-0.16,0.66,-0.45,-1.54,-2.5,-3.21,-3.42,-4.12,-4.47,0.13,1.95,1.7,1.22,0.77,0.58,2.46,1.96,0.25,-0.91,-2.07,-2.02,-0.71,-0.31,-0.46,-0.45,-0.48,0.13,-1.92,1.57,-1.26,-0.63,0.38,1.82,0.14,-2.93,-4.79,0.0,-0.48,-1.2,-1.4,-1.57,-1.47,-1.71,-2.07,-2.37,-2.65,-2.16,-1.29,-0.68,-0.09,0.19,-0.15,-0.93,-1.62,-2.39,-2.03,-2.23,-2.61,-2.67,-2.41,-2.5,-2.14,-1.83,-1.91,-2.15,-2.74,-3.41,-3.66,-4.11,-4.06,-4.01,-3.98,-3.92,-3.93,-3.44,-3.3,-3.05,-2.99,-3.0,-3.11,-3.43,-3.82,-4.13,-4.38,-4.51,-4.45,-4.38,-4.36,-4.24,-3.72,-3.18,-3.23,-3.7,-3.91,-3.73,-3.58,-3.67,-3.55,-3.38,-3.69,-3.68,-3.47,-2.9,-2.81,-2.93,-3.19,-3.66,-3.7,-3.67,-3.7,-3.48,-3.34,-3.51,-3.72,-3.88,-4.11,-4.58,-4.94,-5.38,-5.64,-5.27,-4.86,-4.37,-4.14,-4.25,-4.63,-4.16,-3.61,-3.34,-3.42,-0.55,-1.98,-2.94,-2.89,-1.52,-1.8,-2.97,-4.48,-5.27,-5.41,-5.52,-4.99,-4.59,-4.21,-4.26,-4.63,-5.09,-5.92,-6.17,-5.59,-5.07,-3.78,-2.21,-2.71,-2.9,-4.3,-5.62,-4.35,-4.75,-5.46,-5.06,-6.29,-5.92,-4.76,-4.66,-5.16,-4.79,-3.26,-0.18,1.71,2.0,1.84,2.46,2.32,1.57,0.98,1.35,0.12,1.01,1.78,2.52,2.93,2.45,1.89,1.67,1.17,-0.84,0.46,1.21,2.28,0.2,-0.53,-0.44,-3.42,-0.6,-0.55,-0.23,-0.39,-0.51,0.22,-0.09,1.85,0.69,-0.08,0.11,-0.09,-0.74,-0.29,-0.22,0.0,0.37,-0.16,-2.11,-2.53,-2.29,-2.64,-2.86,-3.29,-3.74,-3.93,-3.99,-4.09,-4.16,-4.63,-4.57,-4.56,-4.67,-4.61,-4.42,-4.24,-4.46,-5.28,-5.67,-5.74,-5.66,-5.07,-4.22,-4.32,-4.03,-4.0,-4.43,-4.44,-4.37,-4.63,-5.29,-5.69,-5.92,-6.0,-5.97,-5.84,-5.6,-5.35,-5.22,-4.61,-3.33,-2.38,-1.74,-0.69,0.01,0.03,1.16,1.3,1.23,1.54,2.69,3.23,2.11,1.68,1.98,2.34,2.63,0.83,1.4,1.5,1.74,2.19,1.74,1.41,1.08,1.51,0.93,0.01,-0.32,1.1,1.09,0.3,1.84,3.71,4.05,3.47,2.72,2.5,1.69,1.11,1.92,2.94,2.21,1.25,1.07,1.53,1.71,2.54,2.51,2.3,1.67,0.45,0.16,1.14,0.0,-0.26,-0.03,0.4,-0.14,1.14,1.21,2.35,3.11,1.74,0.37,-0.16,-0.1,-1.08,-1.86,-2.63,-2.79,-3.0,-2.94,-2.84,-2.92,-3.23,-3.88,-3.57,-2.56,-1.78,-1.58,-0.26,0.01,0.01,-0.6,-1.14,-1.21,-1.15,-1.15,-1.16,-1.61,-1.65,-1.7,-0.71,3.85,3.85,1.53,0.51,1.16,-0.13,-0.34,-0.64,-0.75,-0.33,0.41,0.37,-0.01,-0.13,-0.87,-1.92,-2.39,-2.94,-3.01,-3.5,-2.23,1.11,-0.31,2.09,0.81,0.26,0.51,0.5,0.11,-0.45,-0.47,-1.39,-1.19,-0.35,-0.26,0.07,-0.55,-0.93,-0.49,0.55,-0.19,0.19,0.26,-1.19,-2.15,0.0,-1.63,-0.21,-0.89,-1.53,-3.53,-2.17,-1.5,-1.57,-1.93,-2.97,-2.44,-2.52,-0.96,0.16,0.5,-0.01,-0.15,-0.42,-0.9,-1.33,-2.05,-2.72,-3.32,-3.56,-3.59,-3.46,-3.04,-2.61,-2.27,-2.31,-2.88,-3.6,-3.76,-4.11,-4.59,-4.79,-4.73,-4.8,-4.66,-4.67,-4.52,-4.02,-3.9,-3.93,-3.98,-4.11,-4.38,-4.73,-5.04,-5.15,-5.29,-5.21,-4.91,-4.49,-3.87,-3.38,-3.22,-3.55,-3.91,-4.03,-4.31,-4.04,-4.19,-3.72,-3.66,-3.35,-3.78,-3.79,-3.84,-3.86,-3.38,-3.23,-3.09,-2.86,-3.55,-3.73,-3.91,-3.79,-3.76,-3.81,-3.68,-4.5,-4.89,-4.94,-5.16,-5.22,-5.42,-5.8,-5.25,-5.15,-5.69,-5.55,-5.57,-4.94,-2.32,0.06,-0.48,-2.11,-2.59,-1.79,-1.57,-3.86,-3.79,-3.78,-4.72,-5.01,-5.17,-4.62,-4.19,-4.01,-4.13,-3.23,-4.82,-4.58,-4.02,-3.64,-3.21,-1.6,-0.88,1.04,0.13,-2.4,-2.55,-2.74,-1.48,-2.01,-3.67,-4.02,-2.92,-3.69,-3.77,-3.6,-2.34,0.9,1.91,2.9,2.93,2.7,2.84,2.63,2.39,1.75,2.64,2.66,2.13,2.32,2.55,2.29,1.98,2.41,3.17,2.8,3.07,0.35,1.72,0.66,2.87,0.94,-0.09,-0.97,-0.43,-0.05,-0.44,0.89,0.51,-0.04,1.41,1.46,0.45,-0.57,-0.94,-0.87,-0.33,-0.69,0.1,0.72,0.48,0.32,-1.94,-2.77,-2.48,-3.15,-3.71,-3.99,-4.09,-4.39,-4.78,-4.76,-4.7,-4.33,-4.14,-4.27,-4.68,-4.78,-4.96,-5.8,-5.68,-5.89,-6.1,-5.45,-5.27,-5.34,-5.53,-5.44,-5.4,-5.19,-4.53,-4.79,-5.15,-5.59,-6.15,-6.37,-6.37,-6.1,-5.89,-5.4,-4.87,-4.38,-4.06,-3.89,-3.47,-2.21,-1.47,-1.51,-1.0,-0.61,-0.21,0.36,0.69,1.25,2.35,2.91,1.73,1.07,2.28,2.07,1.35,0.79,1.14,0.66,-0.12,0.04,0.49,2.36,2.74,2.26,0.81,0.6,-0.26,1.12,0.72,2.69,3.06,4.49,3.33,3.13,3.02,2.17,1.5,1.97,2.01,2.42,2.37,2.06,1.86,2.25,2.67,1.87,2.38,3.49,1.95,1.45,1.05,0.75,0.59,-0.6,-0.14,0.22,-0.18,1.85,2.06,3.19,3.27,1.82,0.51,0.02,-0.1,-1.2,-1.94,-2.7,-3.27,-3.34,-3.4,-3.43,-3.63,-3.96,-4.05,-3.22,-3.47,-2.98,-1.73,-0.92,0.34,0.48,-0.25,-0.6,-0.57,-0.53,-0.88,-1.12,-1.24,-1.12,-1.06,-0.37,1.28,2.0,0.77,0.38,0.18,-0.93,-1.28,-0.77,-0.54,-0.82,-0.29,0.07,0.17,0.25,-0.08,-0.51,-0.8,-1.52,-2.12,-2.43,-2.97,1.02,0.64,-4.97,0.93,0.02,-0.27,-0.17,-0.65,-1.06,-1.18,-1.37,-1.17,-0.37,-0.19,-0.65,-1.24,-1.42,-2.69,-0.57,1.41,0.99,0.24,0.3,0.75,1.59,-0.95,0.27,2.43,-4.09,-0.4,-0.38,0.78,-1.53,-3.08,-0.6,-0.81,-1.46,-1.37,-0.58,0.17,-0.24,-0.13,-0.24,-0.89,-1.71,-2.5,-2.29,-2.71,-3.52,-3.34,-2.78,-1.78,-1.51,-0.64,-0.16,-1.63,-3.21,-4.23,-4.62,-5.34,-5.32,-5.32,-5.44,-5.63,-5.89,-6.39,-5.69,-4.87,-4.52,-4.45,-4.79,-4.78,-4.96,-5.26,-5.17,-5.11,-4.86,-4.43,-3.95,-3.4,-3.22,-3.15,-3.88,-3.95,-3.81,-3.79,-3.87,-3.62,-3.43,-3.7,-3.49,-3.41,-3.45,-2.88,-2.81,-2.77,-3.03,-3.29,-2.9,-2.95,-4.01,-4.14,-4.39,-4.39,-4.57,-4.73,-4.65,-4.67,-4.99,-4.67,-4.02,-4.94,-5.3,-5.86,-6.08,-6.86,-7.63,-5.8,-3.45,-2.16,-1.73,-2.57,-2.84,-3.76,-3.07,-3.18,-3.03,-2.4,-2.86,-3.41,-4.02,-3.49,-4.47,-3.78,-3.04,-2.83,-3.25,-3.13,-3.25,-1.93,-1.4,-1.37,-0.6,0.2,0.42,-0.79,-2.68,-0.56,1.06,1.86,1.27,0.41,0.93,0.41,0.72,-0.41,-1.3,-0.53,1.52,2.17,3.62,3.18,3.06,3.5,4.24,4.31,4.47,4.69,5.3,4.93,3.86,3.52,3.14,2.37,1.99,2.77,3.48,2.69,2.45,2.28,2.11,2.83,1.96,0.12,0.5,-0.31,0.48,-0.22,0.66,-1.29,0.46,1.25,1.61,1.37,1.14,-1.09,-0.51,0.33,-1.4,0.19,-0.15,-0.3,-0.39,-1.6,-2.66,-2.98,-3.72,-4.34,-4.44,-4.9,-5.21,-5.75,-6.09,-5.84,-5.46,-5.16,-4.57,-4.68,-4.83,-5.02,-5.79,-6.39,-6.25,-5.49,-5.43,-5.62,-5.69,-6.09,-6.26,-6.57,-6.5,-6.02,-5.52,-5.96,-6.36,-6.48,-6.28,-5.92,-5.73,-5.24,-4.52,-3.54,-3.08,-2.86,-2.57,-2.34,-2.23,-2.08,-1.69,-1.94,-0.85,-0.21,-0.05,0.46,0.96,1.05,0.88,0.92,0.96,1.12,1.59,0.54,1.28,2.91,3.06,2.45,0.78,1.05,1.96,2.76,0.37,1.44,-0.65,-0.48,0.06,0.43,0.79,2.87,3.87,3.13,2.53,1.9,1.7,1.92,2.58,2.31,2.32,1.57,1.42,2.59,3.66,2.52,2.01,2.71,3.89,3.16,2.84,0.29,0.28,-0.73,-0.12,-0.04,1.17,1.05,1.39,2.14,3.14,2.9,1.91,0.56,0.95,0.37,-0.66,-2.2,-2.98,-3.47,-3.46,-3.19,-3.18,-2.96,-3.06,-2.45,-1.53,-1.15,-0.9,-1.29,-0.85,-0.71,-0.05,0.36,0.63,0.61,0.13,-0.06,-0.55,-0.75,-0.53,0.13,0.52,0.92,2.37,3.78,3.03,-1.63,-0.26,0.77,-0.2,-0.28,-0.43,-0.3,-0.03,0.45,0.73,0.9,0.22,-0.3,-0.14,-0.02,-0.45,-1.82,-1.52,1.66,-0.71,-1.96,-0.98,-0.64,-0.69,-1.58,-2.16,-2.09,-1.96,-2.16,-1.34,0.07,0.27,-0.09,0.57,-1.31,0.53,-2.08,0.8,0.71,0.45,1.89,2.62,1.39,1.97,-2.49,-2.48,-0.27,0.08,-0.21,0.52,0.08,0.44,0.68,0.98,1.17,0.64,0.39,0.69,0.31,-0.11,-0.78,-1.71,-1.79,-2.11,-3.15,-3.84,-3.64,-2.85,-2.36,-0.47,-0.68,-0.87,-0.52,-1.81,-3.15,-4.59,-3.77,-3.82,-4.9,-5.53,-5.4,-6.86,-4.45,-3.95,-4.19,-4.97,-4.28,-5.91,-6.67,-5.54,-5.17,-5.26,-5.04,-4.4,-3.68,-3.23,-3.23,-3.35,-3.68,-4.03,-3.77,-3.36,-3.28,-3.15,-2.93,-2.83,-2.31,-2.84,-2.78,-2.64,-2.79,-3.04,-2.98,-2.84,-2.6,-3.31,-3.46,-3.96,-4.21,-4.61,-4.86,-4.73,-4.5,-4.54,-4.79,-4.66,-4.56,-3.91,-3.99,-4.38,-4.83,-6.07,-5.29,-5.12,-3.17,-1.67,-1.39,-2.35,-3.24,-4.32,-3.71,-3.68,-3.52,-2.38,-2.44,-3.03,-3.62,-3.73,-2.28,-2.64,-3.8,-1.68,-2.01,-2.76,-0.53,0.07,0.76,1.4,1.9,2.0,2.27,2.19,0.33,-0.3,1.85,2.72,2.73,2.69,2.66,1.87,1.17,0.84,1.28,0.78,1.88,2.77,2.73,3.19,4.71,5.09,4.56,5.14,5.56,5.6,5.61,5.61,5.46,4.99,3.92,3.5,3.79,3.57,3.9,3.82,4.27,5.02,4.84,3.56,2.49,1.49,0.67,0.13,-0.08,-0.27,0.87,0.18,1.03,2.83,2.66,1.82,0.96,-0.06,-0.33,-0.24,-0.72,-0.55,-0.8,-0.47,0.46,-0.14,-1.02,-1.2,0.3,0.02,-3.58,-5.78,-6.09,-5.95,-6.29,-7.09,-6.92,-7.0,-6.6,-6.31,-5.9,-5.98,-6.38,-5.24,-4.03,-4.5,-3.95,-3.65,-3.6,-3.67,-4.75,-5.5,-6.71,-6.28,-6.37,-6.6,-6.75,-7.12,-6.34,-5.93,-5.54,-5.61,-5.04,-4.32,-3.38,-2.68,-1.91,-1.13,-0.75,-0.61,-0.29,0.08,0.0,-0.08,-0.28,0.23,0.29,0.77,0.62,0.37,0.45,0.82,0.78,0.72,2.03,2.88,3.35,3.42,3.58,4.28,1.45,1.81,1.24,0.69,-0.12,0.32,0.68,0.9,1.57,2.07,1.44,1.7,2.06,2.49,1.78,1.65,1.67,1.77,1.98,1.55,0.64,2.45,4.11,3.52,1.86,2.17,2.44,2.33,2.74,0.47,2.56,1.15,0.22,1.18,0.57,1.21,2.97,2.65,1.83,3.3,2.85,1.72,1.32,1.24,-0.03,-0.6,-1.72,-3.12,-4.06,-3.78,-3.42,-2.98,-2.49,-2.82,-2.89,-1.64,-1.34,-0.63,0.03,-0.67,-0.44,-0.3,1.09,1.61,0.77,0.44,0.06,0.13,0.31,1.16,1.26,1.39,1.13,1.34,0.54,0.01,-1.03,0.84,-0.2,-0.52,-0.52,0.38,0.32,1.51,0.81,0.48,0.14,0.02,0.19,-0.05,-1.44,-2.24,-1.06,-1.71,-0.81,0.03,-1.27,-2.01,-1.36,-0.91,-1.2,-0.81,-1.95,-2.69,-1.89,-1.45,0.22,-0.22,-0.25,-2.74,0.8,0.77,0.81,2.61,1.99,0.58,1.47,1.41,0.68,-0.88,-3.32,-0.87,-0.36,-0.15,-0.25,-0.46,-0.81,0.38,1.42,2.23,2.06,1.46,1.52,1.3,0.73,0.36,-0.46,-1.11,-1.63,-2.83,-3.51,-3.32,-3.44,-2.51,-2.22,-2.92,-2.72,-2.61,-3.81,-4.14,-5.28,-4.03,-4.16,-3.75,-2.89,-2.13,-1.99,-2.62,-1.78,-2.05,-1.89,-2.74,-4.1,-4.14,-3.15,-5.78,-6.89,-5.8,-5.34,-4.57,-4.01,-3.66,-3.88,-3.68,-4.16,-4.24,-3.89,-3.47,-3.22,-3.04,-2.64,-2.44,-2.68,-2.8,-2.72,-2.84,-2.5,-2.44,-2.0,-2.34,-2.72,-2.92,-2.58,-2.5,-3.39,-4.2,-3.88,-3.99,-4.28,-4.37,-4.36,-4.19,-4.03,-3.67,-3.36,-3.65,-4.41,-3.98,-3.97,-2.76,-1.97,-1.06,-0.94,-2.29,-3.07,-4.14,-2.74,-1.59,-0.54,-0.1,-1.17,-2.24,-2.96,-1.65,-1.1,-1.29,-0.66,0.09,-0.76,-0.41,0.75,1.36,2.33,3.01,3.16,3.54,3.87,2.7,2.8,2.68,2.59,2.78,3.64,3.16,1.91,1.47,2.09,1.87,0.38,0.88,1.62,2.09,3.67,3.55,4.11,4.76,5.45,5.43,5.7,5.7,5.33,4.99,4.94,4.92,4.85,4.46,5.33,5.76,5.7,5.85,5.14,4.34,3.7,2.67,1.88,0.91,0.79,1.05,-0.93,0.75,0.01,0.12,1.91,3.03,2.26,1.44,0.96,0.09,-0.29,-0.66,0.0,-0.76,0.63,-0.23,-1.43,-0.97,-1.0,-0.46,-0.38,-0.88,-0.55,-0.46,-2.79,-5.59,-5.33,-4.37,-4.77,-4.55,-4.19,-3.94,-3.93,-4.18,-3.42,-3.48,-3.81,-3.88,-2.88,-2.88,-2.58,-3.52,-4.02,-4.25,-4.48,-5.35,-5.88,-4.95,-5.89,-5.3,-6.14,-6.93,-6.12,-6.17,-5.25,-4.84,-3.66,-2.62,-1.45,-0.19,0.38,0.94,1.07,1.0,1.22,1.36,0.98,0.21,-0.58,-0.04,-0.79,1.14,2.4,2.63,0.64,1.15,2.1,2.35,2.77,3.99,4.42,4.33,3.63,3.32,3.47,0.69,0.27,0.98,0.55,1.77,1.67,1.84,1.42,1.39,1.84,2.08,1.88,2.43,2.16,1.64,1.26,1.12,1.58,1.93,2.8,2.62,2.56,1.22,2.45,1.02,0.45,2.18,4.61,4.23,3.56,3.59,3.58,2.69,3.01,2.27,1.93,2.81,2.3,1.82,1.39,0.83,0.57,-0.53,-1.13,-1.81,-2.96,-4.32,-4.14,-3.71,-3.36,-2.72,-2.25,-1.81,-0.92,-1.02,0.74,0.68,0.04,1.26,1.51,1.22,1.11,0.95,0.92,0.84,0.95,1.14,1.41,1.83,2.05,0.37,0.66,1.19,2.65,0.85,1.0,1.05,-0.55,-0.84,0.82,0.73,0.95,0.43,0.8,0.17,-0.54,0.28,3.37,-0.06,-2.04,-1.26,-2.38,-0.56,-1.33,-0.94,-2.07,-1.61,-0.95,-1.19,-1.2,-1.7,-1.44,-0.61,0.13,-0.37,-0.93,-0.13,0.73,0.9,2.18,-0.62,0.42,0.35,0.76,0.43,-0.55,-2.22,-2.03,-0.9,-0.77,-0.15,-0.19,-0.18,-0.14,-0.24,1.26,1.53,2.1,1.94,2.29,2.68,2.13,0.95,0.02,-0.87,-2.02,-3.09,-3.55,-4.14,-4.07,-3.4,-3.09,-2.8,-2.93,-3.95,-5.54,-4.63,-3.16,-2.62,-1.37,-1.52,-0.3,0.91,-0.05,-0.79,-1.65,-1.94,-2.59,-2.92,-3.06,-2.23,-2.02,-3.61,-4.64,-3.76,-3.32,-3.71,-3.81,-4.24,-4.08,-4.06,-4.21,-4.48,-4.21,-3.94,-2.91,-2.61,-2.91,-2.49,-1.99,-1.84,-1.47,-2.28,-2.69,-2.29,-2.18,-2.47,-2.82,-2.78,-2.46,-2.99,-2.36,-2.68,-3.23,-3.46,-3.97,-4.16,-3.88,-3.85,-3.75,-3.6,-3.46,-4.02,-4.08,-3.81,-3.4,-1.7,-0.15,0.56,0.12,-0.76,-2.02,-1.42,-0.95,0.4,1.13,0.63,0.37,-0.11,-0.2,0.14,0.44,0.86,1.06,1.5,1.43,1.2,1.44,1.7,2.34,3.07,3.39,2.86,2.7,2.97,3.02,3.59,4.2,4.09,3.71,2.84,1.58,2.94,2.35,1.51,2.07,2.3,2.14,2.34,4.37,5.45,5.84,5.79,5.53,5.26,5.01,4.88,5.09,5.0,4.21,3.98,4.58,5.49,4.98,4.68,4.98,4.59,3.82,3.49,3.12,2.28,1.22,0.25,0.2,0.59,1.32,0.55,-0.37,2.05,2.28,2.24,1.43,1.02,0.75,0.66,0.28,0.02,-0.45,0.47,0.79,3.12,1.38,-1.69,-1.2,-0.46,-0.98,-0.58,-0.6,-0.73,-0.86,-1.21,-3.25,-1.94,-1.77,-0.32,-0.12,0.22,-0.82,-0.71,0.63,-0.38,-0.4,0.59,1.59,1.51,0.44,-0.42,-1.22,-1.4,-0.8,-1.16,-1.26,-2.63,-2.76,-1.57,-1.42,-2.06,-2.14,-0.24,-2.3,-2.07,-0.93,0.41,0.84,0.41,0.43,0.91,1.18,1.43,1.4,1.99,2.02,1.61,1.34,1.0,1.72,2.48,2.96,2.42,2.12,1.74,3.84,3.49,3.84,3.35,2.58,3.35,4.18,4.01,3.53,3.33,1.38,0.57,0.44,0.52,0.74,0.94,0.8,1.18,1.26,1.84,1.88,1.81,0.83,0.95,0.4,0.09,0.85,1.32,1.53,2.04,1.9,0.39,0.88,1.36,1.99,0.63,1.67,5.19,3.22,4.78,3.8,3.61,4.22,3.32,1.69,1.82,1.46,1.67,1.29,0.77,0.21,-0.4,-0.77,-1.24,-1.6,-1.38,-1.99,-1.4,-3.05,-4.6,-3.91,-2.59,-1.9,-0.55,-0.81,0.84,0.72,0.99,1.01,0.82,0.98,1.66,1.55,1.4,1.0,1.16,1.37,2.11,1.99,2.3,3.28,2.72,2.1,2.58,2.42,1.1,0.65,0.9,0.69,-0.25,1.38,1.64,0.93,-0.24,-0.93,-0.84,-0.9,0.73,-0.75,-2.25,-2.92,-1.15,-0.2,-1.09,-2.68,-1.96,-0.87,-0.29,-0.27,-0.74,-0.51,-0.65,-2.7,-1.38,-0.27,0.32,0.03,-0.06,-1.87,-0.42,0.21,0.26,0.44,0.14,-0.97,-0.92,-2.13,-2.25,-2.09,-1.85,-0.92,-0.43,-0.19,0.27,0.41,1.26,1.89,3.31,3.58,2.87,1.77,0.93,0.4,-0.86,-1.79,-2.65,-3.52,-4.05,-3.79,-3.61,-3.57,-3.02,-5.21,-4.63,-1.93,-0.7,-1.57,-0.91,-0.16,-0.92,-0.56,-0.37,-0.7,-1.18,-1.43,-1.86,-2.01,-2.1,-2.21,-2.77,-5.45,-5.27,-4.04,-2.9,-2.81,-3.81,-4.09,-4.11,-3.87,-4.08,-4.1,-3.87,-3.93,-3.25,-2.71,-2.84,-3.08,-2.77,-1.35,-1.63,-1.73,-2.09,-2.54,-2.61,-2.5,-2.33,-2.21,-2.81,-2.95,-2.77,-3.03,-2.72,-2.93,-3.12,-3.24,-3.38,-3.68,-3.79,-3.75,-3.44,-2.94,-3.24,-3.41,-3.21,-2.89,-1.14,-0.37,0.11,0.24,0.24,0.68,1.07,2.07,2.5,1.46,0.84,0.54,0.2,-0.23,-0.28,-0.24,0.48,0.82,1.34,1.4,1.04,1.05,1.24,1.51,1.56,1.62,1.64,1.84,2.58,3.63,3.7,3.27,3.46,4.04,4.1,3.69,2.66,3.06,2.98,2.99,2.09,3.24,3.83,6.4,5.93,5.66,5.41,5.4,5.42,5.5,5.41,5.2,4.74,4.0,3.95,4.14,4.49,4.31,4.4,4.42,4.08,3.48,2.7,2.02,1.74,0.49,-0.27,0.16,0.11,0.46,1.2,0.86,2.29,2.55,1.33,1.69,1.27,0.96,0.79,0.52,0.34,0.78,1.02,1.37,1.97,1.61,0.59,-0.31,-0.2,0.06,-0.58,-0.8,-0.78,-0.55,-0.66,-1.18,-1.09,-0.29,0.08,0.85,0.87,0.35,0.85,1.0,1.53,2.4,3.41,3.74,3.7,2.92,3.38,3.55,3.48,3.05,2.18,1.84,0.66,-0.25,-0.77,-0.46,0.44,0.86,1.08,1.59,0.93,0.85,0.58,0.39,0.65,1.3,1.6,2.09,2.13,1.97,2.09,2.28,2.51,2.3,1.65,2.76,3.47,3.72,3.45,3.12,3.44,3.85,4.45,4.0,3.93,3.7,4.25,4.36,3.91,3.97,3.17,1.24,0.37,-0.13,0.19,0.74,0.89,0.86,0.94,1.29,1.12,1.52,1.06,0.69,0.9,0.4,1.36,1.14,0.96,1.07,1.5,1.41,1.25,0.5,0.51,1.38,0.86,1.8,1.01,3.4,5.48,4.83,4.11,3.21,2.71,1.92,1.67,0.51,0.68,0.96,0.24,-0.19,-0.68,-0.73,-0.74,-1.76,-2.22,-2.46,-3.03,-2.78,-1.82,-2.31,-1.85,-1.58,-0.86,-0.12,0.08,0.46,0.81,0.17,1.55,1.72,2.08,1.86,1.41,1.51,1.31,2.57,2.7,3.15,3.57,3.14,2.82,3.56,3.93,2.55,2.65,2.09,2.36,1.24,1.38,1.22,1.44,1.1,-0.09,-0.81,-1.94,-2.51,-2.25,-0.57,0.39,-1.93,-1.47,1.36,-0.13,-2.61,-2.46,-2.02,-1.58,-1.5,-2.27,-1.52,-1.01,2.16,0.52,0.71,1.02,-0.9,-0.85,-1.85,-1.56,-0.7,-0.02,0.35,-0.44,-0.87,-1.9,-2.14,-2.88,-1.48,-1.45,-1.25,-0.95,-0.62,-0.35,-0.1,-0.58,-0.34,2.15,3.21,2.63,1.95,1.02,-0.11,-0.87,-1.54,-2.43,-2.84,-3.29,-4.07,-3.96,-3.55,-4.15,-2.85,-1.6,-3.61,-1.05,-0.5,-1.17,-0.19,0.6,0.1,-0.12,-0.19,-0.44,-0.58,-1.64,-2.83,-2.11,-2.0,-1.8,-2.41,-3.09,-2.05,-2.87,-2.52,-2.87,-4.21,-4.42,-3.76,-3.44,-3.57,-3.51,-3.35,-2.96,-2.87,-3.38,-2.9,-2.45,-2.4,-1.97,-2.14,-2.38,-2.69,-2.67,-2.49,-2.13,-2.41,-2.36,-2.02,-2.06,-1.41,-1.87,-1.57,-2.08,-2.61,-3.06,-3.59,-3.47,-3.4,-3.32,-3.43,-3.07,-3.15,-2.98,-2.04,-1.16,-0.59,-0.58,-0.39,-0.25,-0.07,0.12,0.71,0.77,1.18,0.94,0.86,0.27,-0.07,0.03,-0.05,0.08,0.7,0.99,0.67,0.23,0.57,0.73,0.32,0.19,0.0,0.24,0.72,1.4,1.86,2.33,2.89,3.22,3.68,4.11,4.5,4.36,4.19,3.93,3.86,3.33,4.07,6.27,5.73,5.65,5.2,5.12,5.11,4.94,4.7,4.43,4.21,3.55,2.83,2.67,3.79,4.13,4.13,4.49,4.48,4.19,3.86,3.54,2.27,1.45,0.26,-1.1,0.69,0.94,0.59,0.29,0.55,1.28,1.04,1.05,1.3,0.85,1.13,0.94,0.61,0.58,0.86,1.39,0.55,1.39,2.0,0.75,1.17,0.91,0.28,-0.21,-0.37,-0.41,-0.85,-0.8,-0.06,-0.82,-0.32,-0.09,-0.05,0.12,0.7,0.75,1.11,1.61,2.15,2.32,2.68,2.89,2.79,3.04,3.17,3.19,2.95,2.4,1.84,1.13,0.51,0.32,0.82,0.66,0.46,0.71,2.99,3.57,3.14,3.27,2.64,1.68,1.85,2.87,3.31,3.93,3.45,3.53,3.69,3.06,2.85,3.7,4.91,5.19,5.03,4.5,5.3,4.58,5.68,5.34,5.26,5.18,5.19,4.92,4.42,4.25,3.05,1.65,0.27,-0.36,-0.26,0.2,0.55,0.95,1.09,1.15,1.29,1.62,0.84,0.82,0.42,0.81,0.78,0.62,1.21,1.26,0.92,0.79,0.62,0.57,0.15,1.39,1.64,1.05,2.9,0.9,4.12,6.36,5.63,3.68,3.18,2.49,2.94,1.91,1.46,0.93,0.27,0.5,0.33,-0.25,-0.19,-0.48,-0.68,-1.82,-2.1,-1.32,-1.09,-1.34,-1.51,-2.17,-2.24,-1.8,-1.06,-0.51,0.19,1.78,1.51,1.43,1.62,1.96,1.96,1.89,1.56,1.61,2.46,2.84,2.84,3.03,2.99,2.88,2.37,2.28,2.67,2.33,2.37,2.28,1.31,1.2,0.71,0.92,1.04,0.49,-0.63,-1.85,-1.89,-3.27,-3.35,-0.04,-1.78,-0.85,-0.54,-1.3,0.81,-2.4,-1.72,-1.36,-1.53,-0.83,0.18,1.03,-0.02,0.77,0.0,-1.28,-0.08,-0.97,-0.99,-2.5,-3.39,-0.42,-0.63,-4.21,-3.39,0.93,-1.11,0.39,-0.63,-0.63,-0.93,-1.27,-1.12,-0.89,-0.52,-0.44,-0.01,1.88,1.7,1.7,1.36,0.78,0.16,-0.69,-1.25,-1.18,-1.99,-2.74,-2.96,-3.62,-2.28,-1.31,-1.58,-2.7,-1.33,-0.79,-0.1,0.25,0.54,0.87,1.01,0.78,0.42,0.19,-0.71,-1.31,-1.95,-2.38,-2.43,-2.32,-2.51,-2.01,-1.57,-2.49,-2.6,-2.88,-3.08,-2.78,-3.77,-3.73,-3.48,-3.59,-3.26,-2.79,-2.94,-3.58,-3.34,-2.51,-2.72,-2.48,-2.61,-2.14,-2.45,-2.31,-2.3,-2.64,-2.68,-2.39,-2.22,-2.0,-1.84,-2.21,-2.04,-1.51,-2.12,-2.95,-3.07,-3.56,-3.69,-3.69,-3.35,-3.21,-2.78,-2.16,-1.75,-1.47,-1.75,-1.56,-1.35,-1.08,-0.98,-0.47,0.1,0.26,0.34,0.54,-0.02,-0.13,0.22,0.34,0.44,0.71,0.74,0.72,0.19,0.29,0.66,0.36,0.4,0.45,-0.15,-0.47,-0.11,0.65,1.15,1.55,1.72,1.75,2.03,2.68,2.85,2.48,2.07,3.16,3.27,4.54,4.73,4.71,4.64,4.37,4.23,4.25,4.24,4.35,3.95,3.66,3.43,2.97,2.92,0.13,3.6,4.36,3.84,3.61,3.85,4.18,4.02,3.49,2.66,1.41,0.21,-0.34,1.45,0.13,0.34,0.33,0.69,0.11,1.06,0.84,1.16,0.9,1.0,1.08,0.95,0.96,0.7,0.75,0.5,1.32,0.92,0.91,1.48,1.53,0.74,0.66,0.08,-0.19,-0.31,-0.86,-0.95,-0.61,-0.61,-0.14,0.16,0.46,0.89,1.45,1.67,2.28,2.62,2.91,2.93,2.9,3.07,2.94,2.49,2.19,1.65,1.33,1.04,0.54,0.28,0.67,1.12,1.02,0.92,1.93,3.25,3.47,3.18,3.67,3.42,4.26,4.02,3.94,4.18,3.97,4.13,3.72,3.72,3.88,4.87,5.49,5.69,5.62,5.69,5.68,5.18,5.29,5.81,5.92,5.56,5.63,5.25,4.36,4.2,4.15,2.78,1.74,-0.61,0.52,0.08,-0.04,0.07,0.67,0.91,0.95,1.22,0.99,0.59,1.0,1.16,0.88,0.7,0.95,0.96,0.95,0.89,1.53,-0.16,-0.15,0.75,1.56,0.39,0.21,2.66,0.38,1.46,5.19,6.08,3.98,3.35,3.3,2.31,1.85,2.57,1.76,0.26,0.33,0.3,0.64,0.41,0.04,-0.45,-0.46,-0.11,-0.07,-0.12,-0.69,-0.75,-0.45,-1.23,-1.22,-1.36,-0.79,0.35,1.5,2.0,1.69,1.86,1.93,1.96,1.86,1.48,1.41,2.46,2.95,3.12,3.42,3.42,3.25,3.1,3.12,2.58,1.59,2.82,3.46,3.27,2.36,2.19,1.22,1.35,0.46,0.03,-0.2,-1.17,-2.13,-2.22,-3.5,0.45,-1.04,-0.25,-0.57,-0.48,-1.65,-1.17,-1.13,-1.19,0.47,0.78,-0.03,0.05,0.39,-0.02,-0.5,-1.39,-0.29,-3.34,-2.8,0.3,-0.46,0.72,1.18,1.04,-1.09,-0.83,-0.43,0.9,-1.07,-1.36,-2.12,-2.06,-1.8,-2.03,-1.12,-0.09,0.68,-0.21,-0.02,0.96,0.63,0.31,0.06,-0.32,-0.29,-0.6,-1.61,-1.36,-1.14,-0.84,-0.46,0.83,1.09,0.61,1.31,1.38,0.08,0.23,0.7,1.16,0.88,0.51,-0.26,-0.63,-1.38,-2.14,-3.5,-3.35,-2.03,-1.79,-1.9,-1.8,-2.13,-2.43,-2.43,-2.76,-2.76,-2.81,-2.95,-2.44,-2.11,-2.47,-2.19,-2.57,-1.67,-0.78,-1.21,-2.16,-2.48,-2.81,-2.35,-1.68,-2.45,-2.76,-2.52,-2.48,-2.74,-2.89,-3.02,-2.96,-2.79,-2.68,-2.93,-3.34,-3.34,-3.55,-3.94,-4.02,-3.78,-3.71,-3.28,-2.7,-2.66,-2.57,-2.61,-2.48,-2.11,-1.8,-1.8,-1.55,-1.26,-0.83,-0.5,-0.45,-0.68,-0.79,-0.45,-0.19,0.1,0.36,0.57,0.63,0.32,0.31,0.71,0.67,0.92,1.03,0.58,0.39,0.23,0.21,0.39,0.9,1.25,1.04,1.1,1.25,1.37,2.0,2.7,2.67,2.68,3.19,3.68,3.51,3.49,3.21,2.72,2.36,2.51,2.49,2.31,1.95,1.71,1.93,2.56,4.2,0.31,3.38,3.95,3.66,3.31,3.38,3.26,3.23,2.81,2.24,1.14,-0.05,-0.76,0.88,-0.71,-0.36,0.37,-0.21,0.01,0.67,0.61,0.79,0.95,1.02,0.94,0.62,0.57,0.76,0.91,1.06,1.05,0.94,0.79,0.92,0.93,0.87,0.78,0.43,0.06,-0.24,-2.03,-0.39,0.26,0.21,-0.33,0.07,0.37,0.34,1.24,2.11,2.56,3.0,3.18,3.36,3.59,3.46,3.42,3.16,2.82,2.08,1.49,0.9,0.58,0.28,0.68,0.99,1.96,1.75,1.74,1.35,1.41,3.25,3.66,3.58,4.75,5.39,4.44,4.15,4.3,4.13,4.15,3.38,3.77,4.08,4.61,4.98,5.03,4.84,4.98,5.25,5.23,6.37,5.8,6.02,5.62,4.82,4.42,4.03,2.21,1.71,0.47,0.99,-0.11,0.55,-0.21,0.21,-0.02,0.65,0.55,0.85,0.84,0.8,0.65,0.79,0.67,0.8,0.79,1.03,0.46,0.78,0.08,0.22,0.48,2.93,1.98,-0.59,-1.36,-0.81,-0.2,2.64,5.23,5.54,3.82,3.03,3.47,4.41,3.0,2.75,2.97,1.02,1.02,0.42,0.43,0.62,0.24,0.03,0.43,0.29,-0.23,0.04,-0.02,-0.73,-1.08,-0.5,-0.72,-0.48,-0.66,0.06,0.39,1.52,2.4,2.29,1.83,1.63,1.81,1.52,1.36,2.21,2.37,3.12,3.23,3.3,3.56,3.33,3.23,3.17,3.42,3.04,3.12,2.85,2.72,2.59,2.07,0.61,0.25,0.6,0.54,0.81,0.12,-0.96,-2.55,-1.56,-1.17,-0.15,-0.01,-1.32,0.21,-0.92,-0.58,-0.51,0.93,0.99,0.04,-0.03,-0.6,-0.48,-0.27,-0.82,-0.89,-3.5,-1.5,-1.67,0.42,-1.42,1.34,-0.41,-0.73,-0.11,0.69,2.04,-0.62,-0.69,-1.02,-0.02,0.58,-2.37,-2.76,-0.77,-0.8,-2.0,-1.4,-0.65,-0.53,0.21,0.49,-0.01,-0.64,-0.86,-0.17,-0.86,-0.63,0.03,-0.13,0.46,2.44,4.05,2.58,1.46,1.71,2.08,1.27,1.08,0.89,0.7,0.62,-0.49,-1.33,-1.89,-2.26,-1.87,-2.76,-2.71,-1.83,-2.31,-2.51,-2.32,-1.73,-1.53,-2.42,-2.5,-2.31,-1.57,-0.41,-0.51,-0.59,-0.53,-0.17,-0.53,-0.9,-0.74,-0.79,-2.07,-2.51,-2.33,-1.97,-2.55,-2.6,-2.36,-2.9,-3.26,-3.35,-3.55,-3.44,-3.3,-3.82,-4.05,-3.97,-3.92,-4.05,-4.21,-4.16,-3.86,-3.64,-3.48,-3.33,-3.0,-2.79,-2.71,-2.74,-2.97,-2.89,-2.46,-2.17,-1.77,-1.57,-1.73,-1.91,-1.99,-2.01,-1.69,-1.27,-0.9,-0.44,-0.43,-0.45,0.18,0.73,0.63,0.83,0.79,0.27,0.24,0.41,0.65,1.06,1.37,1.46,1.59,1.3,1.45,1.89,2.3,2.67,2.99,3.26,3.68,4.05,4.1,3.82,3.12,2.58,2.46,1.99,1.48,0.74,-0.12,-0.07,0.46,1.69,2.56,0.18,1.63,2.31,2.88,3.33,3.24,2.76,2.64,2.63,2.54,1.88,-0.61,0.88,-0.48,-0.55,-0.06,-0.65,-0.48,-0.18,0.2,0.14,0.27,0.64,0.89,0.88,0.51,0.65,0.77,1.01,0.74,0.79,0.58,0.16,0.08,0.3,0.29,0.27,0.57,0.04,-1.12,-0.52,-0.61,-0.62,0.86,0.67,-0.11,-0.87,-0.83,-0.07,0.57,1.39,2.22,3.21,3.89,4.29,3.88,3.51,3.83,3.48,2.77,1.01,0.24,0.11,0.06,0.01,0.58,0.71,0.4,0.06,0.41,1.36,2.11,3.35,4.27,4.45,4.65,4.59,4.51,4.45,4.47,4.68,5.06,4.34,4.27,4.2,4.42,5.02,4.65,4.8,5.32,6.3,6.48,6.84,6.21,5.74,5.8,5.61,3.55,1.97,0.83,0.53,-0.54,-0.8,-0.15,0.38,0.75,-0.25,0.13,0.4,0.44,0.41,0.44,0.4,0.52,0.82,0.8,0.98,1.43,1.01,1.05,1.22,0.92,2.64,3.77,2.02,0.08,-1.15,1.15,0.68,2.07,5.36,5.45,3.57,4.81,4.63,3.68,3.33,3.13,3.01,3.3,2.69,1.85,1.7,1.13,0.8,0.23,0.35,0.1,0.14,-0.3,-0.59,-0.4,-0.42,-1.13,-0.68,-0.66,-0.58,-0.1,0.25,0.71,1.51,2.35,2.65,1.76,1.04,1.32,1.96,2.31,3.51,3.19,3.45,3.07,3.24,3.18,3.1,3.49,3.4,3.05,2.98,2.44,1.83,1.8,1.32,0.77,0.59,0.52,0.73,0.53,0.73,0.44,0.74,-0.41,-0.01,-0.51,0.59,0.21,0.67,-0.01,0.32,0.28,-0.6,-0.06,0.46,-0.21,-0.48,-0.1,-0.33,0.98,-1.06,-2.38,-1.33,-1.0,-0.12,2.94,-0.36,-1.57,0.51,-0.28,0.09,1.69,-1.12,1.13,1.03,2.4,1.56,0.37,-1.06,1.52,-4.9,-1.49,-3.0,-4.07,-1.86,-0.53,0.15,0.25,-0.33,-0.1,-0.39,0.42,1.67,1.0,0.77,3.72,4.19,1.13,1.99,2.96,2.49,2.36,2.86,2.9,2.49,1.83,0.98,-0.1,-1.51,-1.59,-1.93,-2.99,-4.46,-3.68,-3.2,-2.73,-2.63,-2.52,-2.36,-1.16,-1.75,-1.81,-0.53,0.74,-0.37,-0.03,-0.02,-0.74,-1.17,-1.49,-1.96,0.04,0.26,-0.93,-2.65,-3.13,-3.14,-3.14,-3.27,-3.36,-3.54,-3.42,-3.28,-3.18,-3.26,-4.13,-3.81,-3.92,-3.68,-4.0,-4.31,-3.69,-4.28,-4.28,-3.99,-3.76,-3.52,-3.19,-2.99,-3.21,-4.08,-3.9,-3.93,-3.66,-2.85,-2.66,-2.46,-2.43,-2.69,-3.08,-3.78,-3.17,-2.41,-1.92,-1.37,-1.29,-0.72,-0.16,0.11,0.38,0.54,0.28,0.08,0.05,0.4,0.82,1.11,1.23,1.64,2.08,2.23,2.74,3.26,3.5,3.67,4.08,5.31,5.24,5.28,4.91,4.15,3.67,3.2,2.3,1.93,1.61,1.25,0.49,0.19,0.6,0.01,0.18,0.6,0.83,1.36,1.74,2.11,2.72,2.36,2.44,3.03,3.18,1.39,0.43,-0.47,-0.37,0.28,-0.29,0.04,-0.02,-0.16,-0.41,-0.55,-0.37,-0.22,0.42,0.49,0.24,0.44,0.36,0.23,-0.16,0.28,0.1,0.11,0.64,0.45,0.8,0.5,0.53,0.82,0.4,-0.29,-0.68,0.18,0.04,0.01,0.13,0.05,-2.33,-2.12,-0.67,0.57,1.71,2.7,3.9,4.24,4.62,4.56,4.26,3.92,3.34,1.58,-0.42,-0.4,-0.58,-0.38,-0.02,0.13,0.59,1.0,-0.17,2.55,3.51,3.69,4.04,4.31,4.61,4.79,4.92,4.85,4.8,4.86,4.94,5.0,4.37,3.99,3.88,5.03,5.53,5.53,5.92,6.24,6.43,6.63,6.57,6.15,5.88,5.36,4.7,3.83,1.97,0.74,-0.29,-0.32,-0.64,-0.33,-0.26,-0.16,-0.02,-0.59,-0.71,-0.18,0.24,0.44,0.47,0.43,0.75,1.06,0.79,0.37,0.42,0.52,1.01,2.44,4.32,1.65,0.27,-0.59,1.9,0.6,2.67,5.21,4.57,5.72,5.56,5.24,4.7,3.89,3.44,3.83,3.66,3.22,3.76,3.51,2.81,1.66,0.85,1.28,0.69,-0.47,-0.52,-0.24,0.33,0.13,-0.17,-0.31,-0.82,0.77,0.54,0.31,0.46,0.2,0.94,1.2,1.42,1.6,1.93,1.66,1.98,2.4,2.89,2.75,2.76,2.84,2.87,2.53,3.16,3.26,2.89,2.8,2.16,1.8,1.45,1.65,0.99,0.5,0.29,0.18,0.47,0.92,0.44,0.93,1.12,1.13,0.7,-0.12,0.16,0.4,1.95,1.62,0.74,0.38,2.14,1.8,0.79,1.38,0.7,0.17,0.53,-1.09,-1.75,-0.69,-0.34,1.07,-0.1,0.62,-0.54,0.25,0.73,0.4,-1.31,-0.79,-1.92,-1.18,1.21,0.34,-0.53,-3.12,-1.67,-0.82,0.22,0.0,-0.22,-0.73,-2.78,-2.53,-1.32,-0.34,1.05,0.79,0.34,0.72,1.12,2.67,0.77,3.79,4.17,3.12,3.51,3.22,2.58,2.72,2.73,2.67,2.02,1.78,0.71,0.46,-0.59,-0.84,0.26,-0.57,-2.24,-1.53,-1.14,-1.34,-0.44,-0.47,-0.42,-0.63,0.15,0.46,0.82,0.5,-0.74,-1.01,-1.13,-1.45,-2.09,-2.51,-1.66,0.08,-1.43,-2.32,-2.93,-2.76,-2.8,-2.76,-3.08,-3.76,-3.86,-3.43,-3.33,-3.55,-3.41,-3.79,-4.16,-5.27,-4.23,-3.36,-4.06,-4.07,-4.51,-4.4,-4.03,-3.76,-3.72,-3.73,-2.49,-1.8,-2.29,-3.1,-2.81,-3.27,-3.08,-2.99,-2.73,-2.83,-3.28,-2.77,-2.6,-3.14,-2.5,-1.84,-1.36,-0.59,-0.12,0.1,-0.27,-0.99,-0.93,-0.26,0.01,-0.08,0.44,0.94,1.69,1.94,2.12,2.64,3.11,3.52,3.78,3.75,3.74,4.19,4.18,4.28,4.56,4.21,4.2,3.68,2.99,1.87,1.27,2.1,2.48,1.6,1.49,1.17,1.21,1.95,1.98,2.18,1.7,1.81,1.85,2.09,2.9,3.82,4.57,2.95,-0.66,-1.52,0.11,0.87,0.39,0.3,-0.6,-0.71,-0.76,-0.63,-0.48,-0.75,-0.41,0.28,0.44,0.05,0.21,0.63,0.31,0.66,0.45,0.33,0.37,0.62,0.62,1.01,0.84,0.87,1.05,0.66,0.41,0.43,0.5,-0.49,-0.62,-0.86,-0.34,-0.59,-0.47,2.34,1.68,2.69,3.58,4.48,5.15,5.29,4.77,4.8,4.31,2.04,-0.51,-1.22,-1.23,-1.06,-0.39,1.22,0.97,-0.97,3.86,3.27,3.37,3.64,4.12,4.39,4.82,5.16,4.93,4.84,5.02,5.11,4.93,5.05,5.32,5.65,5.29,4.9,5.19,5.74,5.76,5.98,6.65,6.85,7.06,6.92,6.66,6.08,5.2,4.39,3.79,2.55,1.3,0.01,-0.45,-1.4,-0.84,-0.32,-0.01,0.1,-1.19,-0.4,0.43,0.57,0.16,0.17,0.42,0.62,0.27,0.42,1.01,-1.08,0.66,1.69,1.25,1.39,0.05,-0.53,0.95,1.29,0.71,2.91,3.63,4.53,5.14,5.24,5.45,5.33,4.98,4.7,4.57,3.94,3.56,3.28,3.6,4.0,3.08,1.19,0.98,0.48,0.0,-0.09,-0.88,-0.74,-0.5,-0.85,-0.58,-0.25,0.21,0.72,0.84,0.5,0.43,0.6,0.47,0.52,0.31,0.81,1.29,1.79,2.2,2.22,2.02,2.21,2.23,2.69,3.49,2.76,2.45,2.07,0.98,0.51,1.27,0.33,0.53,0.33,0.1,0.33,0.5,1.03,1.52,1.8,1.21,0.58,1.57,0.76,-0.06,0.48,2.64,2.12,1.07,0.56,0.77,0.37,0.93,1.01,1.63,1.1,0.58,-1.23,-0.9,2.13,-1.51,-0.71,-0.47,0.57,1.64,1.17,2.28,1.2,2.03,0.28,0.95,0.92,-0.56,0.11,2.49,0.52,0.17,0.51,-0.52,-0.73,-1.38,0.15,-0.67,-1.43,-1.82,-3.17,0.15,1.92,1.26,0.64,0.32,-0.39,0.57,0.47,4.05,3.52,2.59,2.42,2.92,2.64,2.62,2.95,2.72,1.85,2.64,1.9,0.61,0.89,0.98,1.1,0.24,0.69,0.53,0.54,-0.72,0.24,0.65,0.25,1.24,1.98,0.61,0.99,0.78,0.61,0.8,-0.1,-0.56,-0.59,-1.23,-1.96,-1.68,-2.88,-3.04,-2.73,-2.33,-2.13,-2.93,-3.36,-3.77,-3.92,-3.86,-3.27,-2.97,-2.83,-2.73,-3.63,-3.06,-3.44,-3.58,-3.32,-3.52,-3.55,-3.6,-3.56,-3.43,-1.83,-1.98,-2.01,-2.36,-1.99,-2.48,-2.53,-3.1,-2.6,-2.32,-1.99,-1.86,-1.62,-2.23,-3.39,-2.6,-2.16,-1.44,-1.22,-0.98,-0.71,-0.76,-1.02,-0.99,-0.43,-0.43,-0.07,1.56,1.4,1.0,1.3,2.16,2.77,2.85,2.69,2.7,2.87,2.79,2.9,3.23,3.47,3.58,3.6,3.84,4.2,3.86,3.05,2.38,2.05,2.82,3.12,2.39,2.09,2.22,2.19,2.72,2.6,2.8,2.88,2.33,1.85,2.42,3.71,5.48,2.13,0.3,-0.65,-0.32,0.69,-0.06,-0.44,-0.94,-0.97,-0.44,-0.65,-0.91,-1.04,-0.94,-0.53,-0.31,0.66,0.79,0.91,0.87,0.09,0.25,-0.21,0.07,0.77,0.64,1.0,1.02,0.98,0.83,0.58,0.37,-0.27,0.32,0.24,-0.8,-1.34,-1.42,-1.48,-1.15,-0.3,0.73,1.46,3.94,5.23,5.52,6.0,5.81,5.55,5.06,3.49,-0.62,-2.14,-2.04,-1.45,0.4,1.6,1.47,4.35,3.4,2.94,3.1,3.53,3.63,4.1,4.41,4.62,4.82,5.15,4.79,4.96,4.88,5.11,4.98,4.99,5.4,5.53,5.53,4.95,5.68,6.11,6.95,7.08,6.58,6.38,6.55,6.04,6.01,6.13,5.7,5.14,4.06,3.0,1.65,0.96,0.21,0.58,0.95,0.66,0.89,0.53,0.7,1.05,0.39,-0.29,-0.23,0.31,0.4,-0.16,-0.47,-0.43,0.0,0.05,0.73,0.82,0.56,-0.09,-0.9,0.71,1.5,2.37,1.81,3.43,4.41,4.22,4.17,4.3,4.55,4.82,5.39,4.91,4.26,3.71,3.94,4.27,3.71,3.3,2.15,0.5,-0.28,-0.57,-0.23,-0.72,-0.83,-1.28,-1.05,-0.37,-0.1,-0.16,0.23,0.62,0.43,0.3,0.26,0.35,0.36,0.7,0.78,1.07,1.26,1.12,0.99,1.15,1.94,2.07,2.34,2.23,2.07,2.06,2.1,1.83,1.46,0.92,0.82,0.05,0.0,0.28,1.11,0.86,1.34,2.03,2.02,2.32,0.3,1.48,1.02,0.28,1.18,1.62,0.97,1.29,1.23,1.18,1.56,1.66,1.61,2.16,2.29,1.19,1.22,1.21,-0.36,-0.25,0.16,0.26,0.59,1.12,1.13,0.77,0.91,1.31,1.65,0.76,-0.35,-0.09,-0.71,1.12,3.52,4.53,1.47,0.28,1.68,-0.1,-0.91,-1.66,-1.67,-0.58,-1.05,2.28,1.3,-1.84,-1.51,-3.31,1.86,4.75,1.32,3.28,3.23,2.59,2.75,2.58,2.58,2.26,1.92,2.5,2.72,2.51,1.74,2.34,2.38,1.58,1.97,2.02,1.93,2.25,2.5,1.39,1.24,1.08,1.28,1.9,1.94,2.3,2.29,2.47,1.8,0.23,-0.75,-1.77,-2.37,-2.81,-2.76,-3.51,-3.29,-3.49,-3.03,-2.7,-2.45,-2.9,-3.19,-3.7,-3.83,-2.78,-2.42,-1.68,-0.58,-0.44,-2.01,-2.55,-3.4,-3.83,-3.65,-3.31,-3.24,-2.77,-2.42,-2.29,-1.85,-1.71,-1.57,-1.2,-1.34,-1.3,-1.59,-1.91,-1.48,-1.25,-0.69,0.03,-0.14,-1.19,-2.93,-2.44,-1.58,-1.06,-0.69,-0.66,-0.82,-0.73,-0.96,-0.71,0.69,1.05,1.43,1.24,1.16,1.19,1.57,2.11,2.99,2.85,2.74,2.56,2.28,2.37,2.35,2.95,2.91,2.65,2.57,3.06,3.39,2.85,2.48,3.18,3.27,3.17,3.09,2.8,2.59,2.52,3.06,3.58,3.79,3.46,3.12,2.66,2.96,3.73,4.14,3.05,-0.05,-0.1,-0.3,-0.39,0.16,-0.97,-0.86,-0.86,-0.68,-0.77,-0.23,-0.71,-0.44,-0.09,-0.05,0.93,1.04,0.72,0.32,-0.05,-0.97,0.3,0.58,0.23,0.7,0.97,1.04,0.76,0.42,0.17,0.34,0.23,-0.65,-0.19,-0.33,-1.37,-1.4,-1.47,-0.26,-1.09,-0.41,-0.48,0.87,3.13,6.01,6.45,6.37,5.9,5.19,3.8,0.12,-3.5,-2.82,-1.53,0.25,2.33,4.63,3.45,3.09,3.08,3.26,3.33,3.63,3.96,3.94,3.97,4.35,4.5,5.13,5.16,5.04,5.1,5.22,5.23,5.24,5.62,5.66,5.92,6.4,6.67,6.65,6.75,6.81,6.2,5.49,5.63,6.28,5.98,5.96,5.61,4.96,4.28,4.58,1.76,0.52,1.45,0.98,0.78,1.27,1.31,0.85,0.53,0.18,0.43,0.59,1.08,0.76,0.65,-0.27,0.12,-0.12,1.44,0.78,0.07,0.87,-0.97,0.16,0.79,1.82,3.95,3.9,3.21,3.26,3.56,3.82,3.97,4.02,4.52,5.15,5.13,4.97,4.91,5.01,5.5,5.24,4.5,3.64,2.32,0.62,-1.15,-1.55,-1.36,-1.18,-1.07,-0.86,-0.88,-0.54,-1.02,-1.24,-1.0,-0.8,-0.19,0.63,0.82,0.98,0.58,0.28,0.38,0.4,0.34,0.49,0.82,1.39,1.78,2.25,1.74,1.89,1.79,1.7,1.74,1.36,1.33,0.71,0.17,0.59,0.93,1.2,1.58,1.72,2.41,3.49,4.11,2.64,1.12,3.41,0.85,-2.05,-2.93,-0.38,2.0,1.17,2.18,2.22,2.27,2.53,2.74,2.34,1.41,1.85,2.92,-0.45,0.5,1.47,0.87,1.23,1.42,1.58,2.04,1.09,1.87,2.05,0.88,1.23,0.15,-1.08,2.46,1.81,2.2,3.05,0.38,0.41,0.34,0.89,1.74,0.04,0.02,-0.09,-1.45,4.34,3.55,2.1,2.18,2.82,4.05,3.71,0.64,2.24,2.75,2.44,3.0,3.46,3.19,2.97,2.35,1.89,2.47,2.87,2.37,2.24,2.15,2.08,2.08,2.09,2.18,2.12,1.96,2.01,2.14,2.55,3.07,3.52,3.17,2.91,2.86,1.85,0.01,-1.99,-2.73,-2.7,-3.43,-3.93,-3.09,-3.11,-3.21,-3.5,-2.73,-2.85,-2.63,-2.86,-3.11,-3.28,-2.92,-1.95,-1.22,-0.94,-1.01,-2.7,-2.31,-2.46,-2.98,-3.1,-2.67,-2.58,-3.3,-2.16,-2.7,-2.18,-1.05,0.12,-0.59,-0.32,1.03,1.35,1.2,0.29,0.24,0.57,0.56,0.83,-0.06,-1.81,-2.5,-1.87,-1.43,-0.4,-0.09,0.16,0.03,-0.27,-0.27,0.33,1.01,1.52,2.19,1.17,0.92,1.37,2.26,2.47,3.07,3.15,3.3,3.37,3.05,3.12,2.88,2.92,3.07,2.9,2.75,2.77,2.76,2.36,2.54,3.11,3.13,3.21,3.24,3.7,3.1,2.75,3.79,4.33,3.82,3.38,3.04,3.41,4.07,4.83,4.76,3.21,-0.45,1.57,0.68,-0.14,-0.75,-0.99,-1.1,-0.13,0.42,0.68,0.81,0.96,1.11,1.02,0.89,1.02,0.55,0.28,0.54,1.0,0.3,1.12,0.69,0.88,0.97,0.3,0.54,0.03,0.61,0.43,0.26,-0.64,-0.98,0.42,0.55,-0.96,-2.78,-0.45,-2.0,-2.69,-0.86,1.9,2.32,3.85,6.4,6.29,6.39,6.27,6.45,3.69,0.8,-1.85,-1.12,0.24,1.81,2.8,2.9,2.87,3.1,3.2,3.1,3.25,3.1,3.28,3.09,3.04,3.45,3.84,3.5,3.97,4.66,4.98,5.08,5.36,5.68,6.17,5.88,6.17,6.4,5.14,5.58,6.28,6.58,6.31,5.54,5.5,5.79,5.68,5.69,5.65,5.48,5.15,2.22,1.87,0.96,1.13,0.49,1.11,1.86,1.47,1.12,1.31,1.22,1.48,1.52,1.27,1.4,0.4,1.65,-0.71,0.54,0.35,0.35,-0.01,-0.05,0.0,1.94,2.63,2.31,4.15,2.7,2.15,2.93,3.43,3.49,3.64,4.24,4.75,4.98,5.22,5.68,6.3,6.51,6.02,5.74,5.11,4.12,3.06,0.2,-1.32,-1.46,-1.44,-1.23,-1.54,-1.61,-1.19,0.04,-0.27,-0.58,-0.87,-1.31,-0.43,0.1,0.08,-0.02,0.18,-0.01,-0.43,-0.85,0.18,1.25,1.79,2.42,1.67,1.73,1.7,1.54,1.4,1.15,1.21,1.47,0.24,0.6,0.5,1.02,0.71,1.05,2.14,3.09,4.69,5.3,4.7,3.18,3.08,1.71,2.53,0.49,-1.53,-1.71,-1.59,0.69,-0.38,0.33,1.37,3.31,2.42,1.36,1.35,0.96,0.59,0.17,0.36,0.77,1.94,2.11,2.55,2.62,2.47,2.09,2.21,-1.69,2.62,1.84,3.74,1.58,1.85,1.54,0.06,-0.08,-0.98,-0.14,1.0,1.77,1.5,1.37,0.17,0.89,2.55,2.95,3.21,3.5,3.38,2.98,2.6,4.48,2.37,0.49,1.13,3.57,3.29,3.13,2.86,3.13,2.94,1.97,1.57,1.84,1.8,2.23,2.42,2.82,2.49,1.93,1.9,2.02,2.21,1.9,1.62,1.76,2.7,3.31,3.88,4.39,4.02,0.18,-4.0,-3.26,-2.53,-2.0,-3.28,-2.73,-2.45,-2.65,-3.23,-2.84,-3.09,-2.98,-2.35,-2.39,-2.9,-2.73,-2.17,-1.35,-0.3,0.24,-2.93,-2.18,-2.0,-1.82,-1.65,-1.8,-1.27,-2.16,-2.98,-2.57,-1.87,-0.5,0.05,-0.21,0.12,1.45,1.83,1.76,1.69,1.2,1.11,1.51,1.88,1.28,-0.03,-1.9,-2.06,-0.32,0.43,1.22,1.0,0.15,-0.11,-0.09,0.18,0.25,0.94,1.72,1.86,1.65,1.65,2.39,2.56,2.79,2.97,3.19,3.3,3.36,3.26,3.21,3.38,3.67,3.9,3.48,3.01,2.61,2.54,2.68,2.86,2.96,4.05,4.51,4.95,4.76,4.07,3.6,4.42,4.15,3.76,3.89,3.47,3.87,4.91,4.49,4.79,-1.39,-1.47,-0.1,0.78,0.23,0.39,-0.24,0.17,-0.14,0.8,1.02,1.14,1.25,1.34,0.68,0.92,0.8,0.84,0.96,0.66,0.88,0.71,1.39,0.97,0.98,0.42,0.24,0.64,0.86,0.52,0.79,-0.39,-0.91,-0.88,-0.03,0.63,0.84,-0.99,-1.79,-1.01,-0.11,0.2,4.57,3.5,2.48,5.53,5.78,5.57,5.17,5.23,4.88,3.57,2.37,2.09,2.39,2.73,2.97,3.12,3.19,3.27,3.06,2.74,2.6,2.49,2.81,2.72,2.58,2.6,2.98,3.45,3.59,3.96,4.96,5.19,5.42,5.41,5.92,5.42,5.32,5.31,5.45,5.83,6.35,6.52,6.57,6.58,6.67,6.48,6.21,5.73,5.59,5.25,4.02,1.04,0.83,1.35,0.96,0.71,1.43,1.26,1.74,1.65,1.09,1.26,1.45,0.26,0.76,0.71,0.03,-0.56,-0.62,0.53,-0.35,1.01,0.25,1.32,0.29,1.33,1.9,3.28,2.58,1.43,1.74,2.49,3.37,3.44,3.89,4.73,5.05,5.42,6.05,6.69,7.1,6.85,6.32,5.73,5.31,3.87,2.56,-0.07,-1.4,-0.44,-0.11,-0.5,-0.62,-0.84,-0.67,0.15,-0.21,-0.78,-0.99,-0.54,0.14,0.29,0.41,0.38,0.05,-0.76,0.32,-0.23,-0.25,1.46,2.45,1.16,0.97,1.11,1.31,0.85,0.43,1.31,0.36,-0.54,0.49,1.36,0.79,0.73,0.41,1.0,1.89,0.81,3.84,4.98,4.59,3.02,2.02,0.88,2.5,2.45,3.96,5.94,2.67,4.11,-0.09,-0.86,-2.74,0.9,0.12,-1.29,2.07,-1.75,-1.79,-1.25,-1.81,-2.31,0.4,0.76,1.77,2.73,3.51,3.19,3.97,2.31,1.7,1.93,1.81,1.95,1.44,-0.37,0.34,1.48,-0.64,-1.75,-1.08,3.59,3.63,1.87,-0.83,-1.38,1.49,2.66,2.85,3.26,3.08,1.85,1.26,2.46,0.55,4.84,1.31,1.95,4.81,3.9,3.68,3.27,2.6,1.5,1.91,2.3,2.15,2.31,2.5,2.84,2.87,2.81,2.64,2.63,2.68,2.75,2.89,3.53,3.88,4.23,4.75,6.42,3.22,-4.74,-4.45,-2.63,-1.63,-3.71,-2.46,-1.6,-2.38,-2.02,-1.95,-4.36,-3.49,-2.31,-2.25,-2.89,-3.16,-3.05,-1.52,-0.7,0.85,-0.91,-2.06,-1.61,-1.39,-1.46,-1.27,-0.92,-0.68,-1.7,-1.18,-0.58,-0.26,-0.08,0.19,0.7,0.54,0.94,0.9,1.27,1.22,0.83,1.16,1.69,2.18,0.98,-0.14,-1.17,-1.2,0.39,0.68,0.78,0.1,-0.16,-0.24,-0.29,0.17,0.56,1.35,2.04,1.89,2.08,1.74,1.87,2.2,2.54,2.69,2.76,2.82,2.79,2.92,3.13,3.08,3.8,4.12,3.69,3.05,3.62,3.33,3.13,3.2,4.32,5.57,6.01,6.78,5.98,5.4,4.55,4.68,3.89,4.08,3.61,4.12,4.81,5.02,3.93,1.59,-1.19,1.09,0.9,0.28,0.29,0.42,0.57,0.67,0.31,0.94,1.04,1.27,1.21,1.25,1.11,1.14,1.23,1.03,1.06,0.78,0.93,0.67,1.2,0.92,0.48,0.54,0.68,0.77,0.86,0.81,0.88,-0.97,-0.65,-0.14,1.26,2.21,1.04,2.76,1.24,0.82,0.2,0.8,2.08,1.87,4.64,5.08,5.2,4.52,4.14,3.33,2.45,2.39,2.94,2.67,2.69,2.96,2.79,2.46,2.51,2.97,2.82,2.59,2.36,2.28,2.44,2.35,2.57,3.19,3.79,3.96,4.05,4.45,4.68,4.45,4.62,4.78,5.07,5.35,5.54,5.74,5.82,6.1,6.34,6.81,7.18,7.52,7.62,7.32,6.59,5.99,5.7,4.91,1.16,0.93,0.94,1.17,1.17,1.39,1.74,1.6,1.45,1.24,0.54,0.77,-0.08,0.72,0.92,0.65,-0.23,-0.53,0.05,0.81,1.61,0.69,-0.39,-0.3,1.46,2.07,5.45,1.8,1.49,0.73,1.08,1.99,2.57,3.27,4.23,5.57,6.32,6.47,6.98,7.36,7.27,6.5,6.08,5.47,3.72,2.32,1.25,0.65,0.46,-0.15,-0.49,-1.5,-1.94,-1.03,0.57,0.2,0.07,-0.42,-0.66,-1.28,-1.22,-0.56,0.59,1.14,-1.62,-0.22,0.13,-0.32,1.19,1.77,1.49,0.52,0.46,1.03,0.76,0.34,0.86,-0.14,-0.21,0.33,0.97,1.07,0.48,-0.32,0.72,0.34,1.16,1.13,2.71,3.3,4.24,4.04,3.37,3.15,2.98,3.13,3.14,2.17,1.84,1.16,1.52,1.06,4.46,1.77,2.96,-1.3,1.67,2.59,2.32,-0.18,-2.59,-2.51,2.41,0.82,1.96,2.31,2.61,3.1,3.53,2.15,1.65,1.58,1.86,2.07,2.42,1.46,4.28,1.07,1.82,1.57,2.14,1.84,-0.03,0.58,-1.5,-1.99,-0.59,3.14,4.1,3.18,2.13,1.54,1.98,2.58,2.06,2.86,2.94,0.54,3.84,3.76,3.28,2.04,2.17,1.91,2.09,2.17,2.53,2.63,2.94,3.31,3.25,2.81,3.0,3.34,3.91,3.99,4.05,4.1,4.34,5.26,6.04,3.91,-1.11,-3.29,-3.13,-1.96,-3.24,-2.58,-1.32,-2.25,-2.01,-1.9,-3.25,-3.22,-2.4,-2.72,-3.31,-2.88,-2.79,-2.79,-1.73,-0.39,-0.74,-1.6,-2.7,-2.86,-2.0,-1.43,-0.75,0.1,-0.14,-0.52,-1.19,-1.07,-0.17,0.57,0.76,0.06,-0.61,-0.31,-0.27,0.34,0.6,0.78,1.09,1.61,2.16,1.27,0.2,1.09,1.12,0.63,0.27,0.08,-0.57,-0.64,-0.26,0.15,0.64,0.87,0.99,1.49,0.9,0.94,1.53,2.11,2.34,2.77,2.91,2.72,2.55,2.55,2.53,2.43,2.75,3.78,3.5,3.55,3.37,3.21,3.48,4.36,4.91,5.14,5.57,6.22,6.51,6.52,5.81,5.25,4.67,4.33,4.41,4.19,4.55,5.45,6.26,5.82,-1.52,-0.96,0.06,0.38,0.69,0.76,0.73,0.54,0.59,0.95,1.27,1.37,1.5,1.53,1.26,1.33,1.37,1.41,1.12,1.1,1.12,1.18,1.32,1.37,1.1,1.27,1.19,0.64,0.48,1.22,1.08,0.87,-0.38,0.15,0.66,1.92,2.22,1.4,1.11,2.19,0.63,0.2,0.37,2.88,3.53,3.96,4.62,4.32,3.74,2.91,2.84,3.02,2.62,2.48,2.31,2.53,2.5,2.6,2.7,2.84,3.09,3.06,2.91,2.65,2.49,2.62,2.7,3.01,3.58,4.18,3.83,4.13,4.72,4.66,4.86,4.97,5.19,5.33,5.49,5.97,6.12,6.3,6.38,6.73,7.23,7.61,7.42,7.07,6.43,5.79,5.26,5.26,2.11,1.96,1.41,1.17,1.38,0.86,1.32,1.13,0.88,1.44,1.28,1.29,1.1,0.47,1.1,1.16,1.13,1.1,-0.07,-0.66,0.24,-1.36,-0.61,-0.27,1.03,1.46,4.35,2.42,0.9,0.18,-0.83,-0.02,0.88,2.37,4.33,5.9,6.82,7.21,7.32,7.28,7.14,6.29,5.72,5.53,4.79,3.02,1.68,0.5,0.03,-0.83,-1.68,-1.69,-1.47,-0.81,-0.01,0.25,0.07,0.03,0.16,-0.14,-0.62,-0.82,-0.46,0.35,-0.69,-0.19,-0.59,0.52,1.96,2.22,1.69,0.66,1.11,0.9,0.57,0.0,-1.2,-0.68,-0.44,0.46,0.73,0.32,0.58,0.72,0.85,1.69,2.55,3.01,2.45,2.39,2.92,3.13,3.54,3.24,3.2,3.46,3.0,2.49,1.88,2.28,0.95,0.75,1.12,0.99,0.49,2.67,1.76,0.06,-0.26,-1.27,2.03,-0.88,-0.24,0.72,1.5,1.84,2.39,3.12,3.48,2.5,0.55,0.62,1.16,1.2,0.84,0.34,0.6,0.74,1.52,1.72,2.28,3.41,2.38,1.94,2.46,1.4,-1.97,1.31,2.93,2.6,1.43,0.48,0.72,0.98,1.86,3.7,3.1,1.01,4.4,3.52,2.82,2.72,1.97,2.21,2.37,2.51,3.0,3.41,3.38,3.25,3.3,3.87,4.2,4.52,4.47,4.48,4.58,5.52,5.6,6.03,5.31,4.46,1.45,-1.34,-2.32,-3.02,-3.41,-3.04,-2.8,-2.42,-2.08,-2.61,-2.78,-2.61,-2.73,-2.75,-3.26,-2.62,-2.5,-2.21,-2.73,-1.7,-1.53,-1.54,-3.3,-2.37,-1.79,-1.31,-1.16,-1.31,-0.43,0.15,0.29,1.1,1.14,1.22,0.42,-0.34,-0.81,-1.16,-1.13,-0.88,-0.56,-0.03,0.42,0.89,1.13,1.1,1.7,1.25,0.91,1.17,1.3,0.99,0.92,0.45,0.21,0.44,0.46,0.85,0.84,1.3,1.07,0.59,1.63,1.69,2.54,3.23,3.39,2.94,2.63,2.36,2.16,2.05,1.95,2.68,3.23,3.29,3.04,3.07,3.97,4.73,4.8,4.97,5.53,5.76,6.26,5.9,5.52,5.53,5.39,5.26,4.6,4.62,4.35,4.85,6.47,6.72,0.84,-1.26,-0.83,-0.17,0.91,0.51,1.22,1.13,1.12,1.42,1.54,1.66,1.68,1.43,1.2,1.91,1.64,1.58,1.29,1.15,1.32,1.75,1.97,0.8,1.36,0.86,1.22,1.06,1.69,0.73,1.11,0.5,1.64,0.98,1.11,2.08,0.71,2.2,2.87,1.01,1.06,-0.11,0.5,2.29,2.64,2.87,3.4,3.59,3.3,3.01,2.43,2.12,1.99,1.92,2.13,2.33,2.56,2.71,2.74,3.13,3.05,3.0,3.21,2.98,2.9,2.67,2.72,2.35,2.68,3.04,3.17,4.01,4.11,4.59,4.91,5.1,5.3,5.44,5.56,5.97,6.36,6.68,6.79,6.95,7.21,7.33,7.28,6.92,6.29,5.45,4.44,3.59,1.38,1.08,1.29,1.46,0.4,0.58,0.67,1.16,1.19,0.18,1.05,1.48,0.26,0.27,1.03,1.06,1.03,0.28,0.66,-0.01,-1.77,-0.08,-0.65,-0.59,0.72,0.48,1.87,2.73,0.41,-0.49,-1.32,-1.94,-0.95,1.4,4.18,6.85,7.41,7.69,7.69,7.36,6.86,6.1,5.62,5.02,4.13,2.46,1.83,0.76,0.01,-1.07,-1.27,-1.31,-0.65,0.11,-0.01,-0.08,0.2,0.28,0.1,-0.59,-1.72,-2.6,-3.05,-2.44,-1.35,-0.19,-0.4,1.48,1.98,1.58,0.84,0.93,1.75,2.2,1.42,-0.61,-0.23,-0.47,-0.13,0.32,0.75,0.78,0.8,1.05,1.06,1.89,2.44,2.33,2.76,3.44,3.61,3.44,2.94,3.16,3.68,3.41,3.55,3.48,2.79,2.13,1.57,0.4,0.4,0.59,1.38,1.22,0.6,0.83,1.21,1.4,-0.22,-0.06,1.04,2.08,2.69,2.03,-0.15,-1.61,-0.46,1.05,0.36,-0.03,-0.81,-0.47,-0.9,-1.13,-1.54,-3.37,-1.92,2.98,3.13,3.26,3.06,2.94,3.09,3.25,2.33,2.22,2.93,2.01,1.57,1.05,0.89,1.07,2.27,2.78,2.15,3.31,1.17,2.52,2.8,2.94,2.95,3.25,3.28,3.14,2.79,2.75,2.86,3.31,3.65,3.73,4.11,4.51,4.61,4.65,4.77,5.0,4.82,4.99,5.12,4.9,3.67,2.16,0.17,-1.56,-0.79,-2.14,-2.76,-2.36,-2.44,-2.16,-2.87,-3.03,-2.55,-2.59,-2.9,-2.53,-2.13,-1.4,-2.65,-2.42,-1.78,-2.09,-1.67,-2.69,-2.95,-2.26,-1.74,-1.36,-0.4,-0.34,0.54,0.63,0.15,-0.23,-0.22,-0.27,-1.16,-1.68,-1.91,-1.82,-1.38,-0.96,-0.31,0.36,0.79,0.83,0.77,0.8,0.86,0.86,0.97,0.76,0.47,0.47,0.84,0.84,0.33,0.27,0.3,0.45,0.86,1.39,1.21,1.62,2.33,3.06,3.45,3.22,2.73,2.46,2.08,1.7,2.19,2.7,2.98,2.7,2.76,3.31,4.09,3.9,4.53,4.62,5.54,5.98,5.2,5.49,6.03,5.52,5.65,5.02,4.8,4.74,4.34,4.57,5.97,7.15,6.75,-1.83,-0.96,1.14,-0.56,1.16,0.76,1.15,1.37,1.34,1.81,1.52,1.79,1.9,1.12,1.65,1.41,1.41,1.37,1.18,1.44,1.58,1.77,1.19,1.3,1.3,1.43,1.86,1.72,1.66,0.67,0.32,0.18,0.47,-0.51,1.01,2.77,2.02,0.79,0.27,0.0,-0.8,0.6,1.6,1.95,2.0,2.44,2.84,2.8,2.22,1.36,1.18,1.32,1.51,1.92,2.26,2.5,2.53,2.92,3.31,3.44,3.5,3.24,3.19,3.03,3.21,2.95,2.58,2.52,3.15,3.51,3.74,3.85,4.2,4.69,5.02,5.27,5.47,5.7,5.89,6.46,6.87,7.01,7.15,7.47,7.5,7.36,7.14,6.22,4.88,3.63,2.8,1.0,0.46,0.44,0.41,0.4,0.65,-0.54,-1.36,0.44,0.1,1.3,0.6,0.85,0.34,0.33,-0.02,0.37,1.44,-0.41,-0.79,-0.06,-0.82,-0.65,-0.86,0.25,1.0,1.09,2.88,2.17,-0.14,-1.83,-1.78,-0.98,0.57,2.09,3.64,8.54,7.84,7.45,7.31,6.7,5.86,4.57,4.54,3.62,2.21,1.94,1.43,0.55,-0.44,-0.42,-0.36,-0.29,0.06,-0.27,0.12,0.84,1.19,0.91,0.1,-1.66,-3.48,-4.47,-4.74,-2.93,-1.75,-0.36,0.7,0.89,0.93,1.31,1.52,1.83,1.78,1.34,0.43,-0.11,-0.07,-0.01,0.08,-0.24,0.08,1.61,1.42,3.53,3.54,3.32,2.92,3.86,4.46,4.52,4.51,4.31,4.34,4.15,3.89,3.65,3.33,3.18,3.0,2.54,1.39,0.42,0.03,0.14,0.3,0.02,-0.2,-0.15,0.53,1.1,1.95,2.79,3.05,2.93,2.4,3.38,-0.35,-2.91,-1.37,-1.37,-1.61,-2.52,-1.1,-1.48,-1.56,-1.74,-2.35,-0.52,1.55,4.32,4.29,4.15,3.24,1.83,1.19,1.21,1.38,1.64,2.07,1.05,0.69,0.96,1.83,2.47,3.47,2.44,1.25,1.67,2.16,2.62,2.96,2.72,2.99,2.9,2.98,2.87,2.72,2.57,2.65,3.03,3.34,3.91,4.05,4.69,5.02,5.24,5.6,5.58,5.06,4.95,4.61,4.19,3.58,2.27,0.53,-0.97,-1.97,-2.72,-1.82,-1.35,-1.27,-2.83,-2.89,-1.9,-1.42,-2.15,-1.36,-0.53,-1.78,-3.89,-2.76,-1.65,-0.99,-2.41,-3.39,-3.64,-3.07,-2.27,-1.01,-1.14,-0.82,-1.03,-0.74,-0.86,-1.21,-1.31,-1.09,-1.54,-2.14,-2.3,-2.46,-2.02,-1.48,-1.1,-0.64,0.17,0.87,0.82,0.86,0.8,0.67,0.57,0.4,0.5,0.73,0.56,0.66,-0.24,-0.04,0.34,0.53,0.97,0.87,0.67,0.9,1.41,2.36,3.13,3.11,2.48,2.11,1.97,1.5,1.95,2.86,2.95,3.18,2.83,2.96,2.89,3.05,3.49,4.45,5.09,5.37,5.59,5.72,5.97,5.87,5.63,5.44,5.33,4.91,4.81,4.98,5.28,7.06,6.69,2.07,-1.29,-0.53,-0.62,-0.66,0.37,1.22,0.88,0.97,1.38,1.56,1.58,1.69,1.49,1.35,2.32,1.62,1.58,1.57,1.7,1.7,1.79,1.83,1.37,1.4,1.36,2.43,2.14,1.95,1.51,-0.72,-0.37,-0.05,0.12,0.2,1.83,0.19,0.76,0.32,-0.25,0.32,0.1,1.01,1.17,1.5,1.78,1.82,2.39,2.14,0.91,0.64,0.67,1.06,1.4,1.67,2.02,2.58,2.79,3.06,3.21,3.46,3.42,3.31,3.13,3.07,2.97,2.71,2.63,2.89,3.26,3.51,3.76,4.22,4.83,5.13,5.38,5.68,5.7,5.92,6.22,6.75,7.08,7.32,7.67,7.73,7.83,7.7,6.95,5.11,3.34,0.38,0.25,0.44,-0.24,0.19,-1.19,-0.76,0.45,1.25,-0.41,-0.37,-0.27,0.5,0.67,0.61,-1.07,-0.16,0.89,0.59,-0.73,-0.76,-1.21,-0.89,-1.26,-1.25,-0.66,0.13,0.92,1.91,1.62,1.11,0.17,-1.1,-0.59,0.67,0.69,0.32,8.17,8.09,7.28,7.14,6.53,5.54,3.61,3.48,2.77,1.72,1.61,1.7,0.75,0.2,-0.45,-0.67,-0.36,-0.16,0.29,1.47,2.46,2.68,1.93,0.17,-2.25,-4.16,-5.98,-6.36,-4.34,-2.85,-1.27,-0.01,0.17,0.67,0.91,1.08,1.13,1.26,1.24,-0.23,-1.3,-1.38,-0.64,0.28,-0.05,0.65,2.04,3.16,2.78,3.71,4.43,4.66,4.31,3.89,4.31,4.46,5.0,5.6,5.89,5.96,5.56,4.91,3.73,2.49,2.45,1.71,0.14,-0.34,-0.35,-0.35,-0.4,0.01,0.37,0.47,0.46,0.68,1.46,1.37,2.54,2.89,0.77,-0.74,0.4,-0.5,-0.46,-0.6,0.16,-1.4,-1.65,-1.49,-1.21,-0.23,-0.73,0.45,4.15,4.93,4.87,4.04,2.55,1.76,1.74,1.66,1.4,1.15,0.89,1.07,1.06,1.68,3.07,2.72,2.0,1.96,1.92,2.36,2.47,2.48,2.7,2.95,2.99,2.79,2.55,2.81,2.9,2.73,2.68,2.86,3.17,3.86,4.14,4.73,5.26,5.3,5.44,5.25,4.86,4.77,4.63,2.31,2.84,1.13,0.65,0.0,-2.25,-2.85,-2.08,-0.02,-0.68,-3.18,-2.72,-0.94,0.08,-0.22,-1.35,1.09,-1.12,-1.1,-1.63,-1.67,-1.91,-3.84,-4.77,-4.31,-3.5,-2.43,-1.41,-0.94,-0.74,-0.67,-1.15,-1.82,-1.91,-1.93,-2.35,-2.6,-2.44,-2.49,-2.4,-1.91,-1.33,-0.98,-0.53,-0.35,-0.03,0.28,0.37,0.57,0.46,0.56,0.74,0.89,0.4,0.51,0.62,0.31,0.26,0.61,0.62,0.26,0.15,0.78,0.69,1.86,2.78,2.68,1.99,2.3,2.14,1.69,1.1,2.03,2.57,2.86,3.03,2.51,2.67,3.12,3.42,3.63,4.46,4.76,5.3,5.42,5.15,5.1,5.37,5.44,5.52,5.19,5.29,5.04,5.09,6.3,6.56,6.83,-0.27,-1.05,-1.39,0.31,0.51,0.02,1.42,0.99,1.6,1.76,2.2,2.32,2.27,1.76,1.98,1.63,1.06,1.73,2.2,2.03,2.58,2.14,1.25,1.48,2.01,2.29,2.53,1.84,1.5,1.2,0.26,1.75,0.26,-1.0,-1.74,0.14,1.75,0.39,-0.63,-0.06,0.06,0.58,0.65,0.7,1.03,0.98,1.18,1.47,1.38,0.88,0.89,0.59,0.71,1.17,1.84,2.41,2.75,2.72,2.87,2.99,3.13,3.14,3.02,2.95,2.9,3.22,3.12,3.27,3.18,3.59,4.11,4.65,4.78,5.26,5.45,5.54,6.08,6.13,6.3,6.49,7.12,7.36,7.66,7.71,7.96,8.37,7.93,6.42,3.22,-1.09,-0.49,-1.71,-1.53,-0.87,0.26,-0.39,-0.86,-0.44,1.98,0.24,0.14,0.63,0.53,0.19,-1.16,-0.45,-0.2,-1.12,-1.29,-1.54,-1.19,-0.82,-1.77,-1.25,-1.21,-0.73,-0.21,0.99,1.07,1.03,1.12,1.16,1.2,1.56,1.1,0.81,2.14,7.65,6.94,6.86,6.36,5.07,2.57,2.62,2.3,1.47,0.65,0.93,0.85,0.5,0.44,0.56,0.97,1.38,1.81,1.92,2.46,2.95,3.53,2.88,0.54,-2.84,-5.01,-6.78,-4.95,-2.52,-1.59,-1.32,-0.6,0.39,0.6,0.8,0.64,1.26,0.56,-1.2,-1.49,-1.06,-1.01,-0.59,0.38,1.62,1.35,2.36,3.47,3.58,3.96,4.13,4.29,4.46,4.44,4.56,4.8,5.17,5.59,6.38,6.83,5.99,5.09,4.46,2.25,1.34,1.13,0.19,0.14,-0.07,-0.05,0.6,1.5,1.84,2.54,1.47,-2.29,-3.53,-0.56,2.51,-0.92,0.75,1.26,0.92,0.12,0.32,-0.38,-0.66,-1.18,-0.92,-0.12,1.5,-0.37,-0.03,0.24,5.54,5.33,4.18,2.39,2.09,2.42,2.69,2.08,1.79,1.28,1.2,1.4,1.8,3.0,2.46,2.73,2.21,2.43,3.08,2.59,2.37,3.41,3.29,3.15,2.99,3.05,3.01,3.29,3.04,2.93,3.25,3.51,3.45,3.92,4.27,4.82,5.15,4.7,4.83,4.55,4.48,4.36,3.77,2.96,0.85,1.33,1.96,0.81,-0.66,-0.9,0.22,0.96,0.53,1.54,1.59,2.58,2.6,4.91,2.79,4.09,3.74,-0.43,-1.46,-1.4,-1.96,-4.3,-5.59,-4.62,-3.69,-2.47,-1.43,-0.87,-1.15,-1.45,-2.27,-1.87,-2.19,-2.9,-2.94,-2.97,-2.6,-2.29,-1.96,-1.58,-1.29,-0.83,-0.7,-1.22,-0.96,-0.54,-0.4,-0.7,-0.73,-0.93,-0.03,0.22,0.29,0.47,0.82,0.72,0.03,-0.08,-0.26,-0.03,0.49,0.66,1.18,2.12,2.08,1.33,1.28,1.56,1.65,0.93,1.4,2.36,3.15,2.85,2.57,2.77,2.84,2.63,3.17,3.95,4.3,4.68,4.69,4.98,5.03,5.21,5.33,5.52,5.36,5.22,5.0,4.94,5.51,6.61,7.42,0.88,0.35,-1.56,-1.23,-0.47,0.02,0.76,0.72,1.74,1.92,2.07,2.06,1.99,1.92,1.6,1.65,1.41,2.77,4.15,3.17,2.86,3.05,2.9,2.63,2.48,2.31,1.61,1.63,1.07,1.02,1.76,2.15,1.72,-0.54,0.69,-0.68,1.05,0.73,-0.41,-0.57,-0.79,-0.53,0.1,-0.16,-0.11,0.12,0.16,0.59,1.47,1.46,1.36,1.03,1.0,1.0,1.17,1.65,2.24,2.39,2.45,2.81,3.38,3.08,2.92,2.69,2.97,3.34,3.14,3.18,3.52,3.99,4.26,4.63,5.06,5.33,5.61,5.68,5.96,6.12,6.28,6.52,6.9,7.04,7.19,7.51,8.06,8.86,8.73,7.37,2.25,-0.02,2.01,1.39,0.28,-0.86,-1.41,-1.22,-1.33,0.08,1.05,0.83,0.76,0.99,1.05,-0.74,-1.17,-0.05,-0.53,-0.5,-0.45,-0.97,-1.44,-1.75,-2.17,-1.57,-1.96,-1.73,-1.31,-0.45,0.52,1.13,1.08,0.86,1.62,2.26,1.38,0.08,1.39,6.8,6.03,6.29,5.6,3.89,2.02,1.87,1.94,1.69,1.15,0.73,0.31,-0.22,0.25,0.98,1.65,1.93,2.21,2.99,3.55,3.88,4.0,3.52,2.23,1.0,-0.67,-3.91,-4.23,-3.36,-2.13,-1.78,-1.66,-0.75,0.54,0.08,-1.11,0.03,-0.14,-0.82,-1.47,-0.11,0.03,0.51,1.16,1.21,2.35,2.56,3.03,3.12,3.49,3.69,3.97,4.47,4.65,4.61,4.93,5.13,5.45,5.46,4.98,4.97,4.97,4.25,4.01,1.56,0.68,1.1,0.56,0.53,1.05,1.54,1.75,2.56,3.29,-2.02,-1.29,-0.03,-1.9,-2.11,0.21,-0.2,0.59,0.41,-0.48,-1.15,-0.55,-0.34,-0.17,-0.45,0.0,2.03,-0.5,-0.87,0.78,2.58,6.4,5.5,4.34,3.4,3.49,3.49,2.72,2.08,1.48,1.82,1.76,1.57,1.82,1.85,2.04,2.91,3.19,3.27,3.57,3.99,3.37,2.81,3.88,3.41,3.37,3.36,3.16,3.04,2.86,3.07,3.63,3.52,3.42,3.85,4.5,4.8,4.68,4.25,4.19,3.66,4.45,3.44,3.71,2.86,2.0,2.22,2.34,2.1,1.72,1.67,1.73,2.36,2.81,3.32,4.84,5.56,4.95,5.98,4.01,4.12,3.83,3.91,1.1,-2.45,-3.61,-5.76,-5.42,-4.77,-4.26,-3.02,-2.32,-2.19,-2.32,-2.9,-2.66,-2.53,-3.18,-3.51,-3.59,-3.59,-3.14,-2.54,-2.25,-2.01,-1.62,-1.59,-1.35,-1.55,-1.75,-1.31,-1.4,-1.7,-1.54,-1.0,-0.5,-0.01,0.0,-0.16,-0.37,-0.31,-0.26,-0.2,-0.1,0.83,0.86,0.66,1.68,1.67,0.69,0.58,0.96,1.15,0.74,0.99,1.81,2.42,2.39,2.36,2.35,2.16,2.3,2.93,3.46,3.97,4.25,4.66,5.42,5.21,5.13,5.16,5.03,5.31,4.92,4.55,4.42,4.63,5.33,5.92,6.82,0.69,-0.25,-1.85,-1.32,-0.97,-0.5,-1.28,-0.16,0.36,3.8,3.16,2.19,1.96,2.07,1.77,1.47,0.83,1.33,1.57,2.89,3.4,2.61,1.76,2.26,2.66,2.44,1.78,1.41,1.76,0.79,1.2,-0.16,-0.28,-0.03,-0.35,0.12,0.78,-0.85,-1.42,-0.94,-0.66,-0.5,-0.66,-1.21,-0.9,-0.82,-0.39,0.6,0.87,0.89,1.24,1.35,1.48,1.52,1.36,1.19,1.69,1.74,1.96,2.68,2.62,2.61,2.38,2.61,2.45,2.72,3.26,3.65,4.22,4.53,4.8,5.28,5.61,5.77,5.83,5.69,5.91,5.96,6.25,6.46,6.85,6.77,7.32,7.85,9.05,9.42,9.58,-0.3,0.98,0.16,1.21,-0.11,-0.67,-0.65,-2.12,-0.87,0.17,1.15,0.38,0.82,0.64,0.83,-0.34,-0.43,-0.04,0.53,-0.27,-0.01,-1.04,-1.04,-2.04,-2.83,-1.63,-3.07,-2.29,-1.96,-1.5,0.01,1.33,2.8,0.87,-1.21,-0.47,0.97,1.66,1.94,5.26,5.14,5.42,4.61,2.75,1.83,1.89,1.94,1.91,1.39,0.9,0.76,0.6,0.74,0.86,1.08,1.86,2.37,2.68,3.45,4.03,4.22,3.92,3.2,2.48,1.28,-0.31,-0.61,-0.67,-0.75,-1.44,-1.45,-1.75,-0.64,-0.16,0.42,-0.32,-0.3,-0.89,0.55,-0.2,0.75,0.82,0.82,1.58,2.49,3.02,3.13,3.33,3.36,3.68,4.03,4.2,4.54,4.82,5.09,5.34,5.44,5.39,5.38,4.78,4.3,3.64,2.6,2.23,0.8,-0.75,0.51,1.06,1.75,2.37,2.39,1.0,-3.23,1.13,-0.4,-0.99,-0.36,0.17,-0.9,0.52,-0.28,-0.35,-0.54,-1.03,-2.69,-2.14,-0.49,-0.45,1.11,2.84,0.0,-1.31,-1.28,1.17,6.89,5.79,5.58,5.03,4.63,3.46,2.28,1.77,1.56,1.22,0.93,0.71,1.11,1.93,2.29,2.86,3.18,3.69,3.83,3.8,3.33,1.1,2.68,3.31,3.44,2.66,2.69,3.0,3.45,3.92,4.12,3.99,3.58,4.13,4.84,4.33,4.34,3.84,4.66,5.02,4.75,3.97,3.34,2.67,2.63,2.36,2.76,3.34,3.35,3.1,3.09,3.76,4.49,4.76,5.2,4.84,5.08,5.45,5.93,5.6,5.72,3.35,2.01,0.6,-0.1,-2.32,-4.48,-4.19,-3.64,-3.19,-3.43,-2.9,-2.68,-2.92,-2.97,-2.95,-3.63,-4.16,-3.94,-4.0,-4.1,-3.63,-2.86,-2.63,-1.95,-1.72,-1.53,-1.36,-1.49,-1.92,-2.19,-2.47,-2.31,-1.65,-0.74,-0.72,-1.0,-1.55,-0.85,-0.41,-0.5,-0.75,-0.46,1.09,1.5,0.44,1.66,1.01,0.72,0.04,0.61,-0.04,0.05,0.78,1.52,1.65,1.37,1.57,1.92,1.99,2.37,2.69,3.26,3.37,3.94,4.53,5.33,5.49,5.41,5.22,5.31,5.27,4.98,4.38,3.67,3.61,4.43,4.99,5.38,4.12,2.07,0.01,-1.5,-1.09,0.77,-1.18,0.08,1.05,1.4,1.92,2.1,2.79,2.86,2.42,2.61,2.15,1.46,1.76,1.91,1.38,0.51,1.99,1.45,2.89,2.17,2.11,1.94,0.84,0.84,0.82,1.77,0.5,-1.59,-0.81,0.14,0.53,-2.17,-2.36,-2.61,-1.99,-1.23,-1.22,-2.07,-1.99,-1.57,-1.55,-0.73,0.11,0.17,0.48,1.0,0.96,1.32,1.47,0.81,0.7,1.24,1.0,1.45,2.02,1.89,1.98,2.04,2.19,2.66,3.19,3.93,4.07,4.26,4.66,4.78,5.01,5.03,5.25,5.14,5.51,6.22,6.56,6.82,7.26,7.35,7.51,8.3,9.11,9.39,11.08,-1.24,0.62,-0.39,1.97,-0.4,-0.44,1.05,-1.68,-1.56,-1.42,-1.11,0.04,-0.08,-0.28,1.03,0.85,0.99,-0.18,-0.12,0.78,1.18,0.12,-1.08,-1.37,-2.02,-2.11,-2.69,-4.24,-4.45,-2.2,-0.26,1.54,2.15,-1.05,-0.72,0.73,1.63,1.91,4.14,4.33,4.1,4.24,3.13,1.44,0.96,1.16,1.8,1.95,1.84,1.47,0.94,0.41,0.38,0.95,1.67,1.58,2.3,2.94,3.08,3.81,4.07,4.06,3.01,2.57,1.43,1.13,0.98,1.04,0.5,0.33,0.04,-1.23,-0.26,0.2,-0.06,0.96,1.51,1.53,1.17,1.51,1.18,0.75,0.96,1.76,2.66,3.39,3.57,3.74,3.88,4.03,4.34,4.48,4.75,4.96,5.31,5.58,5.54,5.57,5.56,5.64,4.87,3.41,2.24,0.8,-0.37,-1.19,-0.82,1.22,2.02,2.49,2.64,-2.45,1.72,1.03,0.45,-1.15,-1.94,-0.5,-0.9,-1.56,-0.93,-0.89,-0.67,-0.76,-1.14,-2.37,-3.14,-0.03,-0.94,-0.79,-0.33,-0.5,-0.83,0.27,5.48,5.47,5.26,4.81,4.36,4.2,2.84,1.77,1.21,1.49,1.44,1.6,1.79,1.94,2.08,2.69,3.08,3.29,3.27,3.5,3.38,2.86,2.46,2.95,3.34,3.47,3.57,3.84,4.04,4.29,4.06,1.43,4.89,3.7,4.28,3.58,3.67,3.98,4.11,4.05,3.8,3.52,3.24,3.11,2.61,3.16,3.3,3.66,4.59,4.49,4.66,4.29,4.26,4.28,4.66,4.77,5.14,5.19,5.33,5.23,5.64,5.97,5.96,5.44,2.72,2.68,0.79,-0.12,-0.49,-0.94,-1.87,-2.59,-3.1,-3.4,-2.78,-2.88,-2.96,-4.04,-4.19,-3.65,-2.59,-2.62,-2.69,-3.16,-3.27,-2.99,-2.02,-1.88,-2.05,-2.18,-3.38,-4.05,-2.89,-1.82,-1.82,-1.35,-1.64,-1.31,-1.06,-0.68,-0.43,-0.75,-0.26,0.91,0.99,-0.16,1.25,0.21,0.86,0.34,-0.17,-1.17,-0.22,0.45,0.64,0.82,1.06,1.42,1.33,1.88,2.34,2.51,2.6,3.06,3.86,4.34,5.02,5.13,5.08,5.17,5.36,5.05,4.88,4.39,3.6,3.6,3.73,4.27,4.4,3.78,2.04,2.55,2.79,0.78,-0.37,-2.34,-0.64,-0.42,-0.41,-0.07,1.87,2.77,2.29,2.09,2.45,2.02,2.38,2.29,1.88,1.96,2.39,2.14,2.64,2.68,1.75,1.44,1.78,1.44,0.39,0.37,-0.05,-0.39,-0.51,-0.95,-1.08,-0.02,-3.36,-4.33,-4.13,-3.2,-2.3,-2.38,-2.88,-2.56,-2.05,-2.2,-1.48,-0.83,-0.51,0.08,0.32,0.62,0.73,0.44,0.21,0.17,0.32,0.62,0.76,1.27,1.53,1.55,1.62,2.07,2.61,3.02,3.48,3.83,4.03,4.2,4.45,4.63,4.75,4.82,4.99,5.2,5.51,6.21,6.97,7.48,7.4,7.44,8.03,9.58,10.08,10.69,5.65,-1.18,-0.36,1.96,1.89,-0.15,1.11,0.4,-2.44,-2.46,-1.79,-1.6,-1.6,-0.6,0.15,0.89,1.01,0.55,0.16,0.75,1.07,0.15,-1.21,-1.6,-1.99,-5.23,-7.95,-6.7,-4.6,-2.56,-1.05,0.48,0.14,-0.94,-1.69,0.51,2.15,1.73,3.48,3.19,3.35,3.45,2.21,0.59,0.87,0.94,0.5,1.75,1.96,1.76,1.09,0.38,0.57,1.01,1.51,1.91,2.44,2.86,3.63,3.56,3.94,3.7,3.45,2.66,1.78,1.55,1.39,1.76,1.48,1.32,0.2,1.53,0.64,1.88,1.48,1.51,1.48,2.28,2.37,1.49,2.68,1.73,1.04,2.27,3.45,3.35,3.37,3.69,4.02,4.4,4.69,4.86,4.87,4.56,4.69,5.29,5.75,6.06,6.21,6.24,6.17,6.06,4.8,1.13,-2.1,-2.49,-1.43,0.76,1.76,2.45,1.53,-1.11,0.92,1.2,0.16,-0.32,-1.2,-1.44,-1.19,-3.21,-2.64,-0.79,-0.49,-0.54,0.2,-0.1,-1.21,-3.03,-2.77,0.45,0.09,0.18,0.44,0.46,1.5,4.37,4.5,4.51,4.19,3.53,3.16,2.28,1.72,1.29,1.35,0.89,1.39,1.8,2.37,2.46,2.71,3.18,3.4,3.53,3.57,3.88,2.92,3.5,3.41,3.42,3.73,3.88,4.16,4.51,5.27,6.35,0.77,3.75,3.64,3.26,3.3,3.39,3.42,3.9,3.09,2.74,3.02,2.63,4.02,4.13,4.23,4.51,4.54,4.88,4.17,3.89,3.56,3.83,4.38,5.28,5.4,5.72,6.22,5.66,4.9,5.08,5.7,5.15,4.43,5.11,5.86,4.88,3.29,1.6,1.26,-1.36,-0.65,-1.42,-1.8,-2.57,-1.54,-2.05,-2.18,-1.27,-1.89,-1.86,-0.78,-1.82,-1.92,-1.72,-2.32,-2.94,-2.44,-2.69,-2.86,-3.39,-4.25,-3.19,-2.88,-2.65,-2.61,-2.46,-2.47,-1.63,-1.02,-0.48,-0.26,0.72,1.68,-0.98,1.02,-0.44,0.45,0.71,0.01,-1.05,-0.54,0.08,0.51,0.34,0.83,1.22,1.09,2.03,2.38,2.18,2.44,2.59,3.41,4.1,4.65,4.93,4.94,4.8,4.99,5.06,4.93,4.54,3.97,3.52,3.25,3.19,3.2,2.86,2.5,2.05,2.18,1.36,0.45,-1.12,-3.28,-1.76,1.16,1.46,2.29,4.14,2.83,2.63,3.72,3.21,4.09,3.85,2.51,1.43,1.41,1.42,1.54,1.65,2.02,1.34,1.05,1.09,2.27,0.74,-1.26,-0.99,-0.92,-0.39,-0.05,-0.01,-5.07,-5.49,-5.62,-4.93,-3.98,-2.98,-3.71,-3.82,-3.08,-2.95,-2.14,-1.93,-1.54,-1.23,-0.91,-0.85,-0.67,-0.6,-0.6,-0.38,-0.53,0.11,0.43,0.57,1.3,1.41,1.68,2.08,2.36,2.59,2.63,3.13,3.58,3.92,4.08,4.33,4.6,4.75,4.62,4.88,5.37,5.94,6.41,6.94,7.27,7.51,8.02,9.22,10.33,10.09,8.67,1.24,-1.36,1.61,2.01,-0.86,-1.76,0.59,0.81,-2.05,-1.67,-2.01,-1.51,-1.74,-1.58,-0.53,-0.18,1.09,0.37,-0.58,-1.56,-0.14,-1.11,-2.76,-4.92,-7.48,-7.24,-5.93,-4.61,-2.65,-1.4,-0.75,-0.14,-0.92,-1.72,-0.66,0.63,0.22,1.69,1.66,1.82,2.22,0.7,0.09,0.43,0.6,0.69,1.05,1.79,1.73,1.4,0.82,0.09,0.84,1.84,2.24,2.74,3.38,3.67,3.97,4.31,4.28,3.41,3.36,3.01,2.64,3.17,2.85,2.87,2.49,2.75,1.72,1.59,1.69,2.44,2.57,2.33,1.8,1.6,2.75,3.33,5.39,4.99,3.73,3.22,3.34,3.87,3.85,4.2,4.76,4.76,4.97,4.85,5.45,5.86,5.8,6.36,6.69,6.87,7.42,7.36,7.57,6.64,3.41,-2.38,-3.68,-2.47,-0.89,0.69,1.91,-0.6,0.72,1.35,-0.53,-0.02,-0.2,-0.85,-1.26,-1.7,-1.76,-3.46,-3.08,-2.37,-0.26,0.29,0.27,0.19,-1.04,-0.15,1.47,0.88,-0.13,-0.57,-1.46,-1.51,1.49,3.57,3.87,3.92,3.34,2.73,2.64,1.78,1.71,1.26,1.5,1.33,1.97,2.34,2.47,2.67,3.12,3.9,4.55,4.56,4.43,4.19,2.65,2.77,2.48,2.87,3.69,4.21,4.12,4.07,4.3,3.64,3.35,3.13,2.92,3.0,2.38,2.16,2.55,2.84,2.97,3.11,3.9,3.7,4.22,4.02,3.8,3.38,3.02,2.78,2.92,3.44,3.8,3.92,4.15,4.68,5.64,6.37,6.77,5.71,5.27,5.16,5.36,5.73,5.36,5.22,5.48,5.91,6.1,6.16,4.97,4.32,3.76,2.6,0.13,0.59,1.11,0.76,0.56,0.72,-0.53,-1.06,-0.28,-0.81,-0.5,-1.78,-2.85,-3.4,-4.64,-4.38,-4.03,-5.46,-4.89,-4.19,-3.75,-3.39,-2.71,-2.42,-4.06,-3.59,-2.18,-0.98,-0.39,-0.71,-0.73,-0.73,-0.34,0.0,0.38,0.33,-0.7,-0.93,-0.9,-0.28,0.08,0.21,0.63,0.31,0.82,2.22,2.37,2.76,2.84,3.09,3.92,4.37,4.26,4.74,4.7,4.88,5.08,4.95,4.54,4.05,3.49,2.89,2.57,2.63,2.53,2.17,2.46,1.99,2.23,0.46,-0.73,-2.61,-2.74,-1.35,0.58,0.35,2.88,3.02,2.72,2.4,2.83,3.01,2.59,2.3,0.75,1.17,0.95,1.44,1.09,1.75,1.75,1.38,0.87,1.68,1.13,-0.91,-0.23,0.11,-1.06,-0.2,3.78,-8.14,-6.29,-6.48,-5.87,-5.28,-4.24,-4.37,-4.31,-4.02,-3.84,-3.51,-2.65,-1.78,-1.57,-1.07,-0.78,-1.08,-1.31,-0.9,-0.74,-0.52,-0.52,-0.3,0.24,0.86,1.28,1.86,1.97,2.14,2.44,2.61,3.04,3.26,3.32,3.33,3.34,3.61,4.15,3.98,4.46,5.42,5.81,6.24,6.4,6.91,7.26,7.69,8.5,9.44,10.31,8.93,6.4,0.44,0.46,0.85,0.35,0.98,2.25,-1.29,-1.09,-0.81,-1.72,-2.19,-2.18,-2.06,-2.07,-0.32,-1.56,-1.2,-1.69,-2.01,-1.36,-1.84,-6.73,-8.52,-8.39,-7.54,-6.39,-4.78,-2.77,-1.19,-1.17,-0.55,-0.76,-0.69,-0.43,0.2,0.19,0.4,-0.11,-0.1,1.27,1.34,1.0,0.52,-0.77,0.68,1.09,1.22,1.38,0.33,1.34,0.96,1.41,1.66,2.99,3.47,3.67,3.87,4.11,4.83,4.78,4.5,4.0,3.66,3.27,3.76,4.7,4.66,4.14,3.6,3.28,3.62,4.35,4.93,5.02,4.98,4.92,4.5,3.83,3.67,3.97,4.12,4.56,4.19,3.94,4.04,4.25,4.36,4.73,5.18,5.57,5.96,6.03,6.41,6.47,6.67,7.38,7.58,8.34,8.8,8.88,8.47,4.49,-3.4,-4.85,-2.96,-2.95,-4.49,-4.53,-0.86,0.74,1.33,0.25,-1.61,0.3,-1.04,-0.92,-1.78,-2.66,-2.84,-2.69,-3.58,-2.72,-0.61,0.47,-0.26,-0.46,0.49,0.31,1.65,1.51,-2.25,-1.51,-1.92,-2.82,-0.39,4.11,3.67,3.29,2.51,1.92,1.69,1.11,1.21,1.42,1.83,2.0,2.4,2.89,3.35,3.21,1.72,5.17,4.76,4.93,4.5,3.15,2.59,2.22,2.15,2.61,3.47,3.67,3.52,3.58,3.87,2.83,3.27,2.79,2.64,2.88,2.98,3.04,2.92,3.47,3.63,3.46,3.54,3.5,3.4,3.12,2.77,2.62,2.65,2.94,3.24,3.49,3.86,4.39,4.64,4.87,5.24,6.45,6.58,5.73,4.37,4.38,5.24,6.12,6.41,5.96,5.46,5.19,5.08,4.94,3.8,3.16,2.66,2.34,3.08,2.38,2.69,2.81,2.11,0.69,0.46,-0.41,-1.19,-0.28,-0.62,-1.22,-2.45,-2.81,-3.76,-4.13,-5.59,-6.21,-5.21,-3.98,-3.97,-3.36,-1.73,-1.53,-2.47,-0.9,1.32,2.09,2.26,0.13,-1.71,-0.28,0.29,0.65,0.23,-0.8,-2.29,-2.11,-0.63,-0.17,-0.39,-0.07,-0.12,0.14,0.65,2.02,2.33,3.37,3.14,3.69,4.03,4.03,4.25,4.5,4.81,5.06,4.88,4.73,4.46,3.6,2.86,2.41,2.33,2.37,2.46,2.03,2.35,2.4,0.15,-0.25,0.74,-0.51,-0.06,0.59,1.82,2.3,2.38,2.44,2.4,2.29,2.75,2.39,2.98,1.62,1.71,0.12,0.01,1.23,1.51,1.1,0.81,0.75,1.09,1.33,-0.59,-0.92,-0.54,0.58,3.2,4.77,-5.07,-7.69,-7.17,-6.62,-6.44,-5.81,-5.49,-5.45,-4.88,-4.45,-3.56,-2.77,-1.97,-1.35,-1.36,-1.44,-1.13,-0.74,-0.81,-0.94,-0.94,-1.06,-1.24,-0.12,0.11,0.78,1.67,1.89,2.0,2.19,2.57,2.7,2.51,2.68,2.76,3.05,3.53,3.83,4.8,5.03,5.22,5.71,6.16,6.71,6.7,6.96,7.1,7.69,8.41,9.15,9.69,8.97,2.0,0.6,-0.24,1.12,2.48,2.13,1.87,1.03,-1.28,-1.74,-2.46,-1.51,0.7,-0.55,-2.53,-1.76,-1.91,-1.43,-2.89,-1.43,-2.31,-4.64,-7.64,-7.75,-6.9,-6.14,-4.94,-3.23,-1.18,-0.56,-1.04,-1.49,0.2,-0.8,-0.58,-0.21,-0.38,-1.44,-1.06,0.61,0.56,0.16,0.73,-0.8,-0.73,-0.05,0.47,0.74,1.32,0.7,0.54,1.14,2.37,2.54,2.77,3.3,3.85,4.38,4.41,4.68,4.66,4.31,4.07,3.95,4.27,4.64,5.4,5.44,5.62,5.62,5.34,5.51,5.79,5.86,5.6,5.41,5.08,4.95,4.72,4.74,4.42,4.28,3.76,3.94,4.01,4.04,4.28,4.83,5.43,5.67,5.91,6.25,6.38,6.41,6.32,6.87,7.42,8.2,9.27,9.45,8.58,3.85,-6.8,-5.69,-4.2,-4.46,-4.9,-2.68,-0.5,1.68,2.14,2.06,0.16,-0.65,-0.26,0.04,-1.08,-3.22,-2.95,-2.76,-3.59,-3.34,-3.57,-2.35,-1.12,-0.02,0.04,-0.31,-0.34,-0.12,-0.46,-2.36,-1.81,-1.5,-1.36,1.29,3.05,3.05,2.54,1.78,0.62,-0.06,0.07,0.66,0.97,1.51,2.5,3.15,3.74,5.24,9.04,0.2,5.88,4.78,4.37,3.54,2.53,1.83,1.97,2.2,1.97,3.12,3.17,3.15,3.82,4.57,4.3,3.95,3.1,2.99,3.26,4.28,4.57,3.9,3.57,3.04,2.79,2.59,2.46,2.43,2.02,1.8,2.06,2.46,2.86,3.37,3.27,3.56,3.99,3.79,4.16,4.89,5.8,6.25,5.7,4.55,4.72,5.33,6.49,7.03,6.7,5.94,5.42,4.25,3.65,3.95,3.06,3.05,2.76,3.86,4.03,3.26,3.52,4.49,3.58,1.14,0.0,0.1,-0.09,0.25,-0.12,-2.06,-3.2,-4.82,-7.29,-7.32,-5.9,-5.76,-5.1,-3.93,-2.78,-1.36,-1.14,-0.57,0.55,1.6,2.61,3.69,2.98,2.75,1.44,-0.81,-1.24,-1.67,-1.88,-3.44,-1.68,-0.67,-1.14,-0.91,-0.72,-0.62,0.3,0.82,1.08,2.11,3.59,3.65,3.5,3.77,4.26,4.45,4.78,4.82,4.79,4.72,4.63,3.7,3.09,2.73,2.4,2.39,2.45,2.34,2.5,1.88,0.39,0.29,1.16,-1.2,-0.49,0.27,-0.64,1.34,2.02,2.36,2.51,2.6,2.64,2.19,2.25,2.78,1.81,1.74,1.07,1.09,0.69,1.11,1.1,0.21,0.93,0.32,0.09,0.78,0.11,-0.09,4.25,1.83,-3.69,-8.13,-7.74,-6.78,-6.6,-5.66,-7.5,-6.44,-6.04,-5.96,-4.45,-2.99,-2.02,-1.58,-1.49,-1.81,-1.89,-1.23,-0.83,-1.0,-0.96,-1.15,-0.7,-0.62,-0.09,0.53,0.82,1.4,2.0,2.2,2.19,2.15,2.23,2.27,2.6,2.9,3.6,4.1,5.56,5.7,5.95,5.92,6.14,6.4,6.87,6.87,7.05,7.38,7.89,8.35,8.87,9.17,5.88,-0.12,-1.39,-0.06,0.45,2.45,3.4,1.99,-0.27,-1.84,-1.81,-2.58,-1.13,-0.56,-0.11,0.47,-0.32,-1.59,-2.15,-2.65,-3.87,-3.71,-8.28,-7.66,-7.11,-6.93,-5.82,-3.7,-1.58,-0.08,-0.64,-0.47,1.07,-0.64,-0.76,-1.19,-1.77,-2.14,-1.48,0.0,0.21,-1.12,-1.62,-1.47,-1.63,-0.8,-0.21,-0.2,-0.28,-0.5,-0.47,-0.06,0.42,1.54,2.78,3.2,3.43,3.79,4.17,4.25,4.29,4.42,4.88,4.9,4.89,4.78,5.01,4.8,4.41,4.16,3.8,4.15,4.41,4.82,4.41,4.29,4.49,4.69,4.4,4.08,3.69,3.42,3.45,3.46,3.8,4.3,5.1,5.49,5.8,6.05,6.16,6.24,6.25,6.22,6.31,6.71,7.23,7.79,9.1,9.98,6.33,3.96,-2.72,-3.17,-2.74,-3.52,-5.24,-2.09,0.27,1.67,3.94,5.31,5.74,3.21,2.94,3.08,-2.43,-2.78,-3.85,-3.46,-4.36,-3.13,-3.83,-4.42,-2.81,-1.43,-1.01,0.06,-0.74,-1.13,-1.65,-1.58,-0.99,0.26,0.16,-0.99,0.16,3.43,2.39,1.75,0.12,-2.17,-1.05,-0.07,1.0,1.85,2.13,2.58,3.22,4.12,5.33,7.39,5.43,4.86,4.1,3.22,2.26,1.53,1.74,2.05,2.39,2.2,2.24,2.49,3.34,3.54,4.11,4.26,3.99,3.19,2.25,3.18,3.99,3.83,3.57,2.97,2.11,2.23,2.67,2.36,2.23,1.88,2.31,2.48,2.52,2.13,2.37,3.11,3.31,3.47,4.1,4.43,5.26,5.96,5.56,5.35,4.64,4.63,5.7,6.61,6.83,6.74,6.6,6.48,6.47,5.04,2.78,1.91,2.02,2.74,3.02,2.35,2.3,3.4,4.21,4.76,3.88,1.7,0.08,0.88,1.39,-1.78,-4.78,-5.15,-8.02,-7.86,-6.98,-7.4,-5.8,-4.28,-3.39,-2.29,-1.74,-1.23,-0.04,0.7,1.68,2.37,3.05,3.17,3.33,1.99,-1.57,-2.88,-2.82,-4.26,-3.21,-1.47,-1.65,-1.87,-1.17,-0.99,-1.0,-0.27,0.31,1.31,1.76,3.59,3.34,3.38,3.93,4.04,4.17,4.57,4.6,4.58,4.3,3.85,3.59,3.55,3.47,3.5,3.57,3.77,4.21,4.62,-0.21,-0.06,0.92,0.48,-0.5,-0.05,-0.05,1.5,2.14,2.36,2.53,2.74,2.84,1.9,1.87,2.3,2.15,1.79,1.48,1.51,1.14,0.32,1.25,0.96,0.23,0.48,-0.03,0.64,0.63,2.66,2.8,-4.75,-6.83,-8.16,-7.37,-6.52,-8.21,-6.37,-7.77,-7.77,-6.89,-6.54,-5.18,-3.79,-2.57,-2.04,-2.3,-2.35,-2.49,-1.96,-0.93,-0.77,-0.75,-0.67,-0.93,-0.96,-0.35,0.25,0.85,1.11,1.26,1.58,1.68,1.85,2.05,2.43,3.07,3.73,4.37,5.13,5.69,5.8,5.65,5.73,6.06,6.44,7.02,7.1,7.06,7.09,7.39,8.49,9.08,8.94,8.58,-1.54,-1.45,-1.01,1.26,2.56,3.87,4.47,4.68,2.51,-0.03,-0.83,-2.28,-0.28,1.53,1.08,-0.49,-0.6,-0.87,-3.65,-4.08,-3.57,-8.36,-7.62,-6.89,-6.57,-6.26,-4.86,-2.29,-0.11,-2.08,-1.63,-1.65,-0.29,-1.58,-1.89,-2.13,-2.74,-1.79,-1.07,-1.68,-1.62,-2.06,-2.43,-2.29,-1.48,-0.96,-0.71,-0.55,-0.47,-0.97,-0.9,-0.33,0.0,1.15,2.16,2.94,3.4,3.47,3.62,3.94,4.38,4.69,4.89,4.94,4.91,4.4,4.4,3.66,3.59,3.49,3.09,3.49,3.81,4.06,4.19,3.99,3.71,3.53,2.98,2.62,2.64,2.9,3.33,3.74,4.18,4.84,5.48,5.27,5.72,6.06,6.51,6.51,6.78,6.86,7.06,7.18,7.4,8.73,9.02,5.87,5.15,3.83,3.74,-0.77,-2.81,-2.5,-0.17,1.08,2.5,2.01,2.65,5.06,5.16,5.26,4.84,3.57,-0.87,-4.22,-3.5,-3.93,-4.04,-4.06,-3.49,-2.25,-2.74,-0.77,0.33,-1.5,-0.83,-1.12,-0.69,-1.15,0.13,-0.81,-0.61,0.71,2.5,2.61,0.97,-1.32,-2.44,-0.97,-0.29,0.05,0.71,1.32,2.02,2.52,3.04,3.81,4.31,4.15,4.0,3.66,3.44,2.47,2.38,2.63,2.48,2.73,2.24,2.56,2.6,2.99,3.5,3.66,3.96,3.72,3.65,2.9,3.1,3.11,3.27,3.27,2.82,2.57,2.61,3.28,3.96,2.95,1.71,1.35,1.27,1.54,2.3,2.52,2.39,3.34,3.78,3.38,3.44,3.77,4.19,4.52,5.07,5.1,4.7,4.91,5.84,6.66,6.89,7.38,8.23,8.22,8.45,7.28,4.31,3.08,2.8,2.09,1.39,1.79,2.4,2.04,2.75,4.14,5.36,4.54,2.44,1.73,-1.41,-5.71,-6.56,-7.59,-8.3,-9.18,-7.98,-7.03,-5.34,-4.7,-3.23,-2.17,-1.59,-1.04,-0.96,0.63,1.72,2.32,3.19,3.24,3.48,2.45,-3.0,-3.16,-4.52,-4.11,-2.59,-2.08,-2.18,-2.21,-1.52,-1.13,-0.87,-0.64,-0.27,0.85,1.84,3.21,2.61,3.24,3.93,4.28,4.1,4.45,4.13,4.34,4.29,4.0,4.0,4.17,4.29,4.38,4.47,4.79,6.05,-2.24,-0.67,-0.5,-1.1,-1.13,0.84,0.62,1.84,2.15,2.27,2.43,2.58,2.41,2.08,1.65,2.53,1.75,1.64,2.75,1.36,0.7,0.48,0.83,1.18,0.87,1.49,1.53,0.83,1.17,6.05,3.77,2.82,-3.92,-9.49,-7.08,-4.67,-7.41,-8.68,-8.58,-8.15,-7.87,-7.45,-6.06,-5.06,-3.86,-2.65,-2.28,-2.74,-2.57,-2.67,-1.87,-1.17,-1.14,-0.9,-0.2,-0.41,-0.48,-0.14,0.8,1.22,1.29,1.48,1.63,1.84,2.4,3.02,3.77,4.16,4.78,5.39,5.35,4.87,5.2,6.27,6.49,6.61,6.86,7.17,7.04,6.82,7.66,8.62,9.0,9.64,9.03,0.67,-1.44,-0.11,2.67,3.46,4.89,5.35,5.25,4.62,3.7,0.85,-0.51,-1.4,0.04,0.03,0.98,2.47,4.91,1.41,-2.22,-4.22,-8.28,-7.74,-6.51,-6.28,-6.17,-5.56,-3.28,-2.05,-2.72,-4.29,-1.17,-0.76,-4.69,-2.95,-2.72,-3.11,-2.36,-1.82,-1.62,-2.24,-1.93,-2.72,-2.11,-1.74,-1.39,-1.46,-1.43,-1.36,-1.24,-1.5,-1.27,-0.28,0.54,1.5,1.89,2.07,2.11,2.06,2.25,2.82,3.58,4.14,4.38,4.24,4.25,3.92,4.02,3.75,3.39,3.36,3.19,3.54,3.82,3.65,3.26,3.42,3.63,3.54,3.36,3.57,3.94,4.39,4.5,4.48,4.55,5.0,5.49,5.64,5.89,6.18,6.58,6.3,6.16,6.34,6.98,7.28,7.76,9.69,6.5,5.36,3.95,2.33,2.85,0.43,0.25,0.32,0.88,1.41,2.51,2.27,1.32,2.55,3.48,3.58,5.93,2.79,-1.76,1.12,-1.18,-4.07,-3.37,-2.48,-1.99,-2.09,-2.38,-0.5,-2.71,-2.39,-1.76,0.11,-0.2,-1.47,-0.96,-0.4,-1.36,-0.72,3.78,0.65,-2.23,-2.37,-2.02,-1.18,-0.09,0.55,1.19,1.79,2.32,2.72,3.0,3.32,3.62,3.8,3.81,2.75,2.51,2.94,3.31,3.44,3.28,2.63,1.79,2.03,2.73,3.67,3.84,3.9,3.49,3.2,3.22,2.7,2.63,2.58,2.52,2.69,2.87,3.05,3.33,3.41,3.66,2.94,1.92,1.49,1.79,1.68,1.92,2.2,3.11,3.65,4.27,3.54,3.54,4.12,4.32,4.71,4.9,4.67,4.52,4.9,5.19,5.68,6.45,6.76,7.34,7.59,8.51,8.31,7.41,6.63,5.58,3.17,2.58,2.29,0.36,0.33,1.93,3.5,4.97,6.64,5.88,1.42,-6.95,-7.89,-8.34,-8.73,-9.21,-9.3,-8.05,-6.85,-6.16,-4.16,-2.69,-2.02,-1.92,-1.25,-0.71,1.16,2.06,3.18,3.19,3.9,4.35,3.13,-3.56,-3.29,-4.17,-2.73,-2.25,-1.83,-2.09,-1.96,-1.37,-1.14,-1.7,-1.69,-1.09,-0.26,1.27,2.04,2.56,3.35,3.66,3.49,3.82,4.24,4.45,4.51,4.61,4.64,4.71,4.83,4.87,4.71,4.46,3.22,0.54,-0.13,-0.14,-0.2,-1.25,1.39,2.59,1.73,2.1,2.29,2.32,2.51,2.73,2.36,2.1,2.57,2.62,2.63,2.13,1.51,1.26,0.5,0.63,-0.05,2.49,4.27,-0.39,2.48,5.93,5.94,6.89,5.7,6.76,0.83,-5.0,-4.64,-4.09,-9.0,-9.16,-8.98,-8.94,-7.76,-6.45,-6.05,-5.32,-3.98,-3.14,-3.29,-3.12,-3.18,-3.02,-2.01,-1.29,-1.02,-0.18,0.25,0.18,0.54,0.49,0.72,1.1,1.53,1.57,2.07,3.05,3.33,3.89,4.59,4.71,5.49,5.19,5.26,5.9,6.61,6.89,6.84,6.96,7.15,7.23,6.53,7.08,7.87,8.16,10.2,11.3,2.05,-0.47,-0.2,4.18,3.06,5.71,6.6,6.37,5.67,3.68,3.26,2.27,1.73,0.81,1.65,1.99,-0.2,8.17,6.23,2.1,-1.75,-6.01,-8.14,-6.85,-6.3,-6.07,-5.75,-3.87,-2.83,-3.08,-3.03,-2.47,-1.47,-6.04,-4.02,-3.12,-3.7,-2.93,-2.6,-2.82,-3.18,-3.74,-2.88,-3.27,-1.93,-1.74,-1.7,-1.61,-1.57,-1.86,-1.94,-1.57,-0.42,0.91,1.46,1.64,1.94,1.74,1.18,1.29,2.07,2.75,3.21,3.29,3.06,3.25,2.39,2.82,2.73,2.58,2.83,3.07,3.28,3.4,3.45,3.61,3.84,4.18,4.3,4.4,4.91,5.41,5.18,4.81,4.1,4.03,4.73,5.77,6.29,6.41,6.89,6.85,6.48,6.42,6.45,6.73,6.99,7.08,7.38,5.71,4.38,3.55,3.13,2.71,2.55,2.37,2.22,2.25,3.13,2.89,2.84,3.06,2.75,2.38,1.51,-1.63,2.76,2.02,1.99,-1.02,3.61,-3.01,-2.96,-2.8,-2.75,-3.77,-3.2,-3.23,-2.32,-2.08,-0.08,0.58,-1.09,-1.44,-1.3,-0.37,-0.23,0.7,1.39,-2.05,-2.18,-2.32,-1.66,-0.51,0.33,0.77,1.17,1.41,1.68,1.98,2.24,2.23,2.48,2.97,3.47,3.36,3.51,3.74,4.22,3.81,3.47,3.13,2.77,2.62,3.49,3.8,3.49,3.68,3.75,3.25,3.06,3.16,3.03,2.93,2.34,1.73,1.87,2.56,3.41,3.51,3.43,2.81,2.65,2.12,1.83,2.37,2.7,2.89,3.74,3.53,3.92,4.31,3.83,3.86,4.36,4.66,4.68,5.03,4.98,4.95,4.87,5.73,6.35,6.48,6.63,6.82,7.69,8.7,8.76,8.5,6.29,3.54,2.3,1.78,-0.02,1.38,2.23,3.29,4.66,6.44,7.04,-2.59,-10.25,-9.25,-9.37,-9.24,-9.27,-8.72,-8.15,-7.26,-5.3,-3.88,-3.31,-2.25,-1.6,-0.3,0.8,1.41,1.87,2.97,3.48,4.26,3.95,3.04,2.19,-1.49,-1.5,-0.53,-0.43,-3.37,-3.16,-2.66,-1.6,-1.69,-3.08,-2.18,-1.09,-0.44,1.04,1.25,1.61,2.53,3.09,3.43,3.83,4.11,4.33,4.78,5.11,5.47,5.68,5.6,5.38,5.38,6.77,1.41,-0.99,1.37,-1.34,-0.4,2.1,2.01,1.64,2.02,2.18,2.3,2.44,3.49,2.82,2.5,2.36,2.35,3.19,1.61,1.27,1.04,0.34,0.1,4.0,4.74,3.3,2.73,-0.04,0.45,3.59,5.2,5.16,4.63,6.66,3.43,-5.83,-5.56,-8.37,-8.55,-9.84,-9.93,-8.51,-7.27,-6.29,-6.92,-5.47,-4.5,-3.85,-3.88,-3.29,-3.61,-3.17,-2.42,-1.39,-1.08,-0.64,-0.41,-0.57,-0.46,-0.14,0.65,0.89,1.49,2.64,2.87,3.15,3.9,4.3,4.93,5.05,5.36,5.65,6.07,6.38,6.74,6.72,6.82,6.59,6.57,6.21,7.09,7.96,8.52,9.67,11.77,5.68,0.18,0.73,3.86,3.13,7.07,7.1,7.24,4.94,4.23,5.61,4.67,6.51,4.46,4.36,0.46,1.45,5.41,13.0,11.2,1.69,-5.8,-7.56,-6.95,-6.56,-5.84,-5.81,-4.29,-2.66,-2.15,-2.88,-3.6,-7.19,-6.15,-4.81,-3.9,-3.66,-2.86,-2.23,-2.79,-4.32,-4.29,-3.93,-2.29,-1.88,-2.1,-2.36,-2.56,-2.7,-2.69,-2.68,-2.46,-0.55,0.11,0.51,1.09,1.5,1.34,1.63,2.25,2.8,3.03,3.27,3.46,2.98,2.2,2.27,1.89,2.64,2.47,2.85,3.17,3.23,3.38,3.7,4.15,4.72,4.92,5.07,5.37,5.26,4.96,5.05,5.28,5.06,5.43,5.27,5.29,5.53,6.08,6.18,6.32,6.35,6.23,6.28,6.51,6.65,6.76,7.29,3.77,4.38,3.53,2.3,2.85,2.56,2.56,2.68,2.61,2.7,2.99,3.31,3.42,2.63,1.33,0.68,1.9,-1.44,-2.84,0.34,3.14,1.42,1.28,3.06,0.5,-3.43,-4.94,-3.39,-3.36,-2.38,-2.25,-0.95,-0.56,-0.5,-1.31,-1.09,-0.62,-0.5,-0.47,1.7,-0.77,-2.24,-2.22,-1.74,-1.19,-0.42,0.06,0.2,0.43,0.58,1.33,1.63,1.09,1.16,1.92,2.74,3.01,3.3,3.8,3.97,4.1,3.6,3.1,2.81,2.97,3.47,4.09,3.29,2.5,3.25,3.33,3.32,3.1,2.93,2.91,3.15,2.99,2.69,2.29,2.12,2.51,2.12,2.28,2.19,2.09,2.19,2.0,1.83,2.57,2.54,2.75,3.75,3.69,3.74,4.1,4.03,4.1,4.79,4.97,5.0,5.12,5.09,5.39,5.76,6.01,6.22,6.49,6.94,7.63,8.51,8.96,8.5,6.19,3.95,3.17,0.8,-1.04,1.19,2.45,3.1,3.61,5.01,6.08,-3.73,-10.95,-10.27,-9.89,-10.16,-9.35,-8.71,-7.65,-5.71,-5.26,-4.07,-3.25,-2.38,-1.56,-0.04,0.8,1.32,1.83,1.47,1.51,2.19,2.08,1.2,0.67,-0.21,-0.76,-0.46,-0.51,-1.31,-2.34,-3.23,-2.76,-3.62,-3.91,-2.36,0.19,1.15,0.93,1.09,1.66,2.13,2.52,2.9,3.21,3.7,4.47,5.32,6.03,6.6,6.84,6.24,5.27,5.17,-0.08,-0.76,-0.68,-0.36,-0.61,0.41,1.19,1.31,1.89,2.47,2.49,2.27,2.64,2.4,1.77,2.29,2.48,2.59,1.9,0.93,1.53,0.11,6.3,6.96,8.55,6.2,-1.0,-2.53,-3.41,-1.86,1.28,3.45,3.24,2.76,7.53,4.29,-2.06,-7.0,-7.56,-9.11,-10.14,-8.78,-7.42,-5.95,-6.97,-6.85,-5.63,-5.09,-4.63,-4.06,-4.24,-3.83,-2.83,-1.82,-1.69,-0.61,-0.37,0.31,1.09,1.58,1.77,1.69,2.03,2.67,2.93,3.85,4.21,4.42,4.54,4.44,6.02,4.18,5.67,5.62,6.2,6.4,6.53,6.05,6.19,6.45,7.03,7.63,8.01,8.69,10.38,11.73,2.83,0.16,2.69,2.53,6.19,6.47,6.58,4.31,5.64,5.69,4.63,3.94,4.36,2.85,0.5,0.59,3.84,13.03,14.45,10.67,-6.73,-8.67,-8.11,-6.9,-6.0,-5.5,-4.63,-2.24,-2.06,-3.45,-7.81,-7.5,-5.96,-5.01,-4.39,-3.76,-3.33,-3.2,-3.79,-4.68,-5.18,-4.69,-2.9,-2.13,-2.44,-2.66,-3.08,-3.21,-3.19,-4.03,-2.74,-1.34,-0.46,0.19,0.52,0.82,1.32,2.39,2.57,2.36,2.65,3.12,3.77,3.46,2.73,2.36,1.89,2.27,3.54,3.25,2.81,3.1,3.36,3.6,4.01,3.91,3.71,3.9,4.05,4.09,4.12,4.35,4.49,4.75,4.93,5.43,5.47,5.32,5.4,5.73,5.72,5.41,5.44,5.43,5.62,5.97,6.32,5.68,5.38,3.8,3.37,3.1,3.26,3.15,3.52,3.3,3.19,3.29,3.09,2.9,3.12,2.63,1.97,1.29,0.48,0.36,-0.74,-5.42,-6.69,-2.92,1.19,6.56,1.0,2.71,3.04,-2.54,-3.28,-2.52,-1.93,-1.9,-1.26,-1.09,-1.1,-2.04,-1.94,-1.54,-0.49,-0.34,-0.51,-1.86,-2.09,-1.99,-1.62,-1.09,-0.51,-0.25,-0.26,-0.31,0.01,0.49,1.34,0.94,1.31,1.84,1.99,2.52,3.23,3.56,3.72,4.0,3.0,2.55,3.22,3.87,4.22,4.79,3.46,3.12,3.64,3.74,3.97,3.98,2.88,2.37,2.34,2.39,2.32,2.57,1.7,1.69,1.56,1.45,1.76,2.25,2.71,2.83,2.58,2.37,2.58,3.1,3.15,3.59,3.45,3.29,3.67,3.93,4.28,4.68,4.95,4.85,4.81,4.94,5.12,5.24,5.61,6.3,6.99,7.73,8.38,8.86,8.47,7.38,5.62,3.78,2.37,2.64,2.5,2.28,1.62,2.85,4.69,6.28,-5.97,-13.08,-11.82,-11.24,-10.19,-8.68,-6.94,-6.46,-6.07,-4.02,-3.26,-1.72,-0.03,0.85,1.3,1.03,0.54,0.85,0.96,0.64,0.85,1.21,1.41,0.57,-0.11,-0.76,-1.44,-0.9,-0.33,-1.46,-4.36,-4.41,-5.4,-3.79,-2.19,-0.04,-0.01,0.08,0.67,1.13,1.51,1.73,2.09,2.93,4.31,5.41,6.22,6.86,7.18,6.99,5.12,3.01,0.48,-0.58,-1.94,0.19,1.58,0.25,-0.07,1.04,2.08,2.56,2.34,2.15,2.28,2.22,1.83,1.72,1.61,1.56,1.34,1.15,1.33,0.75,7.99,9.93,11.03,12.34,0.34,-5.09,-5.27,-4.84,-2.93,-0.14,1.67,1.23,1.24,5.21,5.07,1.08,-7.82,-8.11,-9.9,-8.93,-7.91,-6.63,-5.95,-7.16,-6.53,-6.0,-5.85,-4.69,-4.74,-5.07,-4.14,-3.17,-2.32,-1.81,-0.45,-0.67,-0.5,1.64,2.61,1.81,2.06,2.62,2.9,3.89,4.26,4.4,4.49,5.64,5.48,4.72,4.39,5.52,6.53,6.18,5.79,5.59,5.75,5.88,6.05,6.67,6.7,6.81,8.37,9.94,7.22,0.76,3.98,3.82,5.55,5.81,4.96,5.31,6.17,4.11,3.78,3.14,1.37,-1.13,0.29,0.82,5.45,15.48,15.47,15.04,-7.14,-9.26,-9.49,-7.99,-6.91,-6.57,-5.02,-2.85,-3.93,-5.36,-7.01,-6.8,-6.04,-4.91,-4.36,-4.05,-3.54,-3.0,-3.41,-4.73,-4.87,-4.61,-3.39,-2.86,-2.55,-2.66,-3.56,-4.13,-4.73,-3.84,-2.84,-1.95,-1.0,-0.56,-0.54,-0.12,1.02,1.46,1.75,1.87,1.98,2.5,3.11,3.65,4.1,4.31,4.31,2.79,2.02,1.4,1.29,1.93,3.07,3.71,3.88,3.96,3.9,3.7,3.49,3.64,3.51,3.76,4.2,4.75,5.74,6.42,6.69,6.53,6.37,6.51,6.5,6.59,6.2,6.16,6.48,6.71,6.62,7.06,7.26,3.24,3.75,3.48,3.36,3.4,3.59,3.58,3.65,4.03,3.49,3.53,3.2,2.76,2.59,1.88,0.85,0.39,-0.15,0.03,-2.36,-4.25,-5.74,-3.05,3.18,3.94,-3.38,1.14,3.68,-0.23,-0.59,-1.06,-0.55,-1.54,-1.15,-1.97,-2.14,-2.06,-2.12,-1.12,-3.32,-2.89,-2.41,-2.27,-1.7,-1.22,-0.86,-0.24,-0.25,-1.61,-1.37,-0.83,-0.43,-0.15,0.47,1.44,2.28,2.54,3.19,3.69,3.85,3.88,3.39,3.06,2.52,3.45,3.91,3.97,4.81,5.28,5.4,5.78,5.49,4.11,3.57,2.96,2.91,2.93,2.71,2.87,2.45,1.04,0.66,0.64,1.46,2.36,2.78,2.75,3.51,4.24,3.75,2.63,2.75,2.73,2.29,2.29,2.65,3.31,3.64,3.8,4.02,4.34,4.46,4.44,4.47,4.33,4.77,5.39,6.15,6.65,6.96,7.26,8.39,8.38,8.38,6.95,4.84,3.14,3.19,3.64,3.01,2.68,2.91,3.99,7.19,-14.61,-13.41,-11.87,-10.1,-8.51,-7.49,-6.72,-6.32,-4.89,-2.43,-0.89,0.19,0.95,2.15,1.96,1.54,1.46,1.15,0.05,-0.39,-0.06,-0.2,-0.3,0.45,0.7,0.05,-1.41,-1.64,0.01,-2.21,-6.2,-5.38,-4.75,-3.09,-2.3,-1.4,-0.69,-0.28,0.03,0.2,0.47,1.05,2.3,3.89,5.45,6.54,7.11,7.38,7.24,5.62,0.14,0.33,-2.59,1.18,1.43,-0.76,0.22,0.1,1.22,2.06,2.31,2.05,2.37,2.22,2.38,1.97,0.97,1.41,1.93,2.02,2.04,2.36,0.93,9.67,9.69,9.73,10.84,6.93,-4.31,-7.3,-7.22,-4.14,-2.1,-0.92,0.48,0.4,2.91,1.94,5.31,3.13,-8.66,-9.38,-10.12,-8.86,-7.69,-6.62,-6.23,-7.39,-7.04,-6.94,-6.24,-5.34,-5.32,-5.02,-4.71,-3.62,-2.25,-0.62,-0.2,1.19,0.86,0.25,0.98,1.92,3.11,3.16,3.0,2.81,3.46,5.62,6.28,3.2,4.02,4.81,5.53,5.73,5.37,5.14,5.42,5.31,5.17,5.37,5.81,5.96,6.33,7.46,8.29,10.33,3.64,2.38,2.8,7.68,6.75,6.23,7.32,7.23,6.17,6.09,2.58,0.52,-1.03,1.22,2.56,14.88,14.56,14.85,14.87,4.81,-6.62,-7.37,-8.75,-8.06,-7.1,-5.48,-3.91,-5.78,-5.7,-6.39,-6.64,-5.97,-4.87,-3.59,-3.08,-3.09,-2.66,-3.54,-4.8,-5.84,-5.01,-3.57,-3.67,-2.93,-3.14,-3.56,-5.04,-4.91,-3.98,-3.06,-2.33,-1.46,-1.24,-2.05,-1.02,0.06,0.78,1.2,1.28,1.72,2.36,3.04,3.41,3.75,3.8,3.72,3.8,3.23,3.26,3.29,2.91,2.4,2.3,2.57,2.92,3.43,4.1,4.72,4.56,4.32,4.49,4.47,5.14,6.26,6.72,6.64,6.45,6.43,6.18,6.31,6.52,6.43,6.5,6.58,7.04,6.82,7.47,6.74,4.44,3.48,2.59,2.97,2.93,3.2,3.05,3.59,4.04,4.32,4.13,4.13,4.06,3.32,2.12,1.62,0.98,0.18,-0.76,-1.66,-2.08,-4.78,-7.52,-6.42,-2.07,1.25,-6.0,-6.48,-1.77,1.43,-1.26,0.31,0.73,0.97,-1.73,0.32,-1.86,-0.91,-2.12,-5.56,-4.46,-3.55,-2.4,-1.84,-1.83,-2.17,-1.36,0.04,-1.25,-2.85,-1.51,-1.15,-0.58,-0.36,0.32,1.38,2.43,3.15,3.67,4.05,3.9,3.83,3.33,3.51,3.07,3.39,3.85,4.2,4.67,5.47,5.59,5.63,6.37,5.56,2.52,2.22,2.64,3.3,3.65,3.61,3.08,1.25,0.84,1.4,2.31,3.36,3.55,4.01,4.15,4.02,3.76,3.67,3.84,3.21,2.89,3.72,3.15,2.79,2.92,2.58,2.14,2.08,2.86,3.65,3.98,3.98,4.22,4.67,5.08,5.82,6.28,6.8,6.89,6.92,7.81,7.31,5.93,4.73,4.78,4.87,4.31,4.24,4.38,3.02,-7.11,-14.66,-11.89,-10.11,-8.84,-8.36,-7.32,-6.41,-5.02,-3.33,-0.98,-0.02,1.01,1.7,1.84,2.1,2.08,1.59,0.87,-0.75,-1.72,-2.22,-1.88,-1.61,-0.99,-0.19,-0.35,-1.3,-1.07,1.91,-7.23,-6.62,-5.14,-3.69,-2.77,-2.83,-1.37,-0.99,-0.85,-0.89,-0.65,0.12,1.48,3.33,5.14,6.57,7.37,7.51,8.01,7.53,0.77,-0.64,-2.52,0.27,-0.98,0.22,-2.99,0.09,1.25,1.61,2.31,2.38,2.23,2.26,2.47,2.46,1.88,1.95,0.06,-0.17,0.52,-0.02,5.2,7.95,6.87,7.22,8.16,7.0,-0.61,-7.68,-8.08,-5.19,-3.84,-1.57,-1.06,0.1,0.63,2.79,0.19,4.33,6.34,-7.62,-9.57,-9.7,-8.5,-7.43,-6.51,-6.64,-7.95,-7.51,-7.21,-6.3,-5.77,-5.3,-5.18,-5.33,-4.24,-2.71,-0.68,-0.6,-0.16,0.11,0.73,1.05,1.66,1.77,1.29,1.56,4.46,4.53,5.36,2.71,4.13,4.72,5.05,5.13,4.87,4.58,4.89,4.37,4.51,4.95,5.12,5.68,6.61,7.31,8.17,9.38,9.0,0.18,4.64,5.6,5.68,6.13,8.82,7.45,8.36,9.13,6.01,0.97,2.97,2.23,10.14,16.4,14.12,14.05,14.39,13.53,-2.46,-6.85,-7.59,-7.94,-7.15,-5.67,-4.97,-6.15,-6.94,-5.98,-5.2,-4.32,-4.91,-4.53,-3.94,-3.26,-3.04,-4.25,-5.58,-5.56,-5.26,-4.62,-4.31,-3.45,-3.15,-3.87,-4.99,-5.43,-4.89,-3.99,-2.34,-1.38,-1.67,-2.72,-2.01,-0.56,0.4,0.65,0.98,1.25,1.64,2.09,2.46,2.55,2.59,2.31,1.66,1.26,1.37,1.64,2.33,3.33,4.32,4.66,4.47,4.97,5.36,4.17,4.3,5.11,5.52,5.83,5.9,5.8,5.88,6.32,6.53,6.17,5.77,5.77,6.04,6.26,6.29,6.41,6.81,6.97,6.76,6.65,4.42,3.55,3.8,3.84,3.65,3.28,4.29,4.54,4.58,4.81,5.22,5.11,4.52,4.81,3.82,2.54,1.54,0.33,-1.28,-3.17,-4.47,-3.88,-7.03,-8.81,-7.93,-6.49,-5.21,-5.57,-6.52,-5.26,-5.25,-3.34,-1.97,-2.49,-2.98,-2.6,-1.75,-1.48,-2.27,-7.24,-5.79,-4.2,-2.96,-2.5,-2.61,-3.07,-1.96,-0.47,-0.63,-3.54,-2.14,-1.55,-0.89,-0.09,0.68,1.45,2.17,2.62,3.17,3.6,3.98,4.28,4.83,4.29,3.67,3.52,3.86,4.45,5.13,5.59,6.13,5.54,5.22,4.94,5.19,3.08,1.84,2.74,4.18,4.61,3.9,2.88,1.83,1.95,2.1,2.57,2.97,3.44,3.85,4.75,3.65,3.86,4.78,3.75,3.66,4.05,4.23,4.31,4.82,5.25,5.4,4.25,3.07,2.46,2.61,3.0,3.47,3.59,3.66,4.2,4.49,4.97,5.6,6.29,6.93,7.45,7.03,6.65,6.75,7.38,7.01,6.02,4.99,3.48,-2.35,-12.25,-11.78,-10.35,-9.6,-8.76,-7.35,-5.9,-4.35,-3.08,-1.19,0.66,1.32,1.55,1.57,0.86,0.98,0.98,0.7,0.52,-0.15,-1.18,-2.3,-2.64,-2.32,-1.57,-1.21,-1.08,-2.12,-2.58,-2.78,-5.45,-6.07,-4.63,-4.64,-3.77,-2.66,-2.08,-1.41,-1.7,-1.49,-0.67,0.85,2.94,4.82,6.35,6.91,8.18,9.52,9.17,0.19,-1.38,-1.42,1.28,-0.38,-1.79,-1.92,1.45,1.83,2.45,3.63,2.54,2.13,2.23,2.77,4.01,3.63,2.12,1.47,0.81,-0.98,1.24,4.81,5.12,4.75,3.92,4.92,5.16,4.82,3.19,0.43,-2.11,-3.19,-3.24,-2.36,-1.97,-0.62,-0.41,1.11,-0.53,1.83,3.34,3.87,-9.36,-8.83,-7.49,-7.21,-6.16,-6.11,-8.23,-7.56,-7.23,-6.18,-5.75,-5.6,-5.85,-5.69,-5.27,-4.01,-1.67,-0.73,-0.89,-0.47,0.99,1.16,0.95,2.99,3.51,3.82,5.17,2.17,1.93,3.27,3.72,4.26,4.44,4.58,4.26,4.19,3.83,3.98,4.51,4.92,5.78,6.55,7.1,7.8,8.4,8.94,1.77,-0.93,4.45,5.84,6.72,8.39,6.97,7.54,6.13,5.95,2.93,-0.04,2.1,12.19,12.05,12.02,12.46,12.62,12.74,12.54,-6.41,-7.82,-7.6,-6.85,-5.5,-5.5,-6.43,-7.51,-6.15,-4.62,-3.86,-4.51,-5.05,-4.41,-3.83,-3.75,-4.64,-6.11,-5.96,-5.91,-4.77,-4.2,-3.47,-2.37,-2.82,-3.9,-6.14,-5.74,-3.91,-2.41,-1.58,-2.09,-3.11,-2.63,-1.34,-0.45,0.22,0.82,1.65,1.83,1.7,1.71,1.46,1.41,1.37,1.62,1.68,1.94,2.33,3.11,3.75,4.36,4.6,4.62,4.62,5.11,5.11,4.59,4.95,5.34,5.36,5.44,5.96,6.29,6.63,7.02,6.62,6.01,5.41,5.61,5.71,5.62,5.57,5.63,5.57,5.67,5.74,4.81,1.81,3.26,3.64,3.42,4.02,4.23,4.23,4.14,4.46,4.98,5.19,5.14,4.14,3.0,2.87,1.2,-0.57,-1.28,-3.07,-4.9,-5.46,-5.81,-8.9,-8.98,-7.69,-5.7,-6.74,-6.51,-6.8,-4.77,-3.47,-2.49,-3.01,-3.42,-1.79,-0.72,-0.19,-3.51,-8.77,-6.88,-5.04,-4.03,-3.4,-2.91,-2.27,-2.32,-1.87,-1.45,-3.46,-2.08,-1.7,-1.17,-0.11,0.72,1.86,2.72,3.5,3.16,3.23,3.73,4.26,4.41,4.31,4.23,3.47,2.99,3.69,4.8,5.45,5.72,5.82,5.51,3.89,3.55,3.17,3.14,2.62,3.26,4.36,4.55,3.32,2.6,2.88,3.34,3.63,3.04,2.25,3.27,3.79,3.59,3.28,4.1,4.08,3.75,3.92,4.02,4.2,4.64,5.22,5.52,5.51,5.46,5.29,5.45,4.82,3.65,2.21,1.19,2.15,2.78,3.2,4.0,5.0,5.71,6.01,6.05,6.42,6.95,7.18,7.91,7.72,5.2,3.68,-2.76,-12.12,-13.57,-12.3,-11.28,-10.06,-8.44,-6.39,-4.6,-3.13,-0.82,0.7,1.36,1.64,1.24,1.47,1.45,0.98,0.34,0.01,0.16,-0.17,-0.91,-1.43,-1.95,-2.56,-2.39,-1.69,-1.2,-1.66,-2.58,-1.87,-5.97,-6.27,-5.56,-5.41,-4.35,-3.56,-1.94,-2.32,-2.04,-1.29,0.01,2.12,4.22,6.08,7.38,8.45,9.88,11.06,1.74,0.41,-1.36,0.41,-3.18,-4.47,-0.21,2.97,2.31,2.55,2.85,2.32,2.29,2.56,2.66,3.24,3.63,3.31,2.33,1.48,5.75,6.88,6.9,6.36,2.78,2.11,1.89,2.05,0.01,-2.91,-0.87,2.77,0.64,2.06,-3.3,-3.94,-2.85,-1.35,-0.95,0.87,-0.66,-0.28,0.72,3.8,-4.4,-8.9,-7.73,-6.81,-4.89,-7.28,-7.1,-7.38,-7.04,-6.04,-5.93,-6.33,-5.73,-5.82,-4.64,-3.29,-2.09,-0.47,-0.45,-1.15,-0.25,4.38,3.64,0.5,3.06,6.56,2.7,0.3,1.48,3.01,3.55,3.58,3.89,3.64,3.17,2.98,3.24,3.82,4.23,5.02,6.06,6.83,7.29,8.04,8.04,5.8,0.98,0.48,4.06,6.18,3.97,3.31,3.02,2.48,1.31,2.55,2.54,11.16,12.23,9.92,8.76,9.55,10.78,12.77,11.99,12.3,-5.66,-6.97,-5.54,-4.62,-4.15,-6.76,-8.52,-7.85,-6.87,-4.43,-4.07,-5.65,-5.06,-4.39,-3.5,-4.56,-5.99,-7.12,-7.39,-6.28,-5.79,-5.07,-3.82,-3.36,-3.76,-4.72,-5.02,-4.12,-2.96,-2.58,-2.44,-3.38,-3.02,-2.12,-1.15,-0.5,-0.31,0.45,0.5,0.94,1.19,1.44,1.35,0.98,1.03,1.55,2.17,2.6,2.99,4.53,5.2,5.66,5.38,4.48,4.57,5.4,5.5,5.1,4.66,4.95,5.84,6.51,6.69,6.95,7.1,6.83,6.51,5.6,5.15,5.17,5.44,5.21,5.39,5.52,5.44,4.39,4.07,1.98,3.08,3.25,3.77,3.62,3.62,4.18,5.19,4.6,4.4,5.62,6.04,6.02,6.51,4.85,2.87,0.28,-0.64,-2.49,-5.63,-6.24,-7.72,-6.2,-7.1,-7.0,-6.44,-5.78,-5.71,-5.67,-4.51,-3.72,-3.18,-2.74,-4.0,-2.16,-0.89,0.94,-8.39,-9.12,-7.6,-6.23,-5.31,-4.73,-3.86,-3.24,-3.04,-3.11,-3.71,-4.46,-3.81,-2.31,-0.92,-0.02,0.88,1.78,2.92,3.67,4.19,4.89,5.46,5.88,5.54,5.5,5.39,5.17,4.22,3.95,4.33,4.66,4.7,4.75,5.3,4.49,2.02,1.99,3.8,3.2,2.95,3.73,4.15,4.06,3.0,2.76,3.04,3.48,3.21,2.48,2.29,3.13,3.33,3.0,2.62,2.84,3.08,3.05,3.1,3.63,3.98,4.35,4.54,4.72,5.06,5.73,6.16,6.56,6.63,6.15,4.13,0.78,-0.03,1.04,2.15,3.34,4.49,5.31,5.72,5.73,5.73,5.95,6.41,7.0,6.19,3.22,1.04,-11.47,-13.33,-12.51,-11.42,-9.8,-8.25,-6.44,-4.08,-2.58,-0.56,0.8,1.72,2.1,1.91,1.6,1.24,0.72,0.78,0.16,-0.74,-1.39,-1.56,-2.21,-2.15,-2.22,-3.22,-3.18,-2.47,-1.45,-1.42,-3.13,-4.13,-7.76,-7.81,-7.87,-6.88,-5.57,-3.82,-3.0,-2.46,-1.92,-0.84,1.01,3.35,5.37,6.96,8.26,9.38,9.88,0.86,0.92,-2.47,0.67,-1.14,-0.1,-0.42,1.54,1.18,2.12,2.87,3.27,2.65,2.55,2.86,2.88,2.74,2.19,2.67,6.35,8.7,9.07,8.37,7.42,6.26,3.93,1.36,0.87,-0.97,-2.74,-4.67,-4.39,-1.52,-1.14,-1.43,-3.69,-4.43,-3.02,-1.8,-1.26,-0.23,0.7,0.84,-0.01,0.68,1.47,-7.32,-6.54,-5.92,-6.8,-7.8,-6.81,-6.79,-6.64,-5.27,-5.15,-5.77,-6.05,-4.87,-3.76,-3.61,-2.97,0.46,-2.46,0.15,2.63,3.35,1.16,2.46,5.09,3.69,-1.04,-1.4,0.14,2.39,3.21,2.7,2.54,2.15,2.03,2.25,2.94,3.54,4.21,5.18,5.78,6.49,7.03,8.69,4.26,0.04,3.56,0.74,0.44,4.46,0.75,0.15,2.63,-0.89,6.95,13.24,13.15,12.91,11.61,9.34,7.8,7.32,9.45,10.47,10.62,10.76,-4.18,-7.24,-5.38,-4.73,-5.21,-7.35,-8.91,-7.83,-6.08,-3.47,-5.97,-6.34,-5.52,-4.49,-4.09,-4.62,-6.81,-8.04,-6.49,-6.11,-5.96,-5.39,-4.8,-5.11,-5.25,-4.66,-3.94,-3.84,-3.62,-3.05,-3.0,-3.44,-2.74,-1.87,-1.18,-1.07,-0.52,-0.13,0.32,1.0,1.5,1.66,0.89,0.58,1.48,2.24,3.22,4.09,4.82,5.62,5.93,6.97,6.43,5.02,5.47,6.01,5.27,4.55,4.88,5.75,6.56,7.01,6.94,7.01,6.54,6.55,5.36,5.09,5.29,5.51,4.86,4.98,5.67,6.05,5.48,4.56,2.66,2.35,3.39,3.95,3.39,4.25,5.24,5.47,5.2,7.27,6.75,6.79,6.02,5.38,4.09,2.89,1.46,-3.79,-5.04,-4.13,-7.12,-9.01,-6.03,-6.15,-6.78,-7.13,-6.01,-5.73,-5.31,-4.09,-2.92,-3.6,-4.38,-2.6,-0.83,-1.86,-1.37,-5.16,-8.38,-8.35,-7.32,-5.68,-5.1,-4.56,-3.29,-2.66,-2.96,-5.14,-6.04,-5.03,-3.28,-1.84,-0.45,0.35,1.5,2.74,3.12,3.74,4.4,5.01,5.42,5.58,5.96,6.08,5.92,5.73,5.3,5.67,5.42,4.92,3.76,3.61,3.82,3.51,1.66,3.25,3.07,2.55,2.74,2.9,2.77,2.45,1.58,1.57,1.97,2.51,2.93,2.47,1.92,1.94,2.08,2.4,2.82,2.52,2.42,2.81,3.18,3.49,3.89,3.81,3.94,4.23,4.85,5.4,5.66,5.95,6.17,6.06,5.09,2.03,-1.04,-0.18,1.28,2.84,4.12,5.12,5.86,6.02,5.9,6.0,6.14,6.33,4.29,2.72,-7.26,-13.68,-12.94,-11.4,-8.4,-7.37,-6.04,-3.85,-1.91,-0.05,1.18,1.61,1.73,1.7,2.05,2.17,1.15,0.8,0.34,-0.8,-1.05,-2.55,-2.82,-2.9,-2.49,-3.12,-3.98,-4.09,-2.76,0.58,-1.95,-5.86,-8.83,-9.36,-7.92,-8.18,-6.94,-5.98,-4.49,-3.52,-2.73,-1.63,-0.2,1.83,3.93,5.79,7.34,8.54,8.88,1.19,0.23,0.25,3.24,-3.74,-3.34,-1.07,0.56,0.55,2.05,3.26,2.77,2.16,2.39,3.74,3.6,2.73,2.66,4.95,8.39,9.35,9.15,6.99,5.53,5.07,5.35,4.17,1.96,0.08,-1.37,-3.35,-3.55,-1.75,-2.04,-2.81,-4.07,-5.0,-5.03,-3.38,-2.57,-1.98,-1.21,-0.06,0.36,-2.29,-1.39,1.96,-6.21,-6.65,-7.44,-8.2,-8.12,-6.67,-6.38,-6.2,-5.67,-5.4,-5.46,-4.87,-3.82,-4.2,-3.71,-1.41,-1.83,-2.3,0.26,2.58,-1.25,0.52,4.11,4.62,-1.85,-3.49,-2.43,-1.31,-0.09,0.89,1.05,0.91,0.51,1.08,2.23,2.86,3.54,4.09,4.64,4.91,6.45,6.48,7.26,1.4,0.85,1.1,0.51,1.83,3.42,6.26,8.79,10.99,12.77,13.31,13.29,12.44,11.1,10.5,8.59,6.7,3.61,5.25,7.64,9.1,8.94,0.08,-8.55,-7.72,-4.69,-7.12,-7.86,-7.82,-7.28,-5.12,-3.18,-6.69,-6.78,-6.12,-5.21,-4.72,-4.95,-7.01,-6.86,-6.29,-6.1,-6.26,-5.83,-5.61,-5.88,-5.61,-4.63,-3.94,-4.39,-4.27,-3.9,-3.73,-3.13,-2.51,-2.02,-1.76,-1.53,-0.8,0.16,0.0,0.46,1.18,0.92,0.41,0.69,1.62,2.72,3.93,4.99,5.78,5.59,5.56,6.57,6.52,5.61,5.77,5.14,4.47,4.78,5.57,6.27,6.67,6.71,6.8,7.0,6.48,6.05,4.79,4.7,5.29,5.17,4.97,5.48,5.91,6.46,5.75,2.66,2.29,2.8,3.21,5.07,5.88,6.01,6.13,6.42,6.65,6.9,6.75,6.51,5.84,4.31,2.53,2.3,-0.69,-6.44,-6.98,-4.9,-6.07,-6.42,-5.73,-5.14,-6.63,-6.46,-6.3,-5.79,-4.74,-4.34,-3.51,-2.98,-1.3,0.33,-0.57,-5.51,-4.87,-8.75,-9.25,-8.44,-7.65,-6.06,-5.59,-4.1,-2.56,-2.4,-5.04,-5.53,-5.24,-3.78,-1.97,-0.2,0.47,1.09,1.83,2.23,2.17,4.07,4.97,4.59,4.68,5.27,5.8,5.87,6.1,5.89,5.78,6.06,5.54,4.78,3.39,2.17,2.24,2.25,2.78,2.23,1.97,2.34,2.41,2.47,1.92,1.01,0.16,0.18,0.56,0.78,1.14,1.42,1.43,1.39,1.42,1.8,2.51,2.15,2.37,3.1,3.63,3.96,3.68,3.68,3.92,4.51,5.22,5.8,6.32,6.55,5.92,5.2,4.37,0.47,-2.78,-1.04,0.95,2.76,4.44,5.32,5.99,6.32,6.43,6.3,6.37,4.66,2.27,-1.66,-12.43,-12.44,-10.33,-7.86,-6.84,-4.83,-2.77,-0.79,0.49,1.54,1.94,1.87,2.24,1.95,1.61,1.09,0.22,-0.7,-1.31,-2.06,-2.42,-2.32,-2.03,-3.45,-3.29,-4.41,-5.76,-4.54,-3.68,-0.38,-4.68,-4.31,-2.45,-6.63,-7.14,-7.77,-7.1,-6.68,-5.59,-4.3,-2.62,-1.39,0.73,2.69,4.38,6.19,7.6,5.48,0.95,0.33,-2.84,-0.21,-0.17,-2.58,-1.51,0.4,1.32,2.73,3.62,3.34,3.32,4.08,3.6,3.17,2.34,2.82,11.1,11.3,10.5,7.33,5.58,4.61,3.75,2.93,2.71,2.99,1.62,-1.72,-3.83,-4.37,-3.69,-3.29,-3.22,-3.73,-4.67,-5.09,-5.29,-4.46,-3.32,-3.06,-3.02,-1.87,-1.19,-2.55,-1.19,2.09,-4.15,-2.59,-6.27,-8.86,-7.92,-7.14,-6.61,-6.27,-6.08,-5.53,-4.85,-4.27,-4.2,-4.16,-3.89,-2.83,-3.19,-2.57,-0.42,1.49,1.34,1.65,4.94,2.73,-3.86,-4.09,-2.65,-2.14,-1.61,-1.09,-0.74,-0.92,0.24,1.11,2.03,2.43,3.01,3.52,4.18,4.91,5.16,5.6,4.89,4.9,6.53,7.24,8.16,9.31,9.38,10.06,11.89,12.11,11.85,11.76,11.41,10.56,9.43,9.55,7.89,4.0,0.2,1.4,5.08,7.34,7.52,7.21,-4.22,-8.9,-7.71,-8.13,-9.18,-7.47,-7.04,-4.95,-4.98,-7.0,-6.43,-6.23,-5.42,-5.54,-6.63,-7.44,-7.52,-6.94,-7.13,-7.12,-6.45,-6.44,-6.35,-5.62,-4.63,-4.78,-5.18,-4.97,-4.24,-3.61,-3.28,-3.01,-2.39,-1.98,-1.8,-0.97,-0.07,-0.64,-0.26,0.23,0.27,0.51,1.27,2.29,3.42,4.35,5.09,5.98,5.83,5.06,5.72,5.78,5.28,4.59,4.21,3.94,4.88,5.52,6.46,6.49,6.37,6.58,6.37,6.14,5.65,5.0,5.09,5.2,5.13,5.47,5.54,5.83,6.08,5.38,4.34,4.07,6.58,6.23,6.05,6.74,7.06,7.34,7.92,7.78,7.05,6.69,6.06,4.88,2.95,2.45,4.56,-4.82,-8.13,-7.71,-5.23,-6.6,-5.54,-6.82,-6.21,-6.25,-6.08,-6.11,-5.24,-4.81,-4.58,-1.82,-1.22,-0.74,-3.31,-4.12,-4.99,-9.65,-10.02,-9.29,-9.04,-8.23,-6.68,-5.13,-3.8,-3.99,-4.76,-4.75,-4.92,-3.75,-1.8,-0.02,1.0,1.23,1.55,2.06,2.47,2.47,2.48,2.53,5.23,6.23,6.84,7.02,7.3,7.33,7.12,6.86,6.56,6.22,6.11,5.75,2.59,1.11,0.41,-0.01,0.63,1.29,1.67,1.92,1.7,0.85,0.67,0.3,0.37,0.58,0.92,0.96,1.03,0.89,0.86,0.78,0.98,1.94,2.72,3.24,3.71,3.73,3.8,3.89,4.35,4.94,5.45,5.94,6.84,6.51,6.12,5.33,4.46,2.6,-2.58,-3.67,-1.12,1.16,3.41,5.03,6.07,6.5,7.03,6.62,6.16,4.15,1.98,-3.0,-9.54,-12.02,-10.08,-6.58,-4.89,-3.6,-1.67,-0.3,1.03,1.01,1.55,1.77,2.0,2.13,1.97,1.36,0.55,-0.09,-1.14,-2.06,-1.9,-2.97,-2.58,-1.52,-2.45,-4.79,-6.16,-6.49,-6.08,-6.21,-6.4,-4.35,-4.03,2.28,-2.92,-9.87,-8.81,-9.04,-6.89,-5.38,-3.84,-1.99,0.56,1.71,3.77,5.21,7.12,2.41,1.1,-0.86,-4.46,-1.79,-2.42,-2.17,-0.57,0.96,1.43,2.4,3.36,3.28,3.31,3.37,8.15,8.41,9.37,11.31,11.35,11.93,11.71,7.39,5.6,4.16,2.75,2.77,2.62,1.91,1.76,0.58,-1.33,-3.13,-3.4,-3.26,-3.91,-3.49,-4.63,-6.27,-6.43,-6.04,-5.18,-4.6,-4.41,-3.94,-2.52,-1.07,-0.56,-0.76,-1.42,-1.01,1.0,-0.05,-7.41,-7.77,-6.94,-6.54,-6.33,-6.08,-5.8,-5.4,-4.19,-3.24,-2.95,-4.23,-3.7,-3.08,-2.94,-0.48,1.77,2.45,2.27,1.35,-1.17,-5.97,-5.64,-4.34,-3.44,-3.1,-2.82,-2.69,-1.75,-0.42,0.86,1.54,1.82,2.44,3.69,5.07,5.52,4.9,5.34,6.3,7.18,7.94,8.5,9.15,10.32,11.89,11.9,12.08,12.52,12.2,11.34,10.93,10.3,9.51,8.87,5.52,0.98,-0.56,-0.23,3.53,5.72,5.84,7.14,3.32,-9.17,-10.0,-8.54,-9.42,-7.81,-7.57,-5.53,-8.36,-6.81,-6.2,-6.81,-6.86,-8.0,-8.63,-8.63,-8.03,-7.07,-7.35,-7.33,-7.06,-6.41,-5.53,-4.94,-4.56,-4.41,-4.86,-4.99,-4.24,-3.91,-3.91,-3.37,-2.61,-2.34,-1.85,-1.07,-1.33,-1.46,-0.64,-0.34,0.21,0.94,2.2,3.49,4.55,5.23,5.48,5.48,5.76,4.67,5.31,5.39,5.24,3.84,4.17,3.92,4.58,5.32,5.95,6.11,5.89,5.96,5.83,5.31,5.59,5.4,5.17,5.09,5.11,4.92,5.62,6.12,5.93,6.22,6.08,6.75,6.6,6.87,6.97,7.63,8.29,8.07,8.64,7.67,6.83,6.37,5.06,2.73,1.0,2.75,4.92,-9.31,-9.01,-8.42,-8.12,-7.01,-6.48,-7.72,-7.35,-8.09,-4.36,-4.04,-3.29,-3.15,-1.33,-1.68,-1.38,-6.97,-4.5,-5.44,-9.32,-9.84,-9.52,-9.75,-8.92,-6.52,-6.12,-5.16,-5.31,-5.4,-4.13,-3.43,-3.02,-1.45,0.19,1.57,1.92,2.45,2.26,1.93,0.12,-1.45,-0.05,5.85,6.56,7.52,7.77,8.3,8.71,8.94,8.85,8.55,8.04,7.59,7.26,7.15,5.85,2.72,-0.16,-0.85,-0.58,-0.38,-0.07,0.28,0.67,0.0,0.05,0.13,0.28,0.59,0.66,0.86,0.76,0.5,0.26,0.29,0.97,1.98,2.72,3.26,2.98,2.81,3.24,4.1,5.12,5.57,6.15,6.27,6.11,5.61,5.06,4.55,3.23,-0.42,-4.34,-3.36,-0.31,2.37,4.85,6.55,7.89,8.13,6.91,5.93,3.18,-0.44,-6.6,-10.44,-10.77,-8.82,-6.88,-4.94,-3.13,-1.38,0.31,1.33,2.11,2.25,2.45,2.11,1.69,1.3,0.99,-0.16,-1.83,-2.16,-2.03,-3.51,-3.96,-3.99,-3.27,-2.14,-4.41,-6.04,-7.64,-7.08,-7.83,-7.31,-5.99,-5.32,-2.91,1.72,4.96,-1.66,-7.0,-4.73,-3.08,-3.07,-0.7,0.9,0.52,3.18,4.58,4.26,1.58,0.97,-1.82,-3.9,-5.61,-3.96,-2.77,-1.22,0.53,1.16,2.08,2.89,2.98,2.68,2.71,8.17,8.79,9.57,10.78,11.49,12.94,11.0,8.68,6.2,6.05,5.37,4.26,3.3,2.45,1.44,-0.29,-0.51,-1.92,-3.36,-3.91,-3.97,-4.26,-4.18,-5.37,-6.97,-7.26,-6.7,-5.46,-5.39,-5.45,-4.54,-2.71,-1.28,-0.98,-0.52,-1.33,-1.82,-1.64,0.92,1.38,-6.98,-6.87,-6.82,-6.61,-6.32,-6.12,-6.08,-5.49,-5.03,-4.6,-4.12,-3.4,-3.86,-1.9,-1.5,-0.47,0.32,-1.26,-2.13,-6.62,-6.88,-6.47,-5.55,-4.83,-4.51,-4.02,-3.31,-2.49,-1.04,0.03,0.55,1.19,3.54,4.6,5.3,4.8,5.07,7.0,8.06,8.79,8.91,10.2,11.49,11.25,11.61,13.98,12.82,11.98,11.84,11.47,10.96,9.68,8.7,7.5,4.12,1.36,-0.69,-1.28,0.94,3.35,3.4,4.08,4.69,-9.05,-11.01,-9.03,-9.34,-8.24,-8.2,-7.7,-8.75,-7.0,-7.13,-8.11,-8.38,-9.28,-9.65,-9.04,-8.34,-7.61,-7.35,-7.24,-6.52,-5.93,-5.33,-5.11,-4.95,-4.92,-5.33,-5.3,-4.52,-4.06,-3.76,-3.45,-3.03,-2.72,-2.14,-1.51,-1.26,-0.93,-0.27,0.53,1.33,2.19,3.17,4.05,4.64,5.17,5.45,5.31,5.33,4.39,4.9,5.19,5.24,4.33,3.42,3.35,4.06,4.87,5.12,4.88,5.2,5.12,5.44,4.8,4.85,5.07,5.18,5.09,4.91,5.57,6.27,6.29,7.09,7.16,7.61,7.37,7.85,7.75,8.06,7.93,8.97,9.0,9.46,8.79,6.66,4.86,3.63,2.6,-0.48,2.05,3.15,-10.49,-9.75,-9.61,-9.98,-4.8,-5.1,-5.72,-6.32,-4.05,-2.23,-2.52,-2.46,-2.56,-0.3,-1.08,-3.1,-3.4,-4.54,-8.54,-9.93,-9.73,-9.59,-9.71,-9.02,-7.92,-6.55,-5.71,-5.37,-5.27,-4.31,-3.17,-1.57,-0.32,1.43,2.1,3.4,2.22,-1.4,-1.54,-1.93,-0.72,-0.65,8.18,8.73,8.89,9.08,9.39,9.59,9.86,10.38,10.88,10.88,10.64,9.69,8.45,6.63,5.17,2.76,-0.44,-1.84,-1.64,-1.53,-1.3,-0.9,-0.38,-0.49,-0.65,-0.26,0.39,0.93,0.47,-0.09,0.01,-0.46,0.12,0.97,1.58,2.05,2.16,2.12,2.37,3.47,4.78,5.44,5.91,5.88,5.77,5.79,5.25,4.28,3.19,0.65,-4.48,-5.01,-1.84,1.26,4.37,7.12,9.06,9.36,10.04,6.78,-2.19,-5.24,-7.71,-8.45,-8.45,-7.56,-6.31,-4.28,-2.73,-0.73,0.77,2.5,3.04,3.02,2.66,2.35,1.59,0.73,0.04,-0.95,-1.54,-1.41,-1.79,-2.92,-4.33,-4.75,-3.29,-2.47,-3.88,-6.4,-8.46,-7.46,-9.34,-7.03,-4.54,-4.79,-3.7,-1.37,0.01,0.16,-1.55,-1.56,-1.56,-1.62,-0.92,-0.59,0.37,2.37,4.83,0.97,0.87,1.16,-0.79,-0.98,-7.36,-4.11,-3.37,-1.35,0.09,0.82,1.73,2.41,2.5,2.08,1.82,3.54,8.56,9.51,10.43,10.97,11.89,10.25,7.3,6.78,6.71,6.59,6.48,6.23,5.29,3.5,1.46,-0.5,-1.88,-3.18,-4.3,-5.45,-5.57,-4.98,-5.79,-6.96,-8.03,-8.6,-7.85,-7.43,-6.35,-5.56,-4.45,-3.23,-1.57,-0.75,-0.85,-0.95,-1.01,-1.57,-1.43,1.04,0.73,-7.08,-7.31,-7.07,-6.93,-6.66,-6.35,-6.05,-5.95,-5.55,-5.14,-4.62,-4.22,-4.18,-4.14,-2.37,-2.66,-2.69,-5.57,-8.49,-9.01,-8.04,-7.12,-5.94,-5.27,-5.12,-4.81,-3.38,-2.18,-1.43,0.0,2.84,3.62,5.51,4.7,5.83,6.86,7.86,9.65,9.4,10.65,10.64,10.75,12.34,12.34,12.51,12.41,11.94,10.72,10.28,9.94,10.3,9.06,6.35,2.9,0.38,-0.76,-1.78,-1.23,0.37,1.4,1.41,4.05,-9.99,-11.73,-10.0,-9.98,-9.17,-8.42,-9.62,-8.97,-7.14,-7.65,-9.12,-9.98,-10.19,-10.37,-9.44,-8.62,-7.72,-7.25,-6.89,-6.48,-5.83,-5.63,-5.49,-5.48,-5.32,-5.15,-4.73,-4.07,-3.66,-3.55,-3.41,-3.15,-2.73,-2.0,-1.17,-0.43,0.12,0.58,1.24,1.82,2.39,3.12,3.6,3.82,4.4,4.56,4.04,3.3,3.59,4.23,4.9,4.92,4.47,3.48,2.63,3.24,3.8,3.99,4.01,4.07,4.36,4.32,4.38,3.79,3.65,4.23,4.78,5.09,5.66,6.39,6.78,7.61,7.82,7.65,7.93,8.19,8.13,8.45,8.71,9.74,10.26,9.46,7.52,4.97,4.14,3.12,0.45,0.26,2.51,-1.04,-10.1,-9.9,-12.05,-10.51,-3.93,-3.57,-3.06,-2.76,-6.64,-2.39,-1.15,0.33,0.05,-1.09,-1.44,-2.69,-3.46,-5.16,-8.48,-9.58,-10.67,-10.22,-10.78,-9.83,-8.23,-6.8,-5.88,-5.53,-4.97,-3.68,-2.28,-0.54,0.98,2.85,4.54,2.34,-2.34,-3.52,-1.64,1.26,3.39,3.08,9.09,9.55,9.92,10.32,10.61,11.03,11.55,12.14,12.6,12.47,11.78,11.02,10.42,8.8,6.62,4.47,1.47,-2.92,-3.8,-3.25,-2.78,-2.51,-2.19,-1.55,-0.68,-0.17,0.25,0.55,0.86,0.56,-0.24,-0.54,-0.13,0.38,0.98,1.25,1.35,1.61,2.36,3.64,4.55,5.05,5.51,5.81,6.16,5.66,4.15,2.8,0.73,-3.02,-5.44,-3.81,-0.52,2.94,6.25,8.68,10.19,11.25,-0.12,-4.76,-6.1,-6.04,-6.6,-6.92,-6.26,-5.67,-3.95,-1.35,0.3,1.89,3.01,3.66,4.08,3.99,3.23,2.06,0.77,-0.18,-0.98,-0.7,-1.37,-2.26,-3.78,-2.37,-3.53,-3.7,-3.61,-4.41,-7.8,-8.88,-8.5,-6.76,-7.95,-6.47,-5.48,-5.13,-4.91,-4.24,-2.55,-0.47,-1.26,-1.62,-1.73,-1.71,-1.29,0.71,1.61,3.63,0.42,1.18,-0.39,-0.14,-1.79,-2.55,-3.77,-3.14,-2.35,-0.48,0.34,0.97,2.94,1.82,2.11,3.31,8.18,8.05,9.25,9.84,11.66,11.81,10.32,7.76,6.55,6.26,6.59,6.43,5.3,5.59,5.53,4.6,2.29,-0.54,-2.79,-3.42,-4.26,-6.38,-6.9,-5.24,-8.57,-9.43,-8.85,-7.9,-7.13,-6.22,-5.68,-4.88,-3.88,-3.1,-2.57,-1.49,-1.08,-1.48,-1.15,-1.03,-0.84,-0.4,0.8,-0.12,-6.47,-7.29,-6.69,-6.36,-6.09,-5.71,-5.86,-5.93,-5.65,-5.83,-5.89,-4.89,-3.46,-5.0,-4.39,-5.74,-8.93,-10.29,-10.08,-9.12,-8.25,-7.44,-6.69,-6.31,-5.61,-4.15,-2.65,-0.87,1.89,2.58,3.51,3.77,5.62,6.5,8.71,8.97,10.04,10.02,10.14,10.2,11.26,11.31,13.09,12.24,11.16,11.17,10.53,10.62,9.66,8.58,6.43,3.03,0.83,-1.59,-2.67,-1.96,-2.48,-1.48,-0.18,0.45,1.8,-10.23,-11.77,-10.43,-10.13,-10.1,-9.84,-9.78,-8.63,-8.02,-8.36,-10.08,-11.01,-10.07,-10.54,-10.03,-8.82,-8.1,-7.56,-7.03,-6.65,-6.18,-6.0,-5.89,-5.58,-5.12,-4.68,-4.43,-4.12,-3.78,-3.44,-3.21,-2.87,-2.41,-1.76,-1.15,-0.75,-0.36,0.01,0.49,1.05,1.67,1.79,1.88,2.41,3.11,2.85,2.2,1.85,2.59,3.31,3.78,4.08,3.89,2.54,0.99,1.57,2.68,2.85,2.66,2.88,3.29,3.25,2.93,3.19,3.33,3.45,4.25,5.07,5.88,6.48,7.34,7.63,7.65,8.21,8.18,8.57,8.29,8.51,9.43,10.16,9.76,7.53,5.79,3.31,2.86,1.9,0.03,-0.43,1.38,-1.87,-9.47,-10.89,-11.42,-8.86,-4.49,-0.87,-3.29,-8.29,-4.33,-3.56,-2.62,-2.31,-2.34,-2.33,-2.1,-3.77,-4.98,-5.77,-8.15,-9.85,-10.91,-10.55,-10.36,-9.39,-8.14,-6.77,-6.06,-5.16,-3.99,-2.79,-1.28,0.03,-0.29,2.07,3.78,2.55,0.21,-1.82,1.3,1.69,6.82,8.32,9.28,9.61,9.88,10.55,11.31,12.02,12.72,13.08,12.92,12.33,11.56,10.68,9.71,9.01,7.99,5.96,3.28,-1.39,-5.3,-5.15,-4.17,-3.37,-2.7,-1.7,-0.87,-0.23,-0.03,0.49,0.63,0.17,-0.18,-0.33,-0.23,0.19,0.29,0.56,0.74,0.99,1.67,2.73,3.86,4.91,5.56,6.01,5.94,4.54,2.53,0.96,-1.71,-5.57,-5.39,-2.72,0.6,4.19,6.86,9.14,9.89,3.15,-5.88,-5.62,-6.06,-6.19,-6.33,-5.94,-4.86,-2.01,-0.28,1.47,2.57,3.48,4.54,4.86,4.82,4.76,3.7,1.53,-1.15,-2.37,-1.91,-1.67,-3.42,-4.01,-2.34,-3.46,-4.29,-3.13,-5.08,-8.65,-8.24,-7.12,-6.63,-7.41,-6.7,-5.59,-4.08,-3.49,-2.9,-2.56,-2.37,-2.27,-1.98,-1.96,-1.27,-0.31,0.51,1.28,1.72,1.0,0.06,-1.44,-2.92,-2.11,-1.15,-3.17,-3.07,-2.88,-1.51,0.1,2.61,3.52,5.61,6.54,7.51,7.11,7.7,8.64,9.71,11.4,10.89,9.68,7.13,6.8,6.52,6.56,5.31,4.85,4.1,4.1,4.68,3.91,2.73,0.41,-1.37,-2.73,-4.25,-6.8,-6.57,-7.7,-11.03,-9.69,-8.97,-8.08,-7.32,-6.55,-5.32,-4.22,-3.46,-3.01,-3.01,-2.57,-1.88,-1.71,-2.12,-1.33,-0.94,-0.65,-0.27,-0.42,-1.5,-4.82,-6.27,-6.28,-5.88,-5.53,-5.49,-5.54,-5.77,-6.1,-6.37,-5.79,-4.66,-4.69,-4.7,-8.52,-11.61,-11.63,-11.21,-10.23,-9.41,-8.34,-7.73,-6.49,-5.59,-4.14,-2.03,0.84,2.19,3.04,4.5,4.36,6.08,7.99,9.5,9.82,9.07,9.58,10.67,9.24,12.56,11.98,11.99,13.06,12.34,11.53,12.03,10.12,7.49,6.69,2.02,-2.9,-3.66,-4.35,-3.84,-0.97,0.88,-1.23,-1.6,1.04,0.05,-10.91,-12.67,-11.36,-10.03,-10.69,-10.93,-9.84,-9.1,-9.59,-9.85,-10.81,-11.26,-10.44,-9.39,-9.01,-8.73,-8.16,-7.75,-7.46,-7.26,-7.09,-6.83,-6.44,-6.02,-5.46,-4.94,-4.56,-4.31,-3.99,-3.6,-3.17,-2.7,-2.16,-1.7,-1.2,-0.83,-0.51,-0.32,0.16,0.79,1.13,1.31,1.82,2.43,2.98,2.68,2.18,1.91,2.02,2.54,2.68,2.2,1.16,0.07,-0.89,0.35,0.89,1.13,1.73,2.25,1.84,1.88,1.84,1.95,2.67,3.29,4.49,5.39,5.86,6.54,7.03,7.26,7.93,8.1,7.95,8.47,8.34,9.72,10.05,8.65,6.73,5.1,3.38,2.78,2.72,1.21,-1.45,-2.17,-1.29,-2.51,-6.93,-10.83,-10.93,-8.33,-5.69,-3.23,-4.52,-7.64,-5.39,-1.84,-5.0,-4.42,-3.18,-2.7,-3.09,-4.66,-4.28,-7.83,-8.33,-11.4,-12.12,-11.86,-10.69,-8.94,-6.87,-5.68,-4.91,-4.42,-3.15,-1.64,-0.51,-4.08,-2.59,0.13,3.61,5.51,3.25,0.33,5.01,6.72,8.07,8.82,9.42,10.13,11.0,11.61,12.42,13.09,13.53,13.46,13.33,12.53,10.79,8.88,7.82,7.45,7.49,6.71,4.71,0.85,-4.44,-6.36,-5.32,-3.95,-3.38,-2.89,-2.34,-1.79,-1.01,0.02,0.13,-0.2,-0.59,-0.55,-0.86,-0.64,-0.42,-0.34,-0.04,0.36,0.89,1.85,3.23,4.55,5.17,5.08,4.62,3.46,1.37,-1.3,-4.59,-6.68,-4.76,-1.84,1.34,4.43,6.66,9.42,9.04,-6.91,-6.85,-5.69,-5.27,-5.77,-5.51,-3.84,-1.29,0.67,2.02,2.84,4.25,4.76,3.86,3.91,3.97,3.13,1.72,0.29,0.03,-0.97,-2.33,-2.93,-3.04,-2.59,-4.0,-4.77,-4.21,-6.86,-7.42,-6.17,-6.73,-7.03,-7.12,-7.28,-6.39,-3.84,-2.8,-1.66,-1.91,-1.83,-0.9,-0.23,-0.19,-0.04,0.43,0.64,1.9,-0.36,0.75,0.36,1.27,-3.39,-2.8,-1.81,-2.16,-3.54,-2.89,-2.52,-0.15,2.27,3.75,5.57,6.27,7.02,7.0,7.71,8.54,9.15,10.89,11.7,10.02,7.98,8.08,7.87,7.21,6.72,5.0,3.16,3.05,4.02,4.12,3.44,2.13,0.29,-1.9,-3.18,-4.45,-6.2,-6.7,-8.57,-8.62,-9.08,-8.83,-7.9,-7.3,-6.06,-5.09,-4.23,-3.64,-3.26,-2.78,-2.82,-2.76,-2.01,-2.34,-2.66,-1.6,-0.94,-0.75,-0.95,-1.32,-1.6,-3.41,-5.53,-6.17,-5.89,-5.19,-4.98,-4.93,-4.96,-4.8,-5.44,-5.36,-5.85,-8.3,-11.31,-12.71,-12.69,-12.23,-11.78,-10.55,-9.7,-8.69,-7.1,-5.62,-3.23,0.41,1.26,2.93,3.54,4.08,5.42,7.17,8.74,8.6,8.92,9.37,10.2,10.12,10.89,11.34,11.94,12.15,12.38,12.42,12.44,12.48,10.59,9.26,5.23,-4.8,-6.39,-7.97,-5.89,-3.67,-0.6,4.52,6.07,2.18,2.36,5.44,-8.9,-11.88,-13.01,-9.84,-9.66,-9.16,-9.3,-10.43,-11.08,-10.83,-11.04,-10.92,-10.69,-10.36,-9.72,-9.09,-8.46,-8.23,-7.82,-7.81,-7.41,-7.19,-7.25,-6.93,-6.74,-6.32,-5.69,-5.22,-4.71,-4.21,-3.91,-3.52,-2.86,-2.02,-1.21,-1.09,-0.89,-0.6,0.11,0.66,1.04,2.03,2.3,2.62,3.27,3.42,3.05,2.61,2.52,2.33,1.82,1.15,0.12,-0.51,-0.7,-0.65,-0.97,-0.42,0.93,1.47,1.13,0.74,1.22,1.47,2.2,3.07,3.82,4.91,5.4,6.11,7.07,7.57,7.96,8.14,8.01,8.24,8.96,9.38,9.32,7.9,6.64,5.02,3.32,2.18,1.19,0.09,-2.9,-4.02,-4.45,-5.05,-6.12,-9.9,-10.95,-9.27,-7.73,-4.53,-4.0,-5.66,-2.53,-6.77,-5.7,-4.56,-2.92,-3.43,-2.56,-3.89,-6.35,-9.73,-8.97,-11.86,-11.53,-10.85,-9.11,-7.64,-5.91,-5.41,-4.85,-3.41,-1.7,-0.74,-4.95,-8.25,-2.49,-1.75,4.73,2.13,1.47,5.16,6.64,7.65,8.59,9.32,10.31,11.14,12.0,13.06,13.93,14.39,14.6,14.51,14.33,13.56,11.99,9.87,7.87,5.73,5.99,5.36,5.2,3.41,-1.65,-6.06,-5.43,-4.35,-4.1,-3.83,-3.4,-2.73,-0.9,-0.51,-0.42,-0.5,-0.86,-1.34,-1.35,-1.25,-1.8,-1.63,-1.12,-0.64,0.19,1.14,2.63,3.81,4.12,3.9,4.02,3.04,0.73,-3.46,-7.43,-6.91,-4.46,-1.3,1.49,4.58,6.93,9.1,-4.59,-6.06,-5.66,-5.22,-5.07,-4.06,-2.89,-0.67,0.56,1.38,3.17,3.38,3.42,3.41,3.91,3.95,3.3,2.61,1.36,-0.05,-0.08,-1.04,-2.52,-3.64,-4.91,-5.27,-4.96,-5.62,-8.56,-6.39,-6.69,-6.4,-6.75,-7.52,-6.38,-5.24,-3.34,-1.97,-1.73,-1.88,-0.58,0.72,1.42,1.02,0.82,1.63,0.64,0.43,-0.85,-0.54,-0.1,-1.24,-2.4,-3.49,-1.56,0.59,-3.18,-5.43,-3.78,-1.97,0.77,3.08,4.17,5.39,6.19,6.92,7.45,9.29,10.62,12.36,12.93,11.6,10.59,9.7,9.39,8.67,8.68,7.3,4.95,2.99,2.19,2.9,3.34,3.67,1.69,-0.84,-3.13,-3.96,-4.24,-5.22,-6.38,-7.5,-9.79,-9.47,-7.79,-6.74,-5.71,-4.64,-3.97,-3.41,-3.12,-3.26,-3.19,-2.59,-2.18,-2.55,-2.69,-2.92,-2.65,-1.5,-0.57,-0.23,-0.39,-0.68,-1.1,-2.34,-3.28,-4.23,-5.6,-6.42,-6.23,-5.7,-6.07,-6.52,-6.54,-8.51,-11.42,-14.32,-15.08,-14.32,-13.63,-12.47,-11.12,-10.09,-8.3,-6.53,-4.4,-1.17,0.36,1.56,2.66,3.81,4.9,6.52,8.03,8.35,8.84,9.5,9.18,9.36,10.42,10.24,10.98,12.01,12.35,12.44,12.57,13.65,13.1,9.96,13.39,-10.66,-9.27,-4.77,-2.04,-2.25,-2.17,-2.37,-0.45,3.1,5.08,5.42,2.4,6.67,0.48,-9.85,-11.35,-10.52,-9.1,-9.45,-10.3,-10.98,-10.92,-10.68,-10.61,-10.18,-9.74,-8.94,-8.58,-8.29,-8.04,-8.24,-8.15,-7.61,-7.47,-7.12,-6.85,-6.68,-6.22,-5.75,-5.36,-5.04,-4.91,-4.7,-4.37,-3.67,-3.03,-2.1,-1.32,-0.8,-0.01,0.0,0.19,1.0,1.47,1.72,2.68,3.57,3.77,3.67,3.49,3.15,2.88,2.66,2.31,1.63,0.76,-0.51,-1.46,-2.13,-2.05,-0.98,0.15,0.04,-0.06,0.21,0.77,1.6,2.38,3.19,4.36,5.05,6.13,7.03,6.98,7.22,7.31,7.92,8.53,8.75,8.94,8.24,7.3,6.12,4.65,2.99,1.59,-0.69,-2.53,-4.26,-5.98,-5.4,-5.6,-5.6,-10.32,-11.37,-10.13,-8.07,-6.37,-7.26,-3.93,-9.03,-6.72,-4.17,-3.17,-3.37,-0.97,-2.2,-6.2,-10.17,-9.32,-9.85,-11.63,-10.89,-9.23,-7.95,-6.76,-5.76,-4.91,-3.65,-1.74,0.63,0.32,-9.63,-1.07,-2.03,-3.6,-0.35,2.84,5.01,6.77,7.7,8.44,9.43,10.48,11.79,12.83,13.78,14.34,14.61,14.33,14.27,14.28,13.7,12.25,10.95,8.78,6.82,5.11,4.35,4.21,3.67,3.34,2.19,-0.78,-4.29,-5.77,-4.66,-3.55,-3.56,-3.54,-2.83,-1.79,-0.88,-0.56,-0.23,-1.18,-0.7,-0.86,-3.09,-3.13,-2.48,-1.58,-0.69,0.62,2.07,2.75,2.84,2.98,3.57,2.69,-0.33,-7.79,-8.54,-5.31,-3.22,-0.58,2.12,4.25,6.13,1.02,-8.4,-7.49,-5.46,-3.82,-3.55,-2.06,-1.09,-0.27,2.19,2.77,3.56,4.27,4.79,4.7,3.82,2.83,2.88,3.14,2.28,0.78,-1.48,-4.74,-5.66,-6.21,-6.5,-6.84,-6.28,-7.19,-5.63,-4.96,-5.4,-6.14,-7.16,-6.05,-4.25,-2.59,-2.21,-2.03,-1.8,0.34,1.87,1.67,1.09,0.19,0.37,0.08,-1.53,0.49,-2.74,-0.18,-4.65,-4.86,-6.38,-3.36,-3.41,-1.59,-5.32,-6.31,-2.62,0.02,1.75,3.17,4.53,4.8,5.71,7.81,9.05,10.66,12.41,12.81,12.06,10.9,10.69,10.57,10.82,10.42,9.95,9.47,6.66,3.91,1.52,2.74,3.99,4.82,2.24,-1.06,-3.6,-5.28,-4.82,-5.35,-7.68,-9.13,-8.84,-8.68,-8.09,-6.15,-4.9,-4.09,-3.14,-2.58,-2.4,-2.58,-2.75,-2.59,-2.42,-2.41,-2.51,-2.98,-3.11,-2.18,-1.35,-1.06,-0.61,-0.91,-1.83,-2.17,-1.99,-1.79,-2.27,-3.27,-4.64,-2.46,-2.83,-3.6,-5.16,-7.78,-11.55,-13.81,-14.98,-14.8,-13.71,-12.75,-12.43,-10.7,-8.66,-6.51,-3.59,-1.11,0.53,2.1,2.78,4.32,6.39,7.85,8.51,8.17,8.68,9.17,9.49,9.16,9.08,9.81,10.61,11.26,10.67,10.23,11.08,11.71,9.2,4.27,7.3,-0.86,0.57,-2.54,-1.81,-1.66,-1.83,-1.9,-1.66,-1.64,0.58,4.56,3.18,1.08,5.54,2.09,-9.41,-12.12,-10.72,-9.43,-10.7,-11.39,-11.11,-10.73,-10.51,-10.42,-9.59,-8.98,-8.88,-8.06,-7.47,-7.52,-7.58,-7.24,-6.67,-6.09,-6.06,-5.96,-5.81,-5.05,-4.57,-4.64,-4.74,-5.0,-4.83,-4.35,-3.56,-2.61,-2.12,-1.16,-0.47,-0.21,0.3,0.81,0.99,3.06,5.16,5.36,5.21,5.22,4.9,4.85,4.7,4.31,3.98,3.46,2.81,1.68,0.12,-1.58,-3.12,-3.64,-2.01,-1.47,-1.04,-0.66,-0.01,0.85,2.02,2.79,3.93,5.03,6.04,6.3,6.29,6.61,7.15,7.71,8.09,7.4,7.97,7.74,7.38,5.97,3.53,0.67,-0.5,-3.5,-5.12,-6.07,-6.63,-6.29,-5.94,-5.88,-10.43,-11.09,-11.73,-4.78,-2.69,-7.52,-8.81,-7.22,-6.08,-5.25,-4.25,-2.47,-4.39,-7.62,-9.71,-9.03,-9.51,-10.31,-11.02,-10.17,-9.2,-7.76,-6.41,-5.51,-4.3,-2.44,-2.71,-1.03,-0.23,-2.47,-3.03,-4.28,-0.25,2.59,4.76,6.09,7.34,8.44,9.4,10.64,11.83,12.89,13.71,14.05,14.26,14.16,14.3,14.11,13.85,13.02,10.7,9.09,7.32,5.47,4.09,2.79,2.52,2.15,1.72,1.49,0.82,0.08,-1.67,-3.7,-4.67,-4.49,-4.08,-3.26,-1.86,-1.14,-1.31,-1.43,-1.31,-0.71,-2.14,-3.91,-4.26,-4.03,-3.46,-2.23,-0.49,1.02,1.66,1.94,2.52,2.91,1.18,-7.1,-9.15,-6.75,-4.12,-1.73,0.18,2.06,3.31,5.27,-10.44,-8.58,-5.44,-4.43,-3.55,-2.17,-2.05,0.51,1.87,3.76,5.43,5.62,5.54,5.29,3.97,2.15,3.84,4.83,3.34,0.96,-3.86,-5.89,-5.72,-6.54,-7.41,-4.9,-6.36,-5.63,-4.57,-5.25,-5.46,-5.17,-5.9,-4.26,-2.88,-2.4,-2.62,-1.91,0.16,1.2,1.61,1.28,1.08,0.49,-0.26,-0.8,-1.5,-0.23,0.32,-0.4,-2.13,-3.65,-5.05,-4.5,-0.4,-2.77,-4.48,-5.92,-3.63,-1.03,1.14,2.74,2.21,4.78,5.56,7.36,8.63,9.98,11.48,11.61,11.49,10.55,10.34,10.47,10.84,10.62,10.74,10.49,9.35,7.69,4.71,3.52,3.62,3.67,4.86,3.18,-1.55,-4.47,-6.25,-6.32,-6.94,-7.86,-9.63,-9.83,-8.99,-6.55,-5.29,-4.76,-3.33,-2.76,-2.87,-2.77,-2.5,-2.36,-2.49,-2.59,-2.43,-2.76,-3.26,-3.4,-3.31,-2.83,-1.82,-1.69,-1.52,-1.97,-2.42,-2.62,-2.39,-2.05,-2.28,-1.7,-2.22,-2.7,-3.56,-5.59,-9.48,-13.12,-14.46,-14.56,-14.42,-14.69,-13.94,-12.57,-10.67,-8.41,-5.61,-2.8,-0.79,0.61,1.98,3.64,5.58,7.09,7.47,7.98,8.21,8.49,8.52,9.04,9.31,8.12,9.27,10.0,10.48,9.36,8.64,9.29,8.58,2.28,-0.64,0.02,-0.99,-1.23,-1.89,-2.14,-1.64,-0.39,0.35,0.05,-0.8,-1.33,1.45,2.05,2.2,0.1,3.83,2.38,-8.38,-11.49,-11.15,-9.1,-9.43,-10.23,-10.6,-10.58,-10.15,-9.61,-9.96,-9.57,-9.45,-8.98,-8.48,-7.48,-6.41,-5.79,-5.73,-5.05,-4.35,-3.18,-2.91,-3.95,-4.44,-4.68,-5.3,-5.36,-4.23,-2.97,-2.98,-2.66,-1.42,-0.49,-0.31,0.37,1.74,3.36,4.6,5.32,5.99,6.56,6.61,7.1,7.06,6.92,6.94,6.5,5.96,4.98,4.08,2.45,-0.59,-3.28,-3.81,-3.88,-3.44,-2.48,-1.61,-0.27,0.87,1.97,2.68,4.02,4.98,5.44,5.52,5.98,6.91,7.49,7.41,7.73,7.88,8.53,8.5,8.28,5.9,1.73,-2.53,-4.17,-6.97,-8.31,-8.42,-8.24,-7.43,-5.99,-6.5,-11.12,-11.73,-10.36,-4.87,-7.32,-9.53,-7.61,-6.74,-6.41,-5.52,-4.17,-3.66,-6.49,-7.94,-8.96,-9.6,-11.3,-10.4,-10.36,-9.96,-8.96,-7.88,-6.08,-4.98,-4.01,-0.53,-2.05,-0.11,-6.32,-6.02,-3.7,-0.76,1.5,3.78,5.7,7.13,8.18,9.22,10.43,11.78,12.91,13.75,14.13,14.07,14.01,14.26,14.69,14.26,13.19,12.66,10.69,8.24,6.71,4.84,3.66,2.6,1.67,1.05,0.49,0.42,0.26,0.14,0.3,-0.16,-2.72,-4.62,-4.13,-3.48,-3.45,-3.31,-2.9,-2.34,-1.05,-1.33,-2.54,-4.52,-6.26,-5.76,-5.03,-3.53,-1.37,0.22,1.0,1.69,2.09,1.03,-6.17,-9.54,-6.96,-4.87,-2.62,-0.96,0.26,1.12,3.27,-11.06,-9.12,-6.24,-5.51,-3.61,-3.28,-1.44,0.5,2.48,4.32,3.71,5.01,5.64,5.2,4.58,1.91,2.36,4.96,6.68,2.05,-1.78,-4.47,-5.19,-3.58,-4.03,-5.0,-4.19,-3.42,-2.88,-3.86,-4.71,-4.45,-4.05,-3.66,-2.82,-1.83,-0.06,0.75,1.56,2.41,2.87,2.55,1.38,0.27,-0.37,-1.67,-1.78,-0.06,0.15,-1.07,-3.35,-3.64,-1.23,-1.66,-2.68,-3.35,-5.24,-4.91,-3.45,-1.5,0.68,1.86,1.56,4.23,4.99,6.56,7.79,9.25,10.63,9.99,10.39,10.43,10.21,9.85,10.02,10.93,11.35,10.82,9.6,8.03,6.5,3.8,2.3,1.85,3.05,3.36,-0.12,-3.72,-6.16,-7.24,-6.78,-7.48,-9.87,-10.7,-9.32,-7.07,-5.92,-4.95,-3.83,-3.13,-3.21,-3.43,-3.3,-2.81,-2.48,-2.92,-3.0,-2.19,-2.48,-3.04,-3.21,-3.24,-3.11,-2.59,-2.21,-2.01,-2.61,-2.35,-1.51,-0.89,-1.01,-0.67,-0.96,-1.69,-2.98,-4.5,-7.26,-11.1,-12.92,-14.59,-15.25,-15.27,-14.69,-13.31,-11.46,-8.99,-6.05,-3.45,-1.56,0.32,1.41,2.6,4.59,6.16,7.07,7.22,6.92,7.47,8.19,8.36,8.12,8.6,9.21,9.92,9.41,8.42,8.04,6.48,7.22,3.83,-1.37,-1.57,-2.04,-2.12,-2.45,-2.27,-1.02,-0.47,-0.68,-0.7,-0.1,0.13,-1.29,-1.53,-0.53,0.36,1.63,-1.02,1.39,0.18,-8.19,-10.67,-11.79,-11.22,-10.21,-9.62,-9.24,-8.32,-8.48,-8.64,-8.69,-9.02,-8.67,-7.8,-7.57,-6.93,-6.93,-6.59,-5.78,-5.22,-3.84,-3.15,-4.02,-4.4,-4.59,-4.99,-4.84,-3.9,-3.23,-2.92,-2.84,-2.59,-1.61,-0.86,-0.05,1.83,3.39,4.04,5.07,6.27,6.94,7.39,7.68,7.93,8.43,8.72,8.71,7.93,6.91,5.41,3.79,0.72,-2.72,-4.67,-5.13,-4.66,-3.74,-2.15,-0.84,0.35,1.41,2.35,3.64,4.25,4.8,5.21,6.16,7.0,7.87,8.21,9.23,9.46,9.87,9.54,7.05,2.3,-2.94,-7.55,-8.72,-9.93,-10.74,-10.17,-8.67,-7.01,-6.15,-8.31,-12.21,-11.99,-11.73,-9.69,-6.55,-6.56,-7.24,-6.56,-5.69,-4.75,-3.96,-5.29,-6.59,-8.76,-9.75,-10.78,-10.62,-10.34,-10.26,-9.45,-8.13,-6.97,-4.43,-2.34,-0.89,-1.86,-5.74,-7.13,-6.6,-4.29,-1.97,0.44,2.99,5.17,6.85,7.98,8.88,10.1,11.65,12.95,13.65,13.93,14.18,14.28,14.45,14.63,14.28,13.87,12.41,10.31,9.86,8.84,7.1,5.04,3.04,1.64,0.82,0.42,0.33,0.1,-0.12,0.1,0.08,0.41,1.06,0.06,-3.46,-5.49,-5.51,-5.03,-3.88,-2.55,-1.47,-1.21,-0.46,-3.46,-6.61,-7.55,-6.45,-4.07,-1.82,-0.39,0.52,1.57,-0.26,-7.6,-8.89,-6.93,-5.18,-3.2,-1.68,-1.31,-1.26,-0.7,-10.3,-9.42,-7.44,-5.76,-4.28,-3.33,-1.18,0.44,3.21,2.47,2.65,3.86,4.77,4.29,2.68,1.46,2.04,3.42,3.7,1.65,0.11,-1.95,-2.26,-3.46,-4.2,-3.85,-3.52,-2.66,-2.68,-3.92,-3.32,-2.89,-2.44,-2.61,-2.32,-0.99,0.19,1.61,2.52,3.65,4.03,3.19,1.6,-0.38,-1.92,-2.53,-1.49,0.24,0.52,-1.28,-0.46,-5.21,-2.71,-1.68,-3.48,-4.39,-4.81,-4.9,-4.07,-2.01,-0.14,0.17,0.8,3.28,4.55,5.64,6.82,8.12,9.36,9.69,9.28,8.98,9.23,9.04,9.4,10.09,10.57,10.85,10.13,9.06,8.61,7.22,4.82,1.03,2.97,4.38,4.48,-0.48,-6.38,-7.25,-7.2,-8.64,-10.55,-11.22,-9.79,-7.64,-5.19,-3.16,-2.01,-1.8,-2.34,-3.55,-3.75,-3.66,-3.42,-2.92,-2.9,-2.73,-2.29,-2.06,-2.09,-2.17,-2.51,-2.76,-3.03,-3.08,-2.89,-1.98,-0.77,0.05,-0.28,0.49,-0.09,-0.79,-2.03,-2.94,-5.37,-8.44,-12.56,-15.26,-15.68,-15.89,-14.87,-13.31,-11.3,-9.25,-6.83,-4.2,-2.02,-0.69,0.81,2.55,4.22,5.91,6.54,6.26,6.85,7.19,7.25,8.22,7.71,8.13,8.85,9.53,8.22,8.34,8.3,6.9,5.19,5.86,-2.04,-1.79,-2.16,-2.97,-4.15,-2.66,-1.08,-0.2,-0.08,-0.6,-0.96,-1.06,-1.3,-1.27,-2.75,-3.02,-3.04,-1.37,-1.82,-2.14,-0.02,-3.93,-9.73,-10.84,-11.84,-12.33,-11.65,-10.48,-9.92,-8.92,-8.61,-8.68,-8.13,-8.39,-8.54,-7.78,-6.93,-6.5,-6.08,-5.75,-5.25,-5.25,-5.71,-5.65,-5.25,-5.33,-5.49,-4.45,-3.77,-4.02,-4.78,-4.19,-3.22,-2.17,-1.22,-0.15,1.72,3.03,4.51,5.62,6.36,6.78,7.37,8.02,8.13,7.9,8.2,8.17,7.73,6.19,3.3,2.11,1.09,-2.5,-5.81,-6.52,-5.48,-4.42,-2.94,-1.41,-0.32,1.16,2.5,3.38,3.92,4.51,5.34,6.41,7.54,8.57,9.17,10.1,11.18,12.38,11.78,7.09,-2.79,-9.07,-12.12,-12.5,-12.23,-11.47,-10.06,-8.03,-7.03,-7.24,-9.95,-11.37,-11.79,-11.82,-9.67,-7.3,-8.03,-7.03,-6.04,-4.92,-4.91,-4.67,-5.15,-6.78,-9.65,-10.15,-10.9,-10.43,-9.74,-9.53,-9.94,-10.76,-1.9,-2.39,-1.68,-3.01,-11.0,-8.84,-6.81,-5.1,-3.04,-0.4,2.18,4.51,6.17,7.31,8.63,10.0,11.57,12.97,13.83,14.15,14.59,14.69,14.96,14.91,14.94,14.56,13.7,12.27,9.97,7.96,7.34,6.77,5.55,5.23,4.5,2.96,1.08,-0.22,-0.45,-0.36,-0.35,-0.35,-0.62,-1.09,-1.12,-1.12,-1.2,-1.35,-1.27,-1.08,-0.95,-0.88,-1.37,-2.35,-5.17,-8.2,-8.49,-6.67,-3.89,-1.7,-0.14,0.22,-5.67,-8.88,-7.81,-5.8,-4.11,-2.97,-2.49,-2.95,-4.13,-4.42,-9.8,-9.58,-7.69,-5.82,-4.57,-3.15,-1.59,1.76,2.12,2.06,1.94,2.41,3.23,3.11,0.9,0.82,1.46,2.68,4.09,3.19,2.18,1.18,-0.6,-1.95,-2.34,-1.96,-2.05,-2.38,-3.14,-3.47,-3.64,-3.52,-2.92,-2.35,-1.48,-0.98,-0.18,1.14,2.85,3.84,3.99,2.83,0.2,-1.12,-1.82,-2.25,-0.45,-0.01,-0.96,-0.08,0.04,-1.83,-1.61,-3.56,-1.32,-5.17,-5.29,-4.75,-3.71,-1.95,-0.92,-0.65,0.08,2.39,3.8,4.93,6.34,7.22,8.2,9.07,8.89,8.27,8.18,8.3,8.28,8.87,9.8,10.01,9.63,9.28,8.3,8.35,9.05,3.26,1.43,3.34,3.58,3.22,1.27,-2.09,-7.18,-9.14,-10.56,-11.23,-10.21,-8.35,-6.68,-5.4,-4.36,-4.16,-4.63,-4.74,-4.44,-4.16,-3.68,-3.04,-2.7,-2.57,-2.45,-2.4,-2.4,-2.79,-3.56,-4.15,-4.14,-4.1,-4.14,-4.02,-2.77,-0.73,0.48,-1.1,-0.04,-0.01,-0.42,-1.75,-4.36,-9.6,-15.33,-17.73,-18.05,-16.94,-15.38,-13.7,-11.56,-9.16,-7.02,-4.56,-2.65,-1.49,0.27,2.13,3.61,4.7,5.33,5.52,6.33,6.9,6.8,7.12,7.67,7.86,8.27,8.26,7.47,6.87,6.53,7.15,5.41,3.35,2.96,0.39,-3.2,-5.53,-3.59,-2.17,-1.13,-0.21,0.75,0.81,0.43,0.45,-0.76,-2.06,-2.16,-3.23,-3.39,-3.16,-3.33,-4.36,-4.41,-2.09,0.22,-2.73,-9.57,-11.68,-12.03,-12.48,-11.96,-11.04,-10.5,-10.3,-10.17,-10.04,-9.68,-9.24,-8.86,-7.83,-7.42,-7.21,-7.05,-6.59,-6.05,-5.94,-5.72,-5.69,-6.12,-5.45,-5.03,-5.69,-6.41,-5.62,-4.58,-3.35,-2.14,-0.68,0.63,1.49,3.13,4.73,5.48,5.24,5.94,6.84,7.34,8.76,8.91,9.18,8.82,7.39,5.42,4.22,3.16,1.53,-2.71,-5.85,-7.08,-6.49,-5.1,-3.52,-2.26,-0.53,0.96,1.97,3.04,3.68,4.65,5.86,7.23,8.12,9.29,10.27,11.54,12.83,13.22,10.05,3.63,-4.33,-12.87,-15.02,-14.42,-12.2,-11.33,-10.08,-8.64,-7.79,-9.0,-11.52,-10.29,-9.19,-9.91,-8.24,-8.03,-7.45,-6.47,-5.32,-4.96,-5.06,-4.84,-4.94,-5.73,-9.24,-9.93,-9.31,-10.58,-10.05,-10.48,-11.1,-10.01,-3.14,-4.62,-8.95,-10.76,-8.93,-6.94,-5.67,-3.68,-1.15,1.71,3.91,5.35,6.59,8.14,9.8,11.45,12.92,13.95,14.62,15.09,15.41,15.69,15.45,15.17,14.29,13.25,12.49,10.46,8.61,7.28,6.13,5.93,6.4,6.47,6.31,5.6,4.57,2.64,0.85,-0.45,-0.63,-0.58,-1.04,-1.24,-1.02,-0.89,-0.75,-0.69,-0.61,-0.44,-0.43,-0.41,-1.37,-4.64,-8.69,-10.24,-8.46,-5.89,-3.05,-1.63,-4.99,-9.26,-7.7,-5.66,-3.62,-2.61,-2.81,-3.83,-5.5,-6.96,-7.49,-11.05,-10.2,-8.35,-6.4,-4.86,-3.57,-1.49,0.51,1.95,1.88,1.23,1.99,2.4,2.39,1.42,0.38,0.03,1.38,2.66,2.71,1.49,0.88,0.15,-0.64,-1.12,-1.63,-1.82,-2.46,-2.9,-2.96,-2.92,-2.97,-2.87,-2.0,-0.78,-0.96,0.93,2.35,3.2,3.63,3.48,1.47,-1.33,-1.89,-1.91,-0.04,0.25,-0.41,-0.09,-2.9,-1.35,-0.83,0.84,-3.04,-2.0,-3.88,-4.65,-4.0,-2.97,-2.08,-1.54,-1.14,-0.56,1.36,2.76,4.05,5.63,6.84,7.67,8.73,8.78,8.94,7.71,8.13,7.56,7.61,8.68,9.76,10.03,9.85,8.6,7.92,8.41,7.44,2.76,2.41,3.72,3.64,2.9,-0.34,-5.5,-9.11,-10.91,-10.91,-10.29,-8.98,-7.28,-5.57,-3.49,-3.29,-3.51,-3.15,-3.28,-3.13,-2.31,-1.33,0.2,1.17,1.62,1.94,1.7,0.91,-0.02,-1.02,-2.24,-3.0,-3.06,-3.14,-3.3,-3.12,-2.53,-2.87,-3.1,-2.24,-1.58,-2.55,-5.34,-11.22,-16.66,-18.08,-18.0,-17.64,-15.55,-13.1,-11.56,-9.25,-7.21,-5.14,-3.04,-1.61,0.19,2.1,3.44,4.37,4.77,5.22,5.59,6.16,6.31,6.48,7.66,8.76,6.4,6.91,6.9,6.45,5.36,5.95,5.54,3.46,1.88,0.62,-1.45,-3.67,-3.42,-1.98,-0.72,0.25,0.95,0.66,0.37,1.71,1.77,-0.48,-3.64,-4.42,-4.25,-3.72,-3.67,-4.06,-4.11,-3.73,-3.75,-3.72,-1.57,1.13,-2.23,-8.82,-10.92,-10.78,-10.88,-11.17,-10.97,-11.08,-10.98,-10.56,-10.13,-9.45,-8.7,-8.18,-7.86,-7.8,-7.48,-7.8,-7.94,-7.77,-7.99,-7.1,-6.66,-7.48,-8.08,-7.12,-6.0,-4.91,-3.62,-2.36,-0.85,0.6,2.22,3.81,4.33,5.12,5.87,6.42,8.16,8.58,7.19,7.84,8.82,7.53,6.33,5.34,3.74,2.29,-0.21,-5.4,-7.85,-8.55,-7.28,-5.97,-4.55,-2.69,-0.63,1.04,2.17,3.28,4.07,5.22,6.71,8.04,9.36,10.07,11.39,12.45,12.81,13.32,7.89,-0.81,-10.12,-15.0,-15.97,-13.85,-12.16,-12.22,-10.62,-9.33,-9.67,-11.5,-11.35,-9.52,-10.13,-9.03,-8.34,-7.83,-7.0,-6.07,-5.34,-4.95,-4.93,-5.22,-4.78,-4.66,-6.87,-9.89,-9.32,-10.54,-11.16,-10.78,-10.06,-9.43,-9.91,-10.6,-10.22,-8.5,-7.31,-5.68,-3.88,-1.53,1.01,3.21,4.77,5.91,7.29,8.91,10.58,12.44,14.01,14.95,15.79,16.6,16.98,16.44,15.53,14.33,13.25,12.62,11.9,10.77,8.78,6.35,5.52,6.15,6.17,5.94,5.5,5.02,4.44,3.88,3.07,1.65,0.48,-0.53,-1.12,-1.48,-1.62,-1.34,-0.72,0.13,0.65,0.6,-0.16,-2.01,-4.04,-8.31,-11.94,-9.98,-7.17,-4.48,-4.61,-9.54,-8.48,-5.58,-3.02,-1.41,-1.0,-2.53,-5.87,-9.9,-11.93,-10.68,-12.18,-10.97,-9.01,-7.53,-5.88,-4.73,-3.01,-0.74,1.13,1.44,0.58,0.71,1.44,1.85,1.63,1.21,1.17,1.04,1.1,1.15,0.4,-0.19,-0.56,-0.77,-0.71,-0.52,-0.67,-0.65,-0.93,-0.81,0.02,0.03,-0.32,0.83,-0.36,1.3,2.78,2.94,3.05,3.18,2.27,-0.12,-2.3,-2.3,-2.36,-1.36,-0.18,0.07,-2.83,-1.05,-2.57,-0.89,-0.82,-0.29,-3.19,-3.73,-4.1,-3.58,-3.01,-2.52,-1.46,-1.05,-0.72,0.01,1.43,3.11,5.32,6.81,7.61,8.53,8.78,8.86,8.05,6.61,6.45,6.45,7.58,9.2,10.3,10.13,9.44,8.58,7.09,7.55,3.42,3.35,4.07,4.68,4.22,3.55,-4.49,-10.55,-10.24,-9.72,-9.27,-7.9,-6.91,-5.74,-4.25,-3.39,-4.69,-5.03,-4.91,-3.53,-2.63,-1.33,0.6,1.76,2.36,3.04,3.7,3.2,2.19,1.38,0.74,0.53,0.06,-0.55,-1.5,-2.36,-2.64,-2.53,-3.4,-3.57,-3.69,-4.13,-6.74,-12.31,-16.78,-19.05,-19.28,-18.17,-16.04,-13.27,-10.98,-8.7,-6.57,-4.81,-3.17,-1.83,-0.39,1.19,2.57,3.18,3.93,4.58,4.82,5.23,5.75,6.44,8.2,9.05,6.36,5.2,5.34,4.91,4.4,5.42,4.67,0.99,-0.47,-1.24,-2.56,-3.69,-2.58,-1.2,-0.31,0.25,0.79,0.08,-2.34,-0.8,1.65,0.45,-2.29,-4.26,-5.07,-4.64,-4.28,-4.68,-4.79,-4.45,-4.05,-3.62,-3.44,-3.05,-2.63,-1.69,-0.25,-0.3,-4.22,-9.85,-10.01,-10.78,-10.92,-10.31,-9.63,-9.62,-9.66,-9.07,-8.79,-8.54,-8.13,-8.04,-8.65,-8.74,-8.84,-8.68,-8.66,-9.0,-8.97,-8.46,-7.63,-6.6,-5.25,-3.55,-2.08,-0.48,1.6,2.75,3.98,5.52,6.53,6.56,7.97,9.03,8.24,7.77,8.32,8.65,8.27,6.86,5.08,3.47,1.15,-2.68,-6.25,-8.36,-8.73,-7.91,-6.6,-4.58,-1.84,0.07,1.56,2.67,3.36,4.3,5.94,7.75,9.15,9.87,10.88,11.98,12.53,12.91,12.92,2.27,-6.57,-14.38,-14.54,-13.94,-13.12,-12.65,-11.86,-10.23,-9.75,-12.27,-12.26,-10.32,-10.19,-9.45,-8.41,-7.89,-7.44,-6.98,-6.22,-5.6,-5.11,-4.64,-5.21,-5.05,-4.42,-5.92,-10.13,-10.45,-10.94,-12.2,-12.59,-11.69,-12.1,-11.62,-10.17,-8.93,-7.57,-5.85,-3.83,-1.66,0.48,2.62,4.04,5.09,6.3,7.91,9.69,11.91,13.95,15.45,16.63,17.63,17.92,17.19,16.05,14.88,13.58,12.67,12.43,11.56,10.14,8.43,6.94,6.1,6.18,6.08,6.08,5.58,4.86,4.21,3.66,3.53,2.49,1.14,-0.18,-1.28,-1.55,-1.56,-1.2,-0.44,0.52,0.31,-0.18,-0.28,-1.7,-6.3,-12.69,-10.96,-7.76,-6.33,-9.17,-9.79,-6.83,-3.14,-0.27,2.2,1.66,-0.77,-8.59,-17.35,-18.84,-14.59,-13.64,-11.52,-10.05,-7.61,-6.47,-5.31,-3.94,-2.28,-0.9,0.4,0.09,-0.45,0.2,0.7,1.0,1.18,1.03,0.69,0.52,0.36,0.25,0.09,-0.16,-0.25,-0.26,0.04,0.75,1.4,2.04,2.33,2.2,2.62,2.92,3.3,3.65,3.02,3.08,3.19,2.03,1.18,0.1,-1.36,-3.12,-3.03,-2.65,-3.14,-1.15,0.48,-0.18,-3.95,0.47,-3.94,1.53,-0.29,-3.14,-3.62,-3.9,-3.28,-2.66,-1.86,-1.24,-0.81,-0.33,-0.1,0.59,2.99,3.21,3.74,5.1,7.48,7.5,7.78,7.1,3.04,3.3,5.2,6.18,7.7,9.45,9.19,8.33,7.99,6.85,5.36,4.27,2.79,3.19,4.65,6.35,-1.23,1.7,-0.47,-6.86,-6.67,-6.07,-6.05,-6.23,-5.29,-4.3,-4.36,-4.49,-4.3,-4.17,-4.16,-3.31,-1.15,-0.18,0.84,1.86,2.99,4.0,3.85,2.76,1.58,1.13,0.7,0.11,-0.87,-1.28,-1.65,-1.88,-4.94,-5.03,-4.97,-4.87,-5.54,-8.08,-13.0,-16.98,-18.63,-19.0,-17.6,-15.65,-13.13,-10.81,-8.83,-6.5,-4.6,-3.31,-2.17,-0.84,1.05,2.08,1.13,2.21,3.69,4.46,4.83,5.18,6.19,7.46,6.87,5.47,4.4,4.11,4.16,3.91,4.43,5.11,2.53,-1.52,-1.26,-1.35,-2.38,-2.4,-0.82,0.27,0.1,-0.4,-0.54,-2.68,-3.86,-1.94,0.21,0.96,-0.64,-2.38,-3.08,-3.15,-3.73,-3.93,-4.26,-4.35,-4.34,-4.14,-3.65,-3.31,-3.44,-3.3,-2.94,-2.82,-1.19,-2.06,-4.26,-7.49,-9.96,-10.73,-10.55,-10.27,-9.64,-9.06,-8.94,-8.76,-9.04,-10.08,-10.56,-10.37,-10.21,-10.2,-10.0,-10.0,-9.65,-8.8,-7.85,-6.8,-5.01,-3.06,-1.3,0.34,1.7,3.1,4.79,6.09,6.99,8.05,9.21,9.32,8.91,8.87,8.92,8.99,8.27,6.67,4.67,1.82,-1.63,-5.12,-8.15,-9.9,-9.8,-8.44,-6.3,-3.85,-1.26,0.29,1.5,2.63,3.59,4.99,6.73,7.91,9.2,10.53,11.94,12.9,13.99,13.82,9.99,-7.0,-11.46,-14.47,-12.73,-13.41,-12.42,-12.27,-11.54,-11.18,-12.96,-12.41,-11.25,-10.85,-9.49,-8.06,-7.08,-6.6,-6.53,-6.22,-5.42,-4.85,-4.28,-4.17,-4.61,-4.47,-4.8,-7.23,-11.38,-12.54,-13.52,-14.48,-14.22,-12.97,-11.84,-10.6,-9.26,-7.73,-5.91,-3.69,-1.69,0.06,1.96,3.42,4.54,6.02,7.75,9.72,11.95,14.08,15.84,17.33,17.99,18.4,17.55,16.52,14.98,14.07,13.31,12.45,11.9,11.09,9.7,8.01,6.49,6.1,6.27,6.47,6.29,5.8,5.0,4.22,3.7,2.88,1.66,0.55,-0.15,-0.93,-1.25,-1.41,-1.11,0.11,1.16,0.87,-1.43,-3.2,-5.46,-12.9,-10.26,-8.39,-9.69,-11.59,-8.55,-5.18,-1.38,2.36,4.19,5.62,-4.55,-14.85,-22.77,-19.17,-16.85,-14.53,-12.01,-9.62,-8.17,-7.1,-5.96,-4.94,-3.81,-2.08,-0.93,-0.24,-0.36,-0.36,-0.66,-0.67,-0.39,-0.2,-0.07,-0.03,-0.02,-0.34,-0.63,-0.88,-0.97,-1.13,-1.29,-1.07,-0.49,0.13,0.21,0.39,0.7,1.28,1.53,2.43,3.57,4.51,4.67,3.46,1.37,-1.2,-2.35,-3.5,-3.38,-3.07,-3.76,-2.46,-2.34,-0.46,-1.68,-0.16,0.11,-0.55,-1.48,-1.38,-2.71,-2.98,-2.92,-2.42,-1.8,-1.62,-1.33,-0.76,0.35,1.04,2.39,3.71,5.14,5.64,6.03,6.17,6.81,6.66,3.9,2.01,2.81,4.39,6.12,7.5,8.06,5.8,4.87,4.91,3.9,2.55,0.4,1.25,1.95,2.85,5.29,-4.67,-5.56,-4.93,-5.43,-5.62,-5.55,-5.23,-5.09,-4.47,-4.09,-3.45,-2.91,-2.28,-1.86,-1.73,-1.47,-0.3,0.04,0.72,2.68,4.19,4.53,4.56,4.46,3.89,2.65,0.66,-1.02,-2.47,-3.54,-4.42,-5.63,-5.79,-5.48,-5.34,-6.65,-10.11,-14.0,-17.62,-18.83,-18.17,-16.55,-14.21,-11.99,-9.63,-7.5,-5.46,-3.42,-1.84,-1.1,-0.36,0.49,1.46,2.4,2.93,3.36,4.3,4.7,4.95,5.48,5.22,4.26,4.27,3.75,3.95,4.07,3.24,1.81,2.54,3.09,2.25,-1.38,-2.2,-1.82,-1.1,1.83,3.21,-0.83,-3.13,-3.67,-4.79,-5.09,-4.6,-3.78,-2.74,-2.27,-2.1,-2.02,-2.39,-2.92,-3.02,-2.54,-2.18,-1.97,-1.68,-1.44,-1.46,-1.75,-2.23,-2.91,-3.64,-3.23,-3.88,-4.37,-4.99,-6.62,-8.33,-9.16,-9.93,-10.29,-9.74,-9.83,-10.14,-10.53,-10.92,-11.35,-11.93,-12.26,-11.16,-10.26,-10.79,-10.76,-9.26,-8.5,-7.76,-6.52,-4.74,-3.04,-1.24,-0.09,1.16,2.94,4.85,6.05,7.34,8.65,9.63,9.68,10.42,9.72,9.74,9.07,7.38,5.34,2.85,-0.6,-4.6,-7.89,-10.14,-11.05,-9.82,-7.9,-5.72,-3.35,-1.33,0.34,1.84,2.65,3.58,5.09,6.86,8.29,9.86,11.33,12.67,13.47,15.34,14.91,-3.66,-10.81,-11.54,-12.96,-12.65,-12.08,-12.38,-12.08,-13.27,-14.34,-13.31,-12.1,-11.0,-9.81,-8.3,-7.31,-6.91,-6.76,-5.89,-4.68,-4.31,-4.12,-3.81,-3.64,-4.33,-5.24,-6.44,-10.26,-14.71,-15.88,-16.49,-15.42,-13.96,-12.34,-11.03,-9.59,-7.92,-5.95,-3.97,-2.2,-0.39,1.41,3.01,4.57,6.16,8.04,10.03,12.29,14.43,16.35,17.88,18.72,18.76,17.64,16.25,15.55,14.75,13.73,12.84,11.9,10.69,9.66,8.27,7.28,6.21,5.91,5.92,5.97,6.03,6.0,5.76,5.29,4.74,3.69,2.43,1.73,1.1,0.27,-0.64,-0.66,-0.21,0.48,0.77,-1.98,-6.44,-7.14,-9.92,-9.03,-10.03,-12.76,-10.75,-7.98,-4.84,-1.3,3.08,4.19,-1.36,-5.52,-13.1,-15.96,-16.75,-15.6,-13.84,-12.28,-10.27,-8.95,-7.78,-7.05,-6.32,-4.77,-4.12,-4.26,-3.43,-2.82,-1.14,-0.76,-0.85,-1.24,-1.48,-1.52,-1.52,-1.52,-1.4,-1.45,-1.57,-1.74,-1.65,-0.85,-0.12,0.39,0.38,0.73,0.97,1.76,3.78,4.02,3.81,4.32,4.76,5.42,5.43,4.24,0.19,-2.49,-3.75,-3.7,-3.13,-3.56,-3.33,-2.81,-1.43,-0.42,0.02,-0.51,1.17,-0.4,-1.9,-2.39,-2.64,-2.85,-2.67,-2.38,-2.25,-1.94,-1.34,0.07,1.54,1.99,3.1,3.73,4.09,4.76,5.49,6.11,6.78,6.16,3.0,1.08,2.07,3.4,5.15,5.82,5.73,5.96,4.87,3.54,3.42,1.95,-0.02,1.54,0.41,-0.36,-1.04,-3.53,-4.39,-4.19,-4.12,-3.92,-4.41,-4.35,-4.53,-5.19,-4.27,-2.89,-2.15,-1.34,-0.59,0.11,0.29,0.5,1.06,2.97,4.06,4.53,5.06,5.74,5.35,3.4,1.2,-1.39,-3.41,-4.35,-4.9,-5.66,-6.12,-6.11,-6.4,-9.15,-12.5,-14.87,-16.48,-16.95,-16.08,-14.59,-12.23,-10.0,-8.74,-7.57,-5.97,-4.09,-2.75,-1.97,-0.87,0.19,1.02,1.5,1.96,2.39,3.3,4.05,4.38,4.56,3.2,3.08,3.64,3.7,3.81,4.09,3.24,2.37,1.11,0.69,0.18,0.39,0.12,-0.05,0.57,0.87,6.12,2.54,-4.77,-6.71,-7.29,-6.11,-5.09,-4.39,-4.05,-3.72,-3.02,-2.16,-1.4,-0.96,-1.04,-1.24,-1.19,-0.87,-0.07,0.87,1.3,0.94,-0.14,-1.35,-2.3,-2.88,-3.02,-3.62,-4.38,-5.3,-6.97,-8.54,-9.65,-10.3,-10.9,-10.67,-10.57,-10.74,-11.36,-11.83,-12.69,-13.21,-13.03,-12.21,-11.93,-11.66,-10.33,-9.2,-8.24,-7.26,-5.88,-4.18,-2.54,-0.99,0.16,1.35,2.95,4.38,5.98,7.79,9.02,10.01,10.9,11.04,10.81,9.59,8.74,7.16,4.91,1.55,-2.89,-6.76,-9.92,-12.25,-12.74,-10.79,-8.2,-5.32,-2.66,-0.51,0.82,1.49,2.04,3.45,5.35,6.94,8.76,10.33,11.65,12.73,13.54,14.44,14.65,-14.03,-11.03,-11.91,-11.51,-11.54,-11.87,-12.23,-14.88,-15.62,-15.61,-13.5,-11.31,-9.33,-7.76,-7.18,-7.02,-6.29,-5.6,-5.21,-4.9,-4.34,-3.43,-2.47,-3.26,-4.65,-6.58,-9.75,-13.45,-15.81,-17.02,-16.21,-14.46,-12.7,-11.5,-10.19,-8.21,-6.32,-4.66,-2.88,-0.87,1.03,2.97,5.04,6.69,8.92,10.82,12.95,15.07,17.08,18.34,19.14,18.76,17.6,16.41,15.56,14.51,13.53,12.64,11.88,10.9,9.61,8.52,7.16,6.28,5.78,5.56,5.77,5.91,6.17,6.41,6.27,5.66,4.55,3.07,1.41,0.13,-0.03,-0.06,0.25,0.01,-0.55,-1.44,-3.01,-8.19,-8.55,-8.85,-10.22,-12.4,-12.01,-9.55,-7.68,-5.4,-2.05,-0.38,0.71,-6.0,-6.34,-9.53,-11.97,-13.05,-13.06,-12.98,-12.01,-10.7,-9.39,-8.27,-7.89,-6.82,-5.77,-4.78,-3.93,-4.35,-3.9,-2.1,-2.21,-2.02,-1.9,-1.86,-1.67,-1.54,-1.66,-1.99,-1.81,-1.97,-2.09,-2.1,-1.29,-0.51,0.36,1.39,2.09,2.47,2.87,3.0,4.35,4.48,4.52,4.75,4.64,4.53,4.26,3.61,2.81,2.02,1.17,0.23,-1.49,-2.44,-4.66,0.2,1.01,-0.51,0.38,0.01,-0.74,-1.48,-1.7,-2.06,-2.58,-3.18,-3.57,-3.28,-3.42,-2.75,-1.51,0.9,2.4,2.75,3.57,3.98,4.38,4.9,5.64,6.26,6.28,5.68,3.71,1.29,1.02,2.73,4.22,5.14,5.24,4.23,2.76,2.03,1.91,0.76,-1.37,-1.5,-1.17,-2.05,-3.23,-4.03,-4.45,-4.26,-4.12,-4.08,-4.46,-4.32,-3.47,-3.47,-3.45,-2.71,-1.17,-0.16,0.47,0.47,0.77,1.42,3.0,4.4,4.84,6.4,7.82,8.55,7.27,4.03,0.01,-2.97,-4.19,-5.01,-5.76,-5.95,-7.17,-9.72,-11.0,-11.66,-12.52,-13.4,-13.81,-12.94,-11.35,-9.98,-8.54,-7.29,-6.43,-5.41,-4.29,-3.22,-2.31,-0.87,-0.12,0.02,0.22,0.38,0.43,1.34,2.26,3.28,3.4,1.9,2.24,3.12,3.6,4.31,4.48,4.26,2.13,0.88,-0.47,-0.56,-0.42,-1.45,-1.73,-0.68,0.77,2.01,2.82,1.52,-1.87,-4.43,-5.99,-5.68,-5.05,-4.33,-3.66,-2.78,-1.82,-1.06,-0.5,-0.55,-1.1,-1.27,-1.16,-0.23,1.15,2.31,3.06,2.71,1.18,-0.78,-2.36,-3.1,-3.28,-3.48,-4.77,-5.94,-6.92,-8.08,-8.94,-10.22,-10.95,-11.52,-11.33,-12.15,-13.1,-13.6,-14.28,-14.42,-14.52,-14.83,-14.16,-12.71,-10.88,-9.34,-8.01,-6.62,-5.1,-3.39,-1.71,-0.32,0.87,2.06,3.22,4.92,7.08,8.73,10.06,11.12,11.39,10.92,9.73,8.48,7.54,6.03,3.81,-0.2,-5.04,-9.08,-11.75,-12.74,-11.93,-9.95,-7.14,-4.08,-1.4,0.31,0.85,0.94,1.45,3.18,5.27,7.51,9.35,10.64,11.69,12.27,12.4,12.04,13.65,-11.55,-11.14,-12.17,-12.75,-13.12,-14.54,-17.05,-16.95,-15.41,-13.09,-11.88,-10.23,-8.22,-6.99,-5.99,-5.5,-5.6,-5.68,-5.24,-5.17,-4.17,-2.68,-2.49,-5.07,-6.97,-9.32,-12.59,-15.16,-16.05,-15.86,-14.25,-13.14,-11.99,-10.37,-8.52,-6.78,-5.17,-3.21,-1.07,1.07,3.53,5.71,7.7,9.69,11.87,13.75,15.68,17.39,18.37,18.85,18.34,17.61,16.45,15.24,14.16,13.25,12.38,11.39,10.21,8.94,7.79,6.95,5.98,5.4,5.16,5.12,5.4,5.81,6.2,6.25,5.82,4.69,3.84,1.17,-1.0,-0.9,-0.19,0.75,-1.2,-3.98,-4.63,-5.62,-7.57,-8.84,-12.69,-12.78,-11.94,-9.69,-8.79,-7.6,-5.74,-3.09,-2.78,-4.52,-5.65,-9.11,-10.31,-10.44,-11.02,-11.78,-11.69,-11.42,-10.53,-9.7,-8.83,-8.16,-7.25,-6.83,-5.25,-4.46,-4.91,-5.05,-3.71,-2.96,-2.51,-2.13,-1.88,-1.83,-1.8,-1.78,-1.86,-2.1,-2.16,-2.21,-1.92,-1.76,-1.59,-1.58,-0.97,0.43,0.67,0.96,1.2,2.33,3.47,4.5,4.87,4.87,4.85,4.69,4.09,3.45,2.88,2.21,1.72,0.89,-0.88,-3.59,-1.03,0.3,-0.24,0.25,0.06,0.44,-0.44,-0.72,-0.89,-1.22,-2.35,-3.5,-4.05,-3.89,-2.21,-0.02,1.69,2.86,3.35,3.34,3.95,4.79,5.03,5.55,5.86,5.61,5.02,4.18,2.27,-0.45,-0.85,-0.4,1.22,2.29,2.3,2.21,1.63,1.92,1.37,-0.61,-2.57,-3.19,-3.06,-2.89,-3.26,-4.18,-4.52,-4.2,-4.03,-3.69,-3.73,-3.55,-3.39,-3.82,-3.25,-1.9,-0.54,-0.36,0.31,1.06,1.28,2.5,4.01,4.97,6.77,9.27,11.05,10.88,7.64,0.87,-2.77,-4.14,-4.98,-6.86,-8.61,-9.82,-10.16,-10.48,-11.09,-11.46,-11.76,-11.71,-11.02,-9.91,-8.92,-7.91,-6.92,-5.73,-4.32,-3.14,-2.37,-1.68,-0.67,-0.31,-0.44,-0.46,-0.73,-1.04,-0.43,1.07,2.48,2.81,1.42,1.67,2.75,3.55,4.08,4.17,3.8,3.1,2.33,1.94,0.47,0.87,1.16,0.16,-0.69,-0.52,-1.29,-1.33,-0.87,-1.22,-2.61,-3.88,-4.45,-4.14,-3.32,-2.34,-1.27,-0.26,0.57,0.89,0.79,0.45,-0.32,-0.52,0.36,2.02,4.1,5.07,4.36,2.14,-0.56,-2.68,-3.92,-4.51,-4.86,-5.11,-5.19,-6.19,-7.08,-8.2,-9.09,-9.5,-9.98,-11.23,-12.36,-12.51,-13.45,-14.16,-14.84,-15.63,-15.19,-14.74,-14.51,-13.38,-11.51,-9.44,-7.5,-5.87,-4.4,-2.9,-1.29,0.01,1.15,2.14,3.15,5.57,7.85,9.33,10.5,11.0,10.55,9.66,8.43,8.07,7.41,5.59,2.35,-2.93,-7.89,-11.63,-13.28,-13.01,-11.2,-8.52,-5.41,-2.48,-0.67,-0.03,-0.36,-0.19,1.26,3.55,5.89,7.86,9.41,10.12,10.66,10.72,10.29,10.44,12.21,0.04,-13.68,-13.55,-15.39,-16.96,-16.83,-15.53,-13.31,-11.52,-10.79,-10.16,-7.82,-6.81,-6.02,-5.42,-4.76,-4.56,-5.12,-5.08,-4.38,-4.24,-3.6,-4.25,-7.43,-9.37,-12.12,-15.1,-16.4,-16.35,-15.43,-13.45,-12.35,-10.82,-9.03,-7.3,-5.37,-3.11,-0.88,1.57,4.23,6.51,8.65,10.64,12.65,14.4,15.82,17.01,17.86,18.17,17.77,17.3,15.87,14.77,13.85,13.04,11.97,10.9,9.78,8.89,7.87,6.62,5.24,4.53,4.08,3.96,4.14,4.56,5.24,6.05,6.5,6.67,5.88,3.83,0.69,-1.41,0.66,1.16,-1.86,-5.92,-7.25,-8.48,-7.89,-8.3,-8.82,-9.43,-8.73,-7.39,-6.76,-5.87,-5.75,-4.32,-3.67,-8.28,-8.03,-9.28,-11.45,-11.72,-11.36,-11.36,-11.31,-10.96,-10.37,-9.01,-8.92,-8.67,-8.27,-7.12,-5.67,-5.16,-4.58,-4.41,-4.21,-4.05,-3.77,-3.57,-4.16,-4.06,-3.23,-2.46,-2.5,-2.55,-2.17,-2.03,-1.46,-0.62,0.01,0.58,1.4,2.35,3.08,2.75,1.77,1.35,1.19,1.29,1.64,1.99,2.81,3.79,4.34,4.22,3.82,3.26,2.63,2.08,1.01,-0.33,-4.2,-0.63,2.59,-0.83,-0.19,0.58,0.51,0.48,1.16,0.83,-0.77,-2.12,-2.34,-1.55,-0.54,0.87,2.34,3.22,2.73,2.53,2.76,3.3,3.89,4.58,5.04,5.37,5.18,4.9,4.73,3.49,0.15,-2.09,-2.5,-1.14,-0.07,0.68,2.54,-0.47,-1.39,-2.43,-3.55,-3.8,-3.13,-2.92,-3.44,-3.92,-4.44,-5.04,-5.17,-4.5,-3.73,-3.72,-4.22,-3.57,-2.63,-2.14,-1.58,-1.05,-0.31,0.35,0.74,1.7,3.37,3.81,6.42,9.18,10.97,11.87,12.61,5.69,-0.33,-2.39,-4.75,-5.46,-7.66,-8.71,-8.82,-8.69,-8.87,-9.51,-10.27,-10.79,-10.54,-9.52,-8.05,-6.56,-5.22,-4.2,-3.45,-2.8,-2.04,-1.28,-0.89,-0.91,-0.85,-0.78,-1.01,-1.98,-2.11,-0.93,1.32,2.06,0.91,1.09,2.34,3.08,3.38,3.86,4.0,3.41,2.48,1.45,1.15,1.54,1.2,-0.95,-1.37,-1.68,-2.54,-2.44,-2.43,-2.08,-2.47,-3.26,-3.8,-3.66,-3.08,-2.05,-0.96,-0.1,0.49,0.75,0.89,0.81,0.28,0.38,1.22,2.98,4.66,5.92,6.13,5.17,3.13,0.67,-2.04,-4.21,-5.88,-6.94,-7.64,-7.43,-7.23,-7.36,-8.26,-9.27,-9.69,-10.12,-10.76,-11.39,-12.02,-12.81,-13.81,-15.1,-16.21,-16.41,-15.59,-14.82,-13.04,-10.47,-8.17,-6.05,-4.28,-2.49,-0.81,0.52,1.69,2.63,3.63,4.78,6.22,7.74,8.78,9.31,9.6,9.23,9.63,8.95,8.54,7.3,4.34,-0.29,-6.18,-11.09,-13.13,-13.25,-11.65,-9.05,-6.27,-3.8,-2.21,-1.41,-1.19,-1.06,0.06,2.0,4.28,6.3,7.99,8.92,9.14,9.14,8.76,8.22,7.48,7.12,5.14,-5.32,-14.31,-15.58,-15.01,-13.07,-11.76,-10.69,-9.68,-7.9,-6.72,-6.46,-6.03,-5.25,-4.22,-3.69,-3.79,-4.2,-4.83,-5.21,-5.25,-5.27,-7.55,-9.85,-11.39,-13.86,-15.76,-15.81,-15.04,-14.15,-12.5,-11.45,-9.87,-8.0,-5.7,-3.06,-0.47,2.34,4.84,7.49,9.27,11.48,13.36,14.94,16.19,16.95,17.31,17.15,17.05,16.47,16.0,15.42,14.53,13.82,12.91,11.76,10.22,9.09,7.56,6.37,4.84,3.79,3.19,2.91,3.18,3.7,4.47,5.23,5.96,6.4,5.27,2.12,-1.54,-1.14,0.95,-1.22,-5.84,-9.29,-8.41,-9.58,-9.54,-9.22,-8.14,-7.43,-7.05,-6.55,-6.04,-5.73,-4.73,-3.53,-3.5,-9.27,-9.4,-10.27,-11.99,-12.86,-12.27,-11.56,-11.48,-11.33,-10.3,-9.1,-8.58,-8.72,-8.36,-7.66,-6.81,-5.66,-5.69,-5.96,-5.92,-4.48,-4.0,-3.59,-3.25,-3.75,-4.18,-3.56,-2.79,-2.5,-2.14,-1.33,-0.67,0.32,1.38,2.33,2.84,3.2,3.43,3.6,3.57,3.17,2.7,2.19,1.88,1.95,2.33,2.46,2.24,2.2,2.58,3.34,3.58,3.23,2.57,1.69,0.69,-0.11,-1.73,-1.76,-0.19,-0.14,0.93,2.53,3.04,2.2,2.26,0.84,-0.19,-0.31,0.39,1.56,2.66,2.58,1.76,1.8,2.65,2.78,2.4,2.75,3.09,4.0,4.42,4.54,4.5,4.64,4.07,0.97,-3.19,-4.08,-3.2,-2.72,-3.5,-3.61,1.14,0.63,-1.63,-3.2,-3.35,-2.54,-2.12,-2.24,-3.38,-4.52,-4.55,-4.53,-4.74,-4.38,-3.93,-3.53,-3.3,-3.1,-2.56,-2.36,-2.15,-1.01,0.19,-0.19,1.56,2.59,4.18,7.04,9.38,10.04,10.36,9.65,6.11,1.04,-2.3,-1.22,-3.01,-4.46,-5.49,-6.27,-7.19,-8.12,-8.62,-8.61,-8.19,-7.33,-6.34,-5.37,-4.44,-3.46,-2.5,-1.94,-1.77,-1.62,-1.42,-1.19,-0.86,-0.59,-0.68,-2.08,-3.0,-1.65,0.01,0.7,-0.1,0.26,1.71,2.64,2.89,2.79,3.27,3.52,3.24,2.6,1.72,0.99,0.75,0.81,0.4,-0.16,-0.71,-1.38,-2.24,-1.8,-1.71,-2.15,-2.92,-3.74,-3.67,-3.12,-1.63,-0.5,0.03,0.48,0.42,0.15,0.62,1.13,2.02,3.65,5.42,7.1,8.13,8.0,6.58,3.16,-0.72,-3.37,-5.43,-7.52,-8.6,-8.64,-8.49,-8.87,-9.15,-9.35,-9.59,-9.97,-10.65,-11.28,-11.72,-12.35,-13.95,-14.92,-15.44,-15.84,-15.94,-14.95,-13.01,-10.78,-8.35,-5.84,-3.69,-1.84,-0.17,0.89,1.48,1.94,2.7,3.91,5.41,6.56,7.32,7.77,8.23,9.22,9.58,9.36,8.85,8.04,6.24,1.83,-5.5,-11.0,-13.68,-13.66,-11.84,-9.6,-7.31,-5.04,-3.16,-2.36,-2.35,-2.0,-1.07,0.67,3.04,4.95,6.88,8.07,8.24,7.61,6.89,5.6,3.58,1.28,0.27,-1.64,-4.2,-7.61,-10.83,-11.45,-10.88,-10.05,-9.38,-8.05,-6.87,-6.05,-5.02,-3.59,-3.16,-3.33,-3.49,-4.23,-5.73,-6.05,-5.75,-6.07,-7.54,-9.95,-12.12,-13.77,-15.33,-15.36,-14.27,-12.62,-12.1,-11.57,-10.31,-8.39,-5.82,-2.85,0.19,2.82,5.48,7.77,9.59,11.51,13.55,15.21,16.22,16.7,16.69,16.73,16.39,16.03,15.69,15.5,15.33,14.53,13.25,11.6,9.86,8.14,6.91,5.83,4.42,2.72,2.18,2.16,2.59,3.26,3.87,4.59,5.28,5.95,4.05,-0.01,-1.15,0.15,-0.77,-5.52,-11.88,-10.33,-10.1,-8.96,-8.86,-9.63,-9.17,-8.49,-8.11,-7.54,-7.2,-6.98,-6.71,-5.47,-4.23,-8.65,-10.62,-10.03,-11.76,-12.83,-12.91,-12.01,-11.83,-11.38,-10.4,-8.99,-8.1,-7.92,-7.96,-7.58,-6.63,-5.65,-5.3,-5.65,-5.68,-5.3,-4.72,-4.73,-4.61,-4.18,-4.17,-3.85,-2.97,-2.49,-2.5,-1.59,0.02,1.79,2.85,3.04,3.3,3.99,4.47,4.72,4.67,4.4,4.34,4.39,4.52,4.53,4.44,4.18,3.8,3.37,2.95,2.71,2.67,2.75,2.61,2.25,1.77,1.36,0.85,0.56,1.03,2.08,3.23,3.52,2.48,1.04,0.01,-0.15,-0.01,0.37,1.18,2.34,2.68,2.09,1.19,1.14,1.98,2.87,2.84,2.03,1.65,1.6,1.85,2.38,3.3,3.84,3.71,3.0,1.02,-3.65,-5.6,-4.54,-4.2,-4.19,-3.43,-2.79,-2.68,-4.15,-4.69,-4.7,-3.73,-2.22,-1.53,-1.76,-2.91,-4.29,-4.51,-4.12,-3.75,-3.78,-3.8,-3.81,-3.89,-4.15,-3.36,-1.67,-0.83,-0.77,-0.98,0.8,0.51,3.33,5.21,6.4,6.9,6.56,5.07,3.11,0.96,-2.34,-3.39,-4.3,-5.01,-5.36,-5.51,-5.95,-6.39,-6.47,-6.17,-5.49,-4.56,-3.66,-2.82,-2.11,-1.68,-1.49,-1.4,-1.33,-1.23,-1.02,-0.74,-0.6,-0.92,-2.3,-3.25,-2.42,-0.99,-0.54,-1.2,-0.71,0.8,1.9,1.38,0.88,1.73,2.85,3.07,2.81,3.03,3.39,3.13,2.91,2.72,1.53,-0.22,-0.67,-1.48,-0.75,-0.96,-1.49,-1.43,-1.03,-0.43,0.27,1.04,1.84,2.01,1.59,0.47,0.4,0.5,2.28,4.29,6.46,8.42,9.75,10.22,10.88,11.58,11.07,6.82,0.5,-4.34,-7.35,-8.7,-8.87,-9.11,-9.68,-10.09,-10.12,-10.15,-10.18,-10.41,-10.89,-10.98,-11.54,-12.76,-14.32,-14.75,-15.36,-15.27,-13.98,-12.11,-9.99,-7.67,-5.39,-3.54,-2.15,-0.83,0.25,1.17,1.97,2.55,3.35,3.8,4.88,5.99,6.45,6.96,7.86,8.79,8.93,8.28,8.1,6.51,2.44,-5.16,-11.83,-13.48,-13.22,-11.58,-9.55,-7.48,-5.29,-3.67,-3.08,-2.63,-2.16,-1.17,0.51,2.19,3.92,5.63,7.04,7.37,6.71,5.1,2.86,0.39,-1.23,-3.63,-5.69,-6.13,-7.37,-9.0,-10.0,-10.48,-10.46,-10.01,-9.09,-7.78,-6.72,-5.48,-4.2,-3.36,-2.93,-3.32,-4.23,-5.22,-6.31,-7.08,-7.88,-9.21,-11.22,-12.88,-14.01,-16.13,-16.46,-15.37,-13.61,-11.9,-10.82,-9.66,-7.75,-5.13,-2.09,0.87,3.31,5.65,7.54,9.42,11.55,13.63,15.23,16.15,16.36,16.46,16.26,16.07,15.91,15.95,15.58,15.44,14.75,13.34,11.62,9.62,7.59,6.12,5.12,4.41,3.31,2.41,1.87,1.87,2.56,3.43,4.25,5.24,4.01,0.5,-0.75,-0.56,-1.7,-6.9,-9.33,-7.37,-7.09,-7.29,-7.6,-8.37,-8.38,-7.95,-8.29,-8.15,-8.57,-9.11,-9.09,-8.83,-7.76,-6.63,-9.3,-12.03,-10.97,-11.77,-13.03,-12.98,-12.94,-12.24,-12.25,-12.03,-10.13,-8.88,-7.99,-7.75,-7.34,-6.83,-6.28,-5.6,-5.57,-5.79,-5.65,-5.45,-4.43,-4.63,-5.08,-4.99,-4.92,-3.94,-1.57,0.0,0.49,0.8,1.01,1.46,1.9,2.38,3.34,3.78,4.42,4.98,5.42,5.98,6.83,7.65,8.18,8.51,8.51,8.26,7.86,7.44,7.06,6.89,6.42,5.99,5.07,3.54,2.11,1.21,0.71,0.88,1.29,1.2,0.66,0.22,-0.11,-0.23,-0.14,-0.03,-0.03,-0.21,-0.15,0.19,0.66,1.19,1.59,1.74,1.77,1.52,1.45,1.27,1.31,1.55,1.73,1.63,1.62,1.87,2.47,2.33,1.13,-3.2,-6.05,-6.06,-5.18,-5.55,-5.2,-4.64,-4.56,-4.74,-5.34,-5.22,-4.15,-2.66,-2.1,-1.86,-1.78,-2.06,-2.3,-2.41,-2.58,-3.01,-3.93,-4.89,-5.24,-4.48,-3.18,-2.24,-1.79,-1.98,-1.74,0.02,-0.59,0.16,1.59,1.92,1.78,1.23,0.14,-1.17,-3.85,-4.45,-4.85,-4.93,-4.79,-4.62,-4.45,-4.26,-4.07,-3.86,-3.51,-3.03,-2.49,-2.04,-1.75,-1.65,-1.62,-1.63,-1.56,-1.31,-1.13,-0.77,-0.32,-0.43,-2.4,-4.22,-3.9,-2.53,-1.81,-1.75,-1.06,0.33,1.3,0.37,-0.2,1.36,2.48,0.41,1.36,2.77,2.87,2.49,1.78,1.0,0.94,1.08,0.75,1.25,1.39,0.61,0.61,0.9,0.88,0.45,1.22,2.33,4.74,6.04,4.06,0.63,1.49,2.99,4.03,5.58,7.32,9.35,10.9,11.31,11.86,13.37,15.48,17.4,14.8,2.38,-6.08,-8.72,-8.81,-8.35,-9.24,-10.44,-11.12,-11.43,-11.52,-11.57,-11.88,-12.48,-13.31,-14.42,-14.96,-14.62,-14.4,-13.5,-12.12,-10.23,-8.28,-6.23,-4.24,-2.61,-1.4,-0.33,0.64,1.41,1.88,2.12,2.35,2.68,2.91,3.96,4.72,5.09,5.9,7.06,7.79,7.36,6.99,5.98,1.62,-7.27,-12.52,-12.61,-11.41,-10.19,-8.44,-6.5,-4.7,-3.42,-2.78,-2.25,-1.24,-0.28,0.7,1.84,3.29,4.67,5.59,6.17,5.97,4.42,2.18,-0.57,-3.94,-5.36,-6.09,-7.43,-8.25,-7.97,-8.57,-9.56,-10.35,-10.41,-9.58,-8.24,-6.36,-4.89,-3.52,-2.47,-2.34,-2.98,-3.74,-4.76,-6.16,-7.59,-8.82,-10.6,-12.86,-14.75,-16.24,-17.64,-18.14,-16.87,-14.66,-12.2,-10.18,-8.48,-6.42,-3.85,-0.98,1.66,4.09,6.04,7.97,10.1,12.07,13.69,15.09,15.97,16.46,16.63,16.81,16.96,16.72,16.47,16.54,15.84,14.47,12.92,11.17,9.08,7.09,5.33,3.93,2.92,2.13,1.42,1.1,1.78,2.23,2.56,4.44,4.41,0.17,-1.72,-2.15,-5.26,-5.76,-4.14,-4.36,-5.05,-5.61,-6.33,-7.1,-8.1,-8.96,-9.27,-9.34,-9.68,-10.96,-12.0,-12.22,-12.05,-11.06,-9.36,-11.12,-13.35,-12.51,-12.99,-13.36,-12.28,-12.33,-12.19,-11.82,-12.05,-10.63,-9.61,-8.7,-7.79,-6.98,-6.32,-6.1,-5.88,-5.73,-5.26,-5.24,-5.66,-5.45,-4.97,-4.84,-4.47,-3.56,-2.36,-1.21,0.1,0.34,-0.09,0.2,0.69,1.27,1.83,2.39,3.06,3.94,4.27,4.84,5.56,6.23,6.75,7.13,7.71,7.84,7.83,7.76,7.58,7.67,7.76,7.98,8.29,8.6,8.72,8.84,8.86,8.87,8.65,7.98,7.16,6.52,5.76,4.93,4.2,4.08,3.74,2.93,2.13,1.7,1.74,2.13,2.5,2.49,2.14,1.53,0.86,0.34,0.19,0.6,1.29,2.07,2.0,1.51,0.89,0.69,0.84,0.87,0.18,-3.1,-6.95,-7.62,-6.58,-6.56,-6.5,-6.3,-6.63,-6.94,-6.8,-5.34,-3.67,-2.59,-1.49,-1.42,-2.16,-2.1,-2.32,-3.15,-3.54,-3.73,-3.75,-3.38,-2.77,-2.1,-1.94,-2.6,-2.89,-2.84,-2.8,-1.5,-0.59,-0.84,-1.22,-1.49,-1.88,-2.44,-3.14,-4.23,-4.85,-5.21,-5.18,-4.8,-4.24,-3.73,-3.4,-3.2,-3.05,-2.94,-2.88,-2.66,-2.33,-2.14,-2.27,-2.28,-1.83,-1.06,-0.47,-0.22,-0.22,-0.32,-0.05,-0.55,-3.69,-5.44,-4.09,-2.99,-2.24,-1.12,0.55,0.47,-0.46,-1.17,-0.99,-0.12,1.08,2.05,3.21,3.98,3.37,2.27,1.77,0.95,-0.94,-1.32,-0.81,-1.64,0.01,1.0,1.47,1.43,-1.06,-1.17,1.84,3.92,5.64,6.63,6.89,6.3,6.05,6.55,7.34,7.97,8.55,8.82,9.2,10.29,11.83,14.18,17.11,20.24,19.54,7.9,-5.31,-8.02,-8.51,-9.7,-10.91,-11.86,-12.59,-12.71,-12.75,-13.15,-13.57,-14.03,-14.2,-13.76,-12.78,-11.64,-10.27,-8.93,-7.28,-5.51,-3.86,-2.33,-0.7,0.83,1.86,2.41,2.47,2.52,2.41,2.11,1.77,1.68,1.77,2.55,3.0,3.55,4.38,5.07,5.65,5.26,4.21,-1.89,-11.54,-13.19,-11.78,-10.25,-8.62,-7.09,-5.51,-4.27,-3.4,-2.51,-1.34,-0.55,0.15,1.06,2.29,3.44,4.41,5.23,5.62,4.55,2.96,1.14,-0.82,-3.24,-7.07,-9.13,-8.33,-8.21,-8.87,-9.08,-9.44,-10.14,-10.33,-9.65,-8.55,-6.64,-4.75,-3.13,-2.18,-2.33,-3.42,-4.49,-5.26,-6.15,-7.28,-9.12,-11.42,-13.71,-15.73,-16.69,-17.63,-17.57,-16.52,-14.66,-12.14,-10.08,-7.94,-5.5,-2.65,0.22,2.59,4.6,6.35,8.05,9.64,11.52,13.15,14.53,15.63,16.47,17.11,17.36,17.39,17.52,17.14,16.73,15.68,14.12,12.37,10.65,8.85,6.7,4.18,2.22,1.42,1.17,0.63,0.41,1.22,2.75,4.47,3.33,-0.63,-2.07,-4.98,-5.88,-3.66,-2.76,-1.81,-0.37,0.37,-0.02,-1.47,-3.89,-6.79,-9.48,-11.38,-12.19,-12.86,-13.2,-14.76,-15.41,-15.44,-14.79,-12.71,-13.74,-14.76,-14.18,-13.54,-13.33,-12.54,-11.47,-11.39,-11.37,-10.51,-10.09,-9.45,-8.63,-8.03,-7.38,-6.95,-6.5,-6.12,-5.46,-4.82,-4.54,-4.61,-4.18,-4.18,-3.95,-3.54,-3.04,-2.6,-2.38,-1.51,-0.15,1.05,1.62,1.85,1.96,2.16,2.56,2.95,3.16,3.6,4.15,5.1,6.33,7.14,7.54,7.5,7.22,6.96,6.9,6.75,6.69,6.64,6.99,7.51,7.86,8.17,8.16,8.39,8.39,8.23,7.98,7.17,7.08,6.06,5.37,6.26,6.78,6.35,5.34,4.24,3.74,4.02,4.58,5.2,4.88,3.9,2.67,1.78,1.5,1.24,1.53,2.53,2.95,2.74,1.83,1.02,0.63,0.42,0.25,-0.3,-1.48,-4.71,-8.76,-9.54,-8.13,-7.6,-7.1,-6.73,-7.13,-8.01,-7.39,-5.45,-5.22,-5.6,-2.12,-0.31,-0.56,-1.98,-2.36,-1.86,-0.99,-0.32,0.25,0.0,-0.82,-0.37,0.56,0.1,-2.15,-3.35,-3.12,-2.87,-2.5,-2.12,-1.98,-2.18,-2.75,-3.5,-2.71,-3.56,-4.08,-4.14,-3.85,-3.38,-2.99,-2.74,-2.6,-2.51,-2.5,-2.49,-2.54,-2.64,-2.55,-2.12,-1.21,0.13,1.48,2.13,1.86,1.22,0.48,-0.38,-1.47,-3.33,-6.29,-5.51,-4.32,-3.18,-1.61,-0.26,-1.3,-1.55,-1.77,-1.21,0.22,1.56,2.81,3.97,4.11,3.58,3.02,3.06,2.53,0.6,-2.54,-3.45,-2.86,-0.94,-4.2,-3.08,-1.71,-0.35,0.58,1.97,4.06,6.18,7.82,8.73,9.03,9.06,8.86,8.66,8.56,8.51,8.49,8.43,8.38,9.08,10.99,13.7,14.91,17.07,18.07,14.43,5.52,-4.11,-8.31,-9.55,-9.88,-10.23,-10.56,-10.41,-10.06,-9.57,-9.16,-9.07,-8.94,-8.79,-8.28,-7.22,-5.83,-4.23,-2.48,-0.96,0.12,1.19,2.27,3.16,3.94,4.52,4.47,3.72,2.55,1.17,-0.02,-0.83,-1.09,-0.79,-0.05,1.08,1.95,2.77,2.82,0.4,-9.65,-14.32,-13.3,-11.34,-9.22,-7.53,-6.04,-4.81,-3.75,-2.61,-1.63,-0.88,-0.07,0.8,1.75,2.43,3.21,4.45,5.21,5.25,4.8,3.57,0.89,-1.74,-4.1,-6.68,-9.69,-12.01,-11.25,-10.7,-10.68,-10.7,-10.79,-10.52,-9.74,-8.29,-6.54,-4.6,-2.95,-1.89,-2.44,-3.55,-4.54,-5.49,-6.7,-9.05,-10.97,-12.53,-14.26,-15.13,-15.64,-16.24,-16.14,-15.01,-13.2,-10.92,-9.27,-7.0,-4.47,-1.67,0.96,3.09,4.53,6.53,8.43,9.95,11.32,12.93,14.4,15.71,16.8,17.51,18.07,18.68,18.84,18.98,17.32,15.72,13.86,11.74,9.66,7.71,5.9,3.52,1.04,0.48,0.5,0.3,0.98,2.17,3.93,1.92,-2.03,-5.17,-4.75,-2.73,-2.06,-1.04,0.3,1.97,3.59,4.79,5.16,4.41,2.04,-2.4,-7.84,-13.34,-17.28,-18.6,-19.27,-19.59,-19.93,-19.03,-17.65,-15.92,-16.45,-15.98,-14.54,-13.96,-13.25,-12.54,-11.96,-11.36,-10.57,-10.02,-9.52,-9.07,-8.71,-8.34,-7.89,-7.48,-6.83,-5.78,-5.23,-5.03,-4.77,-4.59,-4.44,-4.49,-4.49,-4.16,-3.38,-2.28,-1.18,-0.21,0.72,1.45,1.86,2.14,2.43,3.05,3.49,3.66,3.64,4.37,5.2,6.0,6.89,7.39,7.45,7.38,7.16,6.92,7.14,6.97,6.71,6.35,6.35,7.43,7.83,7.89,7.56,6.9,6.39,6.13,5.85,6.31,6.11,5.66,5.6,5.69,5.59,5.41,4.94,4.24,3.79,3.94,4.5,4.81,4.72,4.34,3.23,1.98,1.92,2.6,3.04,3.31,3.14,2.36,1.49,0.9,0.62,0.71,0.53,-0.14,-1.58,-3.99,-7.77,-10.82,-10.37,-8.93,-8.03,-7.57,-7.43,-8.63,-8.99,-7.62,-7.07,-6.77,-4.33,-3.28,-3.31,-3.91,-4.08,-3.36,-2.43,-1.49,-0.54,0.26,0.04,0.01,0.41,1.64,3.3,3.41,1.18,0.56,0.24,0.38,0.34,-0.15,-0.87,-1.73,1.11,0.43,-0.19,-0.5,-0.44,-0.07,0.47,0.88,1.03,1.01,0.87,0.76,0.74,0.79,0.88,1.04,1.26,1.26,1.27,1.42,1.44,1.12,0.73,0.62,-0.16,-4.65,-7.36,-6.41,-5.41,-4.31,-2.71,-2.49,-3.34,-2.75,-2.43,-1.64,-0.28,1.58,3.68,4.66,4.29,3.98,3.43,4.18,4.06,0.29,-3.77,-4.84,-2.12,-6.01,-5.49,-3.71,-2.24,-1.39,0.18,2.18,4.44,6.56,8.3,9.12,9.75,10.4,10.4,9.7,9.29,9.28,9.2,8.92,8.72,8.66,8.61,8.42,9.83,11.06,9.44,10.58,10.53,7.28,3.44,-0.17,-3.0,-5.0,-6.08,-6.56,-6.8,-7.13,-7.52,-7.56,-7.04,-6.14,-5.05,-3.9,-2.83,-1.7,-0.22,1.17,2.18,3.16,4.11,4.34,4.01,3.68,3.33,2.87,1.64,-0.54,-2.93,-4.65,-5.08,-4.33,-3.09,-2.14,-1.4,-0.46,-0.76,-9.0,-14.33,-13.64,-12.03,-9.67,-7.52,-6.02,-4.85,-3.79,-2.78,-1.77,-0.63,0.63,1.5,1.71,1.72,2.4,3.12,3.65,4.41,4.76,5.1,3.56,0.64,-1.31,-3.5,-6.41,-9.03,-11.27,-12.36,-12.11,-12.02,-12.25,-12.07,-11.2,-9.56,-7.89,-6.36,-4.87,-3.53,-3.23,-3.66,-5.12,-6.42,-7.66,-9.23,-10.7,-11.96,-12.87,-13.47,-14.0,-14.69,-14.92,-14.19,-12.71,-11.46,-10.04,-8.13,-5.7,-2.96,-0.69,1.49,3.49,5.43,6.89,8.31,9.74,11.29,13.03,14.67,16.28,17.33,18.0,18.78,19.34,19.72,19.41,18.71,15.78,13.15,10.91,8.75,7.4,6.09,3.34,1.43,0.5,0.16,0.99,1.79,4.06,-0.33,-5.66,-7.37,-5.2,-3.69,-2.21,-0.45,1.52,3.68,5.87,7.76,9.53,11.18,12.54,8.98,-1.39,-5.38,-10.07,-17.41,-21.15,-22.1,-22.56,-22.22,-21.0,-19.37,-18.51,-17.89,-16.47,-14.68,-13.97,-13.56,-13.1,-12.43,-11.67,-10.84,-10.02,-9.26,-8.75,-8.46,-8.21,-7.81,-7.52,-7.17,-6.66,-7.04,-7.26,-6.69,-6.13,-5.71,-5.18,-4.53,-3.71,-2.77,-1.76,-0.73,0.17,0.77,1.22,1.55,1.85,2.21,2.8,3.23,3.4,3.68,4.26,4.86,5.1,5.59,6.05,6.31,6.1,5.71,5.81,6.35,6.97,7.28,7.5,7.7,7.82,8.01,8.35,8.2,7.68,7.01,7.31,8.35,8.57,8.31,7.98,7.46,7.07,6.78,6.43,6.14,5.6,5.16,5.14,5.28,4.81,4.03,3.18,3.22,2.97,2.65,2.56,2.53,2.23,1.19,0.71,0.35,0.5,0.66,0.55,0.48,0.01,-1.27,-3.54,-7.3,-10.95,-10.88,-9.37,-8.19,-7.42,-6.93,-8.39,-9.77,-8.82,-7.88,-7.47,-7.16,-6.75,-6.3,-5.88,-5.53,-4.54,-3.28,-2.11,-1.12,-0.39,-0.01,0.17,0.23,0.57,0.94,1.15,-0.59,-0.61,0.52,1.27,1.61,1.81,1.81,1.58,0.33,0.02,-0.26,-0.4,-0.35,-0.13,0.18,0.43,0.53,0.53,0.42,0.29,0.22,0.22,0.32,0.46,0.55,0.59,0.64,0.74,0.83,0.82,0.58,-0.13,-1.31,-4.63,-7.29,-6.56,-5.78,-4.73,-3.37,-3.38,-4.45,-3.9,-3.32,-2.54,-0.97,0.96,2.62,3.45,4.12,4.44,3.64,4.03,1.88,0.35,-3.39,-5.77,-7.53,-5.9,-5.6,-4.29,-2.53,-0.47,1.32,2.22,3.39,5.84,7.27,7.9,9.35,10.15,10.12,9.91,9.89,9.69,9.19,8.97,9.17,9.53,9.64,9.59,8.94,7.13,6.36,5.92,2.13,-0.65,-1.29,-2.03,-3.09,-4.11,-4.77,-5.25,-4.57,-4.37,-4.83,-5.33,-4.1,-2.93,-1.7,-0.65,0.2,1.21,2.21,2.85,2.43,2.95,4.8,6.22,8.68,9.45,9.23,8.7,6.33,1.79,-3.3,-6.69,-8.12,-7.94,-6.74,-4.72,-2.42,-4.2,-11.42,-13.39,-12.21,-10.66,-8.95,-7.24,-6.02,-4.84,-3.58,-2.3,-0.89,0.35,1.03,1.22,1.65,2.13,2.08,1.87,2.0,2.56,3.06,4.32,3.13,1.45,0.76,0.57,-0.64,-4.71,-7.97,-9.68,-10.37,-10.83,-11.29,-11.36,-11.19,-10.43,-9.45,-8.4,-7.06,-5.71,-5.17,-5.59,-6.45,-7.82,-9.04,-10.0,-10.84,-11.74,-11.99,-12.69,-13.52,-14.0,-14.3,-13.74,-12.62,-11.33,-9.82,-8.42,-6.73,-4.55,-1.91,0.35,2.25,4.02,5.68,7.12,8.4,10.09,11.69,13.43,15.01,16.36,17.37,18.43,19.31,19.58,19.84,21.12,15.95,13.47,13.29,11.51,9.59,7.69,5.73,4.01,2.96,2.1,1.93,2.84,4.0,-3.41,-7.88,-7.57,-5.93,-4.63,-2.76,-0.74,1.47,3.63,5.97,8.6,10.73,13.15,15.33,16.36,8.16,0.41,-3.43,-7.97,-12.79,-16.38,-18.79,-20.19,-20.23,-19.72,-19.2,-18.73,-17.55,-16.12,-14.55,-13.52,-12.74,-12.51,-12.46,-11.9,-11.04,-10.19,-9.46,-8.75,-8.38,-8.31,-8.18,-7.71,-7.28,-7.42,-8.14,-8.21,-7.34,-6.51,-5.81,-5.1,-4.24,-3.23,-2.24,-1.33,-0.43,0.41,1.18,1.84,2.5,2.94,3.05,2.92,3.16,3.64,3.8,3.79,4.17,5.0,5.54,5.66,5.77,5.85,5.78,5.66,5.82,6.34,7.23,8.15,8.49,8.76,8.76,9.0,9.39,9.36,9.26,9.32,9.14,9.04,8.92,8.86,9.0,8.42,8.08,7.48,6.9,5.78,4.68,4.61,4.52,4.31,3.98,3.64,3.39,2.85,1.95,1.7,1.88,1.83,1.25,0.31,-0.44,-0.64,-0.11,-0.01,0.0,-0.52,-2.34,-3.61,-7.69,-10.81,-10.6,-9.22,-7.77,-6.81,-6.11,-6.64,-9.4,-9.94,-9.85,-9.55,-9.01,-8.58,-8.17,-7.49,-6.62,-5.62,-4.45,-3.15,-1.99,-1.08,-0.52,-0.33,-0.46,-0.65,-0.89,-1.23,-1.36,-1.11,-0.71,-0.28,0.07,0.37,0.54,0.54,0.1,0.05,0.03,0.09,0.24,0.46,0.75,1.03,1.22,1.32,1.33,1.28,1.23,1.2,1.19,1.21,1.18,1.04,0.85,0.67,0.53,0.34,-0.18,-1.07,-2.37,-5.85,-7.4,-6.32,-5.41,-4.45,-3.55,-3.28,-4.14,-4.95,-4.37,-3.14,-1.97,-0.8,1.02,1.69,2.15,3.25,3.18,2.9,-3.42,-4.46,-6.58,-5.89,-5.2,-5.4,-3.84,-1.43,0.91,2.71,4.68,6.67,8.54,10.08,9.34,5.54,7.37,8.25,9.0,9.4,9.51,9.97,10.39,10.16,10.23,10.09,8.45,8.35,7.9,7.13,6.52,4.88,1.63,-0.57,-1.38,-1.96,-2.59,-3.18,-3.41,-2.92,-3.31,-3.84,-3.88,-3.56,-2.71,-1.41,-0.23,0.49,1.46,2.68,3.52,3.51,3.05,2.6,3.06,4.07,5.23,7.08,9.62,12.91,14.53,12.66,7.49,0.65,-5.34,-7.77,-8.1,-8.86,-10.03,-9.96,-9.03,-8.52,-8.11,-7.37,-6.39,-5.25,-3.64,-1.88,-0.39,0.4,1.21,2.56,4.08,4.85,4.45,3.36,1.87,0.38,-0.44,-0.46,1.39,-0.32,-0.61,-1.56,-3.21,-1.2,-0.76,-2.29,-4.47,-6.62,-7.96,-8.73,-9.17,-9.38,-9.32,-9.02,-8.5,-7.95,-7.26,-6.8,-7.37,-8.74,-10.12,-10.58,-10.88,-11.08,-10.79,-10.28,-10.17,-11.55,-12.62,-12.85,-12.78,-12.03,-11.09,-9.94,-8.9,-7.72,-6.16,-4.23,-2.12,0.44,2.63,4.29,5.81,7.36,8.67,10.51,12.13,13.65,15.05,16.21,17.18,18.31,19.25,19.61,19.99,21.07,14.82,10.84,10.78,10.12,9.29,8.04,6.68,5.12,4.1,3.79,3.65,1.02,-5.86,-7.09,-6.63,-5.56,-4.68,-2.52,-0.85,1.23,2.92,4.81,7.16,9.48,11.52,13.6,15.35,15.95,11.13,1.08,-3.1,-5.29,-7.56,-10.16,-12.69,-14.6,-16.0,-16.8,-16.94,-16.79,-16.21,-15.26,-14.17,-12.72,-11.6,-10.86,-10.56,-10.83,-10.84,-10.34,-9.61,-9.11,-8.5,-8.09,-7.81,-7.55,-7.97,-8.71,-8.61,-7.43,-6.27,-5.41,-4.65,-3.84,-2.95,-2.0,-1.17,-0.33,0.48,1.1,1.57,1.91,2.61,3.24,3.52,3.38,3.6,4.02,4.34,4.66,4.99,5.23,5.15,5.0,5.22,5.54,5.66,5.77,5.81,5.84,6.27,7.7,8.91,8.88,9.14,9.51,9.5,9.46,9.75,9.72,10.04,9.8,9.49,9.62,9.55,9.24,9.83,9.06,6.02,6.27,6.57,4.26,3.29,3.09,3.33,2.35,1.83,1.43,0.56,-0.35,-1.03,-1.05,-0.82,-0.73,-0.82,-0.71,-0.49,-0.77,-0.64,-1.79,-3.68,-5.26,-8.81,-11.14,-10.22,-8.89,-7.47,-6.46,-5.66,-4.69,-7.94,-10.53,-10.93,-11.04,-10.54,-10.05,-9.47,-8.71,-7.7,-6.49,-5.09,-3.6,-2.19,-1.07,-0.54,-0.48,-0.68,-1.1,-1.51,-1.7,-1.7,-1.56,-1.34,-1.13,-0.91,-0.56,-0.18,0.05,-0.64,-0.42,-0.27,-0.09,0.18,0.52,0.92,1.31,1.62,1.79,1.78,1.69,1.6,1.39,1.14,0.99,0.92,0.81,0.59,0.28,-0.1,-0.53,-1.1,-2.53,-4.74,-7.07,-7.54,-6.33,-5.07,-4.09,-3.5,-3.58,-4.11,-4.61,-4.59,-3.82,-2.47,-0.95,-0.11,-0.19,-0.16,0.31,0.61,0.2,-1.73,-2.81,-3.44,-5.84,-5.5,-3.92,-2.3,-0.17,1.97,4.03,6.57,8.71,8.59,7.43,6.77,7.04,4.79,4.3,5.88,7.48,7.41,7.33,8.7,9.26,8.3,9.06,9.48,6.52,5.78,5.79,4.37,3.13,2.84,1.19,-2.04,-4.59,-4.65,-4.16,-4.18,-3.34,-2.82,-3.33,-2.94,-2.16,-0.96,0.29,0.42,-0.28,-0.69,-0.65,-0.07,0.82,1.75,2.46,3.04,3.26,3.42,4.48,6.24,8.26,9.89,10.5,9.69,7.41,4.85,2.72,1.35,0.37,-0.37,-1.23,-1.91,-1.66,-1.54,-0.81,-1.01,-0.87,-0.72,-0.12,1.66,3.54,4.59,5.18,5.28,5.25,4.08,2.93,3.96,4.86,1.96,-3.62,-2.48,0.99,2.31,3.85,5.71,5.87,5.08,3.8,1.55,-1.66,-4.69,-5.74,-6.02,-6.69,-7.18,-7.39,-6.85,-7.37,-8.07,-9.07,-10.03,-12.08,-11.2,-10.84,-10.59,-9.81,-8.73,-8.28,-8.36,-8.92,-9.61,-10.84,-10.4,-10.01,-9.49,-8.94,-8.04,-7.17,-5.94,-3.37,-0.84,0.65,2.28,4.22,6.28,7.61,9.26,10.8,12.08,13.46,14.65,15.64,16.68,17.69,18.4,19.17,19.92,20.13,17.43,12.15,10.1,8.68,7.52,6.54,5.26,3.7,1.75,-0.74,-3.73,-5.54,-5.58,-5.27,-4.71,-4.23,-3.28,-2.41,-0.72,0.72,2.23,4.28,6.51,8.52,10.26,11.85,13.4,14.15,13.02,8.67,0.57,-5.44,-7.09,-7.82,-8.97,-10.25,-11.54,-12.61,-13.33,-13.78,-13.77,-13.48,-13.08,-13.08,-12.31,-11.37,-10.83,-10.59,-10.32,-10.46,-10.31,-9.38,-8.76,-8.57,-8.68,-9.02,-8.93,-8.05,-6.87,-5.92,-5.2,-4.34,-3.3,-2.38,-1.7,-0.97,-0.19,0.8,2.14,3.19,3.81,4.14,4.37,4.61,5.07,5.16,5.0,4.95,4.87,4.83,4.87,4.87,4.66,4.82,5.21,5.46,5.67,5.84,5.61,5.4,6.16,7.46,7.66,8.1,8.75,9.17,9.44,9.85,10.3,10.5,10.89,10.76,10.55,10.35,11.09,9.51,4.39,5.13,1.28,-0.07,2.08,2.92,5.52,5.35,4.99,4.46,3.83,3.05,2.26,1.62,0.68,-0.42,-0.83,-0.55,-0.34,-0.46,-0.64,-1.05,-1.93,-3.59,-6.26,-7.42,-7.39,-8.13,-7.7,-7.02,-5.88,-4.35,-4.47,-5.42,-4.8,-8.29,-12.38,-12.22,-11.92,-11.41,-10.43,-9.24,-8.12,-7.19,-6.16,-5.03,-3.53,-1.77,-0.76,-0.67,-0.89,-1.25,-1.61,-1.85,-1.92,-1.89,-1.84,-1.75,-1.68,-1.57,-1.32,-0.98,-0.76,-0.47,-0.27,-0.14,0.01,0.26,0.65,1.17,1.63,1.91,2.0,1.9,1.74,1.53,1.33,1.17,1.07,0.84,0.27,-0.48,-1.03,-1.67,-3.35,-5.57,-7.03,-7.42,-6.81,-5.84,-4.88,-4.14,-3.68,-3.44,-3.59,-3.88,-3.89,-3.32,-2.45,-1.51,-0.55,-0.18,-0.56,-1.14,-1.63,-1.22,-1.13,-1.9,-3.58,-4.2,-3.72,-2.81,-1.58,1.45,3.89,4.18,3.47,2.34,1.57,4.28,5.13,4.11,2.01,0.41,1.03,2.53,4.18,5.97,7.23,8.76,9.92,9.41,8.71,6.75,2.5,0.21,0.69,0.97,0.53,0.23,0.43,-0.44,-4.28,-3.7,-2.22,-1.67,-1.42,-1.29,-1.35,-1.54,-1.58,-1.41,-1.12,-0.7,-0.24,0.16,0.43,1.08,2.05,2.41,2.8,3.03,2.78,3.94,4.96,7.2,7.94,7.62,7.35,6.47,4.78,3.15,1.91,1.75,2.4,2.83,2.69,1.58,0.47,-0.33,-0.82,-0.63,0.32,1.47,2.51,2.82,3.29,3.61,3.29,3.35,3.18,2.95,2.94,3.41,4.16,4.41,3.7,3.16,3.21,3.37,3.46,3.9,4.28,4.34,3.85,3.31,2.35,0.45,-2.89,-4.89,-5.7,-6.24,-6.56,-7.14,-8.07,-9.68,-11.15,-12.08,-12.0,-11.48,-10.59,-9.54,-8.95,-8.57,-8.3,-8.24,-8.91,-9.93,-9.18,-8.5,-7.81,-7.41,-6.95,-5.8,-3.89,-2.28,-0.69,1.26,2.96,4.54,6.09,7.76,9.24,10.68,11.98,12.96,13.88,14.94,15.99,16.67,17.38,18.05,18.35,18.37,16.26,12.23,9.71,7.93,5.74,3.31,1.3,-0.43,-2.21,-3.53,-4.16,-4.4,-4.19,-4.18,-4.52,-4.45,-3.69,-2.63,-1.47,0.38,2.18,3.67,5.19,6.48,7.66,8.86,10.1,11.19,11.55,10.76,8.76,5.61,0.88,-3.86,-7.38,-9.45,-10.27,-10.61,-11.63,-12.73,-12.86,-12.42,-12.07,-11.51,-11.12,-10.93,-10.59,-10.22,-9.98,-9.74,-9.66,-9.68,-9.56,-9.4,-8.89,-8.24,-7.6,-7.13,-6.56,-5.9,-5.19,-4.29,-3.08,-1.83,-0.87,-0.11,1.04,2.07,2.43,3.05,3.68,4.12,4.48,4.84,5.56,6.31,6.12,5.84,5.8,5.69,5.47,5.29,5.24,5.33,5.43,5.51,5.72,5.66,5.32,5.45,6.17,6.92,7.83,8.69,9.09,9.54,10.05,10.55,10.79,10.73,10.71,10.6,10.25,9.92,8.26,1.64,-2.27,2.2,5.94,7.4,7.27,7.02,7.25,7.55,7.79,7.79,7.51,7.06,6.39,5.25,3.62,1.75,0.14,-0.77,-0.89,-0.61,-0.87,-2.33,-4.05,-6.03,-7.29,-7.37,-6.68,-6.49,-6.48,-4.83,-2.46,-0.8,0.23,0.82,1.34,2.24,1.69,-2.55,-6.72,-7.65,-7.28,-5.74,-3.99,-2.72,-1.96,-1.35,-0.83,-0.83,-0.89,-0.81,-0.76,-0.75,-0.84,-0.97,-1.1,-1.27,-1.39,-1.45,-1.48,-1.45,-1.3,-1.07,-0.91,-0.41,0.04,0.35,0.53,0.74,1.0,1.33,1.64,1.83,1.69,1.33,1.18,1.27,1.36,1.4,1.37,0.97,0.28,-1.11,-3.54,-5.6,-6.33,-6.57,-6.63,-6.4,-5.87,-5.12,-4.32,-3.6,-2.82,-2.15,-1.78,-1.2,-0.86,-1.47,-2.05,-1.51,-0.66,-1.01,-1.24,-0.14,0.35,-1.84,-0.91,1.68,1.0,0.24,0.16,0.77,1.34,1.08,2.94,4.31,1.97,-0.61,0.09,3.44,4.13,3.94,3.19,1.82,1.21,0.99,2.4,4.79,7.06,9.65,11.73,11.95,12.47,13.08,5.17,0.26,0.15,-0.32,-0.43,-1.15,-1.31,-1.02,-1.21,-1.61,-1.45,-1.47,-1.71,-1.95,-1.79,-1.56,-1.66,-1.87,-1.58,-1.18,-0.41,-0.1,0.34,1.3,1.64,3.14,3.58,2.66,1.61,-0.71,1.1,5.37,3.72,5.51,7.03,8.17,7.9,6.22,4.47,1.02,2.46,7.76,8.7,7.2,4.53,2.4,1.23,0.38,0.54,1.42,2.17,2.06,1.6,1.78,2.58,2.22,1.27,0.01,0.09,2.03,0.74,3.06,4.0,2.45,2.28,2.27,2.5,2.54,3.7,5.17,6.17,6.18,6.16,5.69,2.52,-3.47,-6.62,-6.2,-7.01,-7.93,-9.46,-11.09,-12.24,-12.67,-12.24,-11.53,-10.48,-9.34,-8.46,-8.08,-7.5,-7.37,-6.9,-7.05,-7.54,-6.91,-6.15,-5.23,-4.23,-3.21,-2.13,-0.86,0.6,2.11,3.38,4.67,6.29,8.07,9.65,10.79,11.64,12.5,13.32,14.15,14.92,15.54,16.04,16.33,16.53,16.46,14.2,11.15,7.16,4.16,2.25,0.86,-0.42,-1.69,-2.72,-3.45,-3.67,-3.9,-4.76,-5.14,-5.1,-4.8,-4.06,-2.67,-1.0,-0.04,1.03,2.03,2.95,3.97,4.86,5.6,6.35,7.22,8.03,8.42,8.18,7.35,5.98,4.19,2.17,0.16,-1.62,-3.39,-4.89,-6.48,-7.89,-8.37,-8.37,-8.29,-7.99,-7.5,-7.13,-7.09,-7.15,-7.13,-6.88,-6.74,-6.82,-7.07,-7.23,-7.2,-6.99,-6.42,-5.53,-4.42,-3.42,-2.66,-2.01,-1.37,-0.64,0.3,1.89,3.0,3.42,3.87,4.29,4.77,5.22,5.36,5.48,5.75,5.82,5.71,5.53,5.36,5.19,5.0,4.92,5.11,5.45,5.5,5.44,5.38,5.23,4.92,6.06,7.8,8.7,8.54,8.61,7.78,7.65,7.58,7.68,7.98,8.35,10.56,10.48,1.62,-5.63,-0.45,3.5,4.32,6.2,6.69,6.81,7.05,7.54,8.28,8.86,9.2,9.28,8.9,8.11,6.83,4.97,3.06,0.85,-1.67,-2.32,-2.54,-4.68,-6.77,-8.0,-8.85,-8.83,-8.51,-8.29,-7.78,-6.12,-4.35,-3.08,-1.97,-1.14,-0.78,-0.28,-0.09,-0.11,-0.39,-0.91,-1.28,-1.33,-1.24,-1.38,-1.58,-1.49,-1.08,-0.64,-0.28,-0.08,0.11,0.02,0.1,-0.19,-0.56,-0.77,-1.14,-1.52,-1.82,-1.91,-1.8,-1.57,-1.32,1.24,1.72,1.84,1.57,1.22,1.14,1.39,1.67,1.83,2.46,2.72,2.66,1.59,0.73,-0.08,-0.68,-0.9,-0.9,-0.98,-1.65,-2.61,-3.36,-3.98,-4.65,-5.06,-5.0,-4.41,-3.46,-2.29,-1.27,-0.55,-0.06,0.33,0.51,0.54,-0.21,-1.56,-1.28,-0.08,0.01,-0.1,0.4,0.86,1.26,1.74,1.81,1.15,2.15,1.89,-0.75,-0.08,-0.39,-0.87,-0.77,-0.35,0.87,3.19,2.86,3.61,3.14,2.62,3.07,1.97,0.91,1.56,2.46,4.51,5.71,9.2,14.23,16.84,16.15,14.56,8.01,3.69,1.33,-0.47,-1.31,-1.71,-1.95,-2.11,-2.15,-1.7,-1.61,-1.58,-0.71,-0.86,-0.39,0.21,0.5,2.36,4.21,5.55,6.61,6.01,6.89,9.43,9.65,11.78,9.47,5.46,7.6,5.73,5.79,8.26,10.42,11.6,13.32,14.77,13.59,13.75,12.48,5.68,2.47,3.33,4.09,3.58,4.56,4.24,2.28,2.59,2.79,2.28,4.22,6.1,6.8,6.7,5.95,4.47,3.18,1.29,1.88,2.64,4.05,5.0,5.17,6.38,7.41,9.13,10.92,12.13,12.28,10.29,12.95,13.09,11.38,11.96,9.27,1.99,-3.4,-6.47,-7.33,-8.1,-9.1,-9.74,-10.19,-9.92,-8.51,-6.83,-5.35,-4.09,-3.3,-3.27,-2.91,-2.42,-2.31,-1.91,-2.0,-2.46,-3.16,-2.94,-1.96,-0.73,0.38,1.23,1.84,2.83,4.85,6.47,6.41,6.72,7.07,8.02,11.14,12.57,13.53,14.1,14.39,14.5,14.41,15.0,14.68,10.88,8.12,4.53,1.15,-0.76,-2.14,-3.05,-3.63,-3.86,-3.92,-4.04,-4.89,-5.58,-5.61,-5.52,-4.82,-3.59,-2.76,-2.12,-1.49,-0.94,0.11,1.14,1.87,2.45,2.91,3.31,3.73,4.02,4.16,4.25,4.19,3.86,3.37,2.75,2.12,1.5,0.8,0.03,-0.79,-1.54,-2.34,-3.22,-3.82,-4.18,-4.49,-4.79,-5.04,-5.31,-5.59,-5.86,-5.98,-5.91,-5.63,-5.26,-4.66,-3.68,-2.75,-2.08,-1.63,-1.31,-0.89,-0.19,0.62,1.53,2.61,3.77,4.82,5.59,6.17,6.59,6.93,7.26,7.46,7.52,7.51,7.31,6.96,6.45,5.97,5.55,5.32,4.93,4.61,4.56,4.44,4.11,3.59,3.31,5.25,7.17,6.41,5.8,5.64,5.72,6.27,7.0,7.31,6.74,8.33,5.63,2.21,0.7,0.49,1.25,2.01,3.54,4.61,5.94,6.04,6.73,7.57,8.24,8.84,9.33,9.93,10.44,10.9,11.17,10.87,10.11,6.92,1.29,-1.72,-2.94,-5.28,-7.95,-9.3,-9.6,-9.29,-9.05,-8.73,-8.06,-7.16,-6.25,-5.35,-4.26,-3.09,-2.17,-1.44,-0.89,-0.61,-0.65,-0.69,-0.79,-0.93,-1.07,-1.09,-1.03,-0.82,-0.39,0.49,1.8,2.82,3.04,3.12,3.41,3.56,3.78,3.32,2.92,2.28,1.45,0.16,-0.21,0.16,0.58,0.81,0.44,0.25,0.29,0.47,0.34,0.07,0.11,-0.02,-0.61,-0.42,0.77,1.91,2.63,2.83,3.02,3.23,3.36,3.39,3.27,2.95,2.29,1.71,1.49,1.39,1.32,1.13,0.42,-0.79,-1.7,-1.37,-1.04,-1.63,0.99,4.67,4.87,1.65,-1.03,-2.04,-1.7,-0.54,-0.77,-1.55,-1.82,1.99,4.93,7.98,9.58,7.16,6.12,1.5,0.65,1.38,3.11,5.42,8.16,7.52,6.37,6.46,7.44,9.97,9.87,8.2,9.1,9.72,9.42,10.88,13.61,16.44,19.66,21.06,20.03,17.02,13.82,10.95,5.24,2.79,0.35,-2.11,-4.19,-3.64,-1.32,0.49,1.89,2.59,2.68,2.75,3.28,3.38,3.55,3.91,3.62,3.77,4.47,5.67,6.12,5.63,6.89,10.54,11.16,10.26,7.7,5.91,6.58,7.57,8.71,9.94,10.7,11.23,12.35,14.02,14.64,15.23,14.26,12.67,11.41,9.83,8.01,7.67,7.02,5.65,4.86,4.17,3.96,3.59,4.08,5.68,6.6,6.61,6.03,5.97,4.69,3.21,2.75,3.54,4.39,4.57,4.82,5.64,6.41,7.3,8.02,8.59,8.0,5.72,6.46,10.69,9.45,7.7,5.77,5.6,6.32,5.28,2.49,3.18,4.56,2.04,0.45,0.69,0.91,0.56,0.13,-0.17,-0.44,-0.63,-0.89,-1.29,-1.73,-1.99,-1.96,-1.84,-1.59,-1.21,-0.57,0.42,1.26,2.09,2.57,3.15,4.09,4.27,5.94,6.81,7.11,7.75,8.56,9.26,9.82,10.08,10.24,10.56,10.85,9.96,5.69,3.62,1.92,-0.97,-2.81,-4.48,-4.79,-4.43,-4.39,-4.56,-4.76,-5.19,-5.21,-4.12,-3.47,-3.42,-3.72,-3.8,-3.72,-2.93,-1.87,-1.16,-0.5,0.12,0.54,0.89,1.09,1.2,1.23,1.16,0.91,0.46,0.04,-0.24,-0.4,-0.46,-0.46,-0.52,-0.69,-1.03,-1.48,-2.0,-2.59,-3.22,-3.76,-4.11,-4.41,-4.62,-4.73,-4.68,-4.6,-4.47,-4.18,-3.74,-3.1,-2.36,-1.57,-0.8,-0.1,0.47,0.98,1.58,2.26,2.93,3.62,4.26,4.79,5.32,5.84,6.38,6.88,7.28,7.64,7.93,8.13,8.3,8.29,8.2,8.31,7.44,5.44,4.88,4.42,3.9,3.35,2.94,2.77,2.82,3.11,3.35,3.42,3.54,3.69,4.54,5.91,6.93,7.52,7.88,6.78,3.25,-1.89,-4.37,-0.15,0.12,2.74,3.41,3.94,4.84,5.94,6.48,7.47,8.14,8.45,8.91,9.45,10.07,10.62,11.39,12.44,12.72,12.61,11.32,6.36,0.38,-3.47,-5.35,-6.37,-7.37,-8.15,-8.74,-8.89,-8.66,-7.87,-7.17,-6.24,-5.42,-4.49,-3.79,-3.16,-2.47,-1.96,-1.71,-1.36,-0.89,-0.93,-1.03,-1.07,-0.94,-0.53,0.38,0.97,0.63,0.53,0.8,1.0,0.98,0.83,0.97,1.06,0.99,0.88,0.72,0.61,0.52,0.55,0.69,0.7,0.61,1.04,1.31,-0.47,-2.18,-1.91,-1.06,-0.39,0.13,0.8,1.52,2.01,2.27,2.54,2.86,3.06,3.08,3.24,3.16,2.85,2.42,1.89,1.59,1.56,2.21,2.75,1.05,-1.62,-2.8,-3.41,-4.27,-2.94,-1.92,-3.16,0.19,4.27,4.96,4.53,4.75,4.9,3.03,1.05,1.55,1.7,2.19,3.3,4.15,6.97,9.44,9.66,5.76,2.89,1.59,1.55,2.92,5.52,6.56,6.48,7.12,8.46,9.91,10.19,9.07,9.04,9.41,9.14,10.25,11.22,10.9,8.6,7.02,11.74,12.87,11.73,10.27,6.55,2.99,2.56,3.02,2.24,0.17,-0.83,-1.01,0.27,1.49,1.78,1.61,1.58,2.21,2.44,2.66,2.9,2.73,2.81,3.54,4.38,5.26,6.4,7.09,7.27,8.44,7.89,6.3,5.76,5.71,6.46,7.51,9.1,9.59,9.57,10.02,10.89,11.86,12.39,11.97,10.97,9.88,8.96,7.99,6.91,5.98,5.1,4.24,3.84,3.77,3.76,4.06,4.63,4.68,4.69,4.73,4.21,3.84,3.84,3.34,3.65,4.04,3.73,3.81,4.48,5.77,7.01,8.25,8.59,7.01,4.23,2.25,2.08,2.91,2.55,1.34,0.8,1.12,1.02,0.23,-0.44,0.36,2.2,2.55,3.97,4.16,3.54,2.78,2.08,1.25,0.19,-0.8,-1.53,-1.77,-1.82,-1.61,-1.12,-0.29,0.71,1.46,2.33,3.23,4.06,4.78,5.71,6.72,7.5,8.24,7.91,7.91,8.22,8.71,9.33,9.3,9.19,9.29,9.35,8.01,3.63,1.44,0.38,-1.61,-3.32,-4.79,-5.55,-5.55,-5.4,-5.12,-4.95,-4.63,-4.13,-3.82,-3.68,-3.48,-3.48,-3.18,-1.93,-1.22,-0.83,-0.62,-0.73,-1.16,-0.99,-0.7,-0.6,-0.56,-0.27,0.04,-0.37,-1.11,-1.3,-1.54,-1.76,-1.93,-2.04,-2.12,-2.17,-2.2,-2.27,-2.41,-2.61,-2.89,-3.21,-3.53,-3.79,-3.95,-3.94,-3.78,-3.44,-2.96,-2.37,-1.75,-1.14,-0.54,0.01,0.52,1.06,1.64,2.31,3.04,3.76,4.4,5.02,5.32,5.91,6.4,6.88,7.35,7.81,8.26,8.68,8.06,7.14,6.21,5.41,4.43,4.49,4.84,4.72,4.3,3.97,3.64,3.42,3.21,2.99,2.82,2.54,2.66,2.89,2.92,3.08,4.07,4.53,6.35,9.01,7.36,3.69,2.91,0.1,-3.34,1.4,2.36,-1.9,0.38,6.27,5.8,5.78,6.8,7.42,8.13,8.72,8.75,8.99,9.45,10.06,10.47,10.82,11.34,11.06,9.06,6.41,3.82,0.93,-1.97,-3.98,-5.28,-6.6,-7.48,-7.91,-7.86,-7.5,-6.74,-6.15,-5.75,-5.13,-4.5,-3.79,-3.11,-2.63,-2.18,-1.64,-1.13,-0.76,-0.58,-0.47,-0.3,-0.2,-0.22,-0.18,-0.02,0.16,0.24,0.19,0.15,-0.01,-0.3,-0.7,-0.98,-1.04,-1.15,-1.29,-1.32,-1.32,-1.23,-0.89,-0.06,-1.44,-0.63,-0.25,-0.16,0.31,1.09,1.78,1.85,2.12,2.4,2.84,3.1,3.03,3.15,3.1,2.35,3.02,3.71,3.91,4.79,3.71,2.9,3.94,4.14,4.7,4.64,3.45,1.91,0.55,0.14,1.05,2.52,3.64,1.31,0.87,5.26,8.07,11.76,12.14,3.31,-1.35,-0.81,-0.44,-0.46,-0.44,0.61,2.24,3.97,4.83,5.23,5.22,4.91,4.25,3.8,4.0,5.14,6.1,6.95,7.9,8.85,9.52,10.05,11.12,11.0,8.78,8.21,8.18,5.45,0.8,3.73,9.59,10.87,10.34,4.5,1.32,3.48,1.22,-0.95,-1.31,-1.08,-0.75,-1.06,-1.36,-1.07,-0.07,0.54,0.5,0.57,0.62,0.56,0.57,0.67,1.17,1.72,2.31,3.11,3.65,4.24,5.3,6.02,6.05,6.01,5.83,5.71,6.45,7.53,8.82,9.96,9.82,9.78,9.97,10.05,10.33,10.46,9.95,8.98,8.3,7.83,7.1,6.1,5.17,4.43,3.66,3.05,2.87,2.99,3.46,4.12,3.8,2.49,2.38,2.88,3.25,4.04,4.49,4.36,3.77,3.83,4.74,5.87,6.47,6.76,6.65,6.1,5.55,4.68,3.26,0.99,-0.89,-1.95,-2.46,-2.46,-2.73,-4.19,-5.53,-4.69,-3.83,-3.28,-2.4,0.78,2.13,-0.04,0.52,2.55,2.59,1.3,0.78,0.2,-0.77,-0.73,-0.19,0.89,2.01,2.97,3.63,4.24,4.91,5.64,6.38,7.04,7.88,8.52,8.63,8.72,9.02,9.05,8.98,8.88,8.86,8.85,8.49,6.49,2.09,-0.54,-1.21,-2.31,-4.12,-5.98,-6.75,-6.61,-6.52,-6.21,-5.76,-5.44,-4.95,-4.66,-4.49,-3.98,-3.39,-2.76,-2.41,-1.6,-0.89,-0.49,-0.36,-0.76,-1.06,-0.95,-0.2,0.55,0.26,-0.27,-0.86,-2.09,-2.15,-1.41,-2.5,-2.59,-2.23,-2.52,-2.32,-2.18,-2.03,-1.91,-1.9,-2.0,-2.06,-1.86,-1.66,-1.58,-1.4,-1.14,-0.65,0.0,0.57,1.2,1.85,2.49,2.68,2.18,1.96,2.3,3.16,3.74,3.97,3.96,3.89,3.76,3.91,3.94,4.0,3.86,3.93,4.23,4.7,5.31,5.18,4.9,4.91,4.68,4.5,4.38,4.24,3.95,3.45,3.05,2.61,2.35,2.37,2.35,2.69,2.78,2.53,2.64,1.76,1.95,1.21,-1.42,-4.28,-5.68,-2.26,1.58,0.03,1.82,2.28,1.63,2.7,-0.43,1.3,5.3,6.69,7.0,7.14,7.3,7.5,7.67,7.91,8.11,8.26,8.56,8.89,9.15,9.08,8.83,8.23,6.59,4.12,1.5,-0.97,-2.53,-3.55,-4.8,-5.95,-6.48,-6.52,-6.62,-6.35,-5.92,-5.22,-4.6,-4.03,-3.36,-2.77,-2.28,-1.77,-1.39,-1.15,-1.1,-1.11,-1.08,-1.16,-1.24,-1.1,-0.7,-0.16,0.28,0.8,0.92,0.48,0.04,-0.25,-0.8,-1.73,-2.63,-3.35,-3.43,-3.17,-3.33,-3.27,-2.69,-2.1,-2.91,-1.33,1.95,4.45,5.2,6.25,6.26,4.59,4.21,5.07,5.83,6.13,6.48,7.79,6.75,5.64,5.57,5.74,6.19,6.03,4.75,3.64,4.02,4.91,5.95,5.61,4.69,4.36,3.58,2.85,2.84,2.53,2.43,2.03,1.83,3.67,5.89,7.28,7.38,6.67,4.98,3.91,3.5,3.27,2.89,2.57,2.53,3.04,3.39,3.77,4.57,5.13,5.28,5.38,5.7,5.9,5.9,5.97,5.74,5.47,5.31,5.13,6.39,9.09,10.49,9.86,8.82,8.85,8.15,7.46,6.94,2.54,-3.43,-3.66,-3.65,-3.65,-2.89,-3.02,-3.51,-3.61,-3.1,-2.52,-2.34,-2.24,-1.81,-1.18,-0.77,-0.65,-0.71,-0.8,-0.78,-0.86,-0.56,0.23,1.14,1.98,2.62,3.1,3.89,4.42,4.48,4.5,4.63,4.8,5.28,6.02,6.52,6.87,7.04,6.82,6.63,6.83,7.29,7.67,7.6,7.29,6.94,6.41,5.59,4.85,4.07,3.29,2.56,1.94,1.55,1.48,1.87,2.49,2.84,2.69,2.15,1.94,2.27,3.1,3.78,4.2,4.42,4.71,5.17,5.46,6.04,6.44,5.96,5.59,5.78,5.71,5.43,4.71,3.3,1.91,0.5,-1.24,-2.4,-2.97,-3.69,-4.26,-4.0,-3.45,-1.69,1.88,4.7,1.59,-1.93,-1.22,0.91,1.93,-0.53,-2.39,-1.57,0.14,1.57,2.18,2.81,3.2,3.91,4.95,5.81,6.57,7.25,7.84,8.46,8.91,9.2,9.35,9.27,9.2,9.0,9.02,9.18,8.83,6.24,1.32,-1.7,-2.28,-3.92,-5.26,-5.92,-6.75,-7.43,-7.33,-6.88,-6.4,-5.82,-5.32,-5.03,-4.71,-3.59,-2.38,-2.23,-2.1,-1.67,-1.36,-1.13,-0.7,-0.28,0.01,0.28,0.49,0.6,0.63,0.53,0.33,0.41,0.59,0.61,0.68,0.49,0.37,0.54,0.42,0.42,0.7,0.99,1.17,1.32,1.14,0.71,0.42,0.4,0.47,0.42,0.15,-0.15,-0.27,-0.3,-0.16,-0.09,-0.1,-0.1,0.04,0.36,0.81,1.21,1.59,2.32,3.21,3.64,4.23,5.0,5.02,4.63,4.21,4.01,4.05,4.3,4.47,4.65,4.78,4.67,4.52,4.44,4.06,3.58,3.23,2.93,2.67,2.52,2.48,2.53,2.56,2.26,2.27,2.0,1.44,0.88,0.13,-1.99,-3.44,-2.87,-4.49,-2.52,-1.51,-3.03,-2.53,-2.27,1.36,0.33,-1.14,1.99,6.44,7.25,6.94,6.73,6.81,6.66,6.67,6.85,6.95,6.92,6.68,6.46,6.4,6.47,6.47,6.41,5.91,5.05,3.81,2.09,-0.02,-2.09,-3.43,-4.3,-5.03,-5.49,-5.48,-5.35,-4.91,-4.18,-3.59,-3.04,-2.46,-2.06,-1.78,-1.48,-1.25,-1.02,-0.86,-1.09,-1.43,-1.42,-0.99,-0.3,0.41,0.79,1.38,1.16,-1.38,-3.4,-2.38,-1.98,-1.53,1.16,1.69,1.41,1.01,0.48,0.7,-0.04,2.82,4.29,4.7,3.63,4.16,4.79,6.67,7.19,6.32,5.04,5.33,3.55,3.32,7.31,9.26,7.91,7.24,8.87,8.2,7.08,6.97,5.17,2.91,3.16,4.79,4.97,7.65,13.48,11.46,8.71,6.14,5.13,5.3,4.89,4.73,5.37,6.27,7.15,7.65,7.81,7.62,7.15,6.71,6.4,5.92,5.26,4.58,4.16,4.07,4.19,4.36,4.74,5.37,5.73,5.74,5.62,5.63,5.95,6.63,6.67,6.2,6.14,6.59,7.57,9.29,10.41,10.03,9.81,11.3,8.24,1.98,-1.72,-3.35,-3.19,-3.13,-2.88,-2.72,-3.11,-3.46,-3.98,-4.52,-4.62,-4.42,-3.96,-3.71,-3.68,-3.63,-3.39,-2.98,-2.52,-2.19,-1.82,-1.49,-1.36,-1.35,-0.99,-0.37,0.15,0.75,1.51,2.23,2.63,2.61,2.56,2.92,3.56,4.19,4.65,5.05,5.23,5.35,5.38,5.42,5.48,5.53,5.52,5.38,5.31,5.16,4.83,4.46,3.9,3.13,2.12,1.09,0.43,-0.1,-0.57,-0.78,-0.81,-0.73,-0.69,-0.46,0.4,1.49,2.46,3.22,3.9,4.32,4.42,4.51,4.94,5.38,5.44,5.17,4.86,4.75,4.74,4.67,4.35,3.67,2.84,1.91,1.15,0.41,-0.57,-1.62,-2.46,-2.32,-0.69,1.03,2.21,5.1,3.19,0.98,3.1,2.22,-1.12,-2.4,-0.23,-0.24,-0.3,0.87,1.59,2.93,3.86,4.49,4.83,5.91,6.86,7.01,7.4,8.32,8.52,8.38,8.74,8.94,8.99,8.97,9.04,8.96,7.84,5.24,1.21,-2.42,-4.37,-5.51,-6.46,-7.12,-7.35,-7.04,-6.61,-6.38,-6.4,-6.57,-6.84,-6.3,-5.63,-5.16,-3.88,-3.08,-2.95,-2.92,-2.63,-1.97,-1.19,-0.98,-0.97,-0.9,-0.68,-0.49,-0.34,-0.3,-0.34,-0.37,-0.26,0.1,0.48,0.74,0.9,1.18,1.45,1.59,1.42,1.04,0.53,0.0,-0.41,-0.57,-0.55,-0.48,-0.42,-0.4,-0.38,-0.37,-0.32,-0.16,0.09,0.41,0.51,0.8,1.24,1.97,2.99,3.72,4.05,4.25,4.71,5.54,6.53,6.98,6.97,6.21,4.94,4.18,4.6,5.41,5.83,5.53,4.74,4.05,3.85,3.57,3.35,2.97,2.49,1.96,1.63,1.42,1.24,1.51,2.0,1.32,0.77,-0.17,-1.76,-1.82,-3.86,-6.94,-8.68,-8.6,-6.41,-1.05,-0.15,-1.5,-2.12,-0.64,-1.48,-1.51,0.83,3.79,5.66,6.22,5.66,5.66,5.76,5.55,5.27,5.11,4.98,4.83,4.63,4.49,4.4,4.29,4.01,3.66,3.29,2.86,2.26,1.48,0.63,-0.4,-1.4,-2.22,-2.87,-3.21,-3.2,-3.09,-3.02,-2.88,-2.8,-2.51,-2.32,-2.07,-1.92,-1.88,-1.69,-1.65,-1.44,-1.55,-1.44,-0.92,-0.3,0.05,0.9,0.2,-2.47,-4.22,-5.74,-5.48,-2.89,-0.6,0.27,0.18,0.71,3.81,5.51,4.49,3.11,1.22,-3.29,-3.31,-2.92,-2.67,-2.36,-1.67,0.15,1.96,2.72,2.87,2.98,3.02,3.66,4.72,6.07,6.81,6.98,7.37,7.99,8.48,9.0,8.99,8.13,6.96,6.46,8.14,10.51,11.77,11.75,9.34,7.14,7.13,7.26,6.39,5.31,4.73,5.22,6.25,6.97,7.13,7.26,7.32,7.15,6.97,6.79,6.58,6.39,6.13,5.96,5.91,5.89,5.91,5.88,5.84,5.85,5.98,6.24,6.24,6.48,7.77,8.82,9.13,9.27,8.51,8.5,11.3,8.64,-0.04,-0.62,-0.71,-1.99,-2.99,-3.56,-3.47,-3.88,-4.06,-3.46,-3.41,-3.75,-3.95,-4.26,-4.59,-4.8,-4.87,-4.91,-4.85,-4.69,-4.52,-4.27,-4.05,-3.99,-3.9,-3.67,-3.31,-2.9,-2.4,-1.82,-1.12,-0.4,0.36,1.15,1.11,0.03,-0.04,1.53,3.05,3.82,4.06,4.28,4.55,4.66,4.62,4.56,4.46,4.46,4.54,4.55,4.3,4.03,3.74,3.36,2.9,2.37,1.83,1.5,1.4,1.39,1.24,0.92,0.92,1.42,2.08,2.42,2.48,2.58,2.97,3.44,3.75,3.69,3.46,3.48,3.54,3.48,3.36,3.21,3.07,2.9,2.69,2.46,2.19,1.7,1.11,0.45,-0.41,-1.41,-2.21,-2.58,-2.7,-2.15,-0.23,2.32,2.54,-0.51,-4.79,-2.61,-1.09,-4.25,-2.36,-1.93,-3.33,-0.67,1.24,1.66,2.5,3.45,4.15,4.85,5.47,6.01,6.72,7.5,8.01,8.22,8.37,8.25,7.92,7.83,7.79,7.74,7.69,7.5,6.96,5.57,3.23,0.63,-1.46,-2.97,-4.22,-5.15,-5.62,-5.73,-5.51,-5.03,-4.53,-4.18,-3.84,-3.45,-3.14,-3.0,-2.72,-2.39,-2.0,-1.69,-1.35,-1.25,-1.29,-1.24,-1.11,-1.09,-1.13,-1.17,-1.08,-0.8,-0.42,-0.1,0.08,0.09,-0.03,-0.13,-0.2,-0.02,0.69,1.54,-0.6,-2.64,-2.07,-1.61,-1.41,-1.01,-0.77,-0.81,-0.86,-0.85,-0.78,-0.47,0.19,1.22,2.17,2.64,2.55,2.63,3.47,4.02,3.96,4.03,4.06,4.24,5.06,4.38,4.15,5.0,4.21,2.29,1.38,2.09,2.39,0.47,-1.47,-0.75,0.94,0.9,0.76,0.69,1.13,1.06,0.83,2.04,2.99,2.82,2.26,0.0,0.52,4.38,5.31,3.32,2.11,-0.99,-4.02,-3.67,-3.17,-3.28,-4.83,-6.29,-6.22,-5.05,-1.99,0.48,-0.77,0.41,5.34,8.4,7.25,5.65,4.93,4.74,4.6,4.46,4.22,4.04,3.77,3.39,2.98,2.59,2.16,1.71,1.32,0.94,0.5,-0.01,-0.59,-1.15,-1.62,-1.98,-2.2,-2.27,-2.4,-2.61,-2.8,-3.05,-3.13,-3.21,-3.11,-2.94,-2.79,-2.57,-2.48,-2.21,-2.33,-2.81,-2.92,-2.25,-1.75,-2.13,-2.54,-0.31,1.28,0.26,-1.74,-4.41,-5.41,-4.83,-4.83,-4.4,-1.95,0.84,1.03,3.02,7.28,7.31,2.93,0.48,-1.35,-2.29,-2.81,-2.87,-2.55,-2.08,-1.57,-0.95,-0.28,0.35,0.88,1.41,2.13,2.92,3.49,3.76,3.98,4.36,4.85,5.27,5.56,5.71,5.76,5.78,6.28,7.12,7.8,8.4,8.44,7.63,6.99,6.83,6.48,5.87,5.56,5.77,6.08,6.3,6.53,6.77,7.08,7.18,7.11,7.18,7.31,7.41,7.53,7.61,7.62,7.57,7.45,7.2,7.11,7.24,7.27,7.16,7.21,7.73,8.95,10.68,12.37,13.29,14.25,15.87,13.58,7.07,2.25,-1.15,-3.14,-3.93,-3.83,-3.5,-3.27,-3.61,-4.24,-4.29,-4.3,-4.46,-4.63,-4.72,-4.96,-5.02,-4.92,-4.91,-5.06,-5.14,-5.1,-4.99,-4.8,-4.58,-4.4,-4.04,-3.51,-2.88,-2.27,-1.77,-1.25,-0.66,-0.17,0.37,0.8,0.0,-1.33,-0.55,1.78,3.28,3.72,3.84,3.89,3.94,3.83,3.66,3.51,3.33,3.19,3.08,2.97,2.9,2.82,2.68,2.55,2.42,2.27,2.07,1.87,1.59,1.24,1.07,1.07,0.98,0.96,1.01,1.22,1.66,1.76,1.71,1.89,2.07,2.28,2.15,1.85,1.72,1.61,1.42,1.11,0.75,0.33,-0.22,-0.76,-1.22,-1.58,-1.84,-2.13,-2.5,-3.05,-3.53,-3.38,-2.71,-3.9,-6.03,-7.47,-3.64,1.59,2.93,0.34,0.65,0.12,-0.05,-0.84,-0.57,0.45,1.5,2.2,2.67,3.27,3.88,4.41,4.72,5.08,5.66,6.04,6.35,6.61,6.9,7.06,6.92,6.67,6.73,6.93,6.76,6.14,5.41,4.71,3.86,2.78,1.71,0.73,-0.29,-1.29,-2.11,-2.61,-2.67,-2.44,-2.27,-2.19,-2.02,-1.74,-1.37,-1.27,-1.44,-1.63,-1.52,-1.56,-1.62,-1.7,-1.75,-1.73,-1.51,-0.99,-0.35,0.27,0.63,0.43,-0.05,-0.24,-0.11,-0.45,-1.16,-1.83,-2.52,-2.37,-1.7,0.04,2.6,3.71,3.79,4.23,4.76,3.98,3.36,3.28,2.38,0.97,1.46,3.53,7.21,7.39,3.03,-1.14,0.12,3.58,6.08,5.54,4.41,3.5,1.98,1.11,3.09,4.43,5.17,6.38,7.59,7.33,5.39,3.59,4.79,6.76,7.61,7.89,8.86,10.4,11.92,12.6,12.73,13.58,13.61,11.24,9.54,10.27,12.7,14.58,16.47,16.96,15.53,10.44,5.06,5.15,4.9,1.47,-0.7,-0.73,0.01,1.15,0.69,0.66,0.93,0.24,3.09,8.4,8.83,7.7,7.04,6.56,5.93,5.22,4.73,4.42,4.09,3.82,3.14,2.27,1.62,1.09,0.55,-0.05,-0.77,-1.53,-2.26,-2.86,-3.24,-3.48,-3.58,-3.88,-3.89,-4.0,-4.01,-3.98,-4.01,-3.92,-3.63,-3.57,-3.91,-4.25,-4.37,-4.07,-4.05,-3.98,-3.32,-2.81,-2.17,-0.69,0.99,0.68,-0.95,-2.14,-2.9,-3.71,-3.93,-3.69,-3.03,-1.65,0.06,0.97,0.71,0.56,1.86,3.28,3.9,-3.44,-3.22,-3.16,-3.41,-3.66,-3.7,-3.74,-3.7,-3.5,-3.16,-2.87,-2.62,-2.27,-1.86,-1.36,-0.81,-0.21,0.41,0.96,1.44,1.82,2.11,2.43,2.92,3.53,4.17,4.7,5.13,5.52,5.96,6.37,6.48,6.28,5.99,5.78,5.54,5.3,5.29,5.49,5.69,5.88,6.03,6.2,6.46,6.8,7.17,7.39,7.49,7.64,7.68,7.78,8.33,8.65,8.85,9.63,10.55,10.96,11.18,11.84,12.58,12.59,12.28,12.34,13.02,14.05,14.38,13.04,10.27,7.23,4.42,2.16,0.68,-0.46,-1.51,-2.58,-3.63,-4.17,-4.55,-4.68,-4.74,-4.9,-5.03,-5.17,-5.37,-5.44,-5.39,-5.36,-5.26,-5.14,-5.03,-4.94,-4.8,-4.43,-3.87,-3.24,-2.69,-2.29,-1.97,-1.61,-1.17,-0.67,-0.11,0.27,0.3,0.5,1.55,2.89,3.62,3.88,4.02,4.07,4.0,3.86,3.67,3.42,3.14,2.87,2.63,2.4,2.18,1.99,1.83,1.75,1.68,1.6,1.59,1.58,1.48,1.35,1.23,1.08,0.96,0.82,0.43,0.1,0.22,0.6,0.67,0.31,0.05,0.1,0.35,0.44,0.23,-0.1,-0.39,-0.58,-0.72,-0.74,-0.73,-0.71,-0.54,-0.33,-0.16,0.23,0.58,0.39,-0.08,-0.17,-0.7,-2.06,-3.72,-3.78,0.61,3.45,2.25,-0.36,-3.22,-5.0,-5.1,-4.31,-3.34,-2.21,-0.96,0.03,0.68,1.18,1.68,2.16,2.42,2.89,3.51,4.13,4.61,5.1,5.53,5.91,6.33,6.66,6.79,6.66,6.42,6.28,6.14,5.87,5.43,4.85,4.26,3.64,2.99,2.39,1.84,1.25,0.6,0.05,-0.41,-0.81,-0.99,-1.1,-1.16,-1.29,-1.29,-1.4,-1.55,-1.47,-1.14,-1.06,-0.77,-0.07,0.25,0.4,0.67,0.83,0.73,2.0,2.56,0.72,2.05,6.3,7.66,4.81,1.93,2.29,4.8,6.03,7.05,7.88,8.46,9.25,9.81,10.41,11.42,12.1,10.87,7.99,5.39,7.21,10.12,4.92,0.25,1.57,5.3,6.75,5.27,3.51,2.62,2.47,2.01,0.76,0.12,-0.88,-2.81,-2.66,-0.91,1.14,2.55,2.41,1.4,0.72,0.37,0.14,0.21,0.4,1.16,2.61,3.45,3.24,2.62,1.42,0.53,1.26,2.21,1.18,-1.27,-2.37,-1.28,-0.08,0.06,-0.12,-0.13,-0.09,0.05,-0.49,-1.05,0.18,0.52,0.28,1.7,3.51,5.12,5.89,7.27,7.44,7.39,7.38,7.43,7.3,6.72,6.05,5.58,5.02,4.42,3.77,2.91,1.95,0.81,-0.49,-1.65,-2.48,-3.14,-3.84,-4.33,-4.73,-4.73,-4.76,-4.81,-4.65,-4.53,-4.08,-3.98,-4.33,-4.55,-4.39,-4.38,-4.22,-3.93,-3.44,-3.4,-3.72,-3.85,-3.48,-3.13,-4.56,-6.77,-7.73,-7.64,-7.04,-5.71,-4.5,-4.66,-5.29,-5.08,-4.07,-3.23,-3.26,-3.67,-3.78,-3.78,-3.84,-3.72,-4.87,-4.99,-5.24,-5.33,-5.31,-5.29,-5.21,-5.05,-4.96,-4.94,-4.8,-4.53,-4.26,-4.01,-3.78,-3.55,-3.28,-2.95,-2.61,-2.27,-1.85,-1.37,-0.79,-0.09,0.71,1.56,2.39,3.11,3.63,3.99,4.27,4.54,4.79,4.97,5.09,5.2,5.27,5.36,5.47,5.61,5.85,6.15,6.4,6.58,6.74,6.94,7.15,7.39,7.63,7.91,8.24,8.52,8.68,8.74,9.15,9.85,10.32,10.65,11.1,11.81,12.4,12.33,11.89,11.35,10.76,10.24,9.84,9.64,9.23,8.17,6.54,4.63,2.75,1.1,-0.44,-1.84,-2.9,-3.68,-4.17,-4.36,-4.46,-4.62,-4.71,-4.79,-4.89,-4.97,-4.96,-4.88,-4.83,-4.78,-4.71,-4.58,-4.25,-3.77,-3.03,-2.15,-1.47,-1.16,-1.04,-0.96,-0.8,-0.38,0.41,1.47,2.41,3.0,3.35,3.62,3.86,3.99,4.03,4.0,3.93,3.81,3.65,3.46,3.28,3.04,2.74,2.35,1.92,1.54,1.22,0.98,0.84,0.79,0.87,1.07,1.38,1.62,1.55,1.24,0.9,0.57,0.17,-0.24,-0.31,-0.18,-0.15,-0.27,-0.47,-0.83,-0.97,-0.85,-0.73,-0.67,-0.67,-0.68,-0.55,-0.24,0.28,0.89,1.51,2.43,3.8,4.72,5.13,6.25,7.19,7.67,7.32,4.28,1.3,0.67,1.42,2.01,1.11,-0.23,-1.94,-3.37,-3.82,-3.22,-2.77,-2.36,-1.8,-1.15,-0.51,0.05,0.57,1.09,1.5,1.85,2.29,2.86,3.5,4.08,4.57,4.97,5.28,5.54,5.78,5.93,6.01,5.97,5.82,5.63,5.31,4.76,3.92,2.98,2.18,1.57,1.06,0.67,0.45,0.31,0.11,-0.11,-0.3,-0.51,-0.96,-1.1,-0.77,-1.1,-0.75,-0.15,-0.29,1.03,2.91,2.44,1.05,1.3,2.2,2.49,2.6,3.15,2.89,1.87,2.83,4.98,4.7,4.53,5.49,7.01,8.17,7.44,6.95,7.11,6.6,6.57,6.71,6.93,6.76,5.06,3.28,5.3,9.2,11.26,10.44,9.8,12.42,14.16,14.34,13.89,12.51,11.18,11.27,12.56,13.96,14.14,12.92,11.01,8.98,7.63,6.78,5.9,5.1,4.87,4.67,3.87,2.89,2.15,1.48,1.42,2.55,3.51,3.55,2.81,2.27,2.67,2.72,1.15,-1.38,-3.94,-4.97,-4.75,-3.94,-3.24,-3.42,-3.62,-3.69,-3.86,-3.31,-0.07,3.22,3.95,4.07,4.24,4.13,4.09,4.24,4.44,4.74,5.25,5.91,6.61,8.09,8.27,7.75,7.57,7.01,6.22,5.3,4.04,2.57,1.0,-0.52,-1.88,-2.89,-3.56,-4.02,-4.53,-5.03,-5.37,-5.44,-5.45,-5.71,-5.78,-6.06,-6.53,-7.29,-7.72,-7.61,-6.94,-5.8,-5.31,-4.91,-4.59,-4.65,-5.37,-6.55,-7.28,-7.26,-6.72,-5.58,-3.94,-3.06,-3.19,-3.82,-4.19,-3.87,-3.43,-3.45,-3.79,-4.08,-4.3,-4.52,-4.71,-4.81,-4.87,-4.9,-4.89,-5.1,-5.48,-5.81,-6.01,-6.08,-6.02,-5.85,-5.79,-5.81,-5.74,-5.49,-5.13,-4.87,-4.75,-4.62,-4.53,-4.39,-4.09,-3.71,-3.31,-2.76,-1.94,-0.94,-0.05,0.62,1.16,1.67,2.08,2.39,2.67,3.03,3.43,3.81,4.17,4.49,4.76,5.03,5.27,5.47,5.65,5.82,5.96,6.12,6.36,6.59,6.72,6.92,7.21,7.44,7.46,7.49,7.7,8.1,8.45,8.7,8.94,8.98,8.81,8.73,8.83,8.88,8.71,8.46,8.35,8.4,8.58,8.86,9.14,9.17,8.65,7.76,6.99,6.18,4.85,3.23,1.65,0.11,-1.16,-1.99,-2.52,-2.89,-3.16,-3.36,-3.52,-3.68,-3.81,-3.93,-3.94,-3.88,-3.8,-3.62,-3.28,-2.82,-2.32,-1.88,-1.47,-0.91,-0.11,0.87,1.8,2.45,2.8,3.01,3.25,3.47,3.66,3.76,3.83,3.88,3.86,3.78,3.66,3.52,3.35,3.14,2.89,2.64,2.44,2.19,1.89,1.57,1.26,0.99,0.82,0.84,1.09,1.25,1.18,1.13,1.08,0.94,0.78,0.64,0.39,0.07,-0.18,-0.42,-0.65,-0.78,-0.86,-1.05,-1.39,-1.7,-1.87,-1.89,-1.79,-1.64,-1.42,-1.11,-0.64,0.0,0.79,1.8,3.14,4.48,5.55,6.55,6.01,2.7,0.25,0.63,1.7,1.48,0.3,-0.76,-0.93,-1.4,-1.93,-2.69,-3.15,-3.35,-3.35,-2.88,-2.07,-1.39,-0.76,-0.3,0.09,0.46,0.85,1.23,1.58,1.87,2.17,2.63,3.03,3.48,3.82,4.02,4.18,4.38,4.55,4.68,4.69,4.65,4.7,4.7,4.25,2.93,0.82,-0.74,-0.01,2.13,3.71,3.46,2.4,1.82,1.51,1.1,0.99,1.25,1.0,0.12,-1.15,-2.54,-4.53,-5.0,-5.17,-4.79,-4.53,-4.48,-4.47,-4.42,-4.03,-3.24,-2.48,-2.24,-2.48,-2.66,-2.51,-1.86,-0.87,-0.99,-0.72,0.13,1.17,2.26,3.22,3.72,3.13,1.99,3.16,5.51,6.67,6.81,6.24,5.82,5.82,6.24,6.92,7.7,8.09,8.0,7.87,7.76,7.58,7.49,7.88,8.78,9.65,10.39,10.9,11.08,10.97,10.55,9.95,9.61,9.84,9.92,8.23,5.02,2.2,1.17,0.81,-0.22,-1.41,-1.36,-0.11,1.8,3.81,3.59,0.13,-3.53,-4.35,-3.22,-2.09,-1.39,-0.63,0.28,0.8,0.98,1.11,1.29,1.53,1.81,2.14,2.49,2.82,3.12,3.49,3.93,4.38,4.87,5.56,6.41,7.18,7.78,8.26,8.41,7.78,6.35,4.95,4.39,4.4,3.46,0.73,-2.3,-3.99,-4.4,-4.69,-4.92,-5.31,-6.22,-7.57,-8.98,-10.22,-11.08,-11.33,-11.05,-10.93,-11.42,-12.48,-13.67,-14.55,-14.82,-14.66,-14.08,-13.1,-11.89,-10.58,-9.1,-7.35,-5.63,-4.6,-4.67,-4.97,-4.99,-4.83,-4.7,-4.59,-4.53,-4.58,-4.72,-4.8,-4.86,-4.92,-4.95,-4.93,-4.5,-4.59,-4.78,-4.97,-5.12,-5.23,-5.32,-5.42,-5.58,-5.74,-5.83,-5.81,-5.74,-5.71,-5.65,-5.51,-5.33,-5.12,-4.82,-4.49,-4.13,-3.75,-3.28,-2.75,-2.16,-1.55,-0.99,-0.54,-0.17,0.14,0.37,0.64,0.94,1.23,1.56,1.95,2.35,2.7,3.02,3.37,3.74,4.13,4.52,4.85,5.14,5.43,5.73,6.0,6.27,6.56,6.78,7.0,7.28,7.55,7.75,8.02,8.4,8.81,9.02,8.9,8.6,8.3,8.08,7.89,7.73,7.61,7.44,7.16,6.86,6.67,6.69,6.79,6.74,6.45,6.24,6.57,7.23,7.3,6.53,5.51,4.71,4.03,3.3,2.55,1.91,1.39,1.0,0.68,0.32,-0.09,-0.39,-0.55,-0.75,-0.92,-0.76,-0.18,0.66,1.54,2.28,2.77,3.05,3.23,3.37,3.41,3.31,3.16,3.1,3.15,3.23,3.3,3.36,3.39,3.41,3.41,3.37,3.33,3.29,3.25,3.19,3.11,2.97,2.84,2.72,2.52,2.22,1.96,1.89,2.04,2.22,2.32,2.26,2.16,2.06,1.79,1.32,0.83,0.47,0.11,-0.29,-0.67,-0.97,-1.21,-1.44,-1.62,-1.66,-1.73,-1.89,-2.05,-2.13,-2.1,-1.96,-1.79,-1.86,-2.21,-2.56,-3.05,-3.95,-4.18,-3.59,-2.85,-1.51,2.98,4.88,2.65,-0.39,0.09,2.18,3.46,3.22,0.4,-3.63,-5.7,-5.27,-4.4,-4.01,-3.72,-3.12,-2.37,-1.83,-1.52,-1.14,-0.65,-0.21,0.25,0.67,1.06,1.45,1.71,1.96,2.07,2.16,2.28,2.44,2.69,2.99,3.25,3.32,3.2,2.86,3.02,3.76,3.63,1.28,-1.25,-2.35,-2.97,-4.52,-5.21,-3.72,-1.07,0.6,0.37,-0.86,-1.56,-1.51,-2.09,-3.66,-4.72,-4.93,-4.92,-5.17,-5.47,-5.6,-5.6,-5.66,-5.73,-5.38,-4.9,-4.49,-4.24,-3.99,-3.61,-3.15,-2.72,-2.36,-1.96,-1.48,-0.89,-0.21,0.55,1.41,2.39,3.34,4.16,4.93,5.58,6.06,6.33,6.39,6.49,6.71,7.05,7.45,8.07,9.13,10.18,10.62,10.51,10.27,10.07,9.98,10.03,10.14,10.14,9.91,9.44,8.94,8.54,8.25,8.37,9.13,9.91,9.56,7.65,5.04,1.21,-1.35,-0.68,1.15,0.87,-0.9,-1.79,-1.23,-0.26,0.55,1.47,2.46,2.85,2.41,1.72,1.19,0.91,0.82,0.82,0.86,0.95,1.08,1.28,1.55,1.88,2.29,2.73,3.24,3.71,4.13,4.6,5.15,5.88,6.91,7.99,8.01,6.02,3.74,4.48,7.98,10.46,10.93,6.94,0.59,-3.57,-4.2,-4.25,-5.53,-7.14,-7.7,-8.51,-9.11,-9.72,-9.51,-9.63,-10.28,-10.57,-10.03,-9.25,-8.78,-8.3,-7.71,-7.24,-7.0,-6.7,-6.29,-6.16,-6.3,-6.3,-5.91,-5.13,-4.33,-3.84,-3.62,-3.49,-3.39,-3.33,-3.31,-3.34,-3.47,-3.7,-3.97,-4.2,-4.34,-4.45,-5.08,-5.04,-4.96,-4.85,-4.73,-4.73,-4.9,-5.09,-5.19,-5.22,-5.33,-5.49,-5.57,-5.53,-5.47,-5.43,-5.36,-5.29,-5.19,-4.98,-4.64,-4.26,-3.93,-3.65,-3.37,-3.0,-2.6,-2.25,-1.91,-1.51,-1.09,-0.68,-0.3,0.04,0.38,0.75,1.14,1.54,1.92,2.27,2.62,3.02,3.42,3.86,4.28,4.65,4.98,5.29,5.61,5.91,6.18,6.37,6.54,6.67,6.81,6.99,7.18,7.42,7.53,7.54,7.45,7.26,7.02,6.74,6.47,6.28,6.22,6.21,6.27,6.43,6.44,6.19,5.9,5.76,5.72,5.63,5.6,5.89,6.41,6.78,6.71,6.27,5.76,5.23,4.64,4.0,3.39,2.93,2.52,2.12,1.75,1.55,1.59,1.84,2.22,2.67,3.05,3.32,3.52,3.62,3.61,3.58,3.59,3.62,3.61,3.58,3.52,3.45,3.42,3.46,3.6,3.79,3.96,4.09,4.16,4.2,4.21,4.21,4.18,4.11,4.0,3.89,3.78,3.66,3.54,3.47,3.48,3.58,3.66,3.68,3.71,3.75,3.59,3.25,2.84,2.43,2.0,1.44,0.78,0.14,-0.46,-0.99,-1.46,-1.81,-1.98,-2.03,-2.03,-1.99,-1.88,-1.65,-1.18,-0.48,0.33,1.48,3.48,5.39,4.87,4.22,2.65,-0.86,-5.94,-7.28,-4.09,-1.03,1.2,1.72,0.91,0.29,0.31,-0.13,-1.64,-3.75,-5.08,-5.34,-5.15,-4.85,-4.51,-4.1,-3.71,-3.36,-2.91,-2.27,-1.53,-0.86,-0.32,0.06,0.35,0.59,0.78,0.94,1.01,0.94,0.89,1.1,1.58,1.81,1.59,1.08,0.37,-0.3,-0.25,0.53,1.4,2.0,2.03,1.22,0.29,0.14,0.19,-0.49,-1.68,-2.85,-3.41,-3.76,-4.13,-4.27,-3.98,-3.59,-3.54,-3.92,-4.51,-4.97,-5.22,-5.35,-5.41,-5.33,-5.14,-4.91,-4.62,-4.35,-4.16,-3.89,-3.36,-2.65,-1.99,-1.42,-0.89,-0.42,-0.04,0.3,0.65,1.06,1.52,2.01,2.58,3.29,4.19,5.31,6.38,7.19,7.73,8.19,8.68,8.96,8.97,8.89,8.92,9.19,9.58,9.93,10.14,10.28,10.38,10.37,10.13,9.73,9.36,9.21,9.32,9.52,9.59,9.15,7.94,4.94,1.0,0.09,1.2,1.95,0.92,0.12,0.53,1.66,2.57,2.93,2.95,2.96,2.91,2.88,3.24,3.89,3.83,3.21,2.89,2.89,2.65,2.32,2.11,2.07,2.16,2.33,2.57,2.83,3.15,3.52,3.85,4.1,4.19,4.22,4.2,3.81,2.92,1.49,0.8,1.36,3.05,5.16,6.74,7.48,7.5,6.68,4.52,0.86,-2.21,-3.56,-3.21,-3.12,-3.9,-4.59,-4.58,-4.28,-4.4,-5.03,-6.1,-7.24,-8.02,-8.4,-8.67,-8.87,-8.98,-8.97,-8.71,-8.01,-6.8,-5.45,-4.63,-4.89,-5.55,-5.96,-5.92,-5.69,-5.41,-5.13,-4.83,-4.86,-5.19,-5.36,-5.31,-5.15,-5.04,-5.04,-4.86,-4.95,-5.01,-5.04,-5.13,-5.3,-5.51,-5.71,-5.86,-5.92,-5.85,-5.76,-5.72,-5.74,-5.75,-5.73,-5.69,-5.6,-5.48,-5.36,-5.24,-5.08,-4.89,-4.67,-4.39,-4.08,-3.76,-3.52,-3.32,-3.08,-2.75,-2.37,-2.0,-1.67,-1.32,-0.93,-0.53,-0.13,0.29,0.71,1.12,1.52,1.91,2.33,2.75,3.19,3.61,3.99,4.33,4.61,4.84,5.04,5.21,5.37,5.52,5.67,5.76,5.82,5.84,5.82,5.78,5.69,5.57,5.43,5.29,5.17,5.09,4.98,4.83,4.65,4.46,4.28,4.11,3.94,3.88,4.07,4.44,4.76,4.85,4.83,4.77,4.76,4.79,4.83,4.77,4.63,4.44,4.24,4.08,3.98,3.94,3.93,3.96,4.01,4.04,4.03,4.04,4.13,4.27,4.4,4.48,4.5,4.54,4.66,4.79,4.86,4.86,4.86,4.86,4.88,4.92,4.99,5.06,5.09,5.14,5.24,5.35,5.45,5.5,5.54,5.56,5.57,5.58,5.56,5.52,5.45,5.37,5.37,5.46,5.55,5.63,5.76,5.97,6.06,5.88,5.6,5.43,5.31,5.16,4.92,4.53,3.96,3.2,2.37,1.57,0.93,0.65,0.63,0.45,-0.15,-0.88,-1.56,-2.44,-4.02,-4.53,-2.62,0.58,2.98,3.27,2.13,1.66,1.95,2.39,2.41,1.63,0.14,-1.68,-3.12,-3.65,-3.51,-3.29,-3.41,-3.73,-4.05,-4.22,-4.26,-4.19,-3.99,-3.7,-3.38,-3.02,-2.63,-2.25,-1.9,-1.59,-1.33,-1.09,-0.93,-0.87,-0.87,-0.84,-0.7,-0.55,-0.52,-0.61,-0.63,-0.44,-0.26,-0.3,-0.35,-0.15,0.11,0.1,-0.1,-0.34,-0.59,-0.84,-0.96,-0.74,-0.18,0.45,0.77,0.64,0.39,0.27,0.04,-0.49,-1.18,-1.86,-2.41,-2.77,-3.06,-3.42,-3.94,-4.49,-4.88,-5.05,-5.11,-5.12,-5.04,-4.92,-4.69,-4.27,-3.7,-3.13,-2.62,-2.12,-1.66,-1.27,-0.93,-0.63,-0.29,0.08,0.54,1.09,1.67,2.23,2.67,2.98,3.21,3.42,3.68,4.02,4.44,4.95,5.54,6.2,6.95,7.74,8.49,9.16,9.71,10.11,10.28,10.41,10.7,10.93,10.79,10.48,10.56,11.07,11.42,11.15,10.34,9.24,7.86,7.06,6.73,12.3,15.0,14.85,11.65,8.39,6.48,5.98,6.02,6.0,5.64,4.96,4.2,3.69,3.39,3.18,3.09,3.04,2.89,2.55,2.22,2.13,2.3,2.53,2.84,3.35,3.98,4.41,4.44,4.21,3.95,3.61,2.91,1.92,1.09,0.86,1.07,1.47,2.14,3.47,5.08,6.18,5.36,3.25,0.93,-0.48,-0.71,-0.47,-0.55,-0.97,-1.27,-1.23,-0.79,0.02,0.96,1.72,2.06,2.04,1.81,1.35,0.35,-1.25,-2.94,-3.93,-3.92,-3.46,-3.19,-3.24,-3.31,-3.25,-3.11,-3.08,-3.16,-3.3,-3.57,-3.94,-4.29,-4.35,-4.41,-4.49,-4.59,-4.68,-4.76,-6.68,-6.39,-6.19,-6.16,-6.15,-6.21,-6.29,-6.36,-6.4,-6.39,-6.33,-6.26,-6.2,-6.17,-6.22,-6.28,-6.31,-6.28,-6.21,-6.13,-6.03,-5.93,-5.75,-5.51,-5.25,-5.03,-4.89,-4.82,-4.73,-4.6,-4.41,-4.18,-3.95,-3.76,-3.53,-3.17,-2.69,-2.16,-1.64,-1.15,-0.71,-0.3,0.07,0.41,0.73,1.03,1.31,1.58,1.86,2.15,2.44,2.69,2.91,3.11,3.29,3.47,3.64,3.75,3.81,3.82,3.83,3.82,3.76,3.69,3.62,3.6,3.61,3.62,3.61,3.57,3.49,3.42,3.38,3.38,3.38,3.37,3.4,3.49,3.65,3.8,3.92,4.02,4.14,4.28,4.42,4.54,4.64,4.71,4.72,4.68,4.66,4.62,4.56,4.51,4.51,4.53,4.56,4.61,4.7,4.76,4.81,4.85,4.96,5.19,5.6,6.0,6.28,6.44,6.5,6.48,6.43,6.35,6.24,6.16,6.19,6.28,6.38,6.42,6.41,6.38,6.34,6.29,6.25,6.2,6.13,5.94,5.7,5.39,5.06,4.76,4.59,4.6,4.79,5.06,5.39,5.65,5.74,5.68,5.46,5.17,4.87,4.64,4.5,4.39,4.23,4.08,4.01,4.03,4.05,4.0,3.88,3.6,2.87,1.35,-0.38,-1.33,-0.76,0.75,2.08,2.69,3.1,3.56,3.84,3.93,3.52,2.39,0.5,-1.48,-2.98,-3.71,-3.76,-3.58,-3.41,-3.3,-3.21,-3.08,-2.93,-2.74,-2.52,-2.27,-2.02,-1.8,-1.61,-1.48,-1.4,-1.36,-1.33,-1.28,-1.22,-1.15,-1.08,-1.03,-1.01,-1.01,-1.0,-0.98,-0.94,-0.91,-0.92,-0.96,-1.05,-1.28,-1.72,-2.2,-2.4,-2.23,-1.97,-1.88,-1.97,-2.03,-1.96,-1.82,-1.83,-2.08,-2.41,-2.61,-2.6,-2.45,-2.3,-2.27,-2.47,-3.0,-3.86,-4.78,-5.42,-5.68,-5.53,-5.12,-4.64,-4.3,-4.14,-4.06,-4.0,-3.9,-3.79,-3.65,-3.47,-3.15,-2.74,-2.34,-1.97,-1.63,-1.25,-0.83,-0.42,-0.04,0.4,0.97,1.65,2.34,2.97,3.51,3.95,4.28,4.52,4.7,4.91,5.21,5.6,6.09,6.61,7.19,7.7,8.16,8.57,8.87,9.07,9.26,9.54,10.0,10.53,11.04,11.49,11.93,12.27,12.13,11.36,10.25,9.5,9.34,9.44,9.47,9.34,9.07,8.57,7.85,6.94,6.02,5.31,4.83,4.34,3.78,3.31,3.08,3.03,3.04,2.92,2.6,2.27,2.3,2.6,2.81,2.85,2.87,3.0,3.07,2.69,2.03,1.66,1.56,1.27,0.53,-0.38,-1.01,-0.91,-0.32,0.26,0.63,0.79,0.88,1.15,1.51,1.55,0.81,-0.6,-2.15,-2.92,-2.73,-2.16,-1.81,-2.06,-3.05,-4.25,-4.98,-4.93,-4.37,-3.99,-4.14,-4.77,-5.63,-6.33,-6.59,-6.17,-5.24,-4.27,-3.84,-3.96,-4.19,-4.38,-4.46,-4.51,-4.71,-5.1,-5.6,-6.06,-6.36,-6.69,-6.9,-7.0,-6.9,-3.3,-3.37,-3.41,-3.4,-3.39,-3.45,-3.56,-3.69,-3.84,-3.99,-4.13,-4.26,-4.38,-4.48,-4.55,-4.6,-4.63,-4.66,-4.71,-4.77,-4.85,-4.94,-5.06,-5.19,-5.29,-5.34,-5.29,-5.18,-5.04,-4.94,-4.88,-4.87,-4.85,-4.79,-4.66,-4.51,-4.33,-4.1,-3.76,-3.3,-2.73,-2.17,-1.7,-1.39,-1.17,-1.0,-0.8,-0.57,-0.34,-0.12,0.08,0.27,0.47,0.66,0.82,0.93,1.02,1.11,1.24,1.38,1.52,1.64,1.76,1.89,2.03,2.17,2.32,2.48,2.63,2.79,2.93,3.07,3.19,3.32,3.46,3.59,3.69,3.75,3.78,3.79,3.79,3.78,3.76,3.72,3.7,3.69,3.7,3.71,3.76,3.83,3.92,4.0,4.06,4.09,4.13,4.2,4.31,4.46,4.64,4.82,5.11,5.43,5.73,5.91,6.01,6.11,6.26,6.42,6.55,6.62,6.69,6.67,6.56,6.42,6.28,6.2,6.18,6.17,6.17,6.18,6.21,6.27,6.34,6.43,6.5,6.53,6.46,6.32,6.19,6.11,6.08,6.07,6.08,6.09,6.1,6.11,6.13,6.1,5.97,5.65,5.22,4.72,4.24,3.84,3.56,3.4,3.33,3.33,3.38,3.44,3.52,3.61,3.71,3.78,3.75,3.48,2.94,2.26,1.91,2.03,1.88,1.4,1.31,2.14,3.21,3.74,3.33,2.55,1.79,1.21,0.71,0.24,-0.24,-0.69,-1.09,-1.41,-1.66,-1.83,-1.9,-1.89,-1.78,-1.56,-1.27,-0.94,-0.63,-0.37,-0.18,-0.06,0.0,0.02,0.0,-0.01,-0.01,0.0,-0.01,-0.07,-0.2,-0.4,-0.67,-1.06,-1.58,-2.23,-2.89,-3.38,-3.6,-3.6,-3.66,-3.94,-4.29,-4.36,-4.25,-4.12,-4.2,-4.54,-5.01,-5.42,-6.09,-6.27,-6.14,-5.82,-5.45,-5.16,-4.96,-4.88,-4.8,-4.67,-4.48,-4.31,-4.15,-4.01,-3.82,-3.63,-3.47,-3.33,-3.18,-2.99,-2.78,-2.6,-2.54,-2.66,-2.93,-3.17,-3.22,-3.02,-2.69,-2.4,-2.16,-1.95,-1.68,-1.25,-0.64,0.06,0.82,1.65,2.56,3.62,4.81,5.86,6.63,7.09,7.44,7.75,8.07,8.41,8.8,9.32,9.92,10.48,10.93,11.3,11.65,12.0,12.24,12.31,12.21,12.11,12.15,12.33,12.52,12.59,12.47,12.17,11.75,11.17,10.38,9.37,8.26,7.26,6.51,6.01,5.63,5.28,4.85,4.34,3.81,3.42,3.2,3.07,2.98,2.89,2.85,2.96,3.2,3.37,3.2,2.68,1.94,1.45,1.81,2.97,4.48,5.57,5.73,4.59,2.53,0.2,-1.47,-2.2,-2.19,-1.97,-1.88,-1.94,-2.08,-2.09,-2.06,-2.13,-2.37,-2.72,-3.04,-3.22,-3.18,-2.84,-2.35,-1.89,-1.78,-2.03,-2.52,-3.05,-3.49,-3.84,-4.14,-4.4,-4.6,-4.69,-4.69,-4.6,-4.36,-4.05,-3.78,-3.56,-3.49,-3.48,-3.5,-3.51,-3.5,-3.48,-3.44,-3.36,-3.29,-3.27,-3.12,-3.17,-3.23,-3.29,-3.38,-3.46,-3.52,-3.58,-3.65,-3.71,-3.75,-3.79,-3.78,-3.78,-3.79,-3.82,-3.87,-3.92,-4.0,-4.05,-4.14,-4.23,-4.32,-4.4,-4.48,-4.54,-4.6,-4.65,-4.7,-4.73,-4.72,-4.68,-4.64,-4.6,-4.56,-4.5,-4.44,-4.33,-4.15,-3.91,-3.59,-3.24,-2.91,-2.65,-2.46,-2.32,-2.21,-2.1,-1.97,-1.8,-1.59,-1.36,-1.11,-0.85,-0.62,-0.4,-0.21,-0.06,0.07,0.2,0.32,0.49,0.69,0.95,1.25,1.56,1.86,2.11,2.33,2.48,2.59,2.69,2.77,2.87,2.97,3.09,3.2,3.3,3.42,3.52,3.63,3.73,3.83,3.9,3.96,4.0,4.05,4.1,4.14,4.18,4.21,4.26,4.32,4.41,4.51,4.62,4.73,4.83,4.97,5.14,5.34,5.58,5.83,6.07,6.28,6.45,6.6,6.75,6.93,7.17,7.42,7.67,7.83,7.87,7.77,7.6,7.55,7.46,7.43,7.39,7.31,7.17,7.0,6.83,6.66,6.5,6.37,6.29,6.27,6.26,6.27,6.27,6.25,6.24,6.2,6.16,6.09,6.0,5.87,5.69,5.45,5.15,4.85,4.54,4.27,4.05,3.9,3.83,3.82,3.88,4.03,4.27,4.53,4.74,4.76,4.38,3.37,1.51,-0.11,-1.17,-1.86,-2.64,-3.38,-3.52,-2.26,0.27,3.02,3.28,2.16,0.22,-0.73,-0.34,0.67,1.46,1.63,1.21,0.59,0.03,-0.42,-0.76,-1.06,-1.29,-1.41,-1.42,-1.32,-1.11,-0.84,-0.54,-0.26,-0.03,0.12,0.24,0.32,0.36,0.33,0.19,-0.06,-0.41,-0.85,-1.32,-1.75,-2.11,-2.39,-2.63,-2.84,-3.05,-3.24,-3.34,-3.28,-2.92,-2.22,-1.31,-0.61,-0.5,-1.21,-2.69,-4.54,-5.82,-6.51,-6.82,-6.68,-6.34,-5.91,-5.45,-4.99,-4.6,-4.37,-4.25,-4.18,-4.12,-4.06,-4.01,-3.97,-3.95,-3.93,-3.9,-3.88,-3.88,-3.87,-3.83,-3.72,-3.47,-3.12,-2.72,-2.35,-2.05,-1.86,-1.73,-1.58,-1.38,-1.1,-0.86,-0.75,-0.68,-0.45,0.22,1.45,3.01,4.56,5.78,6.64,7.2,7.63,8.06,8.58,9.22,9.91,10.54,10.96,11.08,10.95,10.69,10.43,10.21,10.04,9.94,9.92,10.11,10.42,10.7,10.87,10.86,10.72,10.49,10.18,9.76,9.26,8.72,8.17,7.62,7.09,6.7,6.42,6.32,6.42,6.72,6.96,6.95,6.55,5.62,4.04,1.95,0.4,-0.36,-0.1,1.04,2.41,3.42,3.91,4.06,4.04,3.9,3.55,3.0,2.05,1.03,0.33,0.06,0.07,0.1,0.0,-0.17,-0.4,-0.69,-0.98,-1.15,-1.15,-1.06,-0.97,-1.0,-1.16,-1.44,-1.69,-1.9,-2.06,-2.19,-2.31,-2.44,-2.59,-2.75,-2.94,-3.13,-3.3,-3.46,-3.57,-3.62,-3.61,-3.55,-3.47,-3.41,-3.36,-3.31,-3.25,-3.17,-3.11,-3.05,-3.04,-3.05,-3.07,-3.09,-3.27,-3.3,-3.3,-3.32,-3.32,-3.32,-3.35,-3.38,-3.42,-3.44,-3.48,-3.54,-3.6,-3.67,-3.76,-3.82,-3.89,-3.96,-4.03,-4.11,-4.19,-4.28,-4.36,-4.41,-4.43,-4.42,-4.39,-4.37,-4.39,-4.44,-4.52,-4.59,-4.63,-4.63,-4.59,-4.57,-4.56,-4.55,-4.52,-4.44,-4.3,-4.1,-3.86,-3.62,-3.4,-3.25,-3.13,-3.04,-2.94,-2.84,-2.72,-2.59,-2.47,-2.33,-2.19,-2.05,-1.89,-1.74,-1.59,-1.45,-1.33,-1.23,-1.13,-1.04,-0.93,-0.82,-0.71,-0.59,-0.45,-0.28,-0.07,0.16,0.41,0.67,0.94,1.2,1.44,1.66,1.87,2.06,2.25,2.44,2.63,2.81,2.98,3.15,3.3,3.44,3.56,3.68,3.79,3.93,4.1,4.25,4.4,4.53,4.68,4.83,4.99,5.17,5.39,5.63,5.89,6.17,6.46,6.71,6.96,7.16,7.31,7.44,7.56,7.69,7.78,7.84,7.85,7.82,7.73,7.67,7.65,7.58,7.49,7.35,7.16,6.95,6.73,6.51,6.31,6.11,5.96,5.86,5.77,5.68,5.57,5.44,5.29,5.14,5.0,4.87,4.76,4.67,4.6,4.56,4.56,4.57,4.58,4.57,4.55,4.51,4.51,4.54,4.64,4.76,4.9,5.0,5.03,4.95,4.72,4.26,3.49,2.35,1.07,0.01,-0.98,-1.65,-1.69,-1.21,-0.47,-0.15,-0.52,-1.52,-2.68,-3.43,-2.73,-1.23,-0.21,0.33,0.15,-0.53,-1.24,-1.54,-1.27,-0.59,0.1,0.58,0.87,1.05,1.2,1.31,1.32,1.17,0.83,0.36,-0.2,-0.74,-1.26,-1.68,-1.99,-2.18,-2.27,-2.3,-2.29,-2.27,-2.25,-2.24,-2.23,-2.24,-2.25,-2.25,-2.19,-2.01,-1.69,-1.24,-0.74,-0.31,-0.06,-0.14,-0.54,-1.22,-2.06,-2.9,-3.52,-3.86,-3.96,-3.93,-3.89,-3.88,-3.92,-3.98,-3.99,-3.97,-3.9,-3.8,-3.7,-3.6,-3.5,-3.42,-3.33,-3.22,-3.05,-2.84,-2.58,-2.27,-1.91,-1.53,-1.14,-0.78,-0.44,-0.1,0.23,0.52,0.73,0.89,1.01,1.15,1.27,1.36,1.46,1.39,1.22,1.11,1.23,1.79,2.82,4.3,5.9,7.37,8.5,9.25,9.74,10.06,10.2,10.29,10.49,10.95,11.64,12.51,13.28,13.79,13.94,13.76,13.37,12.86,12.29,11.66,10.92,10.03,8.97,7.77,6.56,5.49,4.73,4.33,4.23,4.33,4.43,4.31,3.81,2.87,1.76,0.66,-0.31,-1.1,-1.69,-2.08,-2.78,-2.98,-2.84,-2.25,-1.42,-0.63,-0.17,-0.13,-0.44,-0.91,-1.37,-1.71,-1.93,-2.03,-2.03,-1.96,-1.88,-1.85,-1.93,-2.1,-2.32,-2.49,-2.59,-2.57,-2.5,-2.42,-2.36,-2.38,-2.41,-2.51,-2.61,-2.74,-2.85,-2.95,-3.04,-3.15,-3.23,-3.31,-3.37,-3.42,-3.45,-3.44,-3.43,-3.43,-3.46,-3.5,-3.53,-3.56,-3.52,-3.46,-3.41,-3.34,-3.31,-3.3,-3.3,-3.29,-3.86,-3.83,-3.83,-3.8,-3.82,-3.84,-3.81,-3.79,-3.77,-3.76,-3.75,-3.76,-3.78,-3.8,-3.82,-3.84,-3.86,-3.89,-3.92,-3.96,-4.0,-4.07,-4.15,-4.22,-4.3,-4.38,-4.45,-4.53,-4.62,-4.66,-4.72,-4.75,-4.78,-4.79,-4.79,-4.79,-4.77,-4.74,-4.7,-4.65,-4.59,-4.52,-4.44,-4.32,-4.16,-3.97,-3.77,-3.58,-3.41,-3.27,-3.16,-3.07,-2.99,-2.9,-2.82,-2.73,-2.64,-2.54,-2.44,-2.33,-2.23,-2.11,-1.99,-1.86,-1.72,-1.57,-1.43,-1.28,-1.13,-0.98,-0.83,-0.68,-0.53,-0.38,-0.22,-0.07,0.08,0.23,0.38,0.54,0.72,0.91,1.12,1.35,1.58,1.8,2.01,2.2,2.38,2.54,2.7,2.86,3.02,3.19,3.36,3.54,3.72,3.91,4.11,4.3,4.5,4.7,4.9,5.11,5.32,5.54,5.73,5.93,6.11,6.28,6.45,6.6,6.74,6.86,6.95,7.03,7.1,7.16,7.21,7.25,7.27,7.28,7.27,7.26,7.23,7.18,7.12,7.05,6.98,6.89,6.76,6.6,6.42,6.21,6.0,5.79,5.6,5.44,5.33,5.23,5.13,5.03,4.93,4.8,4.66,4.53,4.39,4.29,4.21,4.16,4.14,4.15,4.19,4.29,4.44,4.62,4.78,4.84,4.73,4.4,3.85,3.29,2.91,2.73,2.83,3.25,3.59,3.8,3.52,2.52,1.09,-0.33,-1.41,-2.06,-2.47,-2.1,-1.53,-0.86,-0.17,0.32,0.55,0.56,0.79,1.11,1.44,1.7,1.8,1.6,0.92,0.08,-0.48,-0.42,0.38,1.83,3.48,4.44,4.6,4.21,3.59,3.0,2.62,2.47,2.42,2.32,2.14,1.84,1.48,1.1,0.77,0.48,0.23,0.0,-0.19,-0.36,-0.49,-0.61,-0.72,-0.83,-0.94,-1.06,-1.17,-1.28,-1.41,-1.58,-1.78,-2.01,-2.29,-2.58,-2.85,-3.08,-3.2,-3.15,-2.95,-2.62,-2.25,-1.91,-1.71,-1.64,-1.63,-1.56,-1.37,-1.02,-0.49,0.2,0.98,1.84,2.67,3.4,3.99,4.37,4.43,4.22,3.76,3.15,2.53,2.0,1.72,1.76,2.1,2.68,3.36,4.2,5.31,6.43,7.37,8.03,8.37,7.9,7.48,8.26,8.33,8.67,9.31,10.08,10.74,11.14,11.23,10.97,10.43,9.8,9.19,8.67,8.24,7.87,7.48,6.88,6.19,5.33,4.32,3.24,2.26,1.53,1.17,1.12,1.31,1.58,1.89,2.24,2.18,1.75,1.14,0.47,-0.1,-0.51,-0.78,-0.89,-0.97,-1.08,-1.24,-1.44,-1.69,-1.98,-2.3,-2.6,-2.91,-3.23,-3.53,-3.8,-3.97,-4.05,-4.06,-4.02,-3.98,-3.93,-3.91,-3.88,-3.84,-3.77,-3.71,-3.64,-3.59,-3.58,-3.64,-3.73,-3.88,-4.0,-4.06,-4.08,-4.05,-3.99,-3.91,-3.86,-3.82,-3.81,-3.79,-3.77,-3.76,-3.73,-3.72,-3.71,-3.75,-3.8,-3.86,-3.92,-3.96,-3.96,-3.95,-3.94,-3.92,-3.89,-5.16,-5.14,-5.13,-5.11,-5.1,-5.1,-5.1,-5.1,-5.09,-5.06,-5.03,-5.02,-5.01,-5.0,-4.99,-4.98,-4.98,-4.97,-4.96,-4.95,-4.96,-4.96,-4.98,-5.0,-5.05,-5.09,-5.14,-5.19,-5.25,-5.3,-5.34,-5.36,-5.38,-5.38,-5.36,-5.32,-5.26,-5.15,-5.02,-4.87,-4.69,-4.51,-4.35,-4.18,-4.05,-3.94,-3.82,-3.72,-3.63,-3.52,-3.42,-3.33,-3.23,-3.14,-3.06,-2.98,-2.9,-2.83,-2.75,-2.67,-2.6,-2.5,-2.4,-2.3,-2.17,-2.05,-1.92,-1.78,-1.63,-1.49,-1.33,-1.18,-1.03,-0.86,-0.7,-0.52,-0.35,-0.17,0.0,0.17,0.33,0.49,0.64,0.79,0.93,1.07,1.21,1.36,1.52,1.68,1.85,2.04,2.23,2.43,2.63,2.83,3.03,3.23,3.41,3.59,3.77,3.93,4.09,4.24,4.39,4.55,4.71,4.86,5.02,5.16,5.3,5.44,5.59,5.73,5.86,6.0,6.13,6.27,6.39,6.51,6.62,6.72,6.81,6.88,6.95,7.01,7.06,7.09,7.1,7.09,7.08,7.03,6.98,6.92,6.82,6.72,6.58,6.44,6.27,6.1,5.95,5.81,5.68,5.54,5.41,5.27,5.13,4.99,4.86,4.75,4.65,4.59,4.54,4.52,4.5,4.5,4.5,4.5,4.52,4.53,4.53,4.49,4.43,4.34,4.25,4.19,4.15,4.1,4.0,3.82,3.53,3.05,2.56,2.07,1.79,1.74,1.88,2.24,2.69,3.12,3.48,3.57,3.51,3.33,3.03,2.74,2.48,2.3,2.16,1.9,1.5,0.75,-0.14,-1.06,-1.72,-1.7,-1.34,-0.74,0.47,1.79,3.24,4.34,5.08,5.44,5.19,4.11,3.01,2.6,2.13,1.63,1.07,0.83,0.53,0.15,-0.2,-0.53,-0.78,-0.92,-0.9,-0.75,-0.55,-0.28,0.03,0.37,0.76,1.26,1.84,2.39,2.56,2.55,2.29,1.59,1.08,0.68,0.32,0.2,0.34,0.76,1.4,2.1,2.81,3.42,3.92,4.3,4.54,4.7,4.81,4.92,5.05,5.21,5.43,5.69,5.98,6.32,6.65,7.02,7.4,7.74,8.09,8.38,8.6,8.67,8.61,8.41,7.98,7.47,6.95,6.48,6.18,6.02,6.02,6.12,6.19,6.22,6.18,6.08,6.0,5.97,6.05,6.19,6.38,6.57,6.61,6.49,6.13,5.58,4.97,4.3,3.71,3.27,2.97,2.88,2.94,3.07,3.24,3.39,3.48,3.49,3.41,3.26,3.04,2.74,2.38,1.96,1.48,0.96,0.43,-0.09,-0.56,-0.97,-1.33,-1.6,-1.81,-1.97,-2.14,-2.28,-2.42,-2.57,-2.75,-2.95,-3.18,-3.43,-3.68,-3.93,-4.13,-4.31,-4.46,-4.56,-4.63,-4.69,-4.72,-4.79,-4.87,-5.0,-5.15,-5.32,-5.49,-5.63,-5.74,-5.82,-5.86,-5.86,-5.83,-5.79,-5.73,-5.67,-5.61,-5.56,-5.49,-5.42,-5.36,-5.32,-5.28,-5.26,-5.22,-5.2,-5.2,-5.19,-5.17,-5.16,-5.71,-5.71,-5.72,-5.72,-5.73,-5.72,-5.71,-5.69,-5.69,-5.68,-5.68,-5.67,-5.67,-5.68,-5.69,-5.73,-5.77,-5.82,-5.86,-5.89,-5.92,-5.95,-5.98,-6.0,-6.0,-5.99,-5.98,-5.95,-5.91,-5.87,-5.81,-5.75,-5.69,-5.62,-5.54,-5.44,-5.32,-5.2,-5.09,-4.96,-4.84,-4.7,-4.55,-4.39,-4.23,-4.06,-3.9,-3.74,-3.59,-3.44,-3.32,-3.19,-3.08,-2.99,-2.89,-2.8,-2.72,-2.64,-2.56,-2.47,-2.38,-2.29,-2.19,-2.09,-1.98,-1.88,-1.76,-1.66,-1.54,-1.42,-1.3,-1.18,-1.06,-0.94,-0.81,-0.69,-0.56,-0.42,-0.29,-0.14,0.0,0.14,0.29,0.44,0.59,0.74,0.89,1.03,1.18,1.32,1.46,1.6,1.75,1.89,2.02,2.16,2.3,2.43,2.57,2.71,2.84,2.99,3.13,3.27,3.41,3.56,3.69,3.83,3.96,4.09,4.2,4.33,4.43,4.54,4.64,4.75,4.84,4.93,5.02,5.11,5.19,5.28,5.35,5.44,5.51,5.58,5.64,5.71,5.76,5.82,5.87,5.91,5.93,5.96,5.98,5.99,5.99,5.99,5.99,5.97,5.95,5.92,5.89,5.84,5.8,5.75,5.68,5.61,5.54,5.46,5.38,5.28,5.19,5.11,5.02,4.93,4.84,4.76,4.68,4.61,4.53,4.47,4.39,4.33,4.27,4.21,4.16,4.12,4.08,4.05,4.04,4.02,4.02,4.03,4.06,4.09,4.14,4.2,4.27,4.36,4.46,4.58,4.71,4.85,4.99,5.13,5.26,5.39,5.5,5.59,5.66,5.72,5.69,5.65,5.63,5.67,5.72,5.7,5.65,5.55,5.46,5.4,5.35,5.35,5.29,5.12,5.0,5.02,5.03,4.99,4.63,4.21,3.75,3.28,2.81,2.57,2.63,2.73,2.88,3.11,3.36,3.62,3.87,4.05,4.21,4.31,4.38,4.42,4.43,4.46,4.5,4.55,4.63,4.72,4.83,4.95,5.07,5.18,5.28,5.37,5.47,5.55,5.64,5.74,5.83,5.92,6.0,6.09,6.2,6.32,6.46,6.61,6.79,6.99,7.22,7.47,7.73,8.01,8.3,8.59,8.86,9.1,9.33,9.5,9.62,9.68,9.67,9.59,9.43,9.23,8.96,8.67,8.34,8.01,7.69,7.37,7.08,6.83,6.59,6.4,6.22,6.09,5.97,5.87,5.77,5.68,5.58,5.47,5.36,5.25,5.13,5.02,4.9,4.79,4.69,4.58,4.49,4.4,4.31,4.23,4.15,4.05,3.96,3.83,3.68,3.5,3.28,3.03,2.73,2.43,2.11,1.77,1.45,1.13,0.83,0.54,0.29,0.05,-0.17,-0.38,-0.57,-0.77,-0.96,-1.15,-1.33,-1.5,-1.66,-1.81,-1.98,-2.15,-2.3,-2.45,-2.58,-2.72,-2.86,-3.0,-3.15,-3.31,-3.47,-3.63,-3.79,-3.96,-4.12,-4.27,-4.41,-4.56,-4.69,-4.82,-4.94,-5.04,-5.15,-5.26,-5.34,-5.42,-5.49,-5.55,-5.6,-5.63,-5.67,-5.7,-4.75,-4.8,-4.85,-4.9,-4.93,-4.97,-4.99,-5.01,-5.03,-5.04,-5.05,-5.04,-5.03,-5.02,-5.01,-5.01,-5.01,-5.02,-5.03,-5.03,-5.04,-5.06,-5.08,-5.11,-5.13,-5.13,-5.15,-5.19,-5.22,-5.26,-5.3,-5.33,-5.36,-5.39,-5.41,-5.43,-5.44,-5.44,-5.43,-5.39,-5.33,-5.26,-5.17,-5.07,-4.96,-4.83,-4.69,-4.55,-4.4,-4.25,-4.11,-3.96,-3.81,-3.66,-3.52,-3.39,-3.25,-3.12,-3.0,-2.87,-2.75,-2.62,-2.49,-2.37,-2.24,-2.1,-1.97,-1.83,-1.7,-1.56,-1.43,-1.3,-1.17,-1.04,-0.92,-0.8,-0.69,-0.58,-0.49,-0.38,-0.28,-0.19,-0.1,0.0,0.09,0.18,0.27,0.36,0.45,0.54,0.64,0.73,0.82,0.92,1.02,1.12,1.22,1.32,1.42,1.52,1.62,1.72,1.82,1.93,2.03,2.14,2.24,2.34,2.45,2.55,2.65,2.75,2.86,2.96,3.06,3.16,3.26,3.34,3.44,3.53,3.61,3.7,3.78,3.86,3.94,4.02,4.1,4.18,4.27,4.34,4.43,4.51,4.58,4.67,4.74,4.81,4.88,4.95,5.01,5.07,5.11,5.15,5.18,5.2,5.21,5.21,5.22,5.21,5.19,5.18,5.16,5.14,5.11,5.09,5.07,5.04,5.02,5.0,4.98,4.97,4.96,4.95,4.95,4.96,4.96,4.96,4.98,5.0,5.02,5.04,5.07,5.1,5.13,5.17,5.21,5.26,5.31,5.37,5.43,5.49,5.56,5.62,5.7,5.77,5.85,5.94,6.03,6.13,6.23,6.34,6.45,6.57,6.7,6.82,6.94,7.06,7.16,7.27,7.37,7.45,7.53,7.6,7.66,7.73,7.79,7.85,7.91,7.96,8.01,8.05,8.08,8.12,8.13,8.15,8.15,8.13,8.12,8.07,8.03,7.97,7.9,7.83,7.74,7.66,7.58,7.49,7.42,7.34,7.28,7.21,7.17,7.13,7.11,7.11,7.12,7.14,7.18,7.22,7.28,7.33,7.39,7.45,7.51,7.56,7.62,7.67,7.72,7.77,7.82,7.87,7.93,8.0,8.07,8.15,8.23,8.31,8.39,8.46,8.51,8.55,8.58,8.58,8.57,8.54,8.49,8.43,8.35,8.25,8.15,8.04,7.93,7.8,7.68,7.54,7.4,7.26,7.12,6.97,6.82,6.65,6.49,6.31,6.12,5.94,5.74,5.54,5.33,5.12,4.92,4.71,4.51,4.31,4.12,3.94,3.76,3.6,3.45,3.31,3.19,3.08,2.98,2.89,2.83,2.76,2.72,2.68,2.64,2.61,2.57,2.52,2.47,2.41,2.33,2.25,2.15,2.03,1.9,1.74,1.57,1.39,1.18,0.97,0.74,0.5,0.26,0.01,-0.24,-0.5,-0.77,-1.03,-1.29,-1.54,-1.79,-2.02,-2.25,-2.46,-2.65,-2.83,-2.99,-3.13,-3.27,-3.38,-3.49,-3.58,-3.66,-3.75,-3.83,-3.9,-3.96,-4.02,-4.08,-4.15,-4.22,-4.29,-4.36,-4.43,-4.5,-4.57,-4.63,-4.69,-3.92,-4.03,-4.15,-4.25,-4.37,-4.48,-4.57,-4.67,-4.77,-4.87,-4.96,-5.05,-5.14,-5.23,-5.31,-5.38,-5.45,-5.52,-5.59,-5.64,-5.7,-5.74,-5.79,-5.83,-5.86,-5.89,-5.92,-5.95,-5.96,-5.97,-5.98,-5.99,-5.99,-5.98,-5.98,-5.97,-5.96,-5.95,-5.94,-5.93,-5.92,-5.9,-5.88,-5.85,-5.84,-5.82,-5.78,-5.74,-5.71,-5.67,-5.63,-5.56,-5.5,-5.44,-5.37,-5.28,-5.18,-5.08,-4.99,-4.88,-4.76,-4.63,-4.51,-4.37,-4.23,-4.09,-3.94,-3.79,-3.63,-3.47,-3.32,-3.15,-2.99,-2.84,-2.69,-2.53,-2.38,-2.24,-2.1,-1.96,-1.83,-1.7,-1.59,-1.48,-1.38,-1.27,-1.17,-1.09,-1.01,-0.92,-0.85,-0.78,-0.72,-0.65,-0.59,-0.52,-0.47,-0.42,-0.36,-0.31,-0.26,-0.2,-0.15,-0.1,-0.04,0.01,0.07,0.13,0.18,0.24,0.3,0.37,0.43,0.49,0.56,0.62,0.68,0.74,0.8,0.87,0.92,0.99,1.04,1.1,1.16,1.21,1.27,1.32,1.37,1.42,1.47,1.5,1.54,1.58,1.62,1.65,1.69,1.71,1.74,1.77,1.79,1.82,1.84,1.86,1.89,1.91,1.94,1.96,1.99,2.02,2.05,2.08,2.11,2.15,2.19,2.23,2.27,2.31,2.36,2.41,2.46,2.51,2.56,2.61,2.66,2.71,2.77,2.81,2.86,2.9,2.94,2.99,3.02,3.06,3.09,3.13,3.16,3.18,3.2,3.23,3.25,3.26,3.28,3.29,3.31,3.32,3.33,3.34,3.36,3.36,3.37,3.38,3.39,3.4,3.41,3.43,3.44,3.45,3.46,3.47,3.49,3.5,3.52,3.54,3.56,3.58,3.6,3.62,3.65,3.68,3.7,3.73,3.76,3.8,3.83,3.86,3.89,3.92,3.96,4.0,4.04,4.08,4.12,4.16,4.2,4.24,4.29,4.33,4.37,4.41,4.45,4.49,4.53,4.57,4.61,4.64,4.67,4.71,4.74,4.77,4.79,4.82,4.85,4.87,4.9,4.92,4.93,4.95,4.96,4.98,4.99,5.0,5.0,5.0,5.0,5.01,5.01,5.01,5.0,5.0,4.99,4.99,4.97,4.95,4.94,4.92,4.9,4.87,4.85,4.82,4.8,4.75,4.72,4.68,4.63,4.59,4.53,4.48,4.42,4.36,4.29,4.22,4.15,4.08,4.0,3.92,3.84,3.75,3.67,3.57,3.48,3.38,3.29,3.18,3.08,2.97,2.86,2.75,2.64,2.53,2.41,2.3,2.18,2.07,1.96,1.84,1.73,1.62,1.51,1.4,1.29,1.18,1.08,0.97,0.87,0.77,0.67,0.57,0.48,0.39,0.29,0.2,0.11,0.01,-0.07,-0.17,-0.26,-0.35,-0.45,-0.53,-0.63,-0.72,-0.81,-0.9,-1.0,-1.1,-1.2,-1.31,-1.41,-1.52,-1.62,-1.73,-1.84,-1.95,-2.07,-2.18,-2.3,-2.41,-2.54,-2.65,-2.77,-2.89,-3.01,-3.12,-3.24,-3.35,-3.47,-3.58,-3.7,-3.81,-3.32,-3.37,-3.41,-3.46,-3.5,-3.54,-3.59,-3.63,-3.67,-3.71,-3.74,-3.78,-3.82,-3.85,-3.88,-3.92,-3.95,-3.98,-4.0,-4.03,-4.06,-4.08,-4.11,-4.13,-4.15,-4.17,-4.19,-4.2,-4.22,-4.23,-4.25,-4.26,-4.27,-4.28,-4.29,-4.29,-4.3,-4.3,-4.31,-4.31,-4.31,-4.31,-4.3,-4.3,-4.29,-4.29,-4.28,-4.27,-4.26,-4.25,-4.24,-4.22,-4.21,-4.19,-4.17,-4.15,-4.13,-4.11,-4.09,-4.06,-4.04,-4.01,-3.98,-3.95,-3.92,-3.89,-3.86,-3.82,-3.79,-3.75,-3.71,-3.68,-3.64,-3.6,-3.55,-3.51,-3.47,-3.42,-3.38,-3.33,-3.28,-3.23,-3.18,-3.13,-3.08,-3.02,-2.97,-2.92,-2.86,-2.8,-2.75,-2.69,-2.63,-2.57,-2.51,-2.45,-2.38,-2.32,-2.26,-2.19,-2.13,-2.06,-2.0,-1.93,-1.86,-1.79,-1.72,-1.66,-1.59,-1.52,-1.45,-1.37,-1.3,-1.23,-1.16,-1.09,-1.01,-0.94,-0.87,-0.79,-0.72,-0.64,-0.57,-0.5,-0.42,-0.35,-0.27,-0.2,-0.12,-0.05,0.03,0.1,0.18,0.25,0.33,0.4,0.48,0.55,0.63,0.7,0.78,0.85,0.92,1.0,1.07,1.14,1.22,1.29,1.36,1.43,1.5,1.57,1.64,1.71,1.78,1.85,1.91,1.98,2.05,2.11,2.18,2.24,2.31,2.37,2.43,2.49,2.56,2.62,2.67,2.73,2.79,2.85,2.9,2.96,3.01,3.07,3.12,3.17,3.22,3.27,3.32,3.37,3.41,3.46,3.5,3.54,3.59,3.63,3.67,3.71,3.74,3.78,3.82,3.85,3.88,3.92,3.95,3.98,4.0,4.03,4.06,4.08,4.11,4.13,4.15,4.17,4.19,4.2,4.22,4.23,4.25,4.26,4.27,4.28,4.29,4.29,4.3,4.3,4.31,4.31,4.31,4.31,4.3,4.3,4.29,4.29,4.28,4.27,4.26,4.25,4.24,4.22,4.21,4.19,4.17,4.15,4.13,4.11,4.09,4.06,4.04,4.01,3.98,3.95,3.92,3.89,3.86,3.82,3.79,3.75,3.71,3.68,3.64,3.6,3.55,3.51,3.47,3.42,3.38,3.33,3.28,3.23,3.18,3.13,3.08,3.02,2.97,2.92,2.86,2.8,2.75,2.69,2.63,2.57,2.51,2.45,2.38,2.32,2.26,2.19,2.13,2.06,2.0,1.93,1.86,1.79,1.72,1.66,1.59,1.52,1.45,1.37,1.3,1.23,1.16,1.09,1.01,0.94,0.87,0.79,0.72,0.64,0.57,0.5,0.42,0.35,0.27,0.2,0.12,0.05,-0.03,-0.1,-0.18,-0.25,-0.33,-0.4,-0.48,-0.55,-0.63,-0.7,-0.78,-0.85,-0.92,-1.0,-1.07,-1.14,-1.22,-1.29,-1.36,-1.43,-1.5,-1.57,-1.64,-1.71,-1.78,-1.85,-1.91,-1.98,-2.05,-2.11,-2.18,-2.24,-2.31,-2.37,-2.43,-2.49,-2.56,-2.62,-2.67,-2.73,-2.79,-2.85,-2.9,-2.96,-3.01,-3.07,-3.12,-3.17,-3.22,-3.27]}] \ No newline at end of file diff --git a/inst/examples/velocity/velocity_app.R b/inst/examples/velocity_app.R similarity index 56% rename from inst/examples/velocity/velocity_app.R rename to inst/examples/velocity_app.R index 5569fa26..58ab918d 100644 --- a/inst/examples/velocity/velocity_app.R +++ b/inst/examples/velocity_app.R @@ -2,31 +2,32 @@ library(shiny) library(leaflet) library(leaflet.extras2) -content <- system.file("examples/velocity/wind-global.json", package = "leaflet.extras2") -# content <- system.file("examples/velocity/water-gbr.json", package = "leaflet.extras2") -# content <- system.file("examples/velocity/wind-gbr.json", package = "leaflet.extras2") +# content <- "https://raw.githubusercontent.com/danwild/leaflet-velocity/master/demo/wind-global.json" +# content <- "https://raw.githubusercontent.com/danwild/leaflet-velocity/master/demo/water-gbr.json" +content <- "https://raw.githubusercontent.com/danwild/leaflet-velocity/master/demo/wind-gbr.json" ui <- fluidPage( - leafletOutput("map") + leafletOutput("map", height = "800px") , actionButton("showGroup", "showGroup") , actionButton("hideGroup", "hideGroup") , actionButton("removeVelocity", "removeVelocity") - , actionButton("clearGroup", "clearGroup") + , actionButton("clearGroup", "clearGroup"), br() + , actionButton("setOptions", "setOptions") ) server <- function(input, output, session) { output$map <- renderLeaflet({ leaflet() %>% addTiles(group = "base") %>% - addLayersControl(baseGroups = "base", overlayGroups = "Wind") %>% + setView(145, -20, 4) %>% addVelocity(content = content, group = "Wind", layerId = "veloid", options = velocityOptions( position = "bottomright", emptyString = "Nothing to see", speedUnit = "k/h", lineWidth = 2, - colorScale = rainbow(12) - )) + colorScale = rainbow(12))) %>% + addLayersControl(baseGroups = "base", overlayGroups = "Wind") }) observeEvent(input$showGroup, { leafletProxy("map") %>% @@ -44,6 +45,17 @@ server <- function(input, output, session) { leafletProxy("map") %>% clearGroup("Wind") }) + observeEvent(input$setOptions, { + leafletProxy("map") %>% + setOptionsVelocity(layerId = "veloid", options = velocityOptions( + position = "topleft", + emptyString = "There is no wind", + speedUnit = "m/s", + lineWidth = 4, + colorScale = heat.colors(12), + particleAge = 10 + )) + }) } shinyApp(ui, server) diff --git a/inst/examples/wms_app.R b/inst/examples/wms_app.R index 19804032..f6d46ac5 100644 --- a/inst/examples/wms_app.R +++ b/inst/examples/wms_app.R @@ -18,7 +18,6 @@ server <- function(input, output, session) { addTiles(group = "base") %>% addWMS(baseUrl = "http://ows.terrestris.de/osm/service", layers = c("TOPO-WMS","OSM-Overlay-WMS"), - # layers = c("OSM-Overlay-WMS"), group = "wmsgroup", options = leaflet::WMSTileOptions( transparent = TRUE, @@ -27,13 +26,12 @@ server <- function(input, output, session) { tiled = FALSE )) %>% addLayersControl(baseGroups = "base", - # overlayGroups = c("wmsgroup")) overlayGroups = c("TOPO-WMS","OSM-Overlay-WMS")) }) observeEvent(input$group, { leafletProxy("map", session) %>% - clearGroup("wmsgroup") + clearGroup("TOPO-WMS") }) observeEvent(input$clear, { leafletProxy("map", session) %>% diff --git a/inst/examples/wms_popup.R b/inst/examples/wms_popup.R new file mode 100644 index 00000000..fa89b240 --- /dev/null +++ b/inst/examples/wms_popup.R @@ -0,0 +1,32 @@ +library(shiny) +library(leaflet) +library(leaflet.extras2) +library(XML) + +ui <- fluidPage( + leafletOutput("map", height = "500px"), + verbatimTextOutput("txt") +) + +server <- function(input, output, session) { + output$map <- renderLeaflet({ + leaflet() %>% + addTiles(group = "base") %>% + setView(9, 50, 5) %>% + addWMS(baseUrl = "https://maps.dwd.de/geoserver/dwd/wms", + layers = "dwd:BRD_1km_winddaten_10m", + popupOptions = popupOptions(maxWidth = 600), + checkempty = TRUE, + options = WMSTileOptions( + transparent = TRUE, + format = "image/png", + info_format = "text/html", + tiled = FALSE + )) + }) + output$txt <- renderPrint({ + txt <- req(input$map_wms_click$info) + print(readHTMLTable(txt)) + }) +} +shinyApp(ui, server) diff --git a/inst/htmlwidgets/lfx-arrowhead/leaflet-arrowheads-bindings.js b/inst/htmlwidgets/lfx-arrowhead/leaflet-arrowheads-bindings.js new file mode 100644 index 00000000..7df461f2 --- /dev/null +++ b/inst/htmlwidgets/lfx-arrowhead/leaflet-arrowheads-bindings.js @@ -0,0 +1,47 @@ +LeafletWidget.methods.addArrowhead = function(polygons, layerId, group, options, popup, + popupOptions, label, labelOptions, highlightOptions, + arrowheadOptions) { + + let df = new LeafletWidget.DataFrame() + .col("shapes", polygons) + .col("layerId", layerId) + .col("group", group) + .col("popup", popup) + .col("popupOptions", popupOptions) + .col("label", label) + .col("labelOptions", labelOptions) + .col("highlightOptions", highlightOptions) + .cbind(options); + + LeafletWidget.methods.addGenericLayers(this, "shape", df, function(df, i) { + let shapes = df.get(i, "shapes"); + shapes = shapes.map(shape => HTMLWidgets.dataframeToD3(shape[0])); + if(shapes.length > 1) { + return L.polyline(shapes, df.get(i)).arrowheads(arrowheadOptions); + } else { + return L.polyline(shapes[0], df.get(i)).arrowheads(arrowheadOptions); + } + }); +}; + + +LeafletWidget.methods.clearArrowhead = function(group) { + var grp = this.layerManager._byGroup[group]; + Object.entries(grp).forEach(([key, value]) => { + if (grp[key] && grp[key].deleteArrowheads) { + grp[key].deleteArrowheads() + } + }) +} + + +LeafletWidget.methods.removeArrowhead = function(layerid) { + var lids = Array.isArray(layerid) ? layerid : [layerid] + lids.forEach(e => { + var lyr = this.layerManager.getLayer("shape", e); + if (lyr && lyr.arrowheads) { + lyr.deleteArrowheads() + } + }) +} + diff --git a/inst/htmlwidgets/lfx-arrowhead/leaflet-arrowheads.js b/inst/htmlwidgets/lfx-arrowhead/leaflet-arrowheads.js new file mode 100644 index 00000000..bbb26006 --- /dev/null +++ b/inst/htmlwidgets/lfx-arrowhead/leaflet-arrowheads.js @@ -0,0 +1,691 @@ +function modulus(i, n) { + return ((i % n) + n) % n; +} + +function definedProps(obj) { + return Object.fromEntries( + Object.entries(obj).filter(([k, v]) => v !== undefined) + ); +} + +/** + * Whether or not a string is in the format 'm' + * @param {string} value + * @returns Boolean + */ +function isInMeters(value) { + return ( + value + .toString() + .trim() + .slice(value.toString().length - 1, value.toString().length) === 'm' + ); +} + +/** + * Whether or not a string is in the format '%' + * @param {string} value + * @returns Boolean + */ +function isInPercent(value) { + return ( + value + .toString() + .trim() + .slice(value.toString().length - 1, value.toString().length) === '%' + ); +} + +/** + * Whether or not a string is in the format 'px' + * @param {string} value + * @returns Boolean + */ +function isInPixels(value) { + return ( + value + .toString() + .trim() + .slice(value.toString().length - 2, value.toString().length) === 'px' + ); +} + +function pixelsToMeters(pixels, map) { + let refPoint1 = map.getCenter(); + let xy1 = map.latLngToLayerPoint(refPoint1); + let xy2 = { + x: xy1.x + Number(pixels), + y: xy1.y, + }; + let refPoint2 = map.layerPointToLatLng(xy2); + let derivedMeters = map.distance(refPoint1, refPoint2); + return derivedMeters; +} + +L.Polyline.include({ + /** + * Adds arrowheads to an L.polyline + * @param {object} options The options for the arrowhead. See documentation for details + * @returns The L.polyline instance that they arrowheads are attached to + */ + arrowheads: function (options = {}) { + // Merge user input options with default options: + const defaults = { + yawn: 60, + size: '15%', + frequency: 'allvertices', + proportionalToTotal: false, + }; + + this.options.noClip = true; + + let actualOptions = Object.assign({}, defaults, options); + this._arrowheadOptions = actualOptions; + + this._hatsApplied = true; + return this; + }, + + buildVectorHats: function (options) { + // Reset variables from previous this._update() + if (this._arrowheads) { + this._arrowheads.remove(); + } + + if (this._ghosts) { + this._ghosts.remove(); + } + + // -------------------------------------------------------- // + // ------------ FILTER THE OPTIONS ----------------------- // + /* + * The next 3 lines folds the options of the parent polyline into the default options for all polylines + * The options for the arrowhead are then folded in as well + * All options defined in parent polyline will be inherited by the arrowhead, unless otherwise specified in the arrowhead(options) call + */ + + let defaultOptionsOfParent = Object.getPrototypeOf( + Object.getPrototypeOf(this.options) + ); + + // merge default options of parent polyline (this.options's prototype's prototype) with options passed to parent polyline (this.options). + let parentOptions = Object.assign({}, defaultOptionsOfParent, this.options); + + // now merge in the options the user has put in the arrowhead call + let hatOptions = Object.assign({}, parentOptions, options); + + // ...with a few exceptions: + hatOptions.smoothFactor = 1; + hatOptions.fillOpacity = 1; + hatOptions.fill = options.fill ? true : false; + hatOptions.interactive = false; + + // ------------ FILTER THE OPTIONS END -------------------- // + // --------------------------------------------------------- // + + // --------------------------------------------------------- // + // ------ LOOP THROUGH EACH POLYLINE SEGMENT --------------- // + // ------ TO CALCULATE HAT SIZES AND CAPTURE IN ARRAY ------ // + + let size = options.size.toString(); // stringify if its a number + let allhats = []; // empty array to receive hat polylines + const { frequency, offsets } = options; + + if (offsets?.start || offsets?.end) { + this._buildGhosts({ start: offsets.start, end: offsets.end }); + } + + const lineToTrace = this._ghosts || this; + + lineToTrace._parts.forEach((peice, index) => { + // Immutable variables for each peice + const latlngs = peice.map((point) => this._map.layerPointToLatLng(point)); + + const totalLength = (() => { + let total = 0; + for (var i = 0; i < peice.length - 1; i++) { + total += this._map.distance(latlngs[i], latlngs[i + 1]); + } + return total; + })(); + + // TBD by options if tree below + let derivedLatLngs; + let derivedBearings; + let spacing; + let noOfPoints; + + // Determining latlng and bearing arrays based on frequency choice: + if (!isNaN(frequency)) { + spacing = 1 / frequency; + noOfPoints = frequency; + } else if (isInPercent(frequency)) { + console.error( + 'Error: arrowhead frequency option cannot be given in percent. Try another unit.' + ); + } else if (isInMeters(frequency)) { + spacing = frequency.slice(0, frequency.length - 1) / totalLength; + noOfPoints = 1 / spacing; + // round things out for more even spacing: + noOfPoints = Math.floor(noOfPoints); + spacing = 1 / noOfPoints; + } else if (isInPixels(frequency)) { + spacing = (() => { + let chosenFrequency = frequency.slice(0, frequency.length - 2); + let derivedMeters = pixelsToMeters(chosenFrequency, this._map); + return derivedMeters / totalLength; + })(); + + noOfPoints = 1 / spacing; + + // round things out for more even spacing: + noOfPoints = Math.floor(noOfPoints); + spacing = 1 / noOfPoints; + } + + if (options.frequency === 'allvertices') { + derivedBearings = (() => { + let bearings = []; + for (var i = 1; i < latlngs.length; i++) { + let bearing = + L.GeometryUtil.angle( + this._map, + latlngs[modulus(i - 1, latlngs.length)], + latlngs[i] + ) + 180; + bearings.push(bearing); + } + return bearings; + })(); + + derivedLatLngs = latlngs; + derivedLatLngs.shift(); + } else if (options.frequency === 'endonly' && latlngs.length >= 2) { + derivedLatLngs = [latlngs[latlngs.length - 1]]; + + derivedBearings = [ + L.GeometryUtil.angle( + this._map, + latlngs[latlngs.length - 2], + latlngs[latlngs.length - 1] + ) + 180, + ]; + } else { + derivedLatLngs = []; + let interpolatedPoints = []; + for (var i = 0; i < noOfPoints; i++) { + let interpolatedPoint = L.GeometryUtil.interpolateOnLine( + this._map, + latlngs, + spacing * (i + 1) + ); + + if (interpolatedPoint) { + interpolatedPoints.push(interpolatedPoint); + derivedLatLngs.push(interpolatedPoint.latLng); + } + } + + derivedBearings = (() => { + let bearings = []; + + for (var i = 0; i < interpolatedPoints.length; i++) { + let bearing = L.GeometryUtil.angle( + this._map, + latlngs[interpolatedPoints[i].predecessor + 1], + latlngs[interpolatedPoints[i].predecessor] + ); + bearings.push(bearing); + } + return bearings; + })(); + } + + let hats = []; + + // Function to build hats based on index and a given hatsize in meters + const pushHats = (size, localHatOptions = {}) => { + let yawn = localHatOptions.yawn ?? options.yawn; + + let leftWingPoint = L.GeometryUtil.destination( + derivedLatLngs[i], + derivedBearings[i] - yawn / 2, + size + ); + + let rightWingPoint = L.GeometryUtil.destination( + derivedLatLngs[i], + derivedBearings[i] + yawn / 2, + size + ); + + let hatPoints = [ + [leftWingPoint.lat, leftWingPoint.lng], + [derivedLatLngs[i].lat, derivedLatLngs[i].lng], + [rightWingPoint.lat, rightWingPoint.lng], + ]; + + let hat = options.fill + ? L.polygon(hatPoints, { ...hatOptions, ...localHatOptions }) + : L.polyline(hatPoints, { ...hatOptions, ...localHatOptions }); + + hats.push(hat); + }; // pushHats() + + // Function to build hats based on pixel input + const pushHatsFromPixels = (size, localHatOptions = {}) => { + let sizePixels = size.slice(0, size.length - 2); + let yawn = localHatOptions.yawn ?? options.yawn; + + let derivedXY = this._map.latLngToLayerPoint(derivedLatLngs[i]); + + let bearing = derivedBearings[i]; + + let thetaLeft = (180 - bearing - yawn / 2) * (Math.PI / 180), + thetaRight = (180 - bearing + yawn / 2) * (Math.PI / 180); + + let dxLeft = sizePixels * Math.sin(thetaLeft), + dyLeft = sizePixels * Math.cos(thetaLeft), + dxRight = sizePixels * Math.sin(thetaRight), + dyRight = sizePixels * Math.cos(thetaRight); + + let leftWingXY = { + x: derivedXY.x + dxLeft, + y: derivedXY.y + dyLeft, + }; + let rightWingXY = { + x: derivedXY.x + dxRight, + y: derivedXY.y + dyRight, + }; + + let leftWingPoint = this._map.layerPointToLatLng(leftWingXY), + rightWingPoint = this._map.layerPointToLatLng(rightWingXY); + + let hatPoints = [ + [leftWingPoint.lat, leftWingPoint.lng], + [derivedLatLngs[i].lat, derivedLatLngs[i].lng], + [rightWingPoint.lat, rightWingPoint.lng], + ]; + + let hat = options.fill + ? L.polygon(hatPoints, { ...hatOptions, ...localHatOptions }) + : L.polyline(hatPoints, { ...hatOptions, ...localHatOptions }); + + hats.push(hat); + }; // pushHatsFromPixels() + + // ------- LOOP THROUGH POINTS IN EACH SEGMENT ---------- // + for (var i = 0; i < derivedLatLngs.length; i++) { + let { perArrowheadOptions, ...globalOptions } = options; + + perArrowheadOptions = perArrowheadOptions ? perArrowheadOptions(i) : {}; + perArrowheadOptions = Object.assign( + globalOptions, + definedProps(perArrowheadOptions) + ); + + size = perArrowheadOptions.size ?? size; + + // ---- If size is chosen in meters ------------------------- + if (isInMeters(size)) { + let hatSize = size.slice(0, size.length - 1); + pushHats(hatSize, perArrowheadOptions); + + // ---- If size is chosen in percent ------------------------ + } else if (isInPercent(size)) { + let sizePercent = size.slice(0, size.length - 1); + let hatSize = (() => { + if ( + options.frequency === 'endonly' && + options.proportionalToTotal + ) { + return (totalLength * sizePercent) / 100; + } else { + let averageDistance = totalLength / (peice.length - 1); + return (averageDistance * sizePercent) / 100; + } + })(); // hatsize calculation + + pushHats(hatSize, perArrowheadOptions); + + // ---- If size is chosen in pixels -------------------------- + } else if (isInPixels(size)) { + pushHatsFromPixels(options.size, perArrowheadOptions); + + // ---- If size unit is not given ----------------------------- + } else { + console.error( + 'Error: Arrowhead size unit not defined. Check your arrowhead options.' + ); + } // if else block for Size + } // for loop for each point witin a peice + + allhats.push(...hats); + }); // forEach peice + + // --------- LOOP THROUGH EACH POLYLINE END ---------------- // + // --------------------------------------------------------- // + + let arrowheads = L.layerGroup(allhats); + this._arrowheads = arrowheads; + + return this; + }, + + getArrowheads: function () { + if (this._arrowheads) { + return this._arrowheads; + } else { + return console.error( + `Error: You tried to call '.getArrowheads() on a shape that does not have a arrowhead. Use '.arrowheads()' to add a arrowheads before trying to call '.getArrowheads()'` + ); + } + }, + + /** + * Builds ghost polylines that are clipped versions of the polylines based on the offsets + * If offsets are used, arrowheads are drawn from 'this._ghosts' rather than 'this' + */ + _buildGhosts: function ({ start, end }) { + if (start || end) { + let latlngs = this.getLatLngs(); + + latlngs = Array.isArray(latlngs[0]) ? latlngs : [latlngs]; + + const newLatLngs = latlngs.map((segment) => { + // Get total distance of original latlngs + const totalLength = (() => { + let total = 0; + for (var i = 0; i < segment.length - 1; i++) { + total += this._map.distance(segment[i], segment[i + 1]); + } + return total; + })(); + + // Modify latlngs to end at interpolated point + if (start) { + let endOffsetInMeters = (() => { + if (isInMeters(start)) { + return Number(start.slice(0, start.length - 1)); + } else if (isInPixels(start)) { + let pixels = Number(start.slice(0, start.length - 2)); + return pixelsToMeters(pixels, this._map); + } + })(); + + let newStart = L.GeometryUtil.interpolateOnLine( + this._map, + segment, + endOffsetInMeters / totalLength + ); + + segment = segment.slice( + newStart.predecessor === -1 ? 1 : newStart.predecessor + 1, + segment.length + ); + segment.unshift(newStart.latLng); + } + + if (end) { + let endOffsetInMeters = (() => { + if (isInMeters(end)) { + return Number(end.slice(0, end.length - 1)); + } else if (isInPixels(end)) { + let pixels = Number(end.slice(0, end.length - 2)); + return pixelsToMeters(pixels, this._map); + } + })(); + + let newEnd = L.GeometryUtil.interpolateOnLine( + this._map, + segment, + (totalLength - endOffsetInMeters) / totalLength + ); + + segment = segment.slice(0, newEnd.predecessor + 1); + segment.push(newEnd.latLng); + } + + return segment; + }); + + this._ghosts = L.polyline(newLatLngs, { + ...this.options, + color: 'rgba(0,0,0,0)', + stroke: 0, + smoothFactor: 0, + interactive: false, + }); + this._ghosts.addTo(this._map); + } + }, + + deleteArrowheads: function () { + if (this._arrowheads) { + this._arrowheads.remove(); + delete this._arrowheads; + delete this._arrowheadOptions; + this._hatsApplied = false; + } + if (this._ghosts) { + this._ghosts.remove(); + } + }, + + _update: function () { + if (!this._map) { + return; + } + + this._clipPoints(); + this._simplifyPoints(); + this._updatePath(); + + if (this._hatsApplied) { + this.buildVectorHats(this._arrowheadOptions); + this._map.addLayer(this._arrowheads); + } + }, + + remove: function () { + if (this._arrowheads) { + this._arrowheads.remove(); + } + if (this._ghosts) { + this._ghosts.remove(); + } + return this.removeFrom(this._map || this._mapToAdd); + }, +}); + +L.LayerGroup.include({ + removeLayer: function (layer) { + var id = layer in this._layers ? layer : this.getLayerId(layer); + + if (this._map && this._layers[id]) { + if (this._layers[id]._arrowheads) { + this._layers[id]._arrowheads.remove(); + } + this._map.removeLayer(this._layers[id]); + } + + delete this._layers[id]; + + return this; + }, + + onRemove: function (map, layer) { + for (var layer in this._layers) { + if (this._layers[layer]) { + this._layers[layer].remove(); + } + } + + this.eachLayer(map.removeLayer, map); + }, +}); + +L.Map.include({ + removeLayer: function (layer) { + var id = L.Util.stamp(layer); + + if (layer._arrowheads) { + layer._arrowheads.remove(); + } + if (layer._ghosts) { + layer._ghosts.remove(); + } + + if (!this._layers[id]) { + return this; + } + + if (this._loaded) { + layer.onRemove(this); + } + + if (layer.getAttribution && this.attributionControl) { + this.attributionControl.removeAttribution(layer.getAttribution()); + } + + delete this._layers[id]; + + if (this._loaded) { + this.fire('layerremove', { layer: layer }); + layer.fire('remove'); + } + + layer._map = layer._mapToAdd = null; + + return this; + }, +}); + +L.GeoJSON.include({ + geometryToLayer: function (geojson, options) { + var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, + coords = geometry ? geometry.coordinates : null, + layers = [], + pointToLayer = options && options.pointToLayer, + _coordsToLatLng = + (options && options.coordsToLatLng) || L.GeoJSON.coordsToLatLng, + latlng, + latlngs, + i, + len; + + if (!coords && !geometry) { + return null; + } + + switch (geometry.type) { + case 'Point': + latlng = _coordsToLatLng(coords); + return this._pointToLayer(pointToLayer, geojson, latlng, options); + + case 'MultiPoint': + for (i = 0, len = coords.length; i < len; i++) { + latlng = _coordsToLatLng(coords[i]); + layers.push( + this._pointToLayer(pointToLayer, geojson, latlng, options) + ); + } + return new L.FeatureGroup(layers); + + case 'LineString': + case 'MultiLineString': + latlngs = L.GeoJSON.coordsToLatLngs( + coords, + geometry.type === 'LineString' ? 0 : 1, + _coordsToLatLng + ); + var polyline = new L.Polyline(latlngs, options); + if (options.arrowheads) { + polyline.arrowheads(options.arrowheads); + } + return polyline; + + case 'Polygon': + case 'MultiPolygon': + latlngs = L.GeoJSON.coordsToLatLngs( + coords, + geometry.type === 'Polygon' ? 1 : 2, + _coordsToLatLng + ); + return new L.Polygon(latlngs, options); + + case 'GeometryCollection': + for (i = 0, len = geometry.geometries.length; i < len; i++) { + var layer = this.geometryToLayer( + { + geometry: geometry.geometries[i], + type: 'Feature', + properties: geojson.properties, + }, + options + ); + + if (layer) { + layers.push(layer); + } + } + return new L.FeatureGroup(layers); + + default: + throw new Error('Invalid GeoJSON object.'); + } + }, + + addData: function (geojson) { + var features = L.Util.isArray(geojson) ? geojson : geojson.features, + i, + len, + feature; + + if (features) { + for (i = 0, len = features.length; i < len; i++) { + // only add this if geometry or geometries are set and not null + feature = features[i]; + if ( + feature.geometries || + feature.geometry || + feature.features || + feature.coordinates + ) { + this.addData(feature); + } + } + return this; + } + + var options = this.options; + + if (options.filter && !options.filter(geojson)) { + return this; + } + + var layer = this.geometryToLayer(geojson, options); + if (!layer) { + return this; + } + layer.feature = L.GeoJSON.asFeature(geojson); + + layer.defaultOptions = layer.options; + this.resetStyle(layer); + + if (options.onEachFeature) { + options.onEachFeature(geojson, layer); + } + + return this.addLayer(layer); + }, + + _pointToLayer: function (pointToLayerFn, geojson, latlng, options) { + return pointToLayerFn + ? pointToLayerFn(geojson, latlng) + : new L.Marker( + latlng, + options && options.markersInheritOptions && options + ); + }, +}); diff --git a/inst/htmlwidgets/lfx-arrowhead/leaflet.geometryutil.js b/inst/htmlwidgets/lfx-arrowhead/leaflet.geometryutil.js new file mode 100644 index 00000000..9bb53b30 --- /dev/null +++ b/inst/htmlwidgets/lfx-arrowhead/leaflet.geometryutil.js @@ -0,0 +1,767 @@ +// Packaging/modules magic dance. +(function (factory) { + var L; + if (typeof define === 'function' && define.amd) { + // AMD + define(['leaflet'], factory); + } else if (typeof module !== 'undefined') { + // Node/CommonJS + L = require('leaflet'); + module.exports = factory(L); + } else { + // Browser globals + if (typeof window.L === 'undefined') + throw 'Leaflet must be loaded first'; + factory(window.L); + } +}(function (L) { +"use strict"; + +L.Polyline._flat = L.LineUtil.isFlat || L.Polyline._flat || function (latlngs) { + // true if it's a flat array of latlngs; false if nested + return !L.Util.isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); +}; + +/** + * @fileOverview Leaflet Geometry utilities for distances and linear referencing. + * @name L.GeometryUtil + */ + +L.GeometryUtil = L.extend(L.GeometryUtil || {}, { + + /** + Shortcut function for planar distance between two {L.LatLng} at current zoom. + + @tutorial distance-length + + @param {L.Map} map Leaflet map to be used for this method + @param {L.LatLng} latlngA geographical point A + @param {L.LatLng} latlngB geographical point B + @returns {Number} planar distance + */ + distance: function (map, latlngA, latlngB) { + return map.latLngToLayerPoint(latlngA).distanceTo(map.latLngToLayerPoint(latlngB)); + }, + + /** + Shortcut function for planar distance between a {L.LatLng} and a segment (A-B). + @param {L.Map} map Leaflet map to be used for this method + @param {L.LatLng} latlng - The position to search + @param {L.LatLng} latlngA geographical point A of the segment + @param {L.LatLng} latlngB geographical point B of the segment + @returns {Number} planar distance + */ + distanceSegment: function (map, latlng, latlngA, latlngB) { + var p = map.latLngToLayerPoint(latlng), + p1 = map.latLngToLayerPoint(latlngA), + p2 = map.latLngToLayerPoint(latlngB); + return L.LineUtil.pointToSegmentDistance(p, p1, p2); + }, + + /** + Shortcut function for converting distance to readable distance. + @param {Number} distance distance to be converted + @param {String} unit 'metric' or 'imperial' + @returns {String} in yard or miles + */ + readableDistance: function (distance, unit) { + var isMetric = (unit !== 'imperial'), + distanceStr; + if (isMetric) { + // show metres when distance is < 1km, then show km + if (distance > 1000) { + distanceStr = (distance / 1000).toFixed(2) + ' km'; + } + else { + distanceStr = distance.toFixed(1) + ' m'; + } + } + else { + distance *= 1.09361; + if (distance > 1760) { + distanceStr = (distance / 1760).toFixed(2) + ' miles'; + } + else { + distanceStr = distance.toFixed(1) + ' yd'; + } + } + return distanceStr; + }, + + /** + Returns true if the latlng belongs to segment A-B + @param {L.LatLng} latlng - The position to search + @param {L.LatLng} latlngA geographical point A of the segment + @param {L.LatLng} latlngB geographical point B of the segment + @param {?Number} [tolerance=0.2] tolerance to accept if latlng belongs really + @returns {boolean} + */ + belongsSegment: function(latlng, latlngA, latlngB, tolerance) { + tolerance = tolerance === undefined ? 0.2 : tolerance; + var hypotenuse = latlngA.distanceTo(latlngB), + delta = latlngA.distanceTo(latlng) + latlng.distanceTo(latlngB) - hypotenuse; + return delta/hypotenuse < tolerance; + }, + + /** + * Returns total length of line + * @tutorial distance-length + * + * @param {L.Polyline|Array|Array} coords Set of coordinates + * @returns {Number} Total length (pixels for Point, meters for LatLng) + */ + length: function (coords) { + var accumulated = L.GeometryUtil.accumulatedLengths(coords); + return accumulated.length > 0 ? accumulated[accumulated.length-1] : 0; + }, + + /** + * Returns a list of accumulated length along a line. + * @param {L.Polyline|Array|Array} coords Set of coordinates + * @returns {Array} Array of accumulated lengths (pixels for Point, meters for LatLng) + */ + accumulatedLengths: function (coords) { + if (typeof coords.getLatLngs == 'function') { + coords = coords.getLatLngs(); + } + if (coords.length === 0) + return []; + var total = 0, + lengths = [0]; + for (var i = 0, n = coords.length - 1; i< n; i++) { + total += coords[i].distanceTo(coords[i+1]); + lengths.push(total); + } + return lengths; + }, + + /** + Returns the closest point of a {L.LatLng} on the segment (A-B) + + @tutorial closest + + @param {L.Map} map Leaflet map to be used for this method + @param {L.LatLng} latlng - The position to search + @param {L.LatLng} latlngA geographical point A of the segment + @param {L.LatLng} latlngB geographical point B of the segment + @returns {L.LatLng} Closest geographical point + */ + closestOnSegment: function (map, latlng, latlngA, latlngB) { + var maxzoom = map.getMaxZoom(); + if (maxzoom === Infinity) + maxzoom = map.getZoom(); + var p = map.project(latlng, maxzoom), + p1 = map.project(latlngA, maxzoom), + p2 = map.project(latlngB, maxzoom), + closest = L.LineUtil.closestPointOnSegment(p, p1, p2); + return map.unproject(closest, maxzoom); + }, + + /** + Returns the closest latlng on layer. + + Accept nested arrays + + @tutorial closest + + @param {L.Map} map Leaflet map to be used for this method + @param {Array|Array>|L.PolyLine|L.Polygon} layer - Layer that contains the result + @param {L.LatLng} latlng - The position to search + @param {?boolean} [vertices=false] - Whether to restrict to path vertices. + @returns {L.LatLng} Closest geographical point or null if layer param is incorrect + */ + closest: function (map, layer, latlng, vertices) { + + var latlngs, + mindist = Infinity, + result = null, + i, n, distance, subResult; + + if (layer instanceof Array) { + // if layer is Array> + if (layer[0] instanceof Array && typeof layer[0][0] !== 'number') { + // if we have nested arrays, we calc the closest for each array + // recursive + for (i = 0; i < layer.length; i++) { + subResult = L.GeometryUtil.closest(map, layer[i], latlng, vertices); + if (subResult && subResult.distance < mindist) { + mindist = subResult.distance; + result = subResult; + } + } + return result; + } else if (layer[0] instanceof L.LatLng + || typeof layer[0][0] === 'number' + || typeof layer[0].lat === 'number') { // we could have a latlng as [x,y] with x & y numbers or {lat, lng} + layer = L.polyline(layer); + } else { + return result; + } + } + + // if we don't have here a Polyline, that means layer is incorrect + // see https://github.com/makinacorpus/Leaflet.GeometryUtil/issues/23 + if (! ( layer instanceof L.Polyline ) ) + return result; + + // deep copy of latlngs + latlngs = JSON.parse(JSON.stringify(layer.getLatLngs().slice(0))); + + // add the last segment for L.Polygon + if (layer instanceof L.Polygon) { + // add the last segment for each child that is a nested array + var addLastSegment = function(latlngs) { + if (L.Polyline._flat(latlngs)) { + latlngs.push(latlngs[0]); + } else { + for (var i = 0; i < latlngs.length; i++) { + addLastSegment(latlngs[i]); + } + } + }; + addLastSegment(latlngs); + } + + // we have a multi polygon / multi polyline / polygon with holes + // use recursive to explore and return the good result + if ( ! L.Polyline._flat(latlngs) ) { + for (i = 0; i < latlngs.length; i++) { + // if we are at the lower level, and if we have a L.Polygon, we add the last segment + subResult = L.GeometryUtil.closest(map, latlngs[i], latlng, vertices); + if (subResult.distance < mindist) { + mindist = subResult.distance; + result = subResult; + } + } + return result; + + } else { + + // Lookup vertices + if (vertices) { + for(i = 0, n = latlngs.length; i < n; i++) { + var ll = latlngs[i]; + distance = L.GeometryUtil.distance(map, latlng, ll); + if (distance < mindist) { + mindist = distance; + result = ll; + result.distance = distance; + } + } + return result; + } + + // Keep the closest point of all segments + for (i = 0, n = latlngs.length; i < n-1; i++) { + var latlngA = latlngs[i], + latlngB = latlngs[i+1]; + distance = L.GeometryUtil.distanceSegment(map, latlng, latlngA, latlngB); + if (distance <= mindist) { + mindist = distance; + result = L.GeometryUtil.closestOnSegment(map, latlng, latlngA, latlngB); + result.distance = distance; + } + } + return result; + } + + }, + + /** + Returns the closest layer to latlng among a list of layers. + + @tutorial closest + + @param {L.Map} map Leaflet map to be used for this method + @param {Array} layers Set of layers + @param {L.LatLng} latlng - The position to search + @returns {object} ``{layer, latlng, distance}`` or ``null`` if list is empty; + */ + closestLayer: function (map, layers, latlng) { + var mindist = Infinity, + result = null, + ll = null, + distance = Infinity; + + for (var i = 0, n = layers.length; i < n; i++) { + var layer = layers[i]; + if (layer instanceof L.LayerGroup) { + // recursive + var subResult = L.GeometryUtil.closestLayer(map, layer.getLayers(), latlng); + if (subResult.distance < mindist) { + mindist = subResult.distance; + result = subResult; + } + } else { + // Single dimension, snap on points, else snap on closest + if (typeof layer.getLatLng == 'function') { + ll = layer.getLatLng(); + distance = L.GeometryUtil.distance(map, latlng, ll); + } + else { + ll = L.GeometryUtil.closest(map, layer, latlng); + if (ll) distance = ll.distance; // Can return null if layer has no points. + } + if (distance < mindist) { + mindist = distance; + result = {layer: layer, latlng: ll, distance: distance}; + } + } + } + return result; + }, + + /** + Returns the n closest layers to latlng among a list of input layers. + + @param {L.Map} map - Leaflet map to be used for this method + @param {Array} layers - Set of layers + @param {L.LatLng} latlng - The position to search + @param {?Number} [n=layers.length] - the expected number of output layers. + @returns {Array} an array of objects ``{layer, latlng, distance}`` or ``null`` if the input is invalid (empty list or negative n) + */ + nClosestLayers: function (map, layers, latlng, n) { + n = typeof n === 'number' ? n : layers.length; + + if (n < 1 || layers.length < 1) { + return null; + } + + var results = []; + var distance, ll; + + for (var i = 0, m = layers.length; i < m; i++) { + var layer = layers[i]; + if (layer instanceof L.LayerGroup) { + // recursive + var subResult = L.GeometryUtil.closestLayer(map, layer.getLayers(), latlng); + results.push(subResult); + } else { + // Single dimension, snap on points, else snap on closest + if (typeof layer.getLatLng == 'function') { + ll = layer.getLatLng(); + distance = L.GeometryUtil.distance(map, latlng, ll); + } + else { + ll = L.GeometryUtil.closest(map, layer, latlng); + if (ll) distance = ll.distance; // Can return null if layer has no points. + } + results.push({layer: layer, latlng: ll, distance: distance}); + } + } + + results.sort(function(a, b) { + return a.distance - b.distance; + }); + + if (results.length > n) { + return results.slice(0, n); + } else { + return results; + } + }, + + /** + * Returns all layers within a radius of the given position, in an ascending order of distance. + @param {L.Map} map Leaflet map to be used for this method + @param {Array} layers - A list of layers. + @param {L.LatLng} latlng - The position to search + @param {?Number} [radius=Infinity] - Search radius in pixels + @return {object[]} an array of objects including layer within the radius, closest latlng, and distance + */ + layersWithin: function(map, layers, latlng, radius) { + radius = typeof radius == 'number' ? radius : Infinity; + + var results = []; + var ll = null; + var distance = 0; + + for (var i = 0, n = layers.length; i < n; i++) { + var layer = layers[i]; + + if (typeof layer.getLatLng == 'function') { + ll = layer.getLatLng(); + distance = L.GeometryUtil.distance(map, latlng, ll); + } + else { + ll = L.GeometryUtil.closest(map, layer, latlng); + if (ll) distance = ll.distance; // Can return null if layer has no points. + } + + if (ll && distance < radius) { + results.push({layer: layer, latlng: ll, distance: distance}); + } + } + + var sortedResults = results.sort(function(a, b) { + return a.distance - b.distance; + }); + + return sortedResults; + }, + + /** + Returns the closest position from specified {LatLng} among specified layers, + with a maximum tolerance in pixels, providing snapping behaviour. + + @tutorial closest + + @param {L.Map} map Leaflet map to be used for this method + @param {Array} layers - A list of layers to snap on. + @param {L.LatLng} latlng - The position to snap + @param {?Number} [tolerance=Infinity] - Maximum number of pixels. + @param {?boolean} [withVertices=true] - Snap to layers vertices or segment points (not only vertex) + @returns {object} with snapped {LatLng} and snapped {Layer} or null if tolerance exceeded. + */ + closestLayerSnap: function (map, layers, latlng, tolerance, withVertices) { + tolerance = typeof tolerance == 'number' ? tolerance : Infinity; + withVertices = typeof withVertices == 'boolean' ? withVertices : true; + + var result = L.GeometryUtil.closestLayer(map, layers, latlng); + if (!result || result.distance > tolerance) + return null; + + // If snapped layer is linear, try to snap on vertices (extremities and middle points) + if (withVertices && typeof result.layer.getLatLngs == 'function') { + var closest = L.GeometryUtil.closest(map, result.layer, result.latlng, true); + if (closest.distance < tolerance) { + result.latlng = closest; + result.distance = L.GeometryUtil.distance(map, closest, latlng); + } + } + return result; + }, + + /** + Returns the Point located on a segment at the specified ratio of the segment length. + @param {L.Point} pA coordinates of point A + @param {L.Point} pB coordinates of point B + @param {Number} the length ratio, expressed as a decimal between 0 and 1, inclusive. + @returns {L.Point} the interpolated point. + */ + interpolateOnPointSegment: function (pA, pB, ratio) { + return L.point( + (pA.x * (1 - ratio)) + (ratio * pB.x), + (pA.y * (1 - ratio)) + (ratio * pB.y) + ); + }, + + /** + Returns the coordinate of the point located on a line at the specified ratio of the line length. + @param {L.Map} map Leaflet map to be used for this method + @param {Array|L.PolyLine} latlngs Set of geographical points + @param {Number} ratio the length ratio, expressed as a decimal between 0 and 1, inclusive + @returns {Object} an object with latLng ({LatLng}) and predecessor ({Number}), the index of the preceding vertex in the Polyline + (-1 if the interpolated point is the first vertex) + */ + interpolateOnLine: function (map, latLngs, ratio) { + latLngs = (latLngs instanceof L.Polyline) ? latLngs.getLatLngs() : latLngs; + var n = latLngs.length; + if (n < 2) { + return null; + } + + // ensure the ratio is between 0 and 1; + ratio = Math.max(Math.min(ratio, 1), 0); + + if (ratio === 0) { + return { + latLng: latLngs[0] instanceof L.LatLng ? latLngs[0] : L.latLng(latLngs[0]), + predecessor: -1 + }; + } + if (ratio == 1) { + return { + latLng: latLngs[latLngs.length -1] instanceof L.LatLng ? latLngs[latLngs.length -1] : L.latLng(latLngs[latLngs.length -1]), + predecessor: latLngs.length - 2 + }; + } + + // project the LatLngs as Points, + // and compute total planar length of the line at max precision + var maxzoom = map.getMaxZoom(); + if (maxzoom === Infinity) + maxzoom = map.getZoom(); + var pts = []; + var lineLength = 0; + for(var i = 0; i < n; i++) { + pts[i] = map.project(latLngs[i], maxzoom); + if(i > 0) + lineLength += pts[i-1].distanceTo(pts[i]); + } + + var ratioDist = lineLength * ratio; + + // follow the line segments [ab], adding lengths, + // until we find the segment where the points should lie on + var cumulativeDistanceToA = 0, cumulativeDistanceToB = 0; + for (var i = 0; cumulativeDistanceToB < ratioDist; i++) { + var pointA = pts[i], pointB = pts[i+1]; + + cumulativeDistanceToA = cumulativeDistanceToB; + cumulativeDistanceToB += pointA.distanceTo(pointB); + } + + if (pointA == undefined && pointB == undefined) { // Happens when line has no length + var pointA = pts[0], pointB = pts[1], i = 1; + } + + // compute the ratio relative to the segment [ab] + var segmentRatio = ((cumulativeDistanceToB - cumulativeDistanceToA) !== 0) ? ((ratioDist - cumulativeDistanceToA) / (cumulativeDistanceToB - cumulativeDistanceToA)) : 0; + var interpolatedPoint = L.GeometryUtil.interpolateOnPointSegment(pointA, pointB, segmentRatio); + return { + latLng: map.unproject(interpolatedPoint, maxzoom), + predecessor: i-1 + }; + }, + + /** + Returns a float between 0 and 1 representing the location of the + closest point on polyline to the given latlng, as a fraction of total line length. + (opposite of L.GeometryUtil.interpolateOnLine()) + @param {L.Map} map Leaflet map to be used for this method + @param {L.PolyLine} polyline Polyline on which the latlng will be search + @param {L.LatLng} latlng The position to search + @returns {Number} Float between 0 and 1 + */ + locateOnLine: function (map, polyline, latlng) { + var latlngs = polyline.getLatLngs(); + if (latlng.equals(latlngs[0])) + return 0.0; + if (latlng.equals(latlngs[latlngs.length-1])) + return 1.0; + + var point = L.GeometryUtil.closest(map, polyline, latlng, false), + lengths = L.GeometryUtil.accumulatedLengths(latlngs), + total_length = lengths[lengths.length-1], + portion = 0, + found = false; + for (var i=0, n = latlngs.length-1; i < n; i++) { + var l1 = latlngs[i], + l2 = latlngs[i+1]; + portion = lengths[i]; + if (L.GeometryUtil.belongsSegment(point, l1, l2, 0.001)) { + portion += l1.distanceTo(point); + found = true; + break; + } + } + if (!found) { + throw "Could not interpolate " + latlng.toString() + " within " + polyline.toString(); + } + return portion / total_length; + }, + + /** + Returns a clone with reversed coordinates. + @param {L.PolyLine} polyline polyline to reverse + @returns {L.PolyLine} polyline reversed + */ + reverse: function (polyline) { + return L.polyline(polyline.getLatLngs().slice(0).reverse()); + }, + + /** + Returns a sub-part of the polyline, from start to end. + If start is superior to end, returns extraction from inverted line. + @param {L.Map} map Leaflet map to be used for this method + @param {L.PolyLine} polyline Polyline on which will be extracted the sub-part + @param {Number} start ratio, expressed as a decimal between 0 and 1, inclusive + @param {Number} end ratio, expressed as a decimal between 0 and 1, inclusive + @returns {Array} new polyline + */ + extract: function (map, polyline, start, end) { + if (start > end) { + return L.GeometryUtil.extract(map, L.GeometryUtil.reverse(polyline), 1.0-start, 1.0-end); + } + + // Bound start and end to [0-1] + start = Math.max(Math.min(start, 1), 0); + end = Math.max(Math.min(end, 1), 0); + + var latlngs = polyline.getLatLngs(), + startpoint = L.GeometryUtil.interpolateOnLine(map, polyline, start), + endpoint = L.GeometryUtil.interpolateOnLine(map, polyline, end); + // Return single point if start == end + if (start == end) { + var point = L.GeometryUtil.interpolateOnLine(map, polyline, end); + return [point.latLng]; + } + // Array.slice() works indexes at 0 + if (startpoint.predecessor == -1) + startpoint.predecessor = 0; + if (endpoint.predecessor == -1) + endpoint.predecessor = 0; + var result = latlngs.slice(startpoint.predecessor+1, endpoint.predecessor+1); + result.unshift(startpoint.latLng); + result.push(endpoint.latLng); + return result; + }, + + /** + Returns true if first polyline ends where other second starts. + @param {L.PolyLine} polyline First polyline + @param {L.PolyLine} other Second polyline + @returns {bool} + */ + isBefore: function (polyline, other) { + if (!other) return false; + var lla = polyline.getLatLngs(), + llb = other.getLatLngs(); + return (lla[lla.length-1]).equals(llb[0]); + }, + + /** + Returns true if first polyline starts where second ends. + @param {L.PolyLine} polyline First polyline + @param {L.PolyLine} other Second polyline + @returns {bool} + */ + isAfter: function (polyline, other) { + if (!other) return false; + var lla = polyline.getLatLngs(), + llb = other.getLatLngs(); + return (lla[0]).equals(llb[llb.length-1]); + }, + + /** + Returns true if first polyline starts where second ends or start. + @param {L.PolyLine} polyline First polyline + @param {L.PolyLine} other Second polyline + @returns {bool} + */ + startsAtExtremity: function (polyline, other) { + if (!other) return false; + var lla = polyline.getLatLngs(), + llb = other.getLatLngs(), + start = lla[0]; + return start.equals(llb[0]) || start.equals(llb[llb.length-1]); + }, + + /** + Returns horizontal angle in degres between two points. + @param {L.Point} a Coordinates of point A + @param {L.Point} b Coordinates of point B + @returns {Number} horizontal angle + */ + computeAngle: function(a, b) { + return (Math.atan2(b.y - a.y, b.x - a.x) * 180 / Math.PI); + }, + + /** + Returns slope (Ax+B) between two points. + @param {L.Point} a Coordinates of point A + @param {L.Point} b Coordinates of point B + @returns {Object} with ``a`` and ``b`` properties. + */ + computeSlope: function(a, b) { + var s = (b.y - a.y) / (b.x - a.x), + o = a.y - (s * a.x); + return {'a': s, 'b': o}; + }, + + /** + Returns LatLng of rotated point around specified LatLng center. + @param {L.LatLng} latlngPoint: point to rotate + @param {double} angleDeg: angle to rotate in degrees + @param {L.LatLng} latlngCenter: center of rotation + @returns {L.LatLng} rotated point + */ + rotatePoint: function(map, latlngPoint, angleDeg, latlngCenter) { + var maxzoom = map.getMaxZoom(); + if (maxzoom === Infinity) + maxzoom = map.getZoom(); + var angleRad = angleDeg*Math.PI/180, + pPoint = map.project(latlngPoint, maxzoom), + pCenter = map.project(latlngCenter, maxzoom), + x2 = Math.cos(angleRad)*(pPoint.x-pCenter.x) - Math.sin(angleRad)*(pPoint.y-pCenter.y) + pCenter.x, + y2 = Math.sin(angleRad)*(pPoint.x-pCenter.x) + Math.cos(angleRad)*(pPoint.y-pCenter.y) + pCenter.y; + return map.unproject(new L.Point(x2,y2), maxzoom); + }, + + /** + Returns the bearing in degrees clockwise from north (0 degrees) + from the first L.LatLng to the second, at the first LatLng + @param {L.LatLng} latlng1: origin point of the bearing + @param {L.LatLng} latlng2: destination point of the bearing + @returns {float} degrees clockwise from north. + */ + bearing: function(latlng1, latlng2) { + var rad = Math.PI / 180, + lat1 = latlng1.lat * rad, + lat2 = latlng2.lat * rad, + lon1 = latlng1.lng * rad, + lon2 = latlng2.lng * rad, + y = Math.sin(lon2 - lon1) * Math.cos(lat2), + x = Math.cos(lat1) * Math.sin(lat2) - + Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1); + + var bearing = ((Math.atan2(y, x) * 180 / Math.PI) + 360) % 360; + return bearing >= 180 ? bearing-360 : bearing; + }, + + /** + Returns the point that is a distance and heading away from + the given origin point. + @param {L.LatLng} latlng: origin point + @param {float} heading: heading in degrees, clockwise from 0 degrees north. + @param {float} distance: distance in meters + @returns {L.latLng} the destination point. + Many thanks to Chris Veness at http://www.movable-type.co.uk/scripts/latlong.html + for a great reference and examples. + */ + destination: function(latlng, heading, distance) { + heading = (heading + 360) % 360; + var rad = Math.PI / 180, + radInv = 180 / Math.PI, + R = 6378137, // approximation of Earth's radius + lon1 = latlng.lng * rad, + lat1 = latlng.lat * rad, + rheading = heading * rad, + sinLat1 = Math.sin(lat1), + cosLat1 = Math.cos(lat1), + cosDistR = Math.cos(distance / R), + sinDistR = Math.sin(distance / R), + lat2 = Math.asin(sinLat1 * cosDistR + cosLat1 * + sinDistR * Math.cos(rheading)), + lon2 = lon1 + Math.atan2(Math.sin(rheading) * sinDistR * + cosLat1, cosDistR - sinLat1 * Math.sin(lat2)); + lon2 = lon2 * radInv; + lon2 = lon2 > 180 ? lon2 - 360 : lon2 < -180 ? lon2 + 360 : lon2; + return L.latLng([lat2 * radInv, lon2]); + }, + + /** + Returns the the angle of the given segment and the Equator in degrees, + clockwise from 0 degrees north. + @param {L.Map} map: Leaflet map to be used for this method + @param {L.LatLng} latlngA: geographical point A of the segment + @param {L.LatLng} latlngB: geographical point B of the segment + @returns {Float} the angle in degrees. + */ + angle: function(map, latlngA, latlngB) { + var pointA = map.latLngToContainerPoint(latlngA), + pointB = map.latLngToContainerPoint(latlngB), + angleDeg = Math.atan2(pointB.y - pointA.y, pointB.x - pointA.x) * 180 / Math.PI + 90; + angleDeg += angleDeg < 0 ? 360 : 0; + return angleDeg; + }, + + /** + Returns a point snaps on the segment and heading away from the given origin point a distance. + @param {L.Map} map: Leaflet map to be used for this method + @param {L.LatLng} latlngA: geographical point A of the segment + @param {L.LatLng} latlngB: geographical point B of the segment + @param {float} distance: distance in meters + @returns {L.latLng} the destination point. + */ + destinationOnSegment: function(map, latlngA, latlngB, distance) { + var angleDeg = L.GeometryUtil.angle(map, latlngA, latlngB), + latlng = L.GeometryUtil.destination(latlngA, angleDeg, distance); + return L.GeometryUtil.closestOnSegment(map, latlng, latlngA, latlngB); + }, +}); + +return L.GeometryUtil; + +})); diff --git a/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu-bindings.js b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu-bindings.js new file mode 100644 index 00000000..c1b4491c --- /dev/null +++ b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu-bindings.js @@ -0,0 +1,70 @@ +/* global LeafletWidget, $, L, Shiny, HTMLWidgets */ +LeafletWidget.methods.addContextmenu = function() { + var map = this; + + if (HTMLWidgets.shinyMode) { + map.on("contextmenu.select", function(e) { + var obj = { + text: e.el.innerText + }; + if (e.data.relatedTarget) { + var data = { + layerId: e.data.relatedTarget.options.layerId, + group: e.data.relatedTarget.options.group, + lat: e.data.relatedTarget.options.lat, + lng: e.data.relatedTarget.options.lng, + label: e.data.relatedTarget.options.label + }; + obj = Object.assign(obj, data); + } else { + obj = Object.assign(obj, e.data.latlng); + } + Shiny.setInputValue(map.id + "_contextmenu_select", obj, {priority: "event"}); + }); + } +}; + +LeafletWidget.methods.showContextmenu = function(coords) { + this.contextmenu.showAt(new L.LatLng(coords.lat[0], coords.lng[0])); +}; +LeafletWidget.methods.hideContextmenu = function() { + this.contextmenu.hide(); +}; +LeafletWidget.methods.enableContextmenu = function() { + this.contextmenu.enable(); +}; +LeafletWidget.methods.disableContextmenu = function() { + this.contextmenu.disable(); +}; +LeafletWidget.methods.addItemContextmenu = function(options) { + // Requires https://github.com/rstudio/leaflet/pull/696 to be merged! + this.contextmenu.addItem(options); +}; +LeafletWidget.methods.insertItemContextmenu = function(options, index) { + // Requires https://github.com/rstudio/leaflet/pull/696 to be merged! + this.contextmenu.insertItem(options, index); +}; +LeafletWidget.methods.removeItemContextmenu = function(index) { + var map = this; + if (Array.isArray(index)) { + index.forEach(function(i) { + map.contextmenu.removeItem(index); + }) + } else { + map.contextmenu.removeItem(index); + } +}; +LeafletWidget.methods.setDisabledContextmenu = function(index, disabled) { + var map = this; + if (Array.isArray(index)) { + index.forEach(function(i) { + map.contextmenu.setDisabled(i, disabled); + }) + } else { + map.contextmenu.setDisabled(index, disabled); + } +}; +LeafletWidget.methods.removeallItemsContextmenu = function() { + this.contextmenu.removeAllItems(); +}; + diff --git a/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.css b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.css new file mode 100644 index 00000000..0b5e2def --- /dev/null +++ b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.css @@ -0,0 +1,54 @@ +.leaflet-contextmenu { + display: none; + box-shadow: 0 1px 7px rgba(0,0,0,0.4); + -webkit-border-radius: 4px; + border-radius: 4px; + padding: 4px 0; + background-color: #fff; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.leaflet-contextmenu a.leaflet-contextmenu-item { + display: block; + color: #222; + font-size: 12px; + line-height: 20px; + text-decoration: none; + padding: 0 12px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + cursor: default; + outline: none; +} + +.leaflet-contextmenu a.leaflet-contextmenu-item-disabled { + opacity: 0.5; +} + +.leaflet-contextmenu a.leaflet-contextmenu-item.over { + background-color: #f4f4f4; + border-top: 1px solid #f0f0f0; + border-bottom: 1px solid #f0f0f0; +} + +.leaflet-contextmenu a.leaflet-contextmenu-item-disabled.over { + background-color: inherit; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; +} + +.leaflet-contextmenu-icon { + margin: 2px 8px 0 0; + width: 16px; + height: 16px; + float: left; + border: 0; +} + +.leaflet-contextmenu-separator { + border-bottom: 1px solid #ccc; + margin: 5px 0; +} diff --git a/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.js b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.js new file mode 100644 index 00000000..7a901e27 --- /dev/null +++ b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.js @@ -0,0 +1,602 @@ +/* + Leaflet.contextmenu, a context menu for Leaflet. + (c) 2015, Adam Ratcliffe, GeoSmart Maps Limited + + @preserve +*/ + +(function(factory) { + // Packaging/modules magic dance + var L; + if (typeof define === 'function' && define.amd) { + // AMD + define(['leaflet'], factory); + } else if (typeof module === 'object' && typeof module.exports === 'object') { + // Node/CommonJS + L = require('leaflet'); + module.exports = factory(L); + } else { + // Browser globals + if (typeof window.L === 'undefined') { + throw new Error('Leaflet must be loaded first'); + } + factory(window.L); + } +})(function(L) { +L.Map.mergeOptions({ + contextmenuItems: [] +}); + +L.Map.ContextMenu = L.Handler.extend({ + _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', + + statics: { + BASE_CLS: 'leaflet-contextmenu' + }, + + initialize: function (map) { + L.Handler.prototype.initialize.call(this, map); + + this._items = []; + this._visible = false; + + var container = this._container = L.DomUtil.create('div', L.Map.ContextMenu.BASE_CLS, map._container); + container.style.zIndex = 10000; + container.style.position = 'absolute'; + + if (map.options.contextmenuWidth) { + container.style.width = map.options.contextmenuWidth + 'px'; + } + + this._createItems(); + + L.DomEvent + .on(container, 'click', L.DomEvent.stop) + .on(container, 'mousedown', L.DomEvent.stop) + .on(container, 'dblclick', L.DomEvent.stop) + .on(container, 'contextmenu', L.DomEvent.stop); + }, + + addHooks: function () { + var container = this._map.getContainer(); + + L.DomEvent + .on(container, 'mouseleave', this._hide, this) + .on(document, 'keydown', this._onKeyDown, this); + + if (L.Browser.touch) { + L.DomEvent.on(document, this._touchstart, this._hide, this); + } + + this._map.on({ + contextmenu: this._show, + mousedown: this._hide, + zoomstart: this._hide + }, this); + }, + + removeHooks: function () { + var container = this._map.getContainer(); + + L.DomEvent + .off(container, 'mouseleave', this._hide, this) + .off(document, 'keydown', this._onKeyDown, this); + + if (L.Browser.touch) { + L.DomEvent.off(document, this._touchstart, this._hide, this); + } + + this._map.off({ + contextmenu: this._show, + mousedown: this._hide, + zoomstart: this._hide + }, this); + }, + + showAt: function (point, data) { + if (point instanceof L.LatLng) { + point = this._map.latLngToContainerPoint(point); + } + + this._showAtPoint(point, data); + }, + + hide: function () { + this._hide(); + }, + + addItem: function (options) { + return this.insertItem(options); + }, + + insertItem: function (options, index) { + index = index !== undefined ? index: this._items.length; + + var item = this._createItem(this._container, options, index); + + this._items.push(item); + + this._sizeChanged = true; + + this._map.fire('contextmenu.additem', { + contextmenu: this, + el: item.el, + index: index + }); + + return item.el; + }, + + removeItem: function (item) { + var container = this._container; + + if (!isNaN(item)) { + item = container.children[item]; + } + + if (item) { + this._removeItem(L.Util.stamp(item)); + + this._sizeChanged = true; + + this._map.fire('contextmenu.removeitem', { + contextmenu: this, + el: item + }); + + return item; + } + + return null; + }, + + removeAllItems: function () { + var items = this._container.children, + item; + + while (items.length) { + item = items[0]; + this._removeItem(L.Util.stamp(item)); + } + return items; + }, + + hideAllItems: function () { + var item, i, l; + + for (i = 0, l = this._items.length; i < l; i++) { + item = this._items[i]; + item.el.style.display = 'none'; + } + }, + + showAllItems: function () { + var item, i, l; + + for (i = 0, l = this._items.length; i < l; i++) { + item = this._items[i]; + item.el.style.display = ''; + } + }, + + setDisabled: function (item, disabled) { + var container = this._container, + itemCls = L.Map.ContextMenu.BASE_CLS + '-item'; + + if (!isNaN(item)) { + item = container.children[item]; + } + + if (item && L.DomUtil.hasClass(item, itemCls)) { + if (disabled) { + L.DomUtil.addClass(item, itemCls + '-disabled'); + this._map.fire('contextmenu.disableitem', { + contextmenu: this, + el: item + }); + } else { + L.DomUtil.removeClass(item, itemCls + '-disabled'); + this._map.fire('contextmenu.enableitem', { + contextmenu: this, + el: item + }); + } + } + }, + + isVisible: function () { + return this._visible; + }, + + _createItems: function () { + var itemOptions = this._map.options.contextmenuItems, + item, + i, l; + + for (i = 0, l = itemOptions.length; i < l; i++) { + this._items.push(this._createItem(this._container, itemOptions[i])); + } + }, + + _createItem: function (container, options, index) { + if (options.separator || options === '-') { + return this._createSeparator(container, index); + } + + var itemCls = L.Map.ContextMenu.BASE_CLS + '-item', + cls = options.disabled ? (itemCls + ' ' + itemCls + '-disabled') : itemCls, + el = this._insertElementAt('a', cls, container, index), + callback = this._createEventHandler(el, options.callback, options.context, options.hideOnSelect), + icon = this._getIcon(options), + iconCls = this._getIconCls(options), + html = ''; + + if (icon) { + html = ''; + } else if (iconCls) { + html = ''; + } + + el.innerHTML = html + options.text; + el.href = '#'; + + L.DomEvent + .on(el, 'mouseover', this._onItemMouseOver, this) + .on(el, 'mouseout', this._onItemMouseOut, this) + .on(el, 'mousedown', L.DomEvent.stopPropagation) + .on(el, 'click', callback); + + if (L.Browser.touch) { + L.DomEvent.on(el, this._touchstart, L.DomEvent.stopPropagation); + } + + // Devices without a mouse fire "mouseover" on tap, but never โ€œmouseout" + if (!L.Browser.pointer) { + L.DomEvent.on(el, 'click', this._onItemMouseOut, this); + } + + return { + id: L.Util.stamp(el), + el: el, + callback: callback + }; + }, + + _removeItem: function (id) { + var item, + el, + i, l, callback; + + for (i = 0, l = this._items.length; i < l; i++) { + item = this._items[i]; + + if (item.id === id) { + el = item.el; + callback = item.callback; + + if (callback) { + L.DomEvent + .off(el, 'mouseover', this._onItemMouseOver, this) + .off(el, 'mouseover', this._onItemMouseOut, this) + .off(el, 'mousedown', L.DomEvent.stopPropagation) + .off(el, 'click', callback); + + if (L.Browser.touch) { + L.DomEvent.off(el, this._touchstart, L.DomEvent.stopPropagation); + } + + if (!L.Browser.pointer) { + L.DomEvent.on(el, 'click', this._onItemMouseOut, this); + } + } + + this._container.removeChild(el); + this._items.splice(i, 1); + + return item; + } + } + return null; + }, + + _createSeparator: function (container, index) { + var el = this._insertElementAt('div', L.Map.ContextMenu.BASE_CLS + '-separator', container, index); + + return { + id: L.Util.stamp(el), + el: el + }; + }, + + _createEventHandler: function (el, func, context, hideOnSelect) { + var me = this, + map = this._map, + disabledCls = L.Map.ContextMenu.BASE_CLS + '-item-disabled', + hideOnSelect = (hideOnSelect !== undefined) ? hideOnSelect : true; + + return function (e) { + if (L.DomUtil.hasClass(el, disabledCls)) { + return; + } + + var map = me._map, + containerPoint = me._showLocation.containerPoint, + layerPoint = map.containerPointToLayerPoint(containerPoint), + latlng = map.layerPointToLatLng(layerPoint), + relatedTarget = me._showLocation.relatedTarget, + data = { + containerPoint: containerPoint, + layerPoint: layerPoint, + latlng: latlng, + relatedTarget: relatedTarget + }; + + if (hideOnSelect) { + me._hide(); + } + + if (func) { + func.call(context || map, data); + } + + me._map.fire('contextmenu.select', { + contextmenu: me, + el: el, + data: data + }); + }; + }, + + _insertElementAt: function (tagName, className, container, index) { + var refEl, + el = document.createElement(tagName); + + el.className = className; + + if (index !== undefined) { + refEl = container.children[index]; + } + + if (refEl) { + container.insertBefore(el, refEl); + } else { + container.appendChild(el); + } + + return el; + }, + + _show: function (e) { + this._showAtPoint(e.containerPoint, e); + }, + + _showAtPoint: function (pt, data) { + if (this._items.length) { + var map = this._map, + event = L.extend(data || {}, {contextmenu: this}); + + this._showLocation = { + containerPoint: pt + }; + if (data && data.relatedTarget){ + this._showLocation.relatedTarget = data.relatedTarget; + } + + this._setPosition(pt); + + if (!this._visible) { + this._container.style.display = 'block'; + this._visible = true; + } + + this._map.fire('contextmenu.show', event); + } + if(data){ + L.DomEvent.stopPropagation(data); + } + }, + + _hide: function () { + if (this._visible) { + this._visible = false; + this._container.style.display = 'none'; + this._map.fire('contextmenu.hide', {contextmenu: this}); + } + }, + + _getIcon: function (options) { + return L.Browser.retina && options.retinaIcon || options.icon; + }, + + _getIconCls: function (options) { + return L.Browser.retina && options.retinaIconCls || options.iconCls; + }, + + _setPosition: function (pt) { + var mapSize = this._map.getSize(), + container = this._container, + containerSize = this._getElementSize(container), + anchor; + + if (this._map.options.contextmenuAnchor) { + anchor = L.point(this._map.options.contextmenuAnchor); + pt = pt.add(anchor); + } + + container._leaflet_pos = pt; + + if (pt.x + containerSize.x > mapSize.x) { + container.style.left = 'auto'; + container.style.right = Math.min(Math.max(mapSize.x - pt.x, 0), mapSize.x - containerSize.x - 1) + 'px'; + } else { + container.style.left = Math.max(pt.x, 0) + 'px'; + container.style.right = 'auto'; + } + + if (pt.y + containerSize.y > mapSize.y) { + container.style.top = 'auto'; + container.style.bottom = Math.min(Math.max(mapSize.y - pt.y, 0), mapSize.y - containerSize.y - 1) + 'px'; + } else { + container.style.top = Math.max(pt.y, 0) + 'px'; + container.style.bottom = 'auto'; + } + }, + + _getElementSize: function (el) { + var size = this._size, + initialDisplay = el.style.display; + + if (!size || this._sizeChanged) { + size = {}; + + el.style.left = '-999999px'; + el.style.right = 'auto'; + el.style.display = 'block'; + + size.x = el.offsetWidth; + size.y = el.offsetHeight; + + el.style.left = 'auto'; + el.style.display = initialDisplay; + + this._sizeChanged = false; + } + + return size; + }, + + _onKeyDown: function (e) { + var key = e.keyCode; + + // If ESC pressed and context menu is visible hide it + if (key === 27) { + this._hide(); + } + }, + + _onItemMouseOver: function (e) { + L.DomUtil.addClass(e.target || e.srcElement, 'over'); + }, + + _onItemMouseOut: function (e) { + L.DomUtil.removeClass(e.target || e.srcElement, 'over'); + } +}); + +L.Map.addInitHook('addHandler', 'contextmenu', L.Map.ContextMenu); +L.Mixin.ContextMenu = { + bindContextMenu: function (options) { + L.setOptions(this, options); + this._initContextMenu(); + + return this; + }, + + unbindContextMenu: function (){ + this.off('contextmenu', this._showContextMenu, this); + + return this; + }, + + addContextMenuItem: function (item) { + this.options.contextmenuItems.push(item); + }, + + removeContextMenuItemWithIndex: function (index) { + var items = []; + for (var i = 0; i < this.options.contextmenuItems.length; i++) { + if (this.options.contextmenuItems[i].index == index){ + items.push(i); + } + } + var elem = items.pop(); + while (elem !== undefined) { + this.options.contextmenuItems.splice(elem,1); + elem = items.pop(); + } + }, + + replaceContextMenuItem: function (item) { + this.removeContextMenuItemWithIndex(item.index); + this.addContextMenuItem(item); + }, + + _initContextMenu: function () { + this._items = []; + + this.on('contextmenu', this._showContextMenu, this); + }, + + _showContextMenu: function (e) { + var itemOptions, + data, pt, i, l; + + if (this._map.contextmenu) { + data = L.extend({relatedTarget: this}, e); + + pt = this._map.mouseEventToContainerPoint(e.originalEvent); + + if (!this.options.contextmenuInheritItems) { + this._map.contextmenu.hideAllItems(); + } + if(this.options.contextmenuWidth) { + this._map.contextmenu._container.style.width = this.options.contextmenuWidth + 'px'; + } + + for (i = 0, l = this.options.contextmenuItems.length; i < l; i++) { + itemOptions = this.options.contextmenuItems[i]; + this._items.push(this._map.contextmenu.insertItem(itemOptions, itemOptions.index)); + } + + //this._map.once('contextmenu.hide', this._hideContextMenu, this); + this._map.once('contextmenu.hide', this._hideContextMenu(this._map), this); + + this._map.contextmenu.showAt(pt, data); + } + }, + + _hideContextMenu: function (m) { + return function() { + var i, l; + + for (i = 0, l = this._items.length; i < l; i++) { + m.contextmenu.removeItem(this._items[i]); + } + this._items.length = 0; + + if (!this.options.contextmenuInheritItems) { + m.contextmenu.showAllItems(); + } + } + } +}; + +var classes = [L.Marker, L.Path, L.ImageOverlay], + defaultOptions = { + contextmenu: false, + contextmenuItems: [], + contextmenuInheritItems: true + }, + cls, i, l; + +for (i = 0, l = classes.length; i < l; i++) { + cls = classes[i]; + + // L.Class should probably provide an empty options hash, as it does not test + // for it here and add if needed + if (!cls.prototype.options) { + cls.prototype.options = defaultOptions; + } else { + cls.mergeOptions(defaultOptions); + } + + cls.addInitHook(function () { + if (this.options.contextmenu) { + this._initContextMenu(); + } + }); + + cls.include(L.Mixin.ContextMenu); +} +return L.Map.ContextMenu; +}); diff --git a/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.min.css b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.min.css new file mode 100644 index 00000000..ef6c6a0e --- /dev/null +++ b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.min.css @@ -0,0 +1 @@ +.leaflet-contextmenu{display:none;box-shadow:0 1px 7px rgba(0,0,0,0.4);-webkit-border-radius:4px;border-radius:4px;padding:4px 0;background-color:#fff;cursor:default;-webkit-user-select:none;-moz-user-select:none;user-select:none}.leaflet-contextmenu a.leaflet-contextmenu-item{display:block;color:#222;font-size:12px;line-height:20px;text-decoration:none;padding:0 12px;border-top:1px solid transparent;border-bottom:1px solid transparent;cursor:default;outline:0}.leaflet-contextmenu a.leaflet-contextmenu-item-disabled{opacity:.5}.leaflet-contextmenu a.leaflet-contextmenu-item.over{background-color:#f4f4f4;border-top:1px solid #f0f0f0;border-bottom:1px solid #f0f0f0}.leaflet-contextmenu a.leaflet-contextmenu-item-disabled.over{background-color:inherit;border-top:1px solid transparent;border-bottom:1px solid transparent}.leaflet-contextmenu-icon{margin:2px 8px 0 0;width:16px;height:16px;float:left;border:0}.leaflet-contextmenu-separator{border-bottom:1px solid #ccc;margin:5px 0} diff --git a/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.min.js b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.min.js new file mode 100644 index 00000000..80a88708 --- /dev/null +++ b/inst/htmlwidgets/lfx-contextmenu/leaflet.contextmenu.min.js @@ -0,0 +1,7 @@ +/* + Leaflet.contextmenu, a context menu for Leaflet. + (c) 2015, Adam Ratcliffe, GeoSmart Maps Limited + + @preserve +*/ +(function(t){var e;if(typeof define==="function"&&define.amd){define(["leaflet"],t)}else if(typeof module==="object"&&typeof module.exports==="object"){e=require("leaflet");module.exports=t(e)}else{if(typeof window.L==="undefined"){throw new Error("Leaflet must be loaded first")}t(window.L)}})(function(t){t.Map.mergeOptions({contextmenuItems:[]});t.Map.ContextMenu=t.Handler.extend({_touchstart:t.Browser.msPointer?"MSPointerDown":t.Browser.pointer?"pointerdown":"touchstart",statics:{BASE_CLS:"leaflet-contextmenu"},initialize:function(e){t.Handler.prototype.initialize.call(this,e);this._items=[];this._visible=false;var n=this._container=t.DomUtil.create("div",t.Map.ContextMenu.BASE_CLS,e._container);n.style.zIndex=1e4;n.style.position="absolute";if(e.options.contextmenuWidth){n.style.width=e.options.contextmenuWidth+"px"}this._createItems();t.DomEvent.on(n,"click",t.DomEvent.stop).on(n,"mousedown",t.DomEvent.stop).on(n,"dblclick",t.DomEvent.stop).on(n,"contextmenu",t.DomEvent.stop)},addHooks:function(){var e=this._map.getContainer();t.DomEvent.on(e,"mouseleave",this._hide,this).on(document,"keydown",this._onKeyDown,this);if(t.Browser.touch){t.DomEvent.on(document,this._touchstart,this._hide,this)}this._map.on({contextmenu:this._show,mousedown:this._hide,zoomstart:this._hide},this)},removeHooks:function(){var e=this._map.getContainer();t.DomEvent.off(e,"mouseleave",this._hide,this).off(document,"keydown",this._onKeyDown,this);if(t.Browser.touch){t.DomEvent.off(document,this._touchstart,this._hide,this)}this._map.off({contextmenu:this._show,mousedown:this._hide,zoomstart:this._hide},this)},showAt:function(e,n){if(e instanceof t.LatLng){e=this._map.latLngToContainerPoint(e)}this._showAtPoint(e,n)},hide:function(){this._hide()},addItem:function(t){return this.insertItem(t)},insertItem:function(t,e){e=e!==undefined?e:this._items.length;var n=this._createItem(this._container,t,e);this._items.push(n);this._sizeChanged=true;this._map.fire("contextmenu.additem",{contextmenu:this,el:n.el,index:e});return n.el},removeItem:function(e){var n=this._container;if(!isNaN(e)){e=n.children[e]}if(e){this._removeItem(t.Util.stamp(e));this._sizeChanged=true;this._map.fire("contextmenu.removeitem",{contextmenu:this,el:e});return e}return null},removeAllItems:function(){var e=this._container.children,n;while(e.length){n=e[0];this._removeItem(t.Util.stamp(n))}return e},hideAllItems:function(){var t,e,n;for(e=0,n=this._items.length;e'}else if(m){u=''}h.innerHTML=u+n.text;h.href="#";t.DomEvent.on(h,"mouseover",this._onItemMouseOver,this).on(h,"mouseout",this._onItemMouseOut,this).on(h,"mousedown",t.DomEvent.stopPropagation).on(h,"click",r);if(t.Browser.touch){t.DomEvent.on(h,this._touchstart,t.DomEvent.stopPropagation)}if(!t.Browser.pointer){t.DomEvent.on(h,"click",this._onItemMouseOut,this)}return{id:t.Util.stamp(h),el:h,callback:r}},_removeItem:function(e){var n,i,o,s,h;for(o=0,s=this._items.length;on.x){i.style.left="auto";i.style.right=Math.min(Math.max(n.x-e.x,0),n.x-o.x-1)+"px"}else{i.style.left=Math.max(e.x,0)+"px";i.style.right="auto"}if(e.y+o.y>n.y){i.style.top="auto";i.style.bottom=Math.min(Math.max(n.y-e.y,0),n.y-o.y-1)+"px"}else{i.style.top=Math.max(e.y,0)+"px";i.style.bottom="auto"}},_getElementSize:function(t){var e=this._size,n=t.style.display;if(!e||this._sizeChanged){e={};t.style.left="-999999px";t.style.right="auto";t.style.display="block";e.x=t.offsetWidth;e.y=t.offsetHeight;t.style.left="auto";t.style.display=n;this._sizeChanged=false}return e},_onKeyDown:function(t){var e=t.keyCode;if(e===27){this._hide()}},_onItemMouseOver:function(e){t.DomUtil.addClass(e.target||e.srcElement,"over")},_onItemMouseOut:function(e){t.DomUtil.removeClass(e.target||e.srcElement,"over")}});t.Map.addInitHook("addHandler","contextmenu",t.Map.ContextMenu);t.Mixin.ContextMenu={bindContextMenu:function(e){t.setOptions(this,e);this._initContextMenu();return this},unbindContextMenu:function(){this.off("contextmenu",this._showContextMenu,this);return this},addContextMenuItem:function(t){this.options.contextmenuItems.push(t)},removeContextMenuItemWithIndex:function(t){var e=[];for(var n=0;n' + xhtml + ''; + }) + .then(function (foreignObject) { + return '' + + foreignObject + ''; + }) + .then(function (svg) { + return 'data:image/svg+xml;charset=utf-8,' + svg; + }); + } + + function newUtil() { + return { + escape: escape, + parseExtension: parseExtension, + mimeType: mimeType, + dataAsUrl: dataAsUrl, + isDataUrl: isDataUrl, + canvasToBlob: canvasToBlob, + resolveUrl: resolveUrl, + getAndEncode: getAndEncode, + uid: uid(), + delay: delay, + asArray: asArray, + escapeXhtml: escapeXhtml, + makeImage: makeImage, + width: width, + height: height + }; + + function mimes() { + /* + * Only WOFF and EOT mime types for fonts are 'real' + * see http://www.iana.org/assignments/media-types/media-types.xhtml + */ + var WOFF = 'application/font-woff'; + var JPEG = 'image/jpeg'; + + return { + 'woff': WOFF, + 'woff2': WOFF, + 'ttf': 'application/font-truetype', + 'eot': 'application/vnd.ms-fontobject', + 'png': 'image/png', + 'jpg': JPEG, + 'jpeg': JPEG, + 'gif': 'image/gif', + 'tiff': 'image/tiff', + 'svg': 'image/svg+xml' + }; + } + + function parseExtension(url) { + var match = /\.([^\.\/]*?)$/g.exec(url); + if (match) return match[1]; + else return ''; + } + + function mimeType(url) { + var extension = parseExtension(url).toLowerCase(); + return mimes()[extension] || ''; + } + + function isDataUrl(url) { + return url.search(/^(data:)/) !== -1; + } + + function toBlob(canvas) { + return new Promise(function (resolve) { + var binaryString = window.atob(canvas.toDataURL().split(',')[1]); + var length = binaryString.length; + var binaryArray = new Uint8Array(length); + + for (var i = 0; i < length; i++) + binaryArray[i] = binaryString.charCodeAt(i); + + resolve(new Blob([binaryArray], { + type: 'image/png' + })); + }); + } + + function canvasToBlob(canvas) { + if (canvas.toBlob) + return new Promise(function (resolve) { + canvas.toBlob(resolve); + }); + + return toBlob(canvas); + } + + function resolveUrl(url, baseUrl) { + var doc = document.implementation.createHTMLDocument(); + var base = doc.createElement('base'); + doc.head.appendChild(base); + var a = doc.createElement('a'); + doc.body.appendChild(a); + base.href = baseUrl; + a.href = url; + return a.href; + } + + function uid() { + var index = 0; + + return function () { + return 'u' + fourRandomChars() + index++; + + function fourRandomChars() { + /* see http://stackoverflow.com/a/6248722/2519373 */ + return ('0000' + (Math.random() * Math.pow(36, 4) << 0).toString(36)).slice(-4); + } + }; + } + + function makeImage(uri) { + return new Promise(function (resolve, reject) { + var image = new Image(); + image.onload = function () { + resolve(image); + }; + image.onerror = reject; + image.src = uri; + }); + } + + function getAndEncode(url) { + var TIMEOUT = 30000; + if(domtoimage.impl.options.cacheBust) { + // Cache bypass so we dont have CORS issues with cached images + // Source: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache + url += ((/\?/).test(url) ? "&" : "?") + (new Date()).getTime(); + } + + return new Promise(function (resolve) { + var request = new XMLHttpRequest(); + + request.onreadystatechange = done; + request.ontimeout = timeout; + request.responseType = 'blob'; + request.timeout = TIMEOUT; + request.open('GET', url, true); + request.send(); + + var placeholder; + if(domtoimage.impl.options.imagePlaceholder) { + var split = domtoimage.impl.options.imagePlaceholder.split(/,/); + if(split && split[1]) { + placeholder = split[1]; + } + } + + function done() { + if (request.readyState !== 4) return; + + if (request.status !== 200) { + if(placeholder) { + resolve(placeholder); + } else { + fail('cannot fetch resource: ' + url + ', status: ' + request.status); + } + + return; + } + + var encoder = new FileReader(); + encoder.onloadend = function () { + var content = encoder.result.split(/,/)[1]; + resolve(content); + }; + encoder.readAsDataURL(request.response); + } + + function timeout() { + if(placeholder) { + resolve(placeholder); + } else { + fail('timeout of ' + TIMEOUT + 'ms occured while fetching resource: ' + url); + } + } + + function fail(message) { + console.error(message); + resolve(''); + } + }); + } + + function dataAsUrl(content, type) { + return 'data:' + type + ';base64,' + content; + } + + function escape(string) { + return string.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1'); + } + + function delay(ms) { + return function (arg) { + return new Promise(function (resolve) { + setTimeout(function () { + resolve(arg); + }, ms); + }); + }; + } + + function asArray(arrayLike) { + var array = []; + var length = arrayLike.length; + for (var i = 0; i < length; i++) array.push(arrayLike[i]); + return array; + } + + function escapeXhtml(string) { + return string.replace(/#/g, '%23').replace(/\n/g, '%0A'); + } + + function width(node) { + var leftBorder = px(node, 'border-left-width'); + var rightBorder = px(node, 'border-right-width'); + return node.scrollWidth + leftBorder + rightBorder; + } + + function height(node) { + var topBorder = px(node, 'border-top-width'); + var bottomBorder = px(node, 'border-bottom-width'); + return node.scrollHeight + topBorder + bottomBorder; + } + + function px(node, styleProperty) { + var value = window.getComputedStyle(node).getPropertyValue(styleProperty); + return parseFloat(value.replace('px', '')); + } + } + + function newInliner() { + var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g; + + return { + inlineAll: inlineAll, + shouldProcess: shouldProcess, + impl: { + readUrls: readUrls, + inline: inline + } + }; + + function shouldProcess(string) { + return string.search(URL_REGEX) !== -1; + } + + function readUrls(string) { + var result = []; + var match; + while ((match = URL_REGEX.exec(string)) !== null) { + result.push(match[1]); + } + return result.filter(function (url) { + return !util.isDataUrl(url); + }); + } + + function inline(string, url, baseUrl, get) { + return Promise.resolve(url) + .then(function (url) { + return baseUrl ? util.resolveUrl(url, baseUrl) : url; + }) + .then(get || util.getAndEncode) + .then(function (data) { + return util.dataAsUrl(data, util.mimeType(url)); + }) + .then(function (dataUrl) { + return string.replace(urlAsRegex(url), '$1' + dataUrl + '$3'); + }); + + function urlAsRegex(url) { + return new RegExp('(url\\([\'"]?)(' + util.escape(url) + ')([\'"]?\\))', 'g'); + } + } + + function inlineAll(string, baseUrl, get) { + if (nothingToInline()) return Promise.resolve(string); + + return Promise.resolve(string) + .then(readUrls) + .then(function (urls) { + var done = Promise.resolve(string); + urls.forEach(function (url) { + done = done.then(function (string) { + return inline(string, url, baseUrl, get); + }); + }); + return done; + }); + + function nothingToInline() { + return !shouldProcess(string); + } + } + } + + function newFontFaces() { + return { + resolveAll: resolveAll, + impl: { + readAll: readAll + } + }; + + function resolveAll() { + return readAll(document) + .then(function (webFonts) { + return Promise.all( + webFonts.map(function (webFont) { + return webFont.resolve(); + }) + ); + }) + .then(function (cssStrings) { + return cssStrings.join('\n'); + }); + } + + function readAll() { + return Promise.resolve(util.asArray(document.styleSheets)) + .then(getCssRules) + .then(selectWebFontRules) + .then(function (rules) { + return rules.map(newWebFont); + }); + + function selectWebFontRules(cssRules) { + return cssRules + .filter(function (rule) { + return rule.type === CSSRule.FONT_FACE_RULE; + }) + .filter(function (rule) { + return inliner.shouldProcess(rule.style.getPropertyValue('src')); + }); + } + + function getCssRules(styleSheets) { + var cssRules = []; + styleSheets.forEach(function (sheet) { + try { + util.asArray(sheet.cssRules || []).forEach(cssRules.push.bind(cssRules)); + } catch (e) { + console.log('Error while reading CSS rules from ' + sheet.href, e.toString()); + } + }); + return cssRules; + } + + function newWebFont(webFontRule) { + return { + resolve: function resolve() { + var baseUrl = (webFontRule.parentStyleSheet || {}).href; + return inliner.inlineAll(webFontRule.cssText, baseUrl); + }, + src: function () { + return webFontRule.style.getPropertyValue('src'); + } + }; + } + } + } + + function newImages() { + return { + inlineAll: inlineAll, + impl: { + newImage: newImage + } + }; + + function newImage(element) { + return { + inline: inline + }; + + function inline(get) { + if (util.isDataUrl(element.src)) return Promise.resolve(); + + return Promise.resolve(element.src) + .then(get || util.getAndEncode) + .then(function (data) { + return util.dataAsUrl(data, util.mimeType(element.src)); + }) + .then(function (dataUrl) { + return new Promise(function (resolve, reject) { + element.onload = resolve; + element.onerror = reject; + element.src = dataUrl; + }); + }); + } + } + + function inlineAll(node) { + if (!(node instanceof Element)) return Promise.resolve(node); + + return inlineBackground(node) + .then(function () { + if (node instanceof HTMLImageElement) + return newImage(node).inline(); + else + return Promise.all( + util.asArray(node.childNodes).map(function (child) { + return inlineAll(child); + }) + ); + }); + + function inlineBackground(node) { + var background = node.style.getPropertyValue('background'); + + if (!background) return Promise.resolve(node); + + return inliner.inlineAll(background) + .then(function (inlined) { + node.style.setProperty( + 'background', + inlined, + node.style.getPropertyPriority('background') + ); + }) + .then(function () { + return node; + }); + } + } + } +})(this); diff --git a/inst/htmlwidgets/lfx-easyprint/lfx-easyprint-bindings.js b/inst/htmlwidgets/lfx-easyprint/lfx-easyprint-bindings.js index 151b9ca7..80c4534d 100644 --- a/inst/htmlwidgets/lfx-easyprint/lfx-easyprint-bindings.js +++ b/inst/htmlwidgets/lfx-easyprint/lfx-easyprint-bindings.js @@ -7,7 +7,22 @@ LeafletWidget.methods.addEasyprint = function(options) { delete map.easyprint; } - map.easyprint = new L.Control.EasyPrint(options); + // If a group name of a tilelayer is given, get the layer (the method isLoading will be used) + if (options.tileLayer !== undefined) { + // If multiple group names are given, take only the first layer + if (Array.isArray(options.tileLayer)) { + options.tileLayer = options.tileLayer[0]; + } + var layers = map.layerManager._byGroup[options.tileLayer] + if (layers !== undefined) { + options.tileLayer = layers[Object.keys(layers)]; + } else { + options.tileLayer = undefined; + } + } + + options.sizeModes = Object.values(options.sizeModes) + map.easyprint = L.easyPrint(options); map.controls.add(map.easyprint); }).call(this); @@ -26,8 +41,10 @@ LeafletWidget.methods.removeEasyprint = function() { LeafletWidget.methods.easyprintMap = function(sizeModes, filename) { (function(){ if (this.easyprint) { - // Hack based on @urakovaliaskar in https://github.com/rowanwins/leaflet-easyPrint/issues/105#issuecomment-550370793_ - this.easyprint.printMap(sizeModes + " page", filename); + if (typeof sizeModes === "object" && sizeModes.className) { + sizeModes.target = {className: sizeModes.className} + } + this.easyprint.printMap(sizeModes, filename); } }).call(this); }; diff --git a/inst/htmlwidgets/lfx-easyprint/lfx-easyprint_src.js b/inst/htmlwidgets/lfx-easyprint/lfx-easyprint_full.js similarity index 71% rename from inst/htmlwidgets/lfx-easyprint/lfx-easyprint_src.js rename to inst/htmlwidgets/lfx-easyprint/lfx-easyprint_full.js index 9236bd4e..324ffc38 100644 --- a/inst/htmlwidgets/lfx-easyprint/lfx-easyprint_src.js +++ b/inst/htmlwidgets/lfx-easyprint/lfx-easyprint_full.js @@ -1,11 +1,9 @@ -var domtoimage = require('dom-to-image'); -var fileSaver = require('file-saver'); L.Control.EasyPrint = L.Control.extend({ options: { title: 'Print map', position: 'topleft', - sizeModes: ['Current'], + sizeModes: ['CurrentSize'], filename: 'map', exportOnly: false, hidden: false, @@ -13,21 +11,21 @@ L.Control.EasyPrint = L.Control.extend({ hideControlContainer: true, hideClasses: [], customWindowTitle: window.document.title, - spinnerBgCOlor: '#0DC5C1', + spinnerBgColor: '#0DC5C1', customSpinnerClass: 'epLoader', defaultSizeTitles: { - Current: 'Current Size', + CurrentSize: 'CurrentSize', A4Landscape: 'A4 Landscape', A4Portrait: 'A4 Portrait' } }, - onAdd: function () { + onAdd: function () { this.mapContainer = this._map.getContainer(); this.options.sizeModes = this.options.sizeModes.map(function (sizeMode) { - if (sizeMode === 'Current') { + if (sizeMode === 'CurrentSize') { return { - name: this.options.defaultSizeTitles.Current, + name: this.options.defaultSizeTitles.CurrentSize, className: 'CurrentSize' } } @@ -36,7 +34,7 @@ L.Control.EasyPrint = L.Control.extend({ height: this._a4PageSize.height, width: this._a4PageSize.width, name: this.options.defaultSizeTitles.A4Landscape, - className: 'A4Landscape page' + className: 'A4Landscape' } } if (sizeMode === 'A4Portrait') { @@ -44,12 +42,12 @@ L.Control.EasyPrint = L.Control.extend({ height: this._a4PageSize.width, width: this._a4PageSize.height, name: this.options.defaultSizeTitles.A4Portrait, - className: 'A4Portrait page' + className: 'A4Portrait' } }; return sizeMode; }, this); - + var container = L.DomUtil.create('div', 'leaflet-control-easyPrint leaflet-bar leaflet-control'); if (!this.options.hidden) { this._addCss(); @@ -83,13 +81,16 @@ L.Control.EasyPrint = L.Control.extend({ } if (!this.options.exportOnly) { this._page = window.open("", "_blank", 'toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,left=10, top=10, width=200, height=250, visible=none'); - this._page.document.write(this._createSpinner(this.options.customWindowTitle, this.options.customSpinnerClass, this.options.spinnerBgCOlor)); + this._page.document.write(this._createSpinner(this.options.customWindowTitle, this.options.customSpinnerClass, this.options.spinnerBgColor)); } + //var mapsize = this._map.getSize() this.originalState = { mapWidth: this.mapContainer.style.width, + //mapWidth: mapsize.x, widthWasAuto: false, widthWasPercentage: false, mapHeight: this.mapContainer.style.height, + //mapHeight: mapsize.y, zoom: this._map.getZoom(), center: this._map.getCenter() }; @@ -106,7 +107,7 @@ L.Control.EasyPrint = L.Control.extend({ this._togglePageSizeButtons({type: null}); } if (this.options.hideControlContainer) { - this._toggleControls(); + this._toggleControls(); } if (this.options.hideClasses) { this._toggleClasses(this.options.hideClasses); @@ -125,25 +126,30 @@ L.Control.EasyPrint = L.Control.extend({ _createImagePlaceholder: function (sizeMode) { var plugin = this; domtoimage.toPng(this.mapContainer, { - width: parseInt(this.originalState.mapWidth.replace('px')), - height: parseInt(this.originalState.mapHeight.replace('px')) - }) - .then(function (dataUrl) { - plugin.blankDiv = document.createElement("div"); - var blankDiv = plugin.blankDiv; - plugin.outerContainer.parentElement.insertBefore(blankDiv, plugin.outerContainer); - blankDiv.className = 'epHolder'; - blankDiv.style.backgroundImage = 'url("' + dataUrl + '")'; - blankDiv.style.position = 'absolute'; - blankDiv.style.zIndex = 1011; - blankDiv.style.display = 'initial'; - blankDiv.style.width = plugin.originalState.mapWidth; - blankDiv.style.height = plugin.originalState.mapHeight; - plugin._resizeAndPrintMap(sizeMode); - }) - .catch(function (error) { - console.error('oops, something went wrong!', error); - }); + width: parseInt(this.originalState.mapWidth.replace('px')), + height: parseInt(this.originalState.mapHeight.replace('px')) + }) + .then(function (dataUrl) { + plugin.blankDiv = document.createElement("div"); + var blankDiv = plugin.blankDiv; + plugin.outerContainer.parentElement.insertBefore(blankDiv, plugin.outerContainer); + blankDiv.className = 'epHolder'; + blankDiv.style.backgroundImage = 'url("' + dataUrl + '")'; + blankDiv.style.position = 'absolute'; + blankDiv.style.zIndex = 1011; + blankDiv.style.display = 'initial'; + blankDiv.style.width = plugin.originalState.mapWidth; + blankDiv.style.height = plugin.originalState.mapHeight; + plugin._resizeAndPrintMap(sizeMode); + }) + .catch(function (error) { + plugin._toggleControls(true); + plugin._toggleClasses(plugin.options.hideClasses, true); + if (plugin.outerContainer) { + plugin._removeOuterContainer(plugin.mapContainer, plugin.outerContainer, plugin.blankDiv) + } + console.error('oops, something went wrong!', error); + }) }, _resizeAndPrintMap: function (sizeMode) { @@ -171,7 +177,7 @@ L.Control.EasyPrint = L.Control.extend({ _pausePrint: function (sizeMode) { var plugin = this - var loadingTest = setInterval(function () { + var loadingTest = setInterval(function () { if(!plugin.options.tileLayer.isLoading()) { clearInterval(loadingTest); plugin._printOpertion(sizeMode) @@ -182,51 +188,57 @@ L.Control.EasyPrint = L.Control.extend({ _printOpertion: function (sizemode) { var plugin = this; var widthForExport = this.mapContainer.style.width - if (this.originalState.widthWasAuto && sizemode === 'CurrentSize' || this.originalState.widthWasPercentage && sizemode === 'CurrentSize') { + if (this.originalState.widthWasAuto && sizemode === 'CurrentSize' || + this.originalState.widthWasPercentage && sizemode === 'CurrentSize') { widthForExport = this.originalState.mapWidth } - domtoimage.toPng(plugin.mapContainer, { - width: parseInt(widthForExport), - height: parseInt(plugin.mapContainer.style.height.replace('px')) - }) - .then(function (dataUrl) { - var blob = plugin._dataURItoBlob(dataUrl); - if (plugin.options.exportOnly) { - fileSaver.saveAs(blob, plugin.options.filename + '.png'); - } else { - plugin._sendToBrowserPrint(dataUrl, plugin.orientation); - } - plugin._toggleControls(true); - plugin._toggleClasses(plugin.options.hideClasses, true); - if (plugin.outerContainer) { - if (plugin.originalState.widthWasAuto) { - plugin.mapContainer.style.width = 'auto' - } else if (plugin.originalState.widthWasPercentage) { - plugin.mapContainer.style.width = plugin.originalState.percentageWidth - } - else { - plugin.mapContainer.style.width = plugin.originalState.mapWidth; - } - plugin.mapContainer.style.height = plugin.originalState.mapHeight; - plugin._removeOuterContainer(plugin.mapContainer, plugin.outerContainer, plugin.blankDiv) - plugin._map.invalidateSize(); - plugin._map.setView(plugin.originalState.center); - plugin._map.setZoom(plugin.originalState.zoom); - } - plugin._map.fire("easyPrint-finished"); - }) - .catch(function (error) { - console.error('Print operation failed', error); - }); + function restorePlugin(plugin) { + plugin._toggleControls(true); + plugin._toggleClasses(plugin.options.hideClasses, true); + + if (plugin.outerContainer) { + if (plugin.originalState.widthWasAuto) { + plugin.mapContainer.style.width = 'auto' + } else if (plugin.originalState.widthWasPercentage) { + plugin.mapContainer.style.width = plugin.originalState.percentageWidth + } + else { + plugin.mapContainer.style.width = plugin.originalState.mapWidth; + } + plugin.mapContainer.style.height = plugin.originalState.mapHeight; + plugin._removeOuterContainer(plugin.mapContainer, plugin.outerContainer, plugin.blankDiv) + plugin._map.invalidateSize(); + plugin._map.setView(plugin.originalState.center); + plugin._map.setZoom(plugin.originalState.zoom); + } + } + domtoimage.toPng(plugin.mapContainer, { + width: parseInt(widthForExport), + height: parseInt(plugin.mapContainer.style.height.replace('px')) + }) + .then(function (dataUrl) { + var blob = plugin._dataURItoBlob(dataUrl); + if (plugin.options.exportOnly) { + saveAs(blob, plugin.options.filename + '.png'); + } else { + plugin._sendToBrowserPrint(dataUrl, plugin.orientation); + } + restorePlugin(plugin); + plugin._map.fire("easyPrint-finished"); + }) + .catch(function (error) { + console.error('Print operation failed', error); + restorePlugin(plugin); + }) }, _sendToBrowserPrint: function (img, orientation) { - this._page.resizeTo(600, 800); + this._page.resizeTo(600, 800); var pageContent = this._createNewWindow(img, orientation, this) this._page.document.body.innerHTML = '' this._page.document.write(pageContent); - this._page.document.close(); + this._page.document.close(); }, _createSpinner: function (title, spinnerClass, spinnerColor) { @@ -234,93 +246,93 @@ L.Control.EasyPrint = L.Control.extend({ body{ background: ` + spinnerColor + `; } - .epLoader, - .epLoader:before, - .epLoader:after { - border-radius: 50%; - } - .epLoader { - color: #ffffff; + .epLoader, + .epLoader:before, + .epLoader:after { + border-radius: 50%; + } + .epLoader { + color: #ffffff; font-size: 11px; - text-indent: -99999em; - margin: 55px auto; - position: relative; - width: 10em; - height: 10em; - box-shadow: inset 0 0 0 1em; - -webkit-transform: translateZ(0); - -ms-transform: translateZ(0); - transform: translateZ(0); - } - .epLoader:before, - .epLoader:after { - position: absolute; - content: ''; - } - .epLoader:before { - width: 5.2em; - height: 10.2em; - background: #0dc5c1; + text-indent: -99999em; + margin: 55px auto; + position: relative; + width: 10em; + height: 10em; + box-shadow: inset 0 0 0 1em; + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); + } + .epLoader:before, + .epLoader:after { + position: absolute; + content: ''; + } + .epLoader:before { + width: 5.2em; + height: 10.2em; + background: #0dc5c1; border-radius: 10.2em 0 0 10.2em; - top: -0.1em; - left: -0.1em; - -webkit-transform-origin: 5.2em 5.1em; - transform-origin: 5.2em 5.1em; - -webkit-animation: load2 2s infinite ease 1.5s; - animation: load2 2s infinite ease 1.5s; - } - .epLoader:after { - width: 5.2em; - height: 10.2em; - background: #0dc5c1; + top: -0.1em; + left: -0.1em; + -webkit-transform-origin: 5.2em 5.1em; + transform-origin: 5.2em 5.1em; + -webkit-animation: load2 2s infinite ease 1.5s; + animation: load2 2s infinite ease 1.5s; + } + .epLoader:after { + width: 5.2em; + height: 10.2em; + background: #0dc5c1; border-radius: 0 10.2em 10.2em 0; - top: -0.1em; - left: 5.1em; - -webkit-transform-origin: 0px 5.1em; - transform-origin: 0px 5.1em; - -webkit-animation: load2 2s infinite ease; - animation: load2 2s infinite ease; + top: -0.1em; + left: 5.1em; + -webkit-transform-origin: 0px 5.1em; + transform-origin: 0px 5.1em; + -webkit-animation: load2 2s infinite ease; + animation: load2 2s infinite ease; + } + @-webkit-keyframes load2 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } - @-webkit-keyframes load2 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } - @keyframes load2 { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } + } + @keyframes load2 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } - -
Loading...
`; + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + +
Loading...
`; }, _createNewWindow: function (img, orientation, plugin) { return ` - - - `; + function step2(){window.print();window.close()} + + `; }, _createOuterContainer: function (mapDiv) { - var outerContainer = document.createElement('div'); - mapDiv.parentNode.insertBefore(outerContainer, mapDiv); + var outerContainer = document.createElement('div'); + mapDiv.parentNode.insertBefore(outerContainer, mapDiv); mapDiv.parentNode.removeChild(mapDiv); outerContainer.appendChild(mapDiv); outerContainer.style.width = mapDiv.style.width; @@ -334,22 +346,22 @@ L.Control.EasyPrint = L.Control.extend({ if (outerContainer.parentNode) { outerContainer.parentNode.insertBefore(mapDiv, outerContainer); outerContainer.parentNode.removeChild(blankDiv); - outerContainer.parentNode.removeChild(outerContainer); + outerContainer.parentNode.removeChild(outerContainer); } }, _addCss: function () { var css = document.createElement("style"); css.type = "text/css"; - css.innerHTML = `.leaflet-control-easyPrint-button { + css.innerHTML = `.leaflet-control-easyPrint-button { background-image: url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPGc+Cgk8cGF0aCBkPSJNMTI4LDMyaDI1NnY2NEgxMjhWMzJ6IE00ODAsMTI4SDMyYy0xNy42LDAtMzIsMTQuNC0zMiwzMnYxNjBjMCwxNy42LDE0LjM5OCwzMiwzMiwzMmg5NnYxMjhoMjU2VjM1Mmg5NiAgIGMxNy42LDAsMzItMTQuNCwzMi0zMlYxNjBDNTEyLDE0Mi40LDQ5Ny42LDEyOCw0ODAsMTI4eiBNMzUyLDQ0OEgxNjBWMjg4aDE5MlY0NDh6IE00ODcuMTk5LDE3NmMwLDEyLjgxMy0xMC4zODcsMjMuMi0yMy4xOTcsMjMuMiAgIGMtMTIuODEyLDAtMjMuMjAxLTEwLjM4Ny0yMy4yMDEtMjMuMnMxMC4zODktMjMuMiwyMy4xOTktMjMuMkM0NzYuODE0LDE1Mi44LDQ4Ny4xOTksMTYzLjE4Nyw0ODcuMTk5LDE3NnoiIGZpbGw9IiMwMDAwMDAiLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K); - background-size: 16px 16px; - cursor: pointer; + background-size: 16px 16px; + cursor: pointer; } - .leaflet-control-easyPrint-button-export { + .leaflet-control-easyPrint-button-export { background-image: url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTYuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDQzMy41IDQzMy41IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MzMuNSA0MzMuNTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxnIGlkPSJmaWxlLWRvd25sb2FkIj4KCQk8cGF0aCBkPSJNMzk1LjI1LDE1M2gtMTAyVjBoLTE1M3YxNTNoLTEwMmwxNzguNSwxNzguNUwzOTUuMjUsMTUzeiBNMzguMjUsMzgyLjV2NTFoMzU3di01MUgzOC4yNXoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K); - background-size: 16px 16px; - cursor: pointer; + background-size: 16px 16px; + cursor: pointer; } .easyPrintHolder a { background-size: 16px 16px; @@ -358,10 +370,10 @@ L.Control.EasyPrint = L.Control.extend({ .easyPrintHolder .CurrentSize{ background-image: url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTZweCIgdmVyc2lvbj0iMS4xIiBoZWlnaHQ9IjE2cHgiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjQgNjQiPgogIDxnPgogICAgPGcgZmlsbD0iIzFEMUQxQiI+CiAgICAgIDxwYXRoIGQ9Ik0yNS4yNTUsMzUuOTA1TDQuMDE2LDU3LjE0NVY0Ni41OWMwLTEuMTA4LTAuODk3LTIuMDA4LTIuMDA4LTIuMDA4QzAuODk4LDQ0LjU4MiwwLDQ1LjQ4MSwwLDQ2LjU5djE1LjQwMiAgICBjMCwwLjI2MSwwLjA1MywwLjUyMSwwLjE1NSwwLjc2N2MwLjIwMywwLjQ5MiwwLjU5NCwwLjg4MiwxLjA4NiwxLjA4N0MxLjQ4Niw2My45NDcsMS43NDcsNjQsMi4wMDgsNjRoMTUuNDAzICAgIGMxLjEwOSwwLDIuMDA4LTAuODk4LDIuMDA4LTIuMDA4cy0wLjg5OC0yLjAwOC0yLjAwOC0yLjAwOEg2Ljg1NWwyMS4yMzgtMjEuMjRjMC43ODQtMC43ODQsMC43ODQtMi4wNTUsMC0yLjgzOSAgICBTMjYuMDM5LDM1LjEyMSwyNS4yNTUsMzUuOTA1eiIgZmlsbD0iIzAwMDAwMCIvPgogICAgICA8cGF0aCBkPSJtNjMuODQ1LDEuMjQxYy0wLjIwMy0wLjQ5MS0wLjU5NC0wLjg4Mi0xLjA4Ni0xLjA4Ny0wLjI0NS0wLjEwMS0wLjUwNi0wLjE1NC0wLjc2Ny0wLjE1NGgtMTUuNDAzYy0xLjEwOSwwLTIuMDA4LDAuODk4LTIuMDA4LDIuMDA4czAuODk4LDIuMDA4IDIuMDA4LDIuMDA4aDEwLjU1NmwtMjEuMjM4LDIxLjI0Yy0wLjc4NCwwLjc4NC0wLjc4NCwyLjA1NSAwLDIuODM5IDAuMzkyLDAuMzkyIDAuOTA2LDAuNTg5IDEuNDIsMC41ODlzMS4wMjctMC4xOTcgMS40MTktMC41ODlsMjEuMjM4LTIxLjI0djEwLjU1NWMwLDEuMTA4IDAuODk3LDIuMDA4IDIuMDA4LDIuMDA4IDEuMTA5LDAgMi4wMDgtMC44OTkgMi4wMDgtMi4wMDh2LTE1LjQwMmMwLTAuMjYxLTAuMDUzLTAuNTIyLTAuMTU1LTAuNzY3eiIgZmlsbD0iIzAwMDAwMCIvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==) } - .easyPrintHolder .page { + .easyPrintHolder .A4Landscape, .easyPrintHolder .A4Portrait { background-image: url(data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTguMS4xLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ0NC44MzMgNDQ0LjgzMyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDQ0LjgzMyA0NDQuODMzOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4Ij4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNNTUuMjUsNDQ0LjgzM2gzMzQuMzMzYzkuMzUsMCwxNy03LjY1LDE3LTE3VjEzOS4xMTdjMC00LjgxNy0xLjk4My05LjM1LTUuMzgzLTEyLjQ2N0wyNjkuNzMzLDQuNTMzICAgIEMyNjYuNjE3LDEuNywyNjIuMzY3LDAsMjU4LjExNywwSDU1LjI1Yy05LjM1LDAtMTcsNy42NS0xNywxN3Y0MTAuODMzQzM4LjI1LDQzNy4xODMsNDUuOSw0NDQuODMzLDU1LjI1LDQ0NC44MzN6ICAgICBNMzcyLjU4MywxNDYuNDgzdjAuODVIMjU2LjQxN3YtMTA4LjhMMzcyLjU4MywxNDYuNDgzeiBNNzIuMjUsMzRoMTUwLjE2N3YxMzAuMzMzYzAsOS4zNSw3LjY1LDE3LDE3LDE3aDEzMy4xNjd2MjI5LjVINzIuMjVWMzR6ICAgICIgZmlsbD0iIzAwMDAwMCIvPgoJPC9nPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=); } - .easyPrintHolder .A4Landscape { + .easyPrintHolder .A4Landscape { transform: rotate(-90deg); } @@ -391,7 +403,7 @@ L.Control.EasyPrint = L.Control.extend({ .easyPrintPortrait:hover, .easyPrintLandscape:hover{ background-color: #757570; - cursor: pointer; + cursor: pointer; }`; document.body.appendChild(css); }, @@ -402,7 +414,7 @@ L.Control.EasyPrint = L.Control.extend({ var ab = new ArrayBuffer(byteString.length); var dw = new DataView(ab); for(var i = 0; i < byteString.length; i++) { - dw.setUint8(i, byteString.charCodeAt(i)); + dw.setUint8(i, byteString.charCodeAt(i)); } return new Blob([ab], {type: mimeString}); }, @@ -417,7 +429,7 @@ L.Control.EasyPrint = L.Control.extend({ } else { holderStyle.display = 'none'; linkStyle.borderTopRightRadius = '2px' - linkStyle.borderBottomRightRadius = '2px' + linkStyle.borderBottomRightRadius = '2px' } }, @@ -444,4 +456,3 @@ L.Control.EasyPrint = L.Control.extend({ L.easyPrint = function(options) { return new L.Control.EasyPrint(options); }; - diff --git a/inst/htmlwidgets/lfx-gibs/GIBSLayer.js b/inst/htmlwidgets/lfx-gibs/GIBSLayer.js new file mode 100644 index 00000000..0c296a5d --- /dev/null +++ b/inst/htmlwidgets/lfx-gibs/GIBSLayer.js @@ -0,0 +1,239 @@ +(function() { + var s2 = function(num) { return num < 10 ? '0' + num : num; }, + GIBS_ATTRIBUTION = 'NASA EOSDIS GIBS'; + + var getGibsURL = function(info, date, x, y, z) { + if (info.date && !date) { + return L.Util.emptyImageUrl; + } + + var dateStr = info.date ? date.getUTCFullYear() + '-' + s2(date.getUTCMonth() + 1) + '-' + s2(date.getUTCDate()) : "0"; + + return L.Util.template(info.template, { + Time: dateStr, + TileMatrixSet: 'GoogleMapsCompatible_Level' + info.zoom, + TileMatrix: z, + TileRow: y, + TileCol: x + }); + }; + + var GIBSLayerImage = L.TileLayer.extend({ + initialize: function(gibsID, options) { + + this._layerInfo = L.GIBS_LAYERS[gibsID]; + options = options || {}; + options.maxZoom = this._layerInfo.zoom; + options.attribution = GIBS_ATTRIBUTION; + this._date = options.date || null; + + L.Util.setOptions(this, options); + + L.TileLayer.prototype.initialize.call(this, this._layerInfo.template, options); + }, + + getTileUrl: function(tilePoint){ + return getGibsURL(this._layerInfo, this._date, tilePoint.x, tilePoint.y, tilePoint.z); + }, + + setDate: function(newDate) { + if (this._layerInfo.date) { + this._date = newDate; + this._map && this.redraw(); + } + return this; + }, + + isTemporal: function() { + return this._layerInfo.date; + } + + //setTransparent: function(isTransparent) { return this; } //to ensure the same methods for both classes + }); + + // Feature check for earlier versions of Leaflet + var GIBSGridLayer; + if (typeof L.TileLayer.Canvas !== 'undefined') { + GIBSGridLayer = L.TileLayer.Canvas; + } else { + GIBSGridLayer = L.GridLayer; + } + + var GIBSLayerCanvas = GIBSGridLayer.extend({ + initialize: function(layerName, options) { + + L.Util.setOptions(this, { + async: true, + attribution: GIBS_ATTRIBUTION + }); + L.Util.setOptions(this, options); + + this._date = this.options.date || null; + this._layerInfo = L.GIBS_LAYERS[layerName]; + + if (!this._layerInfo) { + throw "Unknown GIBS layer name"; + } + + L.Util.setOptions(this, {maxZoom: this._layerInfo.zoom}); + + this._maskInfo = null; + if (layerName.indexOf('Terra') !== -1) { + this._maskInfo = L.GIBS_MASKS['MODIS_Terra_Data_No_Data']; + } else if (layerName.indexOf('Aqua') !== -1) { + this._maskInfo = L.GIBS_MASKS['MODIS_Aqua_Data_No_Data']; + } + }, + + setDate: function(newDate) { + if (this._layerInfo.date) { + this._date = newDate; + this._map && this.redraw(); + } + return this; + }, + + setTransparent: function(isTransparent) { + this.options.transparent = isTransparent; + this._map && this.redraw(); + return this; + }, + + _loadImage: function(url, onLoaded, onError) { + var img = new Image(); + img.onload = onLoaded.bind(null, img); + img.onerror = onError; + img.crossOrigin = "anonymous"; + img.src = url; + }, + + // Common code utilised by both drawTile and createTile + _tryToProcess: function(canvas, c_width, c_height, mainImg, maskImg, hasMask) { + var mainCtx = canvas.getContext('2d'); + mainCtx.drawImage(mainImg, 0, 0); + + if (hasMask) { + var mainData = mainCtx.getImageData(0, 0, c_width, c_height); + + var maskCanvas = document.createElement('canvas'); + maskCanvas.width = c_width; + maskCanvas.height = c_height; + + var maskCtx = maskCanvas.getContext('2d'); + maskCtx.drawImage(maskImg, 0, 0); + + var maskPixels = maskCtx.getImageData(0, 0, c_width, c_height).data, + pixels = mainData.data; + + for (var p = 0; p < maskPixels.length; p += 4) { + if (maskPixels[p+3]) pixels[p+3] = 0; + } + + mainCtx.putImageData(mainData, 0, 0); + } + }, + + // drawTile is only used by Leaflet 0.7x + // It is replaced with createTile in Leaflet 1.x + drawTile: function(canvas, tilePoint, zoom) { + var hasMask = this._maskInfo && this.options.transparent, + mainImg, + maskImg, + _this = this; + + if (!this._date) { + return; + } + + + var tryToProcess = function() { + if (mainImg && (maskImg || !hasMask)) { + if (mainImg.width !== 256 || (hasMask && maskImg.width !== 256)) { + _this.tileDrawn(canvas); + return; + } + + _this._tryToProcess(canvas, 256, 256, mainImg, maskImg, hasMask); + _this.tileDrawn(canvas); + } + } + + this._adjustTilePoint(tilePoint); + + var mainSrc = getGibsURL(this._layerInfo, this._date, tilePoint.x, tilePoint.y, zoom); + + this._loadImage(mainSrc, function(img) { + mainImg = img; + tryToProcess(); + }, this.tileDrawn.bind(this, canvas)); + + if (hasMask) { + var maskSrc = getGibsURL(this._maskInfo, this._date, tilePoint.x, tilePoint.y, zoom); + this._loadImage(maskSrc, function(img) { + maskImg = img; + tryToProcess(); + }, this.tileDrawn.bind(this, canvas)); + } + }, + + // New in Leaflet 1.0 + createTile: function(coords){ + var hasMask = this._maskInfo && this.options.transparent, + mainImg, + maskImg, + _this = this; + + var tile = L.DomUtil.create('canvas', 'leaflet-tile'); + + var size = this.getTileSize(); + tile.width = size.x; + tile.height = size.y; + + if (!this._date) { + return tile; + } + + var tryToProcess = function(canvas) { + if (mainImg && (maskImg || !hasMask)) { + if (mainImg.width !== canvas.width || (hasMask && maskImg.width !== canvas.width)) return; + _this._tryToProcess(canvas, canvas.width, canvas.height, mainImg, maskImg, hasMask); + } + } + + var mainSrc = getGibsURL(this._layerInfo, this._date, coords.x, coords.y, coords.z); + + this._loadImage(mainSrc, function(img) { + mainImg = img; + tryToProcess(tile); + }); + + if (hasMask) { + var maskSrc = getGibsURL(this._maskInfo, this._date, coords.x, coords.y, coords.z); + this._loadImage(maskSrc, function(img) { + maskImg = img; + tryToProcess(tile); + }); + } + + return tile; + }, + + isTemporal: function() { + return this._layerInfo.date; + } + }) + + L.GIBSLayer = function(gibsID, options) { + var layerInfo = L.GIBS_LAYERS[gibsID]; + + if (!layerInfo) { + throw "Unknown GIBS layer name"; + } + + options = options || {}; + var needMask = layerInfo.date && 'transparent' in options && /jpg$/.test(layerInfo.template) && + (gibsID.indexOf('Terra') !== -1 || gibsID.indexOf('Aqua') !== -1); + + return needMask ? new GIBSLayerCanvas(gibsID, options) : new GIBSLayerImage(gibsID, options); + } +})(); diff --git a/inst/htmlwidgets/lfx-gibs/GIBSMetadata.js b/inst/htmlwidgets/lfx-gibs/GIBSMetadata.js new file mode 100644 index 00000000..ec7c1965 --- /dev/null +++ b/inst/htmlwidgets/lfx-gibs/GIBSMetadata.js @@ -0,0 +1 @@ +L.GIBS_LAYERS = {"AMSR2_Snow_Water_Equivalent":{"title":"AMSR2_Snow_Water_Equivalent","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Snow_Water_Equivalent/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Cloud_Liquid_Water_Day":{"title":"AMSR2_Cloud_Liquid_Water_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Cloud_Liquid_Water_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Cloud_Liquid_Water_Night":{"title":"AMSR2_Cloud_Liquid_Water_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Cloud_Liquid_Water_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Surface_Precipitation_Rate_Day":{"title":"AMSR2_Surface_Precipitation_Rate_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Surface_Precipitation_Rate_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Surface_Precipitation_Rate_Night":{"title":"AMSR2_Surface_Precipitation_Rate_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Surface_Precipitation_Rate_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Surface_Rain_Rate_Day":{"title":"AMSR2_Surface_Rain_Rate_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Surface_Rain_Rate_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Surface_Rain_Rate_Night":{"title":"AMSR2_Surface_Rain_Rate_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Surface_Rain_Rate_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Wind_Speed_Day":{"title":"AMSR2_Wind_Speed_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Wind_Speed_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Wind_Speed_Night":{"title":"AMSR2_Wind_Speed_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Wind_Speed_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Columnar_Water_Vapor_Day":{"title":"AMSR2_Columnar_Water_Vapor_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Columnar_Water_Vapor_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Columnar_Water_Vapor_Night":{"title":"AMSR2_Columnar_Water_Vapor_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Columnar_Water_Vapor_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Sea_Ice_Concentration_12km":{"title":"AMSR2_Sea_Ice_Concentration_12km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Sea_Ice_Concentration_12km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Sea_Ice_Concentration_25km":{"title":"AMSR2_Sea_Ice_Concentration_25km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Sea_Ice_Concentration_25km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Sea_Ice_Brightness_Temp_6km_89H":{"title":"AMSR2_Sea_Ice_Brightness_Temp_6km_89H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Sea_Ice_Brightness_Temp_6km_89H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Sea_Ice_Brightness_Temp_6km_89V":{"title":"AMSR2_Sea_Ice_Brightness_Temp_6km_89V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Sea_Ice_Brightness_Temp_6km_89V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Brightness_Temp_89H_Day":{"title":"AMSRE_Brightness_Temp_89H_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Brightness_Temp_89H_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Brightness_Temp_89H_Night":{"title":"AMSRE_Brightness_Temp_89H_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Brightness_Temp_89H_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Brightness_Temp_89V_Day":{"title":"AMSRE_Brightness_Temp_89V_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Brightness_Temp_89V_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Brightness_Temp_89V_Night":{"title":"AMSRE_Brightness_Temp_89V_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Brightness_Temp_89V_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Surface_Precipitation_Rate_Day":{"title":"AMSRE_Surface_Precipitation_Rate_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Surface_Precipitation_Rate_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Surface_Precipitation_Rate_Night":{"title":"AMSRE_Surface_Precipitation_Rate_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Surface_Precipitation_Rate_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Surface_Rain_Rate_Day":{"title":"AMSRE_Surface_Rain_Rate_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Surface_Rain_Rate_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Surface_Rain_Rate_Night":{"title":"AMSRE_Surface_Rain_Rate_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Surface_Rain_Rate_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Sea_Ice_Concentration_12km":{"title":"AMSRE_Sea_Ice_Concentration_12km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Sea_Ice_Concentration_12km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Snow_Depth_Over_Ice":{"title":"AMSRE_Snow_Depth_Over_Ice","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Snow_Depth_Over_Ice/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Sea_Ice_Concentration_25km":{"title":"AMSRE_Sea_Ice_Concentration_25km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Sea_Ice_Concentration_25km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Sea_Ice_Brightness_Temp_89H":{"title":"AMSRE_Sea_Ice_Brightness_Temp_89H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Sea_Ice_Brightness_Temp_89H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Sea_Ice_Brightness_Temp_89V":{"title":"AMSRE_Sea_Ice_Brightness_Temp_89V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Sea_Ice_Brightness_Temp_89V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_CO_Total_Column_Day":{"title":"AIRS_CO_Total_Column_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_CO_Total_Column_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_CO_Total_Column_Night":{"title":"AIRS_CO_Total_Column_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_CO_Total_Column_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Dust_Score_Ocean_Day":{"title":"AIRS_Dust_Score_Ocean_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Dust_Score_Ocean_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Dust_Score_Ocean_Night":{"title":"AIRS_Dust_Score_Ocean_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Dust_Score_Ocean_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Prata_SO2_Index_Day":{"title":"AIRS_Prata_SO2_Index_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Prata_SO2_Index_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Prata_SO2_Index_Night":{"title":"AIRS_Prata_SO2_Index_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Prata_SO2_Index_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Precipitation_Day":{"title":"AIRS_Precipitation_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Precipitation_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Precipitation_Night":{"title":"AIRS_Precipitation_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Precipitation_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_400hPa_Day":{"title":"AIRS_RelativeHumidity_400hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_400hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_400hPa_Night":{"title":"AIRS_RelativeHumidity_400hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_400hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_500hPa_Day":{"title":"AIRS_RelativeHumidity_500hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_500hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_500hPa_Night":{"title":"AIRS_RelativeHumidity_500hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_500hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_600hPa_Day":{"title":"AIRS_RelativeHumidity_600hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_600hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_600hPa_Night":{"title":"AIRS_RelativeHumidity_600hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_600hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_700hPa_Day":{"title":"AIRS_RelativeHumidity_700hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_700hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_700hPa_Night":{"title":"AIRS_RelativeHumidity_700hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_700hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_850hPa_Day":{"title":"AIRS_RelativeHumidity_850hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_850hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_850hPa_Night":{"title":"AIRS_RelativeHumidity_850hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_850hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_400hPa_Day":{"title":"AIRS_Temperature_400hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_400hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_400hPa_Night":{"title":"AIRS_Temperature_400hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_400hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_500hPa_Day":{"title":"AIRS_Temperature_500hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_500hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_500hPa_Night":{"title":"AIRS_Temperature_500hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_500hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_600hPa_Day":{"title":"AIRS_Temperature_600hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_600hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_600hPa_Night":{"title":"AIRS_Temperature_600hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_600hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_700hPa_Day":{"title":"AIRS_Temperature_700hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_700hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_700hPa_Night":{"title":"AIRS_Temperature_700hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_700hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_850hPa_Day":{"title":"AIRS_Temperature_850hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_850hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_850hPa_Night":{"title":"AIRS_Temperature_850hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_850hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"BlueMarble_NextGeneration":{"title":"BlueMarble_NextGeneration","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_NextGeneration/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":false},"BlueMarble_ShadedRelief":{"title":"BlueMarble_ShadedRelief","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_ShadedRelief/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":false},"BlueMarble_ShadedRelief_Bathymetry":{"title":"BlueMarble_ShadedRelief_Bathymetry","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_ShadedRelief_Bathymetry/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":false},"CERES_Combined_TOA_Longwave_Flux_All_Sky_Monthly":{"title":"CERES_Combined_TOA_Longwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Longwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Longwave_Flux_Clear_Sky_Monthly":{"title":"CERES_Combined_TOA_Longwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Longwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Shortwave_Flux_All_Sky_Monthly":{"title":"CERES_Combined_TOA_Shortwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Shortwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Shortwave_Flux_Clear_Sky_Monthly":{"title":"CERES_Combined_TOA_Shortwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Shortwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Window_Region_Flux_All_Sky_Monthly":{"title":"CERES_Combined_TOA_Window_Region_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Window_Region_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Window_Region_Flux_Clear_Sky_Monthly":{"title":"CERES_Combined_TOA_Window_Region_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Window_Region_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_CRE_Net_Longwave_Flux_Monthly":{"title":"CERES_EBAF_Surface_CRE_Net_Longwave_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_CRE_Net_Longwave_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_CRE_Net_Shortwave_Flux_Monthly":{"title":"CERES_EBAF_Surface_CRE_Net_Shortwave_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_CRE_Net_Shortwave_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_CRE_Net_Total_Flux_Monthly":{"title":"CERES_EBAF_Surface_CRE_Net_Total_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_CRE_Net_Total_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Longwave_Flux_Down_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Longwave_Flux_Down_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Longwave_Flux_Down_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Longwave_Flux_Up_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Longwave_Flux_Up_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Longwave_Flux_Up_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Longwave_Flux_Down_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Longwave_Flux_Down_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Longwave_Flux_Down_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Longwave_Flux_Up_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Longwave_Flux_Up_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Longwave_Flux_Up_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Longwave_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Longwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Longwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Longwave_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Longwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Longwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Shortwave_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Shortwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Shortwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Shortwave_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Shortwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Shortwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Total_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Total_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Total_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Total_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Total_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Total_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Shortwave_Flux_Down_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Shortwave_Flux_Down_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Shortwave_Flux_Down_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Shortwave_Flux_Up_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Shortwave_Flux_Up_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Shortwave_Flux_Up_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Shortwave_Flux_Down_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Shortwave_Flux_Down_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Shortwave_Flux_Down_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Shortwave_Flux_Up_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Shortwave_Flux_Up_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Shortwave_Flux_Up_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_CRE_Longwave_Flux_Monthly":{"title":"CERES_EBAF_TOA_CRE_Longwave_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_CRE_Longwave_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_CRE_Net_Flux_Monthly":{"title":"CERES_EBAF_TOA_CRE_Net_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_CRE_Net_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_CRE_Shortwave_Flux_Monthly":{"title":"CERES_EBAF_TOA_CRE_Shortwave_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_CRE_Shortwave_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Longwave_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_TOA_Longwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Longwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Longwave_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_TOA_Longwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Longwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Net_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_TOA_Net_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Net_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Net_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_TOA_Net_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Net_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Incoming_Solar_Flux_Monthly":{"title":"CERES_EBAF_TOA_Incoming_Solar_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Incoming_Solar_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Shortwave_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_TOA_Shortwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Shortwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Shortwave_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_TOA_Shortwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Shortwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Longwave_Flux_All_Sky_Monthly":{"title":"CERES_Terra_TOA_Longwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Longwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Longwave_Flux_Clear_Sky_Monthly":{"title":"CERES_Terra_TOA_Longwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Longwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Shortwave_Flux_All_Sky_Monthly":{"title":"CERES_Terra_TOA_Shortwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Shortwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Shortwave_Flux_Clear_Sky_Monthly":{"title":"CERES_Terra_TOA_Shortwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Shortwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Window_Region_Flux_All_Sky_Monthly":{"title":"CERES_Terra_TOA_Window_Region_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Window_Region_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Window_Region_Flux_Clear_Sky_Monthly":{"title":"CERES_Terra_TOA_Window_Region_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Window_Region_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"Coastlines":{"title":"Coastlines","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/Coastlines/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":false},"GHRSST_L4_G1SST_Sea_Surface_Temperature":{"title":"GHRSST_L4_G1SST_Sea_Surface_Temperature","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GHRSST_L4_G1SST_Sea_Surface_Temperature/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"GHRSST_L4_MUR_Sea_Surface_Temperature":{"title":"GHRSST_L4_MUR_Sea_Surface_Temperature","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GHRSST_L4_MUR_Sea_Surface_Temperature/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"GMI_Rain_Rate_Asc":{"title":"GMI_Rain_Rate_Asc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Rain_Rate_Asc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Rain_Rate_Dsc":{"title":"GMI_Rain_Rate_Dsc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Rain_Rate_Dsc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Brightness_Temp_Asc":{"title":"GMI_Brightness_Temp_Asc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Brightness_Temp_Asc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Brightness_Temp_Dsc":{"title":"GMI_Brightness_Temp_Dsc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Brightness_Temp_Dsc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Snow_Rate_Asc":{"title":"GMI_Snow_Rate_Asc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Snow_Rate_Asc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Snow_Rate_Dsc":{"title":"GMI_Snow_Rate_Dsc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Snow_Rate_Dsc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Combined_Value_Added_AOD":{"title":"MODIS_Combined_Value_Added_AOD","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Combined_Value_Added_AOD/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MEaSUREs_Daily_Landscape_Freeze_Thaw_AMSRE":{"title":"MEaSUREs_Daily_Landscape_Freeze_Thaw_AMSRE","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MEaSUREs_Daily_Landscape_Freeze_Thaw_AMSRE/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI":{"title":"MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MISR_Directional_Hemispherical_Reflectance_Average_Natural_Color_Monthly":{"title":"MISR_Directional_Hemispherical_Reflectance_Average_Natural_Color_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MISR_Directional_Hemispherical_Reflectance_Average_Natural_Color_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MISR_Radiance_Average_Infrared_Color_Monthly":{"title":"MISR_Radiance_Average_Infrared_Color_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MISR_Radiance_Average_Infrared_Color_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MISR_Radiance_Average_Natural_Color_Monthly":{"title":"MISR_Radiance_Average_Natural_Color_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MISR_Radiance_Average_Natural_Color_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_CO_215hPa_Day":{"title":"MLS_CO_215hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_CO_215hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_CO_215hPa_Night":{"title":"MLS_CO_215hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_CO_215hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_H2O_46hPa_Day":{"title":"MLS_H2O_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_H2O_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_H2O_46hPa_Night":{"title":"MLS_H2O_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_H2O_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_HNO3_46hPa_Day":{"title":"MLS_HNO3_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_HNO3_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_HNO3_46hPa_Night":{"title":"MLS_HNO3_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_HNO3_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_N2O_46hPa_Day":{"title":"MLS_N2O_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_N2O_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_N2O_46hPa_Night":{"title":"MLS_N2O_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_N2O_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_O3_46hPa_Day":{"title":"MLS_O3_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_O3_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_O3_46hPa_Night":{"title":"MLS_O3_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_O3_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_SO2_147hPa_Day":{"title":"MLS_SO2_147hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_SO2_147hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_SO2_147hPa_Night":{"title":"MLS_SO2_147hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_SO2_147hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_Temperature_46hPa_Day":{"title":"MLS_Temperature_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_Temperature_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_Temperature_46hPa_Night":{"title":"MLS_Temperature_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_Temperature_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Chlorophyll_A":{"title":"MODIS_Terra_Chlorophyll_A","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Chlorophyll_A/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Water_Mask":{"title":"MODIS_Water_Mask","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Water_Mask/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":false},"MODIS_Terra_Brightness_Temp_Band31_Day":{"title":"MODIS_Terra_Brightness_Temp_Band31_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Brightness_Temp_Band31_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Brightness_Temp_Band31_Night":{"title":"MODIS_Terra_Brightness_Temp_Band31_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Brightness_Temp_Band31_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Aerosol_Optical_Depth_3km":{"title":"MODIS_Terra_Aerosol_Optical_Depth_3km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Aerosol_Optical_Depth_3km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Angstrom_Exponent_Land":{"title":"MODIS_Terra_Angstrom_Exponent_Land","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Angstrom_Exponent_Land/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Angstrom_Exponent_Ocean":{"title":"MODIS_Terra_Angstrom_Exponent_Ocean","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Angstrom_Exponent_Ocean/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_AOD_Deep_Blue_Land":{"title":"MODIS_Terra_AOD_Deep_Blue_Land","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_AOD_Deep_Blue_Land/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_AOD_Deep_Blue_Combined":{"title":"MODIS_Terra_AOD_Deep_Blue_Combined","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_AOD_Deep_Blue_Combined/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Aerosol":{"title":"MODIS_Terra_Aerosol","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Aerosol/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Water_Vapor_5km_Day":{"title":"MODIS_Terra_Water_Vapor_5km_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Water_Vapor_5km_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Water_Vapor_5km_Night":{"title":"MODIS_Terra_Water_Vapor_5km_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Water_Vapor_5km_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Effective_Radius_37_PCL":{"title":"MODIS_Terra_Cloud_Effective_Radius_37_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Effective_Radius_37_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Effective_Radius_37":{"title":"MODIS_Terra_Cloud_Effective_Radius_37","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Effective_Radius_37/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Effective_Radius":{"title":"MODIS_Terra_Cloud_Effective_Radius","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Effective_Radius/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Effective_Radius_PCL":{"title":"MODIS_Terra_Cloud_Effective_Radius_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Effective_Radius_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Multi_Layer_Flag":{"title":"MODIS_Terra_Cloud_Multi_Layer_Flag","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Multi_Layer_Flag/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Optical_Thickness":{"title":"MODIS_Terra_Cloud_Optical_Thickness","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Optical_Thickness/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Optical_Thickness_PCL":{"title":"MODIS_Terra_Cloud_Optical_Thickness_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Optical_Thickness_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Phase_Optical_Properties":{"title":"MODIS_Terra_Cloud_Phase_Optical_Properties","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Phase_Optical_Properties/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Water_Path":{"title":"MODIS_Terra_Cloud_Water_Path","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Water_Path/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Water_Path_PCL":{"title":"MODIS_Terra_Cloud_Water_Path_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Water_Path_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Fraction_Day":{"title":"MODIS_Terra_Cloud_Fraction_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Fraction_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Phase_Infrared_Day":{"title":"MODIS_Terra_Cloud_Phase_Infrared_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Phase_Infrared_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Height_Day":{"title":"MODIS_Terra_Cloud_Top_Height_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Height_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Pressure_Day":{"title":"MODIS_Terra_Cloud_Top_Pressure_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Pressure_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Temp_Day":{"title":"MODIS_Terra_Cloud_Top_Temp_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Temp_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Fraction_Night":{"title":"MODIS_Terra_Cloud_Fraction_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Fraction_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Phase_Infrared_Night":{"title":"MODIS_Terra_Cloud_Phase_Infrared_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Phase_Infrared_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Height_Night":{"title":"MODIS_Terra_Cloud_Top_Height_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Height_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Pressure_Night":{"title":"MODIS_Terra_Cloud_Top_Pressure_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Pressure_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Temp_Night":{"title":"MODIS_Terra_Cloud_Top_Temp_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Temp_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_SurfaceReflectance_Bands143":{"title":"MODIS_Terra_SurfaceReflectance_Bands143","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_SurfaceReflectance_Bands143/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":true},"MODIS_Terra_SurfaceReflectance_Bands721":{"title":"MODIS_Terra_SurfaceReflectance_Bands721","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_SurfaceReflectance_Bands721/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":true},"MODIS_Terra_SurfaceReflectance_Bands121":{"title":"MODIS_Terra_SurfaceReflectance_Bands121","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_SurfaceReflectance_Bands121/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Terra_Snow_Cover":{"title":"MODIS_Terra_Snow_Cover","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Snow_Cover/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":8,"date":true},"MODIS_Terra_Land_Surface_Temp_Day":{"title":"MODIS_Terra_Land_Surface_Temp_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Land_Surface_Temp_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Land_Surface_Temp_Night":{"title":"MODIS_Terra_Land_Surface_Temp_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Land_Surface_Temp_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Sea_Ice":{"title":"MODIS_Terra_Sea_Ice","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Sea_Ice/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_CorrectedReflectance_TrueColor":{"title":"MODIS_Terra_CorrectedReflectance_TrueColor","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_TrueColor/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Terra_CorrectedReflectance_Bands367":{"title":"MODIS_Terra_CorrectedReflectance_Bands367","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_Bands367/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Terra_CorrectedReflectance_Bands721":{"title":"MODIS_Terra_CorrectedReflectance_Bands721","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_Bands721/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MOPITT_CO_Daily_Surface_Mixing_Ratio_Night":{"title":"MOPITT_CO_Daily_Surface_Mixing_Ratio_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Daily_Surface_Mixing_Ratio_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Daily_Surface_Mixing_Ratio_Day":{"title":"MOPITT_CO_Daily_Surface_Mixing_Ratio_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Daily_Surface_Mixing_Ratio_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Daily_Total_Column_Night":{"title":"MOPITT_CO_Daily_Total_Column_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Daily_Total_Column_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Daily_Total_Column_Day":{"title":"MOPITT_CO_Daily_Total_Column_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Daily_Total_Column_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Monthly_Surface_Mixing_Ratio_Night":{"title":"MOPITT_CO_Monthly_Surface_Mixing_Ratio_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Monthly_Surface_Mixing_Ratio_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Monthly_Surface_Mixing_Ratio_Day":{"title":"MOPITT_CO_Monthly_Surface_Mixing_Ratio_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Monthly_Surface_Mixing_Ratio_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Monthly_Total_Column_Night":{"title":"MOPITT_CO_Monthly_Total_Column_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Monthly_Total_Column_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Monthly_Total_Column_Day":{"title":"MOPITT_CO_Monthly_Total_Column_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Monthly_Total_Column_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Chlorophyll_A":{"title":"MODIS_Aqua_Chlorophyll_A","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Chlorophyll_A/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Brightness_Temp_Band31_Day":{"title":"MODIS_Aqua_Brightness_Temp_Band31_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Brightness_Temp_Band31_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Brightness_Temp_Band31_Night":{"title":"MODIS_Aqua_Brightness_Temp_Band31_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Brightness_Temp_Band31_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Aerosol_Optical_Depth_3km":{"title":"MODIS_Aqua_Aerosol_Optical_Depth_3km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Aerosol_Optical_Depth_3km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Angstrom_Exponent_Land":{"title":"MODIS_Aqua_Angstrom_Exponent_Land","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Angstrom_Exponent_Land/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Angstrom_Exponent_Ocean":{"title":"MODIS_Aqua_Angstrom_Exponent_Ocean","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Angstrom_Exponent_Ocean/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_AOD_Deep_Blue_Land":{"title":"MODIS_Aqua_AOD_Deep_Blue_Land","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_AOD_Deep_Blue_Land/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_AOD_Deep_Blue_Combined":{"title":"MODIS_Aqua_AOD_Deep_Blue_Combined","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_AOD_Deep_Blue_Combined/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Aerosol":{"title":"MODIS_Aqua_Aerosol","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Aerosol/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Water_Vapor_5km_Day":{"title":"MODIS_Aqua_Water_Vapor_5km_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Water_Vapor_5km_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Water_Vapor_5km_Night":{"title":"MODIS_Aqua_Water_Vapor_5km_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Water_Vapor_5km_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Effective_Radius_37_PCL":{"title":"MODIS_Aqua_Cloud_Effective_Radius_37_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Effective_Radius_37_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Effective_Radius_37":{"title":"MODIS_Aqua_Cloud_Effective_Radius_37","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Effective_Radius_37/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Effective_Radius":{"title":"MODIS_Aqua_Cloud_Effective_Radius","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Effective_Radius/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Effective_Radius_PCL":{"title":"MODIS_Aqua_Cloud_Effective_Radius_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Effective_Radius_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Multi_Layer_Flag":{"title":"MODIS_Aqua_Cloud_Multi_Layer_Flag","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Multi_Layer_Flag/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Optical_Thickness":{"title":"MODIS_Aqua_Cloud_Optical_Thickness","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Optical_Thickness/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Optical_Thickness_PCL":{"title":"MODIS_Aqua_Cloud_Optical_Thickness_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Optical_Thickness_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Phase_Optical_Properties":{"title":"MODIS_Aqua_Cloud_Phase_Optical_Properties","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Phase_Optical_Properties/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Water_Path":{"title":"MODIS_Aqua_Cloud_Water_Path","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Water_Path/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Water_Path_PCL":{"title":"MODIS_Aqua_Cloud_Water_Path_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Water_Path_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Fraction_Day":{"title":"MODIS_Aqua_Cloud_Fraction_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Fraction_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Phase_Infrared_Day":{"title":"MODIS_Aqua_Cloud_Phase_Infrared_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Phase_Infrared_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Height_Day":{"title":"MODIS_Aqua_Cloud_Top_Height_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Height_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Pressure_Day":{"title":"MODIS_Aqua_Cloud_Top_Pressure_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Pressure_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Temp_Day":{"title":"MODIS_Aqua_Cloud_Top_Temp_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Temp_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Fraction_Night":{"title":"MODIS_Aqua_Cloud_Fraction_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Fraction_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Phase_Infrared_Night":{"title":"MODIS_Aqua_Cloud_Phase_Infrared_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Phase_Infrared_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Height_Night":{"title":"MODIS_Aqua_Cloud_Top_Height_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Height_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Pressure_Night":{"title":"MODIS_Aqua_Cloud_Top_Pressure_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Pressure_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Temp_Night":{"title":"MODIS_Aqua_Cloud_Top_Temp_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Temp_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_SurfaceReflectance_Bands143":{"title":"MODIS_Aqua_SurfaceReflectance_Bands143","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_SurfaceReflectance_Bands143/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":true},"MODIS_Aqua_SurfaceReflectance_Bands721":{"title":"MODIS_Aqua_SurfaceReflectance_Bands721","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_SurfaceReflectance_Bands721/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":true},"MODIS_Aqua_SurfaceReflectance_Bands121":{"title":"MODIS_Aqua_SurfaceReflectance_Bands121","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_SurfaceReflectance_Bands121/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Aqua_Snow_Cover":{"title":"MODIS_Aqua_Snow_Cover","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Snow_Cover/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":8,"date":true},"MODIS_Aqua_Land_Surface_Temp_Day":{"title":"MODIS_Aqua_Land_Surface_Temp_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Land_Surface_Temp_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Land_Surface_Temp_Night":{"title":"MODIS_Aqua_Land_Surface_Temp_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Land_Surface_Temp_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Sea_Ice":{"title":"MODIS_Aqua_Sea_Ice","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Sea_Ice/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_CorrectedReflectance_TrueColor":{"title":"MODIS_Aqua_CorrectedReflectance_TrueColor","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_TrueColor/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Aqua_CorrectedReflectance_Bands721":{"title":"MODIS_Aqua_CorrectedReflectance_Bands721","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_Bands721/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"OMI_Absorbing_Aerosol_Optical_Depth":{"title":"OMI_Absorbing_Aerosol_Optical_Depth","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_Absorbing_Aerosol_Optical_Depth/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_Aerosol_Index":{"title":"OMI_Aerosol_Index","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_Aerosol_Index/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_Aerosol_Optical_Depth":{"title":"OMI_Aerosol_Optical_Depth","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_Aerosol_Optical_Depth/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_Cloud_Pressure":{"title":"OMI_Cloud_Pressure","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_Cloud_Pressure/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_SO2_Upper_Troposphere_and_Stratosphere":{"title":"OMI_SO2_Upper_Troposphere_and_Stratosphere","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_SO2_Upper_Troposphere_and_Stratosphere/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_SO2_Lower_Troposphere":{"title":"OMI_SO2_Lower_Troposphere","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_SO2_Lower_Troposphere/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_SO2_Middle_Troposphere":{"title":"OMI_SO2_Middle_Troposphere","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_SO2_Middle_Troposphere/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"Reference_Features":{"title":"Reference_Features","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/Reference_Features/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":false},"Reference_Labels":{"title":"Reference_Labels","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/Reference_Labels/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":false},"SMAP_L1_Passive_Faraday_Rotation_Aft":{"title":"SMAP_L1_Passive_Faraday_Rotation_Aft","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Faraday_Rotation_Aft/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Faraday_Rotation_Fore":{"title":"SMAP_L1_Passive_Faraday_Rotation_Fore","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Faraday_Rotation_Fore/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_H_QA":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_H_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_H_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_H":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_H_QA":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_H_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_H_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_H":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_V_QA":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_V_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_V_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_V":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_V_QA":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_V_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_V_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_V":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L2_Passive_Soil_Moisture_Option1":{"title":"SMAP_L2_Passive_Soil_Moisture_Option1","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L2_Passive_Soil_Moisture_Option1/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L2_Passive_Soil_Moisture_Option2":{"title":"SMAP_L2_Passive_Soil_Moisture_Option2","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L2_Passive_Soil_Moisture_Option2/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L2_Passive_Soil_Moisture_Option3":{"title":"SMAP_L2_Passive_Soil_Moisture_Option3","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L2_Passive_Soil_Moisture_Option3/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_HH_QA":{"title":"SMAP_L3_Active_Sigma0_HH_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_HH_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_HH_RFI":{"title":"SMAP_L3_Active_Sigma0_HH_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_HH_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_HH":{"title":"SMAP_L3_Active_Sigma0_HH","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_HH/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_VV_QA":{"title":"SMAP_L3_Active_Sigma0_VV_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_VV_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_VV_RFI":{"title":"SMAP_L3_Active_Sigma0_VV_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_VV_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_VV":{"title":"SMAP_L3_Active_Sigma0_VV","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_VV/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_XPOL_QA":{"title":"SMAP_L3_Active_Sigma0_XPOL_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_XPOL_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_XPOL_RFI":{"title":"SMAP_L3_Active_Sigma0_XPOL_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_XPOL_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_XPOL":{"title":"SMAP_L3_Active_Sigma0_XPOL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_XPOL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Soil_Moisture":{"title":"SMAP_L3_Active_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Passive_Soil_Moisture":{"title":"SMAP_L3_Active_Passive_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Passive_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Passive_Soil_Moisture":{"title":"SMAP_L3_Passive_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Passive_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Passive_Brightness_Temp_H":{"title":"SMAP_L3_Active_Passive_Brightness_Temp_H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Passive_Brightness_Temp_H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Passive_Brightness_Temp_H":{"title":"SMAP_L3_Passive_Brightness_Temp_H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Passive_Brightness_Temp_H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Passive_Brightness_Temp_V":{"title":"SMAP_L3_Active_Passive_Brightness_Temp_V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Passive_Brightness_Temp_V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Passive_Brightness_Temp_V":{"title":"SMAP_L3_Passive_Brightness_Temp_V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Passive_Brightness_Temp_V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Analyzed_Root_Zone_Soil_Moisture":{"title":"SMAP_L4_Analyzed_Root_Zone_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Analyzed_Root_Zone_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Analyzed_Surface_Soil_Moisture":{"title":"SMAP_L4_Analyzed_Surface_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Analyzed_Surface_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Emult_Average":{"title":"SMAP_L4_Emult_Average","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Emult_Average/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Frozen_Area":{"title":"SMAP_L4_Frozen_Area","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Frozen_Area/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Mean_Gross_Primary_Productivity":{"title":"SMAP_L4_Mean_Gross_Primary_Productivity","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Mean_Gross_Primary_Productivity/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Mean_Net_Ecosystem_Exchange":{"title":"SMAP_L4_Mean_Net_Ecosystem_Exchange","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Mean_Net_Ecosystem_Exchange/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Mean_Heterotrophic_Respiration":{"title":"SMAP_L4_Mean_Heterotrophic_Respiration","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Mean_Heterotrophic_Respiration/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Snow_Mass":{"title":"SMAP_L4_Snow_Mass","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Snow_Mass/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Soil_Temperature_Layer_1":{"title":"SMAP_L4_Soil_Temperature_Layer_1","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Soil_Temperature_Layer_1/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Uncertainty_Analyzed_Root_Zone_Soil_Moisture":{"title":"SMAP_L4_Uncertainty_Analyzed_Root_Zone_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Uncertainty_Analyzed_Root_Zone_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Uncertainty_Analyzed_Surface_Soil_Moisture":{"title":"SMAP_L4_Uncertainty_Analyzed_Surface_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Uncertainty_Analyzed_Surface_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Uncertainty_Mean_Net_Ecosystem_Exchange":{"title":"SMAP_L4_Uncertainty_Mean_Net_Ecosystem_Exchange","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Uncertainty_Mean_Net_Ecosystem_Exchange/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":false},"VIIRS_CityLights_2012":{"title":"VIIRS_CityLights_2012","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_CityLights_2012/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":false},"VIIRS_SNPP_DayNightBand_ENCC":{"title":"VIIRS_SNPP_DayNightBand_ENCC","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_DayNightBand_ENCC/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":8,"date":true},"VIIRS_SNPP_CorrectedReflectance_TrueColor":{"title":"VIIRS_SNPP_CorrectedReflectance_TrueColor","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_CorrectedReflectance_TrueColor/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1":{"title":"VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11":{"title":"VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true}};L.GIBS_MASKS = {"MODIS_Terra_Data_No_Data":{"title":"MODIS_Terra_Data_No_Data","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Data_No_Data/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":true},"MODIS_Aqua_Data_No_Data":{"title":"MODIS_Aqua_Data_No_Data","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Data_No_Data/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":true}}; \ No newline at end of file diff --git a/inst/htmlwidgets/lfx-gibs/gibs-bindings.js b/inst/htmlwidgets/lfx-gibs/gibs-bindings.js new file mode 100644 index 00000000..c5d8febb --- /dev/null +++ b/inst/htmlwidgets/lfx-gibs/gibs-bindings.js @@ -0,0 +1,54 @@ +LeafletWidget.methods.addGIBS = function(layers, group, date, opacity, transparent) { + var map = this; + + // Init map.gibs object + map.gibs = map.gibs || {}; + + // Add single GIBS Layer + if (typeof layers === "string") { + var gibslayer = new L.GIBSLayer(layers, { + date: new Date(date), + transparent: transparent, + opacity: opacity + }); + map.gibs[layers] = gibslayer; + map.layerManager.addLayer(gibslayer, "tile", layers, group); + return; + } + + // Add multiple GIBS Layer + if (typeof layers === "object") { + layers.forEach(function(layer, idx) { + var gibslayer = new L.GIBSLayer(layer, { + date: new Date(date[idx]), + transparent: transparent[idx], + opacity: opacity[idx] + }); + map.gibs[layer] = gibslayer; + map.layerManager.addLayer(gibslayer, "tile", layer, group[idx]); + }); + } + +}; + +LeafletWidget.methods.setDate = function(layers, date) { + var map = this; + if (typeof layers === "string") { + map.gibs[layers] && map.gibs[layers].setDate(new Date(date)); + } else { + layers.forEach(function(layer) { + map.gibs[layer] && map.gibs[layer].setDate(new Date(date)); + }); + } +}; + +LeafletWidget.methods.setTransparent = function(layers, bool) { + var map = this; + if (typeof layers === "string") { + map.gibs[layers].setTransparent && map.gibs[layers].setTransparent(bool); + } else { + layers.forEach(function(layer) { + map.gibs[layer].setTransparent && map.gibs[layer].setTransparent(bool); + }); + } +}; diff --git a/inst/htmlwidgets/lfx-gibs/gibs_layers_meta.json b/inst/htmlwidgets/lfx-gibs/gibs_layers_meta.json new file mode 100644 index 00000000..daece354 --- /dev/null +++ b/inst/htmlwidgets/lfx-gibs/gibs_layers_meta.json @@ -0,0 +1 @@ +{"AMSR2_Snow_Water_Equivalent":{"title":"AMSR2_Snow_Water_Equivalent","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Snow_Water_Equivalent/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Cloud_Liquid_Water_Day":{"title":"AMSR2_Cloud_Liquid_Water_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Cloud_Liquid_Water_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Cloud_Liquid_Water_Night":{"title":"AMSR2_Cloud_Liquid_Water_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Cloud_Liquid_Water_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Surface_Precipitation_Rate_Day":{"title":"AMSR2_Surface_Precipitation_Rate_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Surface_Precipitation_Rate_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Surface_Precipitation_Rate_Night":{"title":"AMSR2_Surface_Precipitation_Rate_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Surface_Precipitation_Rate_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Surface_Rain_Rate_Day":{"title":"AMSR2_Surface_Rain_Rate_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Surface_Rain_Rate_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Surface_Rain_Rate_Night":{"title":"AMSR2_Surface_Rain_Rate_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Surface_Rain_Rate_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Wind_Speed_Day":{"title":"AMSR2_Wind_Speed_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Wind_Speed_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Wind_Speed_Night":{"title":"AMSR2_Wind_Speed_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Wind_Speed_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Columnar_Water_Vapor_Day":{"title":"AMSR2_Columnar_Water_Vapor_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Columnar_Water_Vapor_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Columnar_Water_Vapor_Night":{"title":"AMSR2_Columnar_Water_Vapor_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Columnar_Water_Vapor_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Sea_Ice_Concentration_12km":{"title":"AMSR2_Sea_Ice_Concentration_12km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Sea_Ice_Concentration_12km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Sea_Ice_Concentration_25km":{"title":"AMSR2_Sea_Ice_Concentration_25km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Sea_Ice_Concentration_25km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Sea_Ice_Brightness_Temp_6km_89H":{"title":"AMSR2_Sea_Ice_Brightness_Temp_6km_89H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Sea_Ice_Brightness_Temp_6km_89H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSR2_Sea_Ice_Brightness_Temp_6km_89V":{"title":"AMSR2_Sea_Ice_Brightness_Temp_6km_89V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSR2_Sea_Ice_Brightness_Temp_6km_89V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Brightness_Temp_89H_Day":{"title":"AMSRE_Brightness_Temp_89H_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Brightness_Temp_89H_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Brightness_Temp_89H_Night":{"title":"AMSRE_Brightness_Temp_89H_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Brightness_Temp_89H_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Brightness_Temp_89V_Day":{"title":"AMSRE_Brightness_Temp_89V_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Brightness_Temp_89V_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Brightness_Temp_89V_Night":{"title":"AMSRE_Brightness_Temp_89V_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Brightness_Temp_89V_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Surface_Precipitation_Rate_Day":{"title":"AMSRE_Surface_Precipitation_Rate_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Surface_Precipitation_Rate_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Surface_Precipitation_Rate_Night":{"title":"AMSRE_Surface_Precipitation_Rate_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Surface_Precipitation_Rate_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Surface_Rain_Rate_Day":{"title":"AMSRE_Surface_Rain_Rate_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Surface_Rain_Rate_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Surface_Rain_Rate_Night":{"title":"AMSRE_Surface_Rain_Rate_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Surface_Rain_Rate_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Sea_Ice_Concentration_12km":{"title":"AMSRE_Sea_Ice_Concentration_12km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Sea_Ice_Concentration_12km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Snow_Depth_Over_Ice":{"title":"AMSRE_Snow_Depth_Over_Ice","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Snow_Depth_Over_Ice/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Sea_Ice_Concentration_25km":{"title":"AMSRE_Sea_Ice_Concentration_25km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Sea_Ice_Concentration_25km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Sea_Ice_Brightness_Temp_89H":{"title":"AMSRE_Sea_Ice_Brightness_Temp_89H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Sea_Ice_Brightness_Temp_89H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AMSRE_Sea_Ice_Brightness_Temp_89V":{"title":"AMSRE_Sea_Ice_Brightness_Temp_89V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AMSRE_Sea_Ice_Brightness_Temp_89V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_CO_Total_Column_Day":{"title":"AIRS_CO_Total_Column_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_CO_Total_Column_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_CO_Total_Column_Night":{"title":"AIRS_CO_Total_Column_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_CO_Total_Column_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Dust_Score_Ocean_Day":{"title":"AIRS_Dust_Score_Ocean_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Dust_Score_Ocean_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Dust_Score_Ocean_Night":{"title":"AIRS_Dust_Score_Ocean_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Dust_Score_Ocean_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Prata_SO2_Index_Day":{"title":"AIRS_Prata_SO2_Index_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Prata_SO2_Index_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Prata_SO2_Index_Night":{"title":"AIRS_Prata_SO2_Index_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Prata_SO2_Index_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Precipitation_Day":{"title":"AIRS_Precipitation_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Precipitation_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Precipitation_Night":{"title":"AIRS_Precipitation_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Precipitation_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_400hPa_Day":{"title":"AIRS_RelativeHumidity_400hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_400hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_400hPa_Night":{"title":"AIRS_RelativeHumidity_400hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_400hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_500hPa_Day":{"title":"AIRS_RelativeHumidity_500hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_500hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_500hPa_Night":{"title":"AIRS_RelativeHumidity_500hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_500hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_600hPa_Day":{"title":"AIRS_RelativeHumidity_600hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_600hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_600hPa_Night":{"title":"AIRS_RelativeHumidity_600hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_600hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_700hPa_Day":{"title":"AIRS_RelativeHumidity_700hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_700hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_700hPa_Night":{"title":"AIRS_RelativeHumidity_700hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_700hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_850hPa_Day":{"title":"AIRS_RelativeHumidity_850hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_850hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_RelativeHumidity_850hPa_Night":{"title":"AIRS_RelativeHumidity_850hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_RelativeHumidity_850hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_400hPa_Day":{"title":"AIRS_Temperature_400hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_400hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_400hPa_Night":{"title":"AIRS_Temperature_400hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_400hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_500hPa_Day":{"title":"AIRS_Temperature_500hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_500hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_500hPa_Night":{"title":"AIRS_Temperature_500hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_500hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_600hPa_Day":{"title":"AIRS_Temperature_600hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_600hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_600hPa_Night":{"title":"AIRS_Temperature_600hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_600hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_700hPa_Day":{"title":"AIRS_Temperature_700hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_700hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_700hPa_Night":{"title":"AIRS_Temperature_700hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_700hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_850hPa_Day":{"title":"AIRS_Temperature_850hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_850hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"AIRS_Temperature_850hPa_Night":{"title":"AIRS_Temperature_850hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/AIRS_Temperature_850hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"BlueMarble_NextGeneration":{"title":"BlueMarble_NextGeneration","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_NextGeneration/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":false},"BlueMarble_ShadedRelief":{"title":"BlueMarble_ShadedRelief","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_ShadedRelief/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":false},"BlueMarble_ShadedRelief_Bathymetry":{"title":"BlueMarble_ShadedRelief_Bathymetry","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_ShadedRelief_Bathymetry/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":false},"CERES_Combined_TOA_Longwave_Flux_All_Sky_Monthly":{"title":"CERES_Combined_TOA_Longwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Longwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Longwave_Flux_Clear_Sky_Monthly":{"title":"CERES_Combined_TOA_Longwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Longwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Shortwave_Flux_All_Sky_Monthly":{"title":"CERES_Combined_TOA_Shortwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Shortwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Shortwave_Flux_Clear_Sky_Monthly":{"title":"CERES_Combined_TOA_Shortwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Shortwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Window_Region_Flux_All_Sky_Monthly":{"title":"CERES_Combined_TOA_Window_Region_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Window_Region_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Combined_TOA_Window_Region_Flux_Clear_Sky_Monthly":{"title":"CERES_Combined_TOA_Window_Region_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Combined_TOA_Window_Region_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_CRE_Net_Longwave_Flux_Monthly":{"title":"CERES_EBAF_Surface_CRE_Net_Longwave_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_CRE_Net_Longwave_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_CRE_Net_Shortwave_Flux_Monthly":{"title":"CERES_EBAF_Surface_CRE_Net_Shortwave_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_CRE_Net_Shortwave_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_CRE_Net_Total_Flux_Monthly":{"title":"CERES_EBAF_Surface_CRE_Net_Total_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_CRE_Net_Total_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Longwave_Flux_Down_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Longwave_Flux_Down_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Longwave_Flux_Down_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Longwave_Flux_Up_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Longwave_Flux_Up_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Longwave_Flux_Up_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Longwave_Flux_Down_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Longwave_Flux_Down_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Longwave_Flux_Down_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Longwave_Flux_Up_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Longwave_Flux_Up_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Longwave_Flux_Up_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Longwave_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Longwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Longwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Longwave_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Longwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Longwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Shortwave_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Shortwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Shortwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Shortwave_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Shortwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Shortwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Total_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Total_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Total_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Net_Total_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Net_Total_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Net_Total_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Shortwave_Flux_Down_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Shortwave_Flux_Down_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Shortwave_Flux_Down_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Shortwave_Flux_Up_All_Sky_Monthly":{"title":"CERES_EBAF_Surface_Shortwave_Flux_Up_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Shortwave_Flux_Up_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Shortwave_Flux_Down_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Shortwave_Flux_Down_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Shortwave_Flux_Down_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_Surface_Shortwave_Flux_Up_Clear_Sky_Monthly":{"title":"CERES_EBAF_Surface_Shortwave_Flux_Up_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_Surface_Shortwave_Flux_Up_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_CRE_Longwave_Flux_Monthly":{"title":"CERES_EBAF_TOA_CRE_Longwave_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_CRE_Longwave_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_CRE_Net_Flux_Monthly":{"title":"CERES_EBAF_TOA_CRE_Net_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_CRE_Net_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_CRE_Shortwave_Flux_Monthly":{"title":"CERES_EBAF_TOA_CRE_Shortwave_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_CRE_Shortwave_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Longwave_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_TOA_Longwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Longwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Longwave_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_TOA_Longwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Longwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Net_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_TOA_Net_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Net_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Net_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_TOA_Net_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Net_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Incoming_Solar_Flux_Monthly":{"title":"CERES_EBAF_TOA_Incoming_Solar_Flux_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Incoming_Solar_Flux_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Shortwave_Flux_All_Sky_Monthly":{"title":"CERES_EBAF_TOA_Shortwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Shortwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_EBAF_TOA_Shortwave_Flux_Clear_Sky_Monthly":{"title":"CERES_EBAF_TOA_Shortwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_EBAF_TOA_Shortwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Longwave_Flux_All_Sky_Monthly":{"title":"CERES_Terra_TOA_Longwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Longwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Longwave_Flux_Clear_Sky_Monthly":{"title":"CERES_Terra_TOA_Longwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Longwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Shortwave_Flux_All_Sky_Monthly":{"title":"CERES_Terra_TOA_Shortwave_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Shortwave_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Shortwave_Flux_Clear_Sky_Monthly":{"title":"CERES_Terra_TOA_Shortwave_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Shortwave_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Window_Region_Flux_All_Sky_Monthly":{"title":"CERES_Terra_TOA_Window_Region_Flux_All_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Window_Region_Flux_All_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"CERES_Terra_TOA_Window_Region_Flux_Clear_Sky_Monthly":{"title":"CERES_Terra_TOA_Window_Region_Flux_Clear_Sky_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/CERES_Terra_TOA_Window_Region_Flux_Clear_Sky_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"Coastlines":{"title":"Coastlines","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/Coastlines/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":false},"GHRSST_L4_G1SST_Sea_Surface_Temperature":{"title":"GHRSST_L4_G1SST_Sea_Surface_Temperature","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GHRSST_L4_G1SST_Sea_Surface_Temperature/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"GHRSST_L4_MUR_Sea_Surface_Temperature":{"title":"GHRSST_L4_MUR_Sea_Surface_Temperature","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GHRSST_L4_MUR_Sea_Surface_Temperature/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"GMI_Rain_Rate_Asc":{"title":"GMI_Rain_Rate_Asc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Rain_Rate_Asc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Rain_Rate_Dsc":{"title":"GMI_Rain_Rate_Dsc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Rain_Rate_Dsc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Brightness_Temp_Asc":{"title":"GMI_Brightness_Temp_Asc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Brightness_Temp_Asc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Brightness_Temp_Dsc":{"title":"GMI_Brightness_Temp_Dsc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Brightness_Temp_Dsc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Snow_Rate_Asc":{"title":"GMI_Snow_Rate_Asc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Snow_Rate_Asc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"GMI_Snow_Rate_Dsc":{"title":"GMI_Snow_Rate_Dsc","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/GMI_Snow_Rate_Dsc/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Combined_Value_Added_AOD":{"title":"MODIS_Combined_Value_Added_AOD","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Combined_Value_Added_AOD/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MEaSUREs_Daily_Landscape_Freeze_Thaw_AMSRE":{"title":"MEaSUREs_Daily_Landscape_Freeze_Thaw_AMSRE","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MEaSUREs_Daily_Landscape_Freeze_Thaw_AMSRE/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI":{"title":"MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MEaSUREs_Daily_Landscape_Freeze_Thaw_SSMI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MISR_Directional_Hemispherical_Reflectance_Average_Natural_Color_Monthly":{"title":"MISR_Directional_Hemispherical_Reflectance_Average_Natural_Color_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MISR_Directional_Hemispherical_Reflectance_Average_Natural_Color_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MISR_Radiance_Average_Infrared_Color_Monthly":{"title":"MISR_Radiance_Average_Infrared_Color_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MISR_Radiance_Average_Infrared_Color_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MISR_Radiance_Average_Natural_Color_Monthly":{"title":"MISR_Radiance_Average_Natural_Color_Monthly","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MISR_Radiance_Average_Natural_Color_Monthly/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_CO_215hPa_Day":{"title":"MLS_CO_215hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_CO_215hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_CO_215hPa_Night":{"title":"MLS_CO_215hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_CO_215hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_H2O_46hPa_Day":{"title":"MLS_H2O_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_H2O_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_H2O_46hPa_Night":{"title":"MLS_H2O_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_H2O_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_HNO3_46hPa_Day":{"title":"MLS_HNO3_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_HNO3_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_HNO3_46hPa_Night":{"title":"MLS_HNO3_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_HNO3_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_N2O_46hPa_Day":{"title":"MLS_N2O_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_N2O_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_N2O_46hPa_Night":{"title":"MLS_N2O_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_N2O_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_O3_46hPa_Day":{"title":"MLS_O3_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_O3_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_O3_46hPa_Night":{"title":"MLS_O3_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_O3_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_SO2_147hPa_Day":{"title":"MLS_SO2_147hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_SO2_147hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_SO2_147hPa_Night":{"title":"MLS_SO2_147hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_SO2_147hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_Temperature_46hPa_Day":{"title":"MLS_Temperature_46hPa_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_Temperature_46hPa_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MLS_Temperature_46hPa_Night":{"title":"MLS_Temperature_46hPa_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MLS_Temperature_46hPa_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Chlorophyll_A":{"title":"MODIS_Terra_Chlorophyll_A","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Chlorophyll_A/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Water_Mask":{"title":"MODIS_Water_Mask","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Water_Mask/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":false},"MODIS_Terra_Brightness_Temp_Band31_Day":{"title":"MODIS_Terra_Brightness_Temp_Band31_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Brightness_Temp_Band31_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Brightness_Temp_Band31_Night":{"title":"MODIS_Terra_Brightness_Temp_Band31_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Brightness_Temp_Band31_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Aerosol_Optical_Depth_3km":{"title":"MODIS_Terra_Aerosol_Optical_Depth_3km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Aerosol_Optical_Depth_3km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Angstrom_Exponent_Land":{"title":"MODIS_Terra_Angstrom_Exponent_Land","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Angstrom_Exponent_Land/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Angstrom_Exponent_Ocean":{"title":"MODIS_Terra_Angstrom_Exponent_Ocean","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Angstrom_Exponent_Ocean/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_AOD_Deep_Blue_Land":{"title":"MODIS_Terra_AOD_Deep_Blue_Land","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_AOD_Deep_Blue_Land/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_AOD_Deep_Blue_Combined":{"title":"MODIS_Terra_AOD_Deep_Blue_Combined","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_AOD_Deep_Blue_Combined/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Aerosol":{"title":"MODIS_Terra_Aerosol","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Aerosol/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Water_Vapor_5km_Day":{"title":"MODIS_Terra_Water_Vapor_5km_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Water_Vapor_5km_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Water_Vapor_5km_Night":{"title":"MODIS_Terra_Water_Vapor_5km_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Water_Vapor_5km_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Effective_Radius_37_PCL":{"title":"MODIS_Terra_Cloud_Effective_Radius_37_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Effective_Radius_37_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Effective_Radius_37":{"title":"MODIS_Terra_Cloud_Effective_Radius_37","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Effective_Radius_37/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Effective_Radius":{"title":"MODIS_Terra_Cloud_Effective_Radius","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Effective_Radius/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Effective_Radius_PCL":{"title":"MODIS_Terra_Cloud_Effective_Radius_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Effective_Radius_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Multi_Layer_Flag":{"title":"MODIS_Terra_Cloud_Multi_Layer_Flag","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Multi_Layer_Flag/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Optical_Thickness":{"title":"MODIS_Terra_Cloud_Optical_Thickness","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Optical_Thickness/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Optical_Thickness_PCL":{"title":"MODIS_Terra_Cloud_Optical_Thickness_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Optical_Thickness_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Phase_Optical_Properties":{"title":"MODIS_Terra_Cloud_Phase_Optical_Properties","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Phase_Optical_Properties/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Water_Path":{"title":"MODIS_Terra_Cloud_Water_Path","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Water_Path/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Water_Path_PCL":{"title":"MODIS_Terra_Cloud_Water_Path_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Water_Path_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Cloud_Fraction_Day":{"title":"MODIS_Terra_Cloud_Fraction_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Fraction_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Phase_Infrared_Day":{"title":"MODIS_Terra_Cloud_Phase_Infrared_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Phase_Infrared_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Height_Day":{"title":"MODIS_Terra_Cloud_Top_Height_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Height_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Pressure_Day":{"title":"MODIS_Terra_Cloud_Top_Pressure_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Pressure_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Temp_Day":{"title":"MODIS_Terra_Cloud_Top_Temp_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Temp_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Fraction_Night":{"title":"MODIS_Terra_Cloud_Fraction_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Fraction_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Phase_Infrared_Night":{"title":"MODIS_Terra_Cloud_Phase_Infrared_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Phase_Infrared_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Height_Night":{"title":"MODIS_Terra_Cloud_Top_Height_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Height_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Pressure_Night":{"title":"MODIS_Terra_Cloud_Top_Pressure_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Pressure_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_Cloud_Top_Temp_Night":{"title":"MODIS_Terra_Cloud_Top_Temp_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Cloud_Top_Temp_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Terra_SurfaceReflectance_Bands143":{"title":"MODIS_Terra_SurfaceReflectance_Bands143","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_SurfaceReflectance_Bands143/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":true},"MODIS_Terra_SurfaceReflectance_Bands721":{"title":"MODIS_Terra_SurfaceReflectance_Bands721","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_SurfaceReflectance_Bands721/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":true},"MODIS_Terra_SurfaceReflectance_Bands121":{"title":"MODIS_Terra_SurfaceReflectance_Bands121","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_SurfaceReflectance_Bands121/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Terra_Snow_Cover":{"title":"MODIS_Terra_Snow_Cover","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Snow_Cover/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":8,"date":true},"MODIS_Terra_Land_Surface_Temp_Day":{"title":"MODIS_Terra_Land_Surface_Temp_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Land_Surface_Temp_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Land_Surface_Temp_Night":{"title":"MODIS_Terra_Land_Surface_Temp_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Land_Surface_Temp_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_Sea_Ice":{"title":"MODIS_Terra_Sea_Ice","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Sea_Ice/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Terra_CorrectedReflectance_TrueColor":{"title":"MODIS_Terra_CorrectedReflectance_TrueColor","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_TrueColor/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Terra_CorrectedReflectance_Bands367":{"title":"MODIS_Terra_CorrectedReflectance_Bands367","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_Bands367/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Terra_CorrectedReflectance_Bands721":{"title":"MODIS_Terra_CorrectedReflectance_Bands721","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_CorrectedReflectance_Bands721/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MOPITT_CO_Daily_Surface_Mixing_Ratio_Night":{"title":"MOPITT_CO_Daily_Surface_Mixing_Ratio_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Daily_Surface_Mixing_Ratio_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Daily_Surface_Mixing_Ratio_Day":{"title":"MOPITT_CO_Daily_Surface_Mixing_Ratio_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Daily_Surface_Mixing_Ratio_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Daily_Total_Column_Night":{"title":"MOPITT_CO_Daily_Total_Column_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Daily_Total_Column_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Daily_Total_Column_Day":{"title":"MOPITT_CO_Daily_Total_Column_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Daily_Total_Column_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Monthly_Surface_Mixing_Ratio_Night":{"title":"MOPITT_CO_Monthly_Surface_Mixing_Ratio_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Monthly_Surface_Mixing_Ratio_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Monthly_Surface_Mixing_Ratio_Day":{"title":"MOPITT_CO_Monthly_Surface_Mixing_Ratio_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Monthly_Surface_Mixing_Ratio_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Monthly_Total_Column_Night":{"title":"MOPITT_CO_Monthly_Total_Column_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Monthly_Total_Column_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MOPITT_CO_Monthly_Total_Column_Day":{"title":"MOPITT_CO_Monthly_Total_Column_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MOPITT_CO_Monthly_Total_Column_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Chlorophyll_A":{"title":"MODIS_Aqua_Chlorophyll_A","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Chlorophyll_A/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Brightness_Temp_Band31_Day":{"title":"MODIS_Aqua_Brightness_Temp_Band31_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Brightness_Temp_Band31_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Brightness_Temp_Band31_Night":{"title":"MODIS_Aqua_Brightness_Temp_Band31_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Brightness_Temp_Band31_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Aerosol_Optical_Depth_3km":{"title":"MODIS_Aqua_Aerosol_Optical_Depth_3km","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Aerosol_Optical_Depth_3km/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Angstrom_Exponent_Land":{"title":"MODIS_Aqua_Angstrom_Exponent_Land","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Angstrom_Exponent_Land/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Angstrom_Exponent_Ocean":{"title":"MODIS_Aqua_Angstrom_Exponent_Ocean","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Angstrom_Exponent_Ocean/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_AOD_Deep_Blue_Land":{"title":"MODIS_Aqua_AOD_Deep_Blue_Land","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_AOD_Deep_Blue_Land/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_AOD_Deep_Blue_Combined":{"title":"MODIS_Aqua_AOD_Deep_Blue_Combined","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_AOD_Deep_Blue_Combined/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Aerosol":{"title":"MODIS_Aqua_Aerosol","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Aerosol/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Water_Vapor_5km_Day":{"title":"MODIS_Aqua_Water_Vapor_5km_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Water_Vapor_5km_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Water_Vapor_5km_Night":{"title":"MODIS_Aqua_Water_Vapor_5km_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Water_Vapor_5km_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Effective_Radius_37_PCL":{"title":"MODIS_Aqua_Cloud_Effective_Radius_37_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Effective_Radius_37_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Effective_Radius_37":{"title":"MODIS_Aqua_Cloud_Effective_Radius_37","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Effective_Radius_37/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Effective_Radius":{"title":"MODIS_Aqua_Cloud_Effective_Radius","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Effective_Radius/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Effective_Radius_PCL":{"title":"MODIS_Aqua_Cloud_Effective_Radius_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Effective_Radius_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Multi_Layer_Flag":{"title":"MODIS_Aqua_Cloud_Multi_Layer_Flag","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Multi_Layer_Flag/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Optical_Thickness":{"title":"MODIS_Aqua_Cloud_Optical_Thickness","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Optical_Thickness/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Optical_Thickness_PCL":{"title":"MODIS_Aqua_Cloud_Optical_Thickness_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Optical_Thickness_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Phase_Optical_Properties":{"title":"MODIS_Aqua_Cloud_Phase_Optical_Properties","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Phase_Optical_Properties/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Water_Path":{"title":"MODIS_Aqua_Cloud_Water_Path","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Water_Path/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Water_Path_PCL":{"title":"MODIS_Aqua_Cloud_Water_Path_PCL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Water_Path_PCL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Cloud_Fraction_Day":{"title":"MODIS_Aqua_Cloud_Fraction_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Fraction_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Phase_Infrared_Day":{"title":"MODIS_Aqua_Cloud_Phase_Infrared_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Phase_Infrared_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Height_Day":{"title":"MODIS_Aqua_Cloud_Top_Height_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Height_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Pressure_Day":{"title":"MODIS_Aqua_Cloud_Top_Pressure_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Pressure_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Temp_Day":{"title":"MODIS_Aqua_Cloud_Top_Temp_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Temp_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Fraction_Night":{"title":"MODIS_Aqua_Cloud_Fraction_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Fraction_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Phase_Infrared_Night":{"title":"MODIS_Aqua_Cloud_Phase_Infrared_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Phase_Infrared_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Height_Night":{"title":"MODIS_Aqua_Cloud_Top_Height_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Height_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Pressure_Night":{"title":"MODIS_Aqua_Cloud_Top_Pressure_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Pressure_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_Cloud_Top_Temp_Night":{"title":"MODIS_Aqua_Cloud_Top_Temp_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Cloud_Top_Temp_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"MODIS_Aqua_SurfaceReflectance_Bands143":{"title":"MODIS_Aqua_SurfaceReflectance_Bands143","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_SurfaceReflectance_Bands143/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":true},"MODIS_Aqua_SurfaceReflectance_Bands721":{"title":"MODIS_Aqua_SurfaceReflectance_Bands721","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_SurfaceReflectance_Bands721/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":true},"MODIS_Aqua_SurfaceReflectance_Bands121":{"title":"MODIS_Aqua_SurfaceReflectance_Bands121","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_SurfaceReflectance_Bands121/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Aqua_Snow_Cover":{"title":"MODIS_Aqua_Snow_Cover","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Snow_Cover/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":8,"date":true},"MODIS_Aqua_Land_Surface_Temp_Day":{"title":"MODIS_Aqua_Land_Surface_Temp_Day","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Land_Surface_Temp_Day/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Land_Surface_Temp_Night":{"title":"MODIS_Aqua_Land_Surface_Temp_Night","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Land_Surface_Temp_Night/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_Sea_Ice":{"title":"MODIS_Aqua_Sea_Ice","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Sea_Ice/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":7,"date":true},"MODIS_Aqua_CorrectedReflectance_TrueColor":{"title":"MODIS_Aqua_CorrectedReflectance_TrueColor","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_TrueColor/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"MODIS_Aqua_CorrectedReflectance_Bands721":{"title":"MODIS_Aqua_CorrectedReflectance_Bands721","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_CorrectedReflectance_Bands721/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"OMI_Absorbing_Aerosol_Optical_Depth":{"title":"OMI_Absorbing_Aerosol_Optical_Depth","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_Absorbing_Aerosol_Optical_Depth/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_Aerosol_Index":{"title":"OMI_Aerosol_Index","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_Aerosol_Index/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_Aerosol_Optical_Depth":{"title":"OMI_Aerosol_Optical_Depth","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_Aerosol_Optical_Depth/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_Cloud_Pressure":{"title":"OMI_Cloud_Pressure","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_Cloud_Pressure/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_SO2_Upper_Troposphere_and_Stratosphere":{"title":"OMI_SO2_Upper_Troposphere_and_Stratosphere","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_SO2_Upper_Troposphere_and_Stratosphere/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_SO2_Lower_Troposphere":{"title":"OMI_SO2_Lower_Troposphere","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_SO2_Lower_Troposphere/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"OMI_SO2_Middle_Troposphere":{"title":"OMI_SO2_Middle_Troposphere","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/OMI_SO2_Middle_Troposphere/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"Reference_Features":{"title":"Reference_Features","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/Reference_Features/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":false},"Reference_Labels":{"title":"Reference_Labels","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/Reference_Labels/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":9,"date":false},"SMAP_L1_Passive_Faraday_Rotation_Aft":{"title":"SMAP_L1_Passive_Faraday_Rotation_Aft","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Faraday_Rotation_Aft/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Faraday_Rotation_Fore":{"title":"SMAP_L1_Passive_Faraday_Rotation_Fore","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Faraday_Rotation_Fore/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_H_QA":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_H_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_H_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_H_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_H":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_H_QA":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_H_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_H_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_H_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_H":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_V_QA":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_V_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_V_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_V_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Aft_V":{"title":"SMAP_L1_Passive_Brightness_Temp_Aft_V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Aft_V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_V_QA":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_V_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_V_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_V_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L1_Passive_Brightness_Temp_Fore_V":{"title":"SMAP_L1_Passive_Brightness_Temp_Fore_V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L1_Passive_Brightness_Temp_Fore_V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L2_Passive_Soil_Moisture_Option1":{"title":"SMAP_L2_Passive_Soil_Moisture_Option1","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L2_Passive_Soil_Moisture_Option1/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L2_Passive_Soil_Moisture_Option2":{"title":"SMAP_L2_Passive_Soil_Moisture_Option2","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L2_Passive_Soil_Moisture_Option2/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L2_Passive_Soil_Moisture_Option3":{"title":"SMAP_L2_Passive_Soil_Moisture_Option3","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L2_Passive_Soil_Moisture_Option3/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_HH_QA":{"title":"SMAP_L3_Active_Sigma0_HH_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_HH_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_HH_RFI":{"title":"SMAP_L3_Active_Sigma0_HH_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_HH_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_HH":{"title":"SMAP_L3_Active_Sigma0_HH","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_HH/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_VV_QA":{"title":"SMAP_L3_Active_Sigma0_VV_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_VV_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_VV_RFI":{"title":"SMAP_L3_Active_Sigma0_VV_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_VV_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_VV":{"title":"SMAP_L3_Active_Sigma0_VV","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_VV/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_XPOL_QA":{"title":"SMAP_L3_Active_Sigma0_XPOL_QA","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_XPOL_QA/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_XPOL_RFI":{"title":"SMAP_L3_Active_Sigma0_XPOL_RFI","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_XPOL_RFI/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Sigma0_XPOL":{"title":"SMAP_L3_Active_Sigma0_XPOL","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Sigma0_XPOL/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Soil_Moisture":{"title":"SMAP_L3_Active_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Passive_Soil_Moisture":{"title":"SMAP_L3_Active_Passive_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Passive_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Passive_Soil_Moisture":{"title":"SMAP_L3_Passive_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Passive_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Passive_Brightness_Temp_H":{"title":"SMAP_L3_Active_Passive_Brightness_Temp_H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Passive_Brightness_Temp_H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Passive_Brightness_Temp_H":{"title":"SMAP_L3_Passive_Brightness_Temp_H","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Passive_Brightness_Temp_H/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Active_Passive_Brightness_Temp_V":{"title":"SMAP_L3_Active_Passive_Brightness_Temp_V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Active_Passive_Brightness_Temp_V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L3_Passive_Brightness_Temp_V":{"title":"SMAP_L3_Passive_Brightness_Temp_V","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L3_Passive_Brightness_Temp_V/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Analyzed_Root_Zone_Soil_Moisture":{"title":"SMAP_L4_Analyzed_Root_Zone_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Analyzed_Root_Zone_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Analyzed_Surface_Soil_Moisture":{"title":"SMAP_L4_Analyzed_Surface_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Analyzed_Surface_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Emult_Average":{"title":"SMAP_L4_Emult_Average","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Emult_Average/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Frozen_Area":{"title":"SMAP_L4_Frozen_Area","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Frozen_Area/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Mean_Gross_Primary_Productivity":{"title":"SMAP_L4_Mean_Gross_Primary_Productivity","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Mean_Gross_Primary_Productivity/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Mean_Net_Ecosystem_Exchange":{"title":"SMAP_L4_Mean_Net_Ecosystem_Exchange","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Mean_Net_Ecosystem_Exchange/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Mean_Heterotrophic_Respiration":{"title":"SMAP_L4_Mean_Heterotrophic_Respiration","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Mean_Heterotrophic_Respiration/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Snow_Mass":{"title":"SMAP_L4_Snow_Mass","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Snow_Mass/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Soil_Temperature_Layer_1":{"title":"SMAP_L4_Soil_Temperature_Layer_1","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Soil_Temperature_Layer_1/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Uncertainty_Analyzed_Root_Zone_Soil_Moisture":{"title":"SMAP_L4_Uncertainty_Analyzed_Root_Zone_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Uncertainty_Analyzed_Root_Zone_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Uncertainty_Analyzed_Surface_Soil_Moisture":{"title":"SMAP_L4_Uncertainty_Analyzed_Surface_Soil_Moisture","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Uncertainty_Analyzed_Surface_Soil_Moisture/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":true},"SMAP_L4_Uncertainty_Mean_Net_Ecosystem_Exchange":{"title":"SMAP_L4_Uncertainty_Mean_Net_Ecosystem_Exchange","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/SMAP_L4_Uncertainty_Mean_Net_Ecosystem_Exchange/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":6,"date":false},"VIIRS_CityLights_2012":{"title":"VIIRS_CityLights_2012","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_CityLights_2012/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":8,"date":false},"VIIRS_SNPP_DayNightBand_ENCC":{"title":"VIIRS_SNPP_DayNightBand_ENCC","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_DayNightBand_ENCC/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png","zoom":8,"date":true},"VIIRS_SNPP_CorrectedReflectance_TrueColor":{"title":"VIIRS_SNPP_CorrectedReflectance_TrueColor","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_CorrectedReflectance_TrueColor/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1":{"title":"VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true},"VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11":{"title":"VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11","template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_SNPP_CorrectedReflectance_BandsM3-I3-M11/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg","zoom":9,"date":true}} \ No newline at end of file diff --git a/inst/htmlwidgets/lfx-gibs/gibs_mask_meta.json b/inst/htmlwidgets/lfx-gibs/gibs_mask_meta.json new file mode 100644 index 00000000..63d309d0 --- /dev/null +++ b/inst/htmlwidgets/lfx-gibs/gibs_mask_meta.json @@ -0,0 +1,13 @@ +{ + "MODIS_Terra_Data_No_Data": { + "title":"MODIS_Terra_Data_No_Data", + "template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Terra_Data_No_Data/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png", + "zoom": 9, "date": true + } + , + "MODIS_Aqua_Data_No_Data": { + "title":"MODIS_Aqua_Data_No_Data", + "template":"http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/MODIS_Aqua_Data_No_Data/default/{Time}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png", + "zoom": 9, "date": true + } +} \ No newline at end of file diff --git a/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph-bindings.js b/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph-bindings.js new file mode 100644 index 00000000..d89ac920 --- /dev/null +++ b/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph-bindings.js @@ -0,0 +1,38 @@ +LeafletWidget.methods.addHeightgraph = function(data, props, layerId, group, geojson_opts, options) { + var map = this; + + // Add Last Coordinates of every Linestring to first Coordinates of next Linestring + var propkeys = Object.keys(props); + for (var i = 0; i < data.length; i++) { + data[i].properties = {records: props[propkeys[i]].length, summary: propkeys[i]}; + var tmp = data[i].features; + for (var j = 0; j < tmp.length; j++) { + if (tmp[j + 1]) { + var lncrd = tmp[j].geometry.coordinates.length; + tmp[j + 1].geometry.coordinates.unshift( + tmp[j].geometry.coordinates[lncrd - 1]); + } + } + } + + // Add Control + Data to Control + var hg = L.control.heightgraph(options); + map.controls.add(hg, "hg_control"); + hg.addData(data); + + // Add Geojson to Map + let gjlayer = L.geoJson(data, { + onEachFeature: function(feature, layer) { + let extraInfo = { + featureId: feature.id, + properties: feature.properties + }; + let popup = feature.properties ? feature.properties.popup : null; + if (typeof popup !== "undefined" && popup !== null) layer.bindPopup(popup); + layer.on("click", LeafletWidget.methods.mouseHandler(map.id, layerId, group, "heightgraph_click", extraInfo), this); + layer.on("mouseover", LeafletWidget.methods.mouseHandler(map.id, layerId, group, "heightgraph_mouseover", extraInfo), this); + layer.on("mouseout", LeafletWidget.methods.mouseHandler(map.id, layerId, group, "heightgraph_mouseout", extraInfo), this); + } + }); + map.layerManager.addLayer(gjlayer, "geojson", layerId, group); +}; diff --git a/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph.css b/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph.css new file mode 100644 index 00000000..2b71e899 --- /dev/null +++ b/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph.css @@ -0,0 +1 @@ +.heightgraph-container{background-color:rgba(250,250,250,.8);border-radius:10px;display:none;cursor:default;user-select:none}.heightgraph-toggle{cursor:pointer;box-shadow:0 1px 7px rgba(0,0,0,.4);border-radius:5px;width:28px;height:28px;background:#f8f8f9;display:block}.heightgraph-toggle-icon{background:url(img/area-chart.svg) no-repeat center center;background-size:14px 14px;width:26px;height:26px;position:absolute}.heightgraph-close-icon{background:url(img/remove.svg) no-repeat center center;background-size:14px 14px;width:26px;height:26px;position:absolute;right:0;display:none;cursor:pointer}.border-top{fill:none}.legend-hover{cursor:pointer}.legend-text{fill:#000;font-size:10px;cursor:pointer}.tick,.tick text{fill:#000;pointer-events:none}.axis .tick line{visibility:hidden;pointer-events:none}.axis path{stroke:#000;fill:none;stroke-width:2px;shape-rendering:crispEdges;pointer-events:none}.focusbox{display:none;font-size:10px;fill:#000;pointer-events:none}.focusbox rect{fill:rgba(255,255,255,.8);stroke-width:1px;stroke:#888;pointer-events:none}.focusbox text{font-size:12px}.focusLine line{stroke-width:1px;stroke:#141414;display:none;cursor:default;shape-rendering:crispEdges}.height-focus.label rect{fill:rgba(255,255,255,.5);stroke-width:1px;stroke:#888;pointer-events:none;shape-rendering:crispEdges}.height-focus.line{stroke:#141414;stroke-width:1px;shape-rendering:crispEdges}.height-focus.circle{stroke:#fff;stroke-width:1px}.mouse-height-box-text{font-size:12px}.grid .tick{pointer-events:none}.grid .tick line{stroke:#eee;stroke-width:1px;shape-rendering:crispEdges}.grid path{stroke-width:0;pointer-events:none}.tspan{font-weight:700}.select-symbol{cursor:pointer}.select-info{cursor:default}.lineSelection{cursor:move} diff --git a/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph.js b/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph.js new file mode 100644 index 00000000..008c4c1b --- /dev/null +++ b/inst/htmlwidgets/lfx-heightgraph/L.Control.Heightgraph.js @@ -0,0 +1 @@ +!function(){"use strict";function t(n){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(n)}function n(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function e(t,n){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),e.push.apply(e,r)}return e}function r(t){for(var r=1;rt.length)&&(n=t.length);for(var e=0,r=new Array(n);e=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,s=!0,u=!1;return{s:function(){e=t[Symbol.iterator]()},n:function(){var t=e.next();return s=t.done,t},e:function(t){u=!0,a=t},f:function(){try{s||null==e.return||e.return()}finally{if(u)throw a}}}}var a="http://www.w3.org/1999/xhtml",s={svg:"http://www.w3.org/2000/svg",xhtml:a,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function u(t){var n=t+="",e=n.indexOf(":");return e>=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),s.hasOwnProperty(n)?{space:s[n],local:t}:t}function l(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===a&&n.documentElement.namespaceURI===a?n.createElement(t):n.createElementNS(e,t)}}function h(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function c(t){var n=u(t);return(n.local?h:l)(n)}function f(){}function d(t){return null==t?f:function(){return this.querySelector(t)}}function p(){return[]}function g(t){return null==t?p:function(){return this.querySelectorAll(t)}}function _(t){return function(){return this.matches(t)}}function v(t){return new Array(t.length)}function y(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}y.prototype={constructor:y,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,n){return this._parent.insertBefore(t,n)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};function m(t,n,e,r,i,o){for(var a,s=0,u=n.length,l=o.length;sn?1:t>=n?0:NaN}function b(t){return function(){this.removeAttribute(t)}}function M(t){return function(){this.removeAttributeNS(t.space,t.local)}}function k(t,n){return function(){this.setAttribute(t,n)}}function A(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function S(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function T(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}function N(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function C(t){return function(){this.style.removeProperty(t)}}function E(t,n,e){return function(){this.style.setProperty(t,n,e)}}function H(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}function D(t,n){return t.style.getPropertyValue(n)||N(t).getComputedStyle(t,null).getPropertyValue(n)}function F(t){return function(){delete this[t]}}function P(t,n){return function(){this[t]=n}}function B(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function O(t){return t.trim().split(/^|\s+/)}function z(t){return t.classList||new I(t)}function I(t){this._node=t,this._names=O(t.getAttribute("class")||"")}function j(t,n){for(var e=z(t),r=-1,i=n.length;++r=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var rt={},it=null;"undefined"!=typeof document&&("onmouseenter"in document.documentElement||(rt={mouseenter:"mouseover",mouseleave:"mouseout"}));function ot(t,n,e){return t=at(t,n,e),function(n){var e=n.relatedTarget;e&&(e===this||8&e.compareDocumentPosition(this))||t.call(this,n)}}function at(t,n,e){return function(r){var i=it;it=r;try{t.call(this,this.__data__,n,e)}finally{it=i}}}function st(t){return t.trim().split(/^|\s+/).map((function(t){var n="",e=t.indexOf(".");return e>=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}}))}function ut(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1,o=n.length;r=b&&(b=w+1);!(y=_[b])&&++b=0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=w);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?C:"function"==typeof n?H:E)(t,n,null==e?"":e)):D(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?F:"function"==typeof n?B:P)(t,n)):this.node()[t]},classed:function(t,n){var e=O(t+"");if(arguments.length<2){for(var r=z(this.node()),i=-1,o=e.length;++i=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))}function Tt(t,n){for(var e,r=0,i=t.length;r0)for(var e,r,i=new Array(e),o=0;o=0&&n._call.call(null,t),n=n._next;--Ht}()}finally{Ht=0,function(){var t,n,e=Ct,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Ct=n);Et=t,Gt(r)}(),Pt=0}}function $t(){var t=Ot.now(),n=t-Ft;n>1e3&&(Bt-=n,Ft=t)}function Gt(t){Ht||(Lt&&(Lt=clearTimeout(Lt)),t-Pt>24?(t<1/0&&(Lt=setTimeout(Xt,t-Ot.now()-Bt)),Dt&&(Dt=clearInterval(Dt))):(Dt||(Ft=Ot.now(),Dt=setInterval($t,1e3)),Ht=1,zt(Xt)))}function Vt(t,n,e){var r=new Rt;return n=null==n?0:+n,r.restart((function(e){r.stop(),t(e+n)}),n,e),r}Rt.prototype=qt.prototype={constructor:Rt,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?It():+e)+(null==n?0:+n),this._next||Et===this||(Et?Et._next=this:Ct=this,Et=this),this._call=t,this._time=e,Gt()},stop:function(){this._call&&(this._call=null,this._time=1/0,Gt())}};var Yt=kt("start","end","cancel","interrupt"),Ut=[];function Wt(t,n,e,r,i,o){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var r,i=t.__transition;function o(u){var l,h,c,f;if(1!==e.state)return s();for(l in i)if((f=i[l]).name===e.name){if(3===f.state)return Vt(o);4===f.state?(f.state=6,f.timer.stop(),f.on.call("interrupt",t,t.__data__,f.index,f.group),delete i[l]):+l0)throw new Error("too late; already scheduled");return e}function Kt(t,n){var e=Qt(t,n);if(e.state>3)throw new Error("too late; already running");return e}function Qt(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function Jt(t,n,e){t.prototype=n.prototype=e,e.constructor=t}function tn(t,n){var e=Object.create(t.prototype);for(var r in n)e[r]=n[r];return e}function nn(){}var en="\\s*([+-]?\\d+)\\s*",rn="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",on="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",an=/^#([0-9a-f]{3,8})$/,sn=new RegExp("^rgb\\("+[en,en,en]+"\\)$"),un=new RegExp("^rgb\\("+[on,on,on]+"\\)$"),ln=new RegExp("^rgba\\("+[en,en,en,rn]+"\\)$"),hn=new RegExp("^rgba\\("+[on,on,on,rn]+"\\)$"),cn=new RegExp("^hsl\\("+[rn,on,on]+"\\)$"),fn=new RegExp("^hsla\\("+[rn,on,on,rn]+"\\)$"),dn={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function pn(){return this.rgb().formatHex()}function gn(){return this.rgb().formatRgb()}function _n(t){var n,e;return t=(t+"").trim().toLowerCase(),(n=an.exec(t))?(e=n[1].length,n=parseInt(n[1],16),6===e?vn(n):3===e?new wn(n>>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):8===e?yn(n>>24&255,n>>16&255,n>>8&255,(255&n)/255):4===e?yn(n>>12&15|n>>8&240,n>>8&15|n>>4&240,n>>4&15|240&n,((15&n)<<4|15&n)/255):null):(n=sn.exec(t))?new wn(n[1],n[2],n[3],1):(n=un.exec(t))?new wn(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=ln.exec(t))?yn(n[1],n[2],n[3],n[4]):(n=hn.exec(t))?yn(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=cn.exec(t))?An(n[1],n[2]/100,n[3]/100,1):(n=fn.exec(t))?An(n[1],n[2]/100,n[3]/100,n[4]):dn.hasOwnProperty(t)?vn(dn[t]):"transparent"===t?new wn(NaN,NaN,NaN,0):null}function vn(t){return new wn(t>>16&255,t>>8&255,255&t,1)}function yn(t,n,e,r){return r<=0&&(t=n=e=NaN),new wn(t,n,e,r)}function mn(t){return t instanceof nn||(t=_n(t)),t?new wn((t=t.rgb()).r,t.g,t.b,t.opacity):new wn}function xn(t,n,e,r){return 1===arguments.length?mn(t):new wn(t,n,e,null==r?1:r)}function wn(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function bn(){return"#"+kn(this.r)+kn(this.g)+kn(this.b)}function Mn(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function kn(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function An(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new Tn(t,n,e,r)}function Sn(t){if(t instanceof Tn)return new Tn(t.h,t.s,t.l,t.opacity);if(t instanceof nn||(t=_n(t)),!t)return new Tn;if(t instanceof Tn)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),a=NaN,s=o-i,u=(o+i)/2;return s?(a=n===o?(e-r)/s+6*(e0&&u<1?0:a,new Tn(a,s,u,t.opacity)}function Tn(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function Nn(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}function Cn(t){return function(){return t}}function En(t){return 1==(t=+t)?Hn:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):Cn(isNaN(n)?e:n)}}function Hn(t,n){var e=n-t;return e?function(t,n){return function(e){return t+e*n}}(t,e):Cn(isNaN(t)?n:t)}Jt(nn,_n,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:pn,formatHex:pn,formatHsl:function(){return Sn(this).formatHsl()},formatRgb:gn,toString:gn}),Jt(wn,xn,tn(nn,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new wn(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new wn(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:bn,formatHex:bn,formatRgb:Mn,toString:Mn})),Jt(Tn,(function(t,n,e,r){return 1===arguments.length?Sn(t):new Tn(t,n,e,null==r?1:r)}),tn(nn,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Tn(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Tn(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,r=e+(e<.5?e:1-e)*n,i=2*e-r;return new wn(Nn(t>=240?t-240:t+120,i,r),Nn(t,i,r),Nn(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));var Ln=function t(n){var e=En(n);function r(t,n){var r=e((t=xn(t)).r,(n=xn(n)).r),i=e(t.g,n.g),o=e(t.b,n.b),a=Hn(t.opacity,n.opacity);return function(n){return t.r=r(n),t.g=i(n),t.b=o(n),t.opacity=a(n),t+""}}return r.gamma=t,r}(1);function Dn(t,n){n||(n=[]);var e,r=t?Math.min(n.length,t.length):0,i=n.slice();return function(o){for(e=0;eo&&(i=n.slice(o,i),s[a]?s[a]+=i:s[++a]=i),(e=e[0])===(r=r[0])?s[a]?s[a]+=r:s[++a]=r:(s[++a]=null,u.push({i:a,x:Bn(e,r)})),o=In.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:Bn(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,a.rotate,s,u),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:Bn(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,a.skewX,s,u),function(t,n,e,r,o,a){if(t!==e||n!==r){var s=o.push(i(o)+"scale(",null,",",null,")");a.push({i:s-4,x:Bn(t,e)},{i:s-2,x:Bn(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,a.scaleX,a.scaleY,s,u),o=a=null,function(t){for(var n,e=-1,r=u.length;++e=0&&(t=t.slice(0,n)),!t||"start"===t}))}(n)?Zt:Kt;return function(){var a=o(this,t),s=a.on;s!==r&&(i=(r=s).copy()).on(n,e),a.on=i}}var me=_t.prototype.constructor;function xe(t){return function(){this.style.removeProperty(t)}}function we(t,n,e){return function(r){this.style.setProperty(t,n.call(this,r),e)}}function be(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&we(t,o,e)),r}return o._value=n,o}function Me(t){return function(n){this.textContent=t.call(this,n)}}function ke(t){var n,e;function r(){var r=t.apply(this,arguments);return r!==e&&(n=(e=r)&&Me(r)),n}return r._value=t,r}var Ae=0;function Se(t,n,e,r){this._groups=t,this._parents=n,this._name=e,this._id=r}function Te(t){return _t().transition(t)}function Ne(){return++Ae}var Ce=_t.prototype;Se.prototype=Te.prototype={constructor:Se,select:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=d(t));for(var r=this._groups,i=r.length,o=new Array(i),a=0;an?1:t>=n?0:NaN}function Xe(t){var n;return 1===t.length&&(n=t,t=function(t,e){return qe(n(t),e)}),{left:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)<0?r=o+1:i=o}return r},right:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)>0?i=o:r=o+1}return r}}}_t.prototype.interrupt=function(t){return this.each((function(){!function(t,n){var e,r,i,o=t.__transition,a=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>2&&e.state<5,e.state=6,e.timer.stop(),e.on.call(r?"interrupt":"cancel",t,t.__data__,e.index,e.group),delete o[i]):a=!1;a&&delete t.__transition}}(this,t)}))},_t.prototype.transition=function(t){var n,e;t instanceof Se?(n=t._id,t=t._name):(n=Ne(),(e=Ee).time=It(),t=null==t?null:t+"");for(var r=this._groups,i=r.length,o=0;o=0?(o>=Ge?10:o>=Ve?5:o>=Ye?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=Ge?10:o>=Ve?5:o>=Ye?2:1)}function We(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++or&&(r=e)}else for(;++o=e)for(r=e;++or&&(r=e);return r}function Ze(t,n){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(n).domain(t)}return this}function Ke(){}function Qe(t,n){var e=new Ke;if(t instanceof Ke)t.each((function(t,n){e.set(n,t)}));else if(Array.isArray(t)){var r,i=-1,o=t.length;if(null==n)for(;++ir&&(n=e,e=r,r=n),function(t){return Math.max(e,Math.min(r,t))}}function hr(t,n,e){var r=t[0],i=t[1],o=n[0],a=n[1];return i2?cr:hr,i=o=null,c}function c(n){return isNaN(n=+n)?e:(i||(i=r(a.map(t),s,u)))(t(l(n)))}return c.invert=function(e){return l(n((o||(o=r(s,a.map(t),Bn)))(e)))},c.domain=function(t){return arguments.length?(a=er.call(t,or),l===sr||(l=lr(a)),h()):a.slice()},c.range=function(t){return arguments.length?(s=rr.call(t),h()):s.slice()},c.rangeRound=function(t){return s=rr.call(t),u=qn,h()},c.clamp=function(t){return arguments.length?(l=t?lr(a):sr,c):l!==sr},c.interpolate=function(t){return arguments.length?(u=t,h()):u},c.unknown=function(t){return arguments.length?(e=t,c):e},function(e,r){return t=e,n=r,h()}}()(t,n)}function pr(t,n){if((e=(t=n?t.toExponential(n-1):t.toExponential()).indexOf("e"))<0)return null;var e,r=t.slice(0,e);return[r.length>1?r[0]+r.slice(2):r,+t.slice(e+1)]}function gr(t){return(t=pr(Math.abs(t)))?t[1]:NaN}var _r,vr=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function yr(t){if(!(n=vr.exec(t)))throw new Error("invalid format: "+t);var n;return new mr({fill:n[1],align:n[2],sign:n[3],symbol:n[4],zero:n[5],width:n[6],comma:n[7],precision:n[8]&&n[8].slice(1),trim:n[9],type:n[10]})}function mr(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function xr(t,n){var e=pr(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}yr.prototype=mr.prototype,mr.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var wr={"%":function(t,n){return(100*t).toFixed(n)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},g:function(t,n){return t.toPrecision(n)},o:function(t){return Math.round(t).toString(8)},p:function(t,n){return xr(100*t,n)},r:xr,s:function(t,n){var e=pr(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(_r=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+pr(t,Math.max(0,n+o-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function br(t){return t}var Mr,kr,Ar,Sr=Array.prototype.map,Tr=["y","z","a","f","p","n","ยต","m","","k","M","G","T","P","E","Z","Y"];function Nr(t){var n,e,r=void 0===t.grouping||void 0===t.thousands?br:(n=Sr.call(t.grouping,Number),e=t.thousands+"",function(t,r){for(var i=t.length,o=[],a=0,s=n[0],u=0;i>0&&s>0&&(u+s+1>r&&(s=Math.max(1,r-u)),o.push(t.substring(i-=s,i+s)),!((u+=s+1)>r));)s=n[a=(a+1)%n.length];return o.reverse().join(e)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",s=void 0===t.numerals?br:function(t){return function(n){return n.replace(/[0-9]/g,(function(n){return t[+n]}))}}(Sr.call(t.numerals,String)),u=void 0===t.percent?"%":t.percent+"",l=void 0===t.minus?"-":t.minus+"",h=void 0===t.nan?"NaN":t.nan+"";function c(t){var n=(t=yr(t)).fill,e=t.align,c=t.sign,f=t.symbol,d=t.zero,p=t.width,g=t.comma,_=t.precision,v=t.trim,y=t.type;"n"===y?(g=!0,y="g"):wr[y]||(void 0===_&&(_=12),v=!0,y="g"),(d||"0"===n&&"="===e)&&(d=!0,n="0",e="=");var m="$"===f?i:"#"===f&&/[boxX]/.test(y)?"0"+y.toLowerCase():"",x="$"===f?o:/[%p]/.test(y)?u:"",w=wr[y],b=/[defgprs%]/.test(y);function M(t){var i,o,u,f=m,M=x;if("c"===y)M=w(t)+M,t="";else{var k=(t=+t)<0||1/t<0;if(t=isNaN(t)?h:w(Math.abs(t),_),v&&(t=function(t){t:for(var n,e=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(n+1):t}(t)),k&&0==+t&&"+"!==c&&(k=!1),f=(k?"("===c?c:l:"-"===c||"("===c?"":c)+f,M=("s"===y?Tr[8+_r/3]:"")+M+(k&&"("===c?")":""),b)for(i=-1,o=t.length;++i(u=t.charCodeAt(i))||u>57){M=(46===u?a+t.slice(i+1):t.slice(i))+M,t=t.slice(0,i);break}}g&&!d&&(t=r(t,1/0));var A=f.length+t.length+M.length,S=A>1)+f+t+M+S.slice(A);break;default:t=S+f+t+M}return s(t)}return _=void 0===_?6:/[gprs]/.test(y)?Math.max(1,Math.min(21,_)):Math.max(0,Math.min(20,_)),M.toString=function(){return t+""},M}return{format:c,formatPrefix:function(t,n){var e=c(((t=yr(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(gr(n)/3))),i=Math.pow(10,-r),o=Tr[8+r/3];return function(t){return e(i*t)+o}}}}function Cr(t,n,e,r){var i,o=function(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),o=r/i;return o>=Ge?i*=10:o>=Ve?i*=5:o>=Ye&&(i*=2),n0)return[t];if((r=n0)for(t=Math.ceil(t/a),n=Math.floor(n/a),o=new Array(i=Math.ceil(n-t+1));++s0?r=Ue(s=Math.floor(s/r)*r,u=Math.ceil(u/r)*r,e):r<0&&(r=Ue(s=Math.ceil(s*r)/r,u=Math.floor(u*r)/r,e)),r>0?(i[o]=Math.floor(s/r)*r,i[a]=Math.ceil(u/r)*r,n(i)):r<0&&(i[o]=Math.ceil(s*r)/r,i[a]=Math.floor(u*r)/r,n(i)),t},t}function Hr(){var t=dr(sr,sr);return t.copy=function(){return fr(t,Hr())},Ze.apply(t,arguments),Er(t)}function Lr(){it.stopImmediatePropagation()}function Dr(){it.preventDefault(),it.stopImmediatePropagation()}function Fr(t){var n=t.document.documentElement,e=vt(t).on("dragstart.drag",Dr,!0);"onselectstart"in n?e.on("selectstart.drag",Dr,!0):(n.__noselect=n.style.MozUserSelect,n.style.MozUserSelect="none")}function Pr(t){return function(){return t}}function Br(t,n,e,r,i,o,a,s,u,l){this.target=t,this.type=n,this.subject=e,this.identifier=r,this.active=i,this.x=o,this.y=a,this.dx=s,this.dy=u,this._=l}function Or(){return!it.ctrlKey&&!it.button}function zr(){return this.parentNode}function Ir(t){return null==t?{x:it.x,y:it.y}:t}function jr(){return navigator.maxTouchPoints||"ontouchstart"in this}function Rr(){var t,n,e,r,i=Or,o=zr,a=Ir,s=jr,u={},l=kt("start","drag","end"),h=0,c=0;function f(t){t.on("mousedown.drag",d).filter(s).on("touchstart.drag",_).on("touchmove.drag",v).on("touchend.drag touchcancel.drag",y).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(){if(!r&&i.apply(this,arguments)){var a=m("mouse",o.apply(this,arguments),xt,this,arguments);a&&(vt(it.view).on("mousemove.drag",p,!0).on("mouseup.drag",g,!0),Fr(it.view),Lr(),e=!1,t=it.clientX,n=it.clientY,a("start"))}}function p(){if(Dr(),!e){var r=it.clientX-t,i=it.clientY-n;e=r*r+i*i>c}u.mouse("drag")}function g(){vt(it.view).on("mousemove.drag mouseup.drag",null),function(t,n){var e=t.document.documentElement,r=vt(t).on("dragstart.drag",null);n&&(r.on("click.drag",Dr,!0),setTimeout((function(){r.on("click.drag",null)}),0)),"onselectstart"in e?r.on("selectstart.drag",null):(e.style.MozUserSelect=e.__noselect,delete e.__noselect)}(it.view,e),Dr(),u.mouse("end")}function _(){if(i.apply(this,arguments)){var t,n,e=it.changedTouches,r=o.apply(this,arguments),a=e.length;for(t=0;t1e-6)if(Math.abs(h*s-u*l)>1e-6&&i){var f=e-o,d=r-a,p=s*s+u*u,g=f*f+d*d,_=Math.sqrt(p),v=Math.sqrt(c),y=i*Math.tan((Qr-Math.acos((p+c-g)/(2*_*v)))/2),m=y/v,x=y/_;Math.abs(m-1)>1e-6&&(this._+="L"+(t+m*l)+","+(n+m*h)),this._+="A"+i+","+i+",0,0,"+ +(h*f>l*d)+","+(this._x1=t+x*s)+","+(this._y1=n+x*u)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n,o=!!o;var a=(e=+e)*Math.cos(r),s=e*Math.sin(r),u=t+a,l=n+s,h=1^o,c=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+u+","+l:(Math.abs(this._x1-u)>1e-6||Math.abs(this._y1-l)>1e-6)&&(this._+="L"+u+","+l),e&&(c<0&&(c=c%Jr+Jr),c>ti?this._+="A"+e+","+e+",0,1,"+h+","+(t-a)+","+(n-s)+"A"+e+","+e+",0,1,"+h+","+(this._x1=u)+","+(this._y1=l):c>1e-6&&(this._+="A"+e+","+e+",0,"+ +(c>=Qr)+","+h+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};var ii=Math.PI,oi=2*ii;function ai(t){this._context=t}function si(t){return new ai(t)}function ui(t){return t[0]}function li(t){return t[1]}function hi(){var t=ui,n=li,e=ri(!0),r=null,i=si,o=null;function a(a){var s,u,l,h=a.length,c=!1;for(null==r&&(o=i(l=ei())),s=0;s<=h;++s)!(s=t.length)&&(this.options.selectedAttributeIdx=0),this._removeMarkedSegmentsOnMap(),this._resetDrag(!0),this._data=t,this._init_options(),this._prepareData(),this._calculateElevationBounds(),this._appendScales(),this._appendGrid(),0!==Object.keys(t).length&&this._createChart(this.options.selectedAttributeIdx),this._createSelectionBox()},resize:function(t){t.width&&(this.options.width=t.width),t.height&&(this.options.height=t.height),vt(this._container).selectAll("svg").attr("width",this.options.width).attr("height",this.options.height),this._addData(this._data)},_initToggle:function(){t.Browser.touch?t.DomEvent.on(this._container,"click",t.DomEvent.stopPropagation):t.DomEvent.disableClickPropagation(this._container),this.options.expandControls&&(t.DomEvent.on(this._button,"click",this._expand,this),t.DomEvent.on(this._closeButton,"click",this._expand,this))},_dragHandler:function(){"undefined"!=typeof event&&(event.preventDefault(),event.stopPropagation()),this._gotDragged=!0,this._drawDragRectangle()},_drawDragRectangle:function(){if(this._dragStartCoords){var t=this._dragCurrentCoords=this._dragCache.end=xt(this._background.node()),n=Math.min(this._dragStartCoords[0],t[0]),e=Math.max(this._dragStartCoords[0],t[0]);if(this._dragRectangle||this._dragRectangleG)this._dragRectangle.attr("width",e-n).attr("x",n);else{var r=vt(this._container).select("svg").select("g");this._dragRectangleG=r.append("g"),this._dragRectangle=this._dragRectangleG.append("rect").attr("width",e-n).attr("height",this._svgHeight).attr("x",n).attr("class","mouse-drag").style("fill","grey").style("opacity",.5).style("pointer-events","none")}}},_resetDrag:function(t){if(this._dragRectangleG&&(this._dragRectangleG.remove(),this._dragRectangleG=null,this._dragRectangle=null,!0!==t)){var n=this._calculateFullExtent(this._areasFlattended);n&&this._map.fitBounds(n)}},_dragEndHandler:function(){if(!this._dragStartCoords||!this._gotDragged)return this._dragStartCoords=null,this._gotDragged=!1,void this._resetDrag();var t=this._findItemForX(this._dragStartCoords[0]),n=this._findItemForX(this._dragCurrentCoords[0]);this._fitSection(t,n),this._dragStartCoords=null,this._gotDragged=!1},_dragStartHandler:function(){event.preventDefault(),event.stopPropagation(),this._gotDragged=!1,this._dragStartCoords=this._dragCache.start=xt(this._background.node())},_calculateFullExtent:function(n){if(!n||n.length<1)return null;var e=new t.latLngBounds(n[0].latlng,n[0].latlng);return n.forEach((function(t){e.contains(t.latlng)||e.extend(t.latlng)})),e},_fitSection:function(t,n){var e,r=Math.min(t,n),i=Math.max(t,n);r!==i?e=this._calculateFullExtent(this._areasFlattended.slice(r,i+1)):this._areasFlattended.length>0&&(e=[this._areasFlattended[r].latlng,this._areasFlattended[i].latlng]),e&&this._map.fitBounds(e)},_expand:function(){!0!==this.options.expandControls&&(this._showState=!1),this._showState?(vt(this._button).style("display","block"),vt(this._container).selectAll("svg").style("display","none"),vt(this._closeButton).style("display","none")):(vt(this._button).style("display","none"),vt(this._container).selectAll("svg").style("display","block"),vt(this._closeButton).style("display","block")),this._showState=!this._showState,"function"==typeof this.options.expandCallback&&this.options.expandCallback(this._showState)},_removeChart:function(){void 0!==this._svg&&(this._svg.selectAll("path.area").remove(),this._svg.selectAll("path.border-top").remove(),this._svg.selectAll(".legend").remove(),this._svg.selectAll(".lineSelection").remove(),this._svg.selectAll(".horizontalLine").remove(),this._svg.selectAll(".horizontalLineText").remove())},_randomNumber:function(t){return Math.round(Math.random()*(t-0))},_d3ColorCategorical:[xi,wi,Mi,mi,ki,bi],_prepareData:function(){this._coordinates=[],this._elevations=[],this._cumulatedDistances=[],this._cumulatedDistances.push(0),this._categories=[];var n,e=this._data;if(void 0===this._mappings){var r=this._randomNumber(this._d3ColorCategorical.length-1);n=function t(){var n=Qe(),e=[],r=[],i=ir;function o(t){var o=t+"",a=n.get(o);if(!a){if(i!==ir)return i;n.set(o,a=e.push(t))}return r[(a-1)%r.length]}return o.domain=function(t){if(!arguments.length)return e.slice();e=[],n=Qe();for(var r,i,a=-1,s=t.length;++a=e)for(r=e;++oe&&(r=e)}else for(;++o=e)for(r=e;++oe&&(r=e);return r}(this._elevations),e=t-n;this._elevationBounds={min:e<10?n-10:n-.1*e,max:e<10?t+10:t+.1*e}},_showMapMarker:function(t,n,e){var r=this._map.latLngToLayerPoint(t),i=r.y-75;if(!this._mouseHeightFocus){var o=vt(".leaflet-overlay-pane svg").append("g");this._mouseHeightFocus=o.append("svg:line").attr("class","height-focus line").attr("x2","0").attr("y2","0").attr("x1","0").attr("y1","0"),this._mouseHeightFocusLabel=o.append("g").attr("class","height-focus label"),this._mouseHeightFocusLabelRect=this._mouseHeightFocusLabel.append("rect").attr("class","bBox"),this._mouseHeightFocusLabelTextElev=this._mouseHeightFocusLabel.append("text").attr("class","tspan"),this._mouseHeightFocusLabelTextType=this._mouseHeightFocusLabel.append("text").attr("class","tspan"),(this._pointG=o.append("g").attr("class","height-focus circle")).append("svg:circle").attr("r",5).attr("cx",0).attr("cy",0).attr("class","height-focus circle-lower")}this._mouseHeightFocusLabel.style("display","block"),this._mouseHeightFocus.attr("x1",r.x).attr("x2",r.x).attr("y1",r.y).attr("y2",i).style("display","block"),this._pointG.attr("transform","translate("+r.x+","+r.y+")").style("display","block"),this._mouseHeightFocusLabelRect.attr("x",r.x+3).attr("y",i).attr("class","bBox"),this._mouseHeightFocusLabelTextElev.attr("x",r.x+5).attr("y",i+12).text(n+" m").attr("class","tspan mouse-height-box-text"),this._mouseHeightFocusLabelTextType.attr("x",r.x+5).attr("y",i+24).text(e).attr("class","tspan mouse-height-box-text");var a=this._dynamicBoxSize("text.tspan")[1],s=""===e?18:30;wt(".bBox").attr("width",a+10).attr("height",s)},_createChart:function(t){var n=0===this._categories.length?[]:this._categories[t].geometries;this._areasFlattended=[].concat.apply([],n);for(var e=0;ee?e:r)+") rotate("+t.angle+")"})),vt(".horizontalLine").attr("y1",r<0?0:r>e?e:r).attr("y2",r<0?0:r>e?e:r),t._highlightedCoords=r>=e?[]:t._findCoordsForY(r),vt(".horizontalLineText").attr("y",r<=10?0:r>e?e-10:r-10).text(kr(".0f")(t._y.invert(r<0?0:r>e?e:r))+" m"),t._removeMarkedSegmentsOnMap(),t._markSegmentsOnMap(t._highlightedCoords)})).on("end",(function(n){vt(this).classed("active",!1),vt(".horizontalLine").classed("active",!1),t._removeMarkedSegmentsOnMap(),t._markSegmentsOnMap(t._highlightedCoords)})))},_markSegmentsOnMap:function(n){if(n)if(n.length>1){this._markedSegments=t.featureGroup();var e,i=o(n);try{for(i.s();!(e=i.n()).done;){var a=e.value;t.polyline(a,r(r({},this._highlightStyle),{interactive:!1})).addTo(this._markedSegments)}}catch(t){i.e(t)}finally{i.f()}this._markedSegments.addTo(this._map).bringToFront()}else this._markedSegments=t.polyline(n,this._highlightStyle).addTo(this._map)},_removeMarkedSegmentsOnMap:function(){void 0!==this._markedSegments&&this._map.removeLayer(this._markedSegments)},_appendScales:function(){var t=Boolean(this._totalDistance<=10);this._x=Hr().range([0,this._svgWidth]),this._y=Hr().range([this._svgHeight,0]),this._x.domain([0,this._totalDistance]),this._y.domain([this._elevationBounds.min,this._elevationBounds.max]),this._xAxis=Zr().scale(this._x),!0===t?this._xAxis.tickFormat((function(t){return kr(".2f")(t)+" km"})):this._xAxis.tickFormat((function(t){return kr(".0f")(t)+" km"})),this._xAxis.ticks(this.options.xTicks?Math.pow(2,this.options.xTicks):Math.round(this._svgWidth/75),"s"),this._yAxis=Kr().scale(this._y).tickFormat((function(t){return t+" m"})),this._yAxis.ticks(this.options.yTicks?Math.pow(2,this.options.yTicks):Math.round(this._svgHeight/30),"s")},_appendBackground:function(){var n=this._background=vt(this._container).select("svg").select("g").append("rect").attr("width",this._svgWidth).attr("height",this._svgHeight).style("fill","none").style("stroke","none").style("pointer-events","all").on("mousemove.focusbox",this._mousemoveHandler.bind(this)).on("mouseout.focusbox",this._mouseoutHandler.bind(this));t.Browser.android?(n.on("touchstart.drag",this._dragHandler.bind(this)).on("touchstart.drag",this._dragStartHandler.bind(this)).on("touchstart.focusbox",this._mousemoveHandler.bind(this)),t.DomEvent.on(this._container,"touchend",this._dragEndHandler,this)):(n.on("mousemove.focusbox",this._mousemoveHandler.bind(this)).on("mouseout.focusbox",this._mouseoutHandler.bind(this)).on("mousedown.drag",this._dragStartHandler.bind(this)).on("mousemove.drag",this._dragHandler.bind(this)),t.DomEvent.on(this._container,"mouseup",this._dragEndHandler,this))},_appendGrid:function(){this._svg.append("g").attr("class","grid").attr("transform","translate(0,"+this._svgHeight+")").call(this._make_x_axis().tickSize(-this._svgHeight,0,0).ticks(Math.round(this._svgWidth/75)).tickFormat("")),this._svg.append("g").attr("class","grid").call(this._make_y_axis().tickSize(-this._svgWidth,0,0).ticks(Math.round(this._svgHeight/30)).tickFormat("")),this._svg.append("g").attr("transform","translate(0,"+this._svgHeight+")").attr("class","x axis").call(this._xAxis),this._svg.append("g").attr("transform","translate(-2,0)").attr("class","y axis").call(this._yAxis)},_appendAreas:function(t,n,e){var r=this._categories[n].attributes[e].color,i=this;this._area=function(){var t=ui,n=null,e=ri(0),r=li,i=ri(!0),o=null,a=si,s=null;function u(u){var l,h,c,f,d,p=u.length,g=!1,_=new Array(p),v=new Array(p);for(null==o&&(s=a(d=ei())),l=0;l<=p;++l){if(!(l=h;--c)s.point(_[c],v[c]);s.lineEnd(),s.areaEnd()}g&&(_[l]=+t(f,l,u),v[l]=+e(f,l,u),s.point(n?+n(f,l,u):_[l],r?+r(f,l,u):v[l]))}if(d)return s=null,d+""||null}function l(){return hi().defined(i).curve(a).context(o)}return u.x=function(e){return arguments.length?(t="function"==typeof e?e:ri(+e),n=null,u):t},u.x0=function(n){return arguments.length?(t="function"==typeof n?n:ri(+n),u):t},u.x1=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:ri(+t),u):n},u.y=function(t){return arguments.length?(e="function"==typeof t?t:ri(+t),r=null,u):e},u.y0=function(t){return arguments.length?(e="function"==typeof t?t:ri(+t),u):e},u.y1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:ri(+t),u):r},u.lineX0=u.lineY0=function(){return l().x(t).y(e)},u.lineY1=function(){return l().x(t).y(r)},u.lineX1=function(){return l().x(n).y(e)},u.defined=function(t){return arguments.length?(i="function"==typeof t?t:ri(!!t),u):i},u.curve=function(t){return arguments.length?(a=t,null!=o&&(s=a(o)),u):a},u.context=function(t){return arguments.length?(null==t?o=s=null:s=a(o=t),u):o},u}().x((function(t){var n=i._x(t.position);return t.xDiagonalCoordinate=n,n})).y0(this._svgHeight).y1((function(t){return i._y(t.altitude)})).curve(si);this._areapath=this._svg.append("path").attr("class","area"),this._areapath.datum(t).attr("d",this._area).attr("stroke",r).styles(this._graphStyle).style("fill",r).style("pointer-events","none")},_make_x_axis:function(){return Zr().scale(this._x)},_make_y_axis:function(){return Kr().scale(this._y)},_createSelectionBox:function(){var t=this,n=vt(this._container).select("svg"),e=this._width-this._margin.right,r=this._height-this._margin.bottom+this._margin.bottom/2+6,i=[{x:e-25,y:r+3,color:"#000",type:di,id:"leftArrowSelection",angle:0},{x:e-10,y:r,color:"#000",type:di,id:"rightArrowSelection",angle:180}],o=n.selectAll(".select-symbol").data(i);o.remove(),o=n.selectAll(".select-symbol").data(i),t._data.length>1&&o.enter().append("path").merge(o).attr("class","select-symbol").attr("d",pi().type((function(t){return t.type}))).attr("transform",(function(t){return"translate("+t.x+","+t.y+") rotate("+t.angle+")"})).attr("id",(function(t){return t.id})).style("fill",(function(t){return t.color})).on("mousedown",(function(n){"rightArrowSelection"===n.id&&s(),"leftArrowSelection"===n.id&&u(),t._gotDragged=!0,t._dragStartCoords=t._dragCache.start,t._dragCurrentCoords=t._dragCache.end}));var a=function(i){if(t._selectionText&&t._selectionText.remove(),0!==t._categories.length){var o=t._categories[i].info;"function"==typeof t.options.chooseSelectionCallback&&t.options.chooseSelectionCallback(i,o);var a=[{selection:o.text}];t._selectionText=n.selectAll("selection_text").data(a).enter().append("text").attr("x",e-35).attr("y",r+4).text((function(t){return t.selection})).attr("class","select-info").attr("id","selectionText").attr("text-anchor","end")}};a(this.options.selectedAttributeIdx);var s=function(){var n=t.options.selectedAttributeIdx+=1;n===t._categories.length&&(t.options.selectedAttributeIdx=n=0),a(n),t._removeChart(),t._removeMarkedSegmentsOnMap(),t._createChart(n)},u=function(){var n=t.options.selectedAttributeIdx-=1;-1===n&&(t.options.selectedAttributeIdx=n=t._categories.length-1),a(n),t._removeChart(),t._removeMarkedSegmentsOnMap(),t._createChart(n)}},_createLegend:function(){var t=this,n=this,e=[];if(this._categories.length>0)for(var r in this._categories[this.options.selectedAttributeIdx].legend)e.push(this._categories[this.options.selectedAttributeIdx].legend[r]);var i=this._height-this._margin.bottom,o=i+this._margin.bottom/2,a=[{text:this._getTranslation("legend")}],s=this._svg.selectAll(".hlegend-hover").data(e).enter().append("g").attr("class","legend").style("display","none").attr("transform",(function(t,n){return"translate(-8,"+(14*n-28)+")"})),u=s.append("rect").attr("class","legend-rect").attr("x",15).attr("y",36).attr("width",6).attr("height",6);0!==Object.keys(this._graphStyle).length?u.styles(this._graphStyle).style("stroke",(function(t,n){return t.color})).style("fill",(function(t,n){return t.color})):u.style("stroke","black").style("fill",(function(t,n){return t.color})),s.append("text").attr("class","legend-text").attr("x",30).attr("y",42).text((function(t,e){var r=t.text;return n._boxBoundY=(i-2*i/3+7)*e,r}));var l=this._svg.selectAll(".legend-hover").data(a).enter().append("g").attr("class","legend-hover");this._showLegend=!1,l.append("text").attr("x",15).attr("y",o).attr("text-anchor","start").text((function(t,n){return t.text})).on("mouseover",(function(){wt(".legend").style("display","block")})).on("mouseleave",(function(){t._showLegend||wt(".legend").style("display","none")})).on("click",(function(){t._showLegend=!t._showLegend}))},_dynamicBoxSize:function(t){for(var n=wt(t).nodes().length,e=[],r=0;r0&&void 0!==arguments[0]?arguments[0]:1e3;this.mouseoutDelay&&window.clearTimeout(this.mouseoutDelay),this.mouseoutDelay=window.setTimeout((function(){t._mouseoutHandler()}),n)},mapMousemoveHandler:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=n.showMapMarker,r=void 0===e||e;if(!1!==this._areasFlattended){var i,a=null,s=2*Math.pow(100,2),u=1.1/111111,l=o(this._areasFlattended);try{for(l.s();!(i=l.n()).done;){var h=i.value,c=t.latlng.lat-h.latlng.lat,f=t.latlng.lng-h.latlng.lng;if(Math.abs(c)1&&void 0!==arguments[1])||arguments[1],r=t.altitude,i=t.position,o=t.latlng,a=t.areaIdx,s=t.type,u=this._dynamicBoxSize(".focusbox text")[1]+10;n=0===a?this._categories[this.options.selectedAttributeIdx].distances[a]:this._categories[this.options.selectedAttributeIdx].distances[a]-this._categories[this.options.selectedAttributeIdx].distances[a-1],e&&this._showMapMarker(o,r,s),this._distTspan.text(" "+i.toFixed(1)+" km"),this._altTspan.text(" "+r+" m"),this._areaTspan.text(" "+n.toFixed(1)+" km"),this._typeTspan.text(" "+s),this._focusRect.attr("width",u),this._focusLine.style("display","block").attr("x1",this._x(i)).attr("x2",this._x(i));var l=this._x(i)-(u+5),h=this._width-this._margin.left-this._margin.right;this._x(i)+uh&&this._focus.style("display","initial").attr("transform","translate("+l+","+this._y(this._elevationBounds.min)+")")},_findItemForX:function(t){var n=Xe((function(t){return t.position})).left,e=this._x.invert(t);return n(this._areasFlattended,e)},_findCoordsForY:function(t){var n=this._y.invert(t);return function(t,n){for(var e=[],r=0;r=n&&e.push(r);for(var i=[],o=0,a=0;a b ? 1 : a >= b ? 0 : NaN; +function ascending$3(a, b) { + return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; } -function bisector(compare) { - if (compare.length === 1) compare = ascendingComparator(compare); - return { - left: function(a, x, lo, hi) { - if (lo == null) lo = 0; - if (hi == null) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) < 0) lo = mid + 1; +function descending$2(a, b) { + return a == null || b == null ? NaN + : b < a ? -1 + : b > a ? 1 + : b >= a ? 0 + : NaN; +} + +function bisector(f) { + let compare1, compare2, delta; + + // If an accessor is specified, promote it to a comparator. In this case we + // can test whether the search value is (self-) comparable. We canโ€™t do this + // for a comparator (except for specific, known comparators) because we canโ€™t + // tell if the comparator is symmetric, and an asymmetric comparator canโ€™t be + // used to test whether a single value is comparable. + if (f.length !== 2) { + compare1 = ascending$3; + compare2 = (d, x) => ascending$3(f(d), x); + delta = (d, x) => f(d) - x; + } else { + compare1 = f === ascending$3 || f === descending$2 ? f : zero$1; + compare2 = f; + delta = f; + } + + function left(a, x, lo = 0, hi = a.length) { + if (lo < hi) { + if (compare1(x, x) !== 0) return hi; + do { + const mid = (lo + hi) >>> 1; + if (compare2(a[mid], x) < 0) lo = mid + 1; else hi = mid; + } while (lo < hi); + } + return lo; + } + + function right(a, x, lo = 0, hi = a.length) { + if (lo < hi) { + if (compare1(x, x) !== 0) return hi; + do { + const mid = (lo + hi) >>> 1; + if (compare2(a[mid], x) <= 0) lo = mid + 1; + else hi = mid; + } while (lo < hi); + } + return lo; + } + + function center(a, x, lo = 0, hi = a.length) { + const i = left(a, x, lo, hi - 1); + return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i; + } + + return {left, center, right}; +} + +function zero$1() { + return 0; +} + +function number$3(x) { + return x === null ? NaN : +x; +} + +function* numbers(values, valueof) { + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + yield value; } - return lo; - }, - right: function(a, x, lo, hi) { - if (lo == null) lo = 0; - if (hi == null) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) > 0) hi = mid; - else lo = mid + 1; + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + yield value; } - return lo; } - }; + } +} + +const ascendingBisect = bisector(ascending$3); +const bisectRight = ascendingBisect.right; +const bisectLeft = ascendingBisect.left; +const bisectCenter = bisector(number$3).center; +var bisect = bisectRight; + +function blur(values, r) { + if (!((r = +r) >= 0)) throw new RangeError("invalid r"); + let length = values.length; + if (!((length = Math.floor(length)) >= 0)) throw new RangeError("invalid length"); + if (!length || !r) return values; + const blur = blurf(r); + const temp = values.slice(); + blur(values, temp, 0, length, 1); + blur(temp, values, 0, length, 1); + blur(values, temp, 0, length, 1); + return values; } -function ascendingComparator(f) { - return function(d, x) { - return ascending(f(d), x); +const blur2 = Blur2(blurf); + +const blurImage = Blur2(blurfImage); + +function Blur2(blur) { + return function(data, rx, ry = rx) { + if (!((rx = +rx) >= 0)) throw new RangeError("invalid rx"); + if (!((ry = +ry) >= 0)) throw new RangeError("invalid ry"); + let {data: values, width, height} = data; + if (!((width = Math.floor(width)) >= 0)) throw new RangeError("invalid width"); + if (!((height = Math.floor(height !== undefined ? height : values.length / width)) >= 0)) throw new RangeError("invalid height"); + if (!width || !height || (!rx && !ry)) return data; + const blurx = rx && blur(rx); + const blury = ry && blur(ry); + const temp = values.slice(); + if (blurx && blury) { + blurh(blurx, temp, values, width, height); + blurh(blurx, values, temp, width, height); + blurh(blurx, temp, values, width, height); + blurv(blury, values, temp, width, height); + blurv(blury, temp, values, width, height); + blurv(blury, values, temp, width, height); + } else if (blurx) { + blurh(blurx, values, temp, width, height); + blurh(blurx, temp, values, width, height); + blurh(blurx, values, temp, width, height); + } else if (blury) { + blurv(blury, values, temp, width, height); + blurv(blury, temp, values, width, height); + blurv(blury, values, temp, width, height); + } + return data; }; } -var ascendingBisect = bisector(ascending); -var bisectRight = ascendingBisect.right; -var bisectLeft = ascendingBisect.left; +function blurh(blur, T, S, w, h) { + for (let y = 0, n = w * h; y < n;) { + blur(T, S, y, y += w, 1); + } +} -function pairs(array, f) { - if (f == null) f = pair; - var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); - while (i < n) pairs[i] = f(p, p = array[++i]); - return pairs; +function blurv(blur, T, S, w, h) { + for (let x = 0, n = w * h; x < w; ++x) { + blur(T, S, x, x + n, w); + } } -function pair(a, b) { - return [a, b]; +function blurfImage(radius) { + const blur = blurf(radius); + return (T, S, start, stop, step) => { + start <<= 2, stop <<= 2, step <<= 2; + blur(T, S, start + 0, stop + 0, step); + blur(T, S, start + 1, stop + 1, step); + blur(T, S, start + 2, stop + 2, step); + blur(T, S, start + 3, stop + 3, step); + }; } -function cross(values0, values1, reduce) { - var n0 = values0.length, - n1 = values1.length, - values = new Array(n0 * n1), - i0, - i1, - i, - value0; +// Given a target array T, a source array S, sets each value T[i] to the average +// of {S[i - r], โ€ฆ, S[i], โ€ฆ, S[i + r]}, where r = โŒŠradiusโŒ‹, start <= i < stop, +// for each i, i + step, i + 2 * step, etc., and where S[j] is clamped between +// S[start] (inclusive) and S[stop] (exclusive). If the given radius is not an +// integer, S[i - r - 1] and S[i + r + 1] are added to the sum, each weighted +// according to r - โŒŠradiusโŒ‹. +function blurf(radius) { + const radius0 = Math.floor(radius); + if (radius0 === radius) return bluri(radius); + const t = radius - radius0; + const w = 2 * radius + 1; + return (T, S, start, stop, step) => { // stop must be aligned! + if (!((stop -= step) >= start)) return; // inclusive stop + let sum = radius0 * S[start]; + const s0 = step * radius0; + const s1 = s0 + step; + for (let i = start, j = start + s0; i < j; i += step) { + sum += S[Math.min(stop, i)]; + } + for (let i = start, j = stop; i <= j; i += step) { + sum += S[Math.min(stop, i + s0)]; + T[i] = (sum + t * (S[Math.max(start, i - s1)] + S[Math.min(stop, i + s1)])) / w; + sum -= S[Math.max(start, i - s0)]; + } + }; +} - if (reduce == null) reduce = pair; +// Like blurf, but optimized for integer radius. +function bluri(radius) { + const w = 2 * radius + 1; + return (T, S, start, stop, step) => { // stop must be aligned! + if (!((stop -= step) >= start)) return; // inclusive stop + let sum = radius * S[start]; + const s = step * radius; + for (let i = start, j = start + s; i < j; i += step) { + sum += S[Math.min(stop, i)]; + } + for (let i = start, j = stop; i <= j; i += step) { + sum += S[Math.min(stop, i + s)]; + T[i] = sum / w; + sum -= S[Math.max(start, i - s)]; + } + }; +} - for (i0 = i = 0; i0 < n0; ++i0) { - for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { - values[i] = reduce(value0, values1[i1]); +function count$1(values, valueof) { + let count = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count; + } } } + return count; +} - return values; +function length$3(array) { + return array.length | 0; } -function descending(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +function empty$2(length) { + return !(length > 0); } -function number(x) { - return x === null ? NaN : +x; +function arrayify(values) { + return typeof values !== "object" || "length" in values ? values : Array.from(values); } -function variance(values, valueof) { - var n = values.length, - m = 0, - i = -1, - mean = 0, - value, - delta, - sum = 0; +function reducer(reduce) { + return values => reduce(...values); +} - if (valueof == null) { - while (++i < n) { - if (!isNaN(value = number(values[i]))) { +function cross$2(...values) { + const reduce = typeof values[values.length - 1] === "function" && reducer(values.pop()); + values = values.map(arrayify); + const lengths = values.map(length$3); + const j = values.length - 1; + const index = new Array(j + 1).fill(0); + const product = []; + if (j < 0 || lengths.some(empty$2)) return product; + while (true) { + product.push(index.map((j, i) => values[i][j])); + let i = j; + while (++index[i] === lengths[i]) { + if (i === 0) return reduce ? product.map(reduce) : product; + index[i--] = 0; + } + } +} + +function cumsum(values, valueof) { + var sum = 0, index = 0; + return Float64Array.from(values, valueof === undefined + ? v => (sum += +v || 0) + : v => (sum += +valueof(v, index++, values) || 0)); +} + +function variance(values, valueof) { + let count = 0; + let delta; + let mean = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { delta = value - mean; - mean += delta / ++m; + mean += delta / ++count; sum += delta * (value - mean); } } - } - - else { - while (++i < n) { - if (!isNaN(value = number(valueof(values[i], i, values)))) { + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { delta = value - mean; - mean += delta / ++m; + mean += delta / ++count; sum += delta * (value - mean); } } } - - if (m > 1) return sum / (m - 1); + if (count > 1) return sum / (count - 1); } -function deviation(array, f) { - var v = variance(array, f); +function deviation(values, valueof) { + const v = variance(values, valueof); return v ? Math.sqrt(v) : v; } -function extent(values, valueof) { - var n = values.length, - i = -1, - value, - min, - max; - - if (valueof == null) { - while (++i < n) { // Find the first comparable value. - if ((value = values[i]) != null && value >= value) { - min = max = value; - while (++i < n) { // Compare the remaining values. - if ((value = values[i]) != null) { - if (min > value) min = value; - if (max < value) max = value; - } +function extent$1(values, valueof) { + let min; + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; } } } } + return [min, max]; +} - else { - while (++i < n) { // Find the first comparable value. - if ((value = valueof(values[i], i, values)) != null && value >= value) { - min = max = value; - while (++i < n) { // Compare the remaining values. - if ((value = valueof(values[i], i, values)) != null) { - if (min > value) min = value; - if (max < value) max = value; - } - } +// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423 +class Adder { + constructor() { + this._partials = new Float64Array(32); + this._n = 0; + } + add(x) { + const p = this._partials; + let i = 0; + for (let j = 0; j < this._n && j < 32; j++) { + const y = p[j], + hi = x + y, + lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); + if (lo) p[i++] = lo; + x = hi; + } + p[i] = x; + this._n = i + 1; + return this; + } + valueOf() { + const p = this._partials; + let n = this._n, x, y, lo, hi = 0; + if (n > 0) { + hi = p[--n]; + while (n > 0) { + x = hi; + y = p[--n]; + hi = x + y; + lo = y - (hi - x); + if (lo) break; + } + if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) { + y = lo * 2; + x = hi + y; + if (y == x - hi) hi = x; } } + return hi; } +} - return [min, max]; +function fsum(values, valueof) { + const adder = new Adder(); + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + adder.add(value); + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + adder.add(value); + } + } + } + return +adder; } -var array = Array.prototype; +function fcumsum(values, valueof) { + const adder = new Adder(); + let index = -1; + return Float64Array.from(values, valueof === undefined + ? v => adder.add(+v || 0) + : v => adder.add(+valueof(v, ++index, values) || 0) + ); +} -var slice = array.slice; -var map = array.map; +class InternMap extends Map { + constructor(entries, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (entries != null) for (const [key, value] of entries) this.set(key, value); + } + get(key) { + return super.get(intern_get(this, key)); + } + has(key) { + return super.has(intern_get(this, key)); + } + set(key, value) { + return super.set(intern_set(this, key), value); + } + delete(key) { + return super.delete(intern_delete(this, key)); + } +} -function constant(x) { - return function() { - return x; - }; +class InternSet extends Set { + constructor(values, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (values != null) for (const value of values) this.add(value); + } + has(value) { + return super.has(intern_get(this, value)); + } + add(value) { + return super.add(intern_set(this, value)); + } + delete(value) { + return super.delete(intern_delete(this, value)); + } +} + +function intern_get({_intern, _key}, value) { + const key = _key(value); + return _intern.has(key) ? _intern.get(key) : value; +} + +function intern_set({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) return _intern.get(key); + _intern.set(key, value); + return value; +} + +function intern_delete({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) { + value = _intern.get(key); + _intern.delete(key); + } + return value; } -function identity(x) { +function keyof(value) { + return value !== null && typeof value === "object" ? value.valueOf() : value; +} + +function identity$9(x) { return x; } -function sequence(start, stop, step) { - start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; +function group(values, ...keys) { + return nest(values, identity$9, identity$9, keys); +} - var i = -1, - n = Math.max(0, Math.ceil((stop - start) / step)) | 0, - range = new Array(n); +function groups(values, ...keys) { + return nest(values, Array.from, identity$9, keys); +} - while (++i < n) { - range[i] = start + i * step; +function flatten$1(groups, keys) { + for (let i = 1, n = keys.length; i < n; ++i) { + groups = groups.flatMap(g => g.pop().map(([key, value]) => [...g, key, value])); } + return groups; +} - return range; +function flatGroup(values, ...keys) { + return flatten$1(groups(values, ...keys), keys); +} + +function flatRollup(values, reduce, ...keys) { + return flatten$1(rollups(values, reduce, ...keys), keys); +} + +function rollup(values, reduce, ...keys) { + return nest(values, identity$9, reduce, keys); +} + +function rollups(values, reduce, ...keys) { + return nest(values, Array.from, reduce, keys); +} + +function index$4(values, ...keys) { + return nest(values, identity$9, unique, keys); +} + +function indexes(values, ...keys) { + return nest(values, Array.from, unique, keys); +} + +function unique(values) { + if (values.length !== 1) throw new Error("duplicate key"); + return values[0]; +} + +function nest(values, map, reduce, keys) { + return (function regroup(values, i) { + if (i >= keys.length) return reduce(values); + const groups = new InternMap(); + const keyof = keys[i++]; + let index = -1; + for (const value of values) { + const key = keyof(value, ++index, values); + const group = groups.get(key); + if (group) group.push(value); + else groups.set(key, [value]); + } + for (const [key, values] of groups) { + groups.set(key, regroup(values, i)); + } + return map(groups); + })(values, 0); +} + +function permute(source, keys) { + return Array.from(keys, key => source[key]); +} + +function sort(values, ...F) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + values = Array.from(values); + let [f] = F; + if ((f && f.length !== 2) || F.length > 1) { + const index = Uint32Array.from(values, (d, i) => i); + if (F.length > 1) { + F = F.map(f => values.map(f)); + index.sort((i, j) => { + for (const f of F) { + const c = ascendingDefined(f[i], f[j]); + if (c) return c; + } + }); + } else { + f = values.map(f); + index.sort((i, j) => ascendingDefined(f[i], f[j])); + } + return permute(values, index); + } + return values.sort(compareDefined(f)); +} + +function compareDefined(compare = ascending$3) { + if (compare === ascending$3) return ascendingDefined; + if (typeof compare !== "function") throw new TypeError("compare is not a function"); + return (a, b) => { + const x = compare(a, b); + if (x || x === 0) return x; + return (compare(b, b) === 0) - (compare(a, a) === 0); + }; +} + +function ascendingDefined(a, b) { + return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0); +} + +function groupSort(values, reduce, key) { + return (reduce.length !== 2 + ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending$3(av, bv) || ascending$3(ak, bk))) + : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending$3(ak, bk)))) + .map(([key]) => key); +} + +var array$5 = Array.prototype; + +var slice$3 = array$5.slice; + +function constant$b(x) { + return () => x; } var e10 = Math.sqrt(50), @@ -207,15 +609,18 @@ function ticks(start, stop, count) { if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; if (step > 0) { - start = Math.ceil(start / step); - stop = Math.floor(stop / step); - ticks = new Array(n = Math.ceil(stop - start + 1)); - while (++i < n) ticks[i] = (start + i) * step; + let r0 = Math.round(start / step), r1 = Math.round(stop / step); + if (r0 * step < start) ++r0; + if (r1 * step > stop) --r1; + ticks = new Array(n = r1 - r0 + 1); + while (++i < n) ticks[i] = (r0 + i) * step; } else { - start = Math.floor(start * step); - stop = Math.ceil(stop * step); - ticks = new Array(n = Math.ceil(start - stop + 1)); - while (++i < n) ticks[i] = (start - i) / step; + step = -step; + let r0 = Math.round(start * step), r1 = Math.round(stop * step); + if (r0 / step < start) ++r0; + if (r1 / step > stop) --r1; + ticks = new Array(n = r1 - r0 + 1); + while (++i < n) ticks[i] = (r0 + i) / step; } if (reverse) ticks.reverse(); @@ -242,19 +647,39 @@ function tickStep(start, stop, count) { return stop < start ? -step1 : step1; } +function nice$1(start, stop, count) { + let prestep; + while (true) { + const step = tickIncrement(start, stop, count); + if (step === prestep || step === 0 || !isFinite(step)) { + return [start, stop]; + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } + prestep = step; + } +} + function thresholdSturges(values) { - return Math.ceil(Math.log(values.length) / Math.LN2) + 1; + return Math.ceil(Math.log(count$1(values)) / Math.LN2) + 1; } -function histogram() { - var value = identity, - domain = extent, +function bin() { + var value = identity$9, + domain = extent$1, threshold = thresholdSturges; function histogram(data) { + if (!Array.isArray(data)) data = Array.from(data); + var i, n = data.length, x, + step, values = new Array(n); for (i = 0; i < n; ++i) { @@ -266,10 +691,39 @@ function histogram() { x1 = xz[1], tz = threshold(values, x0, x1); - // Convert number of thresholds into uniform thresholds. + // Convert number of thresholds into uniform thresholds, and nice the + // default domain accordingly. if (!Array.isArray(tz)) { - tz = tickStep(x0, x1, tz); - tz = sequence(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive + const max = x1, tn = +tz; + if (domain === extent$1) [x0, x1] = nice$1(x0, x1, tn); + tz = ticks(x0, x1, tn); + + // If the domain is aligned with the first tick (which it will by + // default), then we can use quantization rather than bisection to bin + // values, which is substantially faster. + if (tz[0] <= x0) step = tickIncrement(x0, x1, tn); + + // If the last threshold is coincident with the domainโ€™s upper bound, the + // last bin will be zero-width. If the default domain is used, and this + // last threshold is coincident with the maximum input value, we can + // extend the niced upper bound by one tick to ensure uniform bin widths; + // otherwise, we simply remove the last threshold. Note that we donโ€™t + // coerce values or the domain to numbers, and thus must be careful to + // compare order (>=) rather than strict equality (===)! + if (tz[tz.length - 1] >= x1) { + if (max >= x1 && domain === extent$1) { + const step = tickIncrement(x0, x1, tn); + if (isFinite(step)) { + if (step > 0) { + x1 = (Math.floor(x1 / step) + 1) * step; + } else if (step < 0) { + x1 = (Math.ceil(x1 * -step) + 1) / -step; + } + } + } else { + tz.pop(); + } + } } // Remove any thresholds outside the domain. @@ -288,10 +742,26 @@ function histogram() { } // Assign data to bins by value, ignoring any outside the domain. - for (i = 0; i < n; ++i) { - x = values[i]; - if (x0 <= x && x <= x1) { - bins[bisectRight(tz, x, 0, m)].push(data[i]); + if (isFinite(step)) { + if (step > 0) { + for (i = 0; i < n; ++i) { + if ((x = values[i]) != null && x0 <= x && x <= x1) { + bins[Math.min(m, Math.floor((x - x0) / step))].push(data[i]); + } + } + } else if (step < 0) { + for (i = 0; i < n; ++i) { + if ((x = values[i]) != null && x0 <= x && x <= x1) { + const j = Math.floor((x0 - x) * step); + bins[Math.min(m, j + (tz[j] <= x))].push(data[i]); // handle off-by-one due to rounding + } + } + } + } else { + for (i = 0; i < n; ++i) { + if ((x = values[i]) != null && x0 <= x && x <= x1) { + bins[bisect(tz, x, 0, m)].push(data[i]); + } } } @@ -299,247 +769,447 @@ function histogram() { } histogram.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(_), histogram) : value; }; histogram.domain = function(_) { - return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + return arguments.length ? (domain = typeof _ === "function" ? _ : constant$b([_[0], _[1]]), histogram) : domain; }; histogram.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$b(slice$3.call(_)) : constant$b(_), histogram) : threshold; }; return histogram; } -function threshold(values, p, valueof) { - if (valueof == null) valueof = number; - if (!(n = values.length)) return; - if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); - if (p >= 1) return +valueof(values[n - 1], n - 1, values); - var n, - i = (n - 1) * p, - i0 = Math.floor(i), - value0 = +valueof(values[i0], i0, values), - value1 = +valueof(values[i0 + 1], i0 + 1, values); - return value0 + (value1 - value0) * (i - i0); -} - -function freedmanDiaconis(values, min, max) { - values = map.call(values, number).sort(ascending); - return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3))); -} - -function scott(values, min, max) { - return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); -} - -function max(values, valueof) { - var n = values.length, - i = -1, - value, - max; - - if (valueof == null) { - while (++i < n) { // Find the first comparable value. - if ((value = values[i]) != null && value >= value) { +function max$3(values, valueof) { + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (max < value || (max === undefined && value >= value))) { max = value; - while (++i < n) { // Compare the remaining values. - if ((value = values[i]) != null && value > max) { - max = value; - } - } } } - } - - else { - while (++i < n) { // Find the first comparable value. - if ((value = valueof(values[i], i, values)) != null && value >= value) { + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { max = value; - while (++i < n) { // Compare the remaining values. - if ((value = valueof(values[i], i, values)) != null && value > max) { - max = value; - } - } } } } - return max; } -function mean(values, valueof) { - var n = values.length, - m = n, - i = -1, - value, - sum = 0; - - if (valueof == null) { - while (++i < n) { - if (!isNaN(value = number(values[i]))) sum += value; - else --m; +function maxIndex(values, valueof) { + let max; + let maxIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } } - } - - else { - while (++i < n) { - if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; - else --m; + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } } } - - if (m) return sum / m; + return maxIndex; } -function median(values, valueof) { - var n = values.length, - i = -1, - value, - numbers = []; - - if (valueof == null) { - while (++i < n) { - if (!isNaN(value = number(values[i]))) { - numbers.push(value); +function min$2(values, valueof) { + let min; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value; } } } + return min; +} - else { - while (++i < n) { - if (!isNaN(value = number(valueof(values[i], i, values)))) { - numbers.push(value); +function minIndex(values, valueof) { + let min; + let minIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; } } } - - return threshold(numbers.sort(ascending), 0.5); + return minIndex; } -function merge(arrays) { - var n = arrays.length, - m, - i = -1, - j = 0, - merged, - array; +// Based on https://github.com/mourner/quickselect +// ISC license, Copyright 2018 Vladimir Agafonkin. +function quickselect(array, k, left = 0, right = array.length - 1, compare) { + compare = compare === undefined ? ascendingDefined : compareDefined(compare); + + while (right > left) { + if (right - left > 600) { + const n = right - left + 1; + const m = k - left + 1; + const z = Math.log(n); + const s = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselect(array, k, newLeft, newRight, compare); + } + + const t = array[k]; + let i = left; + let j = right; - while (++i < n) j += arrays[i].length; - merged = new Array(j); + swap$1(array, left, k); + if (compare(array[right], t) > 0) swap$1(array, left, right); - while (--n >= 0) { - array = arrays[n]; - m = array.length; - while (--m >= 0) { - merged[--j] = array[m]; + while (i < j) { + swap$1(array, i, j), ++i, --j; + while (compare(array[i], t) < 0) ++i; + while (compare(array[j], t) > 0) --j; } + + if (compare(array[left], t) === 0) swap$1(array, left, j); + else ++j, swap$1(array, j, right); + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; } - return merged; + return array; } -function min(values, valueof) { - var n = values.length, - i = -1, - value, - min; - - if (valueof == null) { - while (++i < n) { // Find the first comparable value. - if ((value = values[i]) != null && value >= value) { - min = value; - while (++i < n) { // Compare the remaining values. - if ((value = values[i]) != null && min > value) { - min = value; - } - } +function swap$1(array, i, j) { + const t = array[i]; + array[i] = array[j]; + array[j] = t; +} + +function greatest(values, compare = ascending$3) { + let max; + let defined = false; + if (compare.length === 1) { + let maxValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending$3(value, maxValue) > 0 + : ascending$3(value, value) === 0) { + max = element; + maxValue = value; + defined = true; } } - } - - else { - while (++i < n) { // Find the first comparable value. - if ((value = valueof(values[i], i, values)) != null && value >= value) { - min = value; - while (++i < n) { // Compare the remaining values. - if ((value = valueof(values[i], i, values)) != null && min > value) { - min = value; - } - } + } else { + for (const value of values) { + if (defined + ? compare(value, max) > 0 + : compare(value, value) === 0) { + max = value; + defined = true; } } } + return max; +} - return min; +function quantile$1(values, p, valueof) { + values = Float64Array.from(numbers(values, valueof)); + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return min$2(values); + if (p >= 1) return max$3(values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = max$3(quickselect(values, i0).subarray(0, i0 + 1)), + value1 = min$2(values.subarray(i0 + 1)); + return value0 + (value1 - value0) * (i - i0); } -function permute(array, indexes) { - var i = indexes.length, permutes = new Array(i); - while (i--) permutes[i] = array[indexes[i]]; - return permutes; +function quantileSorted(values, p, valueof = number$3) { + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); } -function scan(values, compare) { +function quantileIndex(values, p, valueof) { + values = Float64Array.from(numbers(values, valueof)); if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return minIndex(values); + if (p >= 1) return maxIndex(values); var n, - i = 0, - j = 0, - xi, - xj = values[j]; + i = Math.floor((n - 1) * p), + order = (i, j) => ascendingDefined(values[i], values[j]), + index = quickselect(Uint32Array.from(values, (_, i) => i), i, 0, n - 1, order); + return greatest(index.subarray(0, i + 1), i => values[i]); +} - if (compare == null) compare = ascending; +function thresholdFreedmanDiaconis(values, min, max) { + return Math.ceil((max - min) / (2 * (quantile$1(values, 0.75) - quantile$1(values, 0.25)) * Math.pow(count$1(values), -1 / 3))); +} - while (++i < n) { - if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { - xj = xi, j = i; +function thresholdScott(values, min, max) { + return Math.ceil((max - min) * Math.cbrt(count$1(values)) / (3.49 * deviation(values))); +} + +function mean(values, valueof) { + let count = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count, sum += value; + } } } + if (count) return sum / count; +} - if (compare(xj, xj) === 0) return j; +function median(values, valueof) { + return quantile$1(values, 0.5, valueof); } -function shuffle(array, i0, i1) { - var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), - t, - i; +function medianIndex(values, valueof) { + return quantileIndex(values, 0.5, valueof); +} - while (m) { - i = Math.random() * m-- | 0; - t = array[m + i0]; - array[m + i0] = array[i + i0]; - array[i + i0] = t; +function* flatten(arrays) { + for (const array of arrays) { + yield* array; } +} - return array; +function merge(arrays) { + return Array.from(flatten(arrays)); } -function sum(values, valueof) { - var n = values.length, - i = -1, - value, - sum = 0; +function mode(values, valueof) { + const counts = new InternMap(); + if (valueof === undefined) { + for (let value of values) { + if (value != null && value >= value) { + counts.set(value, (counts.get(value) || 0) + 1); + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && value >= value) { + counts.set(value, (counts.get(value) || 0) + 1); + } + } + } + let modeValue; + let modeCount = 0; + for (const [value, count] of counts) { + if (count > modeCount) { + modeCount = count; + modeValue = value; + } + } + return modeValue; +} - if (valueof == null) { - while (++i < n) { - if (value = +values[i]) sum += value; // Note: zero and null are equivalent. +function pairs(values, pairof = pair) { + const pairs = []; + let previous; + let first = false; + for (const value of values) { + if (first) pairs.push(pairof(previous, value)); + previous = value; + first = true; + } + return pairs; +} + +function pair(a, b) { + return [a, b]; +} + +function range$2(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; +} + +function rank(values, valueof = ascending$3) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + let V = Array.from(values); + const R = new Float64Array(V.length); + if (valueof.length !== 2) V = V.map(valueof), valueof = ascending$3; + const compareIndex = (i, j) => valueof(V[i], V[j]); + let k, r; + Uint32Array + .from(V, (_, i) => i) + .sort(valueof === ascending$3 ? (i, j) => ascendingDefined(V[i], V[j]) : compareDefined(compareIndex)) + .forEach((j, i) => { + const c = compareIndex(j, k === undefined ? j : k); + if (c >= 0) { + if (k === undefined || c > 0) k = j, r = i; + R[j] = r; + } else { + R[j] = NaN; + } + }); + return R; +} + +function least(values, compare = ascending$3) { + let min; + let defined = false; + if (compare.length === 1) { + let minValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending$3(value, minValue) < 0 + : ascending$3(value, value) === 0) { + min = element; + minValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, min) < 0 + : compare(value, value) === 0) { + min = value; + defined = true; + } } } + return min; +} - else { - while (++i < n) { - if (value = +valueof(values[i], i, values)) sum += value; +function leastIndex(values, compare = ascending$3) { + if (compare.length === 1) return minIndex(values, compare); + let minValue; + let min = -1; + let index = -1; + for (const value of values) { + ++index; + if (min < 0 + ? compare(value, value) === 0 + : compare(value, minValue) < 0) { + minValue = value; + min = index; + } + } + return min; +} + +function greatestIndex(values, compare = ascending$3) { + if (compare.length === 1) return maxIndex(values, compare); + let maxValue; + let max = -1; + let index = -1; + for (const value of values) { + ++index; + if (max < 0 + ? compare(value, value) === 0 + : compare(value, maxValue) > 0) { + maxValue = value; + max = index; } } + return max; +} + +function scan(values, compare) { + const index = leastIndex(values, compare); + return index < 0 ? undefined : index; +} +var shuffle$1 = shuffler(Math.random); + +function shuffler(random) { + return function shuffle(array, i0 = 0, i1 = array.length) { + let m = i1 - (i0 = +i0); + while (m) { + const i = random() * m-- | 0, t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + return array; + }; +} + +function sum$2(values, valueof) { + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + sum += value; + } + } + } return sum; } function transpose(matrix) { if (!(n = matrix.length)) return []; - for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var i = -1, m = min$2(matrix, length$2), transpose = new Array(m); ++i < m;) { for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { row[j] = matrix[j][i]; } @@ -547,7 +1217,7 @@ function transpose(matrix) { return transpose; } -function length(d) { +function length$2(d) { return d.length; } @@ -555,9 +1225,143 @@ function zip() { return transpose(arguments); } -var slice$1 = Array.prototype.slice; +function every(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (!test(value, ++index, values)) { + return false; + } + } + return true; +} + +function some(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + return true; + } + } + return false; +} + +function filter$1(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + const array = []; + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + array.push(value); + } + } + return array; +} + +function map$1(values, mapper) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + if (typeof mapper !== "function") throw new TypeError("mapper is not a function"); + return Array.from(values, (value, index) => mapper(value, index, values)); +} + +function reduce(values, reducer, value) { + if (typeof reducer !== "function") throw new TypeError("reducer is not a function"); + const iterator = values[Symbol.iterator](); + let done, next, index = -1; + if (arguments.length < 3) { + ({done, value} = iterator.next()); + if (done) return; + ++index; + } + while (({done, value: next} = iterator.next()), !done) { + value = reducer(value, next, ++index, values); + } + return value; +} + +function reverse$1(values) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + return Array.from(values).reverse(); +} + +function difference(values, ...others) { + values = new InternSet(values); + for (const other of others) { + for (const value of other) { + values.delete(value); + } + } + return values; +} + +function disjoint(values, other) { + const iterator = other[Symbol.iterator](), set = new InternSet(); + for (const v of values) { + if (set.has(v)) return false; + let value, done; + while (({value, done} = iterator.next())) { + if (done) break; + if (Object.is(v, value)) return false; + set.add(value); + } + } + return true; +} + +function intersection(values, ...others) { + values = new InternSet(values); + others = others.map(set$2); + out: for (const value of values) { + for (const other of others) { + if (!other.has(value)) { + values.delete(value); + continue out; + } + } + } + return values; +} + +function set$2(values) { + return values instanceof InternSet ? values : new InternSet(values); +} + +function superset(values, other) { + const iterator = values[Symbol.iterator](), set = new Set(); + for (const o of other) { + const io = intern(o); + if (set.has(io)) continue; + let value, done; + while (({value, done} = iterator.next())) { + if (done) return false; + const ivalue = intern(value); + set.add(ivalue); + if (Object.is(io, ivalue)) break; + } + } + return true; +} + +function intern(value) { + return value !== null && typeof value === "object" ? value.valueOf() : value; +} + +function subset(values, other) { + return superset(other, values); +} + +function union(...others) { + const set = new InternSet(); + for (const other of others) { + for (const o of other) { + set.add(o); + } + } + return set; +} -function identity$1(x) { +function identity$8(x) { return x; } @@ -565,28 +1369,24 @@ var top = 1, right = 2, bottom = 3, left = 4, - epsilon = 1e-6; + epsilon$6 = 1e-6; function translateX(x) { - return "translate(" + (x + 0.5) + ",0)"; + return "translate(" + x + ",0)"; } function translateY(y) { - return "translate(0," + (y + 0.5) + ")"; + return "translate(0," + y + ")"; } -function number$1(scale) { - return function(d) { - return +scale(d); - }; +function number$2(scale) { + return d => +scale(d); } -function center(scale) { - var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. +function center$1(scale, offset) { + offset = Math.max(0, scale.bandwidth() - offset * 2) / 2; if (scale.round()) offset = Math.round(offset); - return function(d) { - return +scale(d) + offset; - }; + return d => +scale(d) + offset; } function entering() { @@ -600,18 +1400,19 @@ function axis(orient, scale) { tickSizeInner = 6, tickSizeOuter = 6, tickPadding = 3, + offset = typeof window !== "undefined" && window.devicePixelRatio > 1 ? 0 : 0.5, k = orient === top || orient === left ? -1 : 1, x = orient === left || orient === right ? "x" : "y", transform = orient === top || orient === bottom ? translateX : translateY; function axis(context) { var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, - format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$8) : tickFormat, spacing = Math.max(tickSizeInner, 0) + tickPadding, range = scale.range(), - range0 = +range[0] + 0.5, - range1 = +range[range.length - 1] + 0.5, - position = (scale.bandwidth ? center : number$1)(scale.copy()), + range0 = +range[0] + offset, + range1 = +range[range.length - 1] + offset, + position = (scale.bandwidth ? center$1 : number$2)(scale.copy(), offset), selection = context.selection ? context.selection() : context, path = selection.selectAll(".domain").data([null]), tick = selection.selectAll(".tick").data(values, scale).order(), @@ -642,24 +1443,24 @@ function axis(orient, scale) { text = text.transition(context); tickExit = tickExit.transition(context) - .attr("opacity", epsilon) - .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); }); + .attr("opacity", epsilon$6) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute("transform"); }); tickEnter - .attr("opacity", epsilon) - .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); }); + .attr("opacity", epsilon$6) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); }); } tickExit.remove(); path - .attr("d", orient === left || orient == right - ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) - : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1)); + .attr("d", orient === left || orient === right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H" + offset + "V" + range1 + "H" + k * tickSizeOuter : "M" + offset + "," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V" + offset + "H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + "," + offset + "H" + range1)); tick .attr("opacity", 1) - .attr("transform", function(d) { return transform(position(d)); }); + .attr("transform", function(d) { return transform(position(d) + offset); }); line .attr(x + "2", k * tickSizeInner); @@ -683,15 +1484,15 @@ function axis(orient, scale) { }; axis.ticks = function() { - return tickArguments = slice$1.call(arguments), axis; + return tickArguments = Array.from(arguments), axis; }; axis.tickArguments = function(_) { - return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice(); + return arguments.length ? (tickArguments = _ == null ? [] : Array.from(_), axis) : tickArguments.slice(); }; axis.tickValues = function(_) { - return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice(); + return arguments.length ? (tickValues = _ == null ? null : Array.from(_), axis) : tickValues && tickValues.slice(); }; axis.tickFormat = function(_) { @@ -714,6 +1515,10 @@ function axis(orient, scale) { return arguments.length ? (tickPadding = +_, axis) : tickPadding; }; + axis.offset = function(_) { + return arguments.length ? (offset = +_, axis) : offset; + }; + return axis; } @@ -733,7 +1538,7 @@ function axisLeft(scale) { return axis(left, scale); } -var noop = {value: function() {}}; +var noop$3 = {value: () => {}}; function dispatch() { for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { @@ -747,7 +1552,7 @@ function Dispatch(_) { this._ = _; } -function parseTypenames(typenames, types) { +function parseTypenames$1(typenames, types) { return typenames.trim().split(/^|\s+/).map(function(t) { var name = "", i = t.indexOf("."); if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); @@ -760,14 +1565,14 @@ Dispatch.prototype = dispatch.prototype = { constructor: Dispatch, on: function(typename, callback) { var _ = this._, - T = parseTypenames(typename + "", _), + T = parseTypenames$1(typename + "", _), t, i = -1, n = T.length; // If no callback was specified, return the callback of the given type and name. if (arguments.length < 2) { - while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + while (++i < n) if ((t = (typename = T[i]).type) && (t = get$1(_[t], typename.name))) return t; return; } @@ -775,8 +1580,8 @@ Dispatch.prototype = dispatch.prototype = { // Otherwise, if a null callback was specified, remove callbacks of the given name. if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); while (++i < n) { - if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); - else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + if (t = (typename = T[i]).type) _[t] = set$1(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set$1(_[t], typename.name, null); } return this; @@ -797,7 +1602,7 @@ Dispatch.prototype = dispatch.prototype = { } }; -function get(type, name) { +function get$1(type, name) { for (var i = 0, n = type.length, c; i < n; ++i) { if ((c = type[i]).name === name) { return c.value; @@ -805,10 +1610,10 @@ function get(type, name) { } } -function set(type, name, callback) { +function set$1(type, name, callback) { for (var i = 0, n = type.length; i < n; ++i) { if (type[i].name === name) { - type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + type[i] = noop$3, type = type.slice(0, i).concat(type.slice(i + 1)); break; } } @@ -829,7 +1634,7 @@ var namespaces = { function namespace(name) { var prefix = name += "", i = prefix.indexOf(":"); if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); - return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins } function creatorInherit(name) { @@ -855,10 +1660,10 @@ function creator(name) { : creatorInherit)(fullname); } -function none() {} +function none$2() {} function selector(selector) { - return selector == null ? none : function() { + return selector == null ? none$2 : function() { return this.querySelector(selector); }; } @@ -875,21 +1680,38 @@ function selection_select(select) { } } - return new Selection(subgroups, this._parents); + return new Selection$1(subgroups, this._parents); +} + +// Given something array like (or null), returns something that is strictly an +// array. This is used to ensure that array-like objects passed to d3.selectAll +// or selection.selectAll are converted into proper arrays when creating a +// selection; we donโ€™t ever want to create a selection backed by a live +// HTMLCollection or NodeList. However, note that selection.selectAll will use a +// static NodeList as a group, since it safely derived from querySelectorAll. +function array$4(x) { + return x == null ? [] : Array.isArray(x) ? x : Array.from(x); } -function empty() { +function empty$1() { return []; } function selectorAll(selector) { - return selector == null ? empty : function() { + return selector == null ? empty$1 : function() { return this.querySelectorAll(selector); }; } +function arrayAll(select) { + return function() { + return array$4(select.apply(this, arguments)); + }; +} + function selection_selectAll(select) { - if (typeof select !== "function") select = selectorAll(select); + if (typeof select === "function") select = arrayAll(select); + else select = selectorAll(select); for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { @@ -900,7 +1722,7 @@ function selection_selectAll(select) { } } - return new Selection(subgroups, parents); + return new Selection$1(subgroups, parents); } function matcher(selector) { @@ -909,6 +1731,46 @@ function matcher(selector) { }; } +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + +var find$1 = Array.prototype.find; + +function childFind(match) { + return function() { + return find$1.call(this.children, match); + }; +} + +function childFirst() { + return this.firstElementChild; +} + +function selection_selectChild(match) { + return this.select(match == null ? childFirst + : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +var filter = Array.prototype.filter; + +function children() { + return Array.from(this.children); +} + +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} + +function selection_selectChildren(match) { + return this.selectAll(match == null ? children + : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + function selection_filter(match) { if (typeof match !== "function") match = matcher(match); @@ -920,7 +1782,7 @@ function selection_filter(match) { } } - return new Selection(subgroups, this._parents); + return new Selection$1(subgroups, this._parents); } function sparse(update) { @@ -928,7 +1790,7 @@ function sparse(update) { } function selection_enter() { - return new Selection(this._enter || this._groups.map(sparse), this._parents); + return new Selection$1(this._enter || this._groups.map(sparse), this._parents); } function EnterNode(parent, datum) { @@ -947,14 +1809,12 @@ EnterNode.prototype = { querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } }; -function constant$1(x) { +function constant$a(x) { return function() { return x; }; } -var keyPrefix = "$"; // Protect against keys like โ€œ__proto__โ€. - function bindIndex(parent, group, enter, update, exit, data) { var i = 0, node, @@ -984,7 +1844,7 @@ function bindIndex(parent, group, enter, update, exit, data) { function bindKey(parent, group, enter, update, exit, data, key) { var i, node, - nodeByKeyValue = {}, + nodeByKeyValue = new Map, groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), @@ -994,11 +1854,11 @@ function bindKey(parent, group, enter, update, exit, data, key) { // If multiple nodes have the same key, the duplicates are added to exit. for (i = 0; i < groupLength; ++i) { if (node = group[i]) { - keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); - if (keyValue in nodeByKeyValue) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { exit[i] = node; } else { - nodeByKeyValue[keyValue] = node; + nodeByKeyValue.set(keyValue, node); } } } @@ -1007,11 +1867,11 @@ function bindKey(parent, group, enter, update, exit, data, key) { // If there a node associated with this key, join and add it to update. // If there is not (or the key is a duplicate), add it to enter. for (i = 0; i < dataLength; ++i) { - keyValue = keyPrefix + key.call(parent, data[i], i, data); - if (node = nodeByKeyValue[keyValue]) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { update[i] = node; node.__data__ = data[i]; - nodeByKeyValue[keyValue] = null; + nodeByKeyValue.delete(keyValue); } else { enter[i] = new EnterNode(parent, data[i]); } @@ -1019,30 +1879,30 @@ function bindKey(parent, group, enter, update, exit, data, key) { // Add any remaining nodes that were not bound to data to exit. for (i = 0; i < groupLength; ++i) { - if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) { exit[i] = node; } } } +function datum(node) { + return node.__data__; +} + function selection_data(value, key) { - if (!value) { - data = new Array(this.size()), j = -1; - this.each(function(d) { data[++j] = d; }); - return data; - } + if (!arguments.length) return Array.from(this, datum); var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups; - if (typeof value !== "function") value = constant$1(value); + if (typeof value !== "function") value = constant$a(value); for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { var parent = parents[j], group = groups[j], groupLength = group.length, - data = value.call(parent, parent && parent.__data__, j, parents), + data = arraylike(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = new Array(dataLength), updateGroup = update[j] = new Array(dataLength), @@ -1062,25 +1922,46 @@ function selection_data(value, key) { } } - update = new Selection(update, parents); + update = new Selection$1(update, parents); update._enter = enter; update._exit = exit; return update; } +// Given some data, this returns an array-like view of it: an object that +// exposes a length property and allows numeric indexing. Note that unlike +// selectAll, this isnโ€™t worried about โ€œliveโ€ collections because the resulting +// array will only be used briefly while data is being bound. (It is possible to +// cause the data to change while iterating by using a key function, but please +// donโ€™t; weโ€™d rather avoid a gratuitous copy.) +function arraylike(data) { + return typeof data === "object" && "length" in data + ? data // Array, TypedArray, NodeList, array-like + : Array.from(data); // Map, Set, iterable, string, or anything else +} + function selection_exit() { - return new Selection(this._exit || this._groups.map(sparse), this._parents); + return new Selection$1(this._exit || this._groups.map(sparse), this._parents); } function selection_join(onenter, onupdate, onexit) { var enter = this.enter(), update = this, exit = this.exit(); - enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); - if (onupdate != null) update = onupdate(update); + if (typeof onenter === "function") { + enter = onenter(enter); + if (enter) enter = enter.selection(); + } else { + enter = enter.append(onenter + ""); + } + if (onupdate != null) { + update = onupdate(update); + if (update) update = update.selection(); + } if (onexit == null) exit.remove(); else onexit(exit); return enter && update ? enter.merge(update).order() : update; } -function selection_merge(selection) { +function selection_merge(context) { + var selection = context.selection ? context.selection() : context; for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { @@ -1094,7 +1975,7 @@ function selection_merge(selection) { merges[j] = groups0[j]; } - return new Selection(merges, this._parents); + return new Selection$1(merges, this._parents); } function selection_order() { @@ -1112,7 +1993,7 @@ function selection_order() { } function selection_sort(compare) { - if (!compare) compare = ascending$1; + if (!compare) compare = ascending$2; function compareNode(a, b) { return a && b ? compare(a.__data__, b.__data__) : !a - !b; @@ -1127,10 +2008,10 @@ function selection_sort(compare) { sortgroup.sort(compareNode); } - return new Selection(sortgroups, this._parents).order(); + return new Selection$1(sortgroups, this._parents).order(); } -function ascending$1(a, b) { +function ascending$2(a, b) { return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; } @@ -1142,9 +2023,7 @@ function selection_call() { } function selection_nodes() { - var nodes = new Array(this.size()), i = -1; - this.each(function() { nodes[++i] = this; }); - return nodes; + return Array.from(this); } function selection_node() { @@ -1160,8 +2039,8 @@ function selection_node() { } function selection_size() { - var size = 0; - this.each(function() { ++size; }); + let size = 0; + for (const node of this) ++size; // eslint-disable-line no-unused-vars return size; } @@ -1180,31 +2059,31 @@ function selection_each(callback) { return this; } -function attrRemove(name) { +function attrRemove$1(name) { return function() { this.removeAttribute(name); }; } -function attrRemoveNS(fullname) { +function attrRemoveNS$1(fullname) { return function() { this.removeAttributeNS(fullname.space, fullname.local); }; } -function attrConstant(name, value) { +function attrConstant$1(name, value) { return function() { this.setAttribute(name, value); }; } -function attrConstantNS(fullname, value) { +function attrConstantNS$1(fullname, value) { return function() { this.setAttributeNS(fullname.space, fullname.local, value); }; } -function attrFunction(name, value) { +function attrFunction$1(name, value) { return function() { var v = value.apply(this, arguments); if (v == null) this.removeAttribute(name); @@ -1212,7 +2091,7 @@ function attrFunction(name, value) { }; } -function attrFunctionNS(fullname, value) { +function attrFunctionNS$1(fullname, value) { return function() { var v = value.apply(this, arguments); if (v == null) this.removeAttributeNS(fullname.space, fullname.local); @@ -1231,9 +2110,9 @@ function selection_attr(name, value) { } return this.each((value == null - ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" - ? (fullname.local ? attrFunctionNS : attrFunction) - : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); + ? (fullname.local ? attrRemoveNS$1 : attrRemove$1) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS$1 : attrFunction$1) + : (fullname.local ? attrConstantNS$1 : attrConstant$1)))(fullname, value)); } function defaultView(node) { @@ -1242,19 +2121,19 @@ function defaultView(node) { || node.defaultView; // node is a Document } -function styleRemove(name) { +function styleRemove$1(name) { return function() { this.style.removeProperty(name); }; } -function styleConstant(name, value, priority) { +function styleConstant$1(name, value, priority) { return function() { this.style.setProperty(name, value, priority); }; } -function styleFunction(name, value, priority) { +function styleFunction$1(name, value, priority) { return function() { var v = value.apply(this, arguments); if (v == null) this.style.removeProperty(name); @@ -1265,9 +2144,9 @@ function styleFunction(name, value, priority) { function selection_style(name, value, priority) { return arguments.length > 1 ? this.each((value == null - ? styleRemove : typeof value === "function" - ? styleFunction - : styleConstant)(name, value, priority == null ? "" : priority)) + ? styleRemove$1 : typeof value === "function" + ? styleFunction$1 + : styleConstant$1)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name); } @@ -1385,13 +2264,13 @@ function textRemove() { this.textContent = ""; } -function textConstant(value) { +function textConstant$1(value) { return function() { this.textContent = value; }; } -function textFunction(value) { +function textFunction$1(value) { return function() { var v = value.apply(this, arguments); this.textContent = v == null ? "" : v; @@ -1402,8 +2281,8 @@ function selection_text(value) { return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" - ? textFunction - : textConstant)(value)) + ? textFunction$1 + : textConstant$1)(value)) : this.node().textContent; } @@ -1497,40 +2376,13 @@ function selection_datum(value) { : this.node().__data__; } -var filterEvents = {}; - -exports.event = null; - -if (typeof document !== "undefined") { - var element = document.documentElement; - if (!("onmouseenter" in element)) { - filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; - } -} - -function filterContextListener(listener, index, group) { - listener = contextListener(listener, index, group); +function contextListener(listener) { return function(event) { - var related = event.relatedTarget; - if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { - listener.call(this, event); - } - }; -} - -function contextListener(listener, index, group) { - return function(event1) { - var event0 = exports.event; // Events can be reentrant (e.g., focus). - exports.event = event1; - try { - listener.call(this, this.__data__, index, group); - } finally { - exports.event = event0; - } + listener.call(this, event, this.__data__); }; } -function parseTypenames$1(typenames) { +function parseTypenames(typenames) { return typenames.trim().split(/^|\s+/).map(function(t) { var name = "", i = t.indexOf("."); if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); @@ -1544,7 +2396,7 @@ function onRemove(typename) { if (!on) return; for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.capture); + this.removeEventListener(o.type, o.listener, o.options); } else { on[++i] = o; } @@ -1554,27 +2406,26 @@ function onRemove(typename) { }; } -function onAdd(typename, value, capture) { - var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; - return function(d, i, group) { - var on = this.__on, o, listener = wrap(value, i, group); +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); if (on) for (var j = 0, m = on.length; j < m; ++j) { if ((o = on[j]).type === typename.type && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.capture); - this.addEventListener(o.type, o.listener = listener, o.capture = capture); + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); o.value = value; return; } } - this.addEventListener(typename.type, listener, capture); - o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + this.addEventListener(typename.type, listener, options); + o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options}; if (!on) this.__on = [o]; else on.push(o); }; } -function selection_on(typename, value, capture) { - var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t; +function selection_on(typename, value, options) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; if (arguments.length < 2) { var on = this.node().__on; @@ -1589,22 +2440,10 @@ function selection_on(typename, value, capture) { } on = value ? onAdd : onRemove; - if (capture == null) capture = false; - for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); return this; } -function customEvent(event1, listener, that, args) { - var event0 = exports.event; - event1.sourceEvent = exports.event; - exports.event = event1; - try { - return listener.apply(that, args); - } finally { - exports.event = event0; - } -} - function dispatchEvent(node, type, params) { var window = defaultView(node), event = window.CustomEvent; @@ -1638,27 +2477,42 @@ function selection_dispatch(type, params) { : dispatchConstant)(type, params)); } -var root = [null]; - -function Selection(groups, parents) { +function* selection_iterator() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; + } + } +} + +var root$1 = [null]; + +function Selection$1(groups, parents) { this._groups = groups; this._parents = parents; } function selection() { - return new Selection([[document.documentElement]], root); + return new Selection$1([[document.documentElement]], root$1); } -Selection.prototype = selection.prototype = { - constructor: Selection, +function selection_selection() { + return this; +} + +Selection$1.prototype = selection.prototype = { + constructor: Selection$1, select: selection_select, selectAll: selection_selectAll, + selectChild: selection_selectChild, + selectChildren: selection_selectChildren, filter: selection_filter, data: selection_data, enter: selection_enter, exit: selection_exit, join: selection_join, merge: selection_merge, + selection: selection_selection, order: selection_order, sort: selection_sort, call: selection_call, @@ -1681,22 +2535,23 @@ Selection.prototype = selection.prototype = { clone: selection_clone, datum: selection_datum, on: selection_on, - dispatch: selection_dispatch + dispatch: selection_dispatch, + [Symbol.iterator]: selection_iterator }; function select(selector) { return typeof selector === "string" - ? new Selection([[document.querySelector(selector)]], [document.documentElement]) - : new Selection([[selector]], root); + ? new Selection$1([[document.querySelector(selector)]], [document.documentElement]) + : new Selection$1([[selector]], root$1); } -function create(name) { +function create$1(name) { return select(creator(name).call(document.documentElement)); } var nextId = 0; -function local() { +function local$1() { return new Local; } @@ -1704,7 +2559,7 @@ function Local() { this._ = "@" + (++nextId).toString(36); } -Local.prototype = local.prototype = { +Local.prototype = local$1.prototype = { constructor: Local, get: function(node) { var id = this._; @@ -1722,74 +2577,65 @@ Local.prototype = local.prototype = { } }; -function sourceEvent() { - var current = exports.event, source; - while (source = current.sourceEvent) current = source; - return current; +function sourceEvent(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) event = sourceEvent; + return event; } -function point(node, event) { - var svg = node.ownerSVGElement || node; - - if (svg.createSVGPoint) { - var point = svg.createSVGPoint(); - point.x = event.clientX, point.y = event.clientY; - point = point.matrixTransform(node.getScreenCTM().inverse()); - return [point.x, point.y]; +function pointer(event, node) { + event = sourceEvent(event); + if (node === undefined) node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } } - - var rect = node.getBoundingClientRect(); - return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + return [event.pageX, event.pageY]; } -function mouse(node) { - var event = sourceEvent(); - if (event.changedTouches) event = event.changedTouches[0]; - return point(node, event); +function pointers(events, node) { + if (events.target) { // i.e., instanceof Event, not TouchList or iterable + events = sourceEvent(events); + if (node === undefined) node = events.currentTarget; + events = events.touches || [events]; + } + return Array.from(events, event => pointer(event, node)); } function selectAll(selector) { return typeof selector === "string" - ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) - : new Selection([selector == null ? [] : selector], root); + ? new Selection$1([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection$1([array$4(selector)], root$1); } -function touch(node, touches, identifier) { - if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; +// These are typically used in conjunction with noevent to ensure that we can +// preventDefault on the event. +const nonpassive = {passive: false}; +const nonpassivecapture = {capture: true, passive: false}; - for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { - if ((touch = touches[i]).identifier === identifier) { - return point(node, touch); - } - } - - return null; -} - -function touches(node, touches) { - if (touches == null) touches = sourceEvent().touches; - - for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { - points[i] = point(node, touches[i]); - } - - return points; -} - -function nopropagation() { - exports.event.stopImmediatePropagation(); +function nopropagation$2(event) { + event.stopImmediatePropagation(); } -function noevent() { - exports.event.preventDefault(); - exports.event.stopImmediatePropagation(); +function noevent$2(event) { + event.preventDefault(); + event.stopImmediatePropagation(); } function dragDisable(view) { var root = view.document.documentElement, - selection = select(view).on("dragstart.drag", noevent, true); + selection = select(view).on("dragstart.drag", noevent$2, nonpassivecapture); if ("onselectstart" in root) { - selection.on("selectstart.drag", noevent, true); + selection.on("selectstart.drag", noevent$2, nonpassivecapture); } else { root.__noselect = root.style.MozUserSelect; root.style.MozUserSelect = "none"; @@ -1800,7 +2646,7 @@ function yesdrag(view, noclick) { var root = view.document.documentElement, selection = select(view).on("dragstart.drag", null); if (noclick) { - selection.on("click.drag", noevent, true); + selection.on("click.drag", noevent$2, nonpassivecapture); setTimeout(function() { selection.on("click.drag", null); }, 0); } if ("onselectstart" in root) { @@ -1811,23 +2657,30 @@ function yesdrag(view, noclick) { } } -function constant$2(x) { - return function() { - return x; - }; -} - -function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { - this.target = target; - this.type = type; - this.subject = subject; - this.identifier = id; - this.active = active; - this.x = x; - this.y = y; - this.dx = dx; - this.dy = dy; - this._ = dispatch; +var constant$9 = x => () => x; + +function DragEvent(type, { + sourceEvent, + subject, + target, + identifier, + active, + x, y, dx, dy, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + subject: {value: subject, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + identifier: {value: identifier, enumerable: true, configurable: true}, + active: {value: active, enumerable: true, configurable: true}, + x: {value: x, enumerable: true, configurable: true}, + y: {value: y, enumerable: true, configurable: true}, + dx: {value: dx, enumerable: true, configurable: true}, + dy: {value: dy, enumerable: true, configurable: true}, + _: {value: dispatch} + }); } DragEvent.prototype.on = function() { @@ -1836,27 +2689,27 @@ DragEvent.prototype.on = function() { }; // Ignore right-click, since that should open the context menu. -function defaultFilter() { - return !exports.event.ctrlKey && !exports.event.button; +function defaultFilter$2(event) { + return !event.ctrlKey && !event.button; } function defaultContainer() { return this.parentNode; } -function defaultSubject(d) { - return d == null ? {x: exports.event.x, y: exports.event.y} : d; +function defaultSubject(event, d) { + return d == null ? {x: event.x, y: event.y} : d; } -function defaultTouchable() { +function defaultTouchable$2() { return navigator.maxTouchPoints || ("ontouchstart" in this); } function drag() { - var filter = defaultFilter, + var filter = defaultFilter$2, container = defaultContainer, subject = defaultSubject, - touchable = defaultTouchable, + touchable = defaultTouchable$2, gestures = {}, listeners = dispatch("start", "drag", "end"), active = 0, @@ -1871,117 +2724,144 @@ function drag() { .on("mousedown.drag", mousedowned) .filter(touchable) .on("touchstart.drag", touchstarted) - .on("touchmove.drag", touchmoved) + .on("touchmove.drag", touchmoved, nonpassive) .on("touchend.drag touchcancel.drag", touchended) .style("touch-action", "none") .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); } - function mousedowned() { - if (touchending || !filter.apply(this, arguments)) return; - var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments); + function mousedowned(event, d) { + if (touchending || !filter.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); if (!gesture) return; - select(exports.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); - dragDisable(exports.event.view); - nopropagation(); + select(event.view) + .on("mousemove.drag", mousemoved, nonpassivecapture) + .on("mouseup.drag", mouseupped, nonpassivecapture); + dragDisable(event.view); + nopropagation$2(event); mousemoving = false; - mousedownx = exports.event.clientX; - mousedowny = exports.event.clientY; - gesture("start"); + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); } - function mousemoved() { - noevent(); + function mousemoved(event) { + noevent$2(event); if (!mousemoving) { - var dx = exports.event.clientX - mousedownx, dy = exports.event.clientY - mousedowny; + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; mousemoving = dx * dx + dy * dy > clickDistance2; } - gestures.mouse("drag"); + gestures.mouse("drag", event); } - function mouseupped() { - select(exports.event.view).on("mousemove.drag mouseup.drag", null); - yesdrag(exports.event.view, mousemoving); - noevent(); - gestures.mouse("end"); + function mouseupped(event) { + select(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent$2(event); + gestures.mouse("end", event); } - function touchstarted() { - if (!filter.apply(this, arguments)) return; - var touches = exports.event.changedTouches, - c = container.apply(this, arguments), + function touchstarted(event, d) { + if (!filter.call(this, event, d)) return; + var touches = event.changedTouches, + c = container.call(this, event, d), n = touches.length, i, gesture; for (i = 0; i < n; ++i) { - if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) { - nopropagation(); - gesture("start"); + if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { + nopropagation$2(event); + gesture("start", event, touches[i]); } } } - function touchmoved() { - var touches = exports.event.changedTouches, + function touchmoved(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; for (i = 0; i < n; ++i) { if (gesture = gestures[touches[i].identifier]) { - noevent(); - gesture("drag"); + noevent$2(event); + gesture("drag", event, touches[i]); } } } - function touchended() { - var touches = exports.event.changedTouches, + function touchended(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; if (touchending) clearTimeout(touchending); touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! for (i = 0; i < n; ++i) { if (gesture = gestures[touches[i].identifier]) { - nopropagation(); - gesture("end"); + nopropagation$2(event); + gesture("end", event, touches[i]); } } } - function beforestart(id, container, point, that, args) { - var p = point(container, id), s, dx, dy, - sublisteners = listeners.copy(); + function beforestart(that, container, event, d, identifier, touch) { + var dispatch = listeners.copy(), + p = pointer(touch || event, container), dx, dy, + s; - if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() { - if ((exports.event.subject = s = subject.apply(that, args)) == null) return false; - dx = s.x - p[0] || 0; - dy = s.y - p[1] || 0; - return true; - })) return; + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch + }), d)) == null) return; + + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; - return function gesture(type) { + return function gesture(type, event, touch) { var p0 = p, n; switch (type) { - case "start": gestures[id] = gesture, n = active++; break; - case "end": delete gestures[id], --active; // nobreak - case "drag": p = point(container, id), n = active; break; + case "start": gestures[identifier] = gesture, n = active++; break; + case "end": delete gestures[identifier], --active; // falls through + case "drag": p = pointer(touch || event, container), n = active; break; } - customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); + dispatch.call( + type, + that, + new DragEvent(type, { + sourceEvent: event, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch + }), + d + ); }; } drag.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter; + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$9(!!_), drag) : filter; }; drag.container = function(_) { - return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container; + return arguments.length ? (container = typeof _ === "function" ? _ : constant$9(_), drag) : container; }; drag.subject = function(_) { - return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject; + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$9(_), drag) : subject; }; drag.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable; + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$9(!!_), drag) : touchable; }; drag.on = function() { @@ -2013,15 +2893,15 @@ var darker = 0.7; var brighter = 1 / darker; var reI = "\\s*([+-]?\\d+)\\s*", - reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", - reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*", reHex = /^#([0-9a-f]{3,8})$/, - reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), - reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), - reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), - reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), - reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), - reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`), + reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`), + reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`), + reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`), + reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`), + reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`); var named = { aliceblue: 0xf0f8ff, @@ -2175,14 +3055,15 @@ var named = { }; define(Color, color, { - copy: function(channels) { + copy(channels) { return Object.assign(new this.constructor, this, channels); }, - displayable: function() { + displayable() { return this.rgb().displayable(); }, hex: color_formatHex, // Deprecated! Use color.formatHex. formatHex: color_formatHex, + formatHex8: color_formatHex8, formatHsl: color_formatHsl, formatRgb: color_formatRgb, toString: color_formatRgb @@ -2192,6 +3073,10 @@ function color_formatHex() { return this.rgb().formatHex(); } +function color_formatHex8() { + return this.rgb().formatHex8(); +} + function color_formatHsl() { return hslConvert(this).formatHsl(); } @@ -2205,8 +3090,8 @@ function color(format) { format = (format + "").trim().toLowerCase(); return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 - : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 - : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 : null) // invalid hex : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) @@ -2247,18 +3132,21 @@ function Rgb(r, g, b, opacity) { } define(Rgb, rgb, extend(Color, { - brighter: function(k) { + brighter(k) { k = k == null ? brighter : Math.pow(brighter, k); return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); }, - darker: function(k) { + darker(k) { k = k == null ? darker : Math.pow(darker, k); return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); }, - rgb: function() { + rgb() { return this; }, - displayable: function() { + clamp() { + return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity)); + }, + displayable() { return (-0.5 <= this.r && this.r < 255.5) && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) @@ -2266,25 +3154,34 @@ define(Rgb, rgb, extend(Color, { }, hex: rgb_formatHex, // Deprecated! Use color.formatHex. formatHex: rgb_formatHex, + formatHex8: rgb_formatHex8, formatRgb: rgb_formatRgb, toString: rgb_formatRgb })); function rgb_formatHex() { - return "#" + hex(this.r) + hex(this.g) + hex(this.b); + return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`; +} + +function rgb_formatHex8() { + return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`; } function rgb_formatRgb() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "rgb(" : "rgba(") - + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.b) || 0)) - + (a === 1 ? ")" : ", " + a + ")"); + const a = clampa(this.opacity); + return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`; +} + +function clampa(opacity) { + return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity)); +} + +function clampi(value) { + return Math.max(0, Math.min(255, Math.round(value) || 0)); } function hex(value) { - value = Math.max(0, Math.min(255, Math.round(value) || 0)); + value = clampi(value); return (value < 16 ? "0" : "") + value.toString(16); } @@ -2321,7 +3218,7 @@ function hslConvert(o) { return new Hsl(h, s, l, o.opacity); } -function hsl(h, s, l, opacity) { +function hsl$2(h, s, l, opacity) { return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); } @@ -2332,16 +3229,16 @@ function Hsl(h, s, l, opacity) { this.opacity = +opacity; } -define(Hsl, hsl, extend(Color, { - brighter: function(k) { +define(Hsl, hsl$2, extend(Color, { + brighter(k) { k = k == null ? brighter : Math.pow(brighter, k); return new Hsl(this.h, this.s, this.l * k, this.opacity); }, - darker: function(k) { + darker(k) { k = k == null ? darker : Math.pow(darker, k); return new Hsl(this.h, this.s, this.l * k, this.opacity); }, - rgb: function() { + rgb() { var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, @@ -2354,21 +3251,29 @@ define(Hsl, hsl, extend(Color, { this.opacity ); }, - displayable: function() { + clamp() { + return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity)); + }, + displayable() { return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); }, - formatHsl: function() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "hsl(" : "hsla(") - + (this.h || 0) + ", " - + (this.s || 0) * 100 + "%, " - + (this.l || 0) * 100 + "%" - + (a === 1 ? ")" : ", " + a + ")"); + formatHsl() { + const a = clampa(this.opacity); + return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`; } })); +function clamph(value) { + value = (value || 0) % 360; + return value < 0 ? value + 360 : value; +} + +function clampt(value) { + return Math.max(0, Math.min(1, value || 0)); +} + /* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) { return (h < 60 ? m1 + (m2 - m1) * h / 60 @@ -2377,18 +3282,18 @@ function hsl2rgb(h, m1, m2) { : m1) * 255; } -var deg2rad = Math.PI / 180; -var rad2deg = 180 / Math.PI; +const radians$1 = Math.PI / 180; +const degrees$2 = 180 / Math.PI; // https://observablehq.com/@mbostock/lab-and-rgb -var K = 18, +const K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, - t0 = 4 / 29, - t1 = 6 / 29, - t2 = 3 * t1 * t1, - t3 = t1 * t1 * t1; + t0$1 = 4 / 29, + t1$1 = 6 / 29, + t2 = 3 * t1$1 * t1$1, + t3 = t1$1 * t1$1 * t1$1; function labConvert(o) { if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); @@ -2409,7 +3314,7 @@ function gray(l, opacity) { return new Lab(l, 0, 0, opacity == null ? 1 : opacity); } -function lab(l, a, b, opacity) { +function lab$1(l, a, b, opacity) { return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); } @@ -2420,14 +3325,14 @@ function Lab(l, a, b, opacity) { this.opacity = +opacity; } -define(Lab, lab, extend(Color, { - brighter: function(k) { +define(Lab, lab$1, extend(Color, { + brighter(k) { return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); }, - darker: function(k) { + darker(k) { return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); }, - rgb: function() { + rgb() { var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200; @@ -2444,11 +3349,11 @@ define(Lab, lab, extend(Color, { })); function xyz2lab(t) { - return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0$1; } function lab2xyz(t) { - return t > t1 ? t * t * t : t2 * (t - t0); + return t > t1$1 ? t * t * t : t2 * (t - t0$1); } function lrgb2rgb(x) { @@ -2463,7 +3368,7 @@ function hclConvert(o) { if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); if (!(o instanceof Lab)) o = labConvert(o); if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); - var h = Math.atan2(o.b, o.a) * rad2deg; + var h = Math.atan2(o.b, o.a) * degrees$2; return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); } @@ -2471,7 +3376,7 @@ function lch(l, c, h, opacity) { return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); } -function hcl(h, c, l, opacity) { +function hcl$2(h, c, l, opacity) { return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); } @@ -2484,30 +3389,30 @@ function Hcl(h, c, l, opacity) { function hcl2lab(o) { if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); - var h = o.h * deg2rad; + var h = o.h * radians$1; return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); } -define(Hcl, hcl, extend(Color, { - brighter: function(k) { +define(Hcl, hcl$2, extend(Color, { + brighter(k) { return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); }, - darker: function(k) { + darker(k) { return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); }, - rgb: function() { + rgb() { return hcl2lab(this).rgb(); } })); var A = -0.14861, - B = +1.78277, + B$1 = +1.78277, C = -0.29227, - D = -0.90649, + D$1 = -0.90649, E = +1.97294, - ED = E * D, - EB = E * B, - BC_DA = B * C - D * A; + ED = E * D$1, + EB = E * B$1, + BC_DA = B$1 * C - D$1 * A; function cubehelixConvert(o) { if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); @@ -2517,13 +3422,13 @@ function cubehelixConvert(o) { b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, - k = (E * (g - l) - C * bl) / D, + k = (E * (g - l) - C * bl) / D$1, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 - h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + h = s ? Math.atan2(k, bl) * degrees$2 - 120 : NaN; return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); } -function cubehelix(h, s, l, opacity) { +function cubehelix$3(h, s, l, opacity) { return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); } @@ -2534,31 +3439,31 @@ function Cubehelix(h, s, l, opacity) { this.opacity = +opacity; } -define(Cubehelix, cubehelix, extend(Color, { - brighter: function(k) { +define(Cubehelix, cubehelix$3, extend(Color, { + brighter(k) { k = k == null ? brighter : Math.pow(brighter, k); return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, - darker: function(k) { + darker(k) { k = k == null ? darker : Math.pow(darker, k); return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, - rgb: function() { - var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + rgb() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * radians$1, l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh = Math.cos(h), sinh = Math.sin(h); return new Rgb( - 255 * (l + a * (A * cosh + B * sinh)), - 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (A * cosh + B$1 * sinh)), + 255 * (l + a * (C * cosh + D$1 * sinh)), 255 * (l + a * (E * cosh)), this.opacity ); } })); -function basis(t1, v0, v1, v2, v3) { +function basis$1(t1, v0, v1, v2, v3) { var t2 = t1 * t1, t3 = t2 * t1; return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 @@ -2566,7 +3471,7 @@ function basis(t1, v0, v1, v2, v3) { + t3 * v3) / 6; } -function basis$1(values) { +function basis$2(values) { var n = values.length - 1; return function(t) { var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), @@ -2574,11 +3479,11 @@ function basis$1(values) { v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; - return basis((t - i / n) * n, v0, v1, v2, v3); + return basis$1((t - i / n) * n, v0, v1, v2, v3); }; } -function basisClosed(values) { +function basisClosed$1(values) { var n = values.length; return function(t) { var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), @@ -2586,46 +3491,42 @@ function basisClosed(values) { v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n]; - return basis((t - i / n) * n, v0, v1, v2, v3); + return basis$1((t - i / n) * n, v0, v1, v2, v3); }; } -function constant$3(x) { - return function() { - return x; - }; -} +var constant$8 = x => () => x; -function linear(a, d) { +function linear$2(a, d) { return function(t) { return a + t * d; }; } -function exponential(a, b, y) { +function exponential$1(a, b, y) { return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { return Math.pow(a + t * b, y); }; } -function hue(a, b) { +function hue$1(a, b) { var d = b - a; - return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a); + return d ? linear$2(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$8(isNaN(a) ? b : a); } -function gamma(y) { +function gamma$1(y) { return (y = +y) === 1 ? nogamma : function(a, b) { - return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a); + return b - a ? exponential$1(a, b, y) : constant$8(isNaN(a) ? b : a); }; } function nogamma(a, b) { var d = b - a; - return d ? linear(a, d) : constant$3(isNaN(a) ? b : a); + return d ? linear$2(a, d) : constant$8(isNaN(a) ? b : a); } var interpolateRgb = (function rgbGamma(y) { - var color = gamma(y); + var color = gamma$1(y); function rgb$1(start, end) { var r = color((start = rgb(start)).r, (end = rgb(end)).r), @@ -2672,8 +3573,8 @@ function rgbSpline(spline) { }; } -var rgbBasis = rgbSpline(basis$1); -var rgbBasisClosed = rgbSpline(basisClosed); +var rgbBasis = rgbSpline(basis$2); +var rgbBasisClosed = rgbSpline(basisClosed$1); function numberArray(a, b) { if (!b) b = []; @@ -2690,7 +3591,7 @@ function isNumberArray(x) { return ArrayBuffer.isView(x) && !(x instanceof DataView); } -function array$1(a, b) { +function array$3(a, b) { return (isNumberArray(b) ? numberArray : genericArray)(a, b); } @@ -2701,7 +3602,7 @@ function genericArray(a, b) { c = new Array(nb), i; - for (i = 0; i < na; ++i) x[i] = interpolateValue(a[i], b[i]); + for (i = 0; i < na; ++i) x[i] = interpolate$2(a[i], b[i]); for (; i < nb; ++i) c[i] = b[i]; return function(t) { @@ -2710,7 +3611,7 @@ function genericArray(a, b) { }; } -function date(a, b) { +function date$1(a, b) { var d = new Date; return a = +a, b = +b, function(t) { return d.setTime(a * (1 - t) + b * t), d; @@ -2723,7 +3624,7 @@ function interpolateNumber(a, b) { }; } -function object(a, b) { +function object$1(a, b) { var i = {}, c = {}, k; @@ -2733,7 +3634,7 @@ function object(a, b) { for (k in b) { if (k in a) { - i[k] = interpolateValue(a[k], b[k]); + i[k] = interpolate$2(a[k], b[k]); } else { c[k] = b[k]; } @@ -2808,16 +3709,16 @@ function interpolateString(a, b) { }); } -function interpolateValue(a, b) { +function interpolate$2(a, b) { var t = typeof b, c; - return b == null || t === "boolean" ? constant$3(b) + return b == null || t === "boolean" ? constant$8(b) : (t === "number" ? interpolateNumber : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString) : b instanceof color ? interpolateRgb - : b instanceof Date ? date + : b instanceof Date ? date$1 : isNumberArray(b) ? numberArray : Array.isArray(b) ? genericArray - : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object$1 : interpolateNumber)(a, b); } @@ -2828,8 +3729,8 @@ function discrete(range) { }; } -function hue$1(a, b) { - var i = hue(+a, +b); +function hue(a, b) { + var i = hue$1(+a, +b); return function(t) { var x = i(t); return x - 360 * Math.floor(x / 360); @@ -2842,9 +3743,9 @@ function interpolateRound(a, b) { }; } -var degrees = 180 / Math.PI; +var degrees$1 = 180 / Math.PI; -var identity$2 = { +var identity$7 = { translateX: 0, translateY: 0, rotate: 0, @@ -2862,33 +3763,26 @@ function decompose(a, b, c, d, e, f) { return { translateX: e, translateY: f, - rotate: Math.atan2(b, a) * degrees, - skewX: Math.atan(skewX) * degrees, + rotate: Math.atan2(b, a) * degrees$1, + skewX: Math.atan(skewX) * degrees$1, scaleX: scaleX, scaleY: scaleY }; } -var cssNode, - cssRoot, - cssView, - svgNode; +var svgNode; +/* eslint-disable no-undef */ function parseCss(value) { - if (value === "none") return identity$2; - if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; - cssNode.style.transform = value; - value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); - cssRoot.removeChild(cssNode); - value = value.slice(7, -1).split(","); - return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); + const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity$7 : decompose(m.a, m.b, m.c, m.d, m.e, m.f); } function parseSvg(value) { - if (value == null) return identity$2; + if (value == null) return identity$7; if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); svgNode.setAttribute("transform", value); - if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2; + if (!(value = svgNode.transform.baseVal.consolidate())) return identity$7; value = value.matrix; return decompose(value.a, value.b, value.c, value.d, value.e, value.f); } @@ -2954,10 +3848,7 @@ function interpolateTransform(parse, pxComma, pxParen, degParen) { var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); -var rho = Math.SQRT2, - rho2 = 2, - rho4 = 4, - epsilon2 = 1e-12; +var epsilon2$1 = 1e-12; function cosh(x) { return ((x = Math.exp(x)) + 1 / x) / 2; @@ -2971,57 +3862,67 @@ function tanh(x) { return ((x = Math.exp(2 * x)) - 1) / (x + 1); } -// p0 = [ux0, uy0, w0] -// p1 = [ux1, uy1, w1] -function interpolateZoom(p0, p1) { - var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], - ux1 = p1[0], uy1 = p1[1], w1 = p1[2], - dx = ux1 - ux0, - dy = uy1 - uy0, - d2 = dx * dx + dy * dy, - i, - S; - - // Special case for u0 โ‰… u1. - if (d2 < epsilon2) { - S = Math.log(w1 / w0) / rho; - i = function(t) { - return [ - ux0 + t * dx, - uy0 + t * dy, - w0 * Math.exp(rho * t * S) - ]; - }; - } +var interpolateZoom = (function zoomRho(rho, rho2, rho4) { - // General case. - else { - var d1 = Math.sqrt(d2), - b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), - b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), - r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), - r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); - S = (r1 - r0) / rho; - i = function(t) { - var s = t * S, - coshr0 = cosh(r0), - u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); - return [ - ux0 + u * dx, - uy0 + u * dy, - w0 * coshr0 / cosh(rho * s + r0) - ]; - }; + // p0 = [ux0, uy0, w0] + // p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 โ‰… u1. + if (d2 < epsilon2$1) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000 * rho / Math.SQRT2; + + return i; } - i.duration = S * 1000; + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; - return i; -} + return zoom; +})(Math.SQRT2, 2, 4); -function hsl$1(hue) { +function hsl(hue) { return function(start, end) { - var h = hue((start = hsl(start)).h, (end = hsl(end)).h), + var h = hue((start = hsl$2(start)).h, (end = hsl$2(end)).h), s = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity); @@ -3035,11 +3936,11 @@ function hsl$1(hue) { } } -var hsl$2 = hsl$1(hue); -var hslLong = hsl$1(nogamma); +var hsl$1 = hsl(hue$1); +var hslLong = hsl(nogamma); -function lab$1(start, end) { - var l = nogamma((start = lab(start)).l, (end = lab(end)).l), +function lab(start, end) { + var l = nogamma((start = lab$1(start)).l, (end = lab$1(end)).l), a = nogamma(start.a, end.a), b = nogamma(start.b, end.b), opacity = nogamma(start.opacity, end.opacity); @@ -3052,9 +3953,9 @@ function lab$1(start, end) { }; } -function hcl$1(hue) { +function hcl(hue) { return function(start, end) { - var h = hue((start = hcl(start)).h, (end = hcl(end)).h), + var h = hue((start = hcl$2(start)).h, (end = hcl$2(end)).h), c = nogamma(start.c, end.c), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity); @@ -3068,15 +3969,15 @@ function hcl$1(hue) { } } -var hcl$2 = hcl$1(hue); -var hclLong = hcl$1(nogamma); +var hcl$1 = hcl(hue$1); +var hclLong = hcl(nogamma); function cubehelix$1(hue) { return (function cubehelixGamma(y) { y = +y; - function cubehelix$1(start, end) { - var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h), + function cubehelix(start, end) { + var h = hue((start = cubehelix$3(start)).h, (end = cubehelix$3(end)).h), s = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity); @@ -3089,16 +3990,17 @@ function cubehelix$1(hue) { }; } - cubehelix$1.gamma = cubehelixGamma; + cubehelix.gamma = cubehelixGamma; - return cubehelix$1; + return cubehelix; })(1); } -var cubehelix$2 = cubehelix$1(hue); +var cubehelix$2 = cubehelix$1(hue$1); var cubehelixLong = cubehelix$1(nogamma); function piecewise(interpolate, values) { + if (values === undefined) values = interpolate, interpolate = interpolate$2; var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); while (i < n) I[i] = interpolate(v, v = values[++i]); return function(t) { @@ -3107,15 +4009,15 @@ function piecewise(interpolate, values) { }; } -function quantize(interpolator, n) { +function quantize$1(interpolator, n) { var samples = new Array(n); for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); return samples; } var frame = 0, // is an animation frame pending? - timeout = 0, // is a timeout pending? - interval = 0, // are any timers active? + timeout$1 = 0, // is a timeout pending? + interval$1 = 0, // are any timers active? pokeDelay = 1000, // how frequently we check for clock skew taskHead, taskTail, @@ -3173,7 +4075,7 @@ function timerFlush() { ++frame; // Pretend weโ€™ve set an alarm, if we havenโ€™t already. var t = taskHead, e; while (t) { - if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e); t = t._next; } --frame; @@ -3181,7 +4083,7 @@ function timerFlush() { function wake() { clockNow = (clockLast = clock.now()) + clockSkew; - frame = timeout = 0; + frame = timeout$1 = 0; try { timerFlush(); } finally { @@ -3213,36 +4115,40 @@ function nap() { function sleep(time) { if (frame) return; // Soonest alarm already set, or will be. - if (timeout) timeout = clearTimeout(timeout); + if (timeout$1) timeout$1 = clearTimeout(timeout$1); var delay = time - clockNow; // Strictly less than if we recomputed clockNow. if (delay > 24) { - if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); - if (interval) interval = clearInterval(interval); + if (time < Infinity) timeout$1 = setTimeout(wake, time - clock.now() - clockSkew); + if (interval$1) interval$1 = clearInterval(interval$1); } else { - if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + if (!interval$1) clockLast = clock.now(), interval$1 = setInterval(poke, pokeDelay); frame = 1, setFrame(wake); } } -function timeout$1(callback, delay, time) { +function timeout(callback, delay, time) { var t = new Timer; delay = delay == null ? 0 : +delay; - t.restart(function(elapsed) { + t.restart(elapsed => { t.stop(); callback(elapsed + delay); }, delay, time); return t; } -function interval$1(callback, delay, time) { +function interval(callback, delay, time) { var t = new Timer, total = delay; if (delay == null) return t.restart(callback, delay, time), t; - delay = +delay, time = time == null ? now() : +time; - t.restart(function tick(elapsed) { - elapsed += total; - t.restart(tick, total += delay, time); - callback(elapsed); - }, delay, time); + t._restart = t.restart; + t.restart = function(callback, delay, time) { + delay = +delay, time = time == null ? now() : +time; + t._restart(function tick(elapsed) { + elapsed += total; + t._restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + }; + t.restart(callback, delay, time); return t; } @@ -3261,7 +4167,7 @@ function schedule(node, name, id, index, group, timing) { var schedules = node.__transition; if (!schedules) node.__transition = {}; else if (id in schedules) return; - create$1(node, id, { + create(node, id, { name: name, index: index, // For context during callback. group: group, // For context during callback. @@ -3277,24 +4183,24 @@ function schedule(node, name, id, index, group, timing) { } function init(node, id) { - var schedule = get$1(node, id); + var schedule = get(node, id); if (schedule.state > CREATED) throw new Error("too late; already scheduled"); return schedule; } -function set$1(node, id) { - var schedule = get$1(node, id); +function set(node, id) { + var schedule = get(node, id); if (schedule.state > STARTED) throw new Error("too late; already running"); return schedule; } -function get$1(node, id) { +function get(node, id) { var schedule = node.__transition; if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); return schedule; } -function create$1(node, id, self) { +function create(node, id, self) { var schedules = node.__transition, tween; @@ -3324,7 +4230,7 @@ function create$1(node, id, self) { // While this element already has a starting transition during this frame, // defer starting an interrupting transition until that transition has a // chance to tick (and possibly end); see d3/d3-transition#54! - if (o.state === STARTED) return timeout$1(start); + if (o.state === STARTED) return timeout(start); // Interrupt the active transition, if any. if (o.state === RUNNING) { @@ -3347,7 +4253,7 @@ function create$1(node, id, self) { // Note the transition may be canceled after start and before the first tick! // Note this must be scheduled before the start event; see d3/d3-transition#16! // Assuming this is successful, subsequent callbacks go straight to tick. - timeout$1(function() { + timeout(function() { if (self.state === STARTED) { self.state = RUNNING; self.timer.restart(tick, self.delay, self.time); @@ -3429,7 +4335,7 @@ function selection_interrupt(name) { function tweenRemove(id, name) { var tween0, tween1; return function() { - var schedule = set$1(this, id), + var schedule = set(this, id), tween = schedule.tween; // If this node shared tween with the previous node, @@ -3454,7 +4360,7 @@ function tweenFunction(id, name, value) { var tween0, tween1; if (typeof value !== "function") throw new Error; return function() { - var schedule = set$1(this, id), + var schedule = set(this, id), tween = schedule.tween; // If this node shared tween with the previous node, @@ -3481,7 +4387,7 @@ function transition_tween(name, value) { name += ""; if (arguments.length < 2) { - var tween = get$1(this.node(), id).tween; + var tween = get(this.node(), id).tween; for (var i = 0, n = tween.length, t; i < n; ++i) { if ((t = tween[i]).name === name) { return t.value; @@ -3497,16 +4403,16 @@ function tweenValue(transition, name, value) { var id = transition._id; transition.each(function() { - var schedule = set$1(this, id); + var schedule = set(this, id); (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); }); return function(node) { - return get$1(node, id).value[name]; + return get(node, id).value[name]; }; } -function interpolate(a, b) { +function interpolate$1(a, b) { var c; return (typeof b === "number" ? interpolateNumber : b instanceof color ? interpolateRgb @@ -3514,19 +4420,19 @@ function interpolate(a, b) { : interpolateString)(a, b); } -function attrRemove$1(name) { +function attrRemove(name) { return function() { this.removeAttribute(name); }; } -function attrRemoveNS$1(fullname) { +function attrRemoveNS(fullname) { return function() { this.removeAttributeNS(fullname.space, fullname.local); }; } -function attrConstant$1(name, interpolate, value1) { +function attrConstant(name, interpolate, value1) { var string00, string1 = value1 + "", interpolate0; @@ -3538,7 +4444,7 @@ function attrConstant$1(name, interpolate, value1) { }; } -function attrConstantNS$1(fullname, interpolate, value1) { +function attrConstantNS(fullname, interpolate, value1) { var string00, string1 = value1 + "", interpolate0; @@ -3550,7 +4456,7 @@ function attrConstantNS$1(fullname, interpolate, value1) { }; } -function attrFunction$1(name, interpolate, value) { +function attrFunction(name, interpolate, value) { var string00, string10, interpolate0; @@ -3565,7 +4471,7 @@ function attrFunction$1(name, interpolate, value) { }; } -function attrFunctionNS$1(fullname, interpolate, value) { +function attrFunctionNS(fullname, interpolate, value) { var string00, string10, interpolate0; @@ -3581,11 +4487,11 @@ function attrFunctionNS$1(fullname, interpolate, value) { } function transition_attr(name, value) { - var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate; + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1; return this.attrTween(name, typeof value === "function" - ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) - : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) - : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value)); + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); } function attrInterpolate(name, i) { @@ -3650,18 +4556,18 @@ function transition_delay(value) { ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id, value)) - : get$1(this.node(), id).delay; + : get(this.node(), id).delay; } function durationFunction(id, value) { return function() { - set$1(this, id).duration = +value.apply(this, arguments); + set(this, id).duration = +value.apply(this, arguments); }; } function durationConstant(id, value) { return value = +value, function() { - set$1(this, id).duration = value; + set(this, id).duration = value; }; } @@ -3672,13 +4578,13 @@ function transition_duration(value) { ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id, value)) - : get$1(this.node(), id).duration; + : get(this.node(), id).duration; } function easeConstant(id, value) { if (typeof value !== "function") throw new Error; return function() { - set$1(this, id).ease = value; + set(this, id).ease = value; }; } @@ -3687,7 +4593,20 @@ function transition_ease(value) { return arguments.length ? this.each(easeConstant(id, value)) - : get$1(this.node(), id).ease; + : get(this.node(), id).ease; +} + +function easeVarying(id, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error; + set(this, id).ease = v; + }; +} + +function transition_easeVarying(value) { + if (typeof value !== "function") throw new Error; + return this.each(easeVarying(this._id, value)); } function transition_filter(match) { @@ -3731,7 +4650,7 @@ function start(name) { } function onFunction(id, name, listener) { - var on0, on1, sit = start(name) ? init : set$1; + var on0, on1, sit = start(name) ? init : set; return function() { var schedule = sit(this, id), on = schedule.on; @@ -3749,7 +4668,7 @@ function transition_on(name, listener) { var id = this._id; return arguments.length < 2 - ? get$1(this.node(), id).on.on(name) + ? get(this.node(), id).on.on(name) : this.each(onFunction(id, name, listener)); } @@ -3776,7 +4695,7 @@ function transition_select(select) { if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { if ("__data__" in node) subnode.__data__ = node.__data__; subgroup[i] = subnode; - schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)); + schedule(subgroup[i], name, id, i, subgroup, get(node, id)); } } } @@ -3793,7 +4712,7 @@ function transition_selectAll(select) { for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { if (node = group[i]) { - for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { if (child = children[k]) { schedule(child, name, id, k, children, inherit); } @@ -3807,10 +4726,10 @@ function transition_selectAll(select) { return new Transition(subgroups, parents, name, id); } -var Selection$1 = selection.prototype.constructor; +var Selection = selection.prototype.constructor; function transition_selection() { - return new Selection$1(this._groups, this._parents); + return new Selection(this._groups, this._parents); } function styleNull(name, interpolate) { @@ -3826,13 +4745,13 @@ function styleNull(name, interpolate) { }; } -function styleRemove$1(name) { +function styleRemove(name) { return function() { this.style.removeProperty(name); }; } -function styleConstant$1(name, interpolate, value1) { +function styleConstant(name, interpolate, value1) { var string00, string1 = value1 + "", interpolate0; @@ -3844,7 +4763,7 @@ function styleConstant$1(name, interpolate, value1) { }; } -function styleFunction$1(name, interpolate, value) { +function styleFunction(name, interpolate, value) { var string00, string10, interpolate0; @@ -3862,9 +4781,9 @@ function styleFunction$1(name, interpolate, value) { function styleMaybeRemove(id, name) { var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; return function() { - var schedule = set$1(this, id), + var schedule = set(this, id), on = schedule.on, - listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined; + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; // If this node shared a dispatch with the previous node, // just assign the updated shared dispatch and weโ€™re done! @@ -3876,15 +4795,15 @@ function styleMaybeRemove(id, name) { } function transition_style(name, value, priority) { - var i = (name += "") === "transform" ? interpolateTransformCss : interpolate; + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1; return value == null ? this .styleTween(name, styleNull(name, i)) - .on("end.style." + name, styleRemove$1(name)) + .on("end.style." + name, styleRemove(name)) : typeof value === "function" ? this - .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value))) + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) .each(styleMaybeRemove(this._id, name)) : this - .styleTween(name, styleConstant$1(name, i, value), priority) + .styleTween(name, styleConstant(name, i, value), priority) .on("end.style." + name, null); } @@ -3913,13 +4832,13 @@ function transition_styleTween(name, value, priority) { return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); } -function textConstant$1(value) { +function textConstant(value) { return function() { this.textContent = value; }; } -function textFunction$1(value) { +function textFunction(value) { return function() { var value1 = value(this); this.textContent = value1 == null ? "" : value1; @@ -3928,8 +4847,8 @@ function textFunction$1(value) { function transition_text(value) { return this.tween("text", typeof value === "function" - ? textFunction$1(tweenValue(this, "text", value)) - : textConstant$1(value == null ? "" : value + "")); + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); } function textInterpolate(i) { @@ -3965,7 +4884,7 @@ function transition_transition() { for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { if (node = group[i]) { - var inherit = get$1(node, id0); + var inherit = get(node, id0); schedule(node, name, id1, i, group, { time: inherit.time + inherit.delay + inherit.duration, delay: 0, @@ -3986,7 +4905,7 @@ function transition_end() { end = {value: function() { if (--size === 0) resolve(); }}; that.each(function() { - var schedule = set$1(this, id), + var schedule = set(this, id), on = schedule.on; // If this node shared a dispatch with the previous node, @@ -4001,6 +4920,9 @@ function transition_end() { schedule.on = on1; }); + + // The selection was empty, resolve end immediately + if (size === 0) resolve(); }); } @@ -4027,6 +4949,8 @@ Transition.prototype = transition.prototype = { constructor: Transition, select: transition_select, selectAll: transition_selectAll, + selectChild: selection_prototype.selectChild, + selectChildren: selection_prototype.selectChildren, filter: transition_filter, merge: transition_merge, selection: transition_selection, @@ -4049,12 +4973,12 @@ Transition.prototype = transition.prototype = { delay: transition_delay, duration: transition_duration, ease: transition_ease, - end: transition_end + easeVarying: transition_easeVarying, + end: transition_end, + [Symbol.iterator]: selection_prototype[Symbol.iterator] }; -function linear$1(t) { - return +t; -} +const linear$1 = t => +t; function quadIn(t) { return t * t; @@ -4080,7 +5004,7 @@ function cubicInOut(t) { return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; } -var exponent = 3; +var exponent$1 = 3; var polyIn = (function custom(e) { e = +e; @@ -4092,7 +5016,7 @@ var polyIn = (function custom(e) { polyIn.exponent = custom; return polyIn; -})(exponent); +})(exponent$1); var polyOut = (function custom(e) { e = +e; @@ -4104,7 +5028,7 @@ var polyOut = (function custom(e) { polyOut.exponent = custom; return polyOut; -})(exponent); +})(exponent$1); var polyInOut = (function custom(e) { e = +e; @@ -4116,33 +5040,38 @@ var polyInOut = (function custom(e) { polyInOut.exponent = custom; return polyInOut; -})(exponent); +})(exponent$1); -var pi = Math.PI, - halfPi = pi / 2; +var pi$4 = Math.PI, + halfPi$3 = pi$4 / 2; function sinIn(t) { - return 1 - Math.cos(t * halfPi); + return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi$3); } function sinOut(t) { - return Math.sin(t * halfPi); + return Math.sin(t * halfPi$3); } function sinInOut(t) { - return (1 - Math.cos(pi * t)) / 2; + return (1 - Math.cos(pi$4 * t)) / 2; +} + +// tpmt is two power minus ten times t scaled to [0,1] +function tpmt(x) { + return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494; } function expIn(t) { - return Math.pow(2, 10 * t - 10); + return tpmt(1 - +t); } function expOut(t) { - return 1 - Math.pow(2, -10 * t); + return 1 - tpmt(t); } function expInOut(t) { - return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; + return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2; } function circleIn(t) { @@ -4186,7 +5115,7 @@ var backIn = (function custom(s) { s = +s; function backIn(t) { - return t * t * ((s + 1) * t - s); + return (t = +t) * t * (s * (t - 1) + t); } backIn.overshoot = custom; @@ -4198,7 +5127,7 @@ var backOut = (function custom(s) { s = +s; function backOut(t) { - return --t * t * ((s + 1) * t + s) + 1; + return --t * t * ((t + 1) * s + t) + 1; } backOut.overshoot = custom; @@ -4218,46 +5147,46 @@ var backInOut = (function custom(s) { return backInOut; })(overshoot); -var tau = 2 * Math.PI, +var tau$5 = 2 * Math.PI, amplitude = 1, period = 0.3; var elasticIn = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau$5); function elasticIn(t) { - return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + return a * tpmt(-(--t)) * Math.sin((s - t) / p); } - elasticIn.amplitude = function(a) { return custom(a, p * tau); }; + elasticIn.amplitude = function(a) { return custom(a, p * tau$5); }; elasticIn.period = function(p) { return custom(a, p); }; return elasticIn; })(amplitude, period); var elasticOut = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau$5); function elasticOut(t) { - return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); } - elasticOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticOut.amplitude = function(a) { return custom(a, p * tau$5); }; elasticOut.period = function(p) { return custom(a, p); }; return elasticOut; })(amplitude, period); var elasticInOut = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau$5); function elasticInOut(t) { return ((t = t * 2 - 1) < 0 - ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) - : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + ? a * tpmt(-t) * Math.sin((s - t) / p) + : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; } - elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticInOut.amplitude = function(a) { return custom(a, p * tau$5); }; elasticInOut.period = function(p) { return custom(a, p); }; return elasticInOut; @@ -4274,7 +5203,7 @@ function inherit(node, id) { var timing; while (!(timing = node.__transition) || !(timing = timing[id])) { if (!(node = node.parentNode)) { - return defaultTiming.time = now(), defaultTiming; + throw new Error(`transition ${id} not found`); } } return timing; @@ -4304,7 +5233,7 @@ function selection_transition(name) { selection.prototype.interrupt = selection_interrupt; selection.prototype.transition = selection_transition; -var root$1 = [null]; +var root = [null]; function active(node, name) { var schedules = node.__transition, @@ -4315,7 +5244,7 @@ function active(node, name) { name = name == null ? null : name + ""; for (i in schedules) { if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { - return new Transition([[node]], root$1, name, +i); + return new Transition([[node]], root, name, +i); } } } @@ -4323,25 +5252,32 @@ function active(node, name) { return null; } -function constant$4(x) { - return function() { - return x; - }; -} - -function BrushEvent(target, type, selection) { - this.target = target; - this.type = type; - this.selection = selection; +var constant$7 = x => () => x; + +function BrushEvent(type, { + sourceEvent, + target, + selection, + mode, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + selection: {value: selection, enumerable: true, configurable: true}, + mode: {value: mode, enumerable: true, configurable: true}, + _: {value: dispatch} + }); } -function nopropagation$1() { - exports.event.stopImmediatePropagation(); +function nopropagation$1(event) { + event.stopImmediatePropagation(); } -function noevent$1() { - exports.event.preventDefault(); - exports.event.stopImmediatePropagation(); +function noevent$1(event) { + event.preventDefault(); + event.stopImmediatePropagation(); } var MODE_DRAG = {name: "drag"}, @@ -4349,6 +5285,8 @@ var MODE_DRAG = {name: "drag"}, MODE_HANDLE = {name: "handle"}, MODE_CENTER = {name: "center"}; +const {abs: abs$3, max: max$2, min: min$1} = Math; + function number1(e) { return [+e[0], +e[1]]; } @@ -4357,12 +5295,6 @@ function number2(e) { return [number1(e[0]), number1(e[1])]; } -function toucher(identifier) { - return function(target) { - return touch(target, exports.event.touches, identifier); - }; -} - var X = { name: "x", handles: ["w", "e"].map(type), @@ -4446,11 +5378,11 @@ function type(t) { } // Ignore right-click, since that should open the context menu. -function defaultFilter$1() { - return !exports.event.ctrlKey && !exports.event.button; +function defaultFilter$1(event) { + return !event.ctrlKey && !event.button; } -function defaultExtent() { +function defaultExtent$1() { var svg = this.ownerSVGElement || this; if (svg.hasAttribute("viewBox")) { svg = svg.viewBox.baseVal; @@ -4464,12 +5396,12 @@ function defaultTouchable$1() { } // Like d3.local, but with the name โ€œ__brushโ€ rather than auto-generated. -function local$1(node) { +function local(node) { while (!node.__brush) if (!(node = node.parentNode)) return; return node.__brush; } -function empty$1(extent) { +function empty(extent) { return extent[0][0] === extent[1][0] || extent[0][1] === extent[1][1]; } @@ -4492,7 +5424,7 @@ function brush() { } function brush$1(dim) { - var extent = defaultExtent, + var extent = defaultExtent$1, filter = defaultFilter$1, touchable = defaultTouchable$1, keys = true, @@ -4512,7 +5444,7 @@ function brush$1(dim) { .attr("cursor", cursors.overlay) .merge(overlay) .each(function() { - var extent = local$1(this).extent; + var extent = local(this).extent; select(this) .attr("x", extent[0][0]) .attr("y", extent[0][1]) @@ -4552,18 +5484,18 @@ function brush$1(dim) { .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); } - brush.move = function(group, selection) { - if (group.selection) { + brush.move = function(group, selection, event) { + if (group.tween) { group - .on("start.brush", function() { emitter(this, arguments).beforestart().start(); }) - .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); }) + .on("start.brush", function(event) { emitter(this, arguments).beforestart().start(event); }) + .on("interrupt.brush end.brush", function(event) { emitter(this, arguments).end(event); }) .tween("brush", function() { var that = this, state = that.__brush, emit = emitter(that, arguments), selection0 = state.selection, selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), - i = interpolateValue(selection0, selection1); + i = interpolate$2(selection0, selection1); function tween(t) { state.selection = t === 1 && selection1 === null ? null : i(t); @@ -4585,18 +5517,18 @@ function brush$1(dim) { interrupt(that); state.selection = selection1 === null ? null : selection1; redraw.call(that); - emit.start().brush().end(); + emit.start(event).brush(event).end(event); }); } }; - brush.clear = function(group) { - brush.move(group, null); + brush.clear = function(group, event) { + brush.move(group, null, event); }; function redraw() { var group = select(this), - selection = local$1(this).selection; + selection = local(this).selection; if (selection) { group.selectAll(".selection") @@ -4625,14 +5557,16 @@ function brush$1(dim) { } function emitter(that, args, clean) { - return (!clean && that.__brush.emitter) || new Emitter(that, args); + var emit = that.__brush.emitter; + return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean); } - function Emitter(that, args) { + function Emitter(that, args, clean) { this.that = that; this.args = args; this.state = that.__brush; this.active = 0; + this.clean = clean; } Emitter.prototype = { @@ -4640,34 +5574,46 @@ function brush$1(dim) { if (++this.active === 1) this.state.emitter = this, this.starting = true; return this; }, - start: function() { - if (this.starting) this.starting = false, this.emit("start"); - else this.emit("brush"); + start: function(event, mode) { + if (this.starting) this.starting = false, this.emit("start", event, mode); + else this.emit("brush", event); return this; }, - brush: function() { - this.emit("brush"); + brush: function(event, mode) { + this.emit("brush", event, mode); return this; }, - end: function() { - if (--this.active === 0) delete this.state.emitter, this.emit("end"); + end: function(event, mode) { + if (--this.active === 0) delete this.state.emitter, this.emit("end", event, mode); return this; }, - emit: function(type) { - customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + emit: function(type, event, mode) { + var d = select(this.that).datum(); + listeners.call( + type, + this.that, + new BrushEvent(type, { + sourceEvent: event, + target: brush, + selection: dim.output(this.state.selection), + mode, + dispatch: listeners + }), + d + ); } }; - function started() { - if (touchending && !exports.event.touches) return; + function started(event) { + if (touchending && !event.touches) return; if (!filter.apply(this, arguments)) return; var that = this, - type = exports.event.target.__data__.type, - mode = (keys && exports.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && exports.event.altKey ? MODE_CENTER : MODE_HANDLE), + type = event.target.__data__.type, + mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE), signX = dim === Y ? null : signsX[type], signY = dim === X ? null : signsY[type], - state = local$1(that), + state = local(that), extent = state.extent, selection = state.selection, W = extent[0][0], w0, w1, @@ -4677,20 +5623,31 @@ function brush$1(dim) { dx = 0, dy = 0, moving, - shifting = signX && signY && keys && exports.event.shiftKey, + shifting = signX && signY && keys && event.shiftKey, lockX, lockY, - pointer = exports.event.touches ? toucher(exports.event.changedTouches[0].identifier) : mouse, - point0 = pointer(that), - point = point0, - emit = emitter(that, arguments, true).beforestart(); + points = Array.from(event.touches || [event], t => { + const i = t.identifier; + t = pointer(t, that); + t.point0 = t.slice(); + t.identifier = i; + return t; + }); + + interrupt(that); + var emit = emitter(that, arguments, true).beforestart(); if (type === "overlay") { if (selection) moving = true; - state.selection = selection = [ - [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], - [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] - ]; + const pts = [points[0], points[1] || points[0]]; + state.selection = selection = [[ + w0 = dim === Y ? W : min$1(pts[0][0], pts[1][0]), + n0 = dim === X ? N : min$1(pts[0][1], pts[1][1]) + ], [ + e0 = dim === Y ? E : max$2(pts[0][0], pts[1][0]), + s0 = dim === X ? S : max$2(pts[0][1], pts[1][1]) + ]]; + if (points.length > 1) move(event); } else { w0 = selection[0][0]; n0 = selection[0][1]; @@ -4709,38 +5666,44 @@ function brush$1(dim) { var overlay = group.selectAll(".overlay") .attr("cursor", cursors[type]); - if (exports.event.touches) { + if (event.touches) { emit.moved = moved; emit.ended = ended; } else { - var view = select(exports.event.view) + var view = select(event.view) .on("mousemove.brush", moved, true) .on("mouseup.brush", ended, true); if (keys) view .on("keydown.brush", keydowned, true) .on("keyup.brush", keyupped, true); - dragDisable(exports.event.view); + dragDisable(event.view); } - nopropagation$1(); - interrupt(that); redraw.call(that); - emit.start(); + emit.start(event, mode.name); - function moved() { - var point1 = pointer(that); - if (shifting && !lockX && !lockY) { - if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; - else lockX = true; + function moved(event) { + for (const p of event.changedTouches || [event]) { + for (const d of points) + if (d.identifier === p.identifier) d.cur = pointer(p, that); + } + if (shifting && !lockX && !lockY && points.length === 1) { + const point = points[0]; + if (abs$3(point.cur[0] - point[0]) > abs$3(point.cur[1] - point[1])) + lockY = true; + else + lockX = true; } - point = point1; + for (const point of points) + if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1]; moving = true; - noevent$1(); - move(); + noevent$1(event); + move(event); } - function move() { + function move(event) { + const point = points[0], point0 = point.point0; var t; dx = point[0] - point0[0]; @@ -4749,20 +5712,25 @@ function brush$1(dim) { switch (mode) { case MODE_SPACE: case MODE_DRAG: { - if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; - if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + if (signX) dx = max$2(W - w0, min$1(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = max$2(N - n0, min$1(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; break; } case MODE_HANDLE: { - if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; - else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; - if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; - else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + if (points[1]) { + if (signX) w1 = max$2(W, min$1(E, points[0][0])), e1 = max$2(W, min$1(E, points[1][0])), signX = 1; + if (signY) n1 = max$2(N, min$1(S, points[0][1])), s1 = max$2(N, min$1(S, points[1][1])), signY = 1; + } else { + if (signX < 0) dx = max$2(W - w0, min$1(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = max$2(W - e0, min$1(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = max$2(N - n0, min$1(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = max$2(N - s0, min$1(S - s0, dy)), n1 = n0, s1 = s0 + dy; + } break; } case MODE_CENTER: { - if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); - if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + if (signX) w1 = max$2(W, min$1(E, w0 - dx * signX)), e1 = max$2(W, min$1(E, e0 + dx * signX)); + if (signY) n1 = max$2(N, min$1(S, n0 - dy * signY)), s1 = max$2(N, min$1(S, s0 + dy * signY)); break; } } @@ -4791,29 +5759,29 @@ function brush$1(dim) { || selection[1][1] !== s1) { state.selection = [[w1, n1], [e1, s1]]; redraw.call(that); - emit.brush(); + emit.brush(event, mode.name); } } - function ended() { - nopropagation$1(); - if (exports.event.touches) { - if (exports.event.touches.length) return; + function ended(event) { + nopropagation$1(event); + if (event.touches) { + if (event.touches.length) return; if (touchending) clearTimeout(touchending); touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! } else { - yesdrag(exports.event.view, moving); + yesdrag(event.view, moving); view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); } group.attr("pointer-events", "all"); overlay.attr("cursor", cursors.overlay); if (state.selection) selection = state.selection; // May be set by brush.move (on start)! - if (empty$1(selection)) state.selection = null, redraw.call(that); - emit.end(); + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(event, mode.name); } - function keydowned() { - switch (exports.event.keyCode) { + function keydowned(event) { + switch (event.keyCode) { case 16: { // SHIFT shifting = signX && signY; break; @@ -4823,7 +5791,7 @@ function brush$1(dim) { if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; mode = MODE_CENTER; - move(); + move(event); } break; } @@ -4833,21 +5801,21 @@ function brush$1(dim) { if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; mode = MODE_SPACE; overlay.attr("cursor", cursors.selection); - move(); + move(event); } break; } default: return; } - noevent$1(); + noevent$1(event); } - function keyupped() { - switch (exports.event.keyCode) { + function keyupped(event) { + switch (event.keyCode) { case 16: { // SHIFT if (shifting) { lockX = lockY = shifting = false; - move(); + move(event); } break; } @@ -4856,13 +5824,13 @@ function brush$1(dim) { if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; mode = MODE_HANDLE; - move(); + move(event); } break; } case 32: { // SPACE if (mode === MODE_SPACE) { - if (exports.event.altKey) { + if (event.altKey) { if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; mode = MODE_CENTER; @@ -4872,22 +5840,22 @@ function brush$1(dim) { mode = MODE_HANDLE; } overlay.attr("cursor", cursors[type]); - move(); + move(event); } break; } default: return; } - noevent$1(); + noevent$1(event); } } - function touchmoved() { - emitter(this, arguments).moved(); + function touchmoved(event) { + emitter(this, arguments).moved(event); } - function touchended() { - emitter(this, arguments).ended(); + function touchended(event) { + emitter(this, arguments).ended(event); } function initialize() { @@ -4898,15 +5866,15 @@ function brush$1(dim) { } brush.extent = function(_) { - return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4(number2(_)), brush) : extent; + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$7(number2(_)), brush) : extent; }; brush.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter; + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$7(!!_), brush) : filter; }; brush.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$4(!!_), brush) : touchable; + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$7(!!_), brush) : touchable; }; brush.handleSize = function(_) { @@ -4925,12 +5893,18 @@ function brush$1(dim) { return brush; } -var cos = Math.cos; -var sin = Math.sin; -var pi$1 = Math.PI; -var halfPi$1 = pi$1 / 2; -var tau$1 = pi$1 * 2; +var abs$2 = Math.abs; +var cos$2 = Math.cos; +var sin$2 = Math.sin; +var pi$3 = Math.PI; +var halfPi$2 = pi$3 / 2; +var tau$4 = pi$3 * 2; var max$1 = Math.max; +var epsilon$5 = 1e-12; + +function range$1(i, j) { + return Array.from({length: j - i}, (_, k) => i + k); +} function compareValue(compare) { return function(a, b) { @@ -4942,6 +5916,18 @@ function compareValue(compare) { } function chord() { + return chord$1(false, false); +} + +function chordTranspose() { + return chord$1(false, true); +} + +function chordDirected() { + return chord$1(true, false); +} + +function chord$1(directed, transpose) { var padAngle = 0, sortGroups = null, sortSubgroups = null, @@ -4949,86 +5935,72 @@ function chord() { function chord(matrix) { var n = matrix.length, - groupSums = [], - groupIndex = sequence(n), - subgroupIndex = [], - chords = [], - groups = chords.groups = new Array(n), - subgroups = new Array(n * n), - k, - x, - x0, - dx, - i, - j; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(sequence(n)); - k += x; - } - - // Sort groupsโ€ฆ - if (sortGroups) groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - - // Sort subgroupsโ€ฆ - if (sortSubgroups) subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified? - // TODO Allow padding to be specified as percentage? - k = max$1(0, tau$1 - padAngle * n) / k; - dx = k ? padAngle : tau$1 / n; - - // Compute the start and end angle for each group and subgroup. - // Note: Opera has a bug reordering object literal properties! - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[di][j], - v = matrix[di][dj], - a0 = x, - a1 = x += v * k; - subgroups[dj * n + di] = { - index: di, - subindex: dj, - startAngle: a0, - endAngle: a1, - value: v - }; - } - groups[di] = { - index: di, - startAngle: x0, - endAngle: x, - value: groupSums[di] - }; - x += dx; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[j * n + i], - target = subgroups[i * n + j]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); + groupSums = new Array(n), + groupIndex = range$1(0, n), + chords = new Array(n * n), + groups = new Array(n), + k = 0, dx; + + matrix = Float64Array.from({length: n * n}, transpose + ? (_, i) => matrix[i % n][i / n | 0] + : (_, i) => matrix[i / n | 0][i % n]); + + // Compute the scaling factor from value to angle in [0, 2pi]. + for (let i = 0; i < n; ++i) { + let x = 0; + for (let j = 0; j < n; ++j) x += matrix[i * n + j] + directed * matrix[j * n + i]; + k += groupSums[i] = x; + } + k = max$1(0, tau$4 - padAngle * n) / k; + dx = k ? padAngle : tau$4 / n; + + // Compute the angles for each group and constituent chord. + { + let x = 0; + if (sortGroups) groupIndex.sort((a, b) => sortGroups(groupSums[a], groupSums[b])); + for (const i of groupIndex) { + const x0 = x; + if (directed) { + const subgroupIndex = range$1(~n + 1, n).filter(j => j < 0 ? matrix[~j * n + i] : matrix[i * n + j]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(a < 0 ? -matrix[~a * n + i] : matrix[i * n + a], b < 0 ? -matrix[~b * n + i] : matrix[i * n + b])); + for (const j of subgroupIndex) { + if (j < 0) { + const chord = chords[~j * n + i] || (chords[~j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[~j * n + i] * k, value: matrix[~j * n + i]}; + } else { + const chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } else { + const subgroupIndex = range$1(0, n).filter(j => matrix[i * n + j] || matrix[j * n + i]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(matrix[i * n + a], matrix[i * n + b])); + for (const j of subgroupIndex) { + let chord; + if (i < j) { + chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } else { + chord = chords[j * n + i] || (chords[j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + if (i === j) chord.source = chord.target; + } + if (chord.source && chord.target && chord.source.value < chord.target.value) { + const source = chord.source; + chord.source = chord.target; + chord.target = source; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; } + x += dx; } } + // Remove empty chords. + chords = Object.values(chords); + chords.groups = groups; return sortChords ? chords.sort(sortChords) : chords; } @@ -5051,31 +6023,23 @@ function chord() { return chord; } -var slice$2 = Array.prototype.slice; - -function constant$5(x) { - return function() { - return x; - }; -} - -var pi$2 = Math.PI, - tau$2 = 2 * pi$2, - epsilon$1 = 1e-6, - tauEpsilon = tau$2 - epsilon$1; +const pi$2 = Math.PI, + tau$3 = 2 * pi$2, + epsilon$4 = 1e-6, + tauEpsilon = tau$3 - epsilon$4; -function Path() { +function Path$1() { this._x0 = this._y0 = // start of current subpath this._x1 = this._y1 = null; // end of current subpath this._ = ""; } function path() { - return new Path; + return new Path$1; } -Path.prototype = path.prototype = { - constructor: Path, +Path$1.prototype = path.prototype = { + constructor: Path$1, moveTo: function(x, y) { this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); }, @@ -5113,12 +6077,12 @@ Path.prototype = path.prototype = { } // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. - else if (!(l01_2 > epsilon$1)); + else if (!(l01_2 > epsilon$4)); // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? // Equivalently, is (x1,y1) coincident with (x2,y2)? // Or, is the radius zero? Line to (x1,y1). - else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) { + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$4) || !r) { this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); } @@ -5135,7 +6099,7 @@ Path.prototype = path.prototype = { t21 = l / l21; // If the start tangent is not coincident with (x0,y0), line to. - if (Math.abs(t01 - 1) > epsilon$1) { + if (Math.abs(t01 - 1) > epsilon$4) { this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); } @@ -5160,7 +6124,7 @@ Path.prototype = path.prototype = { } // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). - else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) { + else if (Math.abs(this._x1 - x0) > epsilon$4 || Math.abs(this._y1 - y0) > epsilon$4) { this._ += "L" + x0 + "," + y0; } @@ -5168,7 +6132,7 @@ Path.prototype = path.prototype = { if (!r) return; // Does the angle go the wrong way? Flip the direction. - if (da < 0) da = da % tau$2 + tau$2; + if (da < 0) da = da % tau$3 + tau$3; // Is this a complete circle? Draw two arcs to complete the circle. if (da > tauEpsilon) { @@ -5176,7 +6140,7 @@ Path.prototype = path.prototype = { } // Is this arc non-empty? Draw an arc! - else if (da > epsilon$1) { + else if (da > epsilon$4) { this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); } }, @@ -5188,7 +6152,15 @@ Path.prototype = path.prototype = { } }; -function defaultSource(d) { +var slice$2 = Array.prototype.slice; + +function constant$6(x) { + return function() { + return x; + }; +} + +function defaultSource$1(d) { return d.source; } @@ -5196,7 +6168,7 @@ function defaultTarget(d) { return d.target; } -function defaultRadius(d) { +function defaultRadius$1(d) { return d.radius; } @@ -5208,52 +6180,91 @@ function defaultEndAngle(d) { return d.endAngle; } -function ribbon() { - var source = defaultSource, +function defaultPadAngle() { + return 0; +} + +function defaultArrowheadRadius() { + return 10; +} + +function ribbon(headRadius) { + var source = defaultSource$1, target = defaultTarget, - radius = defaultRadius, + sourceRadius = defaultRadius$1, + targetRadius = defaultRadius$1, startAngle = defaultStartAngle, endAngle = defaultEndAngle, + padAngle = defaultPadAngle, context = null; function ribbon() { var buffer, + s = source.apply(this, arguments), + t = target.apply(this, arguments), + ap = padAngle.apply(this, arguments) / 2, argv = slice$2.call(arguments), - s = source.apply(this, argv), - t = target.apply(this, argv), - sr = +radius.apply(this, (argv[0] = s, argv)), - sa0 = startAngle.apply(this, argv) - halfPi$1, - sa1 = endAngle.apply(this, argv) - halfPi$1, - sx0 = sr * cos(sa0), - sy0 = sr * sin(sa0), - tr = +radius.apply(this, (argv[0] = t, argv)), - ta0 = startAngle.apply(this, argv) - halfPi$1, - ta1 = endAngle.apply(this, argv) - halfPi$1; + sr = +sourceRadius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi$2, + sa1 = endAngle.apply(this, argv) - halfPi$2, + tr = +targetRadius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi$2, + ta1 = endAngle.apply(this, argv) - halfPi$2; if (!context) context = buffer = path(); - context.moveTo(sx0, sy0); + if (ap > epsilon$5) { + if (abs$2(sa1 - sa0) > ap * 2 + epsilon$5) sa1 > sa0 ? (sa0 += ap, sa1 -= ap) : (sa0 -= ap, sa1 += ap); + else sa0 = sa1 = (sa0 + sa1) / 2; + if (abs$2(ta1 - ta0) > ap * 2 + epsilon$5) ta1 > ta0 ? (ta0 += ap, ta1 -= ap) : (ta0 -= ap, ta1 += ap); + else ta0 = ta1 = (ta0 + ta1) / 2; + } + + context.moveTo(sr * cos$2(sa0), sr * sin$2(sa0)); context.arc(0, 0, sr, sa0, sa1); - if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? - context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); - context.arc(0, 0, tr, ta0, ta1); + if (sa0 !== ta0 || sa1 !== ta1) { + if (headRadius) { + var hr = +headRadius.apply(this, arguments), tr2 = tr - hr, ta2 = (ta0 + ta1) / 2; + context.quadraticCurveTo(0, 0, tr2 * cos$2(ta0), tr2 * sin$2(ta0)); + context.lineTo(tr * cos$2(ta2), tr * sin$2(ta2)); + context.lineTo(tr2 * cos$2(ta1), tr2 * sin$2(ta1)); + } else { + context.quadraticCurveTo(0, 0, tr * cos$2(ta0), tr * sin$2(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } } - context.quadraticCurveTo(0, 0, sx0, sy0); + context.quadraticCurveTo(0, 0, sr * cos$2(sa0), sr * sin$2(sa0)); context.closePath(); if (buffer) return context = null, buffer + "" || null; } + if (headRadius) ribbon.headRadius = function(_) { + return arguments.length ? (headRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : headRadius; + }; + ribbon.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius; + return arguments.length ? (sourceRadius = targetRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : sourceRadius; + }; + + ribbon.sourceRadius = function(_) { + return arguments.length ? (sourceRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : sourceRadius; + }; + + ribbon.targetRadius = function(_) { + return arguments.length ? (targetRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : targetRadius; }; ribbon.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle; + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : startAngle; }; ribbon.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle; + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : endAngle; + }; + + ribbon.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : padAngle; }; ribbon.source = function(_) { @@ -5271,247 +6282,51 @@ function ribbon() { return ribbon; } -var prefix = "$"; - -function Map() {} +function ribbon$1() { + return ribbon(); +} -Map.prototype = map$1.prototype = { - constructor: Map, - has: function(key) { - return (prefix + key) in this; - }, - get: function(key) { - return this[prefix + key]; - }, - set: function(key, value) { - this[prefix + key] = value; - return this; - }, - remove: function(key) { - var property = prefix + key; - return property in this && delete this[property]; - }, - clear: function() { - for (var property in this) if (property[0] === prefix) delete this[property]; - }, - keys: function() { - var keys = []; - for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); - return keys; - }, - values: function() { - var values = []; - for (var property in this) if (property[0] === prefix) values.push(this[property]); - return values; - }, - entries: function() { - var entries = []; - for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); - return entries; - }, - size: function() { - var size = 0; - for (var property in this) if (property[0] === prefix) ++size; - return size; - }, - empty: function() { - for (var property in this) if (property[0] === prefix) return false; - return true; - }, - each: function(f) { - for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); - } -}; +function ribbonArrow() { + return ribbon(defaultArrowheadRadius); +} -function map$1(object, f) { - var map = new Map; +var array$2 = Array.prototype; - // Copy constructor. - if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); +var slice$1 = array$2.slice; - // Index array by numeric index or specified key function. - else if (Array.isArray(object)) { - var i = -1, - n = object.length, - o; +function ascending$1(a, b) { + return a - b; +} - if (f == null) while (++i < n) map.set(i, object[i]); - else while (++i < n) map.set(f(o = object[i], i, object), o); - } +function area$3(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; +} - // Convert object to map. - else if (object) for (var key in object) map.set(key, object[key]); +var constant$5 = x => () => x; - return map; +function contains$2(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; } -function nest() { - var keys = [], - sortKeys = [], - sortValues, - rollup, - nest; +function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; +} - function apply(array, depth, createResult, setResult) { - if (depth >= keys.length) { - if (sortValues != null) array.sort(sortValues); - return rollup != null ? rollup(array) : array; - } +function segmentContains(a, b, c) { + var i; return collinear$1(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); +} - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - value, - valuesByKey = map$1(), - values, - result = createResult(); - - while (++i < n) { - if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { - values.push(value); - } else { - valuesByKey.set(keyValue, [value]); - } - } - - valuesByKey.each(function(values, key) { - setResult(result, key, apply(values, depth, createResult, setResult)); - }); - - return result; - } - - function entries(map, depth) { - if (++depth > keys.length) return map; - var array, sortKey = sortKeys[depth - 1]; - if (rollup != null && depth >= keys.length) array = map.entries(); - else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); - return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; - } - - return nest = { - object: function(array) { return apply(array, 0, createObject, setObject); }, - map: function(array) { return apply(array, 0, createMap, setMap); }, - entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, - key: function(d) { keys.push(d); return nest; }, - sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, - sortValues: function(order) { sortValues = order; return nest; }, - rollup: function(f) { rollup = f; return nest; } - }; -} - -function createObject() { - return {}; -} - -function setObject(object, key, value) { - object[key] = value; -} - -function createMap() { - return map$1(); -} - -function setMap(map, key, value) { - map.set(key, value); -} - -function Set() {} - -var proto = map$1.prototype; - -Set.prototype = set$2.prototype = { - constructor: Set, - has: proto.has, - add: function(value) { - value += ""; - this[prefix + value] = value; - return this; - }, - remove: proto.remove, - clear: proto.clear, - values: proto.keys, - size: proto.size, - empty: proto.empty, - each: proto.each -}; - -function set$2(object, f) { - var set = new Set; - - // Copy constructor. - if (object instanceof Set) object.each(function(value) { set.add(value); }); - - // Otherwise, assume itโ€™s an array. - else if (object) { - var i = -1, n = object.length; - if (f == null) while (++i < n) set.add(object[i]); - else while (++i < n) set.add(f(object[i], i, object)); - } - - return set; -} - -function keys(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -} - -function values(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -} - -function entries(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -} - -var array$2 = Array.prototype; - -var slice$3 = array$2.slice; - -function ascending$2(a, b) { - return a - b; -} - -function area(ring) { - var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; - while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; - return area; -} - -function constant$6(x) { - return function() { - return x; - }; -} - -function contains(ring, hole) { - var i = -1, n = hole.length, c; - while (++i < n) if (c = ringContains(ring, hole[i])) return c; - return 0; -} - -function ringContains(ring, point) { - var x = point[0], y = point[1], contains = -1; - for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { - var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; - if (segmentContains(pi, pj, point)) return 0; - if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; - } - return contains; -} - -function segmentContains(a, b, c) { - var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); -} - -function collinear(a, b, c) { +function collinear$1(a, b, c) { return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); } @@ -5519,7 +6334,7 @@ function within(p, q, r) { return p <= q && q <= r || r <= q && q <= p; } -function noop$1() {} +function noop$2() {} var cases = [ [], @@ -5540,7 +6355,7 @@ var cases = [ [] ]; -function contours() { +function Contours() { var dx = 1, dy = 1, threshold = thresholdSturges, @@ -5551,16 +6366,13 @@ function contours() { // Convert number of thresholds into uniform thresholds. if (!Array.isArray(tz)) { - var domain = extent(values), start = domain[0], stop = domain[1]; - tz = tickStep(start, stop, tz); - tz = sequence(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + const e = extent$1(values), ts = tickStep(e[0], e[1], tz); + tz = ticks(Math.floor(e[0] / ts) * ts, Math.floor(e[1] / ts - 1) * ts, tz); } else { - tz = tz.slice().sort(ascending$2); + tz = tz.slice().sort(ascending$1); } - return tz.map(function(value) { - return contour(values, value); - }); + return tz.map(value => contour(values, value)); } // Accumulate, smooth contour rings, assign holes to exterior rings. @@ -5571,13 +6383,13 @@ function contours() { isorings(values, value, function(ring) { smooth(ring, values, value); - if (area(ring) > 0) polygons.push([ring]); + if (area$3(ring) > 0) polygons.push([ring]); else holes.push(ring); }); holes.forEach(function(hole) { for (var i = 0, n = polygons.length, polygon; i < n; ++i) { - if (contains((polygon = polygons[i])[0], hole) !== -1) { + if (contains$2((polygon = polygons[i])[0], hole) !== -1) { polygon.push(hole); return; } @@ -5701,71 +6513,27 @@ function contours() { contours.size = function(_) { if (!arguments.length) return [dx, dy]; - var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); - if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size"); + var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]); + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); return dx = _0, dy = _1, contours; }; contours.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), contours) : threshold; + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$5(slice$1.call(_)) : constant$5(_), contours) : threshold; }; contours.smooth = function(_) { - return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours) : smooth === smoothLinear; + return arguments.length ? (smooth = _ ? smoothLinear : noop$2, contours) : smooth === smoothLinear; }; return contours; } -// TODO Optimize edge cases. -// TODO Optimize index calculation. -// TODO Optimize arguments. -function blurX(source, target, r) { - var n = source.width, - m = source.height, - w = (r << 1) + 1; - for (var j = 0; j < m; ++j) { - for (var i = 0, sr = 0; i < n + r; ++i) { - if (i < n) { - sr += source.data[i + j * n]; - } - if (i >= r) { - if (i >= w) { - sr -= source.data[i - w + j * n]; - } - target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); - } - } - } -} - -// TODO Optimize edge cases. -// TODO Optimize index calculation. -// TODO Optimize arguments. -function blurY(source, target, r) { - var n = source.width, - m = source.height, - w = (r << 1) + 1; - for (var i = 0; i < n; ++i) { - for (var j = 0, sr = 0; j < m + r; ++j) { - if (j < m) { - sr += source.data[i + j * n]; - } - if (j >= r) { - if (j >= w) { - sr -= source.data[i + (j - w) * n]; - } - target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); - } - } - } -} - -function defaultX(d) { +function defaultX$1(d) { return d[0]; } -function defaultY(d) { +function defaultY$1(d) { return d[1]; } @@ -5774,8 +6542,8 @@ function defaultWeight() { } function density() { - var x = defaultX, - y = defaultY, + var x = defaultX$1, + y = defaultY$1, weight = defaultWeight, dx = 960, dy = 500, @@ -5784,48 +6552,65 @@ function density() { o = r * 3, // grid offset, to pad for blur n = (dx + o * 2) >> k, // grid width m = (dy + o * 2) >> k, // grid height - threshold = constant$6(20); + threshold = constant$5(20); - function density(data) { - var values0 = new Float32Array(n * m), - values1 = new Float32Array(n * m); + function grid(data) { + var values = new Float32Array(n * m), + pow2k = Math.pow(2, -k), + i = -1; - data.forEach(function(d, i, data) { - var xi = (+x(d, i, data) + o) >> k, - yi = (+y(d, i, data) + o) >> k, + for (const d of data) { + var xi = (x(d, ++i, data) + o) * pow2k, + yi = (y(d, i, data) + o) * pow2k, wi = +weight(d, i, data); if (xi >= 0 && xi < n && yi >= 0 && yi < m) { - values0[xi + yi * n] += wi; + var x0 = Math.floor(xi), + y0 = Math.floor(yi), + xt = xi - x0 - 0.5, + yt = yi - y0 - 0.5; + values[x0 + y0 * n] += (1 - xt) * (1 - yt) * wi; + values[x0 + 1 + y0 * n] += xt * (1 - yt) * wi; + values[x0 + 1 + (y0 + 1) * n] += xt * yt * wi; + values[x0 + (y0 + 1) * n] += (1 - xt) * yt * wi; } - }); + } - // TODO Optimize. - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blur2({data: values, width: n, height: m}, r * pow2k); + return values; + } - var tz = threshold(values0); + function density(data) { + var values = grid(data), + tz = threshold(values), + pow4k = Math.pow(2, 2 * k); // Convert number of thresholds into uniform thresholds. if (!Array.isArray(tz)) { - var stop = max(values0); - tz = tickStep(0, stop, tz); - tz = sequence(0, Math.floor(stop / tz) * tz, tz); - tz.shift(); + tz = ticks(Number.MIN_VALUE, max$3(values) / pow4k, tz); } - return contours() - .thresholds(tz) + return Contours() .size([n, m]) - (values0) - .map(transform); - } + .thresholds(tz.map(d => d * pow4k)) + (values) + .map((c, i) => (c.value = +tz[i], transform(c))); + } + + density.contours = function(data) { + var values = grid(data), + contours = Contours().size([n, m]), + pow4k = Math.pow(2, 2 * k), + contour = value => { + value = +value; + var c = transform(contours.contour(values, value * pow4k)); + c.value = value; // preserve exact threshold value + return c; + }; + Object.defineProperty(contour, "max", {get: () => max$3(values) / pow4k}); + return contour; + }; function transform(geometry) { - geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. geometry.coordinates.forEach(transformPolygon); return geometry; } @@ -5852,21 +6637,21 @@ function density() { } density.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x; + return arguments.length ? (x = typeof _ === "function" ? _ : constant$5(+_), density) : x; }; density.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y; + return arguments.length ? (y = typeof _ === "function" ? _ : constant$5(+_), density) : y; }; density.weight = function(_) { - return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight; + return arguments.length ? (weight = typeof _ === "function" ? _ : constant$5(+_), density) : weight; }; density.size = function(_) { if (!arguments.length) return [dx, dy]; - var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); - if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size"); + var _0 = +_[0], _1 = +_[1]; + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); return dx = _0, dy = _1, resize(); }; @@ -5877,355 +6662,1720 @@ function density() { }; density.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), density) : threshold; + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$5(slice$1.call(_)) : constant$5(_), density) : threshold; }; density.bandwidth = function(_) { if (!arguments.length) return Math.sqrt(r * (r + 1)); if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); - return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + return r = (Math.sqrt(4 * _ * _ + 1) - 1) / 2, resize(); }; return density; } -var EOL = {}, - EOF = {}, - QUOTE = 34, - NEWLINE = 10, - RETURN = 13; +const epsilon$3 = 1.1102230246251565e-16; +const splitter = 134217729; +const resulterrbound = (3 + 8 * epsilon$3) * epsilon$3; + +// fast_expansion_sum_zeroelim routine from oritinal code +function sum$1(elen, e, flen, f, h) { + let Q, Qnew, hh, bvirt; + let enow = e[0]; + let fnow = f[0]; + let eindex = 0; + let findex = 0; + if ((fnow > enow) === (fnow > -enow)) { + Q = enow; + enow = e[++eindex]; + } else { + Q = fnow; + fnow = f[++findex]; + } + let hindex = 0; + if (eindex < elen && findex < flen) { + if ((fnow > enow) === (fnow > -enow)) { + Qnew = enow + Q; + hh = Q - (Qnew - enow); + enow = e[++eindex]; + } else { + Qnew = fnow + Q; + hh = Q - (Qnew - fnow); + fnow = f[++findex]; + } + Q = Qnew; + if (hh !== 0) { + h[hindex++] = hh; + } + while (eindex < elen && findex < flen) { + if ((fnow > enow) === (fnow > -enow)) { + Qnew = Q + enow; + bvirt = Qnew - Q; + hh = Q - (Qnew - bvirt) + (enow - bvirt); + enow = e[++eindex]; + } else { + Qnew = Q + fnow; + bvirt = Qnew - Q; + hh = Q - (Qnew - bvirt) + (fnow - bvirt); + fnow = f[++findex]; + } + Q = Qnew; + if (hh !== 0) { + h[hindex++] = hh; + } + } + } + while (eindex < elen) { + Qnew = Q + enow; + bvirt = Qnew - Q; + hh = Q - (Qnew - bvirt) + (enow - bvirt); + enow = e[++eindex]; + Q = Qnew; + if (hh !== 0) { + h[hindex++] = hh; + } + } + while (findex < flen) { + Qnew = Q + fnow; + bvirt = Qnew - Q; + hh = Q - (Qnew - bvirt) + (fnow - bvirt); + fnow = f[++findex]; + Q = Qnew; + if (hh !== 0) { + h[hindex++] = hh; + } + } + if (Q !== 0 || hindex === 0) { + h[hindex++] = Q; + } + return hindex; +} + +function estimate(elen, e) { + let Q = e[0]; + for (let i = 1; i < elen; i++) Q += e[i]; + return Q; +} + +function vec(n) { + return new Float64Array(n); +} + +const ccwerrboundA = (3 + 16 * epsilon$3) * epsilon$3; +const ccwerrboundB = (2 + 12 * epsilon$3) * epsilon$3; +const ccwerrboundC = (9 + 64 * epsilon$3) * epsilon$3 * epsilon$3; + +const B = vec(4); +const C1 = vec(8); +const C2 = vec(12); +const D = vec(16); +const u = vec(4); + +function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) { + let acxtail, acytail, bcxtail, bcytail; + let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3; + + const acx = ax - cx; + const bcx = bx - cx; + const acy = ay - cy; + const bcy = by - cy; + + s1 = acx * bcy; + c = splitter * acx; + ahi = c - (c - acx); + alo = acx - ahi; + c = splitter * bcy; + bhi = c - (c - bcy); + blo = bcy - bhi; + s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo); + t1 = acy * bcx; + c = splitter * acy; + ahi = c - (c - acy); + alo = acy - ahi; + c = splitter * bcx; + bhi = c - (c - bcx); + blo = bcx - bhi; + t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo); + _i = s0 - t0; + bvirt = s0 - _i; + B[0] = s0 - (_i + bvirt) + (bvirt - t0); + _j = s1 + _i; + bvirt = _j - s1; + _0 = s1 - (_j - bvirt) + (_i - bvirt); + _i = _0 - t1; + bvirt = _0 - _i; + B[1] = _0 - (_i + bvirt) + (bvirt - t1); + u3 = _j + _i; + bvirt = u3 - _j; + B[2] = _j - (u3 - bvirt) + (_i - bvirt); + B[3] = u3; + + let det = estimate(4, B); + let errbound = ccwerrboundB * detsum; + if (det >= errbound || -det >= errbound) { + return det; + } + + bvirt = ax - acx; + acxtail = ax - (acx + bvirt) + (bvirt - cx); + bvirt = bx - bcx; + bcxtail = bx - (bcx + bvirt) + (bvirt - cx); + bvirt = ay - acy; + acytail = ay - (acy + bvirt) + (bvirt - cy); + bvirt = by - bcy; + bcytail = by - (bcy + bvirt) + (bvirt - cy); + + if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) { + return det; + } + + errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det); + det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail); + if (det >= errbound || -det >= errbound) return det; + + s1 = acxtail * bcy; + c = splitter * acxtail; + ahi = c - (c - acxtail); + alo = acxtail - ahi; + c = splitter * bcy; + bhi = c - (c - bcy); + blo = bcy - bhi; + s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo); + t1 = acytail * bcx; + c = splitter * acytail; + ahi = c - (c - acytail); + alo = acytail - ahi; + c = splitter * bcx; + bhi = c - (c - bcx); + blo = bcx - bhi; + t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo); + _i = s0 - t0; + bvirt = s0 - _i; + u[0] = s0 - (_i + bvirt) + (bvirt - t0); + _j = s1 + _i; + bvirt = _j - s1; + _0 = s1 - (_j - bvirt) + (_i - bvirt); + _i = _0 - t1; + bvirt = _0 - _i; + u[1] = _0 - (_i + bvirt) + (bvirt - t1); + u3 = _j + _i; + bvirt = u3 - _j; + u[2] = _j - (u3 - bvirt) + (_i - bvirt); + u[3] = u3; + const C1len = sum$1(4, B, 4, u, C1); + + s1 = acx * bcytail; + c = splitter * acx; + ahi = c - (c - acx); + alo = acx - ahi; + c = splitter * bcytail; + bhi = c - (c - bcytail); + blo = bcytail - bhi; + s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo); + t1 = acy * bcxtail; + c = splitter * acy; + ahi = c - (c - acy); + alo = acy - ahi; + c = splitter * bcxtail; + bhi = c - (c - bcxtail); + blo = bcxtail - bhi; + t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo); + _i = s0 - t0; + bvirt = s0 - _i; + u[0] = s0 - (_i + bvirt) + (bvirt - t0); + _j = s1 + _i; + bvirt = _j - s1; + _0 = s1 - (_j - bvirt) + (_i - bvirt); + _i = _0 - t1; + bvirt = _0 - _i; + u[1] = _0 - (_i + bvirt) + (bvirt - t1); + u3 = _j + _i; + bvirt = u3 - _j; + u[2] = _j - (u3 - bvirt) + (_i - bvirt); + u[3] = u3; + const C2len = sum$1(C1len, C1, 4, u, C2); + + s1 = acxtail * bcytail; + c = splitter * acxtail; + ahi = c - (c - acxtail); + alo = acxtail - ahi; + c = splitter * bcytail; + bhi = c - (c - bcytail); + blo = bcytail - bhi; + s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo); + t1 = acytail * bcxtail; + c = splitter * acytail; + ahi = c - (c - acytail); + alo = acytail - ahi; + c = splitter * bcxtail; + bhi = c - (c - bcxtail); + blo = bcxtail - bhi; + t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo); + _i = s0 - t0; + bvirt = s0 - _i; + u[0] = s0 - (_i + bvirt) + (bvirt - t0); + _j = s1 + _i; + bvirt = _j - s1; + _0 = s1 - (_j - bvirt) + (_i - bvirt); + _i = _0 - t1; + bvirt = _0 - _i; + u[1] = _0 - (_i + bvirt) + (bvirt - t1); + u3 = _j + _i; + bvirt = u3 - _j; + u[2] = _j - (u3 - bvirt) + (_i - bvirt); + u[3] = u3; + const Dlen = sum$1(C2len, C2, 4, u, D); + + return D[Dlen - 1]; +} + +function orient2d(ax, ay, bx, by, cx, cy) { + const detleft = (ay - cy) * (bx - cx); + const detright = (ax - cx) * (by - cy); + const det = detleft - detright; + + if (detleft === 0 || detright === 0 || (detleft > 0) !== (detright > 0)) return det; + + const detsum = Math.abs(detleft + detright); + if (Math.abs(det) >= ccwerrboundA * detsum) return det; + + return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum); +} + +const EPSILON = Math.pow(2, -52); +const EDGE_STACK = new Uint32Array(512); + +class Delaunator { + + static from(points, getX = defaultGetX, getY = defaultGetY) { + const n = points.length; + const coords = new Float64Array(n * 2); + + for (let i = 0; i < n; i++) { + const p = points[i]; + coords[2 * i] = getX(p); + coords[2 * i + 1] = getY(p); + } -function objectConverter(columns) { - return new Function("d", "return {" + columns.map(function(name, i) { - return JSON.stringify(name) + ": d[" + i + "] || \"\""; - }).join(",") + "}"); -} + return new Delaunator(coords); + } -function customConverter(columns, f) { - var object = objectConverter(columns); - return function(row, i) { - return f(object(row), i, columns); - }; -} + constructor(coords) { + const n = coords.length >> 1; + if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.'); -// Compute unique columns in order of discovery. -function inferColumns(rows) { - var columnSet = Object.create(null), - columns = []; + this.coords = coords; - rows.forEach(function(row) { - for (var column in row) { - if (!(column in columnSet)) { - columns.push(columnSet[column] = column); - } - } - }); + // arrays that will store the triangulation graph + const maxTriangles = Math.max(2 * n - 5, 0); + this._triangles = new Uint32Array(maxTriangles * 3); + this._halfedges = new Int32Array(maxTriangles * 3); - return columns; -} + // temporary arrays for tracking the edges of the advancing convex hull + this._hashSize = Math.ceil(Math.sqrt(n)); + this._hullPrev = new Uint32Array(n); // edge to prev edge + this._hullNext = new Uint32Array(n); // edge to next edge + this._hullTri = new Uint32Array(n); // edge to adjacent triangle + this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash -function pad(value, width) { - var s = value + "", length = s.length; - return length < width ? new Array(width - length + 1).join(0) + s : s; -} + // temporary arrays for sorting points + this._ids = new Uint32Array(n); + this._dists = new Float64Array(n); -function formatYear(year) { - return year < 0 ? "-" + pad(-year, 6) - : year > 9999 ? "+" + pad(year, 6) - : pad(year, 4); -} + this.update(); + } -function formatDate(date) { - var hours = date.getUTCHours(), - minutes = date.getUTCMinutes(), - seconds = date.getUTCSeconds(), - milliseconds = date.getUTCMilliseconds(); - return isNaN(date) ? "Invalid Date" - : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) - + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" - : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" - : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" - : ""); -} + update() { + const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} = this; + const n = coords.length >> 1; -function dsvFormat(delimiter) { - var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), - DELIMITER = delimiter.charCodeAt(0); + // populate an array of point indices; calculate input data bbox + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; - function parse(text, f) { - var convert, columns, rows = parseRows(text, function(row, i) { - if (convert) return convert(row, i - 1); - columns = row, convert = f ? customConverter(row, f) : objectConverter(row); - }); - rows.columns = columns || []; - return rows; - } + for (let i = 0; i < n; i++) { + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + this._ids[i] = i; + } + const cx = (minX + maxX) / 2; + const cy = (minY + maxY) / 2; + + let minDist = Infinity; + let i0, i1, i2; + + // pick a seed point close to the center + for (let i = 0; i < n; i++) { + const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]); + if (d < minDist) { + i0 = i; + minDist = d; + } + } + const i0x = coords[2 * i0]; + const i0y = coords[2 * i0 + 1]; + + minDist = Infinity; + + // find the point closest to the seed + for (let i = 0; i < n; i++) { + if (i === i0) continue; + const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]); + if (d < minDist && d > 0) { + i1 = i; + minDist = d; + } + } + let i1x = coords[2 * i1]; + let i1y = coords[2 * i1 + 1]; + + let minRadius = Infinity; + + // find the third point which forms the smallest circumcircle with the first two + for (let i = 0; i < n; i++) { + if (i === i0 || i === i1) continue; + const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]); + if (r < minRadius) { + i2 = i; + minRadius = r; + } + } + let i2x = coords[2 * i2]; + let i2y = coords[2 * i2 + 1]; + + if (minRadius === Infinity) { + // order collinear points by dx (or dy if all x are identical) + // and return the list as a hull + for (let i = 0; i < n; i++) { + this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]); + } + quicksort(this._ids, this._dists, 0, n - 1); + const hull = new Uint32Array(n); + let j = 0; + for (let i = 0, d0 = -Infinity; i < n; i++) { + const id = this._ids[i]; + if (this._dists[id] > d0) { + hull[j++] = id; + d0 = this._dists[id]; + } + } + this.hull = hull.subarray(0, j); + this.triangles = new Uint32Array(0); + this.halfedges = new Uint32Array(0); + return; + } - function parseRows(text, f) { - var rows = [], // output rows - N = text.length, - I = 0, // current character index - n = 0, // current line number - t, // current token - eof = N <= 0, // current token followed by EOF? - eol = false; // current token followed by EOL? + // swap the order of the seed points for counter-clockwise orientation + if (orient2d(i0x, i0y, i1x, i1y, i2x, i2y) < 0) { + const i = i1; + const x = i1x; + const y = i1y; + i1 = i2; + i1x = i2x; + i1y = i2y; + i2 = i; + i2x = x; + i2y = y; + } - // Strip the trailing newline. - if (text.charCodeAt(N - 1) === NEWLINE) --N; - if (text.charCodeAt(N - 1) === RETURN) --N; + const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); + this._cx = center.x; + this._cy = center.y; - function token() { - if (eof) return EOF; - if (eol) return eol = false, EOL; + for (let i = 0; i < n; i++) { + this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y); + } - // Unescape quotes. - var i, j = I, c; - if (text.charCodeAt(j) === QUOTE) { - while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); - if ((i = I) >= N) eof = true; - else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; - else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } - return text.slice(j + 1, i - 1).replace(/""/g, "\""); - } + // sort the points by distance from the seed triangle circumcenter + quicksort(this._ids, this._dists, 0, n - 1); - // Find next delimiter or newline. - while (I < N) { - if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; - else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } - else if (c !== DELIMITER) continue; - return text.slice(j, i); - } + // set up the seed triangle as the starting hull + this._hullStart = i0; + let hullSize = 3; - // Return last token before EOF. - return eof = true, text.slice(j, N); - } + hullNext[i0] = hullPrev[i2] = i1; + hullNext[i1] = hullPrev[i0] = i2; + hullNext[i2] = hullPrev[i1] = i0; - while ((t = token()) !== EOF) { - var row = []; - while (t !== EOL && t !== EOF) row.push(t), t = token(); - if (f && (row = f(row, n++)) == null) continue; - rows.push(row); - } + hullTri[i0] = 0; + hullTri[i1] = 1; + hullTri[i2] = 2; - return rows; - } + hullHash.fill(-1); + hullHash[this._hashKey(i0x, i0y)] = i0; + hullHash[this._hashKey(i1x, i1y)] = i1; + hullHash[this._hashKey(i2x, i2y)] = i2; - function preformatBody(rows, columns) { - return rows.map(function(row) { - return columns.map(function(column) { - return formatValue(row[column]); - }).join(delimiter); - }); - } + this.trianglesLen = 0; + this._addTriangle(i0, i1, i2, -1, -1, -1); - function format(rows, columns) { - if (columns == null) columns = inferColumns(rows); - return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); - } + for (let k = 0, xp, yp; k < this._ids.length; k++) { + const i = this._ids[k]; + const x = coords[2 * i]; + const y = coords[2 * i + 1]; - function formatBody(rows, columns) { - if (columns == null) columns = inferColumns(rows); - return preformatBody(rows, columns).join("\n"); - } + // skip near-duplicate points + if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue; + xp = x; + yp = y; - function formatRows(rows) { - return rows.map(formatRow).join("\n"); - } + // skip seed triangle points + if (i === i0 || i === i1 || i === i2) continue; - function formatRow(row) { - return row.map(formatValue).join(delimiter); - } + // find a visible edge on the convex hull using edge hash + let start = 0; + for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) { + start = hullHash[(key + j) % this._hashSize]; + if (start !== -1 && start !== hullNext[start]) break; + } - function formatValue(value) { - return value == null ? "" - : value instanceof Date ? formatDate(value) - : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" - : value; - } + start = hullPrev[start]; + let e = start, q; + while (q = hullNext[e], orient2d(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]) >= 0) { + e = q; + if (e === start) { + e = -1; + break; + } + } + if (e === -1) continue; // likely a near-duplicate point; skip it + + // add the first triangle from the point + let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]); + + // recursively flip triangles from the point until they satisfy the Delaunay condition + hullTri[i] = this._legalize(t + 2); + hullTri[e] = t; // keep track of boundary triangles on the hull + hullSize++; + + // walk forward through the hull, adding more triangles and flipping recursively + let n = hullNext[e]; + while (q = hullNext[n], orient2d(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1]) < 0) { + t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]); + hullTri[i] = this._legalize(t + 2); + hullNext[n] = n; // mark as removed + hullSize--; + n = q; + } - return { - parse: parse, - parseRows: parseRows, - format: format, - formatBody: formatBody, - formatRows: formatRows, - formatRow: formatRow, - formatValue: formatValue - }; -} + // walk backward from the other side, adding more triangles and flipping + if (e === start) { + while (q = hullPrev[e], orient2d(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]) < 0) { + t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]); + this._legalize(t + 2); + hullTri[q] = t; + hullNext[e] = e; // mark as removed + hullSize--; + e = q; + } + } -var csv = dsvFormat(","); + // update the hull indices + this._hullStart = hullPrev[i] = e; + hullNext[e] = hullPrev[n] = i; + hullNext[i] = n; -var csvParse = csv.parse; -var csvParseRows = csv.parseRows; -var csvFormat = csv.format; -var csvFormatBody = csv.formatBody; -var csvFormatRows = csv.formatRows; -var csvFormatRow = csv.formatRow; -var csvFormatValue = csv.formatValue; + // save the two new edges in the hash table + hullHash[this._hashKey(x, y)] = i; + hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e; + } -var tsv = dsvFormat("\t"); + this.hull = new Uint32Array(hullSize); + for (let i = 0, e = this._hullStart; i < hullSize; i++) { + this.hull[i] = e; + e = hullNext[e]; + } -var tsvParse = tsv.parse; -var tsvParseRows = tsv.parseRows; -var tsvFormat = tsv.format; -var tsvFormatBody = tsv.formatBody; -var tsvFormatRows = tsv.formatRows; -var tsvFormatRow = tsv.formatRow; -var tsvFormatValue = tsv.formatValue; + // trim typed triangle mesh arrays + this.triangles = this._triangles.subarray(0, this.trianglesLen); + this.halfedges = this._halfedges.subarray(0, this.trianglesLen); + } + + _hashKey(x, y) { + return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize; + } + + _legalize(a) { + const {_triangles: triangles, _halfedges: halfedges, coords} = this; + + let i = 0; + let ar = 0; + + // recursion eliminated with a fixed-size stack + while (true) { + const b = halfedges[a]; + + /* if the pair of triangles doesn't satisfy the Delaunay condition + * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, + * then do the same check/flip recursively for the new pair of triangles + * + * pl pl + * /||\ / \ + * al/ || \bl al/ \a + * / || \ / \ + * / a||b \ flip /___ar___\ + * p0\ || /p1 => p0\---bl---/p1 + * \ || / \ / + * ar\ || /br b\ /br + * \||/ \ / + * pr pr + */ + const a0 = a - a % 3; + ar = a0 + (a + 2) % 3; + + if (b === -1) { // convex hull edge + if (i === 0) break; + a = EDGE_STACK[--i]; + continue; + } -function autoType(object) { - for (var key in object) { - var value = object[key].trim(), number, m; - if (!value) value = null; - else if (value === "true") value = true; - else if (value === "false") value = false; - else if (value === "NaN") value = NaN; - else if (!isNaN(number = +value)) value = number; - else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { - if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); - value = new Date(value); + const b0 = b - b % 3; + const al = a0 + (a + 1) % 3; + const bl = b0 + (b + 2) % 3; + + const p0 = triangles[ar]; + const pr = triangles[a]; + const pl = triangles[al]; + const p1 = triangles[bl]; + + const illegal = inCircle( + coords[2 * p0], coords[2 * p0 + 1], + coords[2 * pr], coords[2 * pr + 1], + coords[2 * pl], coords[2 * pl + 1], + coords[2 * p1], coords[2 * p1 + 1]); + + if (illegal) { + triangles[a] = p1; + triangles[b] = p0; + + const hbl = halfedges[bl]; + + // edge swapped on the other side of the hull (rare); fix the halfedge reference + if (hbl === -1) { + let e = this._hullStart; + do { + if (this._hullTri[e] === bl) { + this._hullTri[e] = a; + break; + } + e = this._hullPrev[e]; + } while (e !== this._hullStart); + } + this._link(a, hbl); + this._link(b, halfedges[ar]); + this._link(ar, bl); + + const br = b0 + (b + 1) % 3; + + // don't worry about hitting the cap: it can only happen on extremely degenerate input + if (i < EDGE_STACK.length) { + EDGE_STACK[i++] = br; + } + } else { + if (i === 0) break; + a = EDGE_STACK[--i]; + } + } + + return ar; } - else continue; - object[key] = value; - } - return object; -} -// https://github.com/d3/d3-dsv/issues/45 -var fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + _link(a, b) { + this._halfedges[a] = b; + if (b !== -1) this._halfedges[b] = a; + } -function responseBlob(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.blob(); -} + // add a new triangle given vertex indices and adjacent half-edge ids + _addTriangle(i0, i1, i2, a, b, c) { + const t = this.trianglesLen; -function blob(input, init) { - return fetch(input, init).then(responseBlob); + this._triangles[t] = i0; + this._triangles[t + 1] = i1; + this._triangles[t + 2] = i2; + + this._link(t, a); + this._link(t + 1, b); + this._link(t + 2, c); + + this.trianglesLen += 3; + + return t; + } } -function responseArrayBuffer(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.arrayBuffer(); +// monotonically increases with real angle, but doesn't need expensive trigonometry +function pseudoAngle(dx, dy) { + const p = dx / (Math.abs(dx) + Math.abs(dy)); + return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1] } -function buffer(input, init) { - return fetch(input, init).then(responseArrayBuffer); +function dist(ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return dx * dx + dy * dy; } -function responseText(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.text(); +function inCircle(ax, ay, bx, by, cx, cy, px, py) { + const dx = ax - px; + const dy = ay - py; + const ex = bx - px; + const ey = by - py; + const fx = cx - px; + const fy = cy - py; + + const ap = dx * dx + dy * dy; + const bp = ex * ex + ey * ey; + const cp = fx * fx + fy * fy; + + return dx * (ey * cp - bp * fy) - + dy * (ex * cp - bp * fx) + + ap * (ex * fy - ey * fx) < 0; } -function text(input, init) { - return fetch(input, init).then(responseText); +function circumradius(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = (ey * bl - dy * cl) * d; + const y = (dx * cl - ex * bl) * d; + + return x * x + y * y; } -function dsvParse(parse) { - return function(input, init, row) { - if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; - return text(input, init).then(function(response) { - return parse(response, row); - }); - }; +function circumcenter(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = ax + (ey * bl - dy * cl) * d; + const y = ay + (dx * cl - ex * bl) * d; + + return {x, y}; } -function dsv(delimiter, input, init, row) { - if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; - var format = dsvFormat(delimiter); - return text(input, init).then(function(response) { - return format.parse(response, row); - }); +function quicksort(ids, dists, left, right) { + if (right - left <= 20) { + for (let i = left + 1; i <= right; i++) { + const temp = ids[i]; + const tempDist = dists[temp]; + let j = i - 1; + while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--]; + ids[j + 1] = temp; + } + } else { + const median = (left + right) >> 1; + let i = left + 1; + let j = right; + swap(ids, median, i); + if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right); + if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right); + if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i); + + const temp = ids[i]; + const tempDist = dists[temp]; + while (true) { + do i++; while (dists[ids[i]] < tempDist); + do j--; while (dists[ids[j]] > tempDist); + if (j < i) break; + swap(ids, i, j); + } + ids[left + 1] = ids[j]; + ids[j] = temp; + + if (right - i + 1 >= j - left) { + quicksort(ids, dists, i, right); + quicksort(ids, dists, left, j - 1); + } else { + quicksort(ids, dists, left, j - 1); + quicksort(ids, dists, i, right); + } + } } -var csv$1 = dsvParse(csvParse); -var tsv$1 = dsvParse(tsvParse); +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} -function image(input, init) { - return new Promise(function(resolve, reject) { - var image = new Image; - for (var key in init) image[key] = init[key]; - image.onerror = reject; - image.onload = function() { resolve(image); }; - image.src = input; - }); +function defaultGetX(p) { + return p[0]; +} +function defaultGetY(p) { + return p[1]; } -function responseJson(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.json(); +const epsilon$2 = 1e-6; + +class Path { + constructor() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + moveTo(x, y) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`; + } + closePath() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + } + lineTo(x, y) { + this._ += `L${this._x1 = +x},${this._y1 = +y}`; + } + arc(x, y, r) { + x = +x, y = +y, r = +r; + const x0 = x + r; + const y0 = y; + if (r < 0) throw new Error("negative radius"); + if (this._x1 === null) this._ += `M${x0},${y0}`; + else if (Math.abs(this._x1 - x0) > epsilon$2 || Math.abs(this._y1 - y0) > epsilon$2) this._ += "L" + x0 + "," + y0; + if (!r) return; + this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`; + } + rect(x, y, w, h) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`; + } + value() { + return this._ || null; + } } -function json(input, init) { - return fetch(input, init).then(responseJson); +class Polygon { + constructor() { + this._ = []; + } + moveTo(x, y) { + this._.push([x, y]); + } + closePath() { + this._.push(this._[0].slice()); + } + lineTo(x, y) { + this._.push([x, y]); + } + value() { + return this._.length ? this._ : null; + } } -function parser(type) { - return function(input, init) { - return text(input, init).then(function(text) { - return (new DOMParser).parseFromString(text, type); - }); - }; +class Voronoi { + constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) { + if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error("invalid bounds"); + this.delaunay = delaunay; + this._circumcenters = new Float64Array(delaunay.points.length * 2); + this.vectors = new Float64Array(delaunay.points.length * 2); + this.xmax = xmax, this.xmin = xmin; + this.ymax = ymax, this.ymin = ymin; + this._init(); + } + update() { + this.delaunay.update(); + this._init(); + return this; + } + _init() { + const {delaunay: {points, hull, triangles}, vectors} = this; + + // Compute circumcenters. + const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2); + for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) { + const t1 = triangles[i] * 2; + const t2 = triangles[i + 1] * 2; + const t3 = triangles[i + 2] * 2; + const x1 = points[t1]; + const y1 = points[t1 + 1]; + const x2 = points[t2]; + const y2 = points[t2 + 1]; + const x3 = points[t3]; + const y3 = points[t3 + 1]; + + const dx = x2 - x1; + const dy = y2 - y1; + const ex = x3 - x1; + const ey = y3 - y1; + const ab = (dx * ey - dy * ex) * 2; + + if (Math.abs(ab) < 1e-9) { + // degenerate case (collinear diagram) + // almost equal points (degenerate triangle) + // the circumcenter is at the infinity, in a + // direction that is: + // 1. orthogonal to the halfedge. + let a = 1e9; + // 2. points away from the center; since the list of triangles starts + // in the center, the first point of the first triangle + // will be our reference + const r = triangles[0] * 2; + a *= Math.sign((points[r] - x1) * ey - (points[r + 1] - y1) * ex); + x = (x1 + x3) / 2 - a * ey; + y = (y1 + y3) / 2 + a * ex; + } else { + const d = 1 / ab; + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + x = x1 + (ey * bl - dy * cl) * d; + y = y1 + (dx * cl - ex * bl) * d; + } + circumcenters[j] = x; + circumcenters[j + 1] = y; + } + + // Compute exterior cell rays. + let h = hull[hull.length - 1]; + let p0, p1 = h * 4; + let x0, x1 = points[2 * h]; + let y0, y1 = points[2 * h + 1]; + vectors.fill(0); + for (let i = 0; i < hull.length; ++i) { + h = hull[i]; + p0 = p1, x0 = x1, y0 = y1; + p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1]; + vectors[p0 + 2] = vectors[p1] = y0 - y1; + vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0; + } + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {delaunay: {halfedges, inedges, hull}, circumcenters, vectors} = this; + if (hull.length <= 1) return null; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = Math.floor(i / 3) * 2; + const tj = Math.floor(j / 3) * 2; + const xi = circumcenters[ti]; + const yi = circumcenters[ti + 1]; + const xj = circumcenters[tj]; + const yj = circumcenters[tj + 1]; + this._renderSegment(xi, yi, xj, yj, context); + } + let h0, h1 = hull[hull.length - 1]; + for (let i = 0; i < hull.length; ++i) { + h0 = h1, h1 = hull[i]; + const t = Math.floor(inedges[h1] / 3) * 2; + const x = circumcenters[t]; + const y = circumcenters[t + 1]; + const v = h0 * 4; + const p = this._project(x, y, vectors[v + 2], vectors[v + 3]); + if (p) this._renderSegment(x, y, p[0], p[1], context); + } + return buffer && buffer.value(); + } + renderBounds(context) { + const buffer = context == null ? context = new Path : undefined; + context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin); + return buffer && buffer.value(); + } + renderCell(i, context) { + const buffer = context == null ? context = new Path : undefined; + const points = this._clip(i); + if (points === null || !points.length) return; + context.moveTo(points[0], points[1]); + let n = points.length; + while (points[0] === points[n-2] && points[1] === points[n-1] && n > 1) n -= 2; + for (let i = 2; i < n; i += 2) { + if (points[i] !== points[i-2] || points[i+1] !== points[i-1]) + context.lineTo(points[i], points[i + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + *cellPolygons() { + const {delaunay: {points}} = this; + for (let i = 0, n = points.length / 2; i < n; ++i) { + const cell = this.cellPolygon(i); + if (cell) cell.index = i, yield cell; + } + } + cellPolygon(i) { + const polygon = new Polygon; + this.renderCell(i, polygon); + return polygon.value(); + } + _renderSegment(x0, y0, x1, y1, context) { + let S; + const c0 = this._regioncode(x0, y0); + const c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + context.moveTo(x0, y0); + context.lineTo(x1, y1); + } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) { + context.moveTo(S[0], S[1]); + context.lineTo(S[2], S[3]); + } + } + contains(i, x, y) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return false; + return this.delaunay._step(i, x, y) === i; + } + *neighbors(i) { + const ci = this._clip(i); + if (ci) for (const j of this.delaunay.neighbors(i)) { + const cj = this._clip(j); + // find the common edge + if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) { + for (let aj = 0, lj = cj.length; aj < lj; aj += 2) { + if (ci[ai] == cj[aj] + && ci[ai + 1] == cj[aj + 1] + && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] + && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj] + ) { + yield j; + break loop; + } + } + } + } + } + _cell(i) { + const {circumcenters, delaunay: {inedges, halfedges, triangles}} = this; + const e0 = inedges[i]; + if (e0 === -1) return null; // coincident point + const points = []; + let e = e0; + do { + const t = Math.floor(e / 3); + points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]); + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + } while (e !== e0 && e !== -1); + return points; + } + _clip(i) { + // degenerate case (1 valid point: return the box) + if (i === 0 && this.delaunay.hull.length === 1) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + const points = this._cell(i); + if (points === null) return null; + const {vectors: V} = this; + const v = i * 4; + return V[v] || V[v + 1] + ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) + : this._clipFinite(i, points); + } + _clipFinite(i, points) { + const n = points.length; + let P = null; + let x0, y0, x1 = points[n - 2], y1 = points[n - 1]; + let c0, c1 = this._regioncode(x1, y1); + let e0, e1 = 0; + for (let j = 0; j < n; j += 2) { + x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1]; + c0 = c1, c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + e0 = e1, e1 = 0; + if (P) P.push(x1, y1); + else P = [x1, y1]; + } else { + let S, sx0, sy0, sx1, sy1; + if (c0 === 0) { + if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue; + [sx0, sy0, sx1, sy1] = S; + } else { + if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue; + [sx1, sy1, sx0, sy0] = S; + e0 = e1, e1 = this._edgecode(sx0, sy0); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx0, sy0); + else P = [sx0, sy0]; + } + e0 = e1, e1 = this._edgecode(sx1, sy1); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx1, sy1); + else P = [sx1, sy1]; + } + } + if (P) { + e0 = e1, e1 = this._edgecode(P[0], P[1]); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + return P; + } + _clipSegment(x0, y0, x1, y1, c0, c1) { + while (true) { + if (c0 === 0 && c1 === 0) return [x0, y0, x1, y1]; + if (c0 & c1) return null; + let x, y, c = c0 || c1; + if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax; + else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin; + else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax; + else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin; + if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0); + else x1 = x, y1 = y, c1 = this._regioncode(x1, y1); + } + } + _clipInfinite(i, points, vx0, vy0, vxn, vyn) { + let P = Array.from(points), p; + if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]); + if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]); + if (P = this._clipFinite(i, P)) { + for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) { + c0 = c1, c1 = this._edgecode(P[j], P[j + 1]); + if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length; + } + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax]; + } + return P; + } + _edge(i, e0, e1, P, j) { + while (e0 !== e1) { + let x, y; + switch (e0) { + case 0b0101: e0 = 0b0100; continue; // top-left + case 0b0100: e0 = 0b0110, x = this.xmax, y = this.ymin; break; // top + case 0b0110: e0 = 0b0010; continue; // top-right + case 0b0010: e0 = 0b1010, x = this.xmax, y = this.ymax; break; // right + case 0b1010: e0 = 0b1000; continue; // bottom-right + case 0b1000: e0 = 0b1001, x = this.xmin, y = this.ymax; break; // bottom + case 0b1001: e0 = 0b0001; continue; // bottom-left + case 0b0001: e0 = 0b0101, x = this.xmin, y = this.ymin; break; // left + } + // Note: this implicitly checks for out of bounds: if P[j] or P[j+1] are + // undefined, the conditional statement will be executed. + if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) { + P.splice(j, 0, x, y), j += 2; + } + } + if (P.length > 4) { + for (let i = 0; i < P.length; i+= 2) { + const j = (i + 2) % P.length, k = (i + 4) % P.length; + if (P[i] === P[j] && P[j] === P[k] + || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) + P.splice(j, 2), i -= 2; + } + } + return j; + } + _project(x0, y0, vx, vy) { + let t = Infinity, c, x, y; + if (vy < 0) { // top + if (y0 <= this.ymin) return null; + if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx; + } else if (vy > 0) { // bottom + if (y0 >= this.ymax) return null; + if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx; + } + if (vx > 0) { // right + if (x0 >= this.xmax) return null; + if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy; + } else if (vx < 0) { // left + if (x0 <= this.xmin) return null; + if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy; + } + return [x, y]; + } + _edgecode(x, y) { + return (x === this.xmin ? 0b0001 + : x === this.xmax ? 0b0010 : 0b0000) + | (y === this.ymin ? 0b0100 + : y === this.ymax ? 0b1000 : 0b0000); + } + _regioncode(x, y) { + return (x < this.xmin ? 0b0001 + : x > this.xmax ? 0b0010 : 0b0000) + | (y < this.ymin ? 0b0100 + : y > this.ymax ? 0b1000 : 0b0000); + } } -var xml = parser("application/xml"); +const tau$2 = 2 * Math.PI, pow$2 = Math.pow; -var html = parser("text/html"); +function pointX(p) { + return p[0]; +} -var svg = parser("image/svg+xml"); +function pointY(p) { + return p[1]; +} -function center$1(x, y) { - var nodes; +// A triangulation is collinear if all its triangles have a non-null area +function collinear(d) { + const {triangles, coords} = d; + for (let i = 0; i < triangles.length; i += 3) { + const a = 2 * triangles[i], + b = 2 * triangles[i + 1], + c = 2 * triangles[i + 2], + cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) + - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]); + if (cross > 1e-10) return false; + } + return true; +} - if (x == null) x = 0; - if (y == null) y = 0; +function jitter(x, y, r) { + return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r]; +} - function force() { - var i, - n = nodes.length, - node, - sx = 0, - sy = 0; +class Delaunay { + static from(points, fx = pointX, fy = pointY, that) { + return new Delaunay("length" in points + ? flatArray(points, fx, fy, that) + : Float64Array.from(flatIterable(points, fx, fy, that))); + } + constructor(points) { + this._delaunator = new Delaunator(points); + this.inedges = new Int32Array(points.length / 2); + this._hullIndex = new Int32Array(points.length / 2); + this.points = this._delaunator.coords; + this._init(); + } + update() { + this._delaunator.update(); + this._init(); + return this; + } + _init() { + const d = this._delaunator, points = this.points; + + // check for collinear + if (d.hull && d.hull.length > 2 && collinear(d)) { + this.collinear = Int32Array.from({length: points.length/2}, (_,i) => i) + .sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors + const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], + bounds = [ points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1] ], + r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]); + for (let i = 0, n = points.length / 2; i < n; ++i) { + const p = jitter(points[2 * i], points[2 * i + 1], r); + points[2 * i] = p[0]; + points[2 * i + 1] = p[1]; + } + this._delaunator = new Delaunator(points); + } else { + delete this.collinear; + } + + const halfedges = this.halfedges = this._delaunator.halfedges; + const hull = this.hull = this._delaunator.hull; + const triangles = this.triangles = this._delaunator.triangles; + const inedges = this.inedges.fill(-1); + const hullIndex = this._hullIndex.fill(-1); + + // Compute an index from each point to an (arbitrary) incoming halfedge + // Used to give the first neighbor of each point; for this reason, + // on the hull we give priority to exterior halfedges + for (let e = 0, n = halfedges.length; e < n; ++e) { + const p = triangles[e % 3 === 2 ? e - 2 : e + 1]; + if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e; + } + for (let i = 0, n = hull.length; i < n; ++i) { + hullIndex[hull[i]] = i; + } + + // degenerate case: 1 or 2 (distinct) points + if (hull.length <= 2 && hull.length > 0) { + this.triangles = new Int32Array(3).fill(-1); + this.halfedges = new Int32Array(3).fill(-1); + this.triangles[0] = hull[0]; + inedges[hull[0]] = 1; + if (hull.length === 2) { + inedges[hull[1]] = 0; + this.triangles[1] = hull[1]; + this.triangles[2] = hull[1]; + } + } + } + voronoi(bounds) { + return new Voronoi(this, bounds); + } + *neighbors(i) { + const {inedges, hull, _hullIndex, halfedges, triangles, collinear} = this; - for (i = 0; i < n; ++i) { - node = nodes[i], sx += node.x, sy += node.y; + // degenerate case with several collinear points + if (collinear) { + const l = collinear.indexOf(i); + if (l > 0) yield collinear[l - 1]; + if (l < collinear.length - 1) yield collinear[l + 1]; + return; } - for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { - node = nodes[i], node.x -= sx, node.y -= sy; + const e0 = inedges[i]; + if (e0 === -1) return; // coincident point + let e = e0, p0 = -1; + do { + yield p0 = triangles[e]; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) return; // bad triangulation + e = halfedges[e]; + if (e === -1) { + const p = hull[(_hullIndex[i] + 1) % hull.length]; + if (p !== p0) yield p; + return; + } + } while (e !== e0); + } + find(x, y, i = 0) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return -1; + const i0 = i; + let c; + while ((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0) i = c; + return c; + } + _step(i, x, y) { + const {inedges, hull, _hullIndex, halfedges, triangles, points} = this; + if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1); + let c = i; + let dc = pow$2(x - points[i * 2], 2) + pow$2(y - points[i * 2 + 1], 2); + const e0 = inedges[i]; + let e = e0; + do { + let t = triangles[e]; + const dt = pow$2(x - points[t * 2], 2) + pow$2(y - points[t * 2 + 1], 2); + if (dt < dc) dc = dt, c = t; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + if (e === -1) { + e = hull[(_hullIndex[i] + 1) % hull.length]; + if (e !== t) { + if (pow$2(x - points[e * 2], 2) + pow$2(y - points[e * 2 + 1], 2) < dc) return e; + } + break; + } + } while (e !== e0); + return c; + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {points, halfedges, triangles} = this; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = triangles[i] * 2; + const tj = triangles[j] * 2; + context.moveTo(points[ti], points[ti + 1]); + context.lineTo(points[tj], points[tj + 1]); + } + this.renderHull(context); + return buffer && buffer.value(); + } + renderPoints(context, r) { + if (r === undefined && (!context || typeof context.moveTo !== "function")) r = context, context = null; + r = r == undefined ? 2 : +r; + const buffer = context == null ? context = new Path : undefined; + const {points} = this; + for (let i = 0, n = points.length; i < n; i += 2) { + const x = points[i], y = points[i + 1]; + context.moveTo(x + r, y); + context.arc(x, y, r, 0, tau$2); + } + return buffer && buffer.value(); + } + renderHull(context) { + const buffer = context == null ? context = new Path : undefined; + const {hull, points} = this; + const h = hull[0] * 2, n = hull.length; + context.moveTo(points[h], points[h + 1]); + for (let i = 1; i < n; ++i) { + const h = 2 * hull[i]; + context.lineTo(points[h], points[h + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + hullPolygon() { + const polygon = new Polygon; + this.renderHull(polygon); + return polygon.value(); + } + renderTriangle(i, context) { + const buffer = context == null ? context = new Path : undefined; + const {points, triangles} = this; + const t0 = triangles[i *= 3] * 2; + const t1 = triangles[i + 1] * 2; + const t2 = triangles[i + 2] * 2; + context.moveTo(points[t0], points[t0 + 1]); + context.lineTo(points[t1], points[t1 + 1]); + context.lineTo(points[t2], points[t2 + 1]); + context.closePath(); + return buffer && buffer.value(); + } + *trianglePolygons() { + const {triangles} = this; + for (let i = 0, n = triangles.length / 3; i < n; ++i) { + yield this.trianglePolygon(i); } } + trianglePolygon(i) { + const polygon = new Polygon; + this.renderTriangle(i, polygon); + return polygon.value(); + } +} - force.initialize = function(_) { - nodes = _; - }; +function flatArray(points, fx, fy, that) { + const n = points.length; + const array = new Float64Array(n * 2); + for (let i = 0; i < n; ++i) { + const p = points[i]; + array[i * 2] = fx.call(that, p, i, points); + array[i * 2 + 1] = fy.call(that, p, i, points); + } + return array; +} - force.x = function(_) { - return arguments.length ? (x = +_, force) : x; - }; +function* flatIterable(points, fx, fy, that) { + let i = 0; + for (const p of points) { + yield fx.call(that, p, i, points); + yield fy.call(that, p, i, points); + ++i; + } +} - force.y = function(_) { - return arguments.length ? (y = +_, force) : y; - }; +var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; - return force; +function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); } -function constant$7(x) { - return function() { - return x; +function customConverter(columns, f) { + var object = objectConverter(columns); + return function(row, i) { + return f(object(row), i, columns); }; } -function jiggle() { - return (Math.random() - 0.5) * 1e-6; +// Compute unique columns in order of discovery. +function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function(row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; } -function tree_add(d) { - var x = +this._x.call(null, d), - y = +this._y.call(null, d); - return add(this.cover(x, y), x, y, d); +function pad$1(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; +} + +function formatYear$1(year) { + return year < 0 ? "-" + pad$1(-year, 6) + : year > 9999 ? "+" + pad$1(year, 6) + : pad$1(year, 4); +} + +function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear$1(date.getUTCFullYear()) + "-" + pad$1(date.getUTCMonth() + 1, 2) + "-" + pad$1(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + ":" + pad$1(seconds, 2) + "." + pad$1(milliseconds, 3) + "Z" + : seconds ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + ":" + pad$1(seconds, 2) + "Z" + : minutes || hours ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + "Z" + : ""); +} + +function dsvFormat(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; +} + +var csv$1 = dsvFormat(","); + +var csvParse = csv$1.parse; +var csvParseRows = csv$1.parseRows; +var csvFormat = csv$1.format; +var csvFormatBody = csv$1.formatBody; +var csvFormatRows = csv$1.formatRows; +var csvFormatRow = csv$1.formatRow; +var csvFormatValue = csv$1.formatValue; + +var tsv$1 = dsvFormat("\t"); + +var tsvParse = tsv$1.parse; +var tsvParseRows = tsv$1.parseRows; +var tsvFormat = tsv$1.format; +var tsvFormatBody = tsv$1.formatBody; +var tsvFormatRows = tsv$1.formatRows; +var tsvFormatRow = tsv$1.formatRow; +var tsvFormatValue = tsv$1.formatValue; + +function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } + else continue; + object[key] = value; + } + return object; +} + +// https://github.com/d3/d3-dsv/issues/45 +const fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + +function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); +} + +function blob(input, init) { + return fetch(input, init).then(responseBlob); +} + +function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); +} + +function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); +} + +function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); +} + +function text(input, init) { + return fetch(input, init).then(responseText); +} + +function dsvParse(parse) { + return function(input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function(response) { + return parse(response, row); + }); + }; +} + +function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = dsvFormat(delimiter); + return text(input, init).then(function(response) { + return format.parse(response, row); + }); +} + +var csv = dsvParse(csvParse); +var tsv = dsvParse(tsvParse); + +function image(input, init) { + return new Promise(function(resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function() { resolve(image); }; + image.src = input; + }); +} + +function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + if (response.status === 204 || response.status === 205) return; + return response.json(); +} + +function json(input, init) { + return fetch(input, init).then(responseJson); +} + +function parser(type) { + return (input, init) => text(input, init) + .then(text => (new DOMParser).parseFromString(text, type)); +} + +var xml = parser("application/xml"); + +var html = parser("text/html"); + +var svg = parser("image/svg+xml"); + +function center(x, y) { + var nodes, strength = 1; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function(_) { + nodes = _; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + return force; +} + +function tree_add(d) { + const x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); } function add(tree, x, y, d) { @@ -6325,7 +8475,7 @@ function tree_cover(x, y) { // Otherwise, double repeatedly to cover. else { - var z = x1 - x0, + var z = x1 - x0 || 1, node = this._root, parent, i; @@ -6552,7 +8702,7 @@ function tree_visitAfter(callback) { return this; } -function defaultX$1(d) { +function defaultX(d) { return d[0]; } @@ -6560,7 +8710,7 @@ function tree_x(_) { return arguments.length ? (this._x = _, this) : this._x; } -function defaultY$1(d) { +function defaultY(d) { return d[1]; } @@ -6569,7 +8719,7 @@ function tree_y(_) { } function quadtree(nodes, x, y) { - var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN); + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); return nodes == null ? tree : tree.addAll(nodes); } @@ -6629,21 +8779,32 @@ treeProto.visitAfter = tree_visitAfter; treeProto.x = tree_x; treeProto.y = tree_y; -function x(d) { +function constant$4(x) { + return function() { + return x; + }; +} + +function jiggle(random) { + return (random() - 0.5) * 1e-6; +} + +function x$4(d) { return d.x + d.vx; } -function y(d) { +function y$3(d) { return d.y + d.vy; } function collide(radius) { var nodes, radii, + random, strength = 1, iterations = 1; - if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius); + if (typeof radius !== "function") radius = constant$4(radius == null ? 1 : +radius); function force() { var i, n = nodes.length, @@ -6655,7 +8816,7 @@ function collide(radius) { ri2; for (var k = 0; k < iterations; ++k) { - tree = quadtree(nodes, x, y).visitAfter(prepare); + tree = quadtree(nodes, x$4, y$3).visitAfter(prepare); for (i = 0; i < n; ++i) { node = nodes[i]; ri = radii[node.index], ri2 = ri * ri; @@ -6673,8 +8834,8 @@ function collide(radius) { y = yi - data.y - data.vy, l = x * x + y * y; if (l < r * r) { - if (x === 0) x = jiggle(), l += x * x; - if (y === 0) y = jiggle(), l += y * y; + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; l = (r - (l = Math.sqrt(l))) / l * strength; node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); node.vy += (y *= l) * r; @@ -6704,8 +8865,9 @@ function collide(radius) { for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); } - force.initialize = function(_) { - nodes = _; + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; initialize(); }; @@ -6718,31 +8880,32 @@ function collide(radius) { }; force.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : radius; }; return force; } -function index(d) { +function index$3(d) { return d.index; } function find(nodeById, nodeId) { var node = nodeById.get(nodeId); - if (!node) throw new Error("missing: " + nodeId); + if (!node) throw new Error("node not found: " + nodeId); return node; } -function link(links) { - var id = index, +function link$2(links) { + var id = index$3, strength = defaultStrength, strengths, - distance = constant$7(30), + distance = constant$4(30), distances, nodes, count, bias, + random, iterations = 1; if (links == null) links = []; @@ -6755,8 +8918,8 @@ function link(links) { for (var k = 0, n = links.length; k < iterations; ++k) { for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { link = links[i], source = link.source, target = link.target; - x = target.x + target.vx - source.x - source.vx || jiggle(); - y = target.y + target.vy - source.y - source.vy || jiggle(); + x = target.x + target.vx - source.x - source.vx || jiggle(random); + y = target.y + target.vy - source.y - source.vy || jiggle(random); l = Math.sqrt(x * x + y * y); l = (l - distances[i]) / l * alpha * strengths[i]; x *= l, y *= l; @@ -6774,7 +8937,7 @@ function link(links) { var i, n = nodes.length, m = links.length, - nodeById = map$1(nodes, id), + nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])), link; for (i = 0, count = new Array(n); i < m; ++i) { @@ -6809,8 +8972,9 @@ function link(links) { } } - force.initialize = function(_) { - nodes = _; + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; initialize(); }; @@ -6827,21 +8991,31 @@ function link(links) { }; force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength; + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initializeStrength(), force) : strength; }; force.distance = function(_) { - return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance; + return arguments.length ? (distance = typeof _ === "function" ? _ : constant$4(+_), initializeDistance(), force) : distance; }; return force; } -function x$1(d) { +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const a$2 = 1664525; +const c$4 = 1013904223; +const m$1 = 4294967296; // 2^32 + +function lcg$2() { + let s = 1; + return () => (s = (a$2 * s + c$4) % m$1) / m$1; +} + +function x$3(d) { return d.x; } -function y$1(d) { +function y$2(d) { return d.y; } @@ -6855,9 +9029,10 @@ function simulation(nodes) { alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, - forces = map$1(), + forces = new Map(), stepper = timer(step), - event = dispatch("tick", "end"); + event = dispatch("tick", "end"), + random = lcg$2(); if (nodes == null) nodes = []; @@ -6878,7 +9053,7 @@ function simulation(nodes) { for (var k = 0; k < iterations; ++k) { alpha += (alphaTarget - alpha) * alphaDecay; - forces.each(function (force) { + forces.forEach(function(force) { force(alpha); }); @@ -6900,7 +9075,7 @@ function simulation(nodes) { if (node.fx != null) node.x = node.fx; if (node.fy != null) node.y = node.fy; if (isNaN(node.x) || isNaN(node.y)) { - var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; node.x = radius * Math.cos(angle); node.y = radius * Math.sin(angle); } @@ -6911,7 +9086,7 @@ function simulation(nodes) { } function initializeForce(force) { - if (force.initialize) force.initialize(nodes); + if (force.initialize) force.initialize(nodes, random); return force; } @@ -6929,7 +9104,7 @@ function simulation(nodes) { }, nodes: function(_) { - return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; }, alpha: function(_) { @@ -6952,8 +9127,12 @@ function simulation(nodes) { return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; }, + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + force: function(name, _) { - return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); }, find: function(x, y, radius) { @@ -6988,15 +9167,16 @@ function simulation(nodes) { function manyBody() { var nodes, node, + random, alpha, - strength = constant$7(-30), + strength = constant$4(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81; function force(_) { - var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate); + var i, n = nodes.length, tree = quadtree(nodes, x$3, y$2).visitAfter(accumulate); for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); } @@ -7045,8 +9225,8 @@ function manyBody() { // Limit forces for very close nodes; randomize direction if coincident. if (w * w / theta2 < l) { if (l < distanceMax2) { - if (x === 0) x = jiggle(), l += x * x; - if (y === 0) y = jiggle(), l += y * y; + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); node.vx += x * quad.value * alpha / l; node.vy += y * quad.value * alpha / l; @@ -7059,8 +9239,8 @@ function manyBody() { // Limit forces for very close nodes; randomize direction if coincident. if (quad.data !== node || quad.next) { - if (x === 0) x = jiggle(), l += x * x; - if (y === 0) y = jiggle(), l += y * y; + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); } @@ -7071,13 +9251,14 @@ function manyBody() { } while (quad = quad.next); } - force.initialize = function(_) { - nodes = _; + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; initialize(); }; force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; }; force.distanceMin = function(_) { @@ -7095,13 +9276,13 @@ function manyBody() { return force; } -function radial(radius, x, y) { +function radial$1(radius, x, y) { var nodes, - strength = constant$7(0.1), + strength = constant$4(0.1), strengths, radiuses; - if (typeof radius !== "function") radius = constant$7(+radius); + if (typeof radius !== "function") radius = constant$4(+radius); if (x == null) x = 0; if (y == null) y = 0; @@ -7133,11 +9314,11 @@ function radial(radius, x, y) { }; force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; }; force.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : radius; }; force.x = function(_) { @@ -7152,12 +9333,12 @@ function radial(radius, x, y) { } function x$2(x) { - var strength = constant$7(0.1), + var strength = constant$4(0.1), nodes, strengths, xz; - if (typeof x !== "function") x = constant$7(x == null ? 0 : +x); + if (typeof x !== "function") x = constant$4(x == null ? 0 : +x); function force(alpha) { for (var i = 0, n = nodes.length, node; i < n; ++i) { @@ -7181,23 +9362,23 @@ function x$2(x) { }; force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; }; force.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x; + return arguments.length ? (x = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : x; }; return force; } -function y$2(y) { - var strength = constant$7(0.1), +function y$1(y) { + var strength = constant$4(0.1), nodes, strengths, yz; - if (typeof y !== "function") y = constant$7(y == null ? 0 : +y); + if (typeof y !== "function") y = constant$4(y == null ? 0 : +y); function force(alpha) { for (var i = 0, n = nodes.length, node; i < n; ++i) { @@ -7221,20 +9402,26 @@ function y$2(y) { }; force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; }; force.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y; + return arguments.length ? (y = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : y; }; return force; } +function formatDecimal(x) { + return Math.abs(x = Math.round(x)) >= 1e21 + ? x.toLocaleString("en").replace(/,/g, "") + : x.toString(10); +} + // Computes the decimal coefficient and exponent of the specified number x with // significant digits p, where x is positive and p is in [1, 21] or undefined. -// For example, formatDecimal(1.23) returns ["123", 0]. -function formatDecimal(x, p) { +// For example, formatDecimalParts(1.23) returns ["123", 0]. +function formatDecimalParts(x, p) { if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ยฑInfinity var i, coefficient = x.slice(0, i); @@ -7246,8 +9433,8 @@ function formatDecimal(x, p) { ]; } -function exponent$1(x) { - return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; +function exponent(x) { + return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN; } function formatGroup(grouping, thousands) { @@ -7340,7 +9527,7 @@ function formatTrim(s) { var prefixExponent; function formatPrefixAuto(x, p) { - var d = formatDecimal(x, p); + var d = formatDecimalParts(x, p); if (!d) return x + ""; var coefficient = d[0], exponent = d[1], @@ -7349,11 +9536,11 @@ function formatPrefixAuto(x, p) { return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) - : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! + : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y! } function formatRounded(x, p) { - var d = formatDecimal(x, p); + var d = formatDecimalParts(x, p); if (!d) return x + ""; var coefficient = d[0], exponent = d[1]; @@ -7363,36 +9550,36 @@ function formatRounded(x, p) { } var formatTypes = { - "%": function(x, p) { return (x * 100).toFixed(p); }, - "b": function(x) { return Math.round(x).toString(2); }, - "c": function(x) { return x + ""; }, - "d": function(x) { return Math.round(x).toString(10); }, - "e": function(x, p) { return x.toExponential(p); }, - "f": function(x, p) { return x.toFixed(p); }, - "g": function(x, p) { return x.toPrecision(p); }, - "o": function(x) { return Math.round(x).toString(8); }, - "p": function(x, p) { return formatRounded(x * 100, p); }, + "%": (x, p) => (x * 100).toFixed(p), + "b": (x) => Math.round(x).toString(2), + "c": (x) => x + "", + "d": formatDecimal, + "e": (x, p) => x.toExponential(p), + "f": (x, p) => x.toFixed(p), + "g": (x, p) => x.toPrecision(p), + "o": (x) => Math.round(x).toString(8), + "p": (x, p) => formatRounded(x * 100, p), "r": formatRounded, "s": formatPrefixAuto, - "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, - "x": function(x) { return Math.round(x).toString(16); } + "X": (x) => Math.round(x).toString(16).toUpperCase(), + "x": (x) => Math.round(x).toString(16) }; -function identity$3(x) { +function identity$6(x) { return x; } -var map$2 = Array.prototype.map, +var map = Array.prototype.map, prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"]; -function formatLocale(locale) { - var group = locale.grouping === undefined || locale.thousands === undefined ? identity$3 : formatGroup(map$2.call(locale.grouping, Number), locale.thousands + ""), +function formatLocale$1(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity$6 : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", decimal = locale.decimal === undefined ? "." : locale.decimal + "", - numerals = locale.numerals === undefined ? identity$3 : formatNumerals(map$2.call(locale.numerals, String)), + numerals = locale.numerals === undefined ? identity$6 : formatNumerals(map.call(locale.numerals, String)), percent = locale.percent === undefined ? "%" : locale.percent + "", - minus = locale.minus === undefined ? "-" : locale.minus + "", + minus = locale.minus === undefined ? "\u2212" : locale.minus + "", nan = locale.nan === undefined ? "NaN" : locale.nan + ""; function newFormat(specifier) { @@ -7448,19 +9635,20 @@ function formatLocale(locale) { } else { value = +value; + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; + // Perform the initial formatting. - var valueNegative = value < 0; value = isNaN(value) ? nan : formatType(Math.abs(value), precision); // Trim insignificant zeros. if (trim) value = formatTrim(value); - // If a negative value rounds to zero during formatting, treat as positive. - if (valueNegative && +value === 0) valueNegative = false; + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; // Compute the prefix and suffix. valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; - valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); // Break the formatted value into the integer โ€œvalueโ€ part that can be @@ -7507,7 +9695,7 @@ function formatLocale(locale) { function formatPrefix(specifier, value) { var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), - e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3, + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3]; return function(value) { @@ -7521,113 +9709,73 @@ function formatLocale(locale) { }; } -var locale; +var locale$1; +exports.format = void 0; +exports.formatPrefix = void 0; -defaultLocale({ - decimal: ".", +defaultLocale$1({ thousands: ",", grouping: [3], - currency: ["$", ""], - minus: "-" + currency: ["$", ""] }); -function defaultLocale(definition) { - locale = formatLocale(definition); - exports.format = locale.format; - exports.formatPrefix = locale.formatPrefix; - return locale; +function defaultLocale$1(definition) { + locale$1 = formatLocale$1(definition); + exports.format = locale$1.format; + exports.formatPrefix = locale$1.formatPrefix; + return locale$1; } function precisionFixed(step) { - return Math.max(0, -exponent$1(Math.abs(step))); + return Math.max(0, -exponent(Math.abs(step))); } function precisionPrefix(step, value) { - return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step))); + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); } function precisionRound(step, max) { step = Math.abs(step), max = Math.abs(max) - step; - return Math.max(0, exponent$1(max) - exponent$1(step)) + 1; -} - -// Adds floating point numbers with twice the normal precision. -// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and -// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) -// 305โ€“363 (1997). -// Code adapted from GeographicLib by Charles F. F. Karney, -// http://geographiclib.sourceforge.net/ - -function adder() { - return new Adder; -} - -function Adder() { - this.reset(); -} - -Adder.prototype = { - constructor: Adder, - reset: function() { - this.s = // rounded value - this.t = 0; // exact error - }, - add: function(y) { - add$1(temp, y, this.t); - add$1(this, temp.s, this.s); - if (this.s) this.t += temp.t; - else this.s = temp.t; - }, - valueOf: function() { - return this.s; - } -}; - -var temp = new Adder; - -function add$1(adder, a, b) { - var x = adder.s = a + b, - bv = x - a, - av = x - bv; - adder.t = (a - av) + (b - bv); + return Math.max(0, exponent(max) - exponent(step)) + 1; } -var epsilon$2 = 1e-6; -var epsilon2$1 = 1e-12; -var pi$3 = Math.PI; -var halfPi$2 = pi$3 / 2; -var quarterPi = pi$3 / 4; -var tau$3 = pi$3 * 2; +var epsilon$1 = 1e-6; +var epsilon2 = 1e-12; +var pi$1 = Math.PI; +var halfPi$1 = pi$1 / 2; +var quarterPi = pi$1 / 4; +var tau$1 = pi$1 * 2; -var degrees$1 = 180 / pi$3; -var radians = pi$3 / 180; +var degrees = 180 / pi$1; +var radians = pi$1 / 180; -var abs = Math.abs; +var abs$1 = Math.abs; var atan = Math.atan; -var atan2 = Math.atan2; +var atan2$1 = Math.atan2; var cos$1 = Math.cos; var ceil = Math.ceil; var exp = Math.exp; -var log = Math.log; -var pow = Math.pow; +var hypot = Math.hypot; +var log$1 = Math.log; +var pow$1 = Math.pow; var sin$1 = Math.sin; -var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; -var sqrt = Math.sqrt; +var sign$1 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +var sqrt$2 = Math.sqrt; var tan = Math.tan; -function acos(x) { - return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x); +function acos$1(x) { + return x > 1 ? 0 : x < -1 ? pi$1 : Math.acos(x); } -function asin(x) { - return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x); +function asin$1(x) { + return x > 1 ? halfPi$1 : x < -1 ? -halfPi$1 : Math.asin(x); } function haversin(x) { return (x = sin$1(x / 2)) * x; } -function noop$2() {} +function noop$1() {} function streamGeometry(geometry, stream) { if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { @@ -7699,78 +9847,80 @@ function geoStream(object, stream) { } } -var areaRingSum = adder(); +var areaRingSum$1 = new Adder(); -var areaSum = adder(), - lambda00, - phi00, - lambda0, - cosPhi0, - sinPhi0; +// hello? -var areaStream = { - point: noop$2, - lineStart: noop$2, - lineEnd: noop$2, +var areaSum$1 = new Adder(), + lambda00$2, + phi00$2, + lambda0$2, + cosPhi0$1, + sinPhi0$1; + +var areaStream$1 = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, polygonStart: function() { - areaRingSum.reset(); - areaStream.lineStart = areaRingStart; - areaStream.lineEnd = areaRingEnd; + areaRingSum$1 = new Adder(); + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; }, polygonEnd: function() { - var areaRing = +areaRingSum; - areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing); - this.lineStart = this.lineEnd = this.point = noop$2; + var areaRing = +areaRingSum$1; + areaSum$1.add(areaRing < 0 ? tau$1 + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$1; }, sphere: function() { - areaSum.add(tau$3); + areaSum$1.add(tau$1); } }; -function areaRingStart() { - areaStream.point = areaPointFirst; +function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; } -function areaRingEnd() { - areaPoint(lambda00, phi00); +function areaRingEnd$1() { + areaPoint$1(lambda00$2, phi00$2); } -function areaPointFirst(lambda, phi) { - areaStream.point = areaPoint; - lambda00 = lambda, phi00 = phi; +function areaPointFirst$1(lambda, phi) { + areaStream$1.point = areaPoint$1; + lambda00$2 = lambda, phi00$2 = phi; lambda *= radians, phi *= radians; - lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi); + lambda0$2 = lambda, cosPhi0$1 = cos$1(phi = phi / 2 + quarterPi), sinPhi0$1 = sin$1(phi); } -function areaPoint(lambda, phi) { +function areaPoint$1(lambda, phi) { lambda *= radians, phi *= radians; phi = phi / 2 + quarterPi; // half the angular distance from south pole // Spherical excess E for a spherical triangle with vertices: south pole, // previous point, current point. Uses a formula derived from Cagnoliโ€™s // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). - var dLambda = lambda - lambda0, + var dLambda = lambda - lambda0$2, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos$1(phi), sinPhi = sin$1(phi), - k = sinPhi0 * sinPhi, - u = cosPhi0 * cosPhi + k * cos$1(adLambda), + k = sinPhi0$1 * sinPhi, + u = cosPhi0$1 * cosPhi + k * cos$1(adLambda), v = k * sdLambda * sin$1(adLambda); - areaRingSum.add(atan2(v, u)); + areaRingSum$1.add(atan2$1(v, u)); // Advance the previous points. - lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; + lambda0$2 = lambda, cosPhi0$1 = cosPhi, sinPhi0$1 = sinPhi; } -function area$1(object) { - areaSum.reset(); - geoStream(object, areaStream); - return areaSum * 2; +function area$2(object) { + areaSum$1 = new Adder(); + geoStream(object, areaStream$1); + return areaSum$1 * 2; } function spherical(cartesian) { - return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; + return [atan2$1(cartesian[1], cartesian[0]), asin$1(cartesian[2])]; } function cartesian(spherical) { @@ -7797,7 +9947,7 @@ function cartesianScale(vector, k) { // TODO return d function cartesianNormalizeInPlace(d) { - var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + var l = sqrt$2(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); d[0] /= l, d[1] /= l, d[2] /= l; } @@ -7805,29 +9955,29 @@ var lambda0$1, phi0, lambda1, phi1, // bounds lambda2, // previous lambda-coordinate lambda00$1, phi00$1, // first point p0, // previous 3D point - deltaSum = adder(), + deltaSum, ranges, range; -var boundsStream = { - point: boundsPoint, +var boundsStream$2 = { + point: boundsPoint$1, lineStart: boundsLineStart, lineEnd: boundsLineEnd, polygonStart: function() { - boundsStream.point = boundsRingPoint; - boundsStream.lineStart = boundsRingStart; - boundsStream.lineEnd = boundsRingEnd; - deltaSum.reset(); - areaStream.polygonStart(); + boundsStream$2.point = boundsRingPoint; + boundsStream$2.lineStart = boundsRingStart; + boundsStream$2.lineEnd = boundsRingEnd; + deltaSum = new Adder(); + areaStream$1.polygonStart(); }, polygonEnd: function() { - areaStream.polygonEnd(); - boundsStream.point = boundsPoint; - boundsStream.lineStart = boundsLineStart; - boundsStream.lineEnd = boundsLineEnd; - if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); - else if (deltaSum > epsilon$2) phi1 = 90; - else if (deltaSum < -epsilon$2) phi0 = -90; + areaStream$1.polygonEnd(); + boundsStream$2.point = boundsPoint$1; + boundsStream$2.lineStart = boundsLineStart; + boundsStream$2.lineEnd = boundsLineEnd; + if (areaRingSum$1 < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon$1) phi1 = 90; + else if (deltaSum < -epsilon$1) phi0 = -90; range[0] = lambda0$1, range[1] = lambda1; }, sphere: function() { @@ -7835,7 +9985,7 @@ var boundsStream = { } }; -function boundsPoint(lambda, phi) { +function boundsPoint$1(lambda, phi) { ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); if (phi < phi0) phi0 = phi; if (phi > phi1) phi1 = phi; @@ -7851,14 +10001,14 @@ function linePoint(lambda, phi) { inflection = spherical(inflection); var delta = lambda - lambda2, sign = delta > 0 ? 1 : -1, - lambdai = inflection[0] * degrees$1 * sign, + lambdai = inflection[0] * degrees * sign, phii, - antimeridian = abs(delta) > 180; + antimeridian = abs$1(delta) > 180; if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { - phii = inflection[1] * degrees$1; + phii = inflection[1] * degrees; if (phii > phi1) phi1 = phii; } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { - phii = -inflection[1] * degrees$1; + phii = -inflection[1] * degrees; if (phii < phi0) phi0 = phii; } else { if (phi < phi0) phi0 = phi; @@ -7891,34 +10041,34 @@ function linePoint(lambda, phi) { } function boundsLineStart() { - boundsStream.point = linePoint; + boundsStream$2.point = linePoint; } function boundsLineEnd() { range[0] = lambda0$1, range[1] = lambda1; - boundsStream.point = boundsPoint; + boundsStream$2.point = boundsPoint$1; p0 = null; } function boundsRingPoint(lambda, phi) { if (p0) { var delta = lambda - lambda2; - deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + deltaSum.add(abs$1(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); } else { lambda00$1 = lambda, phi00$1 = phi; } - areaStream.point(lambda, phi); + areaStream$1.point(lambda, phi); linePoint(lambda, phi); } function boundsRingStart() { - areaStream.lineStart(); + areaStream$1.lineStart(); } function boundsRingEnd() { boundsRingPoint(lambda00$1, phi00$1); - areaStream.lineEnd(); - if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180); + areaStream$1.lineEnd(); + if (abs$1(deltaSum) > epsilon$1) lambda0$1 = -(lambda1 = 180); range[0] = lambda0$1, range[1] = lambda1; p0 = null; } @@ -7943,7 +10093,7 @@ function bounds(feature) { phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); ranges = []; - geoStream(feature, boundsStream); + geoStream(feature, boundsStream$2); // First, sort ranges by their minimum longitudes. if (n = ranges.length) { @@ -7976,29 +10126,29 @@ function bounds(feature) { } var W0, W1, - X0, Y0, Z0, - X1, Y1, Z1, - X2, Y2, Z2, - lambda00$2, phi00$2, // first point - x0, y0, z0; // previous point + X0$1, Y0$1, Z0$1, + X1$1, Y1$1, Z1$1, + X2$1, Y2$1, Z2$1, + lambda00, phi00, // first point + x0$4, y0$4, z0; // previous point -var centroidStream = { - sphere: noop$2, - point: centroidPoint, - lineStart: centroidLineStart, - lineEnd: centroidLineEnd, +var centroidStream$1 = { + sphere: noop$1, + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, polygonStart: function() { - centroidStream.lineStart = centroidRingStart; - centroidStream.lineEnd = centroidRingEnd; + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; }, polygonEnd: function() { - centroidStream.lineStart = centroidLineStart; - centroidStream.lineEnd = centroidLineEnd; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; } }; // Arithmetic mean of Cartesian vectors. -function centroidPoint(lambda, phi) { +function centroidPoint$1(lambda, phi) { lambda *= radians, phi *= radians; var cosPhi = cos$1(phi); centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)); @@ -8006,23 +10156,23 @@ function centroidPoint(lambda, phi) { function centroidPointCartesian(x, y, z) { ++W0; - X0 += (x - X0) / W0; - Y0 += (y - Y0) / W0; - Z0 += (z - Z0) / W0; + X0$1 += (x - X0$1) / W0; + Y0$1 += (y - Y0$1) / W0; + Z0$1 += (z - Z0$1) / W0; } -function centroidLineStart() { - centroidStream.point = centroidLinePointFirst; +function centroidLineStart$1() { + centroidStream$1.point = centroidLinePointFirst; } function centroidLinePointFirst(lambda, phi) { lambda *= radians, phi *= radians; var cosPhi = cos$1(phi); - x0 = cosPhi * cos$1(lambda); - y0 = cosPhi * sin$1(lambda); + x0$4 = cosPhi * cos$1(lambda); + y0$4 = cosPhi * sin$1(lambda); z0 = sin$1(phi); - centroidStream.point = centroidLinePoint; - centroidPointCartesian(x0, y0, z0); + centroidStream$1.point = centroidLinePoint; + centroidPointCartesian(x0$4, y0$4, z0); } function centroidLinePoint(lambda, phi) { @@ -8031,38 +10181,38 @@ function centroidLinePoint(lambda, phi) { x = cosPhi * cos$1(lambda), y = cosPhi * sin$1(lambda), z = sin$1(phi), - w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + w = atan2$1(sqrt$2((w = y0$4 * z - z0 * y) * w + (w = z0 * x - x0$4 * z) * w + (w = x0$4 * y - y0$4 * x) * w), x0$4 * x + y0$4 * y + z0 * z); W1 += w; - X1 += w * (x0 + (x0 = x)); - Y1 += w * (y0 + (y0 = y)); - Z1 += w * (z0 + (z0 = z)); - centroidPointCartesian(x0, y0, z0); + X1$1 += w * (x0$4 + (x0$4 = x)); + Y1$1 += w * (y0$4 + (y0$4 = y)); + Z1$1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0$4, y0$4, z0); } -function centroidLineEnd() { - centroidStream.point = centroidPoint; +function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; } // See J. E. Brock, The Inertia Tensor for a Spherical Triangle, // J. Applied Mechanics 42, 239 (1975). -function centroidRingStart() { - centroidStream.point = centroidRingPointFirst; +function centroidRingStart$1() { + centroidStream$1.point = centroidRingPointFirst; } -function centroidRingEnd() { - centroidRingPoint(lambda00$2, phi00$2); - centroidStream.point = centroidPoint; +function centroidRingEnd$1() { + centroidRingPoint(lambda00, phi00); + centroidStream$1.point = centroidPoint$1; } function centroidRingPointFirst(lambda, phi) { - lambda00$2 = lambda, phi00$2 = phi; + lambda00 = lambda, phi00 = phi; lambda *= radians, phi *= radians; - centroidStream.point = centroidRingPoint; + centroidStream$1.point = centroidRingPoint; var cosPhi = cos$1(phi); - x0 = cosPhi * cos$1(lambda); - y0 = cosPhi * sin$1(lambda); + x0$4 = cosPhi * cos$1(lambda); + y0$4 = cosPhi * sin$1(lambda); z0 = sin$1(phi); - centroidPointCartesian(x0, y0, z0); + centroidPointCartesian(x0$4, y0$4, z0); } function centroidRingPoint(lambda, phi) { @@ -8071,48 +10221,50 @@ function centroidRingPoint(lambda, phi) { x = cosPhi * cos$1(lambda), y = cosPhi * sin$1(lambda), z = sin$1(phi), - cx = y0 * z - z0 * y, - cy = z0 * x - x0 * z, - cz = x0 * y - y0 * x, - m = sqrt(cx * cx + cy * cy + cz * cz), - w = asin(m), // line weight = angle + cx = y0$4 * z - z0 * y, + cy = z0 * x - x0$4 * z, + cz = x0$4 * y - y0$4 * x, + m = hypot(cx, cy, cz), + w = asin$1(m), // line weight = angle v = m && -w / m; // area weight multiplier - X2 += v * cx; - Y2 += v * cy; - Z2 += v * cz; + X2$1.add(v * cx); + Y2$1.add(v * cy); + Z2$1.add(v * cz); W1 += w; - X1 += w * (x0 + (x0 = x)); - Y1 += w * (y0 + (y0 = y)); - Z1 += w * (z0 + (z0 = z)); - centroidPointCartesian(x0, y0, z0); + X1$1 += w * (x0$4 + (x0$4 = x)); + Y1$1 += w * (y0$4 + (y0$4 = y)); + Z1$1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0$4, y0$4, z0); } -function centroid(object) { +function centroid$1(object) { W0 = W1 = - X0 = Y0 = Z0 = - X1 = Y1 = Z1 = - X2 = Y2 = Z2 = 0; - geoStream(object, centroidStream); - - var x = X2, - y = Y2, - z = Z2, - m = x * x + y * y + z * z; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = 0; + X2$1 = new Adder(); + Y2$1 = new Adder(); + Z2$1 = new Adder(); + geoStream(object, centroidStream$1); + + var x = +X2$1, + y = +Y2$1, + z = +Z2$1, + m = hypot(x, y, z); // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. - if (m < epsilon2$1) { - x = X1, y = Y1, z = Z1; + if (m < epsilon2) { + x = X1$1, y = Y1$1, z = Z1$1; // If the feature has zero length, fall back to arithmetic mean of point vectors. - if (W1 < epsilon$2) x = X0, y = Y0, z = Z0; - m = x * x + y * y + z * z; + if (W1 < epsilon$1) x = X0$1, y = Y0$1, z = Z0$1; + m = hypot(x, y, z); // If the feature still has an undefined ccentroid, then return. - if (m < epsilon2$1) return [NaN, NaN]; + if (m < epsilon2) return [NaN, NaN]; } - return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1]; + return [atan2$1(y, x) * degrees, asin$1(z / m) * degrees]; } -function constant$8(x) { +function constant$3(x) { return function() { return x; }; @@ -8132,13 +10284,13 @@ function compose(a, b) { } function rotationIdentity(lambda, phi) { - return [abs(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi]; + return [abs$1(lambda) > pi$1 ? lambda + Math.round(-lambda / tau$1) * tau$1 : lambda, phi]; } rotationIdentity.invert = rotationIdentity; function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { - return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + return (deltaLambda %= tau$1) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda)) : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity); @@ -8146,7 +10298,7 @@ function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { function forwardRotationLambda(deltaLambda) { return function(lambda, phi) { - return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi]; + return lambda += deltaLambda, [lambda > pi$1 ? lambda - tau$1 : lambda < -pi$1 ? lambda + tau$1 : lambda, phi]; }; } @@ -8169,8 +10321,8 @@ function rotationPhiGamma(deltaPhi, deltaGamma) { z = sin$1(phi), k = z * cosDeltaPhi + x * sinDeltaPhi; return [ - atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), - asin(k * cosDeltaGamma + y * sinDeltaGamma) + atan2$1(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin$1(k * cosDeltaGamma + y * sinDeltaGamma) ]; } @@ -8181,8 +10333,8 @@ function rotationPhiGamma(deltaPhi, deltaGamma) { z = sin$1(phi), k = z * cosDeltaGamma - y * sinDeltaGamma; return [ - atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), - asin(k * cosDeltaPhi - x * sinDeltaPhi) + atan2$1(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin$1(k * cosDeltaPhi - x * sinDeltaPhi) ]; }; @@ -8194,12 +10346,12 @@ function rotation(rotate) { function forward(coordinates) { coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); - return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; } forward.invert = function(coordinates) { coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); - return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; }; return forward; @@ -8212,12 +10364,12 @@ function circleStream(stream, radius, delta, direction, t0, t1) { sinRadius = sin$1(radius), step = direction * delta; if (t0 == null) { - t0 = radius + direction * tau$3; + t0 = radius + direction * tau$1; t1 = radius - step / 2; } else { t0 = circleRadius(cosRadius, t0); t1 = circleRadius(cosRadius, t1); - if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3; + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$1; } for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]); @@ -8229,21 +10381,21 @@ function circleStream(stream, radius, delta, direction, t0, t1) { function circleRadius(cosRadius, point) { point = cartesian(point), point[0] -= cosRadius; cartesianNormalizeInPlace(point); - var radius = acos(-point[1]); - return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3; + var radius = acos$1(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau$1 - epsilon$1) % tau$1; } -function circle() { - var center = constant$8([0, 0]), - radius = constant$8(90), - precision = constant$8(6), +function circle$2() { + var center = constant$3([0, 0]), + radius = constant$3(90), + precision = constant$3(6), ring, rotate, stream = {point: point}; function point(x, y) { ring.push(x = rotate(x, y)); - x[0] *= degrees$1, x[1] *= degrees$1; + x[0] *= degrees, x[1] *= degrees; } function circle() { @@ -8259,15 +10411,15 @@ function circle() { } circle.center = function(_) { - return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center; + return arguments.length ? (center = typeof _ === "function" ? _ : constant$3([+_[0], +_[1]]), circle) : center; }; circle.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius; + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$3(+_), circle) : radius; }; circle.precision = function(_) { - return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision; + return arguments.length ? (precision = typeof _ === "function" ? _ : constant$3(+_), circle) : precision; }; return circle; @@ -8277,13 +10429,13 @@ function clipBuffer() { var lines = [], line; return { - point: function(x, y) { - line.push([x, y]); + point: function(x, y, m) { + line.push([x, y, m]); }, lineStart: function() { lines.push(line = []); }, - lineEnd: noop$2, + lineEnd: noop$1, rejoin: function() { if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); }, @@ -8297,7 +10449,7 @@ function clipBuffer() { } function pointEqual(a, b) { - return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2; + return abs$1(a[0] - b[0]) < epsilon$1 && abs$1(a[1] - b[1]) < epsilon$1; } function Intersection(point, points, other, entry) { @@ -8322,14 +10474,15 @@ function clipRejoin(segments, compareIntersection, startInside, interpolate, str if ((n = segment.length - 1) <= 0) return; var n, p0 = segment[0], p1 = segment[n], x; - // If the first and last points of a segment are coincident, then treat as a - // closed ring. TODO if all rings are closed, then the winding order of the - // exterior ring should be checked. if (pointEqual(p0, p1)) { - stream.lineStart(); - for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); - stream.lineEnd(); - return; + if (!p0[2] && !p1[2]) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + // handle degenerate cases by moving the point + p1[0] += 2 * epsilon$1; } subject.push(x = new Intersection(p0, segment, null, true)); @@ -8400,13 +10553,8 @@ function link$1(array) { b.p = a; } -var sum$1 = adder(); - function longitude(point) { - if (abs(point[0]) <= pi$3) - return point[0]; - else - return sign(point[0]) * ((abs(point[0]) + pi$3) % tau$3 - pi$3); + return abs$1(point[0]) <= pi$1 ? point[0] : sign$1(point[0]) * ((abs$1(point[0]) + pi$1) % tau$1 - pi$1); } function polygonContains(polygon, point) { @@ -8417,10 +10565,10 @@ function polygonContains(polygon, point) { angle = 0, winding = 0; - sum$1.reset(); + var sum = new Adder(); - if (sinPhi === 1) phi = halfPi$2 + epsilon$2; - else if (sinPhi === -1) phi = -halfPi$2 - epsilon$2; + if (sinPhi === 1) phi = halfPi$1 + epsilon$1; + else if (sinPhi === -1) phi = -halfPi$1 - epsilon$1; for (var i = 0, n = polygon.length; i < n; ++i) { if (!(m = (ring = polygon[i]).length)) continue; @@ -8441,11 +10589,11 @@ function polygonContains(polygon, point) { delta = lambda1 - lambda0, sign = delta >= 0 ? 1 : -1, absDelta = sign * delta, - antimeridian = absDelta > pi$3, + antimeridian = absDelta > pi$1, k = sinPhi0 * sinPhi1; - sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); - angle += antimeridian ? delta + sign * tau$3 : delta; + sum.add(atan2$1(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); + angle += antimeridian ? delta + sign * tau$1 : delta; // Are the longitudes either side of the pointโ€™s meridian (lambda), // and are the latitudes smaller than the parallel (phi)? @@ -8454,7 +10602,7 @@ function polygonContains(polygon, point) { cartesianNormalizeInPlace(arc); var intersection = cartesianCross(normal, arc); cartesianNormalizeInPlace(intersection); - var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection[2]); if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { winding += antimeridian ^ delta >= 0 ? 1 : -1; } @@ -8473,7 +10621,7 @@ function polygonContains(polygon, point) { // from the point to the South pole. If it is zero, then the point is the // same side as the South pole. - return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1); + return (angle < -epsilon$1 || angle < epsilon$1 && sum < -epsilon2) ^ (winding & 1); } function clip(pointVisible, clipLine, interpolate, start) { @@ -8598,15 +10746,15 @@ function validSegment(segment) { // Intersections are sorted along the clip edge. For both antimeridian cutting // and circle clipping, the same comparison is used. function compareIntersection(a, b) { - return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1]) - - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]); + return ((a = a.x)[0] < 0 ? a[1] - halfPi$1 - epsilon$1 : halfPi$1 - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi$1 - epsilon$1 : halfPi$1 - b[1]); } var clipAntimeridian = clip( function() { return true; }, clipAntimeridianLine, clipAntimeridianInterpolate, - [-pi$3, -halfPi$2] + [-pi$1, -halfPi$1] ); // Takes a line and cuts into visible segments. Return values: 0 - there were @@ -8624,19 +10772,19 @@ function clipAntimeridianLine(stream) { clean = 1; }, point: function(lambda1, phi1) { - var sign1 = lambda1 > 0 ? pi$3 : -pi$3, - delta = abs(lambda1 - lambda0); - if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole - stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2); + var sign1 = lambda1 > 0 ? pi$1 : -pi$1, + delta = abs$1(lambda1 - lambda0); + if (abs$1(delta - pi$1) < epsilon$1) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$1 : -halfPi$1); stream.point(sign0, phi0); stream.lineEnd(); stream.lineStart(); stream.point(sign1, phi0); stream.point(lambda1, phi0); clean = 0; - } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian - if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies - if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2; + } else if (sign0 !== sign1 && delta >= pi$1) { // line crosses antimeridian + if (abs$1(lambda0 - sign0) < epsilon$1) lambda0 -= sign0 * epsilon$1; // handle degeneracies + if (abs$1(lambda1 - sign1) < epsilon$1) lambda1 -= sign1 * epsilon$1; phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); stream.point(sign0, phi0); stream.lineEnd(); @@ -8661,7 +10809,7 @@ function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { var cosPhi0, cosPhi1, sinLambda0Lambda1 = sin$1(lambda0 - lambda1); - return abs(sinLambda0Lambda1) > epsilon$2 + return abs$1(sinLambda0Lambda1) > epsilon$1 ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1) - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) @@ -8671,18 +10819,18 @@ function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { function clipAntimeridianInterpolate(from, to, direction, stream) { var phi; if (from == null) { - phi = direction * halfPi$2; - stream.point(-pi$3, phi); + phi = direction * halfPi$1; + stream.point(-pi$1, phi); stream.point(0, phi); - stream.point(pi$3, phi); - stream.point(pi$3, 0); - stream.point(pi$3, -phi); + stream.point(pi$1, phi); + stream.point(pi$1, 0); + stream.point(pi$1, -phi); stream.point(0, -phi); - stream.point(-pi$3, -phi); - stream.point(-pi$3, 0); - stream.point(-pi$3, phi); - } else if (abs(from[0] - to[0]) > epsilon$2) { - var lambda = from[0] < to[0] ? pi$3 : -pi$3; + stream.point(-pi$1, -phi); + stream.point(-pi$1, 0); + stream.point(-pi$1, phi); + } else if (abs$1(from[0] - to[0]) > epsilon$1) { + var lambda = from[0] < to[0] ? pi$1 : -pi$1; phi = direction * lambda / 2; stream.point(-lambda, phi); stream.point(0, phi); @@ -8696,7 +10844,7 @@ function clipCircle(radius) { var cr = cos$1(radius), delta = 6 * radians, smallRadius = cr > 0, - notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case + notHemisphere = abs$1(cr) > epsilon$1; // TODO optimise for this common case function interpolate(from, to, direction, stream) { circleStream(stream, radius, delta, direction, from, to); @@ -8727,17 +10875,12 @@ function clipCircle(radius) { v = visible(lambda, phi), c = smallRadius ? v ? 0 : code(lambda, phi) - : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0; + : v ? code(lambda + (lambda < 0 ? pi$1 : -pi$1), phi) : 0; if (!point0 && (v00 = v0 = v)) stream.lineStart(); - // Handle degeneracies. - // TODO ignore if not clipping polygons. if (v !== v0) { point2 = intersect(point0, point1); - if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { - point1[0] += epsilon$2; - point1[1] += epsilon$2; - v = visible(point1[0], point1[1]); - } + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) + point1[2] = 1; } if (v !== v0) { clean = 0; @@ -8749,7 +10892,7 @@ function clipCircle(radius) { } else { // inside going out point2 = intersect(point0, point1); - stream.point(point2[0], point2[1]); + stream.point(point2[0], point2[1], 2); stream.lineEnd(); } point0 = point2; @@ -8768,7 +10911,7 @@ function clipCircle(radius) { stream.point(t[1][0], t[1][1]); stream.lineEnd(); stream.lineStart(); - stream.point(t[0][0], t[0][1]); + stream.point(t[0][0], t[0][1], 3); } } } @@ -8820,7 +10963,7 @@ function clipCircle(radius) { if (t2 < 0) return; - var t = sqrt(t2), + var t = sqrt$2(t2), q = cartesianScale(u, (-w - t) / uu); cartesianAddInPlace(q, A); q = spherical(q); @@ -8837,17 +10980,17 @@ function clipCircle(radius) { if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; var delta = lambda1 - lambda0, - polar = abs(delta - pi$3) < epsilon$2, - meridian = polar || delta < epsilon$2; + polar = abs$1(delta - pi$1) < epsilon$1, + meridian = polar || delta < epsilon$1; if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; // Check that the first point is between a and b. if (meridian ? polar - ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1) + ? phi0 + phi1 > 0 ^ q[1] < (abs$1(q[0] - lambda0) < epsilon$1 ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 - : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + : delta > pi$1 ^ (lambda0 <= q[0] && q[0] <= lambda1)) { var q1 = cartesianScale(u, (-w + t) / uu); cartesianAddInPlace(q1, A); return [q, spherical(q1)]; @@ -8857,7 +11000,7 @@ function clipCircle(radius) { // Generates a 4-bit vector representing the location of a point relative to // the small circle's bounding box. function code(lambda, phi) { - var r = smallRadius ? radius : pi$3 - radius, + var r = smallRadius ? radius : pi$1 - radius, code = 0; if (lambda < -r) code |= 1; // left else if (lambda > r) code |= 2; // right @@ -8866,7 +11009,7 @@ function clipCircle(radius) { return code; } - return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]); + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$1, radius - pi$1]); } function clipLine(a, b, x0, y0, x1, y1) { @@ -8953,9 +11096,9 @@ function clipRectangle(x0, y0, x1, y1) { } function corner(p, direction) { - return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3 - : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1 - : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0 + return abs$1(p[0] - x0) < epsilon$1 ? direction > 0 ? 0 : 3 + : abs$1(p[0] - x1) < epsilon$1 ? direction > 0 ? 2 : 1 + : abs$1(p[1] - y0) < epsilon$1 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon } @@ -9092,7 +11235,7 @@ function clipRectangle(x0, y0, x1, y1) { }; } -function extent$1() { +function extent() { var x0 = 0, y0 = 0, x1 = 960, @@ -9111,62 +11254,62 @@ function extent$1() { }; } -var lengthSum = adder(), - lambda0$2, - sinPhi0$1, - cosPhi0$1; +var lengthSum$1, + lambda0, + sinPhi0, + cosPhi0; -var lengthStream = { - sphere: noop$2, - point: noop$2, +var lengthStream$1 = { + sphere: noop$1, + point: noop$1, lineStart: lengthLineStart, - lineEnd: noop$2, - polygonStart: noop$2, - polygonEnd: noop$2 + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1 }; function lengthLineStart() { - lengthStream.point = lengthPointFirst; - lengthStream.lineEnd = lengthLineEnd; + lengthStream$1.point = lengthPointFirst$1; + lengthStream$1.lineEnd = lengthLineEnd; } function lengthLineEnd() { - lengthStream.point = lengthStream.lineEnd = noop$2; + lengthStream$1.point = lengthStream$1.lineEnd = noop$1; } -function lengthPointFirst(lambda, phi) { +function lengthPointFirst$1(lambda, phi) { lambda *= radians, phi *= radians; - lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi); - lengthStream.point = lengthPoint; + lambda0 = lambda, sinPhi0 = sin$1(phi), cosPhi0 = cos$1(phi); + lengthStream$1.point = lengthPoint$1; } -function lengthPoint(lambda, phi) { +function lengthPoint$1(lambda, phi) { lambda *= radians, phi *= radians; var sinPhi = sin$1(phi), cosPhi = cos$1(phi), - delta = abs(lambda - lambda0$2), + delta = abs$1(lambda - lambda0), cosDelta = cos$1(delta), sinDelta = sin$1(delta), x = cosPhi * sinDelta, - y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, - z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; - lengthSum.add(atan2(sqrt(x * x + y * y), z)); - lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; + y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta, + z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta; + lengthSum$1.add(atan2$1(sqrt$2(x * x + y * y), z)); + lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi; } function length$1(object) { - lengthSum.reset(); - geoStream(object, lengthStream); - return +lengthSum; + lengthSum$1 = new Adder(); + geoStream(object, lengthStream$1); + return +lengthSum$1; } var coordinates = [null, null], - object$1 = {type: "LineString", coordinates: coordinates}; + object = {type: "LineString", coordinates: coordinates}; function distance(a, b) { coordinates[0] = a; coordinates[1] = b; - return length$1(object$1); + return length$1(object); } var containsObjectType = { @@ -9236,7 +11379,7 @@ function containsLine(coordinates, point) { ab > 0 && ao <= ab && bo <= ab && - (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2$1 * ab + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab ) return true; } @@ -9264,12 +11407,12 @@ function contains$1(object, point) { } function graticuleX(y0, y1, dy) { - var y = sequence(y0, y1 - epsilon$2, dy).concat(y1); + var y = range$2(y0, y1 - epsilon$1, dy).concat(y1); return function(x) { return y.map(function(y) { return [x, y]; }); }; } function graticuleY(x0, x1, dx) { - var x = sequence(x0, x1 - epsilon$2, dx).concat(x1); + var x = range$2(x0, x1 - epsilon$1, dx).concat(x1); return function(y) { return x.map(function(x) { return [x, y]; }); }; } @@ -9285,10 +11428,10 @@ function graticule() { } function lines() { - return sequence(ceil(X0 / DX) * DX, X1, DX).map(X) - .concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) - .concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x)) - .concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y)); + return range$2(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(range$2(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(range$2(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs$1(x % DX) > epsilon$1; }).map(x)) + .concat(range$2(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs$1(y % DY) > epsilon$1; }).map(y)); } graticule.lines = function() { @@ -9358,15 +11501,15 @@ function graticule() { }; return graticule - .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]]) - .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]); + .extentMajor([[-180, -90 + epsilon$1], [180, 90 - epsilon$1]]) + .extentMinor([[-180, -80 - epsilon$1], [180, 80 + epsilon$1]]); } function graticule10() { return graticule()(); } -function interpolate$1(a, b) { +function interpolate(a, b) { var x0 = a[0] * radians, y0 = a[1] * radians, x1 = b[0] * radians, @@ -9379,7 +11522,7 @@ function interpolate$1(a, b) { ky0 = cy0 * sin$1(x0), kx1 = cy1 * cos$1(x1), ky1 = cy1 * sin$1(x1), - d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + d = 2 * asin$1(sqrt$2(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), k = sin$1(d); var interpolate = d ? function(t) { @@ -9389,11 +11532,11 @@ function interpolate$1(a, b) { y = A * ky0 + B * ky1, z = A * sy0 + B * sy1; return [ - atan2(y, x) * degrees$1, - atan2(z, sqrt(x * x + y * y)) * degrees$1 + atan2$1(y, x) * degrees, + atan2$1(z, sqrt$2(x * x + y * y)) * degrees ]; } : function() { - return [x0 * degrees$1, y0 * degrees$1]; + return [x0 * degrees, y0 * degrees]; }; interpolate.distance = d; @@ -9401,66 +11544,66 @@ function interpolate$1(a, b) { return interpolate; } -function identity$4(x) { - return x; -} +var identity$5 = x => x; -var areaSum$1 = adder(), - areaRingSum$1 = adder(), - x00, - y00, - x0$1, - y0$1; +var areaSum = new Adder(), + areaRingSum = new Adder(), + x00$2, + y00$2, + x0$3, + y0$3; -var areaStream$1 = { - point: noop$2, - lineStart: noop$2, - lineEnd: noop$2, +var areaStream = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, polygonStart: function() { - areaStream$1.lineStart = areaRingStart$1; - areaStream$1.lineEnd = areaRingEnd$1; + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; }, polygonEnd: function() { - areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$2; - areaSum$1.add(abs(areaRingSum$1)); - areaRingSum$1.reset(); + areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$1; + areaSum.add(abs$1(areaRingSum)); + areaRingSum = new Adder(); }, result: function() { - var area = areaSum$1 / 2; - areaSum$1.reset(); + var area = areaSum / 2; + areaSum = new Adder(); return area; } }; -function areaRingStart$1() { - areaStream$1.point = areaPointFirst$1; +function areaRingStart() { + areaStream.point = areaPointFirst; } -function areaPointFirst$1(x, y) { - areaStream$1.point = areaPoint$1; - x00 = x0$1 = x, y00 = y0$1 = y; +function areaPointFirst(x, y) { + areaStream.point = areaPoint; + x00$2 = x0$3 = x, y00$2 = y0$3 = y; } -function areaPoint$1(x, y) { - areaRingSum$1.add(y0$1 * x - x0$1 * y); - x0$1 = x, y0$1 = y; +function areaPoint(x, y) { + areaRingSum.add(y0$3 * x - x0$3 * y); + x0$3 = x, y0$3 = y; } -function areaRingEnd$1() { - areaPoint$1(x00, y00); +function areaRingEnd() { + areaPoint(x00$2, y00$2); } +var pathArea = areaStream; + var x0$2 = Infinity, y0$2 = x0$2, x1 = -x0$2, y1 = x1; -var boundsStream$1 = { - point: boundsPoint$1, - lineStart: noop$2, - lineEnd: noop$2, - polygonStart: noop$2, - polygonEnd: noop$2, +var boundsStream = { + point: boundsPoint, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1, result: function() { var bounds = [[x0$2, y0$2], [x1, y1]]; x1 = y1 = -(y0$2 = x0$2 = Infinity); @@ -9468,110 +11611,114 @@ var boundsStream$1 = { } }; -function boundsPoint$1(x, y) { +function boundsPoint(x, y) { if (x < x0$2) x0$2 = x; if (x > x1) x1 = x; if (y < y0$2) y0$2 = y; if (y > y1) y1 = y; } +var boundsStream$1 = boundsStream; + // TODO Enforce positive area for exterior, negative area for interior? -var X0$1 = 0, - Y0$1 = 0, - Z0$1 = 0, - X1$1 = 0, - Y1$1 = 0, - Z1$1 = 0, - X2$1 = 0, - Y2$1 = 0, - Z2$1 = 0, +var X0 = 0, + Y0 = 0, + Z0 = 0, + X1 = 0, + Y1 = 0, + Z1 = 0, + X2 = 0, + Y2 = 0, + Z2 = 0, x00$1, y00$1, - x0$3, - y0$3; + x0$1, + y0$1; -var centroidStream$1 = { - point: centroidPoint$1, - lineStart: centroidLineStart$1, - lineEnd: centroidLineEnd$1, +var centroidStream = { + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, polygonStart: function() { - centroidStream$1.lineStart = centroidRingStart$1; - centroidStream$1.lineEnd = centroidRingEnd$1; + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; }, polygonEnd: function() { - centroidStream$1.point = centroidPoint$1; - centroidStream$1.lineStart = centroidLineStart$1; - centroidStream$1.lineEnd = centroidLineEnd$1; + centroidStream.point = centroidPoint; + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; }, result: function() { - var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] - : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] - : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + var centroid = Z2 ? [X2 / Z2, Y2 / Z2] + : Z1 ? [X1 / Z1, Y1 / Z1] + : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN]; - X0$1 = Y0$1 = Z0$1 = - X1$1 = Y1$1 = Z1$1 = - X2$1 = Y2$1 = Z2$1 = 0; + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; return centroid; } }; -function centroidPoint$1(x, y) { - X0$1 += x; - Y0$1 += y; - ++Z0$1; +function centroidPoint(x, y) { + X0 += x; + Y0 += y; + ++Z0; } -function centroidLineStart$1() { - centroidStream$1.point = centroidPointFirstLine; +function centroidLineStart() { + centroidStream.point = centroidPointFirstLine; } function centroidPointFirstLine(x, y) { - centroidStream$1.point = centroidPointLine; - centroidPoint$1(x0$3 = x, y0$3 = y); + centroidStream.point = centroidPointLine; + centroidPoint(x0$1 = x, y0$1 = y); } function centroidPointLine(x, y) { - var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); - X1$1 += z * (x0$3 + x) / 2; - Y1$1 += z * (y0$3 + y) / 2; - Z1$1 += z; - centroidPoint$1(x0$3 = x, y0$3 = y); + var dx = x - x0$1, dy = y - y0$1, z = sqrt$2(dx * dx + dy * dy); + X1 += z * (x0$1 + x) / 2; + Y1 += z * (y0$1 + y) / 2; + Z1 += z; + centroidPoint(x0$1 = x, y0$1 = y); } -function centroidLineEnd$1() { - centroidStream$1.point = centroidPoint$1; +function centroidLineEnd() { + centroidStream.point = centroidPoint; } -function centroidRingStart$1() { - centroidStream$1.point = centroidPointFirstRing; +function centroidRingStart() { + centroidStream.point = centroidPointFirstRing; } -function centroidRingEnd$1() { +function centroidRingEnd() { centroidPointRing(x00$1, y00$1); } function centroidPointFirstRing(x, y) { - centroidStream$1.point = centroidPointRing; - centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); + centroidStream.point = centroidPointRing; + centroidPoint(x00$1 = x0$1 = x, y00$1 = y0$1 = y); } function centroidPointRing(x, y) { - var dx = x - x0$3, - dy = y - y0$3, - z = sqrt(dx * dx + dy * dy); + var dx = x - x0$1, + dy = y - y0$1, + z = sqrt$2(dx * dx + dy * dy); - X1$1 += z * (x0$3 + x) / 2; - Y1$1 += z * (y0$3 + y) / 2; - Z1$1 += z; + X1 += z * (x0$1 + x) / 2; + Y1 += z * (y0$1 + y) / 2; + Z1 += z; - z = y0$3 * x - x0$3 * y; - X2$1 += z * (x0$3 + x); - Y2$1 += z * (y0$3 + y); - Z2$1 += z * 3; - centroidPoint$1(x0$3 = x, y0$3 = y); + z = y0$1 * x - x0$1 * y; + X2 += z * (x0$1 + x); + Y2 += z * (y0$1 + y); + Z2 += z * 3; + centroidPoint(x0$1 = x, y0$1 = y); } +var pathCentroid = centroidStream; + function PathContext(context) { this._context = context; } @@ -9607,29 +11754,29 @@ PathContext.prototype = { } default: { this._context.moveTo(x + this._radius, y); - this._context.arc(x, y, this._radius, 0, tau$3); + this._context.arc(x, y, this._radius, 0, tau$1); break; } } }, - result: noop$2 + result: noop$1 }; -var lengthSum$1 = adder(), +var lengthSum = new Adder(), lengthRing, - x00$2, - y00$2, - x0$4, - y0$4; + x00, + y00, + x0, + y0; -var lengthStream$1 = { - point: noop$2, +var lengthStream = { + point: noop$1, lineStart: function() { - lengthStream$1.point = lengthPointFirst$1; + lengthStream.point = lengthPointFirst; }, lineEnd: function() { - if (lengthRing) lengthPoint$1(x00$2, y00$2); - lengthStream$1.point = noop$2; + if (lengthRing) lengthPoint(x00, y00); + lengthStream.point = noop$1; }, polygonStart: function() { lengthRing = true; @@ -9638,23 +11785,25 @@ var lengthStream$1 = { lengthRing = null; }, result: function() { - var length = +lengthSum$1; - lengthSum$1.reset(); + var length = +lengthSum; + lengthSum = new Adder(); return length; } }; -function lengthPointFirst$1(x, y) { - lengthStream$1.point = lengthPoint$1; - x00$2 = x0$4 = x, y00$2 = y0$4 = y; +function lengthPointFirst(x, y) { + lengthStream.point = lengthPoint; + x00 = x0 = x, y00 = y0 = y; } -function lengthPoint$1(x, y) { - x0$4 -= x, y0$4 -= y; - lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); - x0$4 = x, y0$4 = y; +function lengthPoint(x, y) { + x0 -= x, y0 -= y; + lengthSum.add(sqrt$2(x0 * x0 + y0 * y0)); + x0 = x, y0 = y; } +var pathMeasure = lengthStream; + function PathString() { this._string = []; } @@ -9715,7 +11864,7 @@ function circle$1(radius) { + "z"; } -function index$1(projection, context) { +function index$2(projection, context) { var pointRadius = 4.5, projectionStream, contextStream; @@ -9729,13 +11878,13 @@ function index$1(projection, context) { } path.area = function(object) { - geoStream(object, projectionStream(areaStream$1)); - return areaStream$1.result(); + geoStream(object, projectionStream(pathArea)); + return pathArea.result(); }; path.measure = function(object) { - geoStream(object, projectionStream(lengthStream$1)); - return lengthStream$1.result(); + geoStream(object, projectionStream(pathMeasure)); + return pathMeasure.result(); }; path.bounds = function(object) { @@ -9744,12 +11893,12 @@ function index$1(projection, context) { }; path.centroid = function(object) { - geoStream(object, projectionStream(centroidStream$1)); - return centroidStream$1.result(); + geoStream(object, projectionStream(pathCentroid)); + return pathCentroid.result(); }; path.projection = function(_) { - return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection; + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$5) : (projection = _).stream, path) : projection; }; path.context = function(_) { @@ -9768,13 +11917,13 @@ function index$1(projection, context) { return path.projection(projection).context(context); } -function transform(methods) { +function transform$1(methods) { return { - stream: transformer(methods) + stream: transformer$3(methods) }; } -function transformer(methods) { +function transformer$3(methods) { return function(stream) { var s = new TransformStream; for (var key in methods) s[key] = methods[key]; @@ -9848,7 +11997,7 @@ function resample(project, delta2) { } function resampleNone(project) { - return transformer({ + return transformer$3({ point: function(x, y) { x = project(x, y); this.stream.point(x[0], x[1]); @@ -9866,9 +12015,9 @@ function resample$1(project, delta2) { var a = a0 + a1, b = b0 + b1, c = c0 + c1, - m = sqrt(a * a + b * b + c * c), - phi2 = asin(c /= m), - lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a), + m = sqrt$2(a * a + b * b + c * c), + phi2 = asin$1(c /= m), + lambda2 = abs$1(abs$1(c) - 1) < epsilon$1 || abs$1(lambda0 - lambda1) < epsilon$1 ? (lambda0 + lambda1) / 2 : atan2$1(b, a), p = project(lambda2, phi2), x2 = p[0], y2 = p[1], @@ -9876,7 +12025,7 @@ function resample$1(project, delta2) { dy2 = y2 - y0, dz = dy * dx2 - dx * dy2; if (dz * dz / d2 > delta2 // perpendicular projected distance - || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || abs$1((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); stream.point(x2, y2); @@ -9939,14 +12088,14 @@ function resample$1(project, delta2) { }; } -var transformRadians = transformer({ +var transformRadians = transformer$3({ point: function(x, y) { this.stream.point(x * radians, y * radians); } }); function transformRotate(rotate) { - return transformer({ + return transformer$3({ point: function(x, y) { var r = rotate(x, y); return this.stream.point(r[0], r[1]); @@ -9954,17 +12103,19 @@ function transformRotate(rotate) { }); } -function scaleTranslate(k, dx, dy) { +function scaleTranslate(k, dx, dy, sx, sy) { function transform(x, y) { + x *= sx; y *= sy; return [dx + k * x, dy - k * y]; } transform.invert = function(x, y) { - return [(x - dx) / k, (dy - y) / k]; + return [(x - dx) / k * sx, (dy - y) / k * sy]; }; return transform; } -function scaleTranslateRotate(k, dx, dy, alpha) { +function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + if (!alpha) return scaleTranslate(k, dx, dy, sx, sy); var cosAlpha = cos$1(alpha), sinAlpha = sin$1(alpha), a = cosAlpha * k, @@ -9974,10 +12125,11 @@ function scaleTranslateRotate(k, dx, dy, alpha) { ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k; function transform(x, y) { + x *= sx; y *= sy; return [a * x - b * y + dx, dy - b * x - a * y]; } transform.invert = function(x, y) { - return [ai * x - bi * y + ci, fi - bi * x - ai * y]; + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; }; return transform; } @@ -9992,9 +12144,11 @@ function projectionMutator(projectAt) { x = 480, y = 250, // translate lambda = 0, phi = 0, // center deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate - alpha = 0, // post-rotate + alpha = 0, // post-rotate angle + sx = 1, // reflectX + sy = 1, // reflectX theta = null, preclip = clipAntimeridian, // pre-clip angle - x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent + x0 = null, y0, x1, y1, postclip = identity$5, // post-clip extent delta2 = 0.5, // precision projectResample, projectTransform, @@ -10008,7 +12162,7 @@ function projectionMutator(projectAt) { function invert(point) { point = projectRotateTransform.invert(point[0], point[1]); - return point && [point[0] * degrees$1, point[1] * degrees$1]; + return point && [point[0] * degrees, point[1] * degrees]; } projection.stream = function(stream) { @@ -10024,11 +12178,11 @@ function projectionMutator(projectAt) { }; projection.clipAngle = function(_) { - return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1; + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; }; projection.clipExtent = function(_) { - return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$5) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; }; projection.scale = function(_) { @@ -10040,19 +12194,27 @@ function projectionMutator(projectAt) { }; projection.center = function(_) { - return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1]; + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; }; projection.rotate = function(_) { - return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1]; + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; }; projection.angle = function(_) { - return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1; + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + }; + + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; }; projection.precision = function(_) { - return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt$2(delta2); }; projection.fitExtent = function(extent, object) { @@ -10072,8 +12234,8 @@ function projectionMutator(projectAt) { }; function recenter() { - var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)), - transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha); + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); projectTransform = compose(project, transform); projectRotateTransform = compose(rotate, projectTransform); @@ -10095,12 +12257,12 @@ function projectionMutator(projectAt) { function conicProjection(projectAt) { var phi0 = 0, - phi1 = pi$3 / 3, + phi1 = pi$1 / 3, m = projectionMutator(projectAt), p = m(phi0, phi1); p.parallels = function(_) { - return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1]; + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; }; return p; @@ -10114,7 +12276,7 @@ function cylindricalEqualAreaRaw(phi0) { } forward.invert = function(x, y) { - return [x / cosPhi0, asin(y * cosPhi0)]; + return [x / cosPhi0, asin$1(y * cosPhi0)]; }; return forward; @@ -10124,18 +12286,21 @@ function conicEqualAreaRaw(y0, y1) { var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2; // Are the parallels symmetrical around the Equator? - if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0); + if (abs$1(n) < epsilon$1) return cylindricalEqualAreaRaw(y0); - var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt$2(c) / n; function project(x, y) { - var r = sqrt(c - 2 * n * sin$1(y)) / n; + var r = sqrt$2(c - 2 * n * sin$1(y)) / n; return [r * sin$1(x *= n), r0 - r * cos$1(x)]; } project.invert = function(x, y) { - var r0y = r0 - y; - return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + var r0y = r0 - y, + l = atan2$1(x, abs$1(r0y)) * sign$1(r0y); + if (r0y * n < 0) + l -= pi$1 * sign$1(x) * sign$1(r0y); + return [l / n, asin$1((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; }; return project; @@ -10228,12 +12393,12 @@ function albersUsa() { alaskaPoint = alaska .translate([x - 0.307 * k, y + 0.201 * k]) - .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .clipExtent([[x - 0.425 * k + epsilon$1, y + 0.120 * k + epsilon$1], [x - 0.214 * k - epsilon$1, y + 0.234 * k - epsilon$1]]) .stream(pointStream); hawaiiPoint = hawaii .translate([x - 0.205 * k, y + 0.212 * k]) - .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .clipExtent([[x - 0.214 * k + epsilon$1, y + 0.166 * k + epsilon$1], [x - 0.115 * k - epsilon$1, y + 0.234 * k - epsilon$1]]) .stream(pointStream); return reset(); @@ -10268,6 +12433,7 @@ function azimuthalRaw(scale) { var cx = cos$1(x), cy = cos$1(y), k = scale(cx * cy); + if (k === Infinity) return [2, 0]; return [ k * cy * sin$1(x), k * sin$1(y) @@ -10277,23 +12443,23 @@ function azimuthalRaw(scale) { function azimuthalInvert(angle) { return function(x, y) { - var z = sqrt(x * x + y * y), + var z = sqrt$2(x * x + y * y), c = angle(z), sc = sin$1(c), cc = cos$1(c); return [ - atan2(x * sc, z * cc), - asin(z && y * sc / z) + atan2$1(x * sc, z * cc), + asin$1(z && y * sc / z) ]; } } var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { - return sqrt(2 / (1 + cxcy)); + return sqrt$2(2 / (1 + cxcy)); }); azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { - return 2 * asin(z / 2); + return 2 * asin$1(z / 2); }); function azimuthalEqualArea() { @@ -10303,7 +12469,7 @@ function azimuthalEqualArea() { } var azimuthalEquidistantRaw = azimuthalRaw(function(c) { - return (c = acos(c)) && c / sin$1(c); + return (c = acos$1(c)) && c / sin$1(c); }); azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { @@ -10317,16 +12483,16 @@ function azimuthalEquidistant() { } function mercatorRaw(lambda, phi) { - return [lambda, log(tan((halfPi$2 + phi) / 2))]; + return [lambda, log$1(tan((halfPi$1 + phi) / 2))]; } mercatorRaw.invert = function(x, y) { - return [x, 2 * atan(exp(y)) - halfPi$2]; + return [x, 2 * atan(exp(y)) - halfPi$1]; }; function mercator() { return mercatorProjection(mercatorRaw) - .scale(961 / tau$3); + .scale(961 / tau$1); } function mercatorProjection(project) { @@ -10354,7 +12520,7 @@ function mercatorProjection(project) { }; function reclip() { - var k = pi$3 * scale(), + var k = pi$1 * scale(), t = m(rotation(m.rotate()).invert([0, 0])); return clipExtent(x0 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw @@ -10366,26 +12532,29 @@ function mercatorProjection(project) { } function tany(y) { - return tan((halfPi$2 + y) / 2); + return tan((halfPi$1 + y) / 2); } function conicConformalRaw(y0, y1) { var cy0 = cos$1(y0), - n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)), - f = cy0 * pow(tany(y0), n) / n; + n = y0 === y1 ? sin$1(y0) : log$1(cy0 / cos$1(y1)) / log$1(tany(y1) / tany(y0)), + f = cy0 * pow$1(tany(y0), n) / n; if (!n) return mercatorRaw; function project(x, y) { - if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; } - else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; } - var r = f / pow(tany(y), n); + if (f > 0) { if (y < -halfPi$1 + epsilon$1) y = -halfPi$1 + epsilon$1; } + else { if (y > halfPi$1 - epsilon$1) y = halfPi$1 - epsilon$1; } + var r = f / pow$1(tany(y), n); return [r * sin$1(n * x), f - r * cos$1(n * x)]; } project.invert = function(x, y) { - var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy); - return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2]; + var fy = f - y, r = sign$1(n) * sqrt$2(x * x + fy * fy), + l = atan2$1(x, abs$1(fy)) * sign$1(fy); + if (fy * n < 0) + l -= pi$1 * sign$1(x) * sign$1(fy); + return [l / n, 2 * atan(pow$1(f / r, 1 / n)) - halfPi$1]; }; return project; @@ -10413,7 +12582,7 @@ function conicEquidistantRaw(y0, y1) { n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), g = cy0 / n + y0; - if (abs(n) < epsilon$2) return equirectangularRaw; + if (abs$1(n) < epsilon$1) return equirectangularRaw; function project(x, y) { var gy = g - y, nx = n * x; @@ -10421,8 +12590,11 @@ function conicEquidistantRaw(y0, y1) { } project.invert = function(x, y) { - var gy = g - y; - return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)]; + var gy = g - y, + l = atan2$1(x, abs$1(gy)) * sign$1(gy); + if (gy * n < 0) + l -= pi$1 * sign$1(x) * sign$1(gy); + return [l / n, g - sign$1(n) * sqrt$2(x * x + gy * gy)]; }; return project; @@ -10438,11 +12610,11 @@ var A1 = 1.340264, A2 = -0.081106, A3 = 0.000893, A4 = 0.003796, - M = sqrt(3) / 2, + M = sqrt$2(3) / 2, iterations = 12; function equalEarthRaw(lambda, phi) { - var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2; + var l = asin$1(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2; return [ lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) @@ -10455,11 +12627,11 @@ equalEarthRaw.invert = function(x, y) { fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; - if (abs(delta) < epsilon2$1) break; + if (abs$1(delta) < epsilon2) break; } return [ M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l), - asin(sin$1(l) / M) + asin$1(sin$1(l) / M) ]; }; @@ -10481,62 +12653,84 @@ function gnomonic() { .clipAngle(60); } -function scaleTranslate$1(kx, ky, tx, ty) { - return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({ - point: function(x, y) { - this.stream.point(x * kx + tx, y * ky + ty); - } - }); -} - -function identity$5() { - var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect +function identity$4() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect + alpha = 0, ca, sa, // angle x0 = null, y0, x1, y1, // clip extent - postclip = identity$4, + kx = 1, ky = 1, + transform = transformer$3({ + point: function(x, y) { + var p = projection([x, y]); + this.stream.point(p[0], p[1]); + } + }), + postclip = identity$5, cache, - cacheStream, - projection; + cacheStream; function reset() { + kx = k * sx; + ky = k * sy; cache = cacheStream = null; return projection; } - return projection = { - stream: function(stream) { - return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); - }, - postclip: function(_) { - return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; - }, - clipExtent: function(_) { - return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }, - scale: function(_) { - return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k; - }, - translate: function(_) { - return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty]; - }, - reflectX: function(_) { - return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0; - }, - reflectY: function(_) { - return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0; - }, - fitExtent: function(extent, object) { - return fitExtent(projection, extent, object); - }, - fitSize: function(size, object) { - return fitSize(projection, size, object); - }, - fitWidth: function(width, object) { - return fitWidth(projection, width, object); - }, - fitHeight: function(height, object) { - return fitHeight(projection, height, object); + function projection (p) { + var x = p[0] * kx, y = p[1] * ky; + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; + } + return [x + tx, y + ty]; + } + projection.invert = function(p) { + var x = p[0] - tx, y = p[1] - ty; + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; } + return [x / kx, y / ky]; + }; + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }; + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$5) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + projection.scale = function(_) { + return arguments.length ? (k = +_, reset()) : k; + }; + projection.translate = function(_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + }; + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin$1(alpha), ca = cos$1(alpha), reset()) : alpha * degrees; + }; + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + }; + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); }; + + return projection; } function naturalEarth1Raw(lambda, phi) { @@ -10553,7 +12747,7 @@ naturalEarth1Raw.invert = function(x, y) { var phi2 = phi * phi, phi4 = phi2 * phi2; phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); - } while (abs(delta) > epsilon$2 && --i > 0); + } while (abs$1(delta) > epsilon$1 && --i > 0); return [ x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), phi @@ -10569,12 +12763,12 @@ function orthographicRaw(x, y) { return [cos$1(y) * sin$1(x), sin$1(y)]; } -orthographicRaw.invert = azimuthalInvert(asin); +orthographicRaw.invert = azimuthalInvert(asin$1); function orthographic() { return projection(orthographicRaw) .scale(249.5) - .clipAngle(90 + epsilon$2); + .clipAngle(90 + epsilon$1); } function stereographicRaw(x, y) { @@ -10593,11 +12787,11 @@ function stereographic() { } function transverseMercatorRaw(lambda, phi) { - return [log(tan((halfPi$2 + phi) / 2)), -lambda]; + return [log$1(tan((halfPi$1 + phi) / 2)), -lambda]; } transverseMercatorRaw.invert = function(x, y) { - return [-y, 2 * atan(exp(x)) - halfPi$2]; + return [-y, 2 * atan(exp(x)) - halfPi$1]; }; function transverseMercator() { @@ -10617,7 +12811,7 @@ function transverseMercator() { .scale(159.155); } -function defaultSeparation(a, b) { +function defaultSeparation$1(a, b) { return a.parent === b.parent ? 1 : 2; } @@ -10650,7 +12844,7 @@ function leafRight(node) { } function cluster() { - var separation = defaultSeparation, + var separation = defaultSeparation$1, dx = 1, dy = 1, nodeSize = false; @@ -10715,45 +12909,52 @@ function node_count() { return this.eachAfter(count); } -function node_each(callback) { - var node = this, current, next = [node], children, i, n; - do { - current = next.reverse(), next = []; - while (node = current.pop()) { - callback(node), children = node.children; - if (children) for (i = 0, n = children.length; i < n; ++i) { - next.push(children[i]); - } - } - } while (next.length); +function node_each(callback, that) { + let index = -1; + for (const node of this) { + callback.call(that, node, ++index, this); + } return this; } -function node_eachBefore(callback) { - var node = this, nodes = [node], children, i; +function node_eachBefore(callback, that) { + var node = this, nodes = [node], children, i, index = -1; while (node = nodes.pop()) { - callback(node), children = node.children; - if (children) for (i = children.length - 1; i >= 0; --i) { - nodes.push(children[i]); + callback.call(that, node, ++index, this); + if (children = node.children) { + for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } } } return this; } -function node_eachAfter(callback) { - var node = this, nodes = [node], next = [], children, i, n; +function node_eachAfter(callback, that) { + var node = this, nodes = [node], next = [], children, i, n, index = -1; while (node = nodes.pop()) { - next.push(node), children = node.children; - if (children) for (i = 0, n = children.length; i < n; ++i) { - nodes.push(children[i]); + next.push(node); + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } } } while (node = next.pop()) { - callback(node); + callback.call(that, node, ++index, this); } return this; } +function node_find(callback, that) { + let index = -1; + for (const node of this) { + if (callback.call(that, node, ++index, this)) { + return node; + } + } +} + function node_sum(value) { return this.eachAfter(function(node) { var sum = +value(node.data) || 0, @@ -10812,11 +13013,7 @@ function node_ancestors() { } function node_descendants() { - var nodes = []; - this.each(function(node) { - nodes.push(node); - }); - return nodes; + return Array.from(this); } function node_leaves() { @@ -10839,9 +13036,30 @@ function node_links() { return links; } +function* node_iterator() { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + yield node; + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } + } while (next.length); +} + function hierarchy(data, children) { - var root = new Node(data), - valued = +data.value && (root.value = data.value), + if (data instanceof Map) { + data = [undefined, data]; + if (children === undefined) children = mapChildren; + } else if (children === undefined) { + children = objectChildren; + } + + var root = new Node$1(data), node, nodes = [root], child, @@ -10849,14 +13067,11 @@ function hierarchy(data, children) { i, n; - if (children == null) children = defaultChildren; - while (node = nodes.pop()) { - if (valued) node.value = +node.data.value; - if ((childs = children(node.data)) && (n = childs.length)) { - node.children = new Array(n); + if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) { + node.children = childs; for (i = n - 1; i >= 0; --i) { - nodes.push(child = node.children[i] = new Node(childs[i])); + nodes.push(child = childs[i] = new Node$1(childs[i])); child.parent = node; child.depth = node.depth + 1; } @@ -10870,11 +13085,16 @@ function node_copy() { return hierarchy(this).eachBefore(copyData); } -function defaultChildren(d) { +function objectChildren(d) { return d.children; } +function mapChildren(d) { + return Array.isArray(d) ? d[1] : null; +} + function copyData(node) { + if (node.data.value !== undefined) node.value = node.data.value; node.data = node.data.data; } @@ -10884,19 +13104,20 @@ function computeHeight(node) { while ((node = node.parent) && (node.height < ++height)); } -function Node(data) { +function Node$1(data) { this.data = data; this.depth = this.height = 0; this.parent = null; } -Node.prototype = hierarchy.prototype = { - constructor: Node, +Node$1.prototype = hierarchy.prototype = { + constructor: Node$1, count: node_count, each: node_each, eachAfter: node_eachAfter, eachBefore: node_eachBefore, + find: node_find, sum: node_sum, sort: node_sort, path: node_path, @@ -10904,18 +13125,52 @@ Node.prototype = hierarchy.prototype = { descendants: node_descendants, leaves: node_leaves, links: node_links, - copy: node_copy + copy: node_copy, + [Symbol.iterator]: node_iterator }; -var slice$4 = Array.prototype.slice; +function optional(f) { + return f == null ? null : required(f); +} + +function required(f) { + if (typeof f !== "function") throw new Error; + return f; +} + +function constantZero() { + return 0; +} + +function constant$2(x) { + return function() { + return x; + }; +} + +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const a$1 = 1664525; +const c$3 = 1013904223; +const m = 4294967296; // 2^32 + +function lcg$1() { + let s = 1; + return () => (s = (a$1 * s + c$3) % m) / m; +} + +function array$1(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} -function shuffle$1(array) { - var m = array.length, +function shuffle(array, random) { + let m = array.length, t, i; while (m) { - i = Math.random() * m-- | 0; + i = random() * m-- | 0; t = array[m]; array[m] = array[i]; array[i] = t; @@ -10925,7 +13180,11 @@ function shuffle$1(array) { } function enclose(circles) { - var i = 0, n = (circles = shuffle$1(slice$4.call(circles))).length, B = [], p, e; + return packEncloseRandom(circles, lcg$1()); +} + +function packEncloseRandom(circles, random) { + var i = 0, n = (circles = shuffle(Array.from(circles), random)).length, B = [], p, e; while (i < n) { p = circles[i]; @@ -10971,7 +13230,7 @@ function enclosesNot(a, b) { } function enclosesWeak(a, b) { - var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y; + var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y; return dr > 0 && dr * dr > dx * dx + dy * dy; } @@ -11033,7 +13292,7 @@ function encloseBasis3(a, b, c) { A = xb * xb + yb * yb - 1, B = 2 * (r1 + xa * xb + ya * yb), C = xa * xa + ya * ya - r1 * r1, - r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + r = -(Math.abs(A) > 1e-6 ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); return { x: x1 + xa + xb * r, y: y1 + ya + yb * r, @@ -11079,14 +13338,14 @@ function score(node) { return dx * dx + dy * dy; } -function Node$1(circle) { +function Node(circle) { this._ = circle; this.next = null; this.previous = null; } -function packEnclose(circles) { - if (!(n = circles.length)) return 0; +function packSiblingsRandom(circles, random) { + if (!(n = (circles = array$1(circles)).length)) return 0; var a, b, c, n, aa, ca, i, j, k, sj, sk; @@ -11102,14 +13361,14 @@ function packEnclose(circles) { place(b, a, c = circles[2]); // Initialize the front-chain using the first three circles a, b and c. - a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a = new Node(a), b = new Node(b), c = new Node(c); a.next = c.previous = b; b.next = a.previous = c; c.next = b.previous = a; // Attempt to place each remaining circleโ€ฆ pack: for (i = 3; i < n; ++i) { - place(a._, b._, c = circles[i]), c = new Node$1(c); + place(a._, b._, c = circles[i]), c = new Node(c); // Find the closest intersecting circle on the front-chain, if any. // โ€œClosenessโ€ is determined by linear distance along the front-chain. @@ -11145,7 +13404,7 @@ function packEnclose(circles) { } // Compute the enclosing circle of the front chain. - a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = packEncloseRandom(a, random); // Translate the circles to put the enclosing circle around the origin. for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; @@ -11154,49 +13413,31 @@ function packEnclose(circles) { } function siblings(circles) { - packEnclose(circles); + packSiblingsRandom(circles, lcg$1()); return circles; } -function optional(f) { - return f == null ? null : required(f); -} - -function required(f) { - if (typeof f !== "function") throw new Error; - return f; -} - -function constantZero() { - return 0; -} - -function constant$9(x) { - return function() { - return x; - }; -} - -function defaultRadius$1(d) { +function defaultRadius(d) { return Math.sqrt(d.value); } -function index$2() { +function index$1() { var radius = null, dx = 1, dy = 1, padding = constantZero; function pack(root) { + const random = lcg$1(); root.x = dx / 2, root.y = dy / 2; if (radius) { root.eachBefore(radiusLeaf(radius)) - .eachAfter(packChildren(padding, 0.5)) + .eachAfter(packChildrenRandom(padding, 0.5, random)) .eachBefore(translateChild(1)); } else { - root.eachBefore(radiusLeaf(defaultRadius$1)) - .eachAfter(packChildren(constantZero, 1)) - .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildrenRandom(constantZero, 1, random)) + .eachAfter(packChildrenRandom(padding, root.r / Math.min(dx, dy), random)) .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); } return root; @@ -11211,7 +13452,7 @@ function index$2() { }; pack.padding = function(x) { - return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding; + return arguments.length ? (padding = typeof x === "function" ? x : constant$2(+x), pack) : padding; }; return pack; @@ -11225,7 +13466,7 @@ function radiusLeaf(radius) { }; } -function packChildren(padding, k) { +function packChildrenRandom(padding, k, random) { return function(node) { if (children = node.children) { var children, @@ -11235,7 +13476,7 @@ function packChildren(padding, k) { e; if (r) for (i = 0; i < n; ++i) children[i].r += r; - e = packEnclose(children); + e = packSiblingsRandom(children, random); if (r) for (i = 0; i < n; ++i) children[i].r -= r; node.r = e + r; } @@ -11323,9 +13564,9 @@ function partition() { return partition; } -var keyPrefix$1 = "$", // Protect against keys like โ€œ__proto__โ€. - preroot = {depth: -1}, - ambiguous = {}; +var preroot = {depth: -1}, + ambiguous = {}, + imputed = {}; function defaultId(d) { return d.id; @@ -11337,44 +13578,80 @@ function defaultParentId(d) { function stratify() { var id = defaultId, - parentId = defaultParentId; + parentId = defaultParentId, + path; function stratify(data) { - var d, + var nodes = Array.from(data), + currentId = id, + currentParentId = parentId, + n, + d, i, - n = data.length, root, parent, node, - nodes = new Array(n), nodeId, nodeKey, - nodeByKey = {}; + nodeByKey = new Map; + + if (path != null) { + const I = nodes.map((d, i) => normalize$1(path(d, i, data))); + const P = I.map(parentof); + const S = new Set(I).add(""); + for (const i of P) { + if (!S.has(i)) { + S.add(i); + I.push(i); + P.push(parentof(i)); + nodes.push(imputed); + } + } + currentId = (_, i) => I[i]; + currentParentId = (_, i) => P[i]; + } - for (i = 0; i < n; ++i) { - d = data[i], node = nodes[i] = new Node(d); - if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { - nodeKey = keyPrefix$1 + (node.id = nodeId); - nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + for (i = 0, n = nodes.length; i < n; ++i) { + d = nodes[i], node = nodes[i] = new Node$1(d); + if ((nodeId = currentId(d, i, data)) != null && (nodeId += "")) { + nodeKey = node.id = nodeId; + nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); + } + if ((nodeId = currentParentId(d, i, data)) != null && (nodeId += "")) { + node.parent = nodeId; } } for (i = 0; i < n; ++i) { - node = nodes[i], nodeId = parentId(data[i], i, data); - if (nodeId == null || !(nodeId += "")) { - if (root) throw new Error("multiple roots"); - root = node; - } else { - parent = nodeByKey[keyPrefix$1 + nodeId]; + node = nodes[i]; + if (nodeId = node.parent) { + parent = nodeByKey.get(nodeId); if (!parent) throw new Error("missing: " + nodeId); if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); if (parent.children) parent.children.push(node); else parent.children = [node]; node.parent = parent; + } else { + if (root) throw new Error("multiple roots"); + root = node; } } if (!root) throw new Error("no root"); + + // When imputing internal nodes, only introduce roots if needed. + // Then replace the imputed marker data with null. + if (path != null) { + while (root.data === imputed && root.children.length === 1) { + root = root.children[0], --n; + } + for (let i = nodes.length - 1; i >= 0; --i) { + node = nodes[i]; + if (node.data !== imputed) break; + node.data = null; + } + } + root.parent = preroot; root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); root.parent = null; @@ -11384,17 +13661,53 @@ function stratify() { } stratify.id = function(x) { - return arguments.length ? (id = required(x), stratify) : id; + return arguments.length ? (id = optional(x), stratify) : id; }; stratify.parentId = function(x) { - return arguments.length ? (parentId = required(x), stratify) : parentId; + return arguments.length ? (parentId = optional(x), stratify) : parentId; + }; + + stratify.path = function(x) { + return arguments.length ? (path = optional(x), stratify) : path; }; return stratify; } -function defaultSeparation$1(a, b) { +// To normalize a path, we coerce to a string, strip the trailing slash if any +// (as long as the trailing slash is not immediately preceded by another slash), +// and add leading slash if missing. +function normalize$1(path) { + path = `${path}`; + let i = path.length; + if (slash(path, i - 1) && !slash(path, i - 2)) path = path.slice(0, -1); + return path[0] === "/" ? path : `/${path}`; +} + +// Walk backwards to find the first slash that is not the leading slash, e.g.: +// "/foo/bar" โ‡ฅ "/foo", "/foo" โ‡ฅ "/", "/" โ†ฆ "". (The root is special-cased +// because the id of the root must be a truthy value.) +function parentof(path) { + let i = path.length; + if (i < 2) return ""; + while (--i > 1) if (slash(path, i)) break; + return path.slice(0, i); +} + +// Slashes can be escaped; to determine whether a slash is a path delimiter, we +// count the number of preceding backslashes escaping the forward slash: an odd +// number indicates an escaped forward slash. +function slash(path, i) { + if (path[i] === "/") { + let k = 0; + while (i > 0 && path[--i] === "\\") ++k; + if ((k & 1) === 0) return true; + } + return false; +} + +function defaultSeparation(a, b) { return a.parent === b.parent ? 1 : 2; } @@ -11465,7 +13778,7 @@ function TreeNode(node, i) { this.i = i; // number } -TreeNode.prototype = Object.create(Node.prototype); +TreeNode.prototype = Object.create(Node$1.prototype); function treeRoot(root) { var tree = new TreeNode(root, 0), @@ -11492,7 +13805,7 @@ function treeRoot(root) { // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm function tree() { - var separation = defaultSeparation$1, + var separation = defaultSeparation, dx = 1, dy = 1, nodeSize = null; @@ -11707,7 +14020,7 @@ var squarify = (function custom(ratio) { return squarify; })(phi); -function index$3() { +function index() { var tile = squarify, round = false, dx = 1, @@ -11771,7 +14084,7 @@ function index$3() { }; treemap.paddingInner = function(x) { - return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner; + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$2(+x), treemap) : paddingInner; }; treemap.paddingOuter = function(x) { @@ -11779,19 +14092,19 @@ function index$3() { }; treemap.paddingTop = function(x) { - return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop; + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$2(+x), treemap) : paddingTop; }; treemap.paddingRight = function(x) { - return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight; + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$2(+x), treemap) : paddingRight; }; treemap.paddingBottom = function(x) { - return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom; + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$2(+x), treemap) : paddingBottom; }; treemap.paddingLeft = function(x) { - return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft; + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$2(+x), treemap) : paddingLeft; }; return treemap; @@ -11833,11 +14146,11 @@ function binary(parent, x0, y0, x1, y1) { valueRight = value - valueLeft; if ((x1 - x0) > (y1 - y0)) { - var xk = (x0 * valueRight + x1 * valueLeft) / value; + var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1; partition(i, k, valueLeft, x0, y0, xk, y1); partition(k, j, valueRight, xk, y0, x1, y1); } else { - var yk = (y0 * valueRight + y1 * valueLeft) / value; + var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1; partition(i, k, valueLeft, x0, y0, x1, yk); partition(k, j, valueRight, x0, yk, x1, y1); } @@ -11864,8 +14177,8 @@ var resquarify = (function custom(ratio) { while (++j < m) { row = rows[j], nodes = row.children; for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; - if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); - else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1); value -= row.value; } } else { @@ -11881,7 +14194,7 @@ var resquarify = (function custom(ratio) { return resquarify; })(phi); -function area$2(polygon) { +function area$1(polygon) { var i = -1, n = polygon.length, a, @@ -11897,7 +14210,7 @@ function area$2(polygon) { return area / 2; } -function centroid$1(polygon) { +function centroid(polygon) { var i = -1, n = polygon.length, x = 0, @@ -11934,11 +14247,11 @@ function lexicographicOrder(a, b) { // Assumes points.length >= 3, is sorted by x, unique in y. // Returns an array of indices into points in left-to-right order. function computeUpperHullIndexes(points) { - var n = points.length, - indexes = [0, 1], - size = 2; + const n = points.length, + indexes = [0, 1]; + let size = 2, i; - for (var i = 2; i < n; ++i) { + for (i = 2; i < n; ++i) { while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; indexes[size++] = i; } @@ -11974,7 +14287,7 @@ function hull(points) { return hull; } -function contains$2(polygon, point) { +function contains(polygon, point) { var n = polygon.length, p = polygon[n - 1], x = point[0], y = point[1], @@ -11991,7 +14304,7 @@ function contains$2(polygon, point) { return inside; } -function length$2(polygon) { +function length(polygon) { var i = -1, n = polygon.length, b = polygon[n - 1], @@ -12009,15 +14322,13 @@ function length$2(polygon) { yb = b[1]; xa -= xb; ya -= yb; - perimeter += Math.sqrt(xa * xa + ya * ya); + perimeter += Math.hypot(xa, ya); } return perimeter; } -function defaultSource$1() { - return Math.random(); -} +var defaultSource = Math.random; var uniform = (function sourceRandomUniform(source) { function randomUniform(min, max) { @@ -12033,7 +14344,22 @@ var uniform = (function sourceRandomUniform(source) { randomUniform.source = sourceRandomUniform; return randomUniform; -})(defaultSource$1); +})(defaultSource); + +var int = (function sourceRandomInt(source) { + function randomInt(min, max) { + if (arguments.length < 2) max = min, min = 0; + min = Math.floor(min); + max = Math.floor(max) - min; + return function() { + return Math.floor(source() * max + min); + }; + } + + randomInt.source = sourceRandomInt; + + return randomInt; +})(defaultSource); var normal = (function sourceRandomNormal(source) { function randomNormal(mu, sigma) { @@ -12060,11 +14386,13 @@ var normal = (function sourceRandomNormal(source) { randomNormal.source = sourceRandomNormal; return randomNormal; -})(defaultSource$1); +})(defaultSource); var logNormal = (function sourceRandomLogNormal(source) { + var N = normal.source(source); + function randomLogNormal() { - var randomNormal = normal.source(source).apply(this, arguments); + var randomNormal = N.apply(this, arguments); return function() { return Math.exp(randomNormal()); }; @@ -12073,24 +14401,29 @@ var logNormal = (function sourceRandomLogNormal(source) { randomLogNormal.source = sourceRandomLogNormal; return randomLogNormal; -})(defaultSource$1); +})(defaultSource); var irwinHall = (function sourceRandomIrwinHall(source) { function randomIrwinHall(n) { + if ((n = +n) <= 0) return () => 0; return function() { - for (var sum = 0, i = 0; i < n; ++i) sum += source(); - return sum; + for (var sum = 0, i = n; i > 1; --i) sum += source(); + return sum + i * source(); }; } randomIrwinHall.source = sourceRandomIrwinHall; return randomIrwinHall; -})(defaultSource$1); +})(defaultSource); var bates = (function sourceRandomBates(source) { + var I = irwinHall.source(source); + function randomBates(n) { - var randomIrwinHall = irwinHall.source(source)(n); + // use limiting distribution at n === 0 + if ((n = +n) === 0) return source; + var randomIrwinHall = I(n); return function() { return randomIrwinHall() / n; }; @@ -12099,19 +14432,230 @@ var bates = (function sourceRandomBates(source) { randomBates.source = sourceRandomBates; return randomBates; -})(defaultSource$1); +})(defaultSource); -var exponential$1 = (function sourceRandomExponential(source) { +var exponential = (function sourceRandomExponential(source) { function randomExponential(lambda) { return function() { - return -Math.log(1 - source()) / lambda; + return -Math.log1p(-source()) / lambda; }; } randomExponential.source = sourceRandomExponential; return randomExponential; -})(defaultSource$1); +})(defaultSource); + +var pareto = (function sourceRandomPareto(source) { + function randomPareto(alpha) { + if ((alpha = +alpha) < 0) throw new RangeError("invalid alpha"); + alpha = 1 / -alpha; + return function() { + return Math.pow(1 - source(), alpha); + }; + } + + randomPareto.source = sourceRandomPareto; + + return randomPareto; +})(defaultSource); + +var bernoulli = (function sourceRandomBernoulli(source) { + function randomBernoulli(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + return function() { + return Math.floor(source() + p); + }; + } + + randomBernoulli.source = sourceRandomBernoulli; + + return randomBernoulli; +})(defaultSource); + +var geometric = (function sourceRandomGeometric(source) { + function randomGeometric(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + if (p === 0) return () => Infinity; + if (p === 1) return () => 1; + p = Math.log1p(-p); + return function() { + return 1 + Math.floor(Math.log1p(-source()) / p); + }; + } + + randomGeometric.source = sourceRandomGeometric; + + return randomGeometric; +})(defaultSource); + +var gamma = (function sourceRandomGamma(source) { + var randomNormal = normal.source(source)(); + + function randomGamma(k, theta) { + if ((k = +k) < 0) throw new RangeError("invalid k"); + // degenerate distribution if k === 0 + if (k === 0) return () => 0; + theta = theta == null ? 1 : +theta; + // exponential distribution if k === 1 + if (k === 1) return () => -Math.log1p(-source()) * theta; + + var d = (k < 1 ? k + 1 : k) - 1 / 3, + c = 1 / (3 * Math.sqrt(d)), + multiplier = k < 1 ? () => Math.pow(source(), 1 / k) : () => 1; + return function() { + do { + do { + var x = randomNormal(), + v = 1 + c * x; + } while (v <= 0); + v *= v * v; + var u = 1 - source(); + } while (u >= 1 - 0.0331 * x * x * x * x && Math.log(u) >= 0.5 * x * x + d * (1 - v + Math.log(v))); + return d * v * multiplier() * theta; + }; + } + + randomGamma.source = sourceRandomGamma; + + return randomGamma; +})(defaultSource); + +var beta = (function sourceRandomBeta(source) { + var G = gamma.source(source); + + function randomBeta(alpha, beta) { + var X = G(alpha), + Y = G(beta); + return function() { + var x = X(); + return x === 0 ? 0 : x / (x + Y()); + }; + } + + randomBeta.source = sourceRandomBeta; + + return randomBeta; +})(defaultSource); + +var binomial = (function sourceRandomBinomial(source) { + var G = geometric.source(source), + B = beta.source(source); + + function randomBinomial(n, p) { + n = +n; + if ((p = +p) >= 1) return () => n; + if (p <= 0) return () => 0; + return function() { + var acc = 0, nn = n, pp = p; + while (nn * pp > 16 && nn * (1 - pp) > 16) { + var i = Math.floor((nn + 1) * pp), + y = B(i, nn - i + 1)(); + if (y <= pp) { + acc += i; + nn -= i; + pp = (pp - y) / (1 - y); + } else { + nn = i - 1; + pp /= y; + } + } + var sign = pp < 0.5, + pFinal = sign ? pp : 1 - pp, + g = G(pFinal); + for (var s = g(), k = 0; s <= nn; ++k) s += g(); + return acc + (sign ? k : nn - k); + }; + } + + randomBinomial.source = sourceRandomBinomial; + + return randomBinomial; +})(defaultSource); + +var weibull = (function sourceRandomWeibull(source) { + function randomWeibull(k, a, b) { + var outerFunc; + if ((k = +k) === 0) { + outerFunc = x => -Math.log(x); + } else { + k = 1 / k; + outerFunc = x => Math.pow(x, k); + } + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * outerFunc(-Math.log1p(-source())); + }; + } + + randomWeibull.source = sourceRandomWeibull; + + return randomWeibull; +})(defaultSource); + +var cauchy = (function sourceRandomCauchy(source) { + function randomCauchy(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * Math.tan(Math.PI * source()); + }; + } + + randomCauchy.source = sourceRandomCauchy; + + return randomCauchy; +})(defaultSource); + +var logistic = (function sourceRandomLogistic(source) { + function randomLogistic(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + var u = source(); + return a + b * Math.log(u / (1 - u)); + }; + } + + randomLogistic.source = sourceRandomLogistic; + + return randomLogistic; +})(defaultSource); + +var poisson = (function sourceRandomPoisson(source) { + var G = gamma.source(source), + B = binomial.source(source); + + function randomPoisson(lambda) { + return function() { + var acc = 0, l = lambda; + while (l > 16) { + var n = Math.floor(0.875 * l), + t = G(n)(); + if (t > l) return acc + B(n - 1, l / t)(); + acc += n; + l -= t; + } + for (var s = -Math.log1p(-source()), k = 0; s <= l; ++k) s -= Math.log1p(-source()); + return acc + k; + }; + } + + randomPoisson.source = sourceRandomPoisson; + + return randomPoisson; +})(defaultSource); + +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const mul = 0x19660D; +const inc = 0x3C6EF35F; +const eps = 1 / 0x100000000; + +function lcg(seed = Math.random()) { + let state = (0 <= seed && seed < 1 ? seed / eps : Math.abs(seed)) | 0; + return () => (state = mul * state + inc | 0, eps * (state >>> 0)); +} function initRange(domain, range) { switch (arguments.length) { @@ -12125,44 +14669,50 @@ function initRange(domain, range) { function initInterpolator(domain, interpolator) { switch (arguments.length) { case 0: break; - case 1: this.interpolator(domain); break; - default: this.interpolator(interpolator).domain(domain); break; + case 1: { + if (typeof domain === "function") this.interpolator(domain); + else this.range(domain); + break; + } + default: { + this.domain(domain); + if (typeof interpolator === "function") this.interpolator(interpolator); + else this.range(interpolator); + break; + } } return this; } -var array$3 = Array.prototype; - -var map$3 = array$3.map; -var slice$5 = array$3.slice; - -var implicit = {name: "implicit"}; +const implicit = Symbol("implicit"); function ordinal() { - var index = map$1(), + var index = new InternMap(), domain = [], range = [], unknown = implicit; function scale(d) { - var key = d + "", i = index.get(key); - if (!i) { + let i = index.get(d); + if (i === undefined) { if (unknown !== implicit) return unknown; - index.set(key, i = domain.push(d)); + index.set(d, i = domain.push(d) - 1); } - return range[(i - 1) % range.length]; + return range[i % range.length]; } scale.domain = function(_) { if (!arguments.length) return domain.slice(); - domain = [], index = map$1(); - var i = -1, n = _.length, d, key; - while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + domain = [], index = new InternMap(); + for (const value of _) { + if (index.has(value)) continue; + index.set(value, domain.push(value) - 1); + } return scale; }; scale.range = function(_) { - return arguments.length ? (range = slice$5.call(_), scale) : range.slice(); + return arguments.length ? (range = Array.from(_), scale) : range.slice(); }; scale.unknown = function(_) { @@ -12182,7 +14732,8 @@ function band() { var scale = ordinal().unknown(undefined), domain = scale.domain, ordinalRange = scale.range, - range = [0, 1], + r0 = 0, + r1 = 1, step, bandwidth, round = false, @@ -12194,15 +14745,15 @@ function band() { function rescale() { var n = domain().length, - reverse = range[1] < range[0], - start = range[reverse - 0], - stop = range[1 - reverse]; + reverse = r1 < r0, + start = reverse ? r1 : r0, + stop = reverse ? r0 : r1; step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); if (round) step = Math.floor(step); start += (stop - start - step * (n - paddingInner)) * align; bandwidth = step * (1 - paddingInner); if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); - var values = sequence(n).map(function(i) { return start + step * i; }); + var values = range$2(n).map(function(i) { return start + step * i; }); return ordinalRange(reverse ? values.reverse() : values); } @@ -12211,11 +14762,11 @@ function band() { }; scale.range = function(_) { - return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); + return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1]; }; scale.rangeRound = function(_) { - return range = [+_[0], +_[1]], round = true, rescale(); + return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale(); }; scale.bandwidth = function() { @@ -12247,7 +14798,7 @@ function band() { }; scale.copy = function() { - return band(domain(), range) + return band(domain(), [r0, r1]) .round(round) .paddingInner(paddingInner) .paddingOuter(paddingOuter) @@ -12271,34 +14822,34 @@ function pointish(scale) { return scale; } -function point$1() { +function point$4() { return pointish(band.apply(null, arguments).paddingInner(1)); } -function constant$a(x) { +function constants(x) { return function() { return x; }; } -function number$2(x) { +function number$1(x) { return +x; } var unit = [0, 1]; -function identity$6(x) { +function identity$3(x) { return x; } function normalize(a, b) { return (b -= (a = +a)) ? function(x) { return (x - a) / b; } - : constant$a(isNaN(b) ? NaN : 0.5); + : constants(isNaN(b) ? NaN : 0.5); } -function clamper(domain) { - var a = domain[0], b = domain[domain.length - 1], t; +function clamper(a, b) { + var t; if (a > b) t = a, a = b, b = t; return function(x) { return Math.max(a, Math.min(b, x)); }; } @@ -12330,12 +14881,12 @@ function polymap(domain, range, interpolate) { } return function(x) { - var i = bisectRight(domain, x, 1, j) - 1; + var i = bisect(domain, x, 1, j) - 1; return r[i](d[i](x)); }; } -function copy(source, target) { +function copy$1(source, target) { return target .domain(source.domain()) .range(source.range()) @@ -12344,26 +14895,28 @@ function copy(source, target) { .unknown(source.unknown()); } -function transformer$1() { +function transformer$2() { var domain = unit, range = unit, - interpolate = interpolateValue, + interpolate = interpolate$2, transform, untransform, unknown, - clamp = identity$6, + clamp = identity$3, piecewise, output, input; function rescale() { - piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; + var n = Math.min(domain.length, range.length); + if (clamp !== identity$3) clamp = clamper(domain[0], domain[n - 1]); + piecewise = n > 2 ? polymap : bimap; output = input = null; return scale; } function scale(x) { - return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); } scale.invert = function(y) { @@ -12371,19 +14924,19 @@ function transformer$1() { }; scale.domain = function(_) { - return arguments.length ? (domain = map$3.call(_, number$2), clamp === identity$6 || (clamp = clamper(domain)), rescale()) : domain.slice(); + return arguments.length ? (domain = Array.from(_, number$1), rescale()) : domain.slice(); }; scale.range = function(_) { - return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice(); + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); }; scale.rangeRound = function(_) { - return range = slice$5.call(_), interpolate = interpolateRound, rescale(); + return range = Array.from(_), interpolate = interpolateRound, rescale(); }; scale.clamp = function(_) { - return arguments.length ? (clamp = _ ? clamper(domain) : identity$6, scale) : clamp !== identity$6; + return arguments.length ? (clamp = _ ? true : identity$3, rescale()) : clamp !== identity$3; }; scale.interpolate = function(_) { @@ -12400,8 +14953,8 @@ function transformer$1() { }; } -function continuous(transform, untransform) { - return transformer$1()(transform, untransform); +function continuous() { + return transformer$2()(identity$3, identity$3); } function tickFormat(start, stop, count, specifier) { @@ -12447,38 +15000,36 @@ function linearish(scale) { scale.nice = function(count) { if (count == null) count = 10; - var d = domain(), - i0 = 0, - i1 = d.length - 1, - start = d[i0], - stop = d[i1], - step; + var d = domain(); + var i0 = 0; + var i1 = d.length - 1; + var start = d[i0]; + var stop = d[i1]; + var prestep; + var step; + var maxIter = 10; if (stop < start) { step = start, start = stop, stop = step; step = i0, i0 = i1, i1 = step; } - - step = tickIncrement(start, stop, count); - - if (step > 0) { - start = Math.floor(start / step) * step; - stop = Math.ceil(stop / step) * step; - step = tickIncrement(start, stop, count); - } else if (step < 0) { - start = Math.ceil(start * step) / step; - stop = Math.floor(stop * step) / step; + + while (maxIter-- > 0) { step = tickIncrement(start, stop, count); - } - - if (step > 0) { - d[i0] = Math.floor(start / step) * step; - d[i1] = Math.ceil(stop / step) * step; - domain(d); - } else if (step < 0) { - d[i0] = Math.ceil(start * step) / step; - d[i1] = Math.floor(stop * step) / step; - domain(d); + if (step === prestep) { + d[i0] = start; + d[i1] = stop; + return domain(d); + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } else { + break; + } + prestep = step; } return scale; @@ -12487,11 +15038,11 @@ function linearish(scale) { return scale; } -function linear$2() { - var scale = continuous(identity$6, identity$6); +function linear() { + var scale = continuous(); scale.copy = function() { - return copy(scale, linear$2()); + return copy$1(scale, linear()); }; initRange.apply(scale, arguments); @@ -12499,17 +15050,17 @@ function linear$2() { return linearish(scale); } -function identity$7(domain) { +function identity$2(domain) { var unknown; function scale(x) { - return isNaN(x = +x) ? unknown : x; + return x == null || isNaN(x = +x) ? unknown : x; } scale.invert = scale; scale.domain = scale.range = function(_) { - return arguments.length ? (domain = map$3.call(_, number$2), scale) : domain.slice(); + return arguments.length ? (domain = Array.from(_, number$1), scale) : domain.slice(); }; scale.unknown = function(_) { @@ -12517,10 +15068,10 @@ function identity$7(domain) { }; scale.copy = function() { - return identity$7(domain).unknown(unknown); + return identity$2(domain).unknown(unknown); }; - domain = arguments.length ? map$3.call(domain, number$2) : [0, 1]; + domain = arguments.length ? Array.from(domain, number$1) : [0, 1]; return linearish(scale); } @@ -12567,28 +15118,26 @@ function pow10(x) { function powp(base) { return base === 10 ? pow10 : base === Math.E ? Math.exp - : function(x) { return Math.pow(base, x); }; + : x => Math.pow(base, x); } function logp(base) { return base === Math.E ? Math.log : base === 10 && Math.log10 || base === 2 && Math.log2 - || (base = Math.log(base), function(x) { return Math.log(x) / base; }); + || (base = Math.log(base), x => Math.log(x) / base); } function reflect(f) { - return function(x) { - return -f(-x); - }; + return (x, k) => -f(-x, k); } function loggish(transform) { - var scale = transform(transformLog, transformExp), - domain = scale.domain, - base = 10, - logs, - pows; + const scale = transform(transformLog, transformExp); + const domain = scale.domain; + let base = 10; + let logs; + let pows; function rescale() { logs = logp(base), pows = powp(base); @@ -12609,78 +15158,75 @@ function loggish(transform) { return arguments.length ? (domain(_), rescale()) : domain(); }; - scale.ticks = function(count) { - var d = domain(), - u = d[0], - v = d[d.length - 1], - r; + scale.ticks = count => { + const d = domain(); + let u = d[0]; + let v = d[d.length - 1]; + const r = v < u; - if (r = v < u) i = u, u = v, v = i; + if (r) ([u, v] = [v, u]); - var i = logs(u), - j = logs(v), - p, - k, - t, - n = count == null ? 10 : +count, - z = []; + let i = logs(u); + let j = logs(v); + let k; + let t; + const n = count == null ? 10 : +count; + let z = []; if (!(base % 1) && j - i < n) { - i = Math.round(i) - 1, j = Math.round(j) + 1; - if (u > 0) for (; i < j; ++i) { - for (k = 1, p = pows(i); k < base; ++k) { - t = p * k; + i = Math.floor(i), j = Math.ceil(j); + if (u > 0) for (; i <= j; ++i) { + for (k = 1; k < base; ++k) { + t = i < 0 ? k / pows(-i) : k * pows(i); if (t < u) continue; if (t > v) break; z.push(t); } - } else for (; i < j; ++i) { - for (k = base - 1, p = pows(i); k >= 1; --k) { - t = p * k; + } else for (; i <= j; ++i) { + for (k = base - 1; k >= 1; --k) { + t = i > 0 ? k / pows(-i) : k * pows(i); if (t < u) continue; if (t > v) break; z.push(t); } } + if (z.length * 2 < n) z = ticks(u, v, n); } else { z = ticks(i, j, Math.min(j - i, n)).map(pows); } - return r ? z.reverse() : z; }; - scale.tickFormat = function(count, specifier) { - if (specifier == null) specifier = base === 10 ? ".0e" : ","; - if (typeof specifier !== "function") specifier = exports.format(specifier); - if (count === Infinity) return specifier; + scale.tickFormat = (count, specifier) => { if (count == null) count = 10; - var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? - return function(d) { - var i = d / pows(Math.round(logs(d))); + if (specifier == null) specifier = base === 10 ? "s" : ","; + if (typeof specifier !== "function") { + if (!(base % 1) && (specifier = formatSpecifier(specifier)).precision == null) specifier.trim = true; + specifier = exports.format(specifier); + } + if (count === Infinity) return specifier; + const k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return d => { + let i = d / pows(Math.round(logs(d))); if (i * base < base - 0.5) i *= base; return i <= k ? specifier(d) : ""; }; }; - scale.nice = function() { + scale.nice = () => { return domain(nice(domain(), { - floor: function(x) { return pows(Math.floor(logs(x))); }, - ceil: function(x) { return pows(Math.ceil(logs(x))); } + floor: x => pows(Math.floor(logs(x))), + ceil: x => pows(Math.ceil(logs(x))) })); }; return scale; -} - -function log$1() { - var scale = loggish(transformer$1()).domain([1, 10]); - - scale.copy = function() { - return copy(scale, log$1()).base(scale.base()); - }; +} +function log() { + const scale = loggish(transformer$2()).domain([1, 10]); + scale.copy = () => copy$1(scale, log()).base(scale.base()); initRange.apply(scale, arguments); - return scale; } @@ -12707,10 +15253,10 @@ function symlogish(transform) { } function symlog() { - var scale = symlogish(transformer$1()); + var scale = symlogish(transformer$2()); scale.copy = function() { - return copy(scale, symlog()).constant(scale.constant()); + return copy$1(scale, symlog()).constant(scale.constant()); }; return initRange.apply(scale, arguments); @@ -12731,11 +15277,11 @@ function transformSquare(x) { } function powish(transform) { - var scale = transform(identity$6, identity$6), + var scale = transform(identity$3, identity$3), exponent = 1; function rescale() { - return exponent === 1 ? transform(identity$6, identity$6) + return exponent === 1 ? transform(identity$3, identity$3) : exponent === 0.5 ? transform(transformSqrt, transformSquare) : transform(transformPow(exponent), transformPow(1 / exponent)); } @@ -12747,11 +15293,11 @@ function powish(transform) { return linearish(scale); } -function pow$1() { - var scale = powish(transformer$1()); +function pow() { + var scale = powish(transformer$2()); scale.copy = function() { - return copy(scale, pow$1()).exponent(scale.exponent()); + return copy$1(scale, pow()).exponent(scale.exponent()); }; initRange.apply(scale, arguments); @@ -12760,7 +15306,66 @@ function pow$1() { } function sqrt$1() { - return pow$1.apply(null, arguments).exponent(0.5); + return pow.apply(null, arguments).exponent(0.5); +} + +function square$1(x) { + return Math.sign(x) * x * x; +} + +function unsquare(x) { + return Math.sign(x) * Math.sqrt(Math.abs(x)); +} + +function radial() { + var squared = continuous(), + range = [0, 1], + round = false, + unknown; + + function scale(x) { + var y = unsquare(squared(x)); + return isNaN(y) ? unknown : round ? Math.round(y) : y; + } + + scale.invert = function(y) { + return squared.invert(square$1(y)); + }; + + scale.domain = function(_) { + return arguments.length ? (squared.domain(_), scale) : squared.domain(); + }; + + scale.range = function(_) { + return arguments.length ? (squared.range((range = Array.from(_, number$1)).map(square$1)), scale) : range.slice(); + }; + + scale.rangeRound = function(_) { + return scale.range(_).round(true); + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, scale) : round; + }; + + scale.clamp = function(_) { + return arguments.length ? (squared.clamp(_), scale) : squared.clamp(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return radial(squared.domain(), range) + .round(round) + .clamp(squared.clamp()) + .unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); } function quantile() { @@ -12772,12 +15377,12 @@ function quantile() { function rescale() { var i = 0, n = Math.max(1, range.length); thresholds = new Array(n - 1); - while (++i < n) thresholds[i - 1] = threshold(domain, i / n); + while (++i < n) thresholds[i - 1] = quantileSorted(domain, i / n); return scale; } function scale(x) { - return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)]; + return x == null || isNaN(x = +x) ? unknown : range[bisect(thresholds, x)]; } scale.invertExtent = function(y) { @@ -12791,13 +15396,13 @@ function quantile() { scale.domain = function(_) { if (!arguments.length) return domain.slice(); domain = []; - for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); - domain.sort(ascending); + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending$3); return rescale(); }; scale.range = function(_) { - return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice(); + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); }; scale.unknown = function(_) { @@ -12818,7 +15423,7 @@ function quantile() { return initRange.apply(scale, arguments); } -function quantize$1() { +function quantize() { var x0 = 0, x1 = 1, n = 1, @@ -12827,7 +15432,7 @@ function quantize$1() { unknown; function scale(x) { - return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + return x != null && x <= x ? range[bisect(domain, x, 0, n)] : unknown; } function rescale() { @@ -12838,11 +15443,11 @@ function quantize$1() { } scale.domain = function(_) { - return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1]; }; scale.range = function(_) { - return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice(); + return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice(); }; scale.invertExtent = function(y) { @@ -12862,7 +15467,7 @@ function quantize$1() { }; scale.copy = function() { - return quantize$1() + return quantize() .domain([x0, x1]) .range(range) .unknown(unknown); @@ -12871,22 +15476,22 @@ function quantize$1() { return initRange.apply(linearish(scale), arguments); } -function threshold$1() { +function threshold() { var domain = [0.5], range = [0, 1], unknown, n = 1; function scale(x) { - return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + return x != null && x <= x ? range[bisect(domain, x, 0, n)] : unknown; } scale.domain = function(_) { - return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); }; scale.range = function(_) { - return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); }; scale.invertExtent = function(y) { @@ -12899,7 +15504,7 @@ function threshold$1() { }; scale.copy = function() { - return threshold$1() + return threshold() .domain(domain) .range(range) .unknown(unknown); @@ -12908,8 +15513,8 @@ function threshold$1() { return initRange.apply(scale, arguments); } -var t0$1 = new Date, - t1$1 = new Date; +var t0 = new Date, + t1 = new Date; function newInterval(floori, offseti, count, field) { @@ -12961,9 +15566,9 @@ function newInterval(floori, offseti, count, field) { if (count) { interval.count = function(start, end) { - t0$1.setTime(+start), t1$1.setTime(+end); - floori(t0$1), floori(t1$1); - return Math.floor(count(t0$1, t1$1)); + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); }; interval.every = function(step) { @@ -13000,13 +15605,17 @@ millisecond.every = function(k) { return (end - start) / k; }); }; + +var millisecond$1 = millisecond; var milliseconds = millisecond.range; -var durationSecond = 1e3; -var durationMinute = 6e4; -var durationHour = 36e5; -var durationDay = 864e5; -var durationWeek = 6048e5; +const durationSecond = 1000; +const durationMinute = durationSecond * 60; +const durationHour = durationMinute * 60; +const durationDay = durationHour * 24; +const durationWeek = durationDay * 7; +const durationMonth = durationDay * 30; +const durationYear = durationDay * 365; var second = newInterval(function(date) { date.setTime(date - date.getMilliseconds()); @@ -13017,6 +15626,8 @@ var second = newInterval(function(date) { }, function(date) { return date.getUTCSeconds(); }); + +var utcSecond = second; var seconds = second.range; var minute = newInterval(function(date) { @@ -13028,6 +15639,8 @@ var minute = newInterval(function(date) { }, function(date) { return date.getMinutes(); }); + +var timeMinute = minute; var minutes = minute.range; var hour = newInterval(function(date) { @@ -13039,17 +15652,18 @@ var hour = newInterval(function(date) { }, function(date) { return date.getHours(); }); + +var timeHour = hour; var hours = hour.range; -var day = newInterval(function(date) { - date.setHours(0, 0, 0, 0); -}, function(date, step) { - date.setDate(date.getDate() + step); -}, function(start, end) { - return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; -}, function(date) { - return date.getDate() - 1; -}); +var day = newInterval( + date => date.setHours(0, 0, 0, 0), + (date, step) => date.setDate(date.getDate() + step), + (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay, + date => date.getDate() - 1 +); + +var timeDay = day; var days = day.range; function weekday(i) { @@ -13089,6 +15703,8 @@ var month = newInterval(function(date) { }, function(date) { return date.getMonth(); }); + +var timeMonth = month; var months = month.range; var year = newInterval(function(date) { @@ -13112,6 +15728,8 @@ year.every = function(k) { date.setFullYear(date.getFullYear() + step * k); }); }; + +var timeYear = year; var years = year.range; var utcMinute = newInterval(function(date) { @@ -13123,6 +15741,8 @@ var utcMinute = newInterval(function(date) { }, function(date) { return date.getUTCMinutes(); }); + +var utcMinute$1 = utcMinute; var utcMinutes = utcMinute.range; var utcHour = newInterval(function(date) { @@ -13134,6 +15754,8 @@ var utcHour = newInterval(function(date) { }, function(date) { return date.getUTCHours(); }); + +var utcHour$1 = utcHour; var utcHours = utcHour.range; var utcDay = newInterval(function(date) { @@ -13145,6 +15767,8 @@ var utcDay = newInterval(function(date) { }, function(date) { return date.getUTCDate() - 1; }); + +var utcDay$1 = utcDay; var utcDays = utcDay.range; function utcWeekday(i) { @@ -13184,6 +15808,8 @@ var utcMonth = newInterval(function(date) { }, function(date) { return date.getUTCMonth(); }); + +var utcMonth$1 = utcMonth; var utcMonths = utcMonth.range; var utcYear = newInterval(function(date) { @@ -13207,8 +15833,56 @@ utcYear.every = function(k) { date.setUTCFullYear(date.getUTCFullYear() + step * k); }); }; + +var utcYear$1 = utcYear; var utcYears = utcYear.range; +function ticker(year, month, week, day, hour, minute) { + + const tickIntervals = [ + [utcSecond, 1, durationSecond], + [utcSecond, 5, 5 * durationSecond], + [utcSecond, 15, 15 * durationSecond], + [utcSecond, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [ hour, 1, durationHour ], + [ hour, 3, 3 * durationHour ], + [ hour, 6, 6 * durationHour ], + [ hour, 12, 12 * durationHour ], + [ day, 1, durationDay ], + [ day, 2, 2 * durationDay ], + [ week, 1, durationWeek ], + [ month, 1, durationMonth ], + [ month, 3, 3 * durationMonth ], + [ year, 1, durationYear ] + ]; + + function ticks(start, stop, count) { + const reverse = stop < start; + if (reverse) [start, stop] = [stop, start]; + const interval = count && typeof count.range === "function" ? count : tickInterval(start, stop, count); + const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop + return reverse ? ticks.reverse() : ticks; + } + + function tickInterval(start, stop, count) { + const target = Math.abs(stop - start) / count; + const i = bisector(([,, step]) => step).right(tickIntervals, target); + if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count)); + if (i === 0) return millisecond$1.every(Math.max(tickStep(start, stop, count), 1)); + const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + return t.every(step); + } + + return [ticks, tickInterval]; +} + +const [utcTicks, utcTickInterval] = ticker(utcYear$1, utcMonth$1, utcSunday, utcDay$1, utcHour$1, utcMinute$1); +const [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, sunday, timeDay, timeHour, timeMinute); + function localDate(d) { if (0 <= d.y && d.y < 100) { var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); @@ -13231,7 +15905,7 @@ function newDate(y, m, d) { return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; } -function formatLocale$1(locale) { +function formatLocale(locale) { var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, @@ -13261,6 +15935,8 @@ function formatLocale$1(locale) { "d": formatDayOfMonth, "e": formatDayOfMonth, "f": formatMicroseconds, + "g": formatYearISO, + "G": formatFullYearISO, "H": formatHour24, "I": formatHour12, "j": formatDayOfYear, @@ -13279,7 +15955,7 @@ function formatLocale$1(locale) { "W": formatWeekNumberMonday, "x": null, "X": null, - "y": formatYear$1, + "y": formatYear, "Y": formatFullYear, "Z": formatZone, "%": formatLiteralPercent @@ -13294,6 +15970,8 @@ function formatLocale$1(locale) { "d": formatUTCDayOfMonth, "e": formatUTCDayOfMonth, "f": formatUTCMicroseconds, + "g": formatUTCYearISO, + "G": formatUTCFullYearISO, "H": formatUTCHour24, "I": formatUTCHour12, "j": formatUTCDayOfYear, @@ -13327,6 +16005,8 @@ function formatLocale$1(locale) { "d": parseDayOfMonth, "e": parseDayOfMonth, "f": parseMicroseconds, + "g": parseYear, + "G": parseFullYear, "H": parseHour24, "I": parseHour24, "j": parseDayOfYear, @@ -13391,7 +16071,7 @@ function formatLocale$1(locale) { return function(string) { var d = newDate(1900, undefined, 1), i = parseSpecifier(d, specifier, string += "", 0), - week, day$1; + week, day; if (i != string.length) return null; // If a UNIX timestamp is specified, return it. @@ -13412,25 +16092,25 @@ function formatLocale$1(locale) { if (d.V < 1 || d.V > 53) return null; if (!("w" in d)) d.w = 1; if ("Z" in d) { - week = utcDate(newDate(d.y, 0, 1)), day$1 = week.getUTCDay(); - week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week); - week = utcDay.offset(week, (d.V - 1) * 7); + week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); + week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week); + week = utcDay$1.offset(week, (d.V - 1) * 7); d.y = week.getUTCFullYear(); d.m = week.getUTCMonth(); d.d = week.getUTCDate() + (d.w + 6) % 7; } else { - week = localDate(newDate(d.y, 0, 1)), day$1 = week.getDay(); - week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week); - week = day.offset(week, (d.V - 1) * 7); + week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); + week = day > 4 || day === 0 ? monday.ceil(week) : monday(week); + week = timeDay.offset(week, (d.V - 1) * 7); d.y = week.getFullYear(); d.m = week.getMonth(); d.d = week.getDate() + (d.w + 6) % 7; } } else if ("W" in d || "U" in d) { if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; - day$1 = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); d.m = 0; - d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$1 + 5) % 7 : d.w + d.U * 7 - (day$1 + 6) % 7; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; } // If a time zone is specified, all fields are interpreted as UTC and then @@ -13470,27 +16150,27 @@ function formatLocale$1(locale) { function parsePeriod(d, string, i) { var n = periodRe.exec(string.slice(i)); - return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseShortWeekday(d, string, i) { var n = shortWeekdayRe.exec(string.slice(i)); - return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseWeekday(d, string, i) { var n = weekdayRe.exec(string.slice(i)); - return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseShortMonth(d, string, i) { var n = shortMonthRe.exec(string.slice(i)); - return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseMonth(d, string, i) { var n = monthRe.exec(string.slice(i)); - return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } function parseLocaleDateTime(d, string, i) { @@ -13582,7 +16262,7 @@ var pads = {"-": "", "_": " ", "0": "0"}, percentRe = /^%/, requoteRe = /[\\^$*+?|[\]().{}]/g; -function pad$1(value, fill, width) { +function pad(value, fill, width) { var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length; @@ -13598,9 +16278,7 @@ function formatRe(names) { } function formatLookup(names) { - var map = {}, i = -1, n = names.length; - while (++i < n) map[names[i].toLowerCase()] = i; - return map; + return new Map(names.map((name, i) => [name.toLowerCase(), i])); } function parseWeekdayNumberSunday(d, string, i) { @@ -13704,23 +16382,23 @@ function parseUnixTimestampSeconds(d, string, i) { } function formatDayOfMonth(d, p) { - return pad$1(d.getDate(), p, 2); + return pad(d.getDate(), p, 2); } function formatHour24(d, p) { - return pad$1(d.getHours(), p, 2); + return pad(d.getHours(), p, 2); } function formatHour12(d, p) { - return pad$1(d.getHours() % 12 || 12, p, 2); + return pad(d.getHours() % 12 || 12, p, 2); } function formatDayOfYear(d, p) { - return pad$1(1 + day.count(year(d), d), p, 3); + return pad(1 + timeDay.count(timeYear(d), d), p, 3); } function formatMilliseconds(d, p) { - return pad$1(d.getMilliseconds(), p, 3); + return pad(d.getMilliseconds(), p, 3); } function formatMicroseconds(d, p) { @@ -13728,15 +16406,15 @@ function formatMicroseconds(d, p) { } function formatMonthNumber(d, p) { - return pad$1(d.getMonth() + 1, p, 2); + return pad(d.getMonth() + 1, p, 2); } function formatMinutes(d, p) { - return pad$1(d.getMinutes(), p, 2); + return pad(d.getMinutes(), p, 2); } function formatSeconds(d, p) { - return pad$1(d.getSeconds(), p, 2); + return pad(d.getSeconds(), p, 2); } function formatWeekdayNumberMonday(d) { @@ -13745,13 +16423,17 @@ function formatWeekdayNumberMonday(d) { } function formatWeekNumberSunday(d, p) { - return pad$1(sunday.count(year(d) - 1, d), p, 2); + return pad(sunday.count(timeYear(d) - 1, d), p, 2); } -function formatWeekNumberISO(d, p) { +function dISO(d) { var day = d.getDay(); - d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); - return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2); + return (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); +} + +function formatWeekNumberISO(d, p) { + d = dISO(d); + return pad(thursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2); } function formatWeekdayNumberSunday(d) { @@ -13759,42 +16441,53 @@ function formatWeekdayNumberSunday(d) { } function formatWeekNumberMonday(d, p) { - return pad$1(monday.count(year(d) - 1, d), p, 2); + return pad(monday.count(timeYear(d) - 1, d), p, 2); +} + +function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); } -function formatYear$1(d, p) { - return pad$1(d.getFullYear() % 100, p, 2); +function formatYearISO(d, p) { + d = dISO(d); + return pad(d.getFullYear() % 100, p, 2); } function formatFullYear(d, p) { - return pad$1(d.getFullYear() % 10000, p, 4); + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatFullYearISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); + return pad(d.getFullYear() % 10000, p, 4); } function formatZone(d) { var z = d.getTimezoneOffset(); return (z > 0 ? "-" : (z *= -1, "+")) - + pad$1(z / 60 | 0, "0", 2) - + pad$1(z % 60, "0", 2); + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); } function formatUTCDayOfMonth(d, p) { - return pad$1(d.getUTCDate(), p, 2); + return pad(d.getUTCDate(), p, 2); } function formatUTCHour24(d, p) { - return pad$1(d.getUTCHours(), p, 2); + return pad(d.getUTCHours(), p, 2); } function formatUTCHour12(d, p) { - return pad$1(d.getUTCHours() % 12 || 12, p, 2); + return pad(d.getUTCHours() % 12 || 12, p, 2); } function formatUTCDayOfYear(d, p) { - return pad$1(1 + utcDay.count(utcYear(d), d), p, 3); + return pad(1 + utcDay$1.count(utcYear$1(d), d), p, 3); } function formatUTCMilliseconds(d, p) { - return pad$1(d.getUTCMilliseconds(), p, 3); + return pad(d.getUTCMilliseconds(), p, 3); } function formatUTCMicroseconds(d, p) { @@ -13802,15 +16495,15 @@ function formatUTCMicroseconds(d, p) { } function formatUTCMonthNumber(d, p) { - return pad$1(d.getUTCMonth() + 1, p, 2); + return pad(d.getUTCMonth() + 1, p, 2); } function formatUTCMinutes(d, p) { - return pad$1(d.getUTCMinutes(), p, 2); + return pad(d.getUTCMinutes(), p, 2); } function formatUTCSeconds(d, p) { - return pad$1(d.getUTCSeconds(), p, 2); + return pad(d.getUTCSeconds(), p, 2); } function formatUTCWeekdayNumberMonday(d) { @@ -13819,13 +16512,17 @@ function formatUTCWeekdayNumberMonday(d) { } function formatUTCWeekNumberSunday(d, p) { - return pad$1(utcSunday.count(utcYear(d) - 1, d), p, 2); + return pad(utcSunday.count(utcYear$1(d) - 1, d), p, 2); } -function formatUTCWeekNumberISO(d, p) { +function UTCdISO(d) { var day = d.getUTCDay(); - d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); - return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2); + return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); +} + +function formatUTCWeekNumberISO(d, p) { + d = UTCdISO(d); + return pad(utcThursday.count(utcYear$1(d), d) + (utcYear$1(d).getUTCDay() === 4), p, 2); } function formatUTCWeekdayNumberSunday(d) { @@ -13833,15 +16530,26 @@ function formatUTCWeekdayNumberSunday(d) { } function formatUTCWeekNumberMonday(d, p) { - return pad$1(utcMonday.count(utcYear(d) - 1, d), p, 2); + return pad(utcMonday.count(utcYear$1(d) - 1, d), p, 2); } function formatUTCYear(d, p) { - return pad$1(d.getUTCFullYear() % 100, p, 2); + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCYearISO(d, p) { + d = UTCdISO(d); + return pad(d.getUTCFullYear() % 100, p, 2); } function formatUTCFullYear(d, p) { - return pad$1(d.getUTCFullYear() % 10000, p, 4); + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCFullYearISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); + return pad(d.getUTCFullYear() % 10000, p, 4); } function formatUTCZone() { @@ -13860,9 +16568,13 @@ function formatUnixTimestampSeconds(d) { return Math.floor(+d / 1000); } -var locale$1; +var locale; +exports.timeFormat = void 0; +exports.timeParse = void 0; +exports.utcFormat = void 0; +exports.utcParse = void 0; -defaultLocale$1({ +defaultLocale({ dateTime: "%x, %X", date: "%-m/%-d/%Y", time: "%-I:%M:%S %p", @@ -13873,13 +16585,13 @@ defaultLocale$1({ shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] }); -function defaultLocale$1(definition) { - locale$1 = formatLocale$1(definition); - exports.timeFormat = locale$1.format; - exports.timeParse = locale$1.parse; - exports.utcFormat = locale$1.utcFormat; - exports.utcParse = locale$1.utcParse; - return locale$1; +function defaultLocale(definition) { + locale = formatLocale(definition); + exports.timeFormat = locale.format; + exports.timeParse = locale.parse; + exports.utcFormat = locale.utcFormat; + exports.utcParse = locale.utcParse; + return locale; } var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; @@ -13892,6 +16604,8 @@ var formatIso = Date.prototype.toISOString ? formatIsoNative : exports.utcFormat(isoSpecifier); +var formatIso$1 = formatIso; + function parseIsoNative(string) { var date = new Date(string); return isNaN(date) ? null : date; @@ -13901,24 +16615,18 @@ var parseIso = +new Date("2000-01-01T00:00:00.000Z") ? parseIsoNative : exports.utcParse(isoSpecifier); -var durationSecond$1 = 1000, - durationMinute$1 = durationSecond$1 * 60, - durationHour$1 = durationMinute$1 * 60, - durationDay$1 = durationHour$1 * 24, - durationWeek$1 = durationDay$1 * 7, - durationMonth = durationDay$1 * 30, - durationYear = durationDay$1 * 365; +var parseIso$1 = parseIso; -function date$1(t) { +function date(t) { return new Date(t); } -function number$3(t) { +function number(t) { return t instanceof Date ? +t : +new Date(+t); } -function calendar(year, month, week, day, hour, minute, second, millisecond, format) { - var scale = continuous(identity$6, identity$6), +function calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) { + var scale = continuous(), invert = scale.invert, domain = scale.domain; @@ -13931,27 +16639,6 @@ function calendar(year, month, week, day, hour, minute, second, millisecond, for formatMonth = format("%B"), formatYear = format("%Y"); - var tickIntervals = [ - [second, 1, durationSecond$1], - [second, 5, 5 * durationSecond$1], - [second, 15, 15 * durationSecond$1], - [second, 30, 30 * durationSecond$1], - [minute, 1, durationMinute$1], - [minute, 5, 5 * durationMinute$1], - [minute, 15, 15 * durationMinute$1], - [minute, 30, 30 * durationMinute$1], - [ hour, 1, durationHour$1 ], - [ hour, 3, 3 * durationHour$1 ], - [ hour, 6, 6 * durationHour$1 ], - [ hour, 12, 12 * durationHour$1 ], - [ day, 1, durationDay$1 ], - [ day, 2, 2 * durationDay$1 ], - [ week, 1, durationWeek$1 ], - [ month, 1, durationMonth ], - [ month, 3, 3 * durationMonth ], - [ year, 1, durationYear ] - ]; - function tickFormat(date) { return (second(date) < date ? formatMillisecond : minute(date) < date ? formatSecond @@ -13962,94 +16649,61 @@ function calendar(year, month, week, day, hour, minute, second, millisecond, for : formatYear)(date); } - function tickInterval(interval, start, stop, step) { - if (interval == null) interval = 10; - - // If a desired tick count is specified, pick a reasonable tick interval - // based on the extent of the domain and a rough estimate of tick size. - // Otherwise, assume interval is already a time interval and use it. - if (typeof interval === "number") { - var target = Math.abs(stop - start) / interval, - i = bisector(function(i) { return i[2]; }).right(tickIntervals, target); - if (i === tickIntervals.length) { - step = tickStep(start / durationYear, stop / durationYear, interval); - interval = year; - } else if (i) { - i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; - step = i[1]; - interval = i[0]; - } else { - step = Math.max(tickStep(start, stop, interval), 1); - interval = millisecond; - } - } - - return step == null ? interval : interval.every(step); - } - scale.invert = function(y) { return new Date(invert(y)); }; scale.domain = function(_) { - return arguments.length ? domain(map$3.call(_, number$3)) : domain().map(date$1); + return arguments.length ? domain(Array.from(_, number)) : domain().map(date); }; - scale.ticks = function(interval, step) { - var d = domain(), - t0 = d[0], - t1 = d[d.length - 1], - r = t1 < t0, - t; - if (r) t = t0, t0 = t1, t1 = t; - t = tickInterval(interval, t0, t1, step); - t = t ? t.range(t0, t1 + 1) : []; // inclusive stop - return r ? t.reverse() : t; + scale.ticks = function(interval) { + var d = domain(); + return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval); }; scale.tickFormat = function(count, specifier) { return specifier == null ? tickFormat : format(specifier); }; - scale.nice = function(interval, step) { + scale.nice = function(interval) { var d = domain(); - return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) - ? domain(nice(d, interval)) - : scale; + if (!interval || typeof interval.range !== "function") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval); + return interval ? domain(nice(d, interval)) : scale; }; scale.copy = function() { - return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + return copy$1(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format)); }; return scale; } function time() { - return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); + return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, sunday, timeDay, timeHour, timeMinute, utcSecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); } function utcTime() { - return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); + return initRange.apply(calendar(utcTicks, utcTickInterval, utcYear$1, utcMonth$1, utcSunday, utcDay$1, utcHour$1, utcMinute$1, utcSecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); } -function transformer$2() { +function transformer$1() { var x0 = 0, x1 = 1, t0, t1, k10, transform, - interpolator = identity$6, + interpolator = identity$3, clamp = false, unknown; function scale(x) { - return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); } scale.domain = function(_) { - return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; }; scale.clamp = function(_) { @@ -14060,6 +16714,17 @@ function transformer$2() { return arguments.length ? (interpolator = _, scale) : interpolator; }; + function range(interpolate) { + return function(_) { + var r0, r1; + return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)]; + }; + } + + scale.range = range(interpolate$2); + + scale.rangeRound = range(interpolateRound); + scale.unknown = function(_) { return arguments.length ? (unknown = _, scale) : unknown; }; @@ -14070,7 +16735,7 @@ function transformer$2() { }; } -function copy$1(source, target) { +function copy(source, target) { return target .domain(source.domain()) .interpolator(source.interpolator()) @@ -14079,40 +16744,40 @@ function copy$1(source, target) { } function sequential() { - var scale = linearish(transformer$2()(identity$6)); + var scale = linearish(transformer$1()(identity$3)); scale.copy = function() { - return copy$1(scale, sequential()); + return copy(scale, sequential()); }; return initInterpolator.apply(scale, arguments); } function sequentialLog() { - var scale = loggish(transformer$2()).domain([1, 10]); + var scale = loggish(transformer$1()).domain([1, 10]); scale.copy = function() { - return copy$1(scale, sequentialLog()).base(scale.base()); + return copy(scale, sequentialLog()).base(scale.base()); }; return initInterpolator.apply(scale, arguments); } function sequentialSymlog() { - var scale = symlogish(transformer$2()); + var scale = symlogish(transformer$1()); scale.copy = function() { - return copy$1(scale, sequentialSymlog()).constant(scale.constant()); + return copy(scale, sequentialSymlog()).constant(scale.constant()); }; return initInterpolator.apply(scale, arguments); } function sequentialPow() { - var scale = powish(transformer$2()); + var scale = powish(transformer$1()); scale.copy = function() { - return copy$1(scale, sequentialPow()).exponent(scale.exponent()); + return copy(scale, sequentialPow()).exponent(scale.exponent()); }; return initInterpolator.apply(scale, arguments); @@ -14124,17 +16789,17 @@ function sequentialSqrt() { function sequentialQuantile() { var domain = [], - interpolator = identity$6; + interpolator = identity$3; function scale(x) { - if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1)); + if (x != null && !isNaN(x = +x)) return interpolator((bisect(domain, x, 1) - 1) / (domain.length - 1)); } scale.domain = function(_) { if (!arguments.length) return domain.slice(); domain = []; - for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); - domain.sort(ascending); + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending$3); return scale; }; @@ -14142,6 +16807,14 @@ function sequentialQuantile() { return arguments.length ? (interpolator = _, scale) : interpolator; }; + scale.range = function() { + return domain.map((d, i) => interpolator(i / (domain.length - 1))); + }; + + scale.quantiles = function(n) { + return Array.from({length: n + 1}, (_, i) => quantile$1(domain, i / n)); + }; + scale.copy = function() { return sequentialQuantile(interpolator).domain(domain); }; @@ -14149,26 +16822,27 @@ function sequentialQuantile() { return initInterpolator.apply(scale, arguments); } -function transformer$3() { +function transformer() { var x0 = 0, x1 = 0.5, x2 = 1, + s = 1, t0, t1, t2, k10, k21, - interpolator = identity$6, + interpolator = identity$3, transform, clamp = false, unknown; function scale(x) { - return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); } scale.domain = function(_) { - return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2]; + return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2]; }; scale.clamp = function(_) { @@ -14179,51 +16853,62 @@ function transformer$3() { return arguments.length ? (interpolator = _, scale) : interpolator; }; + function range(interpolate) { + return function(_) { + var r0, r1, r2; + return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)]; + }; + } + + scale.range = range(interpolate$2); + + scale.rangeRound = range(interpolateRound); + scale.unknown = function(_) { return arguments.length ? (unknown = _, scale) : unknown; }; return function(t) { - transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1); + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1; return scale; }; } -function diverging() { - var scale = linearish(transformer$3()(identity$6)); +function diverging$1() { + var scale = linearish(transformer()(identity$3)); scale.copy = function() { - return copy$1(scale, diverging()); + return copy(scale, diverging$1()); }; return initInterpolator.apply(scale, arguments); } function divergingLog() { - var scale = loggish(transformer$3()).domain([0.1, 1, 10]); + var scale = loggish(transformer()).domain([0.1, 1, 10]); scale.copy = function() { - return copy$1(scale, divergingLog()).base(scale.base()); + return copy(scale, divergingLog()).base(scale.base()); }; return initInterpolator.apply(scale, arguments); } function divergingSymlog() { - var scale = symlogish(transformer$3()); + var scale = symlogish(transformer()); scale.copy = function() { - return copy$1(scale, divergingSymlog()).constant(scale.constant()); + return copy(scale, divergingSymlog()).constant(scale.constant()); }; return initInterpolator.apply(scale, arguments); } function divergingPow() { - var scale = powish(transformer$3()); + var scale = powish(transformer()); scale.copy = function() { - return copy$1(scale, divergingPow()).exponent(scale.exponent()); + return copy(scale, divergingPow()).exponent(scale.exponent()); }; return initInterpolator.apply(scale, arguments); @@ -14259,11 +16944,9 @@ var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdc var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); -function ramp(scheme) { - return rgbBasis(scheme[scheme.length - 1]); -} +var ramp$1 = scheme => rgbBasis(scheme[scheme.length - 1]); -var scheme = new Array(3).concat( +var scheme$q = new Array(3).concat( "d8b365f5f5f55ab4ac", "a6611adfc27d80cdc1018571", "a6611adfc27df5f5f580cdc1018571", @@ -14275,9 +16958,9 @@ var scheme = new Array(3).concat( "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" ).map(colors); -var BrBG = ramp(scheme); +var BrBG = ramp$1(scheme$q); -var scheme$1 = new Array(3).concat( +var scheme$p = new Array(3).concat( "af8dc3f7f7f77fbf7b", "7b3294c2a5cfa6dba0008837", "7b3294c2a5cff7f7f7a6dba0008837", @@ -14289,9 +16972,9 @@ var scheme$1 = new Array(3).concat( "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" ).map(colors); -var PRGn = ramp(scheme$1); +var PRGn = ramp$1(scheme$p); -var scheme$2 = new Array(3).concat( +var scheme$o = new Array(3).concat( "e9a3c9f7f7f7a1d76a", "d01c8bf1b6dab8e1864dac26", "d01c8bf1b6daf7f7f7b8e1864dac26", @@ -14303,9 +16986,9 @@ var scheme$2 = new Array(3).concat( "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" ).map(colors); -var PiYG = ramp(scheme$2); +var PiYG = ramp$1(scheme$o); -var scheme$3 = new Array(3).concat( +var scheme$n = new Array(3).concat( "998ec3f7f7f7f1a340", "5e3c99b2abd2fdb863e66101", "5e3c99b2abd2f7f7f7fdb863e66101", @@ -14317,9 +17000,9 @@ var scheme$3 = new Array(3).concat( "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" ).map(colors); -var PuOr = ramp(scheme$3); +var PuOr = ramp$1(scheme$n); -var scheme$4 = new Array(3).concat( +var scheme$m = new Array(3).concat( "ef8a62f7f7f767a9cf", "ca0020f4a58292c5de0571b0", "ca0020f4a582f7f7f792c5de0571b0", @@ -14331,9 +17014,9 @@ var scheme$4 = new Array(3).concat( "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" ).map(colors); -var RdBu = ramp(scheme$4); +var RdBu = ramp$1(scheme$m); -var scheme$5 = new Array(3).concat( +var scheme$l = new Array(3).concat( "ef8a62ffffff999999", "ca0020f4a582bababa404040", "ca0020f4a582ffffffbababa404040", @@ -14345,9 +17028,9 @@ var scheme$5 = new Array(3).concat( "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" ).map(colors); -var RdGy = ramp(scheme$5); +var RdGy = ramp$1(scheme$l); -var scheme$6 = new Array(3).concat( +var scheme$k = new Array(3).concat( "fc8d59ffffbf91bfdb", "d7191cfdae61abd9e92c7bb6", "d7191cfdae61ffffbfabd9e92c7bb6", @@ -14359,9 +17042,9 @@ var scheme$6 = new Array(3).concat( "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" ).map(colors); -var RdYlBu = ramp(scheme$6); +var RdYlBu = ramp$1(scheme$k); -var scheme$7 = new Array(3).concat( +var scheme$j = new Array(3).concat( "fc8d59ffffbf91cf60", "d7191cfdae61a6d96a1a9641", "d7191cfdae61ffffbfa6d96a1a9641", @@ -14373,9 +17056,9 @@ var scheme$7 = new Array(3).concat( "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" ).map(colors); -var RdYlGn = ramp(scheme$7); +var RdYlGn = ramp$1(scheme$j); -var scheme$8 = new Array(3).concat( +var scheme$i = new Array(3).concat( "fc8d59ffffbf99d594", "d7191cfdae61abdda42b83ba", "d7191cfdae61ffffbfabdda42b83ba", @@ -14387,9 +17070,9 @@ var scheme$8 = new Array(3).concat( "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" ).map(colors); -var Spectral = ramp(scheme$8); +var Spectral = ramp$1(scheme$i); -var scheme$9 = new Array(3).concat( +var scheme$h = new Array(3).concat( "e5f5f999d8c92ca25f", "edf8fbb2e2e266c2a4238b45", "edf8fbb2e2e266c2a42ca25f006d2c", @@ -14399,9 +17082,9 @@ var scheme$9 = new Array(3).concat( "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" ).map(colors); -var BuGn = ramp(scheme$9); +var BuGn = ramp$1(scheme$h); -var scheme$a = new Array(3).concat( +var scheme$g = new Array(3).concat( "e0ecf49ebcda8856a7", "edf8fbb3cde38c96c688419d", "edf8fbb3cde38c96c68856a7810f7c", @@ -14411,9 +17094,9 @@ var scheme$a = new Array(3).concat( "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" ).map(colors); -var BuPu = ramp(scheme$a); +var BuPu = ramp$1(scheme$g); -var scheme$b = new Array(3).concat( +var scheme$f = new Array(3).concat( "e0f3dba8ddb543a2ca", "f0f9e8bae4bc7bccc42b8cbe", "f0f9e8bae4bc7bccc443a2ca0868ac", @@ -14423,9 +17106,9 @@ var scheme$b = new Array(3).concat( "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" ).map(colors); -var GnBu = ramp(scheme$b); +var GnBu = ramp$1(scheme$f); -var scheme$c = new Array(3).concat( +var scheme$e = new Array(3).concat( "fee8c8fdbb84e34a33", "fef0d9fdcc8afc8d59d7301f", "fef0d9fdcc8afc8d59e34a33b30000", @@ -14435,7 +17118,7 @@ var scheme$c = new Array(3).concat( "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" ).map(colors); -var OrRd = ramp(scheme$c); +var OrRd = ramp$1(scheme$e); var scheme$d = new Array(3).concat( "ece2f0a6bddb1c9099", @@ -14447,9 +17130,9 @@ var scheme$d = new Array(3).concat( "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" ).map(colors); -var PuBuGn = ramp(scheme$d); +var PuBuGn = ramp$1(scheme$d); -var scheme$e = new Array(3).concat( +var scheme$c = new Array(3).concat( "ece7f2a6bddb2b8cbe", "f1eef6bdc9e174a9cf0570b0", "f1eef6bdc9e174a9cf2b8cbe045a8d", @@ -14459,9 +17142,9 @@ var scheme$e = new Array(3).concat( "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" ).map(colors); -var PuBu = ramp(scheme$e); +var PuBu = ramp$1(scheme$c); -var scheme$f = new Array(3).concat( +var scheme$b = new Array(3).concat( "e7e1efc994c7dd1c77", "f1eef6d7b5d8df65b0ce1256", "f1eef6d7b5d8df65b0dd1c77980043", @@ -14471,9 +17154,9 @@ var scheme$f = new Array(3).concat( "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" ).map(colors); -var PuRd = ramp(scheme$f); +var PuRd = ramp$1(scheme$b); -var scheme$g = new Array(3).concat( +var scheme$a = new Array(3).concat( "fde0ddfa9fb5c51b8a", "feebe2fbb4b9f768a1ae017e", "feebe2fbb4b9f768a1c51b8a7a0177", @@ -14483,9 +17166,9 @@ var scheme$g = new Array(3).concat( "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" ).map(colors); -var RdPu = ramp(scheme$g); +var RdPu = ramp$1(scheme$a); -var scheme$h = new Array(3).concat( +var scheme$9 = new Array(3).concat( "edf8b17fcdbb2c7fb8", "ffffcca1dab441b6c4225ea8", "ffffcca1dab441b6c42c7fb8253494", @@ -14495,9 +17178,9 @@ var scheme$h = new Array(3).concat( "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" ).map(colors); -var YlGnBu = ramp(scheme$h); +var YlGnBu = ramp$1(scheme$9); -var scheme$i = new Array(3).concat( +var scheme$8 = new Array(3).concat( "f7fcb9addd8e31a354", "ffffccc2e69978c679238443", "ffffccc2e69978c67931a354006837", @@ -14507,9 +17190,9 @@ var scheme$i = new Array(3).concat( "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" ).map(colors); -var YlGn = ramp(scheme$i); +var YlGn = ramp$1(scheme$8); -var scheme$j = new Array(3).concat( +var scheme$7 = new Array(3).concat( "fff7bcfec44fd95f0e", "ffffd4fed98efe9929cc4c02", "ffffd4fed98efe9929d95f0e993404", @@ -14519,9 +17202,9 @@ var scheme$j = new Array(3).concat( "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" ).map(colors); -var YlOrBr = ramp(scheme$j); +var YlOrBr = ramp$1(scheme$7); -var scheme$k = new Array(3).concat( +var scheme$6 = new Array(3).concat( "ffeda0feb24cf03b20", "ffffb2fecc5cfd8d3ce31a1c", "ffffb2fecc5cfd8d3cf03b20bd0026", @@ -14531,9 +17214,9 @@ var scheme$k = new Array(3).concat( "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" ).map(colors); -var YlOrRd = ramp(scheme$k); +var YlOrRd = ramp$1(scheme$6); -var scheme$l = new Array(3).concat( +var scheme$5 = new Array(3).concat( "deebf79ecae13182bd", "eff3ffbdd7e76baed62171b5", "eff3ffbdd7e76baed63182bd08519c", @@ -14543,9 +17226,9 @@ var scheme$l = new Array(3).concat( "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" ).map(colors); -var Blues = ramp(scheme$l); +var Blues = ramp$1(scheme$5); -var scheme$m = new Array(3).concat( +var scheme$4 = new Array(3).concat( "e5f5e0a1d99b31a354", "edf8e9bae4b374c476238b45", "edf8e9bae4b374c47631a354006d2c", @@ -14555,9 +17238,9 @@ var scheme$m = new Array(3).concat( "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" ).map(colors); -var Greens = ramp(scheme$m); +var Greens = ramp$1(scheme$4); -var scheme$n = new Array(3).concat( +var scheme$3 = new Array(3).concat( "f0f0f0bdbdbd636363", "f7f7f7cccccc969696525252", "f7f7f7cccccc969696636363252525", @@ -14567,9 +17250,9 @@ var scheme$n = new Array(3).concat( "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" ).map(colors); -var Greys = ramp(scheme$n); +var Greys = ramp$1(scheme$3); -var scheme$o = new Array(3).concat( +var scheme$2 = new Array(3).concat( "efedf5bcbddc756bb1", "f2f0f7cbc9e29e9ac86a51a3", "f2f0f7cbc9e29e9ac8756bb154278f", @@ -14579,9 +17262,9 @@ var scheme$o = new Array(3).concat( "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" ).map(colors); -var Purples = ramp(scheme$o); +var Purples = ramp$1(scheme$2); -var scheme$p = new Array(3).concat( +var scheme$1 = new Array(3).concat( "fee0d2fc9272de2d26", "fee5d9fcae91fb6a4acb181d", "fee5d9fcae91fb6a4ade2d26a50f15", @@ -14591,9 +17274,9 @@ var scheme$p = new Array(3).concat( "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" ).map(colors); -var Reds = ramp(scheme$p); +var Reds = ramp$1(scheme$1); -var scheme$q = new Array(3).concat( +var scheme = new Array(3).concat( "fee6cefdae6be6550d", "feeddefdbe85fd8d3cd94701", "feeddefdbe85fd8d3ce6550da63603", @@ -14603,7 +17286,7 @@ var scheme$q = new Array(3).concat( "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" ).map(colors); -var Oranges = ramp(scheme$q); +var Oranges = ramp$1(scheme); function cividis(t) { t = Math.max(0, Math.min(1, t)); @@ -14614,21 +17297,21 @@ function cividis(t) { + ")"; } -var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0)); +var cubehelix = cubehelixLong(cubehelix$3(300, 0.5, 0.0), cubehelix$3(-240, 0.5, 1.0)); -var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); +var warm = cubehelixLong(cubehelix$3(-100, 0.75, 0.35), cubehelix$3(80, 1.50, 0.8)); -var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); +var cool = cubehelixLong(cubehelix$3(260, 0.75, 0.35), cubehelix$3(80, 1.50, 0.8)); -var c = cubehelix(); +var c$2 = cubehelix$3(); function rainbow(t) { if (t < 0 || t > 1) t -= Math.floor(t); var ts = Math.abs(t - 0.5); - c.h = 360 * t - 100; - c.s = 1.5 - 1.5 * ts; - c.l = 0.8 - 0.9 * ts; - return c + ""; + c$2.h = 360 * t - 100; + c$2.s = 1.5 - 1.5 * ts; + c$2.l = 0.8 - 0.9 * ts; + return c$2 + ""; } var c$1 = rgb(), @@ -14653,46 +17336,46 @@ function turbo(t) { + ")"; } -function ramp$1(range) { +function ramp(range) { var n = range.length; return function(t) { return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; }; } -var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); +var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); -var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); +var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); -var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); +var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); -var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); +var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); -function constant$b(x) { +function constant$1(x) { return function constant() { return x; }; } -var abs$1 = Math.abs; -var atan2$1 = Math.atan2; -var cos$2 = Math.cos; -var max$2 = Math.max; -var min$1 = Math.min; -var sin$2 = Math.sin; -var sqrt$2 = Math.sqrt; +const abs = Math.abs; +const atan2 = Math.atan2; +const cos = Math.cos; +const max = Math.max; +const min = Math.min; +const sin = Math.sin; +const sqrt = Math.sqrt; -var epsilon$3 = 1e-12; -var pi$4 = Math.PI; -var halfPi$3 = pi$4 / 2; -var tau$4 = 2 * pi$4; +const epsilon = 1e-12; +const pi = Math.PI; +const halfPi = pi / 2; +const tau = 2 * pi; -function acos$1(x) { - return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x); +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); } -function asin$1(x) { - return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x); +function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); } function arcInnerRadius(d) { @@ -14719,7 +17402,7 @@ function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { var x10 = x1 - x0, y10 = y1 - y0, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10; - if (t * t < epsilon$3) return; + if (t * t < epsilon) return; t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; return [x0 + t * x10, y0 + t * y10]; } @@ -14729,7 +17412,7 @@ function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { var x01 = x0 - x1, y01 = y0 - y1, - lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), + lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x0 + ox, @@ -14743,7 +17426,7 @@ function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { d2 = dx * dx + dy * dy, r = r1 - rc, D = x11 * y10 - x10 * y11, - d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)), + d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, @@ -14770,7 +17453,7 @@ function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { function arc() { var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, - cornerRadius = constant$b(0), + cornerRadius = constant$1(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, @@ -14782,9 +17465,9 @@ function arc() { r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) - halfPi$3, - a1 = endAngle.apply(this, arguments) - halfPi$3, - da = abs$1(a1 - a0), + a0 = startAngle.apply(this, arguments) - halfPi, + a1 = endAngle.apply(this, arguments) - halfPi, + da = abs(a1 - a0), cw = a1 > a0; if (!context) context = buffer = path(); @@ -14793,14 +17476,14 @@ function arc() { if (r1 < r0) r = r1, r1 = r0, r0 = r; // Is it a point? - if (!(r1 > epsilon$3)) context.moveTo(0, 0); + if (!(r1 > epsilon)) context.moveTo(0, 0); // Or is it a circle or annulus? - else if (da > tau$4 - epsilon$3) { - context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0)); + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); context.arc(0, 0, r1, a0, a1, !cw); - if (r0 > epsilon$3) { - context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1)); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); context.arc(0, 0, r0, a1, a0, cw); } } @@ -14814,67 +17497,67 @@ function arc() { da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, - rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)), - rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t0, t1; // Apply padding? Note that since r1 โ‰ฅ r0, da1 โ‰ฅ da0. - if (rp > epsilon$3) { - var p0 = asin$1(rp / r0 * sin$2(ap)), - p1 = asin$1(rp / r1 * sin$2(ap)); - if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; else da0 = 0, a00 = a10 = (a0 + a1) / 2; - if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; else da1 = 0, a01 = a11 = (a0 + a1) / 2; } - var x01 = r1 * cos$2(a01), - y01 = r1 * sin$2(a01), - x10 = r0 * cos$2(a10), - y10 = r0 * sin$2(a10); + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); // Apply rounded corners? - if (rc > epsilon$3) { - var x11 = r1 * cos$2(a11), - y11 = r1 * sin$2(a11), - x00 = r0 * cos$2(a00), - y00 = r0 * sin$2(a00), + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), oc; // Restrict the corner radius according to the sector angle. - if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], - kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2), - lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]); - rc0 = min$1(rc, (r0 - lc) / (kc - 1)); - rc1 = min$1(rc, (r1 - lc) / (kc + 1)); + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); } } // Is the sector collapsed to a line? - if (!(da1 > epsilon$3)) context.moveTo(x01, y01); + if (!(da1 > epsilon)) context.moveTo(x01, y01); // Does the sectorโ€™s outer ring have rounded corners? - else if (rc1 > epsilon$3) { + else if (rc1 > epsilon) { t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); // Have the corners merged? - if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); // Otherwise, draw the two corners and the ring. else { - context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); - context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw); - context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); } } @@ -14883,23 +17566,23 @@ function arc() { // Is there no inner ring, and itโ€™s a circular sector? // Or perhaps itโ€™s an annular sector collapsed due to padding? - if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10); + if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); // Does the sectorโ€™s inner ring (or point) have rounded corners? - else if (rc0 > epsilon$3) { + else if (rc0 > epsilon) { t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); // Have the corners merged? - if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); // Otherwise, draw the two corners and the ring. else { - context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); - context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw); - context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); } } @@ -14914,36 +17597,36 @@ function arc() { arc.centroid = function() { var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, - a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2; - return [cos$2(a) * r, sin$2(a) * r]; + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; }; arc.innerRadius = function(_) { - return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius; + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : innerRadius; }; arc.outerRadius = function(_) { - return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius; + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : outerRadius; }; arc.cornerRadius = function(_) { - return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius; + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : cornerRadius; }; arc.padRadius = function(_) { - return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius; + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), arc) : padRadius; }; arc.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle; + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : startAngle; }; arc.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle; + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : endAngle; }; arc.padAngle = function(_) { - return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle; + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : padAngle; }; arc.context = function(_) { @@ -14953,6 +17636,14 @@ function arc() { return arc; } +var slice = Array.prototype.slice; + +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + function Linear(context) { this._context = context; } @@ -14975,7 +17666,7 @@ Linear.prototype = { x = +x, y = +y; switch (this._point) { case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; // proceed + case 1: this._point = 2; // falls through default: this._context.lineTo(x, y); break; } } @@ -14985,25 +17676,26 @@ function curveLinear(context) { return new Linear(context); } -function x$3(p) { +function x$1(p) { return p[0]; } -function y$3(p) { +function y(p) { return p[1]; } -function line() { - var x = x$3, - y = y$3, - defined = constant$b(true), +function line(x, y$1) { + var defined = constant$1(true), context = null, curve = curveLinear, output = null; + x = typeof x === "function" ? x : (x === undefined) ? x$1 : constant$1(x); + y$1 = typeof y$1 === "function" ? y$1 : (y$1 === undefined) ? y : constant$1(y$1); + function line(data) { var i, - n = data.length, + n = (data = array(data)).length, d, defined0 = false, buffer; @@ -15015,22 +17707,22 @@ function line() { if (defined0 = !defined0) output.lineStart(); else output.lineEnd(); } - if (defined0) output.point(+x(d, i, data), +y(d, i, data)); + if (defined0) output.point(+x(d, i, data), +y$1(d, i, data)); } if (buffer) return output = null, buffer + "" || null; } line.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x; + return arguments.length ? (x = typeof _ === "function" ? _ : constant$1(+_), line) : x; }; line.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y; + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant$1(+_), line) : y$1; }; line.defined = function(_) { - return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined; + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$1(!!_), line) : defined; }; line.curve = function(_) { @@ -15044,21 +17736,22 @@ function line() { return line; } -function area$3() { - var x0 = x$3, - x1 = null, - y0 = constant$b(0), - y1 = y$3, - defined = constant$b(true), +function area(x0, y0, y1) { + var x1 = null, + defined = constant$1(true), context = null, curve = curveLinear, output = null; + x0 = typeof x0 === "function" ? x0 : (x0 === undefined) ? x$1 : constant$1(+x0); + y0 = typeof y0 === "function" ? y0 : (y0 === undefined) ? constant$1(0) : constant$1(+y0); + y1 = typeof y1 === "function" ? y1 : (y1 === undefined) ? y : constant$1(+y1); + function area(data) { var i, j, k, - n = data.length, + n = (data = array(data)).length, d, defined0 = false, buffer, @@ -15097,27 +17790,27 @@ function area$3() { } area.x = function(_) { - return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0; + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$1(+_), x1 = null, area) : x0; }; area.x0 = function(_) { - return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0; + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$1(+_), area) : x0; }; area.x1 = function(_) { - return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1; + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), area) : x1; }; area.y = function(_) { - return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0; + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$1(+_), y1 = null, area) : y0; }; area.y0 = function(_) { - return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0; + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$1(+_), area) : y0; }; area.y1 = function(_) { - return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1; + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), area) : y1; }; area.lineX0 = @@ -15134,7 +17827,7 @@ function area$3() { }; area.defined = function(_) { - return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined; + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$1(!!_), area) : defined; }; area.curve = function(_) { @@ -15152,28 +17845,28 @@ function descending$1(a, b) { return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; } -function identity$8(d) { +function identity$1(d) { return d; } function pie() { - var value = identity$8, + var value = identity$1, sortValues = descending$1, sort = null, - startAngle = constant$b(0), - endAngle = constant$b(tau$4), - padAngle = constant$b(0); + startAngle = constant$1(0), + endAngle = constant$1(tau), + padAngle = constant$1(0); function pie(data) { var i, - n = data.length, + n = (data = array(data)).length, j, k, sum = 0, index = new Array(n), arcs = new Array(n), a0 = +startAngle.apply(this, arguments), - da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)), + da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), a1, p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), pa = p * (da < 0 ? -1 : 1), @@ -15205,7 +17898,7 @@ function pie() { } pie.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value; + return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), pie) : value; }; pie.sortValues = function(_) { @@ -15217,15 +17910,15 @@ function pie() { }; pie.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle; + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : startAngle; }; pie.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle; + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : endAngle; }; pie.padAngle = function(_) { - return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle; + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : padAngle; }; return pie; @@ -15284,7 +17977,7 @@ function lineRadial$1() { } function areaRadial() { - var a = area$3().curve(curveRadialLinear), + var a = area().curve(curveRadialLinear), c = a.curve, x0 = a.lineX0, x1 = a.lineX1, @@ -15306,14 +17999,85 @@ function areaRadial() { return arguments.length ? c(curveRadial(_)) : c()._curve; }; - return a; + return a; +} + +function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +} + +class Bump { + constructor(context, x) { + this._context = context; + this._x = x; + } + areaStart() { + this._line = 0; + } + areaEnd() { + this._line = NaN; + } + lineStart() { + this._point = 0; + } + lineEnd() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + } + point(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: { + this._point = 1; + if (this._line) this._context.lineTo(x, y); + else this._context.moveTo(x, y); + break; + } + case 1: this._point = 2; // falls through + default: { + if (this._x) this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y); + else this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y); + break; + } + } + this._x0 = x, this._y0 = y; + } +} + +class BumpRadial { + constructor(context) { + this._context = context; + } + lineStart() { + this._point = 0; + } + lineEnd() {} + point(x, y) { + x = +x, y = +y; + if (this._point++ === 0) { + this._x0 = x, this._y0 = y; + } else { + const p0 = pointRadial(this._x0, this._y0); + const p1 = pointRadial(this._x0, this._y0 = (this._y0 + y) / 2); + const p2 = pointRadial(x, this._y0); + const p3 = pointRadial(x, y); + this._context.moveTo(...p0); + this._context.bezierCurveTo(...p1, ...p2, ...p3); + } + } +} + +function bumpX(context) { + return new Bump(context, true); } -function pointRadial(x, y) { - return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +function bumpY(context) { + return new Bump(context, false); } -var slice$6 = Array.prototype.slice; +function bumpRadial(context) { + return new BumpRadial(context); +} function linkSource(d) { return d.source; @@ -15323,18 +18087,25 @@ function linkTarget(d) { return d.target; } -function link$2(curve) { - var source = linkSource, - target = linkTarget, - x = x$3, - y = y$3, - context = null; +function link(curve) { + let source = linkSource; + let target = linkTarget; + let x = x$1; + let y$1 = y; + let context = null; + let output = null; function link() { - var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); - if (!context) context = buffer = path(); - curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv)); - if (buffer) return context = null, buffer + "" || null; + let buffer; + const argv = slice.call(arguments); + const s = source.apply(this, argv); + const t = target.apply(this, argv); + if (context == null) output = curve(buffer = path()); + output.lineStart(); + argv[0] = s, output.point(+x.apply(this, argv), +y$1.apply(this, argv)); + argv[0] = t, output.point(+x.apply(this, argv), +y$1.apply(this, argv)); + output.lineEnd(); + if (buffer) return output = null, buffer + "" || null; } link.source = function(_) { @@ -15346,65 +18117,62 @@ function link$2(curve) { }; link.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x; + return arguments.length ? (x = typeof _ === "function" ? _ : constant$1(+_), link) : x; }; link.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y; + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant$1(+_), link) : y$1; }; link.context = function(_) { - return arguments.length ? ((context = _ == null ? null : _), link) : context; + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), link) : context; }; return link; } -function curveHorizontal(context, x0, y0, x1, y1) { - context.moveTo(x0, y0); - context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); -} - -function curveVertical(context, x0, y0, x1, y1) { - context.moveTo(x0, y0); - context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); -} - -function curveRadial$1(context, x0, y0, x1, y1) { - var p0 = pointRadial(x0, y0), - p1 = pointRadial(x0, y0 = (y0 + y1) / 2), - p2 = pointRadial(x1, y0), - p3 = pointRadial(x1, y1); - context.moveTo(p0[0], p0[1]); - context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); -} - function linkHorizontal() { - return link$2(curveHorizontal); + return link(bumpX); } function linkVertical() { - return link$2(curveVertical); + return link(bumpY); } function linkRadial() { - var l = link$2(curveRadial$1); + const l = link(bumpRadial); l.angle = l.x, delete l.x; l.radius = l.y, delete l.y; return l; } -var circle$2 = { - draw: function(context, size) { - var r = Math.sqrt(size / pi$4); +const sqrt3$2 = sqrt(3); + +var asterisk = { + draw(context, size) { + const r = sqrt(size + min(size / 28, 0.75)) * 0.59436; + const t = r / 2; + const u = t * sqrt3$2; + context.moveTo(0, r); + context.lineTo(0, -r); + context.moveTo(-u, -t); + context.lineTo(u, t); + context.moveTo(-u, t); + context.lineTo(u, -t); + } +}; + +var circle = { + draw(context, size) { + const r = sqrt(size / pi); context.moveTo(r, 0); - context.arc(0, 0, r, 0, tau$4); + context.arc(0, 0, r, 0, tau); } }; -var cross$2 = { - draw: function(context, size) { - var r = Math.sqrt(size / 5) / 2; +var cross = { + draw(context, size) { + const r = sqrt(size / 5) / 2; context.moveTo(-3 * r, -r); context.lineTo(-r, -r); context.lineTo(-r, -3 * r); @@ -15415,529 +18183,218 @@ var cross$2 = { context.lineTo(r, r); context.lineTo(r, 3 * r); context.lineTo(-r, 3 * r); - context.lineTo(-r, r); - context.lineTo(-3 * r, r); - context.closePath(); - } -}; - -var tan30 = Math.sqrt(1 / 3), - tan30_2 = tan30 * 2; - -var diamond = { - draw: function(context, size) { - var y = Math.sqrt(size / tan30_2), - x = y * tan30; - context.moveTo(0, -y); - context.lineTo(x, 0); - context.lineTo(0, y); - context.lineTo(-x, 0); - context.closePath(); - } -}; - -var ka = 0.89081309152928522810, - kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10), - kx = Math.sin(tau$4 / 10) * kr, - ky = -Math.cos(tau$4 / 10) * kr; - -var star = { - draw: function(context, size) { - var r = Math.sqrt(size * ka), - x = kx * r, - y = ky * r; - context.moveTo(0, -r); - context.lineTo(x, y); - for (var i = 1; i < 5; ++i) { - var a = tau$4 * i / 5, - c = Math.cos(a), - s = Math.sin(a); - context.lineTo(s * r, -c * r); - context.lineTo(c * x - s * y, s * x + c * y); - } - context.closePath(); - } -}; - -var square = { - draw: function(context, size) { - var w = Math.sqrt(size), - x = -w / 2; - context.rect(x, x, w, w); - } -}; - -var sqrt3 = Math.sqrt(3); - -var triangle = { - draw: function(context, size) { - var y = -Math.sqrt(size / (sqrt3 * 3)); - context.moveTo(0, y * 2); - context.lineTo(-sqrt3 * y, -y); - context.lineTo(sqrt3 * y, -y); - context.closePath(); - } -}; - -var c$2 = -0.5, - s = Math.sqrt(3) / 2, - k = 1 / Math.sqrt(12), - a = (k / 2 + 1) * 3; - -var wye = { - draw: function(context, size) { - var r = Math.sqrt(size / a), - x0 = r / 2, - y0 = r * k, - x1 = x0, - y1 = r * k + r, - x2 = -x1, - y2 = y1; - context.moveTo(x0, y0); - context.lineTo(x1, y1); - context.lineTo(x2, y2); - context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0); - context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1); - context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2); - context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0); - context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1); - context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2); - context.closePath(); - } -}; - -var symbols = [ - circle$2, - cross$2, - diamond, - square, - star, - triangle, - wye -]; - -function symbol() { - var type = constant$b(circle$2), - size = constant$b(64), - context = null; - - function symbol() { - var buffer; - if (!context) context = buffer = path(); - type.apply(this, arguments).draw(context, +size.apply(this, arguments)); - if (buffer) return context = null, buffer + "" || null; - } - - symbol.type = function(_) { - return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type; - }; - - symbol.size = function(_) { - return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size; - }; - - symbol.context = function(_) { - return arguments.length ? (context = _ == null ? null : _, symbol) : context; - }; - - return symbol; -} - -function noop$3() {} - -function point$2(that, x, y) { - that._context.bezierCurveTo( - (2 * that._x0 + that._x1) / 3, - (2 * that._y0 + that._y1) / 3, - (that._x0 + 2 * that._x1) / 3, - (that._y0 + 2 * that._y1) / 3, - (that._x0 + 4 * that._x1 + x) / 6, - (that._y0 + 4 * that._y1 + y) / 6 - ); -} - -function Basis(context) { - this._context = context; -} - -Basis.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 3: point$2(this, this._x1, this._y1); // proceed - case 2: this._context.lineTo(this._x1, this._y1); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; break; - case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed - default: point$2(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; - -function basis$2(context) { - return new Basis(context); -} - -function BasisClosed(context) { - this._context = context; -} - -BasisClosed.prototype = { - areaStart: noop$3, - areaEnd: noop$3, - lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 1: { - this._context.moveTo(this._x2, this._y2); - this._context.closePath(); - break; - } - case 2: { - this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); - this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); - this._context.closePath(); - break; - } - case 3: { - this.point(this._x2, this._y2); - this.point(this._x3, this._y3); - this.point(this._x4, this._y4); - break; - } - } - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._x2 = x, this._y2 = y; break; - case 1: this._point = 2; this._x3 = x, this._y3 = y; break; - case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; - default: point$2(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; - -function basisClosed$1(context) { - return new BasisClosed(context); -} - -function BasisOpen(context) { - this._context = context; -} - -BasisOpen.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = NaN; - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; break; - case 1: this._point = 2; break; - case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; - case 3: this._point = 4; // proceed - default: point$2(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; - -function basisOpen(context) { - return new BasisOpen(context); -} - -function Bundle(context, beta) { - this._basis = new Basis(context); - this._beta = beta; -} - -Bundle.prototype = { - lineStart: function() { - this._x = []; - this._y = []; - this._basis.lineStart(); - }, - lineEnd: function() { - var x = this._x, - y = this._y, - j = x.length - 1; - - if (j > 0) { - var x0 = x[0], - y0 = y[0], - dx = x[j] - x0, - dy = y[j] - y0, - i = -1, - t; + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } +}; - while (++i <= j) { - t = i / j; - this._basis.point( - this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), - this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) - ); - } - } +const tan30 = sqrt(1 / 3); +const tan30_2 = tan30 * 2; - this._x = this._y = null; - this._basis.lineEnd(); - }, - point: function(x, y) { - this._x.push(+x); - this._y.push(+y); +var diamond = { + draw(context, size) { + const y = sqrt(size / tan30_2); + const x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); } }; -var bundle = (function custom(beta) { - - function bundle(context) { - return beta === 1 ? new Basis(context) : new Bundle(context, beta); +var diamond2 = { + draw(context, size) { + const r = sqrt(size) * 0.62625; + context.moveTo(0, -r); + context.lineTo(r, 0); + context.lineTo(0, r); + context.lineTo(-r, 0); + context.closePath(); } +}; - bundle.beta = function(beta) { - return custom(+beta); - }; +var plus = { + draw(context, size) { + const r = sqrt(size - min(size / 7, 2)) * 0.87559; + context.moveTo(-r, 0); + context.lineTo(r, 0); + context.moveTo(0, r); + context.lineTo(0, -r); + } +}; - return bundle; -})(0.85); +var square = { + draw(context, size) { + const w = sqrt(size); + const x = -w / 2; + context.rect(x, x, w, w); + } +}; -function point$3(that, x, y) { - that._context.bezierCurveTo( - that._x1 + that._k * (that._x2 - that._x0), - that._y1 + that._k * (that._y2 - that._y0), - that._x2 + that._k * (that._x1 - x), - that._y2 + that._k * (that._y1 - y), - that._x2, - that._y2 - ); -} +var square2 = { + draw(context, size) { + const r = sqrt(size) * 0.4431; + context.moveTo(r, r); + context.lineTo(r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, r); + context.closePath(); + } +}; -function Cardinal(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; -} +const ka = 0.89081309152928522810; +const kr = sin(pi / 10) / sin(7 * pi / 10); +const kx = sin(tau / 10) * kr; +const ky = -cos(tau / 10) * kr; -Cardinal.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 2: this._context.lineTo(this._x2, this._y2); break; - case 3: point$3(this, this._x1, this._y1); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; this._x1 = x, this._y1 = y; break; - case 2: this._point = 3; // proceed - default: point$3(this, x, y); break; +var star = { + draw(context, size) { + const r = sqrt(size * ka); + const x = kx * r; + const y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (let i = 1; i < 5; ++i) { + const a = tau * i / 5; + const c = cos(a); + const s = sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + context.closePath(); } }; -var cardinal = (function custom(tension) { +const sqrt3$1 = sqrt(3); - function cardinal(context) { - return new Cardinal(context, tension); +var triangle = { + draw(context, size) { + const y = -sqrt(size / (sqrt3$1 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3$1 * y, -y); + context.lineTo(sqrt3$1 * y, -y); + context.closePath(); } +}; - cardinal.tension = function(tension) { - return custom(+tension); - }; - - return cardinal; -})(0); - -function CardinalClosed(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; -} +const sqrt3 = sqrt(3); -CardinalClosed.prototype = { - areaStart: noop$3, - areaEnd: noop$3, - lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 1: { - this._context.moveTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 2: { - this._context.lineTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 3: { - this.point(this._x3, this._y3); - this.point(this._x4, this._y4); - this.point(this._x5, this._y5); - break; - } - } - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._x3 = x, this._y3 = y; break; - case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; - case 2: this._point = 3; this._x5 = x, this._y5 = y; break; - default: point$3(this, x, y); break; - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; +var triangle2 = { + draw(context, size) { + const s = sqrt(size) * 0.6824; + const t = s / 2; + const u = (s * sqrt3) / 2; // cos(Math.PI / 6) + context.moveTo(0, -s); + context.lineTo(u, t); + context.lineTo(-u, t); + context.closePath(); } }; -var cardinalClosed = (function custom(tension) { +const c = -0.5; +const s = sqrt(3) / 2; +const k = 1 / sqrt(12); +const a = (k / 2 + 1) * 3; - function cardinal(context) { - return new CardinalClosed(context, tension); +var wye = { + draw(context, size) { + const r = sqrt(size / a); + const x0 = r / 2, y0 = r * k; + const x1 = x0, y1 = r * k + r; + const x2 = -x1, y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); } +}; - cardinal.tension = function(tension) { - return custom(+tension); - }; +var x = { + draw(context, size) { + const r = sqrt(size - min(size / 6, 1.7)) * 0.6189; + context.moveTo(-r, -r); + context.lineTo(r, r); + context.moveTo(-r, r); + context.lineTo(r, -r); + } +}; - return cardinal; -})(0); +// These symbols are designed to be filled. +const symbolsFill = [ + circle, + cross, + diamond, + square, + star, + triangle, + wye +]; -function CardinalOpen(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; -} +// These symbols are designed to be stroked (with a width of 1.5px and round caps). +const symbolsStroke = [ + circle, + plus, + x, + triangle2, + asterisk, + square2, + diamond2 +]; -CardinalOpen.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; break; - case 1: this._point = 2; break; - case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; - case 3: this._point = 4; // proceed - default: point$3(this, x, y); break; - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; +function Symbol$1(type, size) { + let context = null; -var cardinalOpen = (function custom(tension) { + type = typeof type === "function" ? type : constant$1(type || circle); + size = typeof size === "function" ? size : constant$1(size === undefined ? 64 : +size); - function cardinal(context) { - return new CardinalOpen(context, tension); + function symbol() { + let buffer; + if (!context) context = buffer = path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; } - cardinal.tension = function(tension) { - return custom(+tension); + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant$1(_), symbol) : type; }; - return cardinal; -})(0); + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant$1(+_), symbol) : size; + }; -function point$4(that, x, y) { - var x1 = that._x1, - y1 = that._y1, - x2 = that._x2, - y2 = that._y2; + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; - if (that._l01_a > epsilon$3) { - var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, - n = 3 * that._l01_a * (that._l01_a + that._l12_a); - x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; - y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; - } + return symbol; +} - if (that._l23_a > epsilon$3) { - var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, - m = 3 * that._l23_a * (that._l23_a + that._l12_a); - x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; - y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; - } +function noop() {} - that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +function point$3(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); } -function CatmullRom(context, alpha) { +function Basis(context) { this._context = context; - this._alpha = alpha; } -CatmullRom.prototype = { +Basis.prototype = { areaStart: function() { this._line = 0; }, @@ -15945,133 +18402,90 @@ CatmullRom.prototype = { this._line = NaN; }, lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; this._point = 0; }, lineEnd: function() { switch (this._point) { - case 2: this._context.lineTo(this._x2, this._y2); break; - case 3: this.point(this._x2, this._y2); break; + case 3: point$3(this, this._x1, this._y1); // falls through + case 2: this._context.lineTo(this._x1, this._y1); break; } if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); this._line = 1 - this._line; }, point: function(x, y) { x = +x, y = +y; - - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); - } - switch (this._point) { case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; case 1: this._point = 2; break; - case 2: this._point = 3; // proceed - default: point$4(this, x, y); break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // falls through + default: point$3(this, x, y); break; } - - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; } }; -var catmullRom = (function custom(alpha) { - - function catmullRom(context) { - return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); - } - - catmullRom.alpha = function(alpha) { - return custom(+alpha); - }; - - return catmullRom; -})(0.5); +function basis(context) { + return new Basis(context); +} -function CatmullRomClosed(context, alpha) { +function BasisClosed(context) { this._context = context; - this._alpha = alpha; } -CatmullRomClosed.prototype = { - areaStart: noop$3, - areaEnd: noop$3, +BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; this._point = 0; }, lineEnd: function() { switch (this._point) { case 1: { - this._context.moveTo(this._x3, this._y3); + this._context.moveTo(this._x2, this._y2); this._context.closePath(); break; } case 2: { - this._context.lineTo(this._x3, this._y3); + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); this._context.closePath(); break; } case 3: { + this.point(this._x2, this._y2); this.point(this._x3, this._y3); this.point(this._x4, this._y4); - this.point(this._x5, this._y5); break; } } }, point: function(x, y) { x = +x, y = +y; - - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); - } - switch (this._point) { - case 0: this._point = 1; this._x3 = x, this._y3 = y; break; - case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; - case 2: this._point = 3; this._x5 = x, this._y5 = y; break; - default: point$4(this, x, y); break; + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point$3(this, x, y); break; } - - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; } }; -var catmullRomClosed = (function custom(alpha) { - - function catmullRom(context) { - return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); - } - - catmullRom.alpha = function(alpha) { - return custom(+alpha); - }; - - return catmullRom; -})(0.5); +function basisClosed(context) { + return new BasisClosed(context); +} -function CatmullRomOpen(context, alpha) { +function BasisOpen(context) { this._context = context; - this._alpha = alpha; } -CatmullRomOpen.prototype = { +BasisOpen.prototype = { areaStart: function() { this._line = 0; }, @@ -16079,10 +18493,8 @@ CatmullRomOpen.prototype = { this._line = NaN; }, lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; this._point = 0; }, lineEnd: function() { @@ -16091,175 +18503,204 @@ CatmullRomOpen.prototype = { }, point: function(x, y) { x = +x, y = +y; - - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); - } - switch (this._point) { case 0: this._point = 1; break; case 1: this._point = 2; break; - case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; - case 3: this._point = 4; // proceed - default: point$4(this, x, y); break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // falls through + default: point$3(this, x, y); break; } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; +function basisOpen(context) { + return new BasisOpen(context); +} + +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} + +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); } }; -var catmullRomOpen = (function custom(alpha) { +var bundle = (function custom(beta) { - function catmullRom(context) { - return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); } - catmullRom.alpha = function(alpha) { - return custom(+alpha); + bundle.beta = function(beta) { + return custom(+beta); }; - return catmullRom; -})(0.5); + return bundle; +})(0.85); -function LinearClosed(context) { +function point$2(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); +} + +function Cardinal(context, tension) { this._context = context; + this._k = (1 - tension) / 6; } -LinearClosed.prototype = { - areaStart: noop$3, - areaEnd: noop$3, +Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; this._point = 0; }, lineEnd: function() { - if (this._point) this._context.closePath(); + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point$2(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; }, point: function(x, y) { x = +x, y = +y; - if (this._point) this._context.lineTo(x, y); - else this._point = 1, this._context.moveTo(x, y); + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // falls through + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; } }; -function linearClosed(context) { - return new LinearClosed(context); -} - -function sign$1(x) { - return x < 0 ? -1 : 1; -} +var cardinal = (function custom(tension) { -// Calculate the slopes of the tangents (Hermite-type interpolation) based on -// the following paper: Steffen, M. 1990. A Simple Method for Monotonic -// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. -// NOV(II), P. 443, 1990. -function slope3(that, x2, y2) { - var h0 = that._x1 - that._x0, - h1 = x2 - that._x1, - s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), - s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), - p = (s0 * h1 + s1 * h0) / (h0 + h1); - return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; -} + function cardinal(context) { + return new Cardinal(context, tension); + } -// Calculate a one-sided slope. -function slope2(that, t) { - var h = that._x1 - that._x0; - return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; -} + cardinal.tension = function(tension) { + return custom(+tension); + }; -// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations -// "you can express cubic Hermite interpolation in terms of cubic Bรฉzier curves -// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". -function point$5(that, t0, t1) { - var x0 = that._x0, - y0 = that._y0, - x1 = that._x1, - y1 = that._y1, - dx = (x1 - x0) / 3; - that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); -} + return cardinal; +})(0); -function MonotoneX(context) { +function CardinalClosed(context, tension) { this._context = context; + this._k = (1 - tension) / 6; } -MonotoneX.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, +CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = - this._t0 = NaN; + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; this._point = 0; }, lineEnd: function() { switch (this._point) { - case 2: this._context.lineTo(this._x1, this._y1); break; - case 3: point$5(this, this._t0, slope2(this, this._t0)); break; + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; }, point: function(x, y) { - var t1 = NaN; - x = +x, y = +y; - if (x === this._x1 && y === this._y1) return; // Ignore coincident points. switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; break; - case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break; - default: point$5(this, this._t0, t1 = slope3(this, x, y)); break; + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$2(this, x, y); break; } - - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - this._t0 = t1; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; } }; -function MonotoneY(context) { - this._context = new ReflectContext(context); -} - -(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { - MonotoneX.prototype.point.call(this, y, x); -}; - -function ReflectContext(context) { - this._context = context; -} +var cardinalClosed = (function custom(tension) { -ReflectContext.prototype = { - moveTo: function(x, y) { this._context.moveTo(y, x); }, - closePath: function() { this._context.closePath(); }, - lineTo: function(x, y) { this._context.lineTo(y, x); }, - bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } -}; + function cardinal(context) { + return new CardinalClosed(context, tension); + } -function monotoneX(context) { - return new MonotoneX(context); -} + cardinal.tension = function(tension) { + return custom(+tension); + }; -function monotoneY(context) { - return new MonotoneY(context); -} + return cardinal; +})(0); -function Natural(context) { +function CardinalOpen(context, tension) { this._context = context; + this._k = (1 - tension) / 6; } -Natural.prototype = { +CardinalOpen.prototype = { areaStart: function() { this._line = 0; }, @@ -16267,66 +18708,70 @@ Natural.prototype = { this._line = NaN; }, lineStart: function() { - this._x = []; - this._y = []; + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; }, lineEnd: function() { - var x = this._x, - y = this._y, - n = x.length; - - if (n) { - this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); - if (n === 2) { - this._context.lineTo(x[1], y[1]); - } else { - var px = controlPoints(x), - py = controlPoints(y); - for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { - this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); - } - } - } - - if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); this._line = 1 - this._line; - this._x = this._y = null; }, point: function(x, y) { - this._x.push(+x); - this._y.push(+y); + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // falls through + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; } }; -// See https://www.particleincell.com/2012/bezier-splines/ for derivation. -function controlPoints(x) { - var i, - n = x.length - 1, - m, - a = new Array(n), - b = new Array(n), - r = new Array(n); - a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; - for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; - a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; - for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; - a[n - 1] = r[n - 1] / b[n - 1]; - for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; - b[n - 1] = (x[n] + a[n - 1]) / 2; - for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; - return [a, b]; -} +var cardinalOpen = (function custom(tension) { -function natural(context) { - return new Natural(context); + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function point$1(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); } -function Step(context, t) { +function CatmullRom(context, alpha) { this._context = context; - this._t = t; + this._alpha = alpha; } -Step.prototype = { +CatmullRom.prototype = { areaStart: function() { this._line = 0; }, @@ -16334,1224 +18779,632 @@ Step.prototype = { this._line = NaN; }, lineStart: function() { - this._x = this._y = NaN; + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0; }, lineEnd: function() { - if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + this._line = 1 - this._line; }, point: function(x, y) { x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; // proceed - default: { - if (this._t <= 0) { - this._context.lineTo(this._x, y); - this._context.lineTo(x, y); - } else { - var x1 = this._x * (1 - this._t) + x * this._t; - this._context.lineTo(x1, this._y); - this._context.lineTo(x1, y); - } - break; - } - } - this._x = x, this._y = y; - } -}; - -function step(context) { - return new Step(context, 0.5); -} - -function stepBefore(context) { - return new Step(context, 0); -} - -function stepAfter(context) { - return new Step(context, 1); -} - -function none$1(series, order) { - if (!((n = series.length) > 1)) return; - for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { - s0 = s1, s1 = series[order[i]]; - for (j = 0; j < m; ++j) { - s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; - } - } -} - -function none$2(series) { - var n = series.length, o = new Array(n); - while (--n >= 0) o[n] = n; - return o; -} - -function stackValue(d, key) { - return d[key]; -} -function stack() { - var keys = constant$b([]), - order = none$2, - offset = none$1, - value = stackValue; - - function stack(data) { - var kz = keys.apply(this, arguments), - i, - m = data.length, - n = kz.length, - sz = new Array(n), - oz; - - for (i = 0; i < n; ++i) { - for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { - si[j] = sij = [0, +value(data[j], ki, j, data)]; - sij.data = data[j]; - } - si.key = ki; + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); } - for (i = 0, oz = order(sz); i < n; ++i) { - sz[oz[i]].index = i; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // falls through + default: point$1(this, x, y); break; } - offset(sz, oz); - return sz; + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; } +}; - stack.keys = function(_) { - return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$6.call(_)), stack) : keys; - }; - - stack.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value; - }; +var catmullRom = (function custom(alpha) { - stack.order = function(_) { - return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$6.call(_)), stack) : order; - }; + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } - stack.offset = function(_) { - return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + catmullRom.alpha = function(alpha) { + return custom(+alpha); }; - return stack; -} + return catmullRom; +})(0.5); -function expand(series, order) { - if (!((n = series.length) > 0)) return; - for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { - for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; - if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; - } - none$1(series, order); +function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; } -function diverging$1(series, order) { - if (!((n = series.length) > 0)) return; - for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { - for (yp = yn = 0, i = 0; i < n; ++i) { - if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { - d[0] = yp, d[1] = yp += dy; - } else if (dy < 0) { - d[1] = yn, d[0] = yn += dy; - } else { - d[0] = 0, d[1] = dy; +CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; } - } - } -} - -function silhouette(series, order) { - if (!((n = series.length) > 0)) return; - for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { - for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; - s0[j][1] += s0[j][0] = -y / 2; - } - none$1(series, order); -} - -function wiggle(series, order) { - if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; - for (var y = 0, j = 1, s0, m, n; j < m; ++j) { - for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { - var si = series[order[i]], - sij0 = si[j][1] || 0, - sij1 = si[j - 1][1] || 0, - s3 = (sij0 - sij1) / 2; - for (var k = 0; k < i; ++k) { - var sk = series[order[k]], - skj0 = sk[j][1] || 0, - skj1 = sk[j - 1][1] || 0; - s3 += skj0 - skj1; + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; } - s1 += sij0, s2 += s3 * sij0; } - s0[j - 1][1] += s0[j - 1][0] = y; - if (s1) y -= s2 / s1; - } - s0[j - 1][1] += s0[j - 1][0] = y; - none$1(series, order); -} - -function appearance(series) { - var peaks = series.map(peak); - return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); -} - -function peak(series) { - var i = -1, j = 0, n = series.length, vi, vj = -Infinity; - while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; - return j; -} - -function ascending$3(series) { - var sums = series.map(sum$2); - return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; }); -} - -function sum$2(series) { - var s = 0, i = -1, n = series.length, v; - while (++i < n) if (v = +series[i][1]) s += v; - return s; -} - -function descending$2(series) { - return ascending$3(series).reverse(); -} + }, + point: function(x, y) { + x = +x, y = +y; -function insideOut(series) { - var n = series.length, - i, - j, - sums = series.map(sum$2), - order = appearance(series), - top = 0, - bottom = 0, - tops = [], - bottoms = []; + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } - for (i = 0; i < n; ++i) { - j = order[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$1(this, x, y); break; } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; } +}; - return bottoms.reverse().concat(tops); -} +var catmullRomClosed = (function custom(alpha) { -function reverse(series) { - return none$2(series).reverse(); -} + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } -function constant$c(x) { - return function() { - return x; + catmullRom.alpha = function(alpha) { + return custom(+alpha); }; -} - -function x$4(d) { - return d[0]; -} - -function y$4(d) { - return d[1]; -} -function RedBlackTree() { - this._ = null; // root node -} + return catmullRom; +})(0.5); -function RedBlackNode(node) { - node.U = // parent node - node.C = // color - true for red, false for black - node.L = // left node - node.R = // right node - node.P = // previous node - node.N = null; // next node +function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; } -RedBlackTree.prototype = { - constructor: RedBlackTree, - - insert: function(after, node) { - var parent, grandpa, uncle; - - if (after) { - node.P = after; - node.N = after.N; - if (after.N) after.N.P = node; - after.N = node; - if (after.R) { - after = after.R; - while (after.L) after = after.L; - after.L = node; - } else { - after.R = node; - } - parent = after; - } else if (this._) { - after = RedBlackFirst(this._); - node.P = null; - node.N = after; - after.P = after.L = node; - parent = after; - } else { - node.P = node.N = null; - this._ = node; - parent = null; - } - node.L = node.R = null; - node.U = parent; - node.C = true; - - after = node; - while (parent && parent.C) { - grandpa = parent.U; - if (parent === grandpa.L) { - uncle = grandpa.R; - if (uncle && uncle.C) { - parent.C = uncle.C = false; - grandpa.C = true; - after = grandpa; - } else { - if (after === parent.R) { - RedBlackRotateLeft(this, parent); - after = parent; - parent = after.U; - } - parent.C = false; - grandpa.C = true; - RedBlackRotateRight(this, grandpa); - } - } else { - uncle = grandpa.L; - if (uncle && uncle.C) { - parent.C = uncle.C = false; - grandpa.C = true; - after = grandpa; - } else { - if (after === parent.L) { - RedBlackRotateRight(this, parent); - after = parent; - parent = after.U; - } - parent.C = false; - grandpa.C = true; - RedBlackRotateLeft(this, grandpa); - } - } - parent = after.U; - } - this._.C = false; +CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; - remove: function(node) { - if (node.N) node.N.P = node.P; - if (node.P) node.P.N = node.N; - node.N = node.P = null; - - var parent = node.U, - sibling, - left = node.L, - right = node.R, - next, - red; - - if (!left) next = right; - else if (!right) next = left; - else next = RedBlackFirst(right); + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } - if (parent) { - if (parent.L === node) parent.L = next; - else parent.R = next; - } else { - this._ = next; - } - - if (left && right) { - red = next.C; - next.C = node.C; - next.L = left; - left.U = next; - if (next !== right) { - parent = next.U; - next.U = node.U; - node = next.R; - parent.L = node; - next.R = right; - right.U = next; - } else { - next.U = parent; - parent = next; - node = next.R; - } - } else { - red = node.C; - node = next; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // falls through + default: point$1(this, x, y); break; } - if (node) node.U = parent; - if (red) return; - if (node && node.C) { node.C = false; return; } + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; - do { - if (node === this._) break; - if (node === parent.L) { - sibling = parent.R; - if (sibling.C) { - sibling.C = false; - parent.C = true; - RedBlackRotateLeft(this, parent); - sibling = parent.R; - } - if ((sibling.L && sibling.L.C) - || (sibling.R && sibling.R.C)) { - if (!sibling.R || !sibling.R.C) { - sibling.L.C = false; - sibling.C = true; - RedBlackRotateRight(this, sibling); - sibling = parent.R; - } - sibling.C = parent.C; - parent.C = sibling.R.C = false; - RedBlackRotateLeft(this, parent); - node = this._; - break; - } - } else { - sibling = parent.L; - if (sibling.C) { - sibling.C = false; - parent.C = true; - RedBlackRotateRight(this, parent); - sibling = parent.L; - } - if ((sibling.L && sibling.L.C) - || (sibling.R && sibling.R.C)) { - if (!sibling.L || !sibling.L.C) { - sibling.R.C = false; - sibling.C = true; - RedBlackRotateLeft(this, sibling); - sibling = parent.L; - } - sibling.C = parent.C; - parent.C = sibling.L.C = false; - RedBlackRotateRight(this, parent); - node = this._; - break; - } - } - sibling.C = true; - node = parent; - parent = parent.U; - } while (!node.C); +var catmullRomOpen = (function custom(alpha) { - if (node) node.C = false; + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); } -}; -function RedBlackRotateLeft(tree, node) { - var p = node, - q = node.R, - parent = p.U; + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; - if (parent) { - if (parent.L === p) parent.L = q; - else parent.R = q; - } else { - tree._ = q; - } + return catmullRom; +})(0.5); - q.U = parent; - p.U = q; - p.R = q.L; - if (p.R) p.R.U = p; - q.L = p; +function LinearClosed(context) { + this._context = context; } -function RedBlackRotateRight(tree, node) { - var p = node, - q = node.L, - parent = p.U; - - if (parent) { - if (parent.L === p) parent.L = q; - else parent.R = q; - } else { - tree._ = q; +LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); } +}; - q.U = parent; - p.U = q; - p.L = q.R; - if (p.L) p.L.U = p; - q.R = p; +function linearClosed(context) { + return new LinearClosed(context); } -function RedBlackFirst(node) { - while (node.L) node = node.L; - return node; +function sign(x) { + return x < 0 ? -1 : 1; } -function createEdge(left, right, v0, v1) { - var edge = [null, null], - index = edges.push(edge) - 1; - edge.left = left; - edge.right = right; - if (v0) setEdgeEnd(edge, left, right, v0); - if (v1) setEdgeEnd(edge, right, left, v1); - cells[left.index].halfedges.push(index); - cells[right.index].halfedges.push(index); - return edge; +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. +function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; } -function createBorderEdge(left, v0, v1) { - var edge = [v0, v1]; - edge.left = left; - return edge; +// Calculate a one-sided slope. +function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; } -function setEdgeEnd(edge, left, right, vertex) { - if (!edge[0] && !edge[1]) { - edge[0] = vertex; - edge.left = left; - edge.right = right; - } else if (edge.left === right) { - edge[1] = vertex; - } else { - edge[0] = vertex; - } +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bรฉzier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". +function point(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); } -// Liangโ€“Barsky line clipping. -function clipEdge(edge, x0, y0, x1, y1) { - var a = edge[0], - b = edge[1], - ax = a[0], - ay = a[1], - bx = b[0], - by = b[1], - t0 = 0, - t1 = 1, - dx = bx - ax, - dy = by - ay, - r; - - r = x0 - ax; - if (!dx && r > 0) return; - r /= dx; - if (dx < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dx > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - - r = x1 - ax; - if (!dx && r < 0) return; - r /= dx; - if (dx < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dx > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - - r = y0 - ay; - if (!dy && r > 0) return; - r /= dy; - if (dy < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dy > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - - r = y1 - ay; - if (!dy && r < 0) return; - r /= dy; - if (dy < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dy > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - - if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? - - if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; - if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; - return true; +function MonotoneX(context) { + this._context = context; } -function connectEdge(edge, x0, y0, x1, y1) { - var v1 = edge[1]; - if (v1) return true; - - var v0 = edge[0], - left = edge.left, - right = edge.right, - lx = left[0], - ly = left[1], - rx = right[0], - ry = right[1], - fx = (lx + rx) / 2, - fy = (ly + ry) / 2, - fm, - fb; - - if (ry === ly) { - if (fx < x0 || fx >= x1) return; - if (lx > rx) { - if (!v0) v0 = [fx, y0]; - else if (v0[1] >= y1) return; - v1 = [fx, y1]; - } else { - if (!v0) v0 = [fx, y1]; - else if (v0[1] < y0) return; - v1 = [fx, y0]; +MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point(this, this._t0, slope2(this, this._t0)); break; } - } else { - fm = (lx - rx) / (ry - ly); - fb = fy - fm * fx; - if (fm < -1 || fm > 1) { - if (lx > rx) { - if (!v0) v0 = [(y0 - fb) / fm, y0]; - else if (v0[1] >= y1) return; - v1 = [(y1 - fb) / fm, y1]; - } else { - if (!v0) v0 = [(y1 - fb) / fm, y1]; - else if (v0[1] < y0) return; - v1 = [(y0 - fb) / fm, y0]; - } - } else { - if (ly < ry) { - if (!v0) v0 = [x0, fm * x0 + fb]; - else if (v0[0] >= x1) return; - v1 = [x1, fm * x1 + fb]; - } else { - if (!v0) v0 = [x1, fm * x1 + fb]; - else if (v0[0] < x0) return; - v1 = [x0, fm * x0 + fb]; - } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point(this, this._t0, t1 = slope3(this, x, y)); break; } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; } +}; - edge[0] = v0; - edge[1] = v1; - return true; +function MonotoneY(context) { + this._context = new ReflectContext(context); } -function clipEdges(x0, y0, x1, y1) { - var i = edges.length, - edge; +(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); +}; - while (i--) { - if (!connectEdge(edge = edges[i], x0, y0, x1, y1) - || !clipEdge(edge, x0, y0, x1, y1) - || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4 - || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) { - delete edges[i]; - } - } +function ReflectContext(context) { + this._context = context; } -function createCell(site) { - return cells[site.index] = { - site: site, - halfedges: [] - }; -} +ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } +}; -function cellHalfedgeAngle(cell, edge) { - var site = cell.site, - va = edge.left, - vb = edge.right; - if (site === vb) vb = va, va = site; - if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); - if (site === va) va = edge[1], vb = edge[0]; - else va = edge[0], vb = edge[1]; - return Math.atan2(va[0] - vb[0], vb[1] - va[1]); +function monotoneX(context) { + return new MonotoneX(context); } -function cellHalfedgeStart(cell, edge) { - return edge[+(edge.left !== cell.site)]; +function monotoneY(context) { + return new MonotoneY(context); } -function cellHalfedgeEnd(cell, edge) { - return edge[+(edge.left === cell.site)]; +function Natural(context) { + this._context = context; } -function sortCellHalfedges() { - for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { - if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { - var index = new Array(m), - array = new Array(m); - for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); - index.sort(function(i, j) { return array[j] - array[i]; }); - for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; - for (j = 0; j < m; ++j) halfedges[j] = array[j]; +Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); } -} +}; -function clipCells(x0, y0, x1, y1) { - var nCells = cells.length, - iCell, - cell, - site, - iHalfedge, - halfedges, - nHalfedges, - start, - startX, - startY, - end, - endX, - endY, - cover = true; +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. +function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; +} - for (iCell = 0; iCell < nCells; ++iCell) { - if (cell = cells[iCell]) { - site = cell.site; - halfedges = cell.halfedges; - iHalfedge = halfedges.length; +function natural(context) { + return new Natural(context); +} - // Remove any dangling clipped edges. - while (iHalfedge--) { - if (!edges[halfedges[iHalfedge]]) { - halfedges.splice(iHalfedge, 1); - } - } +function Step(context, t) { + this._context = context; + this._t = t; +} - // Insert any border edges as necessary. - iHalfedge = 0, nHalfedges = halfedges.length; - while (iHalfedge < nHalfedges) { - end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; - start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; - if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) { - halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, - Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1] - : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1] - : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0] - : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0] - : null)) - 1); - ++nHalfedges; +Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // falls through + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); } + break; } - - if (nHalfedges) cover = false; - } - } - - // If there werenโ€™t any edges, have the closest site cover the extent. - // It doesnโ€™t matter which corner of the extent we measure! - if (cover) { - var dx, dy, d2, dc = Infinity; - - for (iCell = 0, cover = null; iCell < nCells; ++iCell) { - if (cell = cells[iCell]) { - site = cell.site; - dx = site[0] - x0; - dy = site[1] - y0; - d2 = dx * dx + dy * dy; - if (d2 < dc) dc = d2, cover = cell; - } - } - - if (cover) { - var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; - cover.halfedges.push( - edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, - edges.push(createBorderEdge(site, v01, v11)) - 1, - edges.push(createBorderEdge(site, v11, v10)) - 1, - edges.push(createBorderEdge(site, v10, v00)) - 1 - ); } + this._x = x, this._y = y; } +}; - // Lastly delete any cells with no edges; these were entirely clipped. - for (iCell = 0; iCell < nCells; ++iCell) { - if (cell = cells[iCell]) { - if (!cell.halfedges.length) { - delete cells[iCell]; - } - } - } +function step(context) { + return new Step(context, 0.5); } -var circlePool = []; - -var firstCircle; - -function Circle() { - RedBlackNode(this); - this.x = - this.y = - this.arc = - this.site = - this.cy = null; +function stepBefore(context) { + return new Step(context, 0); } -function attachCircle(arc) { - var lArc = arc.P, - rArc = arc.N; - - if (!lArc || !rArc) return; - - var lSite = lArc.site, - cSite = arc.site, - rSite = rArc.site; - - if (lSite === rSite) return; - - var bx = cSite[0], - by = cSite[1], - ax = lSite[0] - bx, - ay = lSite[1] - by, - cx = rSite[0] - bx, - cy = rSite[1] - by; - - var d = 2 * (ax * cy - ay * cx); - if (d >= -epsilon2$2) return; - - var ha = ax * ax + ay * ay, - hc = cx * cx + cy * cy, - x = (cy * ha - ay * hc) / d, - y = (ax * hc - cx * ha) / d; - - var circle = circlePool.pop() || new Circle; - circle.arc = arc; - circle.site = cSite; - circle.x = x + bx; - circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom - - arc.circle = circle; - - var before = null, - node = circles._; - - while (node) { - if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { - if (node.L) node = node.L; - else { before = node.P; break; } - } else { - if (node.R) node = node.R; - else { before = node; break; } - } - } - - circles.insert(before, circle); - if (!before) firstCircle = circle; +function stepAfter(context) { + return new Step(context, 1); } -function detachCircle(arc) { - var circle = arc.circle; - if (circle) { - if (!circle.P) firstCircle = circle.N; - circles.remove(circle); - circlePool.push(circle); - RedBlackNode(circle); - arc.circle = null; +function none$1(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } } } -var beachPool = []; - -function Beach() { - RedBlackNode(this); - this.edge = - this.site = - this.circle = null; +function none(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; } -function createBeach(site) { - var beach = beachPool.pop() || new Beach; - beach.site = site; - return beach; +function stackValue(d, key) { + return d[key]; } -function detachBeach(beach) { - detachCircle(beach); - beaches.remove(beach); - beachPool.push(beach); - RedBlackNode(beach); +function stackSeries(key) { + const series = []; + series.key = key; + return series; } -function removeBeach(beach) { - var circle = beach.circle, - x = circle.x, - y = circle.cy, - vertex = [x, y], - previous = beach.P, - next = beach.N, - disappearing = [beach]; +function stack() { + var keys = constant$1([]), + order = none, + offset = none$1, + value = stackValue; - detachBeach(beach); + function stack(data) { + var sz = Array.from(keys.apply(this, arguments), stackSeries), + i, n = sz.length, j = -1, + oz; - var lArc = previous; - while (lArc.circle - && Math.abs(x - lArc.circle.x) < epsilon$4 - && Math.abs(y - lArc.circle.cy) < epsilon$4) { - previous = lArc.P; - disappearing.unshift(lArc); - detachBeach(lArc); - lArc = previous; - } + for (const d of data) { + for (i = 0, ++j; i < n; ++i) { + (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d; + } + } - disappearing.unshift(lArc); - detachCircle(lArc); + for (i = 0, oz = array(order(sz)); i < n; ++i) { + sz[oz[i]].index = i; + } - var rArc = next; - while (rArc.circle - && Math.abs(x - rArc.circle.x) < epsilon$4 - && Math.abs(y - rArc.circle.cy) < epsilon$4) { - next = rArc.N; - disappearing.push(rArc); - detachBeach(rArc); - rArc = next; + offset(sz, oz); + return sz; } - disappearing.push(rArc); - detachCircle(rArc); + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant$1(Array.from(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), stack) : value; + }; - var nArcs = disappearing.length, - iArc; - for (iArc = 1; iArc < nArcs; ++iArc) { - rArc = disappearing[iArc]; - lArc = disappearing[iArc - 1]; - setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); - } + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none : typeof _ === "function" ? _ : constant$1(Array.from(_)), stack) : order; + }; - lArc = disappearing[0]; - rArc = disappearing[nArcs - 1]; - rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + }; - attachCircle(lArc); - attachCircle(rArc); + return stack; } -function addBeach(site) { - var x = site[0], - directrix = site[1], - lArc, - rArc, - dxl, - dxr, - node = beaches._; +function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none$1(series, order); +} - while (node) { - dxl = leftBreakPoint(node, directrix) - x; - if (dxl > epsilon$4) node = node.L; else { - dxr = x - rightBreakPoint(node, directrix); - if (dxr > epsilon$4) { - if (!node.R) { - lArc = node; - break; - } - node = node.R; +function diverging(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; } else { - if (dxl > -epsilon$4) { - lArc = node.P; - rArc = node; - } else if (dxr > -epsilon$4) { - lArc = node; - rArc = node.N; - } else { - lArc = rArc = node; - } - break; + d[0] = 0, d[1] = dy; } } } +} - createCell(site); - var newArc = createBeach(site); - beaches.insert(lArc, newArc); - - if (!lArc && !rArc) return; - - if (lArc === rArc) { - detachCircle(lArc); - rArc = createBeach(lArc.site); - beaches.insert(newArc, rArc); - newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); - attachCircle(lArc); - attachCircle(rArc); - return; +function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; } + none$1(series, order); +} - if (!rArc) { // && lArc - newArc.edge = createEdge(lArc.site, newArc.site); - return; +function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; } - - // else lArc !== rArc - detachCircle(lArc); - detachCircle(rArc); - - var lSite = lArc.site, - ax = lSite[0], - ay = lSite[1], - bx = site[0] - ax, - by = site[1] - ay, - rSite = rArc.site, - cx = rSite[0] - ax, - cy = rSite[1] - ay, - d = 2 * (bx * cy - by * cx), - hb = bx * bx + by * by, - hc = cx * cx + cy * cy, - vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; - - setEdgeEnd(rArc.edge, lSite, rSite, vertex); - newArc.edge = createEdge(lSite, site, null, vertex); - rArc.edge = createEdge(site, rSite, null, vertex); - attachCircle(lArc); - attachCircle(rArc); + s0[j - 1][1] += s0[j - 1][0] = y; + none$1(series, order); } -function leftBreakPoint(arc, directrix) { - var site = arc.site, - rfocx = site[0], - rfocy = site[1], - pby2 = rfocy - directrix; - - if (!pby2) return rfocx; - - var lArc = arc.P; - if (!lArc) return -Infinity; - - site = lArc.site; - var lfocx = site[0], - lfocy = site[1], - plby2 = lfocy - directrix; - - if (!plby2) return lfocx; - - var hl = lfocx - rfocx, - aby2 = 1 / pby2 - 1 / plby2, - b = hl / plby2; - - if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; - - return (rfocx + lfocx) / 2; +function appearance(series) { + var peaks = series.map(peak); + return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); } -function rightBreakPoint(arc, directrix) { - var rArc = arc.N; - if (rArc) return leftBreakPoint(rArc, directrix); - var site = arc.site; - return site[1] === directrix ? site[0] : Infinity; +function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; } -var epsilon$4 = 1e-6; -var epsilon2$2 = 1e-12; -var beaches; -var cells; -var circles; -var edges; - -function triangleArea(a, b, c) { - return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); +function ascending(series) { + var sums = series.map(sum); + return none(series).sort(function(a, b) { return sums[a] - sums[b]; }); } -function lexicographic(a, b) { - return b[1] - a[1] - || b[0] - a[0]; +function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; } -function Diagram(sites, extent) { - var site = sites.sort(lexicographic).pop(), - x, - y, - circle; +function descending(series) { + return ascending(series).reverse(); +} - edges = []; - cells = new Array(sites.length); - beaches = new RedBlackTree; - circles = new RedBlackTree; +function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; - while (true) { - circle = firstCircle; - if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { - if (site[0] !== x || site[1] !== y) { - addBeach(site); - x = site[0], y = site[1]; - } - site = sites.pop(); - } else if (circle) { - removeBeach(circle.arc); + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); } else { - break; + bottom += sums[j]; + bottoms.push(j); } } - sortCellHalfedges(); - - if (extent) { - var x0 = +extent[0][0], - y0 = +extent[0][1], - x1 = +extent[1][0], - y1 = +extent[1][1]; - clipEdges(x0, y0, x1, y1); - clipCells(x0, y0, x1, y1); - } - - this.edges = edges; - this.cells = cells; - - beaches = - circles = - edges = - cells = null; -} - -Diagram.prototype = { - constructor: Diagram, - - polygons: function() { - var edges = this.edges; - - return this.cells.map(function(cell) { - var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); }); - polygon.data = cell.site.data; - return polygon; - }); - }, - - triangles: function() { - var triangles = [], - edges = this.edges; - - this.cells.forEach(function(cell, i) { - if (!(m = (halfedges = cell.halfedges).length)) return; - var site = cell.site, - halfedges, - j = -1, - m, - s0, - e1 = edges[halfedges[m - 1]], - s1 = e1.left === site ? e1.right : e1.left; - - while (++j < m) { - s0 = s1; - e1 = edges[halfedges[j]]; - s1 = e1.left === site ? e1.right : e1.left; - if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { - triangles.push([site.data, s0.data, s1.data]); - } - } - }); - - return triangles; - }, - - links: function() { - return this.edges.filter(function(edge) { - return edge.right; - }).map(function(edge) { - return { - source: edge.left.data, - target: edge.right.data - }; - }); - }, - - find: function(x, y, radius) { - var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; - - // Use the previously-found cell, or start with an arbitrary one. - while (!(cell = that.cells[i1])) if (++i1 >= n) return null; - var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; - - // Traverse the half-edges to find a closer cell, if any. - do { - cell = that.cells[i0 = i1], i1 = null; - cell.halfedges.forEach(function(e) { - var edge = that.edges[e], v = edge.left; - if ((v === cell.site || !v) && !(v = edge.right)) return; - var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; - if (v2 < d2) d2 = v2, i1 = v.index; - }); - } while (i1 !== null); - - that._found = i0; - - return radius == null || d2 <= radius * radius ? cell.site : null; - } -}; - -function voronoi() { - var x = x$4, - y = y$4, - extent = null; - - function voronoi(data) { - return new Diagram(data.map(function(d, i) { - var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4]; - s.index = i; - s.data = d; - return s; - }), extent); - } - - voronoi.polygons = function(data) { - return voronoi(data).polygons(); - }; - - voronoi.links = function(data) { - return voronoi(data).links(); - }; - - voronoi.triangles = function(data) { - return voronoi(data).triangles(); - }; - - voronoi.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x; - }; - - voronoi.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y; - }; - - voronoi.extent = function(_) { - return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; - }; - - voronoi.size = function(_) { - return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; - }; - - return voronoi; -} - -function constant$d(x) { - return function() { - return x; - }; + return bottoms.reverse().concat(tops); } -function ZoomEvent(target, type, transform) { - this.target = target; - this.type = type; - this.transform = transform; +function reverse(series) { + return none(series).reverse(); +} + +var constant = x => () => x; + +function ZoomEvent(type, { + sourceEvent, + target, + transform, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + transform: {value: transform, enumerable: true, configurable: true}, + _: {value: dispatch} + }); } function Transform(k, x, y) { @@ -17597,30 +19450,31 @@ Transform.prototype = { } }; -var identity$9 = new Transform(1, 0, 0); +var identity = new Transform(1, 0, 0); -transform$1.prototype = Transform.prototype; +transform.prototype = Transform.prototype; -function transform$1(node) { - while (!node.__zoom) if (!(node = node.parentNode)) return identity$9; +function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; return node.__zoom; } -function nopropagation$2() { - exports.event.stopImmediatePropagation(); +function nopropagation(event) { + event.stopImmediatePropagation(); } -function noevent$2() { - exports.event.preventDefault(); - exports.event.stopImmediatePropagation(); +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); } // Ignore right-click, since that should open the context menu. -function defaultFilter$2() { - return !exports.event.ctrlKey && !exports.event.button; +// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event +function defaultFilter(event) { + return (!event.ctrlKey || event.type === 'wheel') && !event.button; } -function defaultExtent$1() { +function defaultExtent() { var e = this; if (e instanceof SVGElement) { e = e.ownerSVGElement || e; @@ -17634,14 +19488,14 @@ function defaultExtent$1() { } function defaultTransform() { - return this.__zoom || identity$9; + return this.__zoom || identity; } -function defaultWheelDelta() { - return -exports.event.deltaY * (exports.event.deltaMode === 1 ? 0.05 : exports.event.deltaMode ? 1 : 0.002); +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1); } -function defaultTouchable$2() { +function defaultTouchable() { return navigator.maxTouchPoints || ("ontouchstart" in this); } @@ -17657,60 +19511,62 @@ function defaultConstrain(transform, extent, translateExtent) { } function zoom() { - var filter = defaultFilter$2, - extent = defaultExtent$1, + var filter = defaultFilter, + extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, - touchable = defaultTouchable$2, + touchable = defaultTouchable, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = interpolateZoom, listeners = dispatch("start", "zoom", "end"), touchstarting, + touchfirst, touchending, touchDelay = 500, wheelDelay = 150, - clickDistance2 = 0; + clickDistance2 = 0, + tapDistance = 10; function zoom(selection) { selection .property("__zoom", defaultTransform) - .on("wheel.zoom", wheeled) + .on("wheel.zoom", wheeled, {passive: false}) .on("mousedown.zoom", mousedowned) .on("dblclick.zoom", dblclicked) .filter(touchable) .on("touchstart.zoom", touchstarted) .on("touchmove.zoom", touchmoved) .on("touchend.zoom touchcancel.zoom", touchended) - .style("touch-action", "none") .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); } - zoom.transform = function(collection, transform, point) { + zoom.transform = function(collection, transform, point, event) { var selection = collection.selection ? collection.selection() : collection; selection.property("__zoom", defaultTransform); if (collection !== selection) { - schedule(collection, transform, point); + schedule(collection, transform, point, event); } else { selection.interrupt().each(function() { gesture(this, arguments) - .start() - .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) - .end(); + .event(event) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); }); } }; - zoom.scaleBy = function(selection, k, p) { + zoom.scaleBy = function(selection, k, p, event) { zoom.scaleTo(selection, function() { var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; return k0 * k1; - }, p); + }, p, event); }; - zoom.scaleTo = function(selection, k, p) { + zoom.scaleTo = function(selection, k, p, event) { zoom.transform(selection, function() { var e = extent.apply(this, arguments), t0 = this.__zoom, @@ -17718,28 +19574,28 @@ function zoom() { p1 = t0.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k; return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); - }, p); + }, p, event); }; - zoom.translateBy = function(selection, x, y) { + zoom.translateBy = function(selection, x, y, event) { zoom.transform(selection, function() { return constrain(this.__zoom.translate( typeof x === "function" ? x.apply(this, arguments) : x, typeof y === "function" ? y.apply(this, arguments) : y ), extent.apply(this, arguments), translateExtent); - }); + }, null, event); }; - zoom.translateTo = function(selection, x, y, p) { + zoom.translateTo = function(selection, x, y, p, event) { zoom.transform(selection, function() { var e = extent.apply(this, arguments), t = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; - return constrain(identity$9.translate(p0[0], p0[1]).scale(t.k).translate( + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( typeof x === "function" ? -x.apply(this, arguments) : -x, typeof y === "function" ? -y.apply(this, arguments) : -y ), e, translateExtent); - }, p); + }, p, event); }; function scale(transform, k) { @@ -17756,14 +19612,14 @@ function zoom() { return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; } - function schedule(transition, transform, point) { + function schedule(transition, transform, point, event) { transition - .on("start.zoom", function() { gesture(this, arguments).start(); }) - .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); }) + .on("start.zoom", function() { gesture(this, arguments).event(event).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); }) .tween("zoom", function() { var that = this, args = arguments, - g = gesture(that, args), + g = gesture(that, args).event(event), e = extent.apply(that, args), p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), @@ -17786,11 +19642,16 @@ function zoom() { this.that = that; this.args = args; this.active = 0; + this.sourceEvent = null; this.extent = extent.apply(that, args); this.taps = 0; } Gesture.prototype = { + event: function(event) { + if (event) this.sourceEvent = event; + return this; + }, start: function() { if (++this.active === 1) { this.that.__zooming = this; @@ -17814,16 +19675,28 @@ function zoom() { return this; }, emit: function(type) { - customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + var d = select(this.that).datum(); + listeners.call( + type, + this.that, + new ZoomEvent(type, { + sourceEvent: this.sourceEvent, + target: zoom, + type, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); } }; - function wheeled() { + function wheeled(event, ...args) { if (!filter.apply(this, arguments)) return; - var g = gesture(this, arguments), + var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), - p = mouse(this); + p = pointer(event); // If the mouse is in the same location as before, reuse it. // If there were recent wheel events, reset the wheel idle timeout. @@ -17844,7 +19717,7 @@ function zoom() { g.start(); } - noevent$2(); + noevent(event); g.wheel = setTimeout(wheelidled, wheelDelay); g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); @@ -17854,60 +19727,62 @@ function zoom() { } } - function mousedowned() { + function mousedowned(event, ...args) { if (touchending || !filter.apply(this, arguments)) return; - var g = gesture(this, arguments, true), - v = select(exports.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), - p = mouse(this), - x0 = exports.event.clientX, - y0 = exports.event.clientY; - - dragDisable(exports.event.view); - nopropagation$2(); + var currentTarget = event.currentTarget, + g = gesture(this, args, true).event(event), + v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = pointer(event, currentTarget), + x0 = event.clientX, + y0 = event.clientY; + + dragDisable(event.view); + nopropagation(event); g.mouse = [p, this.__zoom.invert(p)]; interrupt(this); g.start(); - function mousemoved() { - noevent$2(); + function mousemoved(event) { + noevent(event); if (!g.moved) { - var dx = exports.event.clientX - x0, dy = exports.event.clientY - y0; + var dx = event.clientX - x0, dy = event.clientY - y0; g.moved = dx * dx + dy * dy > clickDistance2; } - g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent)); + g.event(event) + .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent)); } - function mouseupped() { + function mouseupped(event) { v.on("mousemove.zoom mouseup.zoom", null); - yesdrag(exports.event.view, g.moved); - noevent$2(); - g.end(); + yesdrag(event.view, g.moved); + noevent(event); + g.event(event).end(); } } - function dblclicked() { + function dblclicked(event, ...args) { if (!filter.apply(this, arguments)) return; var t0 = this.__zoom, - p0 = mouse(this), + p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p0), - k1 = t0.k * (exports.event.shiftKey ? 0.5 : 2), - t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); + k1 = t0.k * (event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); - noevent$2(); - if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0); - else select(this).call(zoom.transform, t1); + noevent(event); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event); + else select(this).call(zoom.transform, t1, p0, event); } - function touchstarted() { + function touchstarted(event, ...args) { if (!filter.apply(this, arguments)) return; - var touches = exports.event.touches, + var touches = event.touches, n = touches.length, - g = gesture(this, arguments, exports.event.changedTouches.length === n), + g = gesture(this, args, event.changedTouches.length === n).event(event), started, i, t, p; - nopropagation$2(); + nopropagation(event); for (i = 0; i < n; ++i) { - t = touches[i], p = touch(this, touches, t.identifier); + t = touches[i], p = pointer(t, this); p = [p, this.__zoom.invert(p), t.identifier]; if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; @@ -17916,23 +19791,21 @@ function zoom() { if (touchstarting) touchstarting = clearTimeout(touchstarting); if (started) { - if (g.taps < 2) touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); interrupt(this); g.start(); } } - function touchmoved() { + function touchmoved(event, ...args) { if (!this.__zooming) return; - var g = gesture(this, arguments), - touches = exports.event.changedTouches, + var g = gesture(this, args).event(event), + touches = event.changedTouches, n = touches.length, i, t, p, l; - noevent$2(); - if (touchstarting) touchstarting = clearTimeout(touchstarting); - g.taps = 0; + noevent(event); for (i = 0; i < n; ++i) { - t = touches[i], p = touch(this, touches, t.identifier); + t = touches[i], p = pointer(t, this); if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; } @@ -17948,16 +19821,17 @@ function zoom() { } else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); } - function touchended() { + function touchended(event, ...args) { if (!this.__zooming) return; - var g = gesture(this, arguments), - touches = exports.event.changedTouches, + var g = gesture(this, args).event(event), + touches = event.changedTouches, n = touches.length, i, t; - nopropagation$2(); + nopropagation(event); if (touchending) clearTimeout(touchending); touchending = setTimeout(function() { touchending = null; }, touchDelay); for (i = 0; i < n; ++i) { @@ -17971,26 +19845,29 @@ function zoom() { g.end(); // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. if (g.taps === 2) { - var p = select(this).on("dblclick.zoom"); - if (p) p.apply(this, arguments); + t = pointer(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } } } } zoom.wheelDelta = function(_) { - return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta; + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; }; zoom.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter; + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; }; zoom.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable; + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; }; zoom.extent = function(_) { - return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; }; zoom.scaleExtent = function(_) { @@ -18022,40 +19899,58 @@ function zoom() { return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); }; + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + return zoom; } +exports.Adder = Adder; +exports.Delaunay = Delaunay; exports.FormatSpecifier = FormatSpecifier; +exports.InternMap = InternMap; +exports.InternSet = InternSet; +exports.Node = Node$1; +exports.Voronoi = Voronoi; +exports.ZoomTransform = Transform; exports.active = active; exports.arc = arc; -exports.area = area$3; +exports.area = area; exports.areaRadial = areaRadial; -exports.ascending = ascending; +exports.ascending = ascending$3; exports.autoType = autoType; exports.axisBottom = axisBottom; exports.axisLeft = axisLeft; exports.axisRight = axisRight; exports.axisTop = axisTop; -exports.bisect = bisectRight; +exports.bin = bin; +exports.bisect = bisect; +exports.bisectCenter = bisectCenter; exports.bisectLeft = bisectLeft; exports.bisectRight = bisectRight; exports.bisector = bisector; exports.blob = blob; +exports.blur = blur; +exports.blur2 = blur2; +exports.blurImage = blurImage; exports.brush = brush; exports.brushSelection = brushSelection; exports.brushX = brushX; exports.brushY = brushY; exports.buffer = buffer; exports.chord = chord; -exports.clientPoint = point; +exports.chordDirected = chordDirected; +exports.chordTranspose = chordTranspose; exports.cluster = cluster; exports.color = color; exports.contourDensity = density; -exports.contours = contours; -exports.create = create; +exports.contours = Contours; +exports.count = count$1; +exports.create = create$1; exports.creator = creator; -exports.cross = cross; -exports.csv = csv$1; +exports.cross = cross$2; +exports.csv = csv; exports.csvFormat = csvFormat; exports.csvFormatBody = csvFormatBody; exports.csvFormatRow = csvFormatRow; @@ -18063,10 +19958,13 @@ exports.csvFormatRows = csvFormatRows; exports.csvFormatValue = csvFormatValue; exports.csvParse = csvParse; exports.csvParseRows = csvParseRows; -exports.cubehelix = cubehelix; -exports.curveBasis = basis$2; -exports.curveBasisClosed = basisClosed$1; +exports.cubehelix = cubehelix$3; +exports.cumsum = cumsum; +exports.curveBasis = basis; +exports.curveBasisClosed = basisClosed; exports.curveBasisOpen = basisOpen; +exports.curveBumpX = bumpX; +exports.curveBumpY = bumpY; exports.curveBundle = bundle; exports.curveCardinal = cardinal; exports.curveCardinalClosed = cardinalClosed; @@ -18082,9 +19980,10 @@ exports.curveNatural = natural; exports.curveStep = step; exports.curveStepAfter = stepAfter; exports.curveStepBefore = stepBefore; -exports.customEvent = customEvent; -exports.descending = descending; +exports.descending = descending$2; exports.deviation = deviation; +exports.difference = difference; +exports.disjoint = disjoint; exports.dispatch = dispatch; exports.drag = drag; exports.dragDisable = dragDisable; @@ -18128,32 +20027,37 @@ exports.easeSin = sinInOut; exports.easeSinIn = sinIn; exports.easeSinInOut = sinInOut; exports.easeSinOut = sinOut; -exports.entries = entries; -exports.extent = extent; -exports.forceCenter = center$1; +exports.every = every; +exports.extent = extent$1; +exports.fcumsum = fcumsum; +exports.filter = filter$1; +exports.flatGroup = flatGroup; +exports.flatRollup = flatRollup; +exports.forceCenter = center; exports.forceCollide = collide; -exports.forceLink = link; +exports.forceLink = link$2; exports.forceManyBody = manyBody; -exports.forceRadial = radial; +exports.forceRadial = radial$1; exports.forceSimulation = simulation; exports.forceX = x$2; -exports.forceY = y$2; -exports.formatDefaultLocale = defaultLocale; -exports.formatLocale = formatLocale; +exports.forceY = y$1; +exports.formatDefaultLocale = defaultLocale$1; +exports.formatLocale = formatLocale$1; exports.formatSpecifier = formatSpecifier; +exports.fsum = fsum; exports.geoAlbers = albers; exports.geoAlbersUsa = albersUsa; -exports.geoArea = area$1; +exports.geoArea = area$2; exports.geoAzimuthalEqualArea = azimuthalEqualArea; exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; exports.geoAzimuthalEquidistant = azimuthalEquidistant; exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; exports.geoBounds = bounds; -exports.geoCentroid = centroid; -exports.geoCircle = circle; +exports.geoCentroid = centroid$1; +exports.geoCircle = circle$2; exports.geoClipAntimeridian = clipAntimeridian; exports.geoClipCircle = clipCircle; -exports.geoClipExtent = extent$1; +exports.geoClipExtent = extent; exports.geoClipRectangle = clipRectangle; exports.geoConicConformal = conicConformal; exports.geoConicConformalRaw = conicConformalRaw; @@ -18171,8 +20075,8 @@ exports.geoGnomonic = gnomonic; exports.geoGnomonicRaw = gnomonicRaw; exports.geoGraticule = graticule; exports.geoGraticule10 = graticule10; -exports.geoIdentity = identity$5; -exports.geoInterpolate = interpolate$1; +exports.geoIdentity = identity$4; +exports.geoInterpolate = interpolate; exports.geoLength = length$1; exports.geoMercator = mercator; exports.geoMercatorRaw = mercatorRaw; @@ -18180,27 +20084,34 @@ exports.geoNaturalEarth1 = naturalEarth1; exports.geoNaturalEarth1Raw = naturalEarth1Raw; exports.geoOrthographic = orthographic; exports.geoOrthographicRaw = orthographicRaw; -exports.geoPath = index$1; +exports.geoPath = index$2; exports.geoProjection = projection; exports.geoProjectionMutator = projectionMutator; exports.geoRotation = rotation; exports.geoStereographic = stereographic; exports.geoStereographicRaw = stereographicRaw; exports.geoStream = geoStream; -exports.geoTransform = transform; +exports.geoTransform = transform$1; exports.geoTransverseMercator = transverseMercator; exports.geoTransverseMercatorRaw = transverseMercatorRaw; exports.gray = gray; -exports.hcl = hcl; +exports.greatest = greatest; +exports.greatestIndex = greatestIndex; +exports.group = group; +exports.groupSort = groupSort; +exports.groups = groups; +exports.hcl = hcl$2; exports.hierarchy = hierarchy; -exports.histogram = histogram; -exports.hsl = hsl; +exports.histogram = bin; +exports.hsl = hsl$2; exports.html = html; exports.image = image; -exports.interpolate = interpolateValue; -exports.interpolateArray = array$1; -exports.interpolateBasis = basis$1; -exports.interpolateBasisClosed = basisClosed; +exports.index = index$4; +exports.indexes = indexes; +exports.interpolate = interpolate$2; +exports.interpolateArray = array$3; +exports.interpolateBasis = basis$2; +exports.interpolateBasisClosed = basisClosed$1; exports.interpolateBlues = Blues; exports.interpolateBrBG = BrBG; exports.interpolateBuGn = BuGn; @@ -18208,24 +20119,24 @@ exports.interpolateBuPu = BuPu; exports.interpolateCividis = cividis; exports.interpolateCool = cool; exports.interpolateCubehelix = cubehelix$2; -exports.interpolateCubehelixDefault = cubehelix$3; +exports.interpolateCubehelixDefault = cubehelix; exports.interpolateCubehelixLong = cubehelixLong; -exports.interpolateDate = date; +exports.interpolateDate = date$1; exports.interpolateDiscrete = discrete; exports.interpolateGnBu = GnBu; exports.interpolateGreens = Greens; exports.interpolateGreys = Greys; -exports.interpolateHcl = hcl$2; +exports.interpolateHcl = hcl$1; exports.interpolateHclLong = hclLong; -exports.interpolateHsl = hsl$2; +exports.interpolateHsl = hsl$1; exports.interpolateHslLong = hslLong; -exports.interpolateHue = hue$1; +exports.interpolateHue = hue; exports.interpolateInferno = inferno; -exports.interpolateLab = lab$1; +exports.interpolateLab = lab; exports.interpolateMagma = magma; exports.interpolateNumber = interpolateNumber; exports.interpolateNumberArray = numberArray; -exports.interpolateObject = object; +exports.interpolateObject = object$1; exports.interpolateOrRd = OrRd; exports.interpolateOranges = Oranges; exports.interpolatePRGn = PRGn; @@ -18261,32 +20172,38 @@ exports.interpolateYlOrBr = YlOrBr; exports.interpolateYlOrRd = YlOrRd; exports.interpolateZoom = interpolateZoom; exports.interrupt = interrupt; -exports.interval = interval$1; -exports.isoFormat = formatIso; -exports.isoParse = parseIso; +exports.intersection = intersection; +exports.interval = interval; +exports.isoFormat = formatIso$1; +exports.isoParse = parseIso$1; exports.json = json; -exports.keys = keys; -exports.lab = lab; +exports.lab = lab$1; exports.lch = lch; +exports.least = least; +exports.leastIndex = leastIndex; exports.line = line; exports.lineRadial = lineRadial$1; +exports.link = link; exports.linkHorizontal = linkHorizontal; exports.linkRadial = linkRadial; exports.linkVertical = linkVertical; -exports.local = local; +exports.local = local$1; exports.map = map$1; exports.matcher = matcher; -exports.max = max; +exports.max = max$3; +exports.maxIndex = maxIndex; exports.mean = mean; exports.median = median; +exports.medianIndex = medianIndex; exports.merge = merge; -exports.min = min; -exports.mouse = mouse; +exports.min = min$2; +exports.minIndex = minIndex; +exports.mode = mode; exports.namespace = namespace; exports.namespaces = namespaces; -exports.nest = nest; +exports.nice = nice$1; exports.now = now; -exports.pack = index$2; +exports.pack = index$1; exports.packEnclose = enclose; exports.packSiblings = siblings; exports.pairs = pairs; @@ -18296,43 +20213,67 @@ exports.permute = permute; exports.pie = pie; exports.piecewise = piecewise; exports.pointRadial = pointRadial; -exports.polygonArea = area$2; -exports.polygonCentroid = centroid$1; -exports.polygonContains = contains$2; +exports.pointer = pointer; +exports.pointers = pointers; +exports.polygonArea = area$1; +exports.polygonCentroid = centroid; +exports.polygonContains = contains; exports.polygonHull = hull; -exports.polygonLength = length$2; +exports.polygonLength = length; exports.precisionFixed = precisionFixed; exports.precisionPrefix = precisionPrefix; exports.precisionRound = precisionRound; exports.quadtree = quadtree; -exports.quantile = threshold; -exports.quantize = quantize; +exports.quantile = quantile$1; +exports.quantileIndex = quantileIndex; +exports.quantileSorted = quantileSorted; +exports.quantize = quantize$1; +exports.quickselect = quickselect; exports.radialArea = areaRadial; exports.radialLine = lineRadial$1; exports.randomBates = bates; -exports.randomExponential = exponential$1; +exports.randomBernoulli = bernoulli; +exports.randomBeta = beta; +exports.randomBinomial = binomial; +exports.randomCauchy = cauchy; +exports.randomExponential = exponential; +exports.randomGamma = gamma; +exports.randomGeometric = geometric; +exports.randomInt = int; exports.randomIrwinHall = irwinHall; +exports.randomLcg = lcg; exports.randomLogNormal = logNormal; +exports.randomLogistic = logistic; exports.randomNormal = normal; +exports.randomPareto = pareto; +exports.randomPoisson = poisson; exports.randomUniform = uniform; -exports.range = sequence; +exports.randomWeibull = weibull; +exports.range = range$2; +exports.rank = rank; +exports.reduce = reduce; +exports.reverse = reverse$1; exports.rgb = rgb; -exports.ribbon = ribbon; +exports.ribbon = ribbon$1; +exports.ribbonArrow = ribbonArrow; +exports.rollup = rollup; +exports.rollups = rollups; exports.scaleBand = band; -exports.scaleDiverging = diverging; +exports.scaleDiverging = diverging$1; exports.scaleDivergingLog = divergingLog; exports.scaleDivergingPow = divergingPow; exports.scaleDivergingSqrt = divergingSqrt; exports.scaleDivergingSymlog = divergingSymlog; -exports.scaleIdentity = identity$7; +exports.scaleIdentity = identity$2; exports.scaleImplicit = implicit; -exports.scaleLinear = linear$2; -exports.scaleLog = log$1; +exports.scaleLinear = linear; +exports.scaleLog = log; exports.scaleOrdinal = ordinal; -exports.scalePoint = point$1; -exports.scalePow = pow$1; +exports.scalePoint = point$4; +exports.scalePow = pow; exports.scaleQuantile = quantile; -exports.scaleQuantize = quantize$1; +exports.scaleQuantize = quantize; +exports.scaleRadial = radial; exports.scaleSequential = sequential; exports.scaleSequentialLog = sequentialLog; exports.scaleSequentialPow = sequentialPow; @@ -18341,136 +20282,148 @@ exports.scaleSequentialSqrt = sequentialSqrt; exports.scaleSequentialSymlog = sequentialSymlog; exports.scaleSqrt = sqrt$1; exports.scaleSymlog = symlog; -exports.scaleThreshold = threshold$1; +exports.scaleThreshold = threshold; exports.scaleTime = time; exports.scaleUtc = utcTime; exports.scan = scan; exports.schemeAccent = Accent; -exports.schemeBlues = scheme$l; -exports.schemeBrBG = scheme; -exports.schemeBuGn = scheme$9; -exports.schemeBuPu = scheme$a; +exports.schemeBlues = scheme$5; +exports.schemeBrBG = scheme$q; +exports.schemeBuGn = scheme$h; +exports.schemeBuPu = scheme$g; exports.schemeCategory10 = category10; exports.schemeDark2 = Dark2; -exports.schemeGnBu = scheme$b; -exports.schemeGreens = scheme$m; -exports.schemeGreys = scheme$n; -exports.schemeOrRd = scheme$c; -exports.schemeOranges = scheme$q; -exports.schemePRGn = scheme$1; +exports.schemeGnBu = scheme$f; +exports.schemeGreens = scheme$4; +exports.schemeGreys = scheme$3; +exports.schemeOrRd = scheme$e; +exports.schemeOranges = scheme; +exports.schemePRGn = scheme$p; exports.schemePaired = Paired; exports.schemePastel1 = Pastel1; exports.schemePastel2 = Pastel2; -exports.schemePiYG = scheme$2; -exports.schemePuBu = scheme$e; +exports.schemePiYG = scheme$o; +exports.schemePuBu = scheme$c; exports.schemePuBuGn = scheme$d; -exports.schemePuOr = scheme$3; -exports.schemePuRd = scheme$f; -exports.schemePurples = scheme$o; -exports.schemeRdBu = scheme$4; -exports.schemeRdGy = scheme$5; -exports.schemeRdPu = scheme$g; -exports.schemeRdYlBu = scheme$6; -exports.schemeRdYlGn = scheme$7; -exports.schemeReds = scheme$p; +exports.schemePuOr = scheme$n; +exports.schemePuRd = scheme$b; +exports.schemePurples = scheme$2; +exports.schemeRdBu = scheme$m; +exports.schemeRdGy = scheme$l; +exports.schemeRdPu = scheme$a; +exports.schemeRdYlBu = scheme$k; +exports.schemeRdYlGn = scheme$j; +exports.schemeReds = scheme$1; exports.schemeSet1 = Set1; exports.schemeSet2 = Set2; exports.schemeSet3 = Set3; -exports.schemeSpectral = scheme$8; +exports.schemeSpectral = scheme$i; exports.schemeTableau10 = Tableau10; -exports.schemeYlGn = scheme$i; -exports.schemeYlGnBu = scheme$h; -exports.schemeYlOrBr = scheme$j; -exports.schemeYlOrRd = scheme$k; +exports.schemeYlGn = scheme$8; +exports.schemeYlGnBu = scheme$9; +exports.schemeYlOrBr = scheme$7; +exports.schemeYlOrRd = scheme$6; exports.select = select; exports.selectAll = selectAll; exports.selection = selection; exports.selector = selector; exports.selectorAll = selectorAll; -exports.set = set$2; -exports.shuffle = shuffle; +exports.shuffle = shuffle$1; +exports.shuffler = shuffler; +exports.some = some; +exports.sort = sort; exports.stack = stack; -exports.stackOffsetDiverging = diverging$1; +exports.stackOffsetDiverging = diverging; exports.stackOffsetExpand = expand; exports.stackOffsetNone = none$1; exports.stackOffsetSilhouette = silhouette; exports.stackOffsetWiggle = wiggle; exports.stackOrderAppearance = appearance; -exports.stackOrderAscending = ascending$3; -exports.stackOrderDescending = descending$2; +exports.stackOrderAscending = ascending; +exports.stackOrderDescending = descending; exports.stackOrderInsideOut = insideOut; -exports.stackOrderNone = none$2; +exports.stackOrderNone = none; exports.stackOrderReverse = reverse; exports.stratify = stratify; exports.style = styleValue; -exports.sum = sum; +exports.subset = subset; +exports.sum = sum$2; +exports.superset = superset; exports.svg = svg; -exports.symbol = symbol; -exports.symbolCircle = circle$2; -exports.symbolCross = cross$2; +exports.symbol = Symbol$1; +exports.symbolAsterisk = asterisk; +exports.symbolCircle = circle; +exports.symbolCross = cross; exports.symbolDiamond = diamond; +exports.symbolDiamond2 = diamond2; +exports.symbolPlus = plus; exports.symbolSquare = square; +exports.symbolSquare2 = square2; exports.symbolStar = star; exports.symbolTriangle = triangle; +exports.symbolTriangle2 = triangle2; exports.symbolWye = wye; -exports.symbols = symbols; +exports.symbolX = x; +exports.symbols = symbolsFill; +exports.symbolsFill = symbolsFill; +exports.symbolsStroke = symbolsStroke; exports.text = text; -exports.thresholdFreedmanDiaconis = freedmanDiaconis; -exports.thresholdScott = scott; +exports.thresholdFreedmanDiaconis = thresholdFreedmanDiaconis; +exports.thresholdScott = thresholdScott; exports.thresholdSturges = thresholdSturges; exports.tickFormat = tickFormat; exports.tickIncrement = tickIncrement; exports.tickStep = tickStep; exports.ticks = ticks; -exports.timeDay = day; +exports.timeDay = timeDay; exports.timeDays = days; -exports.timeFormatDefaultLocale = defaultLocale$1; -exports.timeFormatLocale = formatLocale$1; +exports.timeFormatDefaultLocale = defaultLocale; +exports.timeFormatLocale = formatLocale; exports.timeFriday = friday; exports.timeFridays = fridays; -exports.timeHour = hour; +exports.timeHour = timeHour; exports.timeHours = hours; exports.timeInterval = newInterval; -exports.timeMillisecond = millisecond; +exports.timeMillisecond = millisecond$1; exports.timeMilliseconds = milliseconds; -exports.timeMinute = minute; +exports.timeMinute = timeMinute; exports.timeMinutes = minutes; exports.timeMonday = monday; exports.timeMondays = mondays; -exports.timeMonth = month; +exports.timeMonth = timeMonth; exports.timeMonths = months; exports.timeSaturday = saturday; exports.timeSaturdays = saturdays; -exports.timeSecond = second; +exports.timeSecond = utcSecond; exports.timeSeconds = seconds; exports.timeSunday = sunday; exports.timeSundays = sundays; exports.timeThursday = thursday; exports.timeThursdays = thursdays; +exports.timeTickInterval = timeTickInterval; +exports.timeTicks = timeTicks; exports.timeTuesday = tuesday; exports.timeTuesdays = tuesdays; exports.timeWednesday = wednesday; exports.timeWednesdays = wednesdays; exports.timeWeek = sunday; exports.timeWeeks = sundays; -exports.timeYear = year; +exports.timeYear = timeYear; exports.timeYears = years; -exports.timeout = timeout$1; +exports.timeout = timeout; exports.timer = timer; exports.timerFlush = timerFlush; -exports.touch = touch; -exports.touches = touches; exports.transition = transition; exports.transpose = transpose; exports.tree = tree; -exports.treemap = index$3; +exports.treemap = index; exports.treemapBinary = binary; exports.treemapDice = treemapDice; exports.treemapResquarify = resquarify; exports.treemapSlice = treemapSlice; exports.treemapSliceDice = sliceDice; exports.treemapSquarify = squarify; -exports.tsv = tsv$1; +exports.tsv = tsv; exports.tsvFormat = tsvFormat; exports.tsvFormatBody = tsvFormatBody; exports.tsvFormatRow = tsvFormatRow; @@ -18478,46 +20431,47 @@ exports.tsvFormatRows = tsvFormatRows; exports.tsvFormatValue = tsvFormatValue; exports.tsvParse = tsvParse; exports.tsvParseRows = tsvParseRows; -exports.utcDay = utcDay; +exports.union = union; +exports.utcDay = utcDay$1; exports.utcDays = utcDays; exports.utcFriday = utcFriday; exports.utcFridays = utcFridays; -exports.utcHour = utcHour; +exports.utcHour = utcHour$1; exports.utcHours = utcHours; -exports.utcMillisecond = millisecond; +exports.utcMillisecond = millisecond$1; exports.utcMilliseconds = milliseconds; -exports.utcMinute = utcMinute; +exports.utcMinute = utcMinute$1; exports.utcMinutes = utcMinutes; exports.utcMonday = utcMonday; exports.utcMondays = utcMondays; -exports.utcMonth = utcMonth; +exports.utcMonth = utcMonth$1; exports.utcMonths = utcMonths; exports.utcSaturday = utcSaturday; exports.utcSaturdays = utcSaturdays; -exports.utcSecond = second; +exports.utcSecond = utcSecond; exports.utcSeconds = seconds; exports.utcSunday = utcSunday; exports.utcSundays = utcSundays; exports.utcThursday = utcThursday; exports.utcThursdays = utcThursdays; +exports.utcTickInterval = utcTickInterval; +exports.utcTicks = utcTicks; exports.utcTuesday = utcTuesday; exports.utcTuesdays = utcTuesdays; exports.utcWednesday = utcWednesday; exports.utcWednesdays = utcWednesdays; exports.utcWeek = utcSunday; exports.utcWeeks = utcSundays; -exports.utcYear = utcYear; +exports.utcYear = utcYear$1; exports.utcYears = utcYears; -exports.values = values; exports.variance = variance; exports.version = version; -exports.voronoi = voronoi; exports.window = defaultView; exports.xml = xml; exports.zip = zip; exports.zoom = zoom; -exports.zoomIdentity = identity$9; -exports.zoomTransform = transform$1; +exports.zoomIdentity = identity; +exports.zoomTransform = transform; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/inst/htmlwidgets/lfx-hexbin/hexbin-bindings.js b/inst/htmlwidgets/lfx-hexbin/hexbin-bindings.js index 27e7968a..c9d9cfb8 100644 --- a/inst/htmlwidgets/lfx-hexbin/hexbin-bindings.js +++ b/inst/htmlwidgets/lfx-hexbin/hexbin-bindings.js @@ -35,7 +35,7 @@ LeafletWidget.methods.addHexbin = function(data, layerId, group, options) { hexLayer.dispatch() .on('click', function(d, i) { var pts = []; - d.forEach(x => pts.push(x.o)); + i.forEach(x => pts.push(x.o)); Shiny.setInputValue(map.id+"_hexbin_click", {index: i, pts: pts}, {priority: "event"}); }); } diff --git a/inst/htmlwidgets/lfx-history/lfx-history-bindings.js b/inst/htmlwidgets/lfx-history/lfx-history-bindings.js new file mode 100644 index 00000000..ce0687bf --- /dev/null +++ b/inst/htmlwidgets/lfx-history/lfx-history-bindings.js @@ -0,0 +1,26 @@ +LeafletWidget.methods.addHistory = function(layerId, options) { + var map = this; + map.hist = new L.HistoryControl(options); + map.controls.add(map.hist, layerId); +}; + +LeafletWidget.methods.goBackHistory = function() { + if (this.hist) { + this.hist.goBack(); + } +}; +LeafletWidget.methods.goForwardHistory = function() { + if (this.hist) { + this.hist.goForward(); + } +}; +LeafletWidget.methods.clearHistory = function() { + if (this.hist) { + this.hist.clearHistory(); + } +}; +LeafletWidget.methods.clearFuture = function() { + if (this.hist) { + this.hist.clearFuture(); + } +}; diff --git a/inst/htmlwidgets/lfx-history/lfx-history.css b/inst/htmlwidgets/lfx-history/lfx-history.css new file mode 100644 index 00000000..eec0b71b --- /dev/null +++ b/inst/htmlwidgets/lfx-history/lfx-history.css @@ -0,0 +1 @@ +.history-control.leaflet-bar.hidden{display:none}.history-control.leaflet-bar.horizontal a{display:inline-block;border-bottom:0;border-radius:0;border-right:1px solid #ccc}.history-control.leaflet-bar.horizontal a:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.history-control.leaflet-bar.horizontal a:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-right:0}.history-control.leaflet-bar a{width:auto;font-size:1.1em;min-width:26px} \ No newline at end of file diff --git a/inst/htmlwidgets/lfx-history/lfx-history.js b/inst/htmlwidgets/lfx-history/lfx-history.js new file mode 100644 index 00000000..f836943d --- /dev/null +++ b/inst/htmlwidgets/lfx-history/lfx-history.js @@ -0,0 +1,196 @@ +(function () { + L.HistoryControl = L.Control.extend({ + options: { + position: 'topright', + maxMovesToSave: 10, //set to 0 for unlimited + useExternalControls: false, //set to true to hide buttons on map and use your own. Can still use goBack, goForward, and allow this to take care of storing history. + backImage: 'fa fa-caret-left', + backText: '', + backTooltip: 'Go to Previous Extent', + backImageBeforeText: true, + forwardImage: 'fa fa-caret-right', + forwardText: '', + forwardTooltip: 'Go to Next Extent', + forwardImageBeforeText: false, + orientation: 'horizontal', + shouldSaveMoveInHistory: function(zoomCenter) { return true; } //by default save everything + }, + initialize: function(options) { + L.Util.setOptions(this, options); + + this._state.maxMovesToSave = this.options.maxMovesToSave; + }, + onAdd: function(map) { + this._map = map; + + var container = L.DomUtil.create('div', 'history-control leaflet-bar leaflet-control ' + this.options.orientation); + if(!this.options.useExternalControls) { + this._backButton = this._createButton('back', container, this.goBack, this); + this._forwardButton = this._createButton('forward', container, this.goForward, this); + } + this._updateDisabled(); + this._addMapListeners(); + + return container; + }, + onRemove: function(map) { + map.off('movestart'); + }, + performActionWithoutTriggeringEvent: function(action) { + this._state.ignoringEvents = true; + if(typeof (action) === 'function') { + action(); + } + }, + moveWithoutTriggeringEvent: function(zoomCenter) { + var _this = this; + this.performActionWithoutTriggeringEvent(function() { + _this._map.setView(zoomCenter.centerPoint, zoomCenter.zoom); + }); + }, + goBack: function() { + return this._invokeBackOrForward('historyback', this._state.history, this._state.future); + }, + goForward: function() { + return this._invokeBackOrForward('historyforward', this._state.future, this._state.history); + }, + clearHistory: function() { + this._state.history.items = []; + this._updateDisabled(); + }, + clearFuture: function() { + this._state.future.items = []; + this._updateDisabled(); + }, + _map: null, + _backButton: null, + _forwardButton: null, + _state: { + backDisabled: null, + forwardDisabled: null, + ignoringEvents: false, + maxMovesToSave: 0, + history: { + items: [] + }, + future: { + items: [] + } + }, + _createButton: function (name, container, action, _this) { + var text = this.options[name + 'Text'] || ''; + var imageClass = this.options[name + 'Image'] || ''; + var tooltip = this.options[name + 'Tooltip'] || ''; + var button = L.DomUtil.create('a', 'history-' + name + '-button', container); + if(imageClass) { + var imageElement = ''; + if(this.options[name + 'ImageBeforeText']) { + text = imageElement + ' ' + text; + } + else { + text += ' ' + imageElement; + } + } + button.innerHTML = text; + button.href = '#'; + button.title = tooltip; + + var stop = L.DomEvent.stopPropagation; + + L.DomEvent + .on(button, 'click', stop) + .on(button, 'mousedown', stop) + .on(button, 'dblclick', stop) + .on(button, 'click', L.DomEvent.preventDefault) + .on(button, 'click', action, _this) + .on(button, 'click', this._refocusOnMap, _this); + + return button; + }, + _updateDisabled: function () { + var backDisabled = (this._state.history.items.length === 0); + var forwardDisabled = (this._state.future.items.length === 0); + if(backDisabled !== this._state.backDisabled) { + this._state.backDisabled = backDisabled; + this._map.fire('historyback' + (backDisabled ? 'disabled' : 'enabled')); + } + if(forwardDisabled !== this._state.forwardDisabled) { + this._state.forwardDisabled = forwardDisabled; + this._map.fire('historyforward' + (forwardDisabled ? 'disabled' : 'enabled')); + } + if(!this.options.useExternalControls) { + this._setButtonDisabled(this._backButton, backDisabled); + this._setButtonDisabled(this._forwardButton, forwardDisabled); + } + }, + _setButtonDisabled: function(button, condition) { + var className = 'leaflet-disabled'; + if(condition) { + L.DomUtil.addClass(button, className); + } + else { + L.DomUtil.removeClass(button, className); + } + }, + _pop: function(stack) { + stack = stack.items; + if(L.Util.isArray(stack) && stack.length > 0) { + return stack.splice(stack.length - 1, 1)[0]; + } + return undefined; + }, + _push: function(stack, value) { + var maxLength = this._state.maxMovesToSave; + stack = stack.items; + if(L.Util.isArray(stack)) { + stack.push(value); + if(maxLength > 0 && stack.length > maxLength) { + stack.splice(0, 1); + } + } + }, + _invokeBackOrForward: function(eventName, stackToPop, stackToPushCurrent) { + var response = this._popStackAndUseLocation(stackToPop, stackToPushCurrent); + if(response) { + this._map.fire(eventName, response); + return true; + } + return false; + }, + _popStackAndUseLocation : function(stackToPop, stackToPushCurrent) { + //check if we can pop + if(L.Util.isArray(stackToPop.items) && stackToPop.items.length > 0) { + var current = this._buildZoomCenterObjectFromCurrent(this._map); + //get most recent + var previous = this._pop(stackToPop); + //save where we currently are in the 'other' stack + this._push(stackToPushCurrent, current); + this.moveWithoutTriggeringEvent(previous); + + return { + previousLocation: previous, + currentLocation: current + }; + } + }, + _buildZoomCenterObjectFromCurrent:function(map) { + return new L.ZoomCenter(map.getZoom(), map.getCenter()); + }, + _addMapListeners: function() { + var _this = this; + this._map.on('movestart', function(e) { + if(!_this._state.ignoringEvents) { + var current = _this._buildZoomCenterObjectFromCurrent(e.target); + if(_this.options.shouldSaveMoveInHistory(current)) { + _this._state.future.items = []; + _this._push(_this._state.history, current); + } + } else { + _this._state.ignoringEvents = false; + } + + _this._updateDisabled(); + }); + } + }); +}()); diff --git a/inst/htmlwidgets/lfx-history/zoomCenter.js b/inst/htmlwidgets/lfx-history/zoomCenter.js new file mode 100644 index 00000000..796a4728 --- /dev/null +++ b/inst/htmlwidgets/lfx-history/zoomCenter.js @@ -0,0 +1,8 @@ +(function () { + L.ZoomCenter = L.Class.extend({ + initialize: function(zoom, centerPoint) { + this.zoom = zoom; + this.centerPoint = centerPoint; + } + }); +}()); diff --git a/inst/htmlwidgets/lfx-labelgun/labelgun-binding.js b/inst/htmlwidgets/lfx-labelgun/labelgun-binding.js new file mode 100644 index 00000000..9c7c6459 --- /dev/null +++ b/inst/htmlwidgets/lfx-labelgun/labelgun-binding.js @@ -0,0 +1,87 @@ +/* global LeafletWidget, $, L, Shiny, HTMLWidgets */ +LeafletWidget.methods.addLabelgun = function(group, weight, entries) { + var map = this; + + // We provide two functions, to hide/show the labels. + // Here the callbacks set the labels opacity to 0 and 1 respectively. + var hideLabel = function(label){ label.labelObject.style.opacity = 0;}; + var showLabel = function(label){ label.labelObject.style.opacity = 1;}; + labelEngine = new labelgun.default(hideLabel, showLabel, entries); + + // Get groups as Array and Loop over all + var groups = Array.isArray(group) ? group : [group] + groups.forEach(function(grp) { + var i = 0; + // Get the layers for the given group and call `addLabel` for each one + var markers = map.layerManager.getLayerGroup(grp); + + // If the marker group exists add events + if (markers) { + // Call `resetLabels` when a layer with the group name is added (LayerControl) + map.on("overlayadd", function(layer){ + if (layer.name === grp) { + resetLabels(markers, weight); + } + }); + // Call `resetLabels` after zooming only when the group is visible + map.on("zoomend", function(e){ + if (map.layerManager.getVisibleGroups().indexOf(markers.groupname) > -1) { + resetLabels(markers, weight); + } + }); + + // Call `resetLabels` initially + resetLabels(markers, weight); + } + }) + + + function resetLabels(markers, weight) { + // Call `addLabel` for each marker with an optional weight + var j = 0; + markers.eachLayer(function(label){ + addLabel(label, j, Array.isArray(weight) ? weight[j] : weight); + j++; + }); + // Update the labelEngine + labelEngine.update(); + } + function addLabel(layer, id, weight) { + // Get container of the tooltip + var label = layer.getTooltip()._source._tooltip._container; + if (label) { + // Get bounding rectangle of the label itself + var rect = label.getBoundingClientRect(); + + // Convert the container coordinates (screen space) to Lat/lng + var bottomLeft = map.containerPointToLatLng([rect.left, rect.bottom]); + var topRight = map.containerPointToLatLng([rect.right, rect.top]); + var boundingBox = { + bottomLeft : [bottomLeft.lng, bottomLeft.lat], + topRight : [topRight.lng, topRight.lat] + }; + + // Get Weight + var wght = weight; + wght = typeof wght === 'number' ? wght : parseInt(Math.random() * (5 - 1) + 1); + // console.log(weight + " => " + wght) + + // Ingest the label into labelgun itself + labelEngine.ingestLabel( + boundingBox, + id, + wght, + label, + "Label_" + id, + false + ); + + // Add the label if it hasn't been added to the map already + if (!layer.added) { + layer.addTo(map); + layer.added = true; + } + } + } +}; + diff --git a/inst/htmlwidgets/lfx-labelgun/labelgun.js b/inst/htmlwidgets/lfx-labelgun/labelgun.js new file mode 100644 index 00000000..fb42a817 --- /dev/null +++ b/inst/htmlwidgets/lfx-labelgun/labelgun.js @@ -0,0 +1,569 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("rbush")); + else if(typeof define === 'function' && define.amd) + define(["rbush"], factory); + else if(typeof exports === 'object') + exports["labelgun"] = factory(require("rbush")); + else + root["labelgun"] = factory(root["rbush"]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _rbush = __webpack_require__(1); + +var _rbush2 = _interopRequireDefault(_rbush); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** +* @summary create a label gun instance with a hide and show label callback +* @param {function} hideLabel the function responsible for hiding the label on hide event +* @param {function} showLabel the function responsible for showing the label on show event +* @param {number} entries Higher value relates to faster insertion and slower search, and vice versa +*/ +var labelgun = function () { + function labelgun(hideLabel, showLabel, entries) { + _classCallCheck(this, labelgun); + + var usedEntries = entries || 10; + this.tree = (0, _rbush2.default)(usedEntries); + this.allLabels = {}; + this.hasChanged = []; + this.allChanged = false; + this.hideLabel = hideLabel; + this.showLabel = showLabel; + } + + /** + * @name _total + * @summary get the total hidden or shown labels in the tree + * @memberof labelgun.prototype + * @param {string} state whether to return 'hide' or 'show' state label totals + * @returns {number} total number of labels of that state + * @private + */ + + + _createClass(labelgun, [{ + key: "_total", + value: function _total(state) { + var total = 0; + for (var key in this.allLabels) { + if (this.allLabels[key].state == state) { + total += 1; + } + } + return total; + } + + /** + * @name totalShown + * @memberof labelgun + * @method + * @summary Return the total number of shown labels + * @returns {number} Return total number of labels shown + * @public + */ + + }, { + key: "totalShown", + value: function totalShown() { + return this._total("show"); + } + + /** + * @name totalHidden + * @memberof labelgun + * @method + * @summary Return the total number of hidden labels + * @returns {number} Return total number of labels hidden + * @public + */ + + }, { + key: "totalHidden", + value: function totalHidden() { + return this._total("hide"); + } + + /** + * @name getLabelsByState + * @summary Provided a state get all labels of that state + * @param {string} state - the state of the labels to get (show or hide) + * @returns {array} Labels that match the given state (show or hide) + * @private + */ + + }, { + key: "_getLabelsByState", + value: function _getLabelsByState(state) { + var labels = []; + for (var key in this.allLabels) { + if (this.allLabels[key].state == state) { + labels.push(this.allLabels[key]); + } + } + return labels; + } + + /** + * @name getHidden + * @memberof labelgun + * @method + * @summary Return an array of all the hidden labels + * @returns {array} An array of hidden labels + */ + + }, { + key: "getHidden", + value: function getHidden() { + return this._getLabelsByState("hide"); + } + + /** + * @name getShown + * @memberof labelgun + * @method + * @summary Return an array of all shown labels + * @returns {array} An array of shown label + */ + + }, { + key: "getShown", + value: function getShown() { + return this._getLabelsByState("show"); + } + + /** + * @name getCollisions + * @memberof labelgun + * @method + * @summary Return a set of collisions (hidden and shown) for a given label + * @param {string} id - the ID of the label to get + * @returns {array} The list of collisions + */ + + }, { + key: "getCollisions", + value: function getCollisions(id) { + + var label = this.allLabels[id]; + if (label === undefined) { + throw Error("Label doesn't exist :" + JSON.stringify(id)); + } + + var collisions = this.tree.search(label); + var self = collisions.indexOf(label); + + // Remove the label if it's colliding with itself + if (self !== undefined) collisions.splice(self, 1); + return collisions; + } + + /** + * @name getLabel + * @memberof labelgun + * @method + * @summary Convenience function to return a label by ID + * @param {string} id the ID of the label to get + * @returns {object} The label object for the id + */ + + }, { + key: "getLabel", + value: function getLabel(id) { + return this.allLabels[id]; + } + + /** + * @name reset + * @memberof labelgun + * @method + * @summary Destroy the collision tree and labels + * @returns {undefined} + */ + + }, { + key: "reset", + value: function reset() { + this.tree.clear(); + this.allLabels = {}; + this.hasChanged = []; + this.allChanged = false; + } + + /** + * @name _callLabelCallbacks + * @memberof labelgun + * @method + * @summary Perform the related callback for a label depending on where its state is 'show' or 'hide' + * @param {string} [forceState] - the class of which to change the label to + * @returns {undefined} + * @private + */ + + }, { + key: "_callLabelCallbacks", + value: function _callLabelCallbacks(forceState) { + for (var key in this.allLabels) { + this._callLabelStateCallback(this.allLabels[key], forceState); + } + } + + /** + * @name _callLabelStateCallback + * @summary Calls the correct callback for a particular label depending on its state (hidden or shown) + * @param {string} label the label to update + * @param {string} forceState the state of which to change the label to ('show' or 'hide') + * @returns {undefined} + * @private + */ + + }, { + key: "_callLabelStateCallback", + value: function _callLabelStateCallback(label, forceState) { + var state = forceState || label.state; + if (state === "show") this.showLabel(label); + if (state === "hide") this.hideLabel(label); + } + + /** + * @name _compareLabels + * @memberof labelgun + * @method + * @summary Calculates which labels should show and which should hide + * @returns {undefined} + * @private + */ + + }, { + key: "_compareLabels", + value: function _compareLabels() { + var _this = this; + + // Map all the labels to an array and sort based on weight + // highest to lowest + + this.orderedLabels = []; + for (var key in this.allLabels) { + this.orderedLabels.push(this.allLabels[key]); + } + this.orderedLabels.sort(this._compare); + + this.orderedLabels.forEach(function (label) { + + var collisions = _this.tree.search(label); + + if (collisions.length === 0 || label.isDragged || _this._allLower(collisions, label)) { + _this.allLabels[label.id].state = "show"; + } + }); + } + + /** + * @name _allLower + * @memberof labelgun + * @method + * @param {array} collisions - An array of collisions (label objects) + * @param {object} label - The label to check + * @summary Checks if labels are of a lower weight, currently showing, or dragged + * @returns {boolean} - Whether collision are lower or contain already shown or dragged labels + * @private + */ + + }, { + key: "_allLower", + value: function _allLower(collisions, label) { + var collision = void 0; + for (var i = 0; i < collisions.length; i++) { + collision = collisions[i]; + if (collision.state === "show" || collision.weight > label.weight || collision.isDragged) { + return false; + } + } + + return true; + } + + /** + * @name _compare + * @memberof labelgun + * @method + * @param {object} a - First object to compare + * @param {object} b - Second object to compare + * @summary Compares labels weights for sorting + * @returns {number} - The sort value + * @private + */ + + }, { + key: "_compare", + value: function _compare(a, b) { + // High to Low + return b.weight - a.weight; + } + + /** + * @name _setupLabels + * @memberof labelgun + * @method + * @summary Sets up the labels depending on whether all have changed or some have changed + * @returns {undefined} + * @private + */ + + }, { + key: "_setupLabels", + value: function _setupLabels() { + var _this2 = this; + + if (this.allChanged) { + + this.allChanged = false; + this.hasChanged = []; + this.tree.clear(); + + var labels = []; + for (var key in this.allLabels) { + this._handleLabelIngestion(key); + labels.push(this.allLabels[key]); + } + + this.tree.load(labels); + } else if (this.hasChanged.length > 0) { + + this.hasChanged.forEach(function (id) { + _this2._handleLabelIngestion(id); + _this2.tree.insert(_this2.allLabels[id]); + }); + + this.hasChanged = []; + } + } + + /** + * @name _handleLabelIngestion + * @memberof labelgun + * @method + * @summary DRY function for ingesting labels + * @returns {undefined} + * @param {string} id - ID of the label to ingest + * @private + */ + + }, { + key: "_handleLabelIngestion", + value: function _handleLabelIngestion(id) { + var label = this.allLabels[id]; + + this.ingestLabel({ + bottomLeft: [label.minX, label.minY], + topRight: [label.maxX, label.maxY] + }, label.id, label.weight, label.labelObject, label.name, label.isDragged); + } + + /** + * @name update + * @memberof labelgun + * @method + * @param {boolean} onlyChanges - Whether to only update the changes made by labelHasChanged + * @summary Sets all or some of the labels to change and reruns the whole show/hide procedure + * @returns {undefined} + */ + + }, { + key: "update", + value: function update(onlyChanges) { + + if (onlyChanges) { + this.allChanged = false; + } else { + this.allChanged = true; + } + + this._setupLabels(); + this._compareLabels(); + this._callLabelCallbacks(); + } + + /** + * @name removeLabel + * @memberof labelgun + * @method + * @param {string} id - The label id for the label to remove from the tree + * @param {object} label - The label to remove from the tree + * @summary Removes label from tree and allLabels object + * @returns {undefined} + */ + + }, { + key: "removeLabel", + value: function removeLabel(id, label) { + this.tree.remove(label || this.allLabels[id]); + delete this.allLabels[id]; + } + + /** + * @name ingestLabel + * @memberof labelgun + * @method + * @param {object} boundingBox - The bounding box object with bottomLeft and topRight properties + * @param {string} id - The idea of the label + * @param {number} weight - The weight to compareLabels in the collision resolution + * @param {object} labelObject - The object representing the actual label object from your mapping library + * @param {string} labelName - A string depicting the name of the label + * @param {boolean} isDragged - A flag to say whether the lable is being dragged + * @summary Creates a label if it does not already exist, then adds it to the tree, and renders it based on whether it can be shown + * @returns {undefined} + * @public + */ + + }, { + key: "ingestLabel", + value: function ingestLabel(boundingBox, id, weight, labelObject, labelName, isDragged) { + + // Add the new label to the tree + if (weight === undefined || weight === null) { + weight = 0; + } + + if (!boundingBox || !boundingBox.bottomLeft || !boundingBox.topRight) { + throw Error("Bounding box must be defined with bottomLeft and topRight properties"); + } + + if (typeof id !== "string" && typeof id !== "number") { + throw Error("Label IDs must be a string or a number"); + } + + // If there is already a label in the tree, remove it + var oldLabel = this.allLabels[id]; + if (oldLabel) this.removeLabel(oldLabel.id, oldLabel); + + var label = { + minX: boundingBox.bottomLeft[0], + minY: boundingBox.bottomLeft[1], + maxX: boundingBox.topRight[0], + maxY: boundingBox.topRight[1], + state: "hide", + id: id, + weight: weight, + labelObject: labelObject, + name: labelName, + isDragged: isDragged + }; + + //We just store the label into the array. The tree is built when updated + this.allLabels[label.id] = label; + } + + /** + * @name labelHasChanged + * @memberof labelgun + * @param {string} id - The id of the label that has changed in some way + * @method + * @summary Let labelgun know the label has changed in some way (i.e. it's state for example, or that it is dragged) + * @returns {undefined} + */ + + }, { + key: "labelHasChanged", + value: function labelHasChanged(id) { + if (this.hasChanged.indexOf(id) === -1) { + this.hasChanged.push(id); + } + } + }]); + + return labelgun; +}(); + +exports.default = labelgun; + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_1__; + +/***/ }) +/******/ ]); +}); \ No newline at end of file diff --git a/inst/htmlwidgets/lfx-labelgun/labelgun.min.js b/inst/htmlwidgets/lfx-labelgun/labelgun.min.js new file mode 100644 index 00000000..1951da6f --- /dev/null +++ b/inst/htmlwidgets/lfx-labelgun/labelgun.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rbush")):"function"==typeof define&&define.amd?define(["rbush"],t):"object"==typeof exports?exports.labelgun=t(require("rbush")):e.labelgun=t(e.rbush)}(this,function(e){return function(e){function t(l){if(a[l])return a[l].exports;var i=a[l]={i:l,l:!1,exports:{}};return e[l].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var a={};return t.m=e,t.c=a,t.d=function(e,a,l){t.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:l})},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,a){"use strict";function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var a=0;at.weight||a.isDragged)return!1;return!0}},{key:"_compare",value:function(e,t){return t.weight-e.weight}},{key:"_setupLabels",value:function(){var e=this;if(this.allChanged){this.allChanged=!1,this.hasChanged=[],this.tree.clear();var t=[];for(var a in this.allLabels)this._handleLabelIngestion(a),t.push(this.allLabels[a]);this.tree.load(t)}else this.hasChanged.length>0&&(this.hasChanged.forEach(function(t){e._handleLabelIngestion(t),e.tree.insert(e.allLabels[t])}),this.hasChanged=[])}},{key:"_handleLabelIngestion",value:function(e){var t=this.allLabels[e];this.ingestLabel({bottomLeft:[t.minX,t.minY],topRight:[t.maxX,t.maxY]},t.id,t.weight,t.labelObject,t.name,t.isDragged)}},{key:"update",value:function(e){this.allChanged=!e,this._setupLabels(),this._compareLabels(),this._callLabelCallbacks()}},{key:"removeLabel",value:function(e,t){this.tree.remove(t||this.allLabels[e]),delete this.allLabels[e]}},{key:"ingestLabel",value:function(e,t,a,l,i,n){if(void 0!==a&&null!==a||(a=0),!e||!e.bottomLeft||!e.topRight)throw Error("Bounding box must be defined with bottomLeft and topRight properties");if("string"!=typeof t&&"number"!=typeof t)throw Error("Label IDs must be a string or a number");var s=this.allLabels[t];s&&this.removeLabel(s.id,s);var r={minX:e.bottomLeft[0],minY:e.bottomLeft[1],maxX:e.topRight[0],maxY:e.topRight[1],state:"hide",id:t,weight:a,labelObject:l,name:i,isDragged:n};this.allLabels[r.id]=r}},{key:"labelHasChanged",value:function(e){-1===this.hasChanged.indexOf(e)&&this.hasChanged.push(e)}}]),e}();t.default=r},function(t,a){t.exports=e}])}); \ No newline at end of file diff --git a/inst/htmlwidgets/lfx-labelgun/rbush.min.js b/inst/htmlwidgets/lfx-labelgun/rbush.min.js new file mode 100644 index 00000000..955b89ee --- /dev/null +++ b/inst/htmlwidgets/lfx-labelgun/rbush.min.js @@ -0,0 +1 @@ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i;i="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,i.rbush=t()}}(function(){return function t(i,n,e){function r(h,o){if(!n[h]){if(!i[h]){var s="function"==typeof require&&require;if(!o&&s)return s(h,!0);if(a)return a(h,!0);var l=new Error("Cannot find module '"+h+"'");throw l.code="MODULE_NOT_FOUND",l}var f=n[h]={exports:{}};i[h][0].call(f.exports,function(t){var n=i[h][1][t];return r(n?n:t)},f,f.exports,t,i,n,e)}return n[h].exports}for(var a="function"==typeof require&&require,h=0;h=t.minX&&i.maxY>=t.minY}function p(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-(1/0),maxY:-(1/0)}}function M(t,i,n,e,r){for(var a,h=[i,n];h.length;)n=h.pop(),i=h.pop(),n-i<=e||(a=i+Math.ceil((n-i)/e/2)*e,g(t,a,i,n,r),h.push(i,a,a,n))}i.exports=e;var g=t("quickselect");e.prototype={all:function(){return this._all(this.data,[])},search:function(t){var i=this.data,n=[],e=this.toBBox;if(!x(t,i))return n;for(var r,a,h,o,s=[];i;){for(r=0,a=i.children.length;r=0&&a[i].children.length>this._maxEntries;)this._split(a,i),i--;this._adjustParentBBoxes(r,a,i)},_split:function(t,i){var n=t[i],e=n.children.length,r=this._minEntries;this._chooseSplitAxis(n,r,e);var h=this._chooseSplitIndex(n,r,e),o=p(n.children.splice(h,n.children.length-h));o.height=n.height,o.leaf=n.leaf,a(n,this.toBBox),a(o,this.toBBox),i?t[i-1].children.push(o):this._splitRoot(n,o)},_splitRoot:function(t,i){this.data=p([t,i]),this.data.height=t.height+1,this.data.leaf=!1,a(this.data,this.toBBox)},_chooseSplitIndex:function(t,i,n){var e,r,a,o,s,l,u,c;for(l=u=1/0,e=i;e<=n-i;e++)r=h(t,0,e,this.toBBox),a=h(t,e,n,this.toBBox),o=m(r,a),s=f(r)+f(a),o=i;r--)a=t.children[r],o(f,t.leaf?s(a):a),c+=u(f);return c},_adjustParentBBoxes:function(t,i,n){for(var e=n;e>=0;e--)o(i[e],t)},_condense:function(t){for(var i,n=t.length-1;n>=0;n--)0===t[n].children.length?n>0?(i=t[n-1].children,i.splice(i.indexOf(t[n]),1)):this.clear():a(t[n],this.toBBox)},_initFormat:function(t){var i=["return a"," - b",";"];this.compareMinX=new Function("a","b",i.join(t[0])),this.compareMinY=new Function("a","b",i.join(t[1])),this.toBBox=new Function("a","return {minX: a"+t[0]+", minY: a"+t[1]+", maxX: a"+t[2]+", maxY: a"+t[3]+"};")}}},{quickselect:2}],2:[function(t,i,n){"use strict";function e(t,i,n,a,h){for(;a>n;){if(a-n>600){var o=a-n+1,s=i-n+1,l=Math.log(o),f=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*f*(o-f)/o)*(s-o/2<0?-1:1),c=Math.max(n,Math.floor(i-s*f/o+u)),m=Math.min(a,Math.floor(i+(o-s)*f/o+u));e(t,i,c,m,h)}var d=t[i],x=n,p=a;for(r(t,n,i),h(t[a],d)>0&&r(t,n,a);x0;)p--}0===h(t[n],d)?r(t,n,p):(p++,r(t,p,a)),p<=i&&(n=p+1),i<=p&&(a=p-1)}}function r(t,i,n){var e=t[i];t[i]=t[n],t[n]=e}i.exports=e},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/inst/htmlwidgets/lfx-leafletsync/L.Map.Sync.js b/inst/htmlwidgets/lfx-leafletsync/L.Map.Sync.js new file mode 100644 index 00000000..a4795da8 --- /dev/null +++ b/inst/htmlwidgets/lfx-leafletsync/L.Map.Sync.js @@ -0,0 +1,269 @@ +/* + * Extends L.Map to synchronize the interaction on one map to one or more other maps. + */ + +(function () { + var NO_ANIMATION = { + animate: false, + reset: true, + disableViewprereset: true + }; + + L.Sync = function () {}; + /* + * Helper function to compute the offset easily. + * + * The arguments are relative positions with respect to reference and target maps of + * the point to sync. If you provide ratioRef=[0, 1], ratioTarget=[1, 0] will sync the + * bottom left corner of the reference map with the top right corner of the target map. + * The values can be less than 0 or greater than 1. It will sync points out of the map. + */ + L.Sync.offsetHelper = function (ratioRef, ratioTarget) { + var or = L.Util.isArray(ratioRef) ? ratioRef : [0.5, 0.5]; + var ot = L.Util.isArray(ratioTarget) ? ratioTarget : [0.5, 0.5]; + return function (center, zoom, refMap, targetMap) { + var rs = refMap.getSize(); + var ts = targetMap.getSize(); + var pt = refMap.project(center, zoom) + .subtract([(0.5 - or[0]) * rs.x, (0.5 - or[1]) * rs.y]) + .add([(0.5 - ot[0]) * ts.x, (0.5 - ot[1]) * ts.y]); + return refMap.unproject(pt, zoom); + }; + }; + + + L.Map.include({ + sync: function (map, options) { + this._initSync(); + options = L.extend({ + noInitialSync: false, + syncCursor: false, + syncCursorMarkerOptions: { + radius: 10, + fillOpacity: 0.3, + color: '#da291c', + fillColor: '#fff' + }, + offsetFn: function (center, zoom, refMap, targetMap) { + // no transformation at all + return center; + } + }, options); + + // prevent double-syncing the map: + if (this._syncMaps.indexOf(map) === -1) { + this._syncMaps.push(map); + this._syncOffsetFns[L.Util.stamp(map)] = options.offsetFn; + } + + if (!options.noInitialSync) { + map.setView( + options.offsetFn(this.getCenter(), this.getZoom(), this, map), + this.getZoom(), NO_ANIMATION); + } + if (options.syncCursor) { + if (typeof map.cursor === 'undefined') { + map.cursor = L.circleMarker([0, 0], options.syncCursorMarkerOptions).addTo(map); + } + + this._cursors.push(map.cursor); + + this.on('mousemove', this._cursorSyncMove, this); + this.on('mouseout', this._cursorSyncOut, this); + } + + // on these events, we should reset the view on every synced map + // dragstart is due to inertia + this.on('resize zoomend', this._selfSetView); + this.on('moveend', this._syncOnMoveend); + this.on('dragend', this._syncOnDragend); + return this; + }, + + + // unsync maps from each other + unsync: function (map) { + var self = this; + + if (this._cursors) { + this._cursors.forEach(function (cursor, indx, _cursors) { + if (cursor === map.cursor) { + _cursors.splice(indx, 1); + } + }); + } + + // TODO: hide cursor in stead of moving to 0, 0 + if (map.cursor) { + map.cursor.setLatLng([0, 0]); + } + + if (this._syncMaps) { + this._syncMaps.forEach(function (synced, id) { + if (map === synced) { + delete self._syncOffsetFns[L.Util.stamp(map)]; + self._syncMaps.splice(id, 1); + } + }); + } + + if (!this._syncMaps || this._syncMaps.length == 0) { + // no more synced maps, so these events are not needed. + this.off('resize zoomend', this._selfSetView); + this.off('moveend', this._syncOnMoveend); + this.off('dragend', this._syncOnDragend); + } + + return this; + }, + + // Checks if the map is synced with anything or a specifyc map + isSynced: function (otherMap) { + var has = (this.hasOwnProperty('_syncMaps') && Object.keys(this._syncMaps).length > 0); + if (has && otherMap) { + // Look for this specific map + has = false; + this._syncMaps.forEach(function (synced) { + if (otherMap == synced) { has = true; } + }); + } + return has; + }, + + + // Callbacks for events... + _cursorSyncMove: function (e) { + this._cursors.forEach(function (cursor) { + cursor.setLatLng(e.latlng); + }); + }, + + _cursorSyncOut: function (e) { + this._cursors.forEach(function (cursor) { + // TODO: hide cursor in stead of moving to 0, 0 + cursor.setLatLng([0, 0]); + }); + }, + + _selfSetView: function (e) { + // reset the map, and let setView synchronize the others. + this.setView(this.getCenter(), this.getZoom(), NO_ANIMATION); + }, + + _syncOnMoveend: function (e) { + if (this._syncDragend) { + // This is 'the moveend' after the dragend. + // Without inertia, it will be right after, + // but when inertia is on, we need this to detect that. + this._syncDragend = false; // before calling setView! + this._selfSetView(e); + this._syncMaps.forEach(function (toSync) { + toSync.fire('moveend'); + }); + } + }, + + _syncOnDragend: function (e) { + // It is ugly to have state, but we need it in case of inertia. + this._syncDragend = true; + }, + + + // overload methods on originalMap to replay interactions on _syncMaps; + _initSync: function () { + if (this._syncMaps) { + return; + } + var originalMap = this; + + this._syncMaps = []; + this._cursors = []; + this._syncOffsetFns = {}; + + L.extend(originalMap, { + setView: function (center, zoom, options, sync) { + // Use this sandwich to disable and enable viewprereset + // around setView call + function sandwich (obj, fn) { + var viewpreresets = []; + var doit = options && options.disableViewprereset && obj && obj._events; + if (doit) { + // The event viewpreresets does an invalidateAll, + // that reloads all the tiles. + // That causes an annoying flicker. + viewpreresets = obj._events.viewprereset; + obj._events.viewprereset = []; + } + var ret = fn(obj); + if (doit) { + // restore viewpreresets event to its previous values + obj._events.viewprereset = viewpreresets; + } + return ret; + } + + // Looks better if the other maps 'follow' the active one, + // so call this before _syncMaps + var ret = sandwich(this, function (obj) { + return L.Map.prototype.setView.call(obj, center, zoom, options); + }); + + if (!sync) { + originalMap._syncMaps.forEach(function (toSync) { + sandwich(toSync, function (obj) { + return toSync.setView( + originalMap._syncOffsetFns[L.Util.stamp(toSync)](center, zoom, originalMap, toSync), + zoom, options, true); + }); + }); + } + + return ret; + }, + + panBy: function (offset, options, sync) { + if (!sync) { + originalMap._syncMaps.forEach(function (toSync) { + toSync.panBy(offset, options, true); + }); + } + return L.Map.prototype.panBy.call(this, offset, options); + }, + + _onResize: function (event, sync) { + if (!sync) { + originalMap._syncMaps.forEach(function (toSync) { + toSync._onResize(event, true); + }); + } + return L.Map.prototype._onResize.call(this, event); + }, + + _stop: function (sync) { + L.Map.prototype._stop.call(this); + if (!sync) { + originalMap._syncMaps.forEach(function (toSync) { + toSync._stop(true); + }); + } + } + }); + + originalMap.dragging._draggable._updatePosition = function () { + L.Draggable.prototype._updatePosition.call(this); + var self = this; + originalMap._syncMaps.forEach(function (toSync) { + L.DomUtil.setPosition(toSync.dragging._draggable._element, self._newPos); + toSync.eachLayer(function (layer) { + if (layer._google !== undefined) { + var offsetFn = originalMap._syncOffsetFns[L.Util.stamp(toSync)]; + var center = offsetFn(originalMap.getCenter(), originalMap.getZoom(), originalMap, toSync); + layer._google.setCenter(center); + } + }); + toSync.fire('move'); + }); + }; + } + }); +})(); diff --git a/inst/htmlwidgets/lfx-leafletsync/leafletsync-bindings.js b/inst/htmlwidgets/lfx-leafletsync/leafletsync-bindings.js new file mode 100644 index 00000000..019a3af2 --- /dev/null +++ b/inst/htmlwidgets/lfx-leafletsync/leafletsync-bindings.js @@ -0,0 +1,61 @@ +LeafletWidget.methods.addLeafletsync = function(ids, synclist, options) { + for (let map in synclist) { + let m = HTMLWidgets.find("#"+map); + if (m && m.getMap()) { + let m2sync = synclist[map] + m2sync = Array.isArray(m2sync) ? m2sync : [m2sync] + for (let i = 0; i < m2sync.length; i++) { + let ms = HTMLWidgets.find("#"+m2sync[i]); + if (ms && ms.getMap()) { + if (!m.getMap().isSynced(ms.getMap())) { + //console.log("Sync the map " + m2sync[i] + " to " + map) + var opts = options[m2sync[i]]; + m.getMap().sync(ms.getMap(), opts) + } else { + //console.log("Maps are already synced. " + m2sync[i] + " to " + map) + } + } + } + } else { + console.log("No map with id '" + map + "' found.") + } + } +}; + +LeafletWidget.methods.unsyncLeaflet = function(id, unsync) { + unsync = Array.isArray(unsync) ? unsync : [unsync] + let m = HTMLWidgets.find("#"+id); + if (m && m.getMap()) { + for (let i = 0; i < unsync.length; i++) { + let ms = HTMLWidgets.find("#"+unsync[i]); + if (ms && ms.getMap()) { + if (m.getMap().isSynced(ms.getMap())) { + //console.log("Unsync " + unsync[i] + " from " + id) + m.getMap().unsync(ms.getMap()) + } + } + } + } else { + console.log("No map with id '" + id + "' found.") + } +}; + +LeafletWidget.methods.isSyncedLeaflet = function(id, syncwith) { + let m = HTMLWidgets.find("#"+id); + if (m && m.getMap()) { + var bool; + if (syncwith !== null && syncwith !== undefined) { + let m1 = HTMLWidgets.find("#"+syncwith); + if (m1 && m1.getMap()) { + bool = m.getMap().isSynced(m1.getMap()); + } else { + bool = false; + } + } else { + bool = m.getMap().isSynced(); + } + Shiny.setInputValue(id + "_synced", bool, {priority: "event"}) + } else { + console.log("No map with id '" + id + "' found.") + } +}; diff --git a/inst/htmlwidgets/lfx-movingmarker/MovingMarker.js b/inst/htmlwidgets/lfx-movingmarker/MovingMarker.js new file mode 100644 index 00000000..b1c3b641 --- /dev/null +++ b/inst/htmlwidgets/lfx-movingmarker/MovingMarker.js @@ -0,0 +1,304 @@ +L.interpolatePosition = function(p1, p2, duration, t) { + var k = t/duration; + k = (k > 0) ? k : 0; + k = (k > 1) ? 1 : k; + return L.latLng(p1.lat + k * (p2.lat - p1.lat), + p1.lng + k * (p2.lng - p1.lng)); +}; + +L.Marker.MovingMarker = L.Marker.extend({ + + //state constants + statics: { + notStartedState: 0, + endedState: 1, + pausedState: 2, + runState: 3 + }, + + options: { + autostart: false, + loop: false, + }, + + initialize: function (latlngs, durations, options) { + L.Marker.prototype.initialize.call(this, latlngs[0], options); + + this._latlngs = latlngs.map(function(e, index) { + return L.latLng(e); + }); + + if (durations instanceof Array) { + this._durations = durations; + } else { + this._durations = this._createDurations(this._latlngs, durations); + } + + this._currentDuration = 0; + this._currentIndex = 0; + + this._state = L.Marker.MovingMarker.notStartedState; + this._startTime = 0; + this._startTimeStamp = 0; // timestamp given by requestAnimFrame + this._pauseStartTime = 0; + this._animId = 0; + this._animRequested = false; + this._currentLine = []; + this._stations = {}; + }, + + isRunning: function() { + return this._state === L.Marker.MovingMarker.runState; + }, + + isEnded: function() { + return this._state === L.Marker.MovingMarker.endedState; + }, + + isStarted: function() { + return this._state !== L.Marker.MovingMarker.notStartedState; + }, + + isPaused: function() { + return this._state === L.Marker.MovingMarker.pausedState; + }, + + start: function() { + if (this.isRunning()) { + return; + } + + if (this.isPaused()) { + this.resume(); + } else { + this._loadLine(0); + this._startAnimation(); + this.fire('start'); + } + }, + + resume: function() { + if (! this.isPaused()) { + return; + } + // update the current line + this._currentLine[0] = this.getLatLng(); + this._currentDuration -= (this._pauseStartTime - this._startTime); + this._startAnimation(); + }, + + pause: function() { + if (! this.isRunning()) { + return; + } + + this._pauseStartTime = Date.now(); + this._state = L.Marker.MovingMarker.pausedState; + this._stopAnimation(); + this._updatePosition(); + }, + + stop: function(elapsedTime) { + if (this.isEnded()) { + return; + } + + this._stopAnimation(); + + if (typeof(elapsedTime) === 'undefined') { + // user call + elapsedTime = 0; + this._updatePosition(); + } + + this._state = L.Marker.MovingMarker.endedState; + this.fire('end', {elapsedTime: elapsedTime}); + }, + + addLatLng: function(latlng, duration) { + this._latlngs.push(L.latLng(latlng)); + this._durations.push(duration); + }, + + moveTo: function(latlng, duration) { + this._stopAnimation(); + this._latlngs = [this.getLatLng(), L.latLng(latlng)]; + this._durations = [duration]; + this._state = L.Marker.MovingMarker.notStartedState; + this.start(); + this.options.loop = false; + }, + + addStation: function(pointIndex, duration) { + if (pointIndex > this._latlngs.length - 2 || pointIndex < 1) { + return; + } + this._stations[pointIndex] = duration; + }, + + onAdd: function (map) { + L.Marker.prototype.onAdd.call(this, map); + + if (this.options.autostart && (! this.isStarted())) { + this.start(); + return; + } + + if (this.isRunning()) { + this._resumeAnimation(); + } + }, + + onRemove: function(map) { + L.Marker.prototype.onRemove.call(this, map); + this._stopAnimation(); + }, + + _createDurations: function (latlngs, duration) { + var lastIndex = latlngs.length - 1; + var distances = []; + var totalDistance = 0; + var distance = 0; + + // compute array of distances between points + for (var i = 0; i < lastIndex; i++) { + distance = latlngs[i + 1].distanceTo(latlngs[i]); + distances.push(distance); + totalDistance += distance; + } + + var ratioDuration = duration / totalDistance; + + var durations = []; + for (i = 0; i < distances.length; i++) { + durations.push(distances[i] * ratioDuration); + } + + return durations; + }, + + _startAnimation: function() { + this._state = L.Marker.MovingMarker.runState; + this._animId = L.Util.requestAnimFrame(function(timestamp) { + this._startTime = Date.now(); + this._startTimeStamp = timestamp; + this._animate(timestamp); + }, this, true); + this._animRequested = true; + }, + + _resumeAnimation: function() { + if (! this._animRequested) { + this._animRequested = true; + this._animId = L.Util.requestAnimFrame(function(timestamp) { + this._animate(timestamp); + }, this, true); + } + }, + + _stopAnimation: function() { + if (this._animRequested) { + L.Util.cancelAnimFrame(this._animId); + this._animRequested = false; + } + }, + + _updatePosition: function() { + var elapsedTime = Date.now() - this._startTime; + this._animate(this._startTimeStamp + elapsedTime, true); + }, + + _loadLine: function(index) { + this._currentIndex = index; + this._currentDuration = this._durations[index]; + this._currentLine = this._latlngs.slice(index, index + 2); + }, + + /** + * Load the line where the marker is + * @param {Number} timestamp + * @return {Number} elapsed time on the current line or null if + * we reached the end or marker is at a station + */ + _updateLine: function(timestamp) { + // time elapsed since the last latlng + var elapsedTime = timestamp - this._startTimeStamp; + + // not enough time to update the line + if (elapsedTime <= this._currentDuration) { + return elapsedTime; + } + + var lineIndex = this._currentIndex; + var lineDuration = this._currentDuration; + var stationDuration; + + while (elapsedTime > lineDuration) { + // substract time of the current line + elapsedTime -= lineDuration; + stationDuration = this._stations[lineIndex + 1]; + + // test if there is a station at the end of the line + if (stationDuration !== undefined) { + if (elapsedTime < stationDuration) { + this.setLatLng(this._latlngs[lineIndex + 1]); + return null; + } + elapsedTime -= stationDuration; + } + + lineIndex++; + + // test if we have reached the end of the polyline + if (lineIndex >= this._latlngs.length - 1) { + + if (this.options.loop) { + lineIndex = 0; + this.fire('loop', {elapsedTime: elapsedTime}); + } else { + // place the marker at the end, else it would be at + // the last position + this.setLatLng(this._latlngs[this._latlngs.length - 1]); + this.stop(elapsedTime); + return null; + } + } + lineDuration = this._durations[lineIndex]; + } + + this._loadLine(lineIndex); + this._startTimeStamp = timestamp - elapsedTime; + this._startTime = Date.now() - elapsedTime; + return elapsedTime; + }, + + _animate: function(timestamp, noRequestAnim) { + this._animRequested = false; + + // find the next line and compute the new elapsedTime + var elapsedTime = this._updateLine(timestamp); + + if (this.isEnded()) { + // no need to animate + return; + } + + if (elapsedTime != null) { + // compute the position + var p = L.interpolatePosition(this._currentLine[0], + this._currentLine[1], + this._currentDuration, + elapsedTime); + this.setLatLng(p); + } + + if (! noRequestAnim) { + this._animId = L.Util.requestAnimFrame(this._animate, this, false); + this._animRequested = true; + } + } +}); + +L.Marker.movingMarker = function (latlngs, duration, options) { + return new L.Marker.MovingMarker(latlngs, duration, options); +}; diff --git a/inst/htmlwidgets/lfx-movingmarker/lfx-movingmarker-bindings.js b/inst/htmlwidgets/lfx-movingmarker/lfx-movingmarker-bindings.js new file mode 100644 index 00000000..daa7e934 --- /dev/null +++ b/inst/htmlwidgets/lfx-movingmarker/lfx-movingmarker-bindings.js @@ -0,0 +1,155 @@ +/* global LeafletWidget, $, L */ +LeafletWidget.methods.addMovingMarker = function( + data, duration, icon, layerId, group, options, + popup, popupOptions, label, labelOptions) { + + var map = this; + if (map.movingmarker === undefined) { + map.movingmarker = {}; + } + if (map.movingmarker[layerId]) { + delete map.movingmarker[layerId]; + } + + if (icon) { + if (icon.class == "awesome" && L.AwesomeMarkers) { + if (icon.squareMarker) { + icon.className = "awesome-marker awesome-marker-square"; + } + options.icon = new L.AwesomeMarkers.icon(icon); + } else { + if (!icon.iconUrl) { + options.icon = L.Icon.Default(); + } + if (icon.iconWidth) { + icon.iconSize = [icon.iconWidth, icon.iconHeight]; + } + if (icon.shadowWidth) { + icon.shadowSize = [icon.shadowWidth, icon.shadowHeight]; + } + if (icon.iconAnchorX) { + icon.iconAnchor = [icon.iconAnchorX, icon.iconAnchorY]; + } + if (icon.shadowAnchorX) { + icon.shadowAnchor = [icon.shadowAnchorX, icon.shadowAnchorY]; + } + if (icon.popupAnchorX) { + icon.popupAnchor = [icon.popupAnchorX, icon.popupAnchorY]; + } + options.icon = new L.Icon(icon); + } + } + + map.movingmarker[layerId] = L.Marker.movingMarker(data, duration, options).addTo(this); + + if (options.pauseOnZoom && options.pauseOnZoom === true) { + map.on('zoomstart', function() { + map.movingmarker[layerId].pause(); + }); + map.on('zoomend', function() { + map.movingmarker[layerId].resume(); + }); + } + + if (popup !== null) { + map.movingmarker[layerId].bindPopup(popup, popupOptions); + } + if (label !== null) { + if (labelOptions !== null) { + if(labelOptions.permanent) { + map.movingmarker[layerId].bindTooltip(label, labelOptions).openTooltip(); + } else { + map.movingmarker[layerId].bindTooltip(label, labelOptions); + } + } else { + map.movingmarker[layerId].bindTooltip(label); + } + } + + if (HTMLWidgets.shinyMode) { + map.movingmarker[layerId].on("click", LeafletWidget.methods.mouseHandler(map.id, layerId, group, "movingmarker_click", null), map); + map.movingmarker[layerId].on("mouseover", LeafletWidget.methods.mouseHandler(map.id, layerId, group, "movingmarker_mouseover", null), map); + } + + map.layerManager.addLayer(map.movingmarker[layerId], "marker", layerId, group); +}; + + +LeafletWidget.methods.startMoving = function(layerId) { + var map = this; + layerId = getids(map, layerId); + layerId.forEach(function(id) { + if (map.movingmarker && map.movingmarker[id]) { + map.movingmarker[id].start(); + } + }) +}; + +LeafletWidget.methods.stopMoving = function(layerId) { + var map = this; + layerId = getids(map, layerId); + layerId.forEach(function(id) { + if (map.movingmarker && map.movingmarker[id]) { + map.movingmarker[id].stop(); + } + }) +}; + +LeafletWidget.methods.pauseMoving = function(layerId) { + var map = this; + layerId = getids(map, layerId); + layerId.forEach(function(id) { + if (map.movingmarker && map.movingmarker[id]) { + map.movingmarker[id].pause(); + } + }) +}; + +LeafletWidget.methods.resumeMoving = function(layerId) { + var map = this; + layerId = getids(map, layerId); + layerId.forEach(function(id) { + if (map.movingmarker && map.movingmarker[id]) { + map.movingmarker[id].resume(); + } + }) +}; + +LeafletWidget.methods.addLatLngMoving = function(layerId, latlng, duration) { + var map = this; + layerId = getids(map, layerId); + layerId.forEach(function(id) { + if (map.movingmarker && map.movingmarker[id]) { + map.movingmarker[id].addLatLng(latlng, duration); + } + }) +}; + +LeafletWidget.methods.moveToMoving = function(layerId, latlng, duration) { + var map = this; + layerId = getids(map, layerId); + layerId.forEach(function(id) { + if (map.movingmarker && map.movingmarker[id]) { + map.movingmarker[id].moveTo(latlng, duration); + } + }) +}; + +LeafletWidget.methods.addStationMoving = function(layerId, pointIndex, duration) { + var map = this; + layerId = getids(map, layerId); + layerId.forEach(function(id) { + if (map.movingmarker && map.movingmarker[id]) { + map.movingmarker[id].addStation(pointIndex, duration); + } + }) +}; + + +getids = function(map, layerId) { + if (layerId === null || layerId === undefined) { + return Object.keys(map.movingmarker) + } else { + return [].concat(layerId); + } +} diff --git a/inst/htmlwidgets/lfx-openweather/leaflet-openweather-bindings.js b/inst/htmlwidgets/lfx-openweather/leaflet-openweather-bindings.js deleted file mode 100644 index 5f37a570..00000000 --- a/inst/htmlwidgets/lfx-openweather/leaflet-openweather-bindings.js +++ /dev/null @@ -1,26 +0,0 @@ -LeafletWidget.methods.addOpenweather = function(apikey, layers, addControl, group, opacity) { - - var map = this; - var addCurrent = true; - - debugger; - var overlayMaps = {}; - for (var i = 0; i < layers.length; i++) { - var name = layers[i]; - overlayMaps[name] = L.OWM[name]({opacity: opacity[i], appId: apikey}); - } - - if (addCurrent) { - overlayMaps.Cities = L.OWM.current({intervall: 15, lang: 'de', appId: apikey, type: "city" }); - } - - var layerControl = L.control.layers(undefined, overlayMaps, {collapsed: false}).addTo(map); -}; - -/* -LeafletWidget.methods.removeVelocity = function(layerId) { - this.layerManager.removeLayer("velocity", layerId); -}; -*/ - - diff --git a/inst/htmlwidgets/lfx-openweather/leaflet-openweathermap-bindings.js b/inst/htmlwidgets/lfx-openweather/leaflet-openweathermap-bindings.js new file mode 100644 index 00000000..7145890a --- /dev/null +++ b/inst/htmlwidgets/lfx-openweather/leaflet-openweathermap-bindings.js @@ -0,0 +1,45 @@ +LeafletWidget.methods.addOpenweather = function(layers, group, layerId, options) { + var map = this; + var owm; + // If 1 layer only, convert to Array + if (typeof layers == "string") { + layers = [layers]; + } + for (var i = 0; i < layers.length; i++) { + var name = layers[i]; + owm = L.OWM[name](options); + map.layerManager.addLayer(owm, "tile", layerId[i], group[i]); + } +}; + + +LeafletWidget.methods.addOpenweatherCurrent = function(group, layerId, options) { + var map = this; + + L.OWM.Current = L.OWM.Current.extend({ + _createMarker: function(station) { + var imageData = this._getImageData(station); + var icon = L.divIcon({ + className: '' + , iconAnchor: new L.Point(25, imageData.height/2) + , popupAnchor: new L.Point(0, -10) + , html: this._icondivtext(station, imageData.url, imageData.width, imageData.height) + }); + var marker = L.marker([station.coord.Lat, station.coord.Lon], {icon: icon}) + .on("click", function(x) { + if (HTMLWidgets.shinyMode) { + var obj = { + lat: x.latlng.lat, + lng: x.latlng.lng, + content: x.target._popup._content + }; + Shiny.setInputValue(this._map.id + "_owm_click", obj, {priority: "event"}); + } + }); + return marker; + } + }); + + var curr = L.OWM.current(options); + map.layerManager.addLayer(curr, "marker", layerId, group); +}; diff --git a/inst/htmlwidgets/lfx-openweather/leaflet-openweathermap.js b/inst/htmlwidgets/lfx-openweather/leaflet-openweathermap.js index cf003ac8..b2a2270a 100644 --- a/inst/htmlwidgets/lfx-openweather/leaflet-openweathermap.js +++ b/inst/htmlwidgets/lfx-openweather/leaflet-openweathermap.js @@ -915,7 +915,7 @@ L.OWM.Utils = { , id905: 'Windy' , id906: 'Hail' }, - + it: { owmlinktitle: 'Dettagli su OpenWeatherMap' , temperature: 'Temperatura' @@ -927,7 +927,7 @@ L.OWM.Utils = { , rain_1h: 'Pioggia' , humidity: 'Umiditร ' , pressure: 'Pressione' - + // condizioni meteorologiche, consultare https://openweathermap.org/weather-conditions // Temporale , id200: 'Tempesta con pioggia debole' @@ -949,7 +949,7 @@ L.OWM.Utils = { , id311: 'Pioggia / pioviggine' , id312: 'Pioggia / pioviggine forte' , id321: 'Pioviggine intensa' - + // Pioggia , id500: 'Debole pioggia' , id501: 'Pioggia moderata' @@ -961,7 +961,7 @@ L.OWM.Utils = { , id521: 'Pioggia' , id522: 'Pioggia forte' , id531: 'pioggia irregolare' - + // neve , id600: 'Neve Debole' , id601: 'Neve' @@ -1016,7 +1016,7 @@ L.OWM.Utils = { , id961: 'Tempesta violenta' , id962: 'Uragano' }, - + de: { owmlinktitle: 'Details bei OpenWeatherMap' , temperature: 'Temperatur' diff --git a/inst/htmlwidgets/lfx-playback/leaflet.playback-bindings.js b/inst/htmlwidgets/lfx-playback/leaflet.playback-bindings.js new file mode 100644 index 00000000..317a5310 --- /dev/null +++ b/inst/htmlwidgets/lfx-playback/leaflet.playback-bindings.js @@ -0,0 +1,113 @@ +/* global LeafletWidget, $, L, toGeoJSON */ +LeafletWidget.methods.addPlayback= function(data, options) { + var map = this; + if (map.playback) { + map.playback.destroy(); + delete map.playback; + } + + // If mutliple Features, transform the Object to an Array and add path_options+radius + if (data.type !== "Feature" && Object.keys(data).length > 1) { + data = Object.values(data); + for (var i = 0; i < data.length; i++) { + data[i].properties.path_options = Object.assign({}, options.pathOptions); + data[i].properties.radius = options.radius ? options.radius: 5; + } + } else { + // Add path_options+radius to single Feature + data.properties.path_options = options.pathOptions; + data.properties.radius = options.radius ? options.radius: 5; + } + + // Add Color to path_options + if (options.color) { + if (Array.isArray(options.color) && options.color.length > 1) { + for (var j = 0; j < options.color.length; j++) { + if (data[j]) { + data[j].properties.path_options.color = options.color[j]; + } + } + } + } + + // Add Mouse Events (Mouseover + Click) + if (HTMLWidgets.shinyMode === true) { + options.mouseOverCallback = function(el) { + var ind = el.target.index + var obj = { + lat: el.latlng.lat, + lng: el.latlng.lng, + index: ind, + timestamp: new Date(el.target.feature.properties.time[ind]), + content: el.target.tooltipContent + }; + Shiny.onInputChange(map.id+"_pb_mouseover", obj); + }; + } + options.clickCallback = function(el) { + // Workaround since bindPopup doesnt show popups at the correct location + if (el.target._popup) { + el.target._popup.setLatLng(el.latlng).openOn(map); + } + if (HTMLWidgets.shinyMode === true) { + var ind = el.target.index + var obj = { + lat: el.latlng.lat, + lng: el.latlng.lng, + index: el.target.index, + timestamp: new Date(el.target.feature.properties.time[ind]), + content: el.target.popupContent + }; + Shiny.onInputChange(map.id+"_pb_click", obj); + } + }; + + // Add playbackoptions and Icon + options.layer = { + pointToLayer : function(featureData, latlng, options) { + var result = {}; + if (featureData && featureData.properties && featureData.properties.path_options) { + result = featureData.properties.path_options; + } + result.radius = featureData.properties.radius; + return new L.CircleMarker(latlng, result); + } + }; + + if (options && options.marker && options.icon == undefined) { + options.marker = options.marker; + } else if (options && options.icon) { + var icoli = options.icon; + var madeIcon = L.icon({ + iconUrl: icoli.iconUrl, + iconSize: [icoli.iconWidth, icoli.iconHeight], + shadowSize: [icoli.shadowWidth, icoli.shadowHeight], + iconAnchor: [icoli.iconAnchorX, icoli.iconAnchorY], + shadowAnchor: [icoli.shadowAnchorX, icoli.shadowAnchorY], + popupAnchor: [icoli.popupAnchorX, icoli.popupAnchorY] + }); + options.marker = function(featureData) { + return { + icon: madeIcon + /* + getPopup: function (feature) { + debugger; + return this.feature.popupContent[this.index] + } + */ + }; + }; + } + + map.playback = L.playback(map, data, null, options); +}; + + +LeafletWidget.methods.removePlayback= function() { + var map = this; + if (map.playback) { + map.playback.destroy(); + delete map.playback; + } +}; + diff --git a/inst/htmlwidgets/lfx-playback/leaflet.playback.bindings.js b/inst/htmlwidgets/lfx-playback/leaflet.playback.bindings.js deleted file mode 100644 index c55951bb..00000000 --- a/inst/htmlwidgets/lfx-playback/leaflet.playback.bindings.js +++ /dev/null @@ -1,97 +0,0 @@ -/* global LeafletWidget, $, L, topojson, csv2geojson, toGeoJSON */ -LeafletWidget.methods.addPlayback= function(data, options) { - var map = this; - - // If data is a string, parse it first - if (typeof(data) === "string") { - data = JSON.parse(data); - } - // If JSON has wrong format, try to fix it (part1) - if (data.features !== undefined && data.features.length) { - // TODO - change that part here - console.log("change this part. When am i coming here???"); - var data1 = L.Playback.Util.ParseGPX(); - data1.geometry = data.features[0].geometry; - data1.properties.time = data.features[0].properties.time; - data1.properties.speed = data.features[0].properties.speed; - data1.properties.altitude = data.features[0].properties.altitude; - data = data1; - } - // If JSON has wrong format, try to fix it (part2) - if (data.type === undefined) { - data = { - type: "Feature", - geometry: { - type: "MultiPoint", - coordinates: data.geometry ? data.geometry : data.coordinates - }, - properties: { - time: data.time, - speed: data.speed, - altitude: data.altitude - } - }; - } - - // Add Mouse Events (Mouseover + Click) - options.mouseOverCallback = function(el) { - var obj = { - lat: el.latlng.lat, - lng: el.latlng.lng, - popup: el.popupContent - }; - Shiny.onInputChange(map.id+"_pb_mouseover", obj); - }; - options.clickCallback = function(el) { - var obj = { - lat: el.latlng.lat, - lng: el.latlng.lng, - popup: el.popupContent - }; - Shiny.onInputChange(map.id+"_pb_click", obj); - }; - - // Add an icon if given - if (options && options.icon) { - var icoli = options.icon; - var madeIcon = L.icon({ - iconUrl: icoli.iconUrl, - iconSize: [icoli.iconWidth, icoli.iconHeight], - shadowSize: [icoli.shadowWidth, icoli.shadowHeight], - iconAnchor: [icoli.iconAnchorX, icoli.iconAnchorY], - shadowAnchor: [icoli.shadowAnchorX, icoli.shadowAnchorY], - popupAnchor: [icoli.popupAnchorX, icoli.popupAnchorY] - }); - options.marker = function(featureData) { - return { - icon: madeIcon - /*,getPopup: function (feature) { - return feature.properties.title; - }*/ - }; - }; - } - - // Customize the CircleMarker layer with pathOptions - data.properties.path_options = options.pathOptions; - data.properties.radius = options.radius ? options.radius: 5; - options.layer = { - pointToLayer : function(featureData, latlng, options) { - var result = {}; - if (featureData && featureData.properties && featureData.properties.path_options) { - result = featureData.properties.path_options; - } - result.radius = featureData.properties.radius; - return new L.CircleMarker(latlng, result); - } - }; - - //console.log("options"); console.log(options); - var playback = new L.Playback(map, data, null, options); -}; - - -LeafletWidget.methods.removePlayback= function() { - this.controls.clear(); -}; - diff --git a/inst/htmlwidgets/lfx-playback/leaflet.playback.js b/inst/htmlwidgets/lfx-playback/leaflet.playback.js index 1d6b9ae3..b3cf770e 100644 --- a/inst/htmlwidgets/lfx-playback/leaflet.playback.js +++ b/inst/htmlwidgets/lfx-playback/leaflet.playback.js @@ -20,29 +20,12 @@ L.Playback = L.Playback || {}; L.Playback.Util = L.Class.extend({ statics: { - - DateStr: function(time) { - return new Date(time).toDateString(); + DateStr: function(time, locale) { + return new Date(time).toLocaleDateString(locale.locale, locale.options); }, - - TimeStr: function(time) { - var d = new Date(time); - var h = d.getHours(); - var m = d.getMinutes(); - var s = d.getSeconds(); - var tms = time / 1000; - var dec = (tms - Math.floor(tms)).toFixed(2).slice(1); - var mer = 'AM'; - if (h > 11) { - h %= 12; - mer = 'PM'; - } - if (h === 0) h = 12; - if (m < 10) m = '0' + m; - if (s < 10) s = '0' + s; - return h + ':' + m + ':' + s + dec + ' ' + mer; + TimeStr: function(time, locale) { + return new Date(time).toLocaleTimeString(locale.locale, locale.options); }, - ParseGPX: function(gpx) { var geojson = { type: 'Feature', @@ -59,7 +42,7 @@ L.Playback.Util = L.Class.extend({ }; var xml = $.parseXML(gpx); var pts = $(xml).find('trkpt'); - for (var i=0, len=pts.length; i' + this.popupContent + '
'; - } - - return ''; + if (this.feature.popupContent && this.feature.popupContent[this.index] !== '') { + this.popupContent = this.feature.popupContent[this.index] + return this.popupContent + ''; + } }, - - move: function (latLng, transitionTime) { + getTooltipContent: function() { + if (this.feature.tooltipContent && this.feature.tooltipContent[this.index] !== '') { + this.tooltipContent = this.feature.tooltipContent[this.index] + return this.tooltipContent + ''; + } + }, + move: function(latLng, transitionTime, index) { + if (index > -1) this.index = index; // Only if CSS3 transitions are supported if (L.DomUtil.TRANSITION) { - if (this._icon) { - this._icon.style[L.DomUtil.TRANSITION] = 'all ' + transitionTime + 'ms linear'; - if (this._popup && this._popup._wrapper) - this._popup._wrapper.style[L.DomUtil.TRANSITION] = 'all ' + transitionTime + 'ms linear'; + if (this._icon) { + this._icon.style[L.DomUtil.TRANSITION] = 'all ' + transitionTime + 'ms linear'; + } + if (this._shadow) { + this._shadow.style[L.DomUtil.TRANSITION] = 'all ' + transitionTime + 'ms linear'; } - if (this._shadow) { - this._shadow.style[L.DomUtil.TRANSITION] = 'all ' + transitionTime + 'ms linear'; + + if (this.options.transitionpopup) { + if (this._popup && this._popup._wrapper) { + this._popup._wrapper.style[L.DomUtil.TRANSITION] = 'all ' + transitionTime + 'ms linear'; + this._popup._wrapper.parentNode.style[L.DomUtil.TRANSITION] = 'all ' + transitionTime + 'ms linear'; + } + } + if (this.options.transitionlabel) { + if (this._tooltip && this._tooltip._container && $(this._tooltip._container).is(":visible")) { + this._tooltip._container.style[L.DomUtil.TRANSITION] = 'all ' + transitionTime + 'ms linear'; + } } } + this.setLatLng(latLng); + + if (this._tooltip) { + this._tooltip.setContent( + this.getTooltipContent() + ) + } if (this._popup) { - this._popup.setContent(this.getPopupContent() + this._latlng.toString()); - } + this._popup.setLatLng(latLng).setContent( + this.getPopupContent() + ) + } }, - - // modify leaflet markers to add our roration code + // modify leaflet markers to add our rotation code /* - * Based on comments by @runanet and @coomsie + * Based on comments by @runanet and @coomsie * https://github.com/CloudMade/Leaflet/issues/386 * * Wrapping function is needed to preserve L.Marker.update function */ _old__setPos:L.Marker.prototype._setPos, - + _updateImg: function (i, a, s) { a = L.point(s).divideBy(2)._subtract(L.point(a)); + a = L.point(s); var transform = ''; transform += ' translate(' + -a.x + 'px, ' + -a.y + 'px)'; transform += ' rotate(' + this.options.iconAngle + 'deg)'; transform += ' translate(' + a.x + 'px, ' + a.y + 'px)'; + i.style.transformOrigin = '50% 50% 0'; i.style[L.DomUtil.TRANSFORM] += transform; }, setIconAngle: function (iconAngle) { @@ -175,7 +184,6 @@ L.Playback.MoveableMarker = L.Marker.extend({ if (this._shadow) { this._shadow.style[L.DomUtil.TRANSFORM] = ""; } - this._old__setPos.apply(this, [pos]); if (this.options.iconAngle) { var a = this.options.icon.options.iconAnchor; @@ -185,393 +193,343 @@ L.Playback.MoveableMarker = L.Marker.extend({ i = this._icon; this._updateImg(i, a, s); } - if (this._shadow) { // Rotate around the icons anchor. s = this.options.icon.options.shadowSize; i = this._shadow; this._updateImg(i, a, s); } - } } }); L.Playback = L.Playback || {}; +L.Playback.Track = L.Class.extend({ + initialize : function(geoJSON, options) { + options = options || {}; + var tickLen = options.tickLen || 250; + this._staleTime = options.staleTime || 60*60*1000; + this._fadeMarkersWhenStale = options.fadeMarkersWhenStale || false; + + this._geoJSON = geoJSON; + this._tickLen = tickLen; + this._ticks = []; + this._marker = null; + this._orientations = []; + + var sampleTimes = geoJSON.properties.time; + + this._orientIcon = options.orientIcons; + var previousOrientation; + + var samples = geoJSON.geometry.coordinates; + var currSample = samples[0]; + var nextSample = samples[1]; + + var currSampleTime = sampleTimes[0]; + var t = currSampleTime; // t is used to iterate through tick times + var nextSampleTime = sampleTimes[1]; + var tmod = t % tickLen; // ms past a tick time + var rem, ratio; + + // handle edge case of only one t sample + if (sampleTimes.length === 1) { + if (tmod !== 0) + t += tickLen - tmod; + this._ticks[t] = samples[0]; + this._orientations[t] = 0; + this._startTime = t; + this._endTime = t; + return; + } + // interpolate first tick if t not a tick time + if (tmod !== 0) { + rem = tickLen - tmod; + ratio = rem / (nextSampleTime - currSampleTime); + t += rem; + this._ticks[t] = this._interpolatePoint(currSample, nextSample, ratio); + this._orientations[t] = this._directionOfPoint(currSample,nextSample); + previousOrientation = this._orientations[t]; + } else { + this._ticks[t] = currSample; + this._orientations[t] = this._directionOfPoint(currSample,nextSample); + previousOrientation = this._orientations[t]; + } - -L.Playback.Track = L.Class.extend({ + this._startTime = t; + t += tickLen; + while (t < nextSampleTime) { + ratio = (t - currSampleTime) / (nextSampleTime - currSampleTime); + this._ticks[t] = this._interpolatePoint(currSample, nextSample, ratio); + this._orientations[t] = this._directionOfPoint(currSample,nextSample); + previousOrientation = this._orientations[t]; + t += tickLen; + } - initialize : function (geoJSON, options) { - options = options || {}; - var tickLen = options.tickLen || 250; - this._staleTime = options.staleTime || 60*60*1000; - this._fadeMarkersWhenStale = options.fadeMarkersWhenStale || false; - - this._geoJSON = geoJSON; - this._tickLen = tickLen; - this._ticks = []; - this._marker = null; - this._orientations = []; - - var sampleTimes = geoJSON.properties.time; - - this._orientIcon = options.orientIcons; - var previousOrientation; - - var samples = geoJSON.geometry.coordinates; - var currSample = samples[0]; - var nextSample = samples[1]; - - var currSampleTime = sampleTimes[0]; - var t = currSampleTime; // t is used to iterate through tick times - var nextSampleTime = sampleTimes[1]; - var tmod = t % tickLen; // ms past a tick time - var rem, - ratio; - - // handle edge case of only one t sample - if (sampleTimes.length === 1) { - if (tmod !== 0) - t += tickLen - tmod; - this._ticks[t] = samples[0]; - this._orientations[t] = 0; - this._startTime = t; - this._endTime = t; - return; - } + // iterating through the rest of the samples + for (var i = 1, len = samples.length; i < len; i++) { + currSample = samples[i]; + nextSample = samples[i + 1]; + t = currSampleTime = sampleTimes[i]; + nextSampleTime = sampleTimes[i + 1]; - // interpolate first tick if t not a tick time - if (tmod !== 0) { + tmod = t % tickLen; + if (tmod !== 0 && nextSampleTime) { rem = tickLen - tmod; ratio = rem / (nextSampleTime - currSampleTime); t += rem; this._ticks[t] = this._interpolatePoint(currSample, nextSample, ratio); - this._orientations[t] = this._directionOfPoint(currSample,nextSample); - previousOrientation = this._orientations[t]; + if (nextSample) { + this._orientations[t] = this._directionOfPoint(currSample,nextSample); + previousOrientation = this._orientations[t]; + } else { + this._orientations[t] = previousOrientation; + } } else { this._ticks[t] = currSample; - this._orientations[t] = this._directionOfPoint(currSample,nextSample); - previousOrientation = this._orientations[t]; + if (nextSample) { + this._orientations[t] = this._directionOfPoint(currSample,nextSample); + previousOrientation = this._orientations[t]; + } else { + this._orientations[t] = previousOrientation; + } } - this._startTime = t; t += tickLen; while (t < nextSampleTime) { ratio = (t - currSampleTime) / (nextSampleTime - currSampleTime); - this._ticks[t] = this._interpolatePoint(currSample, nextSample, ratio); - this._orientations[t] = this._directionOfPoint(currSample,nextSample); - previousOrientation = this._orientations[t]; - t += tickLen; - } - - // iterating through the rest of the samples - for (var i = 1, len = samples.length; i < len; i++) { - currSample = samples[i]; - nextSample = samples[i + 1]; - t = currSampleTime = sampleTimes[i]; - nextSampleTime = sampleTimes[i + 1]; - - tmod = t % tickLen; - if (tmod !== 0 && nextSampleTime) { - rem = tickLen - tmod; - ratio = rem / (nextSampleTime - currSampleTime); - t += rem; - this._ticks[t] = this._interpolatePoint(currSample, nextSample, ratio); - if(nextSample){ - this._orientations[t] = this._directionOfPoint(currSample,nextSample); - previousOrientation = this._orientations[t]; - } else { - this._orientations[t] = previousOrientation; - } - } else { + if (nextSampleTime - currSampleTime > options.maxInterpolationTime) { this._ticks[t] = currSample; - if(nextSample){ - this._orientations[t] = this._directionOfPoint(currSample,nextSample); - previousOrientation = this._orientations[t]; + if (nextSample){ + this._orientations[t] = this._directionOfPoint(currSample,nextSample); + previousOrientation = this._orientations[t]; } else { - this._orientations[t] = previousOrientation; + this._orientations[t] = previousOrientation; } + } else { + this._ticks[t] = this._interpolatePoint(currSample, nextSample, ratio); + if (nextSample) { + this._orientations[t] = this._directionOfPoint(currSample,nextSample); + previousOrientation = this._orientations[t]; + } else { + this._orientations[t] = previousOrientation; + } } - t += tickLen; - while (t < nextSampleTime) { - ratio = (t - currSampleTime) / (nextSampleTime - currSampleTime); - - if (nextSampleTime - currSampleTime > options.maxInterpolationTime){ - this._ticks[t] = currSample; - - if(nextSample){ - this._orientations[t] = this._directionOfPoint(currSample,nextSample); - previousOrientation = this._orientations[t]; - } else { - this._orientations[t] = previousOrientation; - } - } - else { - this._ticks[t] = this._interpolatePoint(currSample, nextSample, ratio); - if(nextSample) { - this._orientations[t] = this._directionOfPoint(currSample,nextSample); - previousOrientation = this._orientations[t]; - } else { - this._orientations[t] = previousOrientation; - } - } - - t += tickLen; - } } + } + // the last t in the while would be past bounds + this._endTime = t - tickLen; + this._lastTick = this._ticks[this._endTime]; + }, + _interpolatePoint: function(start, end, ratio) { + try { + var delta = [end[0] - start[0], end[1] - start[1]]; + var offset = [delta[0] * ratio, delta[1] * ratio]; + return [start[0] + offset[0], start[1] + offset[1]]; + } catch (e) { + console.log('err: cant interpolate a point'); + console.log(['start', start]); + console.log(['end', end]); + console.log(['ratio', ratio]); + } + }, + _directionOfPoint: function(start,end) { + return this._getBearing(start[1],start[0],end[1],end[0]); + }, + _getBearing: function(startLat,startLong,endLat,endLong) { + startLat = this._radians(startLat); + startLong = this._radians(startLong); + endLat = this._radians(endLat); + endLong = this._radians(endLong); + + var dLong = endLong - startLong; + + var dPhi = Math.log(Math.tan(endLat/2.0+Math.PI/4.0)/Math.tan(startLat/2.0+Math.PI/4.0)); + if (Math.abs(dLong) > Math.PI) { + if (dLong > 0.0) + dLong = -(2.0 * Math.PI - dLong); + else + dLong = (2.0 * Math.PI + dLong); + } - // the last t in the while would be past bounds - this._endTime = t - tickLen; - this._lastTick = this._ticks[this._endTime]; + return (this._degrees(Math.atan2(dLong, dPhi)) + 360.0) % 360.0; + }, + _radians: function(n) { + return n * (Math.PI / 180); + }, + _degrees: function(n) { + return n * (180 / Math.PI); + }, - }, + getFirstTick: function() { + return this._ticks[this._startTime]; + }, + getLastTick: function() { + return this._ticks[this._endTime]; + }, + getStartTime: function() { + return this._startTime; + }, + getEndTime: function() { + return this._endTime; + }, + getTickMultiPoint: function() { + var t = this.getStartTime(); + var endT = this.getEndTime(); + var coordinates = []; + var time = []; + while (t <= endT) { + time.push(t); + coordinates.push(this.tick(t)); + t += this._tickLen; + } - _interpolatePoint : function (start, end, ratio) { - try { - var delta = [end[0] - start[0], end[1] - start[1]]; - var offset = [delta[0] * ratio, delta[1] * ratio]; - return [start[0] + offset[0], start[1] + offset[1]]; - } catch (e) { - console.log('err: cant interpolate a point'); - console.log(['start', start]); - console.log(['end', end]); - console.log(['ratio', ratio]); + return { + type : 'Feature', + geometry : { + type : 'MultiPoint', + coordinates : coordinates + }, + properties : { + time : time } - }, - - _directionOfPoint:function(start,end){ - return this._getBearing(start[1],start[0],end[1],end[0]); - }, - - _getBearing:function(startLat,startLong,endLat,endLong){ - startLat = this._radians(startLat); - startLong = this._radians(startLong); - endLat = this._radians(endLat); - endLong = this._radians(endLong); - - var dLong = endLong - startLong; - - var dPhi = Math.log(Math.tan(endLat/2.0+Math.PI/4.0)/Math.tan(startLat/2.0+Math.PI/4.0)); - if (Math.abs(dLong) > Math.PI){ - if (dLong > 0.0) - dLong = -(2.0 * Math.PI - dLong); - else - dLong = (2.0 * Math.PI + dLong); - } - - return (this._degrees(Math.atan2(dLong, dPhi)) + 360.0) % 360.0; - }, - - _radians:function(n) { - return n * (Math.PI / 180); - }, - _degrees:function(n) { - return n * (180 / Math.PI); - }, - - getFirstTick : function () { - return this._ticks[this._startTime]; - }, - - getLastTick : function () { - return this._ticks[this._endTime]; - }, - - getStartTime : function () { - return this._startTime; - }, - - getEndTime : function () { - return this._endTime; - }, + }; + }, + trackPresentAtTick: function(timestamp) { + return (timestamp >= this._startTime); + }, + trackStaleAtTick: function(timestamp) { + return ((this._endTime + this._staleTime) <= timestamp); + }, + tick: function(timestamp) { + if (timestamp > this._endTime) + timestamp = this._endTime; + if (timestamp < this._startTime) + timestamp = this._startTime; + return this._ticks[timestamp]; + }, + courseAtTime: function(timestamp) { + //return 90; + if (timestamp > this._endTime) + timestamp = this._endTime; + if (timestamp < this._startTime) + timestamp = this._startTime; + return this._orientations[timestamp]; + }, + setMarker: function(timestamp, options) { + var lngLat = null; - getTickMultiPoint : function () { - var t = this.getStartTime(); - var endT = this.getEndTime(); - var coordinates = []; - var time = []; - while (t <= endT) { - time.push(t); - coordinates.push(this.tick(t)); - t += this._tickLen; + // if time stamp is not set, then get first tick + if (timestamp) { + lngLat = this.tick(timestamp); + } else { + lngLat = this.getFirstTick(); + } + if (lngLat) { + var latLng = new L.LatLng(lngLat[1], lngLat[0]); + this._marker = new L.Playback.MoveableMarker(latLng, options, this._geoJSON); + if (options.mouseOverCallback) { + this._marker.on('mouseover', options.mouseOverCallback); + } + if (options.clickCallback) { + this._marker.on('click', options.clickCallback); + this._marker.on('click', options.clickCallback); } - return { - type : 'Feature', - geometry : { - type : 'MultiPoint', - coordinates : coordinates - }, - properties : { - time : time + //hide the marker if its not present yet and fadeMarkersWhenStale is true + if (this._fadeMarkersWhenStale && !this.trackPresentAtTick(timestamp)) { + this._marker.setOpacity(0); + } + } + return this._marker; + }, + moveMarker: function(latLng, transitionTime, timestamp) { + if (this._marker) { + if (this._fadeMarkersWhenStale) { + //show the marker if its now present + if(this.trackPresentAtTick(timestamp)) { + this._marker.setOpacity(1); + } else { + this._marker.setOpacity(0); } - }; - }, - - trackPresentAtTick : function(timestamp) - { - return (timestamp >= this._startTime); - }, - - trackStaleAtTick : function(timestamp) - { - return ((this._endTime + this._staleTime) <= timestamp); - }, - tick : function (timestamp) { - if (timestamp > this._endTime) - timestamp = this._endTime; - if (timestamp < this._startTime) - timestamp = this._startTime; - return this._ticks[timestamp]; - }, - - courseAtTime: function(timestamp) - { - //return 90; - if (timestamp > this._endTime) - timestamp = this._endTime; - if (timestamp < this._startTime) - timestamp = this._startTime; - return this._orientations[timestamp]; - }, - - setMarker : function(timestamp, options){ - var lngLat = null; - - // if time stamp is not set, then get first tick - if (timestamp) { - lngLat = this.tick(timestamp); - } - else { - lngLat = this.getFirstTick(); - } - - if (lngLat) { - var latLng = new L.LatLng(lngLat[1], lngLat[0]); - this._marker = new L.Playback.MoveableMarker(latLng, options, this._geoJSON); - if(options.mouseOverCallback) { - this._marker.on('mouseover',options.mouseOverCallback); + if(this.trackStaleAtTick(timestamp)) { + this._marker.setOpacity(0.25); } - if(options.clickCallback) { - this._marker.on('click',options.clickCallback); - } - - //hide the marker if its not present yet and fadeMarkersWhenStale is true - if(this._fadeMarkersWhenStale && !this.trackPresentAtTick(timestamp)) - { - this._marker.setOpacity(0); - } } - - return this._marker; - }, - - moveMarker : function(latLng, transitionTime,timestamp) { - if (this._marker) { - if(this._fadeMarkersWhenStale) { - //show the marker if its now present - if(this.trackPresentAtTick(timestamp)) { - this._marker.setOpacity(1); - } else { - this._marker.setOpacity(0); - } - - if(this.trackStaleAtTick(timestamp)) { - this._marker.setOpacity(0.25); - } - } - - if(this._orientIcon){ - this._marker.setIconAngle(this.courseAtTime(timestamp)); - } - - this._marker.move(latLng, transitionTime); + if (this._orientIcon) { + this._marker.setIconAngle(this.courseAtTime(timestamp)); } - }, - - getMarker : function() { - return this._marker; + const index = this._geoJSON.geometry.coordinates.findIndex((f, i) => { + let currLatLng = new L.LatLng(f[1], f[0]); + return currLatLng.equals(latLng); + }); + this._marker.move(latLng, transitionTime, index); } - - }); + }, + getMarker: function() { + return this._marker; + } +}); L.Playback = L.Playback || {}; - L.Playback.TrackController = L.Class.extend({ - - initialize : function (map, tracks, options) { + initialize : function(map, tracks, options) { this.options = options || {}; - this._map = map; - this._tracks = []; - // initialize tick points this.setTracks(tracks); }, - - clearTracks: function(){ + clearTracks: function() { while (this._tracks.length > 0) { var track = this._tracks.pop(); var marker = track.getMarker(); - + if (marker){ this._map.removeLayer(marker); } - } + } }, - - setTracks : function (tracks) { + setTracks : function(tracks) { // reset current tracks this.clearTracks(); - this.addTracks(tracks); }, - - addTracks : function (tracks) { + addTracks : function(tracks) { // return if nothing is set if (!tracks) { return; } - - if (tracks instanceof Array) { + + if (tracks instanceof Array) { for (var i = 0, len = tracks.length; i < len; i++) { this.addTrack(tracks[i]); } } else { this.addTrack(tracks); - } + } }, - - // add single track - addTrack : function (track, timestamp) { - // return if nothing is set + addTrack : function(track, timestamp) { if (!track) { return; } - var marker = track.setMarker(timestamp, this.options); - if (marker) { marker.addTo(this._map); - this._tracks.push(track); - } + } }, - - tock : function (timestamp, transitionTime) { + tock : function(timestamp, transitionTime) { for (var i = 0, len = this._tracks.length; i < len; i++) { var lngLat = this._tracks[i].tick(timestamp); var latLng = new L.LatLng(lngLat[1], lngLat[0]); - this._tracks[i].moveMarker(latLng, transitionTime,timestamp); + this._tracks[i].moveMarker(latLng, transitionTime, timestamp); } }, - - getStartTime : function () { + getStartTime : function() { var earliestTime = 0; if (this._tracks.length > 0) { @@ -583,13 +541,12 @@ L.Playback.TrackController = L.Class.extend({ } } } - + return earliestTime; }, - - getEndTime : function () { + getEndTime : function() { var latestTime = 0; - + if (this._tracks.length > 0){ latestTime = this._tracks[0].getEndTime(); for (var i = 1, len = this._tracks.length; i < len; i++) { @@ -599,18 +556,16 @@ L.Playback.TrackController = L.Class.extend({ } } } - + return latestTime; }, - - getTracks : function () { + getTracks : function() { return this._tracks; } }); -L.Playback = L.Playback || {}; +L.Playback = L.Playback || {}; L.Playback.Clock = L.Class.extend({ - initialize: function (trackController, callback, options) { this._trackController = trackController; this._callbacksArry = []; @@ -618,20 +573,19 @@ L.Playback.Clock = L.Class.extend({ L.setOptions(this, options); this._speed = this.options.speed; this._tickLen = this.options.tickLen; - this._cursor = trackController.getStartTime(); + this._cursor = this._trackController.getStartTime(); this._transitionTime = this._tickLen / this._speed; }, - _tick: function (self) { - if (self._cursor > self._trackController.getEndTime()) { - clearInterval(self._intervalID); - return; - } self._trackController.tock(self._cursor, self._transitionTime); + if (self._cursor >= self._trackController.getEndTime()) { + self.setCursor(self._trackController.getEndTime()); + self.stop(); + } else { + self._cursor += self._tickLen; + } self._callbacks(self._cursor); - self._cursor += self._tickLen; }, - _callbacks: function(cursor) { var arry = this._callbacksArry; for (var i=0, len=arry.length; i= this._trackController.getEndTime()) + this.setCursor(this._trackController.getStartTime()); + this.playControl._button.innerHTML = this.options.stopCommand ? this.options.stopCommand : this.playControl.options.stopCommand; this._intervalID = window.setInterval( - this._tick, - this._transitionTime, + this._tick, + this._transitionTime, this); }, - stop: function () { - if (!this._intervalID) return; + if (!this.isPlaying()) return; clearInterval(this._intervalID); this._intervalID = null; + this.playControl._button.innerHTML = this.options.playCommand ? this.options.playCommand : this.playControl.options.playCommand; }, - getSpeed: function() { return this._speed; }, - isPlaying: function() { return this._intervalID ? true : false; }, - setSpeed: function (speed) { this._speed = speed; this._transitionTime = this._tickLen / speed; - if (this._intervalID) { + if (this.isPlaying()) { this.stop(); this.start(); } }, - setCursor: function (ms) { var time = parseInt(ms); if (!time) return; @@ -685,82 +637,78 @@ L.Playback.Clock = L.Class.extend({ this._trackController.tock(this._cursor, 0); this._callbacks(this._cursor); }, - getTime: function() { return this._cursor; }, - getStartTime: function() { return this._trackController.getStartTime(); }, - getEndTime: function() { return this._trackController.getEndTime(); }, - getTickLen: function() { return this._tickLen; } - }); // Simply shows all of the track points as circles. // TODO: Associate circle color with the marker color. L.Playback = L.Playback || {}; - L.Playback.TracksLayer = L.Class.extend({ initialize : function (map, options) { var layer_options = options.layer || {}; - + if (jQuery.isFunction(layer_options)){ layer_options = layer_options(feature); } - + + options.tracksLayerCaption = options.tracksLayerCaption || 'GPS Tracks'; + if (!layer_options.pointToLayer) { layer_options.pointToLayer = function (featureData, latlng) { return new L.CircleMarker(latlng, { radius : 5 }); }; } - + this.layer = new L.GeoJSON(null, layer_options); - var overlayControl = { - 'GPS Tracks' : this.layer - }; + var overlayControl = {}; + overlayControl[options.tracksLayerCaption] = this.layer; L.control.layers(null, overlayControl, { collapsed : false }).addTo(map); }, - // clear all geoJSON layers clearLayer : function(){ for (var i in this.layer._layers) { - this.layer.removeLayer(this.layer._layers[i]); + this.layer.removeLayer(this.layer._layers[i]); } }, - // add new geoJSON layer addLayer : function(geoJSON) { this.layer.addData(geoJSON); } }); -L.Playback = L.Playback || {}; +L.Playback = L.Playback || {}; L.Playback.DateControl = L.Control.extend({ - options : { - position : 'bottomleft', + options: { + position: 'bottomleft', + locale: { + locale: 'US-en', + options: {} + }, dateFormatFn: L.Playback.Util.DateStr, timeFormatFn: L.Playback.Util.TimeStr }, - initialize : function (playback, options) { - L.setOptions(this, options); - this.playback = playback; + initialize: function (playback, options) { + L.setOptions(this, options); + this.playback = playback; }, - - onAdd : function (map) { + onAdd: function (map) { this._container = L.DomUtil.create('div', 'leaflet-control-layers leaflet-control-layers-expanded'); var self = this; @@ -773,75 +721,67 @@ L.Playback.DateControl = L.Control.extend({ this._date = L.DomUtil.create('p', '', datetime); this._time = L.DomUtil.create('p', '', datetime); - this._date.innerHTML = this.options.dateFormatFn(time); - this._time.innerHTML = this.options.timeFormatFn(time); + this._date.innerHTML = this.options.dateFormatFn(time, this.options.locale); + this._time.innerHTML = this.options.timeFormatFn(time, this.options.locale); // setup callback playback.addCallback(function (ms) { - self._date.innerHTML = self.options.dateFormatFn(ms); - self._time.innerHTML = self.options.timeFormatFn(ms); + self._date.innerHTML = self.options.dateFormatFn(ms, self.options.locale); + self._time.innerHTML = self.options.timeFormatFn(ms, self.options.locale); }); return this._container; } }); - L.Playback.PlayControl = L.Control.extend({ options : { - position : 'bottomright' + position : 'bottomright', + playCommand : 'Play', + stopCommand : 'Stop' }, - - initialize : function (playback) { + initialize : function (playback, options) { + L.setOptions(this, options); this.playback = playback; }, - onAdd : function (map) { this._container = L.DomUtil.create('div', 'leaflet-control-layers leaflet-control-layers-expanded'); var self = this; var playback = this.playback; - playback.setSpeed(100); + playback.setSpeed(this.playback._speed); var playControl = L.DomUtil.create('div', 'playControl', this._container); - this._button = L.DomUtil.create('button', '', playControl); - this._button.innerHTML = 'Play'; - + this._button.innerHTML = this.options.playCommand; var stop = L.DomEvent.stopPropagation; - L.DomEvent - .on(this._button, 'click', stop) - .on(this._button, 'mousedown', stop) - .on(this._button, 'dblclick', stop) - .on(this._button, 'click', L.DomEvent.preventDefault) - .on(this._button, 'click', play, this); - + .on(this._button, 'click', stop) + .on(this._button, 'mousedown', stop) + .on(this._button, 'dblclick', stop) + .on(this._button, 'click', L.DomEvent.preventDefault) + .on(this._button, 'click', play, this); + function play(){ if (playback.isPlaying()) { playback.stop(); - self._button.innerHTML = 'Play'; } else { playback.start(); - self._button.innerHTML = 'Stop'; - } + } } return this._container; } -}); - +}); L.Playback.SliderControl = L.Control.extend({ options : { position : 'bottomleft' }, - initialize : function (playback) { this.playback = playback; }, - onAdd : function (map) { this._container = L.DomUtil.create('div', 'leaflet-control-layers leaflet-control-layers-expanded'); @@ -856,27 +796,39 @@ L.Playback.SliderControl = L.Control.extend({ this._slider.value = playback.getTime(); var stop = L.DomEvent.stopPropagation; - L.DomEvent - .on(this._slider, 'click', stop) - .on(this._slider, 'mousedown', stop) - .on(this._slider, 'dblclick', stop) - .on(this._slider, 'click', L.DomEvent.preventDefault) - //.on(this._slider, 'mousemove', L.DomEvent.preventDefault) - .on(this._slider, 'change', onSliderChange, this) - .on(this._slider, 'mousemove', onSliderChange, this); + .on(this._slider, 'click', stop) + .on(this._slider, 'mousedown', stop) + .on(this._slider, 'dblclick', stop) + .on(this._slider, 'click', L.DomEvent.preventDefault) + .on(this._slider, 'change', onSliderChange, this) + .on(this._slider, 'mousedown', L.DomEvent.stopPropagation) + mouseMoveWhilstDown(this._slider, onSliderChange) function onSliderChange(e) { - var val = Number(e.target.value); - playback.setCursor(val); + var val = Number(e.target.value); + playback.setCursor(val); + } + function mouseMoveWhilstDown(target, whileMove) { + var endMove = function () { + map.dragging.enable(); + window.removeEventListener('mousemove', whileMove); + window.removeEventListener('mouseup', endMove); + }; + + target.addEventListener('mousedown', function (event) { + map.dragging.disable() + event.stopPropagation(); // remove if you do want it to propagate .. + window.addEventListener('mousemove', whileMove); + window.addEventListener('mouseup', endMove); + }); } playback.addCallback(function (ms) { self._slider.value = ms; }); - - + map.on('playback:add_tracks', function() { self._slider.min = playback.getStartTime(); self._slider.max = playback.getEndTime(); @@ -885,7 +837,7 @@ L.Playback.SliderControl = L.Control.extend({ return this._container; } -}); +}); L.Playback = L.Playback.Clock.extend({ statics : { @@ -894,50 +846,47 @@ L.Playback = L.Playback.Clock.extend({ TrackController : L.Playback.TrackController, Clock : L.Playback.Clock, Util : L.Playback.Util, - + TracksLayer : L.Playback.TracksLayer, PlayControl : L.Playback.PlayControl, DateControl : L.Playback.DateControl, SliderControl : L.Playback.SliderControl }, - options : { tickLen: 250, speed: 1, maxInterpolationTime: 5*60*1000, // 5 minutes tracksLayer : true, - + playControl: false, dateControl: false, sliderControl: false, - + // options layer: { // pointToLayer(featureData, latlng) }, - + marker : { // getPopup(feature) } }, - initialize : function (map, geoJSON, callback, options) { L.setOptions(this, options); - + this._map = map; this._trackController = new L.Playback.TrackController(map, null, this.options); L.Playback.Clock.prototype.initialize.call(this, this._trackController, callback, this.options); - + if (this.options.tracksLayer) { this._tracksLayer = new L.Playback.TracksLayer(map, options); } - this.setData(geoJSON); - + this.setData(geoJSON); if (this.options.playControl) { - this.playControl = new L.Playback.PlayControl(this); + this.playControl = new L.Playback.PlayControl(this, options); this.playControl.addTo(map); } @@ -950,32 +899,25 @@ L.Playback = L.Playback.Clock.extend({ this.dateControl = new L.Playback.DateControl(this, options); this.dateControl.addTo(map); } - }, - clearData : function(){ this._trackController.clearTracks(); - if (this._tracksLayer) { this._tracksLayer.clearLayer(); } }, - setData : function (geoJSON) { this.clearData(); - this.addData(geoJSON, this.getTime()); - this.setCursor(this.getStartTime()); }, - - // bad implementation + // TODO - bad implementation addData : function (geoJSON, ms) { // return if data not set if (!geoJSON) { return; } - + if (geoJSON instanceof Array) { for (var i = 0, len = geoJSON.length; i < len; i++) { this._trackController.addTrack(new L.Playback.Track(geoJSON[i], this.options), ms); @@ -984,13 +926,12 @@ L.Playback = L.Playback.Clock.extend({ this._trackController.addTrack(new L.Playback.Track(geoJSON, this.options), ms); } - this._map.fire('playback:set:data'); - + this._map.fire('playback:add_tracks'); + if (this.options.tracksLayer) { this._tracksLayer.addLayer(geoJSON); - } + } }, - destroy: function() { this.clearData(); if (this.playControl) { @@ -1003,7 +944,7 @@ L.Playback = L.Playback.Clock.extend({ this._map.removeControl(this.dateControl); } } - }); +}); L.Map.addInitHook(function () { if (this.options.playback) { diff --git a/inst/htmlwidgets/lfx-reachability/leaflet.reachability-bindings.js b/inst/htmlwidgets/lfx-reachability/leaflet.reachability-bindings.js new file mode 100644 index 00000000..8c6f0a63 --- /dev/null +++ b/inst/htmlwidgets/lfx-reachability/leaflet.reachability-bindings.js @@ -0,0 +1,26 @@ +/* global LeafletWidget, $, L, topojson, csv2geojson, toGeoJSON */ +LeafletWidget.methods.addReachability = function(options) { + var map = this; + var reachability = L.control.reachability(options); + map.controls.add(reachability); + + // Listen for Events in Shinymode + if (HTMLWidgets.shinyMode) { + map.on('reachability:displayed', function (e) { + Shiny.onInputChange(map.id + "_reachability_displayed", null); + }); + map.on('reachability:delete', function (e) { + Shiny.onInputChange(map.id + "_reachability_delete", null); + }); + map.on('reachability:error', function (e) { + Shiny.onInputChange(map.id + "_reachability_error", null); + }); + } +}; + +LeafletWidget.methods.removeReachability = function() { + this.controls.clear(); +}; + + + diff --git a/inst/htmlwidgets/lfx-reachability/leaflet.reachability.bindings.js b/inst/htmlwidgets/lfx-reachability/leaflet.reachability.bindings.js deleted file mode 100644 index fdf5d9d5..00000000 --- a/inst/htmlwidgets/lfx-reachability/leaflet.reachability.bindings.js +++ /dev/null @@ -1,32 +0,0 @@ -/* global LeafletWidget, $, L, topojson, csv2geojson, toGeoJSON */ -LeafletWidget.methods.addReachability = function(options) { - var map = this; - var reachability = L.control.reachability(options); - reachability.addTo(map); - map.controls.add(reachability); - - // Listen for the event fired when reachability areas are created on the map - map.on('reachability:displayed', function (e) { - /* - console.log("reachability.latestIsolines");console.log(reachability.latestIsolines); - console.log("reachability.isolinesGroup");console.log(reachability.isolinesGroup); - console.log("reachability:displayed"); - */ - Shiny.onInputChange(map.id + "_reachability_displayed", null); - }); - map.on('reachability:delete', function (e) { - //console.log("reachability:delete"); - Shiny.onInputChange(map.id + "_reachability_delete", null); - }); - map.on('reachability:error', function (e) { - //console.log("reachability:error"); - Shiny.onInputChange(map.id + "_reachability_error", null); - }); -}; - -LeafletWidget.methods.removeReachability = function() { - this.controls.clear(); -}; - - - diff --git a/inst/htmlwidgets/lfx-side-by-side/lfx.addSidebyside.bindings.js b/inst/htmlwidgets/lfx-side-by-side/lfx-side-by-side-bindings.js similarity index 100% rename from inst/htmlwidgets/lfx-side-by-side/lfx.addSidebyside.bindings.js rename to inst/htmlwidgets/lfx-side-by-side/lfx-side-by-side-bindings.js diff --git a/inst/htmlwidgets/lfx-side-by-side/lfx-side-by-side.js b/inst/htmlwidgets/lfx-side-by-side/lfx-side-by-side.js index 6d454a46..b0d0e810 100644 --- a/inst/htmlwidgets/lfx-side-by-side/lfx-side-by-side.js +++ b/inst/htmlwidgets/lfx-side-by-side/lfx-side-by-side.js @@ -79,6 +79,7 @@ this._divider = L.DomUtil.create('div', 'leaflet-sbs-divider', container) var range = this._range = L.DomUtil.create('input', 'leaflet-sbs-range', container) + range.addEventListener('click', function (e) { e.stopPropagation() }) range.type = 'range' range.min = 0 range.max = 1 diff --git a/inst/htmlwidgets/lfx-sidebar/example.html b/inst/htmlwidgets/lfx-sidebar/example.html deleted file mode 100644 index 24b2825c..00000000 --- a/inst/htmlwidgets/lfx-sidebar/example.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - sidebar-v2 example - - - - - - - - - - - - - - - - - - Fork me on GitHub - - - - - - - diff --git a/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar-binding.js b/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar-binding.js new file mode 100644 index 00000000..8ab3b0b9 --- /dev/null +++ b/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar-binding.js @@ -0,0 +1,115 @@ +/* global LeafletWidget, $, L */ +LeafletWidget.methods.addSidebar = function(id, options) { + (function(){ + var map = this; + + // Add css class ('sidebar-map') to map + if (!map._container.classList.contains('sidebar-map')) { + map._container.classList.add('sidebar-map'); + } + + // Move Sidebar inside Map-Div + var mapid = "#" + (map.id ? map.id : map._container.id); + if (options && options.fit === true) { + // Append sidebar container to map div + if ($(mapid + ' .leaflet-sidebar-container').length === 0) { + var mapdiv = document.createElement('div'); + mapdiv.className = 'leaflet-sidebar-container'; + $(mapdiv).appendTo($(mapid)); + } + $('#'+id).appendTo(mapid + ' .leaflet-sidebar-container'); + + // Disable/Re-enable dragging+scrolling when user's cursor enters/exits the element + var content = $('.leafsidebar-content'); + content.on('mouseover', function () { + map.dragging.disable(); + content.on('mousewheel', L.DomEvent.stopPropagation); + }); + content.on('mouseout', function () { + map.dragging.enable(); + }); + } + + // Show Sidebar & content + setTimeout(function(){ + $('.leafsidebar.collapsed .leafsidebar-tabs, .leafsidebar.collapsed .leafsidebar-content').css('display','block'); + }, 400); + + // Extend onClick method to trigger 'shown' event, otherwise Shiny-Inputs/Outputs are not reactive + L.Control.Sidebar = L.Control.Sidebar.extend({ + _onClick: function() { + if (L.DomUtil.hasClass(this, 'active')) { + this._sidebar.close(); + Shiny.setInputValue(id, null); + } else if (!L.DomUtil.hasClass(this, 'disabled')) { + const openid = this.querySelector('a').hash.slice(1); + this._sidebar.open(openid); + Shiny.setInputValue(id, openid); + $(this.firstElementChild.attributes.href.nodeValue).trigger('shown'); + } + } + }); + + // initialize sidebar element of map + if (!map.sidebar) { + map.sidebar = {}; + } + map.sidebar[id] = L.control.sidebar(id, options); + map.controls.add(map.sidebar[id]); + + }).call(this); +}; + +LeafletWidget.methods.removeSidebar = function(sidebar_id) { + var map = this; + if (map.sidebar) { + // if no sidebar_id specified, then use the first sidebar + var tid = + typeof(sidebar_id) === "string" ? + sidebar_id : Object.keys(map.sidebar)[0]; + + Shiny.setInputValue(tid, null); + + var sidebar = $(`#${tid}`); + if (sidebar[0]) { + // Remove left/right CSS + map._container.classList.remove("sidebar-map") + // Remove Sidebar and Delete from map + sidebar.remove(); + $("#" + map.id + " .leaflet-sidebar-container").remove(); + delete map.sidebar[tid]; + } + } +}; + +LeafletWidget.methods.closeSidebar = function(sidebar_id) { + var map = this; + if (map.sidebar) { + // if no sidebar_id specified, then use the first sidebar + var tid = + typeof(sidebar_id) === "string" ? + sidebar_id : Object.keys(map.sidebar)[0]; + + Shiny.setInputValue(tid, null); + + if (map.sidebar[tid]) { + map.sidebar[tid].close(); + } + } +}; + +LeafletWidget.methods.openSidebar = function(x) { + var map = this; + if (map.sidebar) { + // if no sidebar_id specified, then use the first sidebar + var tid = + typeof(x.sidebar_id) === "string" ? + x.sidebar_id : Object.keys(map.sidebar)[0]; + + Shiny.setInputValue(tid, x.id); + + if (map.sidebar[tid]) { + map.sidebar[tid].open(x.id); + } + } +}; diff --git a/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar.css b/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar.css index 70bfe94f..139ad163 100644 --- a/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar.css +++ b/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar.css @@ -1,200 +1,235 @@ -.sidebar { +.leafsidebar { position: absolute; top: 0; bottom: 0; width: 100%; overflow: hidden; - z-index: 2000; } - .sidebar.collapsed { - width: 40px; } - @media (min-width: 768px) { - .sidebar { - top: 10px; - bottom: 10px; - transition: width 500ms; } } - @media (min-width: 768px) and (max-width: 991px) { - .sidebar { - width: 305px; } } - @media (min-width: 992px) and (max-width: 1199px) { - .sidebar { - width: 390px; } } - @media (min-width: 1200px) { - .sidebar { - width: 460px; } } - -.sidebar-left { - left: 0; } - @media (min-width: 768px) { - .sidebar-left { - left: 10px; } } + z-index: 2000; + transition: width 500ms; + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65); +} +.leafsidebar.collapsed { + width: 40px; +} -.sidebar-right { - right: 0; } - @media (min-width: 768px) { - .sidebar-right { - right: 10px; } } +.leafsidebar-left { + left: 0; +} +.leafsidebar-right { + right: 0; +} -.sidebar-tabs { +.leafsidebar-tabs { top: 0; bottom: 0; height: inherit; - background-color: #fff; } - .sidebar-left .sidebar-tabs { - left: 0; } - .sidebar-right .sidebar-tabs { - right: 0; } - .sidebar-tabs, .sidebar-tabs > ul { - position: absolute; - width: 40px; - margin: 0; - padding: 0; - list-style-type: none; } - .sidebar-tabs > li, .sidebar-tabs > ul > li { - width: 100%; - height: 40px; - color: #333; - font-size: 12pt; - overflow: hidden; - transition: all 80ms; } - .sidebar-tabs > li:hover, .sidebar-tabs > ul > li:hover { - color: #000; - background-color: #eee; } - .sidebar-tabs > li.active, .sidebar-tabs > ul > li.active { - color: #fff; - background-color: #0074d9; } - .sidebar-tabs > li.disabled, .sidebar-tabs > ul > li.disabled { - color: rgba(51, 51, 51, 0.4); } - .sidebar-tabs > li.disabled:hover, .sidebar-tabs > ul > li.disabled:hover { - background: transparent; } - .sidebar-tabs > li.disabled > a, .sidebar-tabs > ul > li.disabled > a { - cursor: default; } - .sidebar-tabs > li > a, .sidebar-tabs > ul > li > a { - display: block; - width: 100%; - height: 100%; - line-height: 40px; - color: inherit; - text-decoration: none; - text-align: center; } - .sidebar-tabs > ul + ul { - bottom: 0; } + background-color: #fff; +} +.leafsidebar-left .leafsidebar-tabs { + left: 0; +} +.leafsidebar-right .leafsidebar-tabs { + right: 0; +} +.leafsidebar-tabs, +.leafsidebar-tabs > ul { + position: absolute; + width: 40px; + margin: 0; + padding: 0; + list-style-type: none; +} +.leafsidebar-tabs > li, +.leafsidebar-tabs > ul > li { + width: 100%; + height: 40px; + color: #333; + font-size: 12pt; + overflow: hidden; + transition: all 80ms; +} +.leafsidebar-tabs > li:hover, +.leafsidebar-tabs > ul > li:hover { + color: #000; + background-color: #eee; +} +.leafsidebar-tabs > li.active, +.leafsidebar-tabs > ul > li.active { + color: #fff; + background-color: #0074d9; +} +.leafsidebar-tabs > li.disabled, +.leafsidebar-tabs > ul > li.disabled { + color: rgba(51, 51, 51, 0.4); +} +.leafsidebar-tabs > li.disabled:hover, +.leafsidebar-tabs > ul > li.disabled:hover { + background: transparent; +} +.leafsidebar-tabs > li.disabled > a, +.leafsidebar-tabs > ul > li.disabled > a { + cursor: default; +} +.leafsidebar-tabs > li > a, +.leafsidebar-tabs > ul > li > a { + display: block; + width: 100%; + height: 100%; + line-height: 40px; + color: inherit; + text-decoration: none; + text-align: center; +} +.leafsidebar-tabs > ul + ul { + bottom: 0; +} -.sidebar-content { +.leafsidebar-content { position: absolute; top: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.95); overflow-x: hidden; - overflow-y: auto; } - .sidebar-left .sidebar-content { - left: 40px; - right: 0; } - .sidebar-right .sidebar-content { - left: 0; - right: 40px; } - .sidebar.collapsed > .sidebar-content { - overflow-y: hidden; } + overflow-y: auto; +} +.leafsidebar-left .leafsidebar-content { + left: 40px; + right: 0; +} +.leafsidebar-right .leafsidebar-content { + left: 0; + right: 40px; +} +.leafsidebar.collapsed > .leafsidebar-content { + overflow-y: hidden; +} -.sidebar-pane { +.leafsidebar-pane { display: none; left: 0; right: 0; box-sizing: border-box; - padding: 10px 20px; } - .sidebar-pane.active { - display: block; } - @media (min-width: 768px) and (max-width: 991px) { - .sidebar-pane { - min-width: 265px; } } - @media (min-width: 992px) and (max-width: 1199px) { - .sidebar-pane { - min-width: 350px; } } - @media (min-width: 1200px) { - .sidebar-pane { - min-width: 420px; } } + padding: 10px 20px; +} +.leafsidebar-pane.active { + display: block; +} -.sidebar-header { +.leafsidebar-header { margin: -10px -20px 0; height: 40px; padding: 0 20px; line-height: 40px; font-size: 14.4pt; color: #fff; - background-color: #0074d9; } - .sidebar-right .sidebar-header { - padding-left: 40px; } + background-color: #0074d9; +} +.leafsidebar-right .leafsidebar-header { + padding-left: 40px; +} -.sidebar-close { +.leafsidebar-close { position: absolute; top: 0; width: 40px; height: 40px; text-align: center; - cursor: pointer; } - .sidebar-left .sidebar-close { - right: 0; } - .sidebar-right .sidebar-close { - left: 0; } - -.sidebar-left ~ .sidebar-map { - margin-left: 40px; } - @media (min-width: 768px) { - .sidebar-left ~ .sidebar-map { - margin-left: 0; } } + cursor: pointer; +} +.leafsidebar-left .leafsidebar-close { + right: 0; +} +.leafsidebar-right .leafsidebar-close { + left: 0; +} -.sidebar-right ~ .sidebar-map { - margin-right: 40px; } - @media (min-width: 768px) { - .sidebar-right ~ .sidebar-map { - margin-right: 0; } } +.sidebar-map .leaflet-left { + left: 40px !important; +} +.sidebar-map .leaflet-right { + right: 40px !important; +} -.sidebar { - box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65); } - .sidebar.leaflet-touch { - box-shadow: none; - border-right: 2px solid rgba(0, 0, 0, 0.2); } - @media (min-width: 768px) { - .sidebar { - border-radius: 4px; } - .sidebar.leaflet-touch { - border: 2px solid rgba(0, 0, 0, 0.2); } } +.leafsidebar.leaflet-touch { + box-shadow: none; +} -@media (min-width: 768px) { - .sidebar-left ~ .sidebar-map .leaflet-left { - transition: left 500ms; } } @media (min-width: 768px) and (max-width: 991px) { - .sidebar-left ~ .sidebar-map .leaflet-left { - left: 315px; } } - + .leafsidebar { + width: 305px; + } +} @media (min-width: 992px) and (max-width: 1199px) { - .sidebar-left ~ .sidebar-map .leaflet-left { - left: 400px; } } - + .leafsidebar { + width: 390px; + } +} @media (min-width: 1200px) { - .sidebar-left ~ .sidebar-map .leaflet-left { - left: 470px; } } - -@media (min-width: 768px) { - .sidebar-left.collapsed ~ .sidebar-map .leaflet-left { - left: 50px; } } - -@media (min-width: 768px) { - .sidebar-right ~ .sidebar-map .leaflet-right { - transition: right 500ms; } } + .leafsidebar { + width: 460px; + } +} @media (min-width: 768px) and (max-width: 991px) { - .sidebar-right ~ .sidebar-map .leaflet-right { - right: 315px; } } - + .leafsidebar-pane { + min-width: 265px; + } +} @media (min-width: 992px) and (max-width: 1199px) { - .sidebar-right ~ .sidebar-map .leaflet-right { - right: 400px; } } - + .leafsidebar-pane { + min-width: 350px; + } +} @media (min-width: 1200px) { - .sidebar-right ~ .sidebar-map .leaflet-right { - right: 470px; } } + .leafsidebar-pane { + min-width: 420px; + } +} @media (min-width: 768px) { - .sidebar-right.collapsed ~ .sidebar-map .leaflet-right { - right: 50px; } } + .leafsidebar { + border-radius: 4px; + } + .leafsidebar.leaflet-touch { + border: 1px solid rgba(0, 0, 0, 0.2); + } + + .sidebar-map .leaflet-control-container .leaflet-left { + transition: left 500ms; + } + .sidebar-map .leaflet-control-container .leaflet-right { + transition: right 500ms; + } + + .sidebar-map .leaflet-left.extended { + left: 460px; + } + .sidebar-map .leaflet-right.extended { + right: 460px; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .sidebar-map .leaflet-left.extended { + left: 305px; + } + .sidebar-map .leaflet-right.extended { + right: 305px; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .sidebar-map .leaflet-left.extended { + left: 390px; + } + .sidebar-map .leaflet-right.extended { + right: 390px; + } +} +@media (min-width: 1200px) { + .sidebar-map .leaflet-left.extended { + left: 460px; + } + .sidebar-map .leaflet-right.extended { + right: 460px; + } +} diff --git a/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar.js b/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar.js index 01060fcc..c8c5581e 100644 --- a/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar.js +++ b/inst/htmlwidgets/lfx-sidebar/leaflet-sidebar.js @@ -25,7 +25,7 @@ L.Control.Sidebar = L.Control.extend(/** @lends L.Control.Sidebar.prototype */ { this._sidebar = L.DomUtil.get(id); // Attach .sidebar-left/right class - L.DomUtil.addClass(this._sidebar, 'sidebar-' + this.options.position); + L.DomUtil.addClass(this._sidebar, 'leafsidebar-' + this.options.position); // Attach touch styling if necessary if (L.Browser.touch) @@ -35,26 +35,26 @@ L.Control.Sidebar = L.Control.extend(/** @lends L.Control.Sidebar.prototype */ { for (i = this._sidebar.children.length - 1; i >= 0; i--) { child = this._sidebar.children[i]; if (child.tagName == 'DIV' && - L.DomUtil.hasClass(child, 'sidebar-content')) + L.DomUtil.hasClass(child, 'leafsidebar-content')) this._container = child; } // Find sidebar ul.sidebar-tabs > li, sidebar .sidebar-tabs > ul > li - this._tabitems = this._sidebar.querySelectorAll('ul.sidebar-tabs > li, .sidebar-tabs > ul > li'); + this._tabitems = this._sidebar.querySelectorAll('ul.leafsidebar-tabs > li, .leafsidebar-tabs > ul > li'); for (i = this._tabitems.length - 1; i >= 0; i--) { this._tabitems[i]._sidebar = this; } - // Find sidebar > div.sidebar-content > div.sidebar-pane + // Find sidebar > div.sidebar-content > div.leafsidebar-pane this._panes = []; this._closeButtons = []; for (i = this._container.children.length - 1; i >= 0; i--) { child = this._container.children[i]; if (child.tagName == 'DIV' && - L.DomUtil.hasClass(child, 'sidebar-pane')) { + L.DomUtil.hasClass(child, 'leafsidebar-pane')) { this._panes.push(child); - var closeButtons = child.querySelectorAll('.sidebar-close'); + var closeButtons = child.querySelectorAll('.leafsidebar-close'); for (var j = 0, len = closeButtons.length; j < len; j++) this._closeButtons.push(closeButtons[j]); } @@ -156,6 +156,8 @@ L.Control.Sidebar = L.Control.extend(/** @lends L.Control.Sidebar.prototype */ { // open sidebar (if necessary) if (L.DomUtil.hasClass(this._sidebar, 'collapsed')) { this.fire('opening'); + var pos = L.DomUtil.hasClass(this._sidebar, 'leafsidebar-left') ? '.leaflet-left' : '.leaflet-right'; + $(pos).addClass('extended'); L.DomUtil.removeClass(this._sidebar, 'collapsed'); } @@ -176,6 +178,8 @@ L.Control.Sidebar = L.Control.extend(/** @lends L.Control.Sidebar.prototype */ { // close sidebar if (!L.DomUtil.hasClass(this._sidebar, 'collapsed')) { this.fire('closing'); + var pos = L.DomUtil.hasClass(this._sidebar, 'leafsidebar-left') ? '.leaflet-left' : '.leaflet-right'; + $(pos).removeClass('extended'); L.DomUtil.addClass(this._sidebar, 'collapsed'); } diff --git a/inst/htmlwidgets/lfx-sidebar/leaflet.sidebar.binding.js b/inst/htmlwidgets/lfx-sidebar/leaflet.sidebar.binding.js deleted file mode 100644 index 7f9ef833..00000000 --- a/inst/htmlwidgets/lfx-sidebar/leaflet.sidebar.binding.js +++ /dev/null @@ -1,59 +0,0 @@ -/* global LeafletWidget, $, L */ -LeafletWidget.methods.addSidebar = function(id, options) { - (function(){ - var map = this; - if (map.sidebar) { - map.sidebar.remove(); - delete map.sidebar; - } - - // Add css class ("sidebar-map") to map - map._container.classList.add("sidebar-map"); - - // Change CSS if fit = true. - if (options && options.fit === true) { - var mapheight = (parseInt(map._container.style.height.replace(/px/,"")) + 3)+"px"; - $(".sidebar").css("height", mapheight); - $(".sidebar").css("top", map._container.offsetTop - 2); - if (options.position === "right") { - var right = 100 - map._container.parentElement.style.width.match(/\d*/im)[0]; - $(".sidebar").css("right", (right)+"%"); - } else { - var left = 100 - map._container.parentElement.style.width.match(/\d*/im)[0]; - $(".sidebar").css("left", (left)+"%"); - } - } - - // Extent onClick method to trigger "shown" event, otherwise Shiny-Inputs/Outputs are not reactive - L.Control.Sidebar = L.Control.Sidebar.extend({ - _onClick: function() { - if (L.DomUtil.hasClass(this, 'active')) { - this._sidebar.close(); - } else if (!L.DomUtil.hasClass(this, 'disabled')) { - this._sidebar.open(this.querySelector('a').hash.slice(1)); - $(this.firstElementChild.attributes.href.nodeValue).trigger("shown"); - } - } - }); - - map.sidebar = L.control.sidebar(id, options); - map.controls.add(map.sidebar); - - }).call(this); -}; - -LeafletWidget.methods.removeSidebar = function() { - var map = this; - if (map.sidebar) { - $(".sidebar").remove(); - delete map.sidebar; - } -}; - -LeafletWidget.methods.closeSidebar = function() { - this.sidebar.close(); -}; - -LeafletWidget.methods.openSidebar = function(id) { - this.sidebar.open(id); -}; diff --git a/inst/htmlwidgets/lfx-spin/leaflet.spin-binding.js b/inst/htmlwidgets/lfx-spin/leaflet.spin-binding.js new file mode 100644 index 00000000..96827c68 --- /dev/null +++ b/inst/htmlwidgets/lfx-spin/leaflet.spin-binding.js @@ -0,0 +1,5 @@ +LeafletWidget.methods.spinner = function( + state, options) { + var map = this; + map.spin(state, options); + }; diff --git a/inst/htmlwidgets/lfx-spin/leaflet.spin.js b/inst/htmlwidgets/lfx-spin/leaflet.spin.js new file mode 100644 index 00000000..34116db6 --- /dev/null +++ b/inst/htmlwidgets/lfx-spin/leaflet.spin.js @@ -0,0 +1,72 @@ +(function (factory, window) { + // define an AMD module that relies on 'leaflet' + if (typeof define === 'function' && define.amd) { + define(['leaflet','spin.js'], function (L, Spinner) { + factory(L, Spinner); + }); + + // define a Common JS module that relies on 'leaflet' + } else if (typeof exports === 'object') { + module.exports = function (L, Spinner) { + if (L === undefined) { + L = require('leaflet'); + } + if (Spinner === undefined) { + Spinner = require('spin.js'); + } + factory(L, Spinner); + return L; + }; + // attach your plugin to the global 'L' variable + } else if (typeof window !== 'undefined' && window.L && window.Spinner) { + factory(window.L, window.Spinner); + } +}(function leafletSpinFactory(L, Spinner) { + var SpinMapMixin = { + spin: function (state, options) { + if (!!state) { + // start spinning ! + if (!this._spinner) { + this._spinner = new Spinner(options) + .spin(this._container); + this._spinning = 0; + } + this._spinning++; + } + else { + this._spinning--; + if (this._spinning <= 0) { + // end spinning ! + if (this._spinner) { + this._spinner.stop(); + this._spinner = null; + } + } + } + } + }; + + var SpinMapInitHook = function () { + this.on('layeradd', function (e) { + // If added layer is currently loading, spin ! + if (e.layer.loading) this.spin(true); + if (typeof e.layer.on !== 'function') return; + e.layer.on('data:loading', function () { + this.spin(true); + }, this); + e.layer.on('data:loaded', function () { + this.spin(false); + }, this); + }, this); + this.on('layerremove', function (e) { + // Clean-up + if (e.layer.loading) this.spin(false); + if (typeof e.layer.on !== 'function') return; + e.layer.off('data:loaded'); + e.layer.off('data:loading'); + }, this); + }; + + L.Map.include(SpinMapMixin); + L.Map.addInitHook(SpinMapInitHook); +}, window)); diff --git a/inst/htmlwidgets/lfx-spin/leaflet.spin.min.js b/inst/htmlwidgets/lfx-spin/leaflet.spin.min.js new file mode 100644 index 00000000..6fa811c0 --- /dev/null +++ b/inst/htmlwidgets/lfx-spin/leaflet.spin.min.js @@ -0,0 +1,2 @@ +!function(n,i){"function"==typeof define&&define.amd?define(["leaflet","spin.js"],function(i,t){n(i,t)}):"object"==typeof exports?module.exports=function(i,t){return void 0===i&&(i=require("leaflet")),void 0===t&&(t=require("spin.js")),n(i,t),i}:void 0!==i&&i.L&&i.Spinner&&n(i.L,i.Spinner)}(function(n,i){var t={spin:function(n,t){n?(this._spinner||(this._spinner=new i(t).spin(this._container),this._spinning=0),this._spinning++):--this._spinning<=0&&this._spinner&&(this._spinner.stop(),this._spinner=null)}},e=function(){this.on("layeradd",function(n){n.layer.loading&&this.spin(!0),"function"==typeof n.layer.on&&(n.layer.on("data:loading",function(){this.spin(!0)},this),n.layer.on("data:loaded",function(){this.spin(!1)},this))},this),this.on("layerremove",function(n){n.layer.loading&&this.spin(!1),"function"==typeof n.layer.on&&(n.layer.off("data:loaded"),n.layer.off("data:loading"))},this)} +n.Map.include(t),n.Map.addInitHook(e)},window) diff --git a/inst/htmlwidgets/lfx-spin/spin.css b/inst/htmlwidgets/lfx-spin/spin.css new file mode 100644 index 00000000..dea4386d --- /dev/null +++ b/inst/htmlwidgets/lfx-spin/spin.css @@ -0,0 +1,38 @@ +@keyframes spinner-line-fade-more { + 0%, 100% { + opacity: 0; /* minimum opacity */ + } + 1% { + opacity: 1; + } +} + +@keyframes spinner-line-fade-quick { + 0%, 39%, 100% { + opacity: 0.25; /* minimum opacity */ + } + 40% { + opacity: 1; + } +} + +@keyframes spinner-line-fade-default { + 0%, 100% { + opacity: 0.22; /* minimum opacity */ + } + 1% { + opacity: 1; + } +} + +@keyframes spinner-line-shrink { + 0%, 25%, 100% { + /* minimum scale and opacity */ + transform: scale(0.5); + opacity: 0.25; + } + 26% { + transform: scale(1); + opacity: 1; + } +} \ No newline at end of file diff --git a/inst/htmlwidgets/lfx-spin/spin.js b/inst/htmlwidgets/lfx-spin/spin.js new file mode 100644 index 00000000..1a3258d1 --- /dev/null +++ b/inst/htmlwidgets/lfx-spin/spin.js @@ -0,0 +1,377 @@ +/** + * Copyright (c) 2011-2014 Felix Gnass + * Licensed under the MIT license + * http://spin.js.org/ + * + * Example: + var opts = { + lines: 12 // The number of lines to draw + , length: 7 // The length of each line + , width: 5 // The line thickness + , radius: 10 // The radius of the inner circle + , scale: 1.0 // Scales overall size of the spinner + , corners: 1 // Roundness (0..1) + , color: '#000' // #rgb or #rrggbb + , opacity: 1/4 // Opacity of the lines + , rotate: 0 // Rotation offset + , direction: 1 // 1: clockwise, -1: counterclockwise + , speed: 1 // Rounds per second + , trail: 100 // Afterglow percentage + , fps: 20 // Frames per second when using setTimeout() + , zIndex: 2e9 // Use a high z-index by default + , className: 'spinner' // CSS class to assign to the element + , top: '50%' // center vertically + , left: '50%' // center horizontally + , shadow: false // Whether to render a shadow + , hwaccel: false // Whether to use hardware acceleration (might be buggy) + , position: 'absolute' // Element positioning + } + var target = document.getElementById('foo') + var spinner = new Spinner(opts).spin(target) + */ +;(function (root, factory) { + + /* CommonJS */ + if (typeof module == 'object' && module.exports) module.exports = factory() + + /* AMD module */ + else if (typeof define == 'function' && define.amd) define(factory) + + /* Browser global */ + else root.Spinner = factory() +}(this, function () { + "use strict" + + var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */ + , animations = {} /* Animation rules keyed by their name */ + , useCssAnimations /* Whether to use CSS animations or setTimeout */ + , sheet /* A stylesheet to hold the @keyframe or VML rules. */ + + /** + * Utility function to create elements. If no tag name is given, + * a DIV is created. Optionally properties can be passed. + */ + function createEl (tag, prop) { + var el = document.createElement(tag || 'div') + , n + + for (n in prop) el[n] = prop[n] + return el + } + + /** + * Appends children and returns the parent. + */ + function ins (parent /* child1, child2, ...*/) { + for (var i = 1, n = arguments.length; i < n; i++) { + parent.appendChild(arguments[i]) + } + + return parent + } + + /** + * Creates an opacity keyframe animation rule and returns its name. + * Since most mobile Webkits have timing issues with animation-delay, + * we create separate rules for each line/segment. + */ + function addAnimation (alpha, trail, i, lines) { + var name = ['opacity', trail, ~~(alpha * 100), i, lines].join('-') + , start = 0.01 + i/lines * 100 + , z = Math.max(1 - (1-alpha) / trail * (100-start), alpha) + , prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase() + , pre = prefix && '-' + prefix + '-' || '' + + if (!animations[name]) { + sheet.insertRule( + '@' + pre + 'keyframes ' + name + '{' + + '0%{opacity:' + z + '}' + + start + '%{opacity:' + alpha + '}' + + (start+0.01) + '%{opacity:1}' + + (start+trail) % 100 + '%{opacity:' + alpha + '}' + + '100%{opacity:' + z + '}' + + '}', sheet.cssRules.length) + + animations[name] = 1 + } + + return name + } + + /** + * Tries various vendor prefixes and returns the first supported property. + */ + function vendor (el, prop) { + var s = el.style + , pp + , i + + prop = prop.charAt(0).toUpperCase() + prop.slice(1) + if (s[prop] !== undefined) return prop + for (i = 0; i < prefixes.length; i++) { + pp = prefixes[i]+prop + if (s[pp] !== undefined) return pp + } + } + + /** + * Sets multiple style properties at once. + */ + function css (el, prop) { + for (var n in prop) { + el.style[vendor(el, n) || n] = prop[n] + } + + return el + } + + /** + * Fills in default values. + */ + function merge (obj) { + for (var i = 1; i < arguments.length; i++) { + var def = arguments[i] + for (var n in def) { + if (obj[n] === undefined) obj[n] = def[n] + } + } + return obj + } + + /** + * Returns the line color from the given string or array. + */ + function getColor (color, idx) { + return typeof color == 'string' ? color : color[idx % color.length] + } + + // Built-in defaults + + var defaults = { + lines: 12 // The number of lines to draw + , length: 7 // The length of each line + , width: 5 // The line thickness + , radius: 10 // The radius of the inner circle + , scale: 1.0 // Scales overall size of the spinner + , corners: 1 // Roundness (0..1) + , color: '#000' // #rgb or #rrggbb + , opacity: 1/4 // Opacity of the lines + , rotate: 0 // Rotation offset + , direction: 1 // 1: clockwise, -1: counterclockwise + , speed: 1 // Rounds per second + , trail: 100 // Afterglow percentage + , fps: 20 // Frames per second when using setTimeout() + , zIndex: 2e9 // Use a high z-index by default + , className: 'spinner' // CSS class to assign to the element + , top: '50%' // center vertically + , left: '50%' // center horizontally + , shadow: false // Whether to render a shadow + , hwaccel: false // Whether to use hardware acceleration (might be buggy) + , position: 'absolute' // Element positioning + } + + /** The constructor */ + function Spinner (o) { + this.opts = merge(o || {}, Spinner.defaults, defaults) + } + + // Global defaults that override the built-ins: + Spinner.defaults = {} + + merge(Spinner.prototype, { + /** + * Adds the spinner to the given target element. If this instance is already + * spinning, it is automatically removed from its previous target b calling + * stop() internally. + */ + spin: function (target) { + this.stop() + + var self = this + , o = self.opts + , el = self.el = createEl(null, {className: o.className}) + + css(el, { + position: o.position + , width: 0 + , zIndex: o.zIndex + , left: o.left + , top: o.top + }) + + if (target) { + target.insertBefore(el, target.firstChild || null) + } + + el.setAttribute('role', 'progressbar') + self.lines(el, self.opts) + + if (!useCssAnimations) { + // No CSS animation support, use setTimeout() instead + var i = 0 + , start = (o.lines - 1) * (1 - o.direction) / 2 + , alpha + , fps = o.fps + , f = fps / o.speed + , ostep = (1 - o.opacity) / (f * o.trail / 100) + , astep = f / o.lines + + ;(function anim () { + i++ + for (var j = 0; j < o.lines; j++) { + alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity) + + self.opacity(el, j * o.direction + start, alpha, o) + } + self.timeout = self.el && setTimeout(anim, ~~(1000 / fps)) + })() + } + return self + } + + /** + * Stops and removes the Spinner. + */ + , stop: function () { + var el = this.el + if (el) { + clearTimeout(this.timeout) + if (el.parentNode) el.parentNode.removeChild(el) + this.el = undefined + } + return this + } + + /** + * Internal method that draws the individual lines. Will be overwritten + * in VML fallback mode below. + */ + , lines: function (el, o) { + var i = 0 + , start = (o.lines - 1) * (1 - o.direction) / 2 + , seg + + function fill (color, shadow) { + return css(createEl(), { + position: 'absolute' + , width: o.scale * (o.length + o.width) + 'px' + , height: o.scale * o.width + 'px' + , background: color + , boxShadow: shadow + , transformOrigin: 'left' + , transform: 'rotate(' + ~~(360/o.lines*i + o.rotate) + 'deg) translate(' + o.scale*o.radius + 'px' + ',0)' + , borderRadius: (o.corners * o.scale * o.width >> 1) + 'px' + }) + } + + for (; i < o.lines; i++) { + seg = css(createEl(), { + position: 'absolute' + , top: 1 + ~(o.scale * o.width / 2) + 'px' + , transform: o.hwaccel ? 'translate3d(0,0,0)' : '' + , opacity: o.opacity + , animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1 / o.speed + 's linear infinite' + }) + + if (o.shadow) ins(seg, css(fill('#000', '0 0 4px #000'), {top: '2px'})) + ins(el, ins(seg, fill(getColor(o.color, i), '0 0 1px rgba(0,0,0,.1)'))) + } + return el + } + + /** + * Internal method that adjusts the opacity of a single line. + * Will be overwritten in VML fallback mode below. + */ + , opacity: function (el, i, val) { + if (i < el.childNodes.length) el.childNodes[i].style.opacity = val + } + + }) + + + function initVML () { + + /* Utility function to create a VML tag */ + function vml (tag, attr) { + return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr) + } + + // No CSS transforms but VML support, add a CSS rule for VML elements: + sheet.addRule('.spin-vml', 'behavior:url(#default#VML)') + + Spinner.prototype.lines = function (el, o) { + var r = o.scale * (o.length + o.width) + , s = o.scale * 2 * r + + function grp () { + return css( + vml('group', { + coordsize: s + ' ' + s + , coordorigin: -r + ' ' + -r + }) + , { width: s, height: s } + ) + } + + var margin = -(o.width + o.length) * o.scale * 2 + 'px' + , g = css(grp(), {position: 'absolute', top: margin, left: margin}) + , i + + function seg (i, dx, filter) { + ins( + g + , ins( + css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}) + , ins( + css( + vml('roundrect', {arcsize: o.corners}) + , { width: r + , height: o.scale * o.width + , left: o.scale * o.radius + , top: -o.scale * o.width >> 1 + , filter: filter + } + ) + , vml('fill', {color: getColor(o.color, i), opacity: o.opacity}) + , vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change + ) + ) + ) + } + + if (o.shadow) + for (i = 1; i <= o.lines; i++) { + seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)') + } + + for (i = 1; i <= o.lines; i++) seg(i) + return ins(el, g) + } + + Spinner.prototype.opacity = function (el, i, val, o) { + var c = el.firstChild + o = o.shadow && o.lines || 0 + if (c && i + o < c.childNodes.length) { + c = c.childNodes[i + o]; c = c && c.firstChild; c = c && c.firstChild + if (c) c.opacity = val + } + } + } + + if (typeof document !== 'undefined') { + sheet = (function () { + var el = createEl('style', {type : 'text/css'}) + ins(document.getElementsByTagName('head')[0], el) + return el.sheet || el.styleSheet + }()) + + var probe = css(createEl('group'), {behavior: 'url(#default#VML)'}) + + if (!vendor(probe, 'transform') && probe.adj) initVML() + else useCssAnimations = vendor(probe, 'animation') + } + + return Spinner + +})); diff --git a/inst/htmlwidgets/lfx-spin/spin.min.js b/inst/htmlwidgets/lfx-spin/spin.min.js new file mode 100644 index 00000000..965e8729 --- /dev/null +++ b/inst/htmlwidgets/lfx-spin/spin.min.js @@ -0,0 +1,2 @@ +// http://spin.js.org/#v2.3.2 +!function(a,b){"object"==typeof module&&module.exports?module.exports=b():"function"==typeof define&&define.amd?define(b):a.Spinner=b()}(this,function(){"use strict";function a(a,b){var c,d=document.createElement(a||"div");for(c in b)d[c]=b[c];return d}function b(a){for(var b=1,c=arguments.length;c>b;b++)a.appendChild(arguments[b]);return a}function c(a,b,c,d){var e=["opacity",b,~~(100*a),c,d].join("-"),f=.01+c/d*100,g=Math.max(1-(1-a)/b*(100-f),a),h=j.substring(0,j.indexOf("Animation")).toLowerCase(),i=h&&"-"+h+"-"||"";return m[e]||(k.insertRule("@"+i+"keyframes "+e+"{0%{opacity:"+g+"}"+f+"%{opacity:"+a+"}"+(f+.01)+"%{opacity:1}"+(f+b)%100+"%{opacity:"+a+"}100%{opacity:"+g+"}}",k.cssRules.length),m[e]=1),e}function d(a,b){var c,d,e=a.style;if(b=b.charAt(0).toUpperCase()+b.slice(1),void 0!==e[b])return b;for(d=0;d',c)}k.addRule(".spin-vml","behavior:url(#default#VML)"),h.prototype.lines=function(a,d){function f(){return e(c("group",{coordsize:k+" "+k,coordorigin:-j+" "+-j}),{width:k,height:k})}function h(a,h,i){b(m,b(e(f(),{rotation:360/d.lines*a+"deg",left:~~h}),b(e(c("roundrect",{arcsize:d.corners}),{width:j,height:d.scale*d.width,left:d.scale*d.radius,top:-d.scale*d.width>>1,filter:i}),c("fill",{color:g(d.color,a),opacity:d.opacity}),c("stroke",{opacity:0}))))}var i,j=d.scale*(d.length+d.width),k=2*d.scale*j,l=-(d.width+d.length)*d.scale*2+"px",m=e(f(),{position:"absolute",top:l,left:l});if(d.shadow)for(i=1;i<=d.lines;i++)h(i,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(i=1;i<=d.lines;i++)h(i);return b(a,m)},h.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+d>1)+"px"})}for(var i,k=0,l=(f.lines-1)*(1-f.direction)/2;k 0 ? floor : ceil)(it); -}; - -// 7.1.15 ToLength - -var min = Math.min; -var _toLength = function (it) { - return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; - -var max = Math.max; -var min$1 = Math.min; -var _toAbsoluteIndex = function (index, length) { - index = _toInteger(index); - return index < 0 ? max(index + length, 0) : min$1(index, length); -}; - -// false -> Array#indexOf -// true -> Array#includes - - - -var _arrayIncludes = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = _toIobject($this); - var length = _toLength(O.length); - var index = _toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) if (IS_INCLUDES || index in O) { - if (O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -var shared = _shared('keys'); - -var _sharedKey = function (key) { - return shared[key] || (shared[key] = _uid(key)); -}; - -var arrayIndexOf = _arrayIncludes(false); -var IE_PROTO = _sharedKey('IE_PROTO'); - -var _objectKeysInternal = function (object, names) { - var O = _toIobject(object); - var i = 0; - var result = []; - var key; - for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (_has(O, key = names[i++])) { - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; - -// IE 8- don't enum bug keys -var _enumBugKeys = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); - -// 19.1.2.14 / 15.2.3.14 Object.keys(O) - - - -var _objectKeys = Object.keys || function keys(O) { - return _objectKeysInternal(O, _enumBugKeys); -}; - -var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) { - _anObject(O); - var keys = _objectKeys(Properties); - var length = keys.length; - var i = 0; - var P; - while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]); - return O; -}; - -var document$2 = _global.document; -var _html = document$2 && document$2.documentElement; - -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) - - - -var IE_PROTO$1 = _sharedKey('IE_PROTO'); -var Empty = function () { /* empty */ }; -var PROTOTYPE$1 = 'prototype'; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = _domCreate('iframe'); - var i = _enumBugKeys.length; - var lt = '<'; - var gt = '>'; - var iframeDocument; - iframe.style.display = 'none'; - _html.appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]]; - return createDict(); -}; - -var _objectCreate = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - Empty[PROTOTYPE$1] = _anObject(O); - result = new Empty(); - Empty[PROTOTYPE$1] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO$1] = O; - } else result = createDict(); - return Properties === undefined ? result : _objectDps(result, Properties); -}; - -var def = _objectDp.f; - -var TAG = _wks('toStringTag'); - -var _setToStringTag = function (it, tag, stat) { - if (it && !_has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); -}; - -var IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -_hide(IteratorPrototype, _wks('iterator'), function () { return this; }); - -var _iterCreate = function (Constructor, NAME, next) { - Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) }); - _setToStringTag(Constructor, NAME + ' Iterator'); -}; - -// 7.1.13 ToObject(argument) - -var _toObject = function (it) { - return Object(_defined(it)); -}; - -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) - - -var IE_PROTO$2 = _sharedKey('IE_PROTO'); -var ObjectProto = Object.prototype; - -var _objectGpo = Object.getPrototypeOf || function (O) { - O = _toObject(O); - if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2]; - if (typeof O.constructor == 'function' && O instanceof O.constructor) { - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; - -var ITERATOR = _wks('iterator'); -var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` -var FF_ITERATOR = '@@iterator'; -var KEYS = 'keys'; -var VALUES = 'values'; - -var returnThis = function () { return this; }; - -var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { - _iterCreate(Constructor, NAME, next); - var getMethod = function (kind) { - if (!BUGGY && kind in proto) return proto[kind]; - switch (kind) { - case KEYS: return function keys() { return new Constructor(this, kind); }; - case VALUES: return function values() { return new Constructor(this, kind); }; - } return function entries() { return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator'; - var DEF_VALUES = DEFAULT == VALUES; - var VALUES_BUG = false; - var proto = Base.prototype; - var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; - var $default = $native || getMethod(DEFAULT); - var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; - var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; - var methods, key, IteratorPrototype; - // Fix native - if ($anyNative) { - IteratorPrototype = _objectGpo($anyNative.call(new Base())); - if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { - // Set @@toStringTag to native iterators - _setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if (typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis); - } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if (DEF_VALUES && $native && $native.name !== VALUES) { - VALUES_BUG = true; - $default = function values() { return $native.call(this); }; - } - // Define iterator - if (BUGGY || VALUES_BUG || !proto[ITERATOR]) { - _hide(proto, ITERATOR, $default); - } - // Plug for library - _iterators[NAME] = $default; - _iterators[TAG] = returnThis; - if (DEFAULT) { - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if (FORCED) for (key in methods) { - if (!(key in proto)) _redefine(proto, key, methods[key]); - } else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; - -// 22.1.3.4 Array.prototype.entries() -// 22.1.3.13 Array.prototype.keys() -// 22.1.3.29 Array.prototype.values() -// 22.1.3.30 Array.prototype[@@iterator]() -var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) { - this._t = _toIobject(iterated); // target - this._i = 0; // next index - this._k = kind; // kind -// 22.1.5.2.1 %ArrayIteratorPrototype%.next() -}, function () { - var O = this._t; - var kind = this._k; - var index = this._i++; - if (!O || index >= O.length) { - this._t = undefined; - return _iterStep(1); - } - if (kind == 'keys') return _iterStep(0, index); - if (kind == 'values') return _iterStep(0, O[index]); - return _iterStep(0, [index, O[index]]); -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) -_iterators.Arguments = _iterators.Array; - -_addToUnscopables('keys'); -_addToUnscopables('values'); -_addToUnscopables('entries'); - -var ITERATOR$1 = _wks('iterator'); -var TO_STRING_TAG = _wks('toStringTag'); -var ArrayValues = _iterators.Array; - -var DOMIterables = { - CSSRuleList: true, // TODO: Not spec compliant, should be false. - CSSStyleDeclaration: false, - CSSValueList: false, - ClientRectList: false, - DOMRectList: false, - DOMStringList: false, - DOMTokenList: true, - DataTransferItemList: false, - FileList: false, - HTMLAllCollection: false, - HTMLCollection: false, - HTMLFormElement: false, - HTMLSelectElement: false, - MediaList: true, // TODO: Not spec compliant, should be false. - MimeTypeArray: false, - NamedNodeMap: false, - NodeList: true, - PaintRequestList: false, - Plugin: false, - PluginArray: false, - SVGLengthList: false, - SVGNumberList: false, - SVGPathSegList: false, - SVGPointList: false, - SVGStringList: false, - SVGTransformList: false, - SourceBufferList: false, - StyleSheetList: true, // TODO: Not spec compliant, should be false. - TextTrackCueList: false, - TextTrackList: false, - TouchList: false -}; - -for (var collections = _objectKeys(DOMIterables), i = 0; i < collections.length; i++) { - var NAME = collections[i]; - var explicit = DOMIterables[NAME]; - var Collection = _global[NAME]; - var proto = Collection && Collection.prototype; - var key; - if (proto) { - if (!proto[ITERATOR$1]) _hide(proto, ITERATOR$1, ArrayValues); - if (!proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME); - _iterators[NAME] = ArrayValues; - if (explicit) for (key in es6_array_iterator) if (!proto[key]) _redefine(proto, key, es6_array_iterator[key], true); - } -} - -var f$1 = Object.getOwnPropertySymbols; - -var _objectGops = { - f: f$1 -}; - -var f$2 = {}.propertyIsEnumerable; - -var _objectPie = { - f: f$2 -}; - -// 19.1.2.1 Object.assign(target, source, ...) - - - - - -var $assign = Object.assign; - -// should work with symbols and should have deterministic property order (V8 bug) -var _objectAssign = !$assign || _fails(function () { - var A = {}; - var B = {}; - // eslint-disable-next-line no-undef - var S = Symbol(); - var K = 'abcdefghijklmnopqrst'; - A[S] = 7; - K.split('').forEach(function (k) { B[k] = k; }); - return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; -}) ? function assign(target, source) { // eslint-disable-line no-unused-vars - var T = _toObject(target); - var aLen = arguments.length; - var index = 1; - var getSymbols = _objectGops.f; - var isEnum = _objectPie.f; - while (aLen > index) { - var S = _iobject(arguments[index++]); - var keys = getSymbols ? _objectKeys(S).concat(getSymbols(S)) : _objectKeys(S); - var length = keys.length; - var j = 0; - var key; - while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; - } return T; -} : $assign; - -// 19.1.3.1 Object.assign(target, source) - - -_export(_export.S + _export.F, 'Object', { assign: _objectAssign }); - -/*jshint worker: true*/ -// Mark thread as main or worker -var Thread = {}; - -try { - if (window instanceof Window && window.document instanceof HTMLDocument) { - // jshint ignore:line - Thread.is_worker = false; - Thread.is_main = true; - } -} catch (e) { - Thread.is_worker = true; - Thread.is_main = false; // Patch for 3rd party libs that require these globals to be present. Specifically, FontFaceObserver. - // Brittle solution but allows that library to load on worker threads. - - self.window = { - document: {} - }; - self.document = self.window.document; -} - -// true -> String#at -// false -> String#codePointAt -var _stringAt = function (TO_STRING) { - return function (that, pos) { - var s = String(_defined(that)); - var i = _toInteger(pos); - var l = s.length; - var a, b; - if (i < 0 || i >= l) return TO_STRING ? '' : undefined; - a = s.charCodeAt(i); - return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff - ? TO_STRING ? s.charAt(i) : a - : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; - }; -}; - -var at = _stringAt(true); - - // `AdvanceStringIndex` abstract operation -// https://tc39.github.io/ecma262/#sec-advancestringindex -var _advanceStringIndex = function (S, index, unicode) { - return index + (unicode ? at(S, index).length : 1); -}; - -// getting tag from 19.1.3.6 Object.prototype.toString() - -var TAG$1 = _wks('toStringTag'); -// ES3 wrong here -var ARG = _cof(function () { return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (e) { /* empty */ } -}; - -var _classof = function (it) { - var O, T, B; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T - // builtinTag case - : ARG ? _cof(O) - // ES3 arguments fallback - : (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; -}; - -var builtinExec = RegExp.prototype.exec; - - // `RegExpExec` abstract operation -// https://tc39.github.io/ecma262/#sec-regexpexec -var _regexpExecAbstract = function (R, S) { - var exec = R.exec; - if (typeof exec === 'function') { - var result = exec.call(R, S); - if (typeof result !== 'object') { - throw new TypeError('RegExp exec method returned something other than an Object or null'); - } - return result; - } - if (_classof(R) !== 'RegExp') { - throw new TypeError('RegExp#exec called on incompatible receiver'); - } - return builtinExec.call(R, S); -}; - -// 21.2.5.3 get RegExp.prototype.flags - -var _flags = function () { - var that = _anObject(this); - var result = ''; - if (that.global) result += 'g'; - if (that.ignoreCase) result += 'i'; - if (that.multiline) result += 'm'; - if (that.unicode) result += 'u'; - if (that.sticky) result += 'y'; - return result; -}; - -var nativeExec = RegExp.prototype.exec; -// This always refers to the native implementation, because the -// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, -// which loads this file before patching the method. -var nativeReplace = String.prototype.replace; - -var patchedExec = nativeExec; - -var LAST_INDEX = 'lastIndex'; - -var UPDATES_LAST_INDEX_WRONG = (function () { - var re1 = /a/, - re2 = /b*/g; - nativeExec.call(re1, 'a'); - nativeExec.call(re2, 'a'); - return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; -})(); - -// nonparticipating capturing group, copied from es5-shim's String#split patch. -var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; - -var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; - -if (PATCH) { - patchedExec = function exec(str) { - var re = this; - var lastIndex, reCopy, match, i; - - if (NPCG_INCLUDED) { - reCopy = new RegExp('^' + re.source + '$(?!\\s)', _flags.call(re)); - } - if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; - - match = nativeExec.call(re, str); - - if (UPDATES_LAST_INDEX_WRONG && match) { - re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; - } - if (NPCG_INCLUDED && match && match.length > 1) { - // Fix browsers whose `exec` methods don't consistently return `undefined` - // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ - // eslint-disable-next-line no-loop-func - nativeReplace.call(match[0], reCopy, function () { - for (i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === undefined) match[i] = undefined; - } - }); - } - - return match; - }; -} - -var _regexpExec = patchedExec; - -_export({ - target: 'RegExp', - proto: true, - forced: _regexpExec !== /./.exec -}, { - exec: _regexpExec -}); - -var SPECIES = _wks('species'); - -var REPLACE_SUPPORTS_NAMED_GROUPS = !_fails(function () { - // #replace needs built-in support for named groups. - // #match works fine because it just return the exec results, even if it has - // a "grops" property. - var re = /./; - re.exec = function () { - var result = []; - result.groups = { a: '7' }; - return result; - }; - return ''.replace(re, '$') !== '7'; -}); - -var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () { - // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec - var re = /(?:)/; - var originalExec = re.exec; - re.exec = function () { return originalExec.apply(this, arguments); }; - var result = 'ab'.split(re); - return result.length === 2 && result[0] === 'a' && result[1] === 'b'; -})(); - -var _fixReWks = function (KEY, length, exec) { - var SYMBOL = _wks(KEY); - - var DELEGATES_TO_SYMBOL = !_fails(function () { - // String methods call symbol-named RegEp methods - var O = {}; - O[SYMBOL] = function () { return 7; }; - return ''[KEY](O) != 7; - }); - - var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !_fails(function () { - // Symbol-named RegExp methods call .exec - var execCalled = false; - var re = /a/; - re.exec = function () { execCalled = true; return null; }; - if (KEY === 'split') { - // RegExp[@@split] doesn't call the regex's exec method, but first creates - // a new one. We need to return the patched regex when creating the new one. - re.constructor = {}; - re.constructor[SPECIES] = function () { return re; }; - } - re[SYMBOL](''); - return !execCalled; - }) : undefined; - - if ( - !DELEGATES_TO_SYMBOL || - !DELEGATES_TO_EXEC || - (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || - (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) - ) { - var nativeRegExpMethod = /./[SYMBOL]; - var fns = exec( - _defined, - SYMBOL, - ''[KEY], - function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { - if (regexp.exec === _regexpExec) { - if (DELEGATES_TO_SYMBOL && !forceStringMethod) { - // The native String method already delegates to @@method (this - // polyfilled function), leasing to infinite recursion. - // We avoid it by directly calling the native @@method method. - return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; - } - return { done: true, value: nativeMethod.call(str, regexp, arg2) }; - } - return { done: false }; - } - ); - var strfn = fns[0]; - var rxfn = fns[1]; - - _redefine(String.prototype, KEY, strfn); - _hide(RegExp.prototype, SYMBOL, length == 2 - // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) - // 21.2.5.11 RegExp.prototype[@@split](string, limit) - ? function (string, arg) { return rxfn.call(string, this, arg); } - // 21.2.5.6 RegExp.prototype[@@match](string) - // 21.2.5.9 RegExp.prototype[@@search](string) - : function (string) { return rxfn.call(string, this); } - ); - } -}; - -var max$1 = Math.max; -var min$2 = Math.min; -var floor$1 = Math.floor; -var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; -var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; - -var maybeToString = function (it) { - return it === undefined ? it : String(it); -}; - -// @@replace logic -_fixReWks('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { - return [ - // `String.prototype.replace` method - // https://tc39.github.io/ecma262/#sec-string.prototype.replace - function replace(searchValue, replaceValue) { - var O = defined(this); - var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; - return fn !== undefined - ? fn.call(searchValue, O, replaceValue) - : $replace.call(String(O), searchValue, replaceValue); - }, - // `RegExp.prototype[@@replace]` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace - function (regexp, replaceValue) { - var res = maybeCallNative($replace, regexp, this, replaceValue); - if (res.done) return res.value; - - var rx = _anObject(regexp); - var S = String(this); - var functionalReplace = typeof replaceValue === 'function'; - if (!functionalReplace) replaceValue = String(replaceValue); - var global = rx.global; - if (global) { - var fullUnicode = rx.unicode; - rx.lastIndex = 0; - } - var results = []; - while (true) { - var result = _regexpExecAbstract(rx, S); - if (result === null) break; - results.push(result); - if (!global) break; - var matchStr = String(result[0]); - if (matchStr === '') rx.lastIndex = _advanceStringIndex(S, _toLength(rx.lastIndex), fullUnicode); - } - var accumulatedResult = ''; - var nextSourcePosition = 0; - for (var i = 0; i < results.length; i++) { - result = results[i]; - var matched = String(result[0]); - var position = max$1(min$2(_toInteger(result.index), S.length), 0); - var captures = []; - // NOTE: This is equivalent to - // captures = result.slice(1).map(maybeToString) - // but for some reason `nativeSlice.call(result, 1, result.length)` (called in - // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and - // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. - for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); - var namedCaptures = result.groups; - if (functionalReplace) { - var replacerArgs = [matched].concat(captures, position, S); - if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); - var replacement = String(replaceValue.apply(undefined, replacerArgs)); - } else { - replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); - } - if (position >= nextSourcePosition) { - accumulatedResult += S.slice(nextSourcePosition, position) + replacement; - nextSourcePosition = position + matched.length; - } - } - return accumulatedResult + S.slice(nextSourcePosition); - } - ]; - - // https://tc39.github.io/ecma262/#sec-getsubstitution - function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { - var tailPos = position + matched.length; - var m = captures.length; - var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; - if (namedCaptures !== undefined) { - namedCaptures = _toObject(namedCaptures); - symbols = SUBSTITUTION_SYMBOLS; - } - return $replace.call(replacement, symbols, function (match, ch) { - var capture; - switch (ch.charAt(0)) { - case '$': return '$'; - case '&': return matched; - case '`': return str.slice(0, position); - case "'": return str.slice(tailPos); - case '<': - capture = namedCaptures[ch.slice(1, -1)]; - break; - default: // \d\d? - var n = +ch; - if (n === 0) return match; - if (n > m) { - var f = floor$1(n / 10); - if (f === 0) return match; - if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); - return match; - } - capture = captures[n - 1]; - } - return capture === undefined ? '' : capture; - }); - } -}); - -var _strictMethod = function (method, arg) { - return !!method && _fails(function () { - // eslint-disable-next-line no-useless-call - arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null); - }); -}; - -var $sort = [].sort; -var test = [1, 2, 3]; - -_export(_export.P + _export.F * (_fails(function () { - // IE8- - test.sort(undefined); -}) || !_fails(function () { - // V8 bug - test.sort(null); - // Old WebKit -}) || !_strictMethod($sort)), 'Array', { - // 22.1.3.25 Array.prototype.sort(comparefn) - sort: function sort(comparefn) { - return comparefn === undefined - ? $sort.call(_toObject(this)) - : $sort.call(_toObject(this), _aFunction(comparefn)); - } -}); - -var _meta = createCommonjsModule(function (module) { -var META = _uid('meta'); - - -var setDesc = _objectDp.f; -var id = 0; -var isExtensible = Object.isExtensible || function () { - return true; -}; -var FREEZE = !_fails(function () { - return isExtensible(Object.preventExtensions({})); -}); -var setMeta = function (it) { - setDesc(it, META, { value: { - i: 'O' + ++id, // object ID - w: {} // weak collections IDs - } }); -}; -var fastKey = function (it, create) { - // return primitive with prefix - if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; - if (!_has(it, META)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return 'F'; - // not necessary to add metadata - if (!create) return 'E'; - // add missing metadata - setMeta(it); - // return object ID - } return it[META].i; -}; -var getWeak = function (it, create) { - if (!_has(it, META)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return true; - // not necessary to add metadata - if (!create) return false; - // add missing metadata - setMeta(it); - // return hash weak collections IDs - } return it[META].w; -}; -// add metadata on freeze-family methods calling -var onFreeze = function (it) { - if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it); - return it; -}; -var meta = module.exports = { - KEY: META, - NEED: false, - fastKey: fastKey, - getWeak: getWeak, - onFreeze: onFreeze -}; -}); -var _meta_1 = _meta.KEY; -var _meta_2 = _meta.NEED; -var _meta_3 = _meta.fastKey; -var _meta_4 = _meta.getWeak; -var _meta_5 = _meta.onFreeze; - -// 7.2.2 IsArray(argument) - -var _isArray = Array.isArray || function isArray(arg) { - return _cof(arg) == 'Array'; -}; - -// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) - -var hiddenKeys = _enumBugKeys.concat('length', 'prototype'); - -var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return _objectKeysInternal(O, hiddenKeys); -}; - -var _objectGopn = { - f: f$3 -}; - -var gOPD = Object.getOwnPropertyDescriptor; - -var f$4 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) { - O = _toIobject(O); - P = _toPrimitive(P, true); - if (_ie8DomDefine) try { - return gOPD(O, P); - } catch (e) { /* empty */ } - if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]); -}; - -var _objectGopd = { - f: f$4 -}; - -var $at = _stringAt(true); - -// 21.1.3.27 String.prototype[@@iterator]() -_iterDefine(String, 'String', function (iterated) { - this._t = String(iterated); // target - this._i = 0; // next index -// 21.1.5.2.1 %StringIteratorPrototype%.next() -}, function () { - var O = this._t; - var index = this._i; - var point; - if (index >= O.length) return { value: undefined, done: true }; - point = $at(O, index); - this._i += point.length; - return { value: point, done: false }; -}); - -var _anInstance = function (it, Constructor, name, forbiddenField) { - if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { - throw TypeError(name + ': incorrect invocation!'); - } return it; -}; - -// call something on iterator step with safe closing on error - -var _iterCall = function (iterator, fn, value, entries) { - try { - return entries ? fn(_anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch (e) { - var ret = iterator['return']; - if (ret !== undefined) _anObject(ret.call(iterator)); - throw e; - } -}; - -// check on default Array iterator - -var ITERATOR$2 = _wks('iterator'); -var ArrayProto$1 = Array.prototype; - -var _isArrayIter = function (it) { - return it !== undefined && (_iterators.Array === it || ArrayProto$1[ITERATOR$2] === it); -}; - -var ITERATOR$3 = _wks('iterator'); - -var core_getIteratorMethod = _core.getIteratorMethod = function (it) { - if (it != undefined) return it[ITERATOR$3] - || it['@@iterator'] - || _iterators[_classof(it)]; -}; - -var _forOf = createCommonjsModule(function (module) { -var BREAK = {}; -var RETURN = {}; -var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { - var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable); - var f = _ctx(fn, that, entries ? 2 : 1); - var index = 0; - var length, step, iterator, result; - if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); - // fast case for arrays with default iterator - if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) { - result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); - if (result === BREAK || result === RETURN) return result; - } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { - result = _iterCall(iterator, f, step.value, entries); - if (result === BREAK || result === RETURN) return result; - } -}; -exports.BREAK = BREAK; -exports.RETURN = RETURN; -}); - -// 7.3.20 SpeciesConstructor(O, defaultConstructor) - - -var SPECIES$1 = _wks('species'); -var _speciesConstructor = function (O, D) { - var C = _anObject(O).constructor; - var S; - return C === undefined || (S = _anObject(C)[SPECIES$1]) == undefined ? D : _aFunction(S); -}; - -// fast apply, http://jsperf.lnkit.com/fast-apply/5 -var _invoke = function (fn, args, that) { - var un = that === undefined; - switch (args.length) { - case 0: return un ? fn() - : fn.call(that); - case 1: return un ? fn(args[0]) - : fn.call(that, args[0]); - case 2: return un ? fn(args[0], args[1]) - : fn.call(that, args[0], args[1]); - case 3: return un ? fn(args[0], args[1], args[2]) - : fn.call(that, args[0], args[1], args[2]); - case 4: return un ? fn(args[0], args[1], args[2], args[3]) - : fn.call(that, args[0], args[1], args[2], args[3]); - } return fn.apply(that, args); -}; - -var process = _global.process; -var setTask = _global.setImmediate; -var clearTask = _global.clearImmediate; -var MessageChannel = _global.MessageChannel; -var Dispatch = _global.Dispatch; -var counter = 0; -var queue = {}; -var ONREADYSTATECHANGE = 'onreadystatechange'; -var defer, channel, port; -var run = function () { - var id = +this; - // eslint-disable-next-line no-prototype-builtins - if (queue.hasOwnProperty(id)) { - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; -var listener = function (event) { - run.call(event.data); -}; -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if (!setTask || !clearTask) { - setTask = function setImmediate(fn) { - var args = []; - var i = 1; - while (arguments.length > i) args.push(arguments[i++]); - queue[++counter] = function () { - // eslint-disable-next-line no-new-func - _invoke(typeof fn == 'function' ? fn : Function(fn), args); - }; - defer(counter); - return counter; - }; - clearTask = function clearImmediate(id) { - delete queue[id]; - }; - // Node.js 0.8- - if (_cof(process) == 'process') { - defer = function (id) { - process.nextTick(_ctx(run, id, 1)); - }; - // Sphere (JS game engine) Dispatch API - } else if (Dispatch && Dispatch.now) { - defer = function (id) { - Dispatch.now(_ctx(run, id, 1)); - }; - // Browsers with MessageChannel, includes WebWorkers - } else if (MessageChannel) { - channel = new MessageChannel(); - port = channel.port2; - channel.port1.onmessage = listener; - defer = _ctx(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) { - defer = function (id) { - _global.postMessage(id + '', '*'); - }; - _global.addEventListener('message', listener, false); - // IE8- - } else if (ONREADYSTATECHANGE in _domCreate('script')) { - defer = function (id) { - _html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () { - _html.removeChild(this); - run.call(id); - }; - }; - // Rest old browsers - } else { - defer = function (id) { - setTimeout(_ctx(run, id, 1), 0); - }; - } -} -var _task = { - set: setTask, - clear: clearTask -}; - -var macrotask = _task.set; -var Observer = _global.MutationObserver || _global.WebKitMutationObserver; -var process$1 = _global.process; -var Promise$1 = _global.Promise; -var isNode = _cof(process$1) == 'process'; - -var _microtask = function () { - var head, last, notify; - - var flush = function () { - var parent, fn; - if (isNode && (parent = process$1.domain)) parent.exit(); - while (head) { - fn = head.fn; - head = head.next; - try { - fn(); - } catch (e) { - if (head) notify(); - else last = undefined; - throw e; - } - } last = undefined; - if (parent) parent.enter(); - }; - - // Node.js - if (isNode) { - notify = function () { - process$1.nextTick(flush); - }; - // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 - } else if (Observer && !(_global.navigator && _global.navigator.standalone)) { - var toggle = true; - var node = document.createTextNode(''); - new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new - notify = function () { - node.data = toggle = !toggle; - }; - // environments with maybe non-completely correct, but existent Promise - } else if (Promise$1 && Promise$1.resolve) { - // Promise.resolve without an argument throws an error in LG WebOS 2 - var promise = Promise$1.resolve(undefined); - notify = function () { - promise.then(flush); - }; - // for other environments - macrotask based on: - // - setImmediate - // - MessageChannel - // - window.postMessag - // - onreadystatechange - // - setTimeout - } else { - notify = function () { - // strange IE + webpack dev server bug - use .call(global) - macrotask.call(_global, flush); - }; - } - - return function (fn) { - var task = { fn: fn, next: undefined }; - if (last) last.next = task; - if (!head) { - head = task; - notify(); - } last = task; - }; -}; - -// 25.4.1.5 NewPromiseCapability(C) - - -function PromiseCapability(C) { - var resolve, reject; - this.promise = new C(function ($$resolve, $$reject) { - if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); - resolve = $$resolve; - reject = $$reject; - }); - this.resolve = _aFunction(resolve); - this.reject = _aFunction(reject); -} - -var f$5 = function (C) { - return new PromiseCapability(C); -}; - -var _newPromiseCapability = { - f: f$5 -}; - -var _perform = function (exec) { - try { - return { e: false, v: exec() }; - } catch (e) { - return { e: true, v: e }; - } -}; - -var navigator$1 = _global.navigator; - -var _userAgent = navigator$1 && navigator$1.userAgent || ''; - -var _promiseResolve = function (C, x) { - _anObject(C); - if (_isObject(x) && x.constructor === C) return x; - var promiseCapability = _newPromiseCapability.f(C); - var resolve = promiseCapability.resolve; - resolve(x); - return promiseCapability.promise; -}; - -var _redefineAll = function (target, src, safe) { - for (var key in src) _redefine(target, key, src[key], safe); - return target; -}; - -var SPECIES$2 = _wks('species'); - -var _setSpecies = function (KEY) { - var C = _global[KEY]; - if (_descriptors && C && !C[SPECIES$2]) _objectDp.f(C, SPECIES$2, { - configurable: true, - get: function () { return this; } - }); -}; - -var ITERATOR$4 = _wks('iterator'); -var SAFE_CLOSING = false; - -try { - var riter = [7][ITERATOR$4](); - riter['return'] = function () { SAFE_CLOSING = true; }; - // eslint-disable-next-line no-throw-literal - Array.from(riter, function () { throw 2; }); -} catch (e) { /* empty */ } - -var _iterDetect = function (exec, skipClosing) { - if (!skipClosing && !SAFE_CLOSING) return false; - var safe = false; - try { - var arr = [7]; - var iter = arr[ITERATOR$4](); - iter.next = function () { return { done: safe = true }; }; - arr[ITERATOR$4] = function () { return iter; }; - exec(arr); - } catch (e) { /* empty */ } - return safe; -}; - -var task = _task.set; -var microtask = _microtask(); - - - - -var PROMISE = 'Promise'; -var TypeError$1 = _global.TypeError; -var process$2 = _global.process; -var versions = process$2 && process$2.versions; -var v8 = versions && versions.v8 || ''; -var $Promise = _global[PROMISE]; -var isNode$1 = _classof(process$2) == 'process'; -var empty = function () { /* empty */ }; -var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; -var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f; - -var USE_NATIVE = !!function () { - try { - // correct subclassing with @@species support - var promise = $Promise.resolve(1); - var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) { - exec(empty, empty); - }; - // unhandled rejections tracking support, NodeJS Promise without it fails @@species test - return (isNode$1 || typeof PromiseRejectionEvent == 'function') - && promise.then(empty) instanceof FakePromise - // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables - // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 - // we can't detect it synchronously, so just check versions - && v8.indexOf('6.6') !== 0 - && _userAgent.indexOf('Chrome/66') === -1; - } catch (e) { /* empty */ } -}(); - -// helpers -var isThenable = function (it) { - var then; - return _isObject(it) && typeof (then = it.then) == 'function' ? then : false; -}; -var notify = function (promise, isReject) { - if (promise._n) return; - promise._n = true; - var chain = promise._c; - microtask(function () { - var value = promise._v; - var ok = promise._s == 1; - var i = 0; - var run = function (reaction) { - var handler = ok ? reaction.ok : reaction.fail; - var resolve = reaction.resolve; - var reject = reaction.reject; - var domain = reaction.domain; - var result, then, exited; - try { - if (handler) { - if (!ok) { - if (promise._h == 2) onHandleUnhandled(promise); - promise._h = 1; - } - if (handler === true) result = value; - else { - if (domain) domain.enter(); - result = handler(value); // may throw - if (domain) { - domain.exit(); - exited = true; - } - } - if (result === reaction.promise) { - reject(TypeError$1('Promise-chain cycle')); - } else if (then = isThenable(result)) { - then.call(result, resolve, reject); - } else resolve(result); - } else reject(value); - } catch (e) { - if (domain && !exited) domain.exit(); - reject(e); - } - }; - while (chain.length > i) run(chain[i++]); // variable length - can't use forEach - promise._c = []; - promise._n = false; - if (isReject && !promise._h) onUnhandled(promise); - }); -}; -var onUnhandled = function (promise) { - task.call(_global, function () { - var value = promise._v; - var unhandled = isUnhandled(promise); - var result, handler, console; - if (unhandled) { - result = _perform(function () { - if (isNode$1) { - process$2.emit('unhandledRejection', value, promise); - } else if (handler = _global.onunhandledrejection) { - handler({ promise: promise, reason: value }); - } else if ((console = _global.console) && console.error) { - console.error('Unhandled promise rejection', value); - } - }); - // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should - promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1; - } promise._a = undefined; - if (unhandled && result.e) throw result.v; - }); -}; -var isUnhandled = function (promise) { - return promise._h !== 1 && (promise._a || promise._c).length === 0; -}; -var onHandleUnhandled = function (promise) { - task.call(_global, function () { - var handler; - if (isNode$1) { - process$2.emit('rejectionHandled', promise); - } else if (handler = _global.onrejectionhandled) { - handler({ promise: promise, reason: promise._v }); - } - }); -}; -var $reject = function (value) { - var promise = this; - if (promise._d) return; - promise._d = true; - promise = promise._w || promise; // unwrap - promise._v = value; - promise._s = 2; - if (!promise._a) promise._a = promise._c.slice(); - notify(promise, true); -}; -var $resolve = function (value) { - var promise = this; - var then; - if (promise._d) return; - promise._d = true; - promise = promise._w || promise; // unwrap - try { - if (promise === value) throw TypeError$1("Promise can't be resolved itself"); - if (then = isThenable(value)) { - microtask(function () { - var wrapper = { _w: promise, _d: false }; // wrap - try { - then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1)); - } catch (e) { - $reject.call(wrapper, e); - } - }); - } else { - promise._v = value; - promise._s = 1; - notify(promise, false); - } - } catch (e) { - $reject.call({ _w: promise, _d: false }, e); // wrap - } -}; - -// constructor polyfill -if (!USE_NATIVE) { - // 25.4.3.1 Promise(executor) - $Promise = function Promise(executor) { - _anInstance(this, $Promise, PROMISE, '_h'); - _aFunction(executor); - Internal.call(this); - try { - executor(_ctx($resolve, this, 1), _ctx($reject, this, 1)); - } catch (err) { - $reject.call(this, err); - } - }; - // eslint-disable-next-line no-unused-vars - Internal = function Promise(executor) { - this._c = []; // <- awaiting reactions - this._a = undefined; // <- checked in isUnhandled reactions - this._s = 0; // <- state - this._d = false; // <- done - this._v = undefined; // <- value - this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled - this._n = false; // <- notify - }; - Internal.prototype = _redefineAll($Promise.prototype, { - // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) - then: function then(onFulfilled, onRejected) { - var reaction = newPromiseCapability(_speciesConstructor(this, $Promise)); - reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; - reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = isNode$1 ? process$2.domain : undefined; - this._c.push(reaction); - if (this._a) this._a.push(reaction); - if (this._s) notify(this, false); - return reaction.promise; - }, - // 25.4.5.1 Promise.prototype.catch(onRejected) - 'catch': function (onRejected) { - return this.then(undefined, onRejected); - } - }); - OwnPromiseCapability = function () { - var promise = new Internal(); - this.promise = promise; - this.resolve = _ctx($resolve, promise, 1); - this.reject = _ctx($reject, promise, 1); - }; - _newPromiseCapability.f = newPromiseCapability = function (C) { - return C === $Promise || C === Wrapper - ? new OwnPromiseCapability(C) - : newGenericPromiseCapability(C); - }; -} - -_export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise }); -_setToStringTag($Promise, PROMISE); -_setSpecies(PROMISE); -Wrapper = _core[PROMISE]; - -// statics -_export(_export.S + _export.F * !USE_NATIVE, PROMISE, { - // 25.4.4.5 Promise.reject(r) - reject: function reject(r) { - var capability = newPromiseCapability(this); - var $$reject = capability.reject; - $$reject(r); - return capability.promise; - } -}); -_export(_export.S + _export.F * (!USE_NATIVE), PROMISE, { - // 25.4.4.6 Promise.resolve(x) - resolve: function resolve(x) { - return _promiseResolve(this, x); - } -}); -_export(_export.S + _export.F * !(USE_NATIVE && _iterDetect(function (iter) { - $Promise.all(iter)['catch'](empty); -})), PROMISE, { - // 25.4.4.1 Promise.all(iterable) - all: function all(iterable) { - var C = this; - var capability = newPromiseCapability(C); - var resolve = capability.resolve; - var reject = capability.reject; - var result = _perform(function () { - var values = []; - var index = 0; - var remaining = 1; - _forOf(iterable, false, function (promise) { - var $index = index++; - var alreadyCalled = false; - values.push(undefined); - remaining++; - C.resolve(promise).then(function (value) { - if (alreadyCalled) return; - alreadyCalled = true; - values[$index] = value; - --remaining || resolve(values); - }, reject); - }); - --remaining || resolve(values); - }); - if (result.e) reject(result.v); - return capability.promise; - }, - // 25.4.4.4 Promise.race(iterable) - race: function race(iterable) { - var C = this; - var capability = newPromiseCapability(C); - var reject = capability.reject; - var result = _perform(function () { - _forOf(iterable, false, function (promise) { - C.resolve(promise).then(capability.resolve, reject); - }); - }); - if (result.e) reject(result.v); - return capability.promise; - } -}); - -var dP$1 = _objectDp.f; -var FProto = Function.prototype; -var nameRE = /^\s*function ([^ (]*)/; -var NAME$1 = 'name'; - -// 19.2.4.2 name -NAME$1 in FProto || _descriptors && dP$1(FProto, NAME$1, { - configurable: true, - get: function () { - try { - return ('' + this).match(nameRE)[1]; - } catch (e) { - return ''; - } - } -}); - -// most Object methods by ES6 should accept primitives - - - -var _objectSap = function (KEY, exec) { - var fn = (_core.Object || {})[KEY] || Object[KEY]; - var exp = {}; - exp[KEY] = exec(fn); - _export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp); -}; - -// 19.1.2.14 Object.keys(O) - - - -_objectSap('keys', function () { - return function keys(it) { - return _objectKeys(_toObject(it)); - }; -}); - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; -} - -function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; -} - -function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); -} - -function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); -} - -function isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } -} - -function _construct(Parent, args, Class) { - if (isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) _setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - - return _construct.apply(null, arguments); -} - -function _isNativeFunction(fn) { - return Function.toString.call(fn).indexOf("[native code]") !== -1; -} - -function _wrapNativeSuper(Class) { - var _cache = typeof Map === "function" ? new Map() : undefined; - - _wrapNativeSuper = function _wrapNativeSuper(Class) { - if (Class === null || !_isNativeFunction(Class)) return Class; - - if (typeof Class !== "function") { - throw new TypeError("Super expression must either be null or a function"); - } - - if (typeof _cache !== "undefined") { - if (_cache.has(Class)) return _cache.get(Class); - - _cache.set(Class, Wrapper); - } - - function Wrapper() { - return _construct(Class, arguments, _getPrototypeOf(this).constructor); - } - - Wrapper.prototype = Object.create(Class.prototype, { - constructor: { - value: Wrapper, - enumerable: false, - writable: true, - configurable: true - } - }); - return _setPrototypeOf(Wrapper, Class); - }; - - return _wrapNativeSuper(Class); -} - -var version = "0.20.0"; - -var version$1 = 'v' + version; - -// 7.2.8 IsRegExp(argument) - - -var MATCH = _wks('match'); -var _isRegexp = function (it) { - var isRegExp; - return _isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : _cof(it) == 'RegExp'); -}; - -var $min = Math.min; -var $push = [].push; -var $SPLIT = 'split'; -var LENGTH = 'length'; -var LAST_INDEX$1 = 'lastIndex'; -var MAX_UINT32 = 0xffffffff; - -// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError -var SUPPORTS_Y = !_fails(function () { RegExp(MAX_UINT32, 'y'); }); - -// @@split logic -_fixReWks('split', 2, function (defined, SPLIT, $split, maybeCallNative) { - var internalSplit; - if ( - 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || - 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || - 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || - '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || - '.'[$SPLIT](/()()/)[LENGTH] > 1 || - ''[$SPLIT](/.?/)[LENGTH] - ) { - // based on es5-shim implementation, need to rework it - internalSplit = function (separator, limit) { - var string = String(this); - if (separator === undefined && limit === 0) return []; - // If `separator` is not a regex, use native split - if (!_isRegexp(separator)) return $split.call(string, separator, limit); - var output = []; - var flags = (separator.ignoreCase ? 'i' : '') + - (separator.multiline ? 'm' : '') + - (separator.unicode ? 'u' : '') + - (separator.sticky ? 'y' : ''); - var lastLastIndex = 0; - var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; - // Make `global` and avoid `lastIndex` issues by working with a copy - var separatorCopy = new RegExp(separator.source, flags + 'g'); - var match, lastIndex, lastLength; - while (match = _regexpExec.call(separatorCopy, string)) { - lastIndex = separatorCopy[LAST_INDEX$1]; - if (lastIndex > lastLastIndex) { - output.push(string.slice(lastLastIndex, match.index)); - if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); - lastLength = match[0][LENGTH]; - lastLastIndex = lastIndex; - if (output[LENGTH] >= splitLimit) break; - } - if (separatorCopy[LAST_INDEX$1] === match.index) separatorCopy[LAST_INDEX$1]++; // Avoid an infinite loop - } - if (lastLastIndex === string[LENGTH]) { - if (lastLength || !separatorCopy.test('')) output.push(''); - } else output.push(string.slice(lastLastIndex)); - return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; - }; - // Chakra, V8 - } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { - internalSplit = function (separator, limit) { - return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); - }; - } else { - internalSplit = $split; - } - - return [ - // `String.prototype.split` method - // https://tc39.github.io/ecma262/#sec-string.prototype.split - function split(separator, limit) { - var O = defined(this); - var splitter = separator == undefined ? undefined : separator[SPLIT]; - return splitter !== undefined - ? splitter.call(separator, O, limit) - : internalSplit.call(String(O), separator, limit); - }, - // `RegExp.prototype[@@split]` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split - // - // NOTE: This cannot be properly polyfilled in engines that don't support - // the 'y' flag. - function (regexp, limit) { - var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); - if (res.done) return res.value; - - var rx = _anObject(regexp); - var S = String(this); - var C = _speciesConstructor(rx, RegExp); - - var unicodeMatching = rx.unicode; - var flags = (rx.ignoreCase ? 'i' : '') + - (rx.multiline ? 'm' : '') + - (rx.unicode ? 'u' : '') + - (SUPPORTS_Y ? 'y' : 'g'); - - // ^(? + rx + ) is needed, in combination with some S slicing, to - // simulate the 'y' flag. - var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); - var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; - if (lim === 0) return []; - if (S.length === 0) return _regexpExecAbstract(splitter, S) === null ? [S] : []; - var p = 0; - var q = 0; - var A = []; - while (q < S.length) { - splitter.lastIndex = SUPPORTS_Y ? q : 0; - var z = _regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q)); - var e; - if ( - z === null || - (e = $min(_toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p - ) { - q = _advanceStringIndex(S, q, unicodeMatching); - } else { - A.push(S.slice(p, q)); - if (A.length === lim) return A; - for (var i = 1; i <= z.length - 1; i++) { - A.push(z[i]); - if (A.length === lim) return A; - } - q = p = e; - } - } - A.push(S.slice(p)); - return A; - } - ]; -}); - -var WorkerBroker; -var WorkerBroker$1 = WorkerBroker = {}; // Global list of all worker messages -// Uniquely tracks every call made between main thread and a worker - -var message_id = 0; -var messages = {}; // Register an object to receive calls from other thread - -WorkerBroker.targets = {}; - -WorkerBroker.addTarget = function (name, target) { - WorkerBroker.targets[name] = target; -}; - -WorkerBroker.removeTarget = function (name) { - if (name) { - delete WorkerBroker.targets[name]; - } -}; // Given a dot-notation-style method name, e.g. 'Object.object.method', -// find the object to call the method on from the list of registered targets - - -function findTarget(method) { - var chain = []; - - if (typeof method === 'string') { - chain = method.split('.'); - method = chain.pop(); - } - - var target = WorkerBroker.targets; - - for (var m = 0; m < chain.length; m++) { - if (target[chain[m]]) { - target = target[chain[m]]; - } else { - return []; - } - } - - return [method, target]; -} // Main thread: -// - Send messages to workers, and optionally receive an async response as a promise -// - Receive messages from workers, and optionally send an async response back as a promise - - -function setupMainThread() { - // Send a message to a worker, and optionally get an async response - // Arguments: - // - worker: one or more web worker instances to send the message to (single value or array) - // - method: the method with this name, specified with dot-notation, will be invoked in the worker - // - message: spread of arguments to call the method with - // Returns: - // - a promise that will be fulfilled if the worker method returns a value (could be immediately, or async) - // - WorkerBroker.postMessage = function (worker, method) { - for (var _len = arguments.length, message = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - message[_key - 2] = arguments[_key]; - } - - // If more than one worker specified, post to multiple - if (Array.isArray(worker)) { - return Promise.all(worker.map(function (w) { - var _WorkerBroker; - - return (_WorkerBroker = WorkerBroker).postMessage.apply(_WorkerBroker, [w, method].concat(message)); - })); - } // Parse options - - - var options = {}; - - if (typeof method === 'object') { - options = method; - method = method.method; - } // Track state of this message - - - var promise = new Promise(function (resolve, reject) { - messages[message_id] = { - method: method, - message: message, - resolve: resolve, - reject: reject - }; - }); - var payload, - transferables = []; - - if (message && message.length === 1 && message[0] instanceof WorkerBroker.withTransferables) { - transferables = message[0].transferables; - message = message[0].value; - } - - payload = { - type: 'main_send', - // mark message as method invocation from main thread - message_id: message_id, - // unique id for this message, for life of program - method: method, - // will dispatch to a function of this name within the worker - message: message // message payload - - }; - - if (options.stringify) { - payload = JSON.stringify(payload); - } - - worker.postMessage(payload, transferables.map(function (t) { - return t.object; - })); - freeTransferables(transferables); - - if (transferables.length > 0) { - log('trace', "'" + method + "' transferred " + transferables.length + " objects to worker thread"); - } - - message_id++; - return promise; - }; // Add a worker to communicate with - each worker must be registered from the main thread - - - WorkerBroker.addWorker = function (worker) { - if (!(worker instanceof Worker)) { - throw Error('Worker broker could not add non-Worker object', worker); - } - - worker.addEventListener('message', function WorkerBrokerMainThreadHandler(event) { - var data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data; - var id = data.message_id; // Listen for messages coming back from the worker, and fulfill that message's promise - - if (data.type === 'worker_reply') { - // Pass the result to the promise - if (messages[id]) { - if (data.error) { - messages[id].reject(data.error); - } else { - messages[id].resolve(data.message); - } - - delete messages[id]; - } - } // Listen for messages initiating a call from the worker, dispatch them, - // and send any return value back to the worker - // Unique id for this message & return call to main thread - else if (data.type === 'worker_send' && id != null) { - // Call the requested method and save the return value - var result, error, target, method_name, method; - - try { - var _findTarget = findTarget(data.method); - - method_name = _findTarget[0]; - target = _findTarget[1]; - - if (!target) { - throw Error("Worker broker could not dispatch message type " + data.method + " on target " + data.target + " because no object with that name is registered on main thread"); - } - - method = typeof target[method_name] === 'function' && target[method_name]; - - if (!method) { - throw Error("Worker broker could not dispatch message type " + data.method + " on target " + data.target + " because object has no method with that name"); - } - - result = method.apply(target, data.message); - } catch (e) { - // Thrown errors will be passed back (in string form) to worker - error = e; - } // Send return value to worker - - - var payload, - transferables = []; // Async result - - if (result instanceof Promise) { - result.then(function (value) { - if (value instanceof WorkerBroker.withTransferables) { - transferables = value.transferables; - value = value.value[0]; - } - - payload = { - type: 'main_reply', - message_id: id, - message: value - }; - worker.postMessage(payload, transferables.map(function (t) { - return t.object; - })); - freeTransferables(transferables); - - if (transferables.length > 0) { - log('trace', "'" + method_name + "' transferred " + transferables.length + " objects to worker thread"); - } - }, function (error) { - worker.postMessage({ - type: 'main_reply', - message_id: id, - error: error instanceof Error ? error.message + ": " + error.stack : error - }); - }); - } // Immediate result - else { - if (result instanceof WorkerBroker.withTransferables) { - transferables = result.transferables; - result = result.value[0]; - } - - payload = { - type: 'main_reply', - message_id: id, - message: result, - error: error instanceof Error ? error.message + ": " + error.stack : error - }; - worker.postMessage(payload, transferables.map(function (t) { - return t.object; - })); - freeTransferables(transferables); - - if (transferables.length > 0) { - log('trace', "'" + method_name + "' transferred " + transferables.length + " objects to worker thread"); - } - } - } - }); - }; // Expose for debugging - - - WorkerBroker.getMessages = function () { - return messages; - }; - - WorkerBroker.getMessageId = function () { - return message_id; - }; -} // Worker threads: -// - Receive messages from main thread, and optionally send an async response back as a promise -// - Send messages to main thread, and optionally receive an async response as a promise - - -function setupWorkerThread() { - // Send a message to the main thread, and optionally get an async response as a promise - // Arguments: - // - method: the method with this name, specified with dot-notation, will be invoked on the main thread - // - message: array of arguments to call the method with - // Returns: - // - a promise that will be fulfilled if the main thread method returns a value (could be immediately, or async) - // - WorkerBroker.postMessage = function (method) { - for (var _len2 = arguments.length, message = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - message[_key2 - 1] = arguments[_key2]; - } - - // Parse options - var options = {}; - - if (typeof method === 'object') { - options = method; - method = method.method; - } // Track state of this message - - - var promise = new Promise(function (resolve, reject) { - messages[message_id] = { - method: method, - message: message, - resolve: resolve, - reject: reject - }; - }); - var payload, - transferables = []; - - if (message && message.length === 1 && message[0] instanceof WorkerBroker.withTransferables) { - transferables = message[0].transferables; - message = message[0].value; - } - - payload = { - type: 'worker_send', - // mark message as method invocation from worker - message_id: message_id, - // unique id for this message, for life of program - method: method, - // will dispatch to a method of this name on the main thread - message: message // message payload - - }; - - if (options.stringify) { - payload = JSON.stringify(payload); - } - - self.postMessage(payload, transferables.map(function (t) { - return t.object; - })); - freeTransferables(transferables); - - if (transferables.length > 0) { - log('trace', "'" + method + "' transferred " + transferables.length + " objects to main thread"); - } - - message_id++; - return promise; - }; - - self.addEventListener('message', function WorkerBrokerWorkerThreadHandler(event) { - var data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data; - var id = data.message_id; // Listen for messages coming back from the main thread, and fulfill that message's promise - - if (data.type === 'main_reply') { - // Pass the result to the promise - if (messages[id]) { - if (data.error) { - messages[id].reject(data.error); - } else { - messages[id].resolve(data.message); - } - - delete messages[id]; - } - } // Receive messages from main thread, dispatch them, and send back a reply - // Unique id for this message & return call to main thread - else if (data.type === 'main_send' && id != null) { - // Call the requested worker method and save the return value - var result, error, target, method_name, method; - - try { - var _findTarget2 = findTarget(data.method); - - method_name = _findTarget2[0]; - target = _findTarget2[1]; - - if (!target) { - throw Error("Worker broker could not dispatch message type " + data.method + " on target " + data.target + " because no object with that name is registered on main thread"); - } - - method = typeof target[method_name] === 'function' && target[method_name]; - - if (!method) { - throw Error("Worker broker could not dispatch message type " + data.method + " because worker has no method with that name"); - } - - result = method.apply(target, data.message); - } catch (e) { - // Thrown errors will be passed back (in string form) to main thread - error = e; - } // Send return value to main thread - - - var payload, - transferables = []; // Async result - - if (result instanceof Promise) { - result.then(function (value) { - if (value instanceof WorkerBroker.withTransferables) { - transferables = value.transferables; - value = value.value[0]; - } - - payload = { - type: 'worker_reply', - message_id: id, - message: value - }; - self.postMessage(payload, transferables.map(function (t) { - return t.object; - })); - freeTransferables(transferables); - - if (transferables.length > 0) { - log('trace', "'" + method_name + "' transferred " + transferables.length + " objects to main thread"); - } - }, function (error) { - self.postMessage({ - type: 'worker_reply', - message_id: id, - error: error instanceof Error ? error.message + ": " + error.stack : error - }); - }); - } // Immediate result - else { - if (result instanceof WorkerBroker.withTransferables) { - transferables = result.transferables; - result = result.value[0]; - } - - payload = { - type: 'worker_reply', - message_id: id, - message: result, - error: error instanceof Error ? error.message + ": " + error.stack : error - }; - self.postMessage(payload, transferables.map(function (t) { - return t.object; - })); - freeTransferables(transferables); - - if (transferables.length > 0) { - log('trace', "'" + method_name + "' transferred " + transferables.length + " objects to main thread"); - } - } - } - }); -} // Special value wrapper, to indicate that we want to find and include transferable objects in the message - - -WorkerBroker.withTransferables = function () { - for (var _len3 = arguments.length, value = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - value[_key3] = arguments[_key3]; - } - - if (!(this instanceof WorkerBroker.withTransferables)) { - return _construct(WorkerBroker.withTransferables, value); - } - - this.value = value; - this.transferables = findTransferables(this.value); -}; // Build a list of transferable objects from a source object -// Returns a list of info about each transferable: -// - object: the actual transferable object -// - parent: the parent object that the transferable is a property of (if any) -// - property: the property name of the transferable on the parent object (if any) -// TODO: add option in case you DON'T want to transfer objects - - -function findTransferables(source, parent, property, list) { - if (parent === void 0) { - parent = null; - } - - if (property === void 0) { - property = null; - } - - if (list === void 0) { - list = []; - } - - if (!source) { - return list; - } - - if (Array.isArray(source)) { - // Check each array element - source.forEach(function (x, i) { - return findTransferables(x, source, i, list); - }); - } else if (typeof source === 'object') { - // Is the object a transferable array buffer? - if (source instanceof ArrayBuffer) { - list.push({ - object: source, - parent: parent, - property: property - }); - } // Or looks like a typed array (has an array buffer property)? - else if (source.buffer instanceof ArrayBuffer) { - list.push({ - object: source.buffer, - parent: parent, - property: property - }); - } // Otherwise check each property - else { - for (var prop in source) { - findTransferables(source[prop], source, prop, list); - } - } - } - - return list; -} // Remove neutered transferables from parent objects, as they should no longer be accessed after transfer - - -function freeTransferables(transferables) { - if (!Array.isArray(transferables)) { - return; - } - - transferables.filter(function (t) { - return t.parent && t.property; - }).forEach(function (t) { - return delete t.parent[t.property]; - }); -} // Setup this thread as appropriate - - -if (Thread.is_main) { - setupMainThread(); -} - -if (Thread.is_worker) { - setupWorkerThread(); -} - -var LEVELS = { - silent: -1, - error: 0, - warn: 1, - info: 2, - debug: 3, - trace: 4 -}; -var methods = {}; -var logged_once = {}; - -function methodForLevel(level) { - if (Thread.is_main) { - methods[level] = methods[level] || (console[level] ? console[level] : console.log).bind(console); // eslint-disable-line no-console - - return methods[level]; - } -} // Logs message, proxying any log requests from worker threads back to the main thread. -// Returns (asynchronously, due to proxying) a boolean indicating if the message was logged. -// Option `once: true` can be used to only log each unique log message once (e.g. for warnings -// that would otherwise be repetitive or possibly logged thousands of times, such as per feature). - - -function log(opts) { - var level = typeof opts === 'object' ? opts.level : opts; - - if (LEVELS[level] <= LEVELS[log.level]) { - for (var _len = arguments.length, msg = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - msg[_key - 1] = arguments[_key]; - } - - if (Thread.is_worker) { - // Proxy to main thread - return WorkerBroker$1.postMessage.apply(WorkerBroker$1, [{ - method: '_logProxy', - stringify: true - }, opts].concat(msg)); - } else { - // Only log message once? - if (typeof opts === 'object' && opts.once === true) { - if (logged_once[JSON.stringify(msg)]) { - return Promise.resolve(false); - } - - logged_once[JSON.stringify(msg)] = true; - } // Write to console (on main thread) - - - var logger = methodForLevel(level); - - if (msg.length > 1) { - logger.apply(void 0, ["Tangram " + version$1 + " [" + level + "]: " + msg[0]].concat(msg.slice(1))); - } else { - logger("Tangram " + version$1 + " [" + level + "]: " + msg[0]); - } - } - - return Promise.resolve(true); - } - - return Promise.resolve(false); -} -log.level = 'info'; -log.workers = null; - -log.setLevel = function (level) { - log.level = level; - - if (Thread.is_main && Array.isArray(log.workers)) { - WorkerBroker$1.postMessage(log.workers, '_logSetLevelProxy', level); - } -}; - -if (Thread.is_main) { - log.setWorkers = function (workers) { - log.workers = workers; - }; - - log.reset = function () { - logged_once = {}; - }; -} - -WorkerBroker$1.addTarget('_logProxy', log); // proxy log messages from worker to main thread - -WorkerBroker$1.addTarget('_logSetLevelProxy', log.setLevel); // proxy log level setting from main to worker thread - -// 21.2.5.3 get RegExp.prototype.flags() -if (_descriptors && /./g.flags != 'g') _objectDp.f(RegExp.prototype, 'flags', { - configurable: true, - get: _flags -}); - -var TO_STRING = 'toString'; -var $toString = /./[TO_STRING]; - -var define = function (fn) { - _redefine(RegExp.prototype, TO_STRING, fn, true); -}; - -// 21.2.5.14 RegExp.prototype.toString() -if (_fails(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) { - define(function toString() { - var R = _anObject(this); - return '/'.concat(R.source, '/', - 'flags' in R ? R.flags : !_descriptors && R instanceof RegExp ? _flags.call(R) : undefined); - }); -// FF44- RegExp#toString has a wrong name -} else if ($toString.name != TO_STRING) { - define(function toString() { - return $toString.call(this); - }); -} - -var Utils = {}; -WorkerBroker$1.addTarget('Utils', Utils); // Basic Safari detection -// http://stackoverflow.com/questions/7944460/detect-safari-browser - -Utils.isSafari = function () { - return /^((?!chrome|android).)*safari/i.test(navigator.userAgent); -}; // Basic IE11 or Edge detection - - -Utils.isMicrosoft = function () { - return /(Trident\/7.0|Edge[ /](\d+[.\d]+))/i.test(navigator.userAgent); -}; - -Utils._requests = {}; // XHR requests on current thread - -Utils._proxy_requests = {}; // XHR requests proxied to main thread -// `request_key` is a user-provided key that can be later used to cancel the request - -Utils.io = function (url, timeout, responseType, method, headers, request_key, proxy) { - if (timeout === void 0) { - timeout = 60000; - } - - if (responseType === void 0) { - responseType = 'text'; - } - - if (method === void 0) { - method = 'GET'; - } - - if (headers === void 0) { - headers = {}; - } - - if (request_key === void 0) { - request_key = null; - } - - if (proxy === void 0) { - proxy = false; - } - - if (Thread.is_worker && Utils.isMicrosoft()) { - // Some versions of IE11 and Edge will hang web workers when performing XHR requests - // These requests can be proxied through the main thread - // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/9545866/ - log('debug', 'Proxying request for URL to worker', url); - - if (request_key) { - Utils._proxy_requests[request_key] = true; // mark as proxied - } - - return WorkerBroker$1.postMessage('Utils.io', url, timeout, responseType, method, headers, request_key, true); - } else { - var request = new XMLHttpRequest(); - var promise = new Promise(function (resolve, reject) { - request.open(method, url, true); - request.timeout = timeout; - request.responseType = responseType; // Attach optional request headers - - if (headers && typeof headers === 'object') { - for (var key in headers) { - request.setRequestHeader(key, headers[key]); - } - } - - request.onload = function () { - if (request.status === 200) { - if (['text', 'json'].indexOf(request.responseType) > -1) { - resolve({ - body: request.responseText, - status: request.status - }); - } else { - resolve({ - body: request.response, - status: request.status - }); - } - } else if (request.status === 204) { - // No Content - resolve({ - body: null, - status: request.status - }); - } else { - reject(Error('Request error with a status of ' + request.statusText)); - } - }; - - request.onerror = function (evt) { - reject(Error('There was a network error' + evt.toString())); - }; - - request.ontimeout = function (evt) { - reject(Error('timeout ' + evt.toString())); - }; - - request.send(); - }); - promise = promise.then(function (response) { - if (request_key) { - delete Utils._requests[request_key]; - } - - if (proxy) { - return WorkerBroker$1.withTransferables(response); - } - - return response; - }); - - if (request_key) { - Utils._requests[request_key] = request; - } - - return promise; - } -}; // ร‡ancel a pending network request by user-provided request key - - -Utils.cancelRequest = function (key) { - // Check for a request that was proxied to the main thread - if (Thread.is_worker && Utils._proxy_requests[key]) { - return WorkerBroker$1.postMessage('Utils.cancelRequest', key); // forward to main thread - } - - var req = Utils._requests[key]; - - if (req) { - log('trace', "Cancelling network request key '" + key + "'"); - - Utils._requests[key].abort(); - - delete Utils._requests[key]; - } else { - log('trace', "Could not find network request key '" + key + "'"); - } -}; // Stringify an object into JSON, but convert functions to strings - - -Utils.serializeWithFunctions = function (obj) { - if (typeof obj === 'function') { - return obj.toString(); - } - - var serialized = JSON.stringify(obj, function (k, v) { - // Convert functions to strings - if (typeof v === 'function') { - return v.toString(); - } - - return v; - }); - return serialized; -}; // Default to allowing high pixel density -// Returns true if display density changed - - -Utils.use_high_density_display = true; - -Utils.updateDevicePixelRatio = function () { - var prev = Utils.device_pixel_ratio; - Utils.device_pixel_ratio = Utils.use_high_density_display && window.devicePixelRatio || 1; - return Utils.device_pixel_ratio !== prev; -}; - -if (Thread.is_main) { - Utils.updateDevicePixelRatio(); -} // Used for differentiating between power-of-2 and non-power-of-2 textures -// Via: http://stackoverflow.com/questions/19722247/webgl-wait-for-texture-to-load - - -Utils.isPowerOf2 = function (value) { - return (value & value - 1) === 0; -}; // Interpolate 'x' along a series of control points -// 'points' is an array of control points in the form [x, y] -// -// Example: -// Control points: -// [0, 5]: when x=0, y=5 -// [4, 10]: when x=4, y=10 -// -// Utils.interpolate(2, [[0, 5], [4, 10]]); -// -> computes x=2, halfway between x=0 and x=4: (10 - 5) / 2 +5 -// -> returns 7.5 -// -// TODO: add other interpolation methods besides linear -// - - -Utils.interpolate = function (x, points, transform) { - // If this doesn't resemble a list of control points, just return the original value - if (!Array.isArray(points) || !Array.isArray(points[0])) { - return points; - } else if (points.length < 1) { - return points; - } - - var x1, x2, d, y, y1, y2; // Min bounds - - if (x <= points[0][0]) { - y = points[0][1]; - - if (typeof transform === 'function') { - y = transform(y); - } - } // Max bounds - else if (x >= points[points.length - 1][0]) { - y = points[points.length - 1][1]; - - if (typeof transform === 'function') { - y = transform(y); - } - } // Find which control points x is between - else { - for (var i = 0; i < points.length - 1; i++) { - if (x >= points[i][0] && x < points[i + 1][0]) { - // Linear interpolation - x1 = points[i][0]; - x2 = points[i + 1][0]; // Multiple values - - if (Array.isArray(points[i][1])) { - y = []; - - for (var c = 0; c < points[i][1].length; c++) { - if (typeof transform === 'function') { - y1 = transform(points[i][1][c]); - y2 = transform(points[i + 1][1][c]); - d = y2 - y1; - y[c] = d * (x - x1) / (x2 - x1) + y1; - } else { - d = points[i + 1][1][c] - points[i][1][c]; - y[c] = d * (x - x1) / (x2 - x1) + points[i][1][c]; - } - } - } // Single value - else { - if (typeof transform === 'function') { - y1 = transform(points[i][1]); - y2 = transform(points[i + 1][1]); - d = y2 - y1; - y = d * (x - x1) / (x2 - x1) + y1; - } else { - d = points[i + 1][1] - points[i][1]; - y = d * (x - x1) / (x2 - x1) + points[i][1]; - } - } - - break; - } - } - } - - return y; -}; - -Utils.toCSSColor = function (color) { - if (color[3] === 1) { - // full opacity - return "rgb(" + color.slice(0, 3).map(function (c) { - return Math.round(c * 255); - }).join(', ') + ")"; - } // RGB is between [0, 255] opacity is between [0, 1] - - - return "rgba(" + color.map(function (c, i) { - return i < 3 && Math.round(c * 255) || c; - }).join(', ') + ")"; -}; - -var debugSettings; -var debugSettings$1 = debugSettings = { - // draws a blue rectangle border around the collision box of a label - draw_label_collision_boxes: false, - // draws a green rectangle border within the texture box of a label - draw_label_texture_boxes: false, - // suppreses fade-in of labels - suppress_label_fade_in: false, - // suppress animaton of label snap to pixel grid - suppress_label_snap_animation: false, - // show hidden labels for debugging - show_hidden_labels: false, - // collect feature/geometry stats on styling layers - layer_stats: false -}; -function mergeDebugSettings(settings) { - Object.assign(debugSettings, settings); -} - -// Works with __proto__ only. Old v8 can't work with null proto objects. -/* eslint-disable no-proto */ - - -var check = function (O, proto) { - _anObject(O); - if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); -}; -var _setProto = { - set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line - function (test, buggy, set) { - try { - set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2); - set(test, []); - buggy = !(test instanceof Array); - } catch (e) { buggy = true; } - return function setPrototypeOf(O, proto) { - check(O, proto); - if (buggy) O.__proto__ = proto; - else set(O, proto); - return O; - }; - }({}, false) : undefined), - check: check -}; - -var setPrototypeOf = _setProto.set; -var _inheritIfRequired = function (that, target, C) { - var S = target.constructor; - var P; - if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && _isObject(P) && setPrototypeOf) { - setPrototypeOf(that, P); - } return that; -}; - -var dP$2 = _objectDp.f; -var gOPN = _objectGopn.f; - - -var $RegExp = _global.RegExp; -var Base = $RegExp; -var proto$1 = $RegExp.prototype; -var re1 = /a/g; -var re2 = /a/g; -// "new" creates a new object, old webkit buggy here -var CORRECT_NEW = new $RegExp(re1) !== re1; - -if (_descriptors && (!CORRECT_NEW || _fails(function () { - re2[_wks('match')] = false; - // RegExp constructor can alter flags and IsRegExp works correct with @@match - return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; -}))) { - $RegExp = function RegExp(p, f) { - var tiRE = this instanceof $RegExp; - var piRE = _isRegexp(p); - var fiU = f === undefined; - return !tiRE && piRE && p.constructor === $RegExp && fiU ? p - : _inheritIfRequired(CORRECT_NEW - ? new Base(piRE && !fiU ? p.source : p, f) - : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? _flags.call(p) : f) - , tiRE ? this : proto$1, $RegExp); - }; - var proxy = function (key) { - key in $RegExp || dP$2($RegExp, key, { - configurable: true, - get: function () { return Base[key]; }, - set: function (it) { Base[key] = it; } - }); - }; - for (var keys = gOPN(Base), i$1 = 0; keys.length > i$1;) proxy(keys[i$1++]); - proto$1.constructor = $RegExp; - $RegExp.prototype = proto$1; - _redefine(_global, 'RegExp', $RegExp); -} - -_setSpecies('RegExp'); - -// 7.2.9 SameValue(x, y) -var _sameValue = Object.is || function is(x, y) { - // eslint-disable-next-line no-self-compare - return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; -}; - -// @@search logic -_fixReWks('search', 1, function (defined, SEARCH, $search, maybeCallNative) { - return [ - // `String.prototype.search` method - // https://tc39.github.io/ecma262/#sec-string.prototype.search - function search(regexp) { - var O = defined(this); - var fn = regexp == undefined ? undefined : regexp[SEARCH]; - return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); - }, - // `RegExp.prototype[@@search]` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search - function (regexp) { - var res = maybeCallNative($search, regexp, this); - if (res.done) return res.value; - var rx = _anObject(regexp); - var S = String(this); - var previousLastIndex = rx.lastIndex; - if (!_sameValue(previousLastIndex, 0)) rx.lastIndex = 0; - var result = _regexpExecAbstract(rx, S); - if (!_sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; - return result === null ? -1 : result.index; - } - ]; -}); - -function addBaseURL(url, base) { - if (!url || !isRelativeURL(url)) { - return url; - } - - var relative_path = url[0] !== '/'; - var base_info; - - if (base) { - base_info = document.createElement('a'); // use a temporary element to parse URL - - base_info.href = base; - } else { - base_info = window.location; - } - - if (relative_path) { - var path = pathForURL(base_info.href); - url = path + url; - } else { - var origin = base_info.origin; - - if (!origin) { - origin = base_info.protocol + '//' + base_info.host; // IE11 doesn't have origin property - } - - url = origin + url; - } - - return url; -} -function pathForURL(url) { - if (typeof url === 'string' && url.search(/^(data|blob):/) === -1) { - var qs = url.indexOf('?'); - - if (qs > -1) { - url = url.substr(0, qs); - } - - var hash = url.indexOf('#'); - - if (hash > -1) { - url = url.substr(0, hash); - } - - return url.substr(0, url.lastIndexOf('/') + 1) || ''; - } - - return ''; -} -function extensionForURL(url) { - url = url.split('/').pop(); - var last_dot = url.lastIndexOf('.'); - - if (last_dot > -1) { - return url.substring(last_dot + 1); - } -} -function isLocalURL(url) { - if (typeof url !== 'string') { - return; - } - - return url.search(/^(data|blob):/) > -1; -} -function isRelativeURL(url) { - if (typeof url !== 'string') { - return; - } - - return !(url.search(/^(http|https|data|blob):/) > -1 || url.substr(0, 2) === '//'); -} // Resolves './' and '../' components from relative path, to get a "flattened" path - -function flattenRelativeURL(url) { - var dirs = (url || '').split('/'); - - for (var d = 1; d < dirs.length; d++) { - if (dirs[d] === '.') { - dirs.splice(d, 1); - d--; - } else if (dirs[d] === '..') { - d = d + 0; - dirs.splice(d - 1, 2); - d--; - } - } - - return dirs.join('/'); -} // Add a set of query string params to a URL -// params: hash of key/value pairs of query string parameters -// returns array of: [modified URL, array of duplicate param name and values] - -function addParamsToURL(url, params) { - if (!params || Object.keys(params).length === 0) { - return [url, []]; - } - - var qs_index = url.indexOf('?'); - var hash_index = url.indexOf('#'); // Save and trim hash - - var hash = ''; - - if (hash_index > -1) { - hash = url.slice(hash_index); - url = url.slice(0, hash_index); - } // Start query string - - - if (qs_index === -1) { - qs_index = url.length; - url += '?'; - } - - qs_index++; // advanced past '?' - // Build query string params - - var url_params = ''; - var dupes = []; - - for (var p in params) { - if (getURLParameter(p, url) !== '') { - dupes.push([p, params[p]]); - continue; - } - - url_params += p + "=" + params[p] + "&"; - } // Insert new query string params and restore hash - - - url = url.slice(0, qs_index) + url_params + url.slice(qs_index) + hash; - return [url, dupes]; -} // Polyfill (for Safari compatibility) - -var _createObjectURL; - -function createObjectURL(url) { - if (_createObjectURL === undefined) { - _createObjectURL = window.URL && window.URL.createObjectURL || window.webkitURL && window.webkitURL.createObjectURL; - - if (typeof _createObjectURL !== 'function') { - _createObjectURL = null; - log('warn', 'window.URL.createObjectURL (or vendor prefix) not found, unable to create local blob URLs'); - } - } - - if (_createObjectURL) { - return _createObjectURL(url); - } else { - return url; - } -} - -function getURLParameter(name, url) { - name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]'); - var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); - var results = regex.exec(url); - return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); -} - -// import log from './log'; -var Task = { - id: 0, - // unique id per task - queue: [], - // current queue of outstanding tasks - max_time: 20, - // default time in which all tasks should complete per frame - start_time: null, - // start time for tasks in current frame - state: {}, - // track flags about environment state (ex: whether user is currently moving the view) - add: function add(task) { - task.id = Task.id++; - task.max_time = task.max_time || Task.max_time; // allow task to run for this much time (tasks have a global collective limit per frame, too) - - task.pause_factor = task.pause_factor || 1; // pause tasks by this many frames when they run too long - - var promise = new Promise(function (resolve, reject) { - task.resolve = resolve; - task.reject = reject; - }); - task.promise = promise; - task.elapsed = 0; - task.total_elapsed = 0; - task.stats = { - calls: 0 - }; - this.queue.push(task); // Run task immediately if under total frame time - - this.start_time = this.start_time || performance.now(); // start frame timer if necessary - - this.elapsed = performance.now() - this.start_time; - - if (this.elapsed < Task.max_time || task.immediate) { - this.process(task); - } - - return task.promise; - }, - remove: function remove(task) { - var idx = this.queue.indexOf(task); - - if (idx > -1) { - this.queue.splice(idx, 1); - } - }, - process: function process(task) { - // Skip task while user is moving the view, if the task requests it - // (for intensive tasks that lock the UI, like canvas rasterization) - if (this.state.user_moving_view && task.user_moving_view === false) { - // log('debug', `*** SKIPPING task id ${task.id}, ${task.type} while user is moving view`); - return; - } // Skip task if it's currently paused - - - if (task.pause) { - // log('debug', `*** PAUSING task id ${task.id}, ${task.type} (${task.pause})`); - task.pause--; - return true; - } - - task.stats.calls++; - task.start_time = performance.now(); // start task timer - - return task.run(task); - }, - processAll: function processAll() { - this.start_time = this.start_time || performance.now(); // start frame timer if necessary - - for (var i = 0; i < this.queue.length; i++) { - // Exceeded either total task time, or total frame time - var task = this.queue[i]; - - if (this.process(task) !== true) { - // If the task didn't complete, pause it for a task-specific number of frames - // (can be disabled by setting pause_factor to 0) - if (!task.pause) { - task.pause = task.elapsed > task.max_time ? task.pause_factor : 0; - } - - task.total_elapsed += task.elapsed; - } // Check total frame time - - - this.elapsed = performance.now() - this.start_time; - - if (this.elapsed >= Task.max_time) { - this.start_time = null; // reset frame timer - - break; - } - } - }, - finish: function finish(task, value) { - task.elapsed = performance.now() - task.start_time; - task.total_elapsed += task.elapsed; // log('debug', `task type ${task.type}, tile ${task.id}, finish after ${task.stats.calls} calls, ${task.total_elapsed.toFixed(2)} elapsed`); - - this.remove(task); - task.resolve(value); - return task.promise; - }, - cancel: function cancel(task) { - var val; - - if (task.cancel instanceof Function) { - val = task.cancel(task); // optional cancel function - } - - task.resolve(val); - }, - shouldContinue: function shouldContinue(task) { - // Suspend task if it runs over its specific per-frame limit, or the global limit - task.elapsed = performance.now() - task.start_time; - this.elapsed = performance.now() - this.start_time; - return task.elapsed < task.max_time && this.elapsed < Task.max_time; - }, - removeForTile: function removeForTile(tile_id) { - for (var idx = this.queue.length - 1; idx >= 0; idx--) { - if (this.queue[idx].tile_id === tile_id) { - // log('trace', `Task: remove tasks for tile ${tile_id}`); - this.cancel(this.queue[idx]); - this.queue.splice(idx, 1); - } - } - }, - setState: function setState(state) { - this.state = state; - } -}; - -function subscribeMixin(target) { - var listeners = []; - return Object.assign(target, { - subscribe: function subscribe(listener) { - if (listeners.indexOf(listener) === -1) { - listeners.push(listener); - } - }, - unsubscribe: function unsubscribe(listener) { - var index = listeners.indexOf(listener); - - if (index > -1) { - listeners.splice(index, 1); - } - }, - unsubscribeAll: function unsubscribeAll() { - listeners = []; - }, - trigger: function trigger(event) { - for (var _len = arguments.length, data = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - data[_key - 1] = arguments[_key]; - } - - listeners.forEach(function (listener) { - if (typeof listener[event] === 'function') { - try { - listener[event].apply(listener, data); - } catch (e) { - log('warn', "Caught exception in listener for event '" + event + "':", e); - } - } - }); - }, - hasSubscribersFor: function hasSubscribersFor(event) { - var has = false; - listeners.forEach(function (listener) { - if (typeof listener[event] === 'function') { - has = true; - } - }); - return has; - } - }); -} - -function sliceObject(obj, keys) { - var sliced = {}; - keys.forEach(function (k) { - return sliced[k] = obj[k]; - }); - return sliced; -} - -var _stringRepeat = function repeat(count) { - var str = String(_defined(this)); - var res = ''; - var n = _toInteger(count); - if (n < 0 || n == Infinity) throw RangeError("Count can't be negative"); - for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str; - return res; -}; - -_export(_export.P, 'String', { - // 21.1.3.13 String.prototype.repeat(count) - repeat: _stringRepeat -}); - -var TYPED = _uid('typed_array'); -var VIEW = _uid('view'); -var ABV = !!(_global.ArrayBuffer && _global.DataView); -var CONSTR = ABV; -var i$2 = 0; -var l = 9; -var Typed; - -var TypedArrayConstructors = ( - 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array' -).split(','); - -while (i$2 < l) { - if (Typed = _global[TypedArrayConstructors[i$2++]]) { - _hide(Typed.prototype, TYPED, true); - _hide(Typed.prototype, VIEW, true); - } else CONSTR = false; -} - -var _typed = { - ABV: ABV, - CONSTR: CONSTR, - TYPED: TYPED, - VIEW: VIEW -}; - -// https://tc39.github.io/ecma262/#sec-toindex - - -var _toIndex = function (it) { - if (it === undefined) return 0; - var number = _toInteger(it); - var length = _toLength(number); - if (number !== length) throw RangeError('Wrong length!'); - return length; -}; - -var _arrayFill = function fill(value /* , start = 0, end = @length */) { - var O = _toObject(this); - var length = _toLength(O.length); - var aLen = arguments.length; - var index = _toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length); - var end = aLen > 2 ? arguments[2] : undefined; - var endPos = end === undefined ? length : _toAbsoluteIndex(end, length); - while (endPos > index) O[index++] = value; - return O; -}; - -var _typedBuffer = createCommonjsModule(function (module, exports) { - - - - - - - - - - - -var gOPN = _objectGopn.f; -var dP = _objectDp.f; - - -var ARRAY_BUFFER = 'ArrayBuffer'; -var DATA_VIEW = 'DataView'; -var PROTOTYPE = 'prototype'; -var WRONG_LENGTH = 'Wrong length!'; -var WRONG_INDEX = 'Wrong index!'; -var $ArrayBuffer = _global[ARRAY_BUFFER]; -var $DataView = _global[DATA_VIEW]; -var Math = _global.Math; -var RangeError = _global.RangeError; -// eslint-disable-next-line no-shadow-restricted-names -var Infinity = _global.Infinity; -var BaseBuffer = $ArrayBuffer; -var abs = Math.abs; -var pow = Math.pow; -var floor = Math.floor; -var log = Math.log; -var LN2 = Math.LN2; -var BUFFER = 'buffer'; -var BYTE_LENGTH = 'byteLength'; -var BYTE_OFFSET = 'byteOffset'; -var $BUFFER = _descriptors ? '_b' : BUFFER; -var $LENGTH = _descriptors ? '_l' : BYTE_LENGTH; -var $OFFSET = _descriptors ? '_o' : BYTE_OFFSET; - -// IEEE754 conversions based on https://github.com/feross/ieee754 -function packIEEE754(value, mLen, nBytes) { - var buffer = new Array(nBytes); - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0; - var i = 0; - var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; - var e, m, c; - value = abs(value); - // eslint-disable-next-line no-self-compare - if (value != value || value === Infinity) { - // eslint-disable-next-line no-self-compare - m = value != value ? 1 : 0; - e = eMax; - } else { - e = floor(log(value) / LN2); - if (value * (c = pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * pow(2, mLen); - e = e + eBias; - } else { - m = value * pow(2, eBias - 1) * pow(2, mLen); - e = 0; - } - } - for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8); - e = e << mLen | m; - eLen += mLen; - for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8); - buffer[--i] |= s * 128; - return buffer; -} -function unpackIEEE754(buffer, mLen, nBytes) { - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var nBits = eLen - 7; - var i = nBytes - 1; - var s = buffer[i--]; - var e = s & 127; - var m; - s >>= 7; - for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8); - m = e & (1 << -nBits) - 1; - e >>= -nBits; - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8); - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : s ? -Infinity : Infinity; - } else { - m = m + pow(2, mLen); - e = e - eBias; - } return (s ? -1 : 1) * m * pow(2, e - mLen); -} - -function unpackI32(bytes) { - return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0]; -} -function packI8(it) { - return [it & 0xff]; -} -function packI16(it) { - return [it & 0xff, it >> 8 & 0xff]; -} -function packI32(it) { - return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff]; -} -function packF64(it) { - return packIEEE754(it, 52, 8); -} -function packF32(it) { - return packIEEE754(it, 23, 4); -} - -function addGetter(C, key, internal) { - dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } }); -} - -function get(view, bytes, index, isLittleEndian) { - var numIndex = +index; - var intIndex = _toIndex(numIndex); - if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX); - var store = view[$BUFFER]._b; - var start = intIndex + view[$OFFSET]; - var pack = store.slice(start, start + bytes); - return isLittleEndian ? pack : pack.reverse(); -} -function set(view, bytes, index, conversion, value, isLittleEndian) { - var numIndex = +index; - var intIndex = _toIndex(numIndex); - if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX); - var store = view[$BUFFER]._b; - var start = intIndex + view[$OFFSET]; - var pack = conversion(+value); - for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1]; -} - -if (!_typed.ABV) { - $ArrayBuffer = function ArrayBuffer(length) { - _anInstance(this, $ArrayBuffer, ARRAY_BUFFER); - var byteLength = _toIndex(length); - this._b = _arrayFill.call(new Array(byteLength), 0); - this[$LENGTH] = byteLength; - }; - - $DataView = function DataView(buffer, byteOffset, byteLength) { - _anInstance(this, $DataView, DATA_VIEW); - _anInstance(buffer, $ArrayBuffer, DATA_VIEW); - var bufferLength = buffer[$LENGTH]; - var offset = _toInteger(byteOffset); - if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!'); - byteLength = byteLength === undefined ? bufferLength - offset : _toLength(byteLength); - if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH); - this[$BUFFER] = buffer; - this[$OFFSET] = offset; - this[$LENGTH] = byteLength; - }; - - if (_descriptors) { - addGetter($ArrayBuffer, BYTE_LENGTH, '_l'); - addGetter($DataView, BUFFER, '_b'); - addGetter($DataView, BYTE_LENGTH, '_l'); - addGetter($DataView, BYTE_OFFSET, '_o'); - } - - _redefineAll($DataView[PROTOTYPE], { - getInt8: function getInt8(byteOffset) { - return get(this, 1, byteOffset)[0] << 24 >> 24; - }, - getUint8: function getUint8(byteOffset) { - return get(this, 1, byteOffset)[0]; - }, - getInt16: function getInt16(byteOffset /* , littleEndian */) { - var bytes = get(this, 2, byteOffset, arguments[1]); - return (bytes[1] << 8 | bytes[0]) << 16 >> 16; - }, - getUint16: function getUint16(byteOffset /* , littleEndian */) { - var bytes = get(this, 2, byteOffset, arguments[1]); - return bytes[1] << 8 | bytes[0]; - }, - getInt32: function getInt32(byteOffset /* , littleEndian */) { - return unpackI32(get(this, 4, byteOffset, arguments[1])); - }, - getUint32: function getUint32(byteOffset /* , littleEndian */) { - return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0; - }, - getFloat32: function getFloat32(byteOffset /* , littleEndian */) { - return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4); - }, - getFloat64: function getFloat64(byteOffset /* , littleEndian */) { - return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8); - }, - setInt8: function setInt8(byteOffset, value) { - set(this, 1, byteOffset, packI8, value); - }, - setUint8: function setUint8(byteOffset, value) { - set(this, 1, byteOffset, packI8, value); - }, - setInt16: function setInt16(byteOffset, value /* , littleEndian */) { - set(this, 2, byteOffset, packI16, value, arguments[2]); - }, - setUint16: function setUint16(byteOffset, value /* , littleEndian */) { - set(this, 2, byteOffset, packI16, value, arguments[2]); - }, - setInt32: function setInt32(byteOffset, value /* , littleEndian */) { - set(this, 4, byteOffset, packI32, value, arguments[2]); - }, - setUint32: function setUint32(byteOffset, value /* , littleEndian */) { - set(this, 4, byteOffset, packI32, value, arguments[2]); - }, - setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) { - set(this, 4, byteOffset, packF32, value, arguments[2]); - }, - setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) { - set(this, 8, byteOffset, packF64, value, arguments[2]); - } - }); -} else { - if (!_fails(function () { - $ArrayBuffer(1); - }) || !_fails(function () { - new $ArrayBuffer(-1); // eslint-disable-line no-new - }) || _fails(function () { - new $ArrayBuffer(); // eslint-disable-line no-new - new $ArrayBuffer(1.5); // eslint-disable-line no-new - new $ArrayBuffer(NaN); // eslint-disable-line no-new - return $ArrayBuffer.name != ARRAY_BUFFER; - })) { - $ArrayBuffer = function ArrayBuffer(length) { - _anInstance(this, $ArrayBuffer); - return new BaseBuffer(_toIndex(length)); - }; - var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE]; - for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) { - if (!((key = keys[j++]) in $ArrayBuffer)) _hide($ArrayBuffer, key, BaseBuffer[key]); - } - ArrayBufferProto.constructor = $ArrayBuffer; - } - // iOS Safari 7.x bug - var view = new $DataView(new $ArrayBuffer(2)); - var $setInt8 = $DataView[PROTOTYPE].setInt8; - view.setInt8(0, 2147483648); - view.setInt8(1, 2147483649); - if (view.getInt8(0) || !view.getInt8(1)) _redefineAll($DataView[PROTOTYPE], { - setInt8: function setInt8(byteOffset, value) { - $setInt8.call(this, byteOffset, value << 24 >> 24); - }, - setUint8: function setUint8(byteOffset, value) { - $setInt8.call(this, byteOffset, value << 24 >> 24); - } - }, true); -} -_setToStringTag($ArrayBuffer, ARRAY_BUFFER); -_setToStringTag($DataView, DATA_VIEW); -_hide($DataView[PROTOTYPE], _typed.VIEW, true); -exports[ARRAY_BUFFER] = $ArrayBuffer; -exports[DATA_VIEW] = $DataView; -}); - -var SPECIES$3 = _wks('species'); - -var _arraySpeciesConstructor = function (original) { - var C; - if (_isArray(original)) { - C = original.constructor; - // cross-realm fallback - if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined; - if (_isObject(C)) { - C = C[SPECIES$3]; - if (C === null) C = undefined; - } - } return C === undefined ? Array : C; -}; - -// 9.4.2.3 ArraySpeciesCreate(originalArray, length) - - -var _arraySpeciesCreate = function (original, length) { - return new (_arraySpeciesConstructor(original))(length); -}; - -// 0 -> Array#forEach -// 1 -> Array#map -// 2 -> Array#filter -// 3 -> Array#some -// 4 -> Array#every -// 5 -> Array#find -// 6 -> Array#findIndex - - - - - -var _arrayMethods = function (TYPE, $create) { - var IS_MAP = TYPE == 1; - var IS_FILTER = TYPE == 2; - var IS_SOME = TYPE == 3; - var IS_EVERY = TYPE == 4; - var IS_FIND_INDEX = TYPE == 6; - var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; - var create = $create || _arraySpeciesCreate; - return function ($this, callbackfn, that) { - var O = _toObject($this); - var self = _iobject(O); - var f = _ctx(callbackfn, that, 3); - var length = _toLength(self.length); - var index = 0; - var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; - var val, res; - for (;length > index; index++) if (NO_HOLES || index in self) { - val = self[index]; - res = f(val, index, O); - if (TYPE) { - if (IS_MAP) result[index] = res; // map - else if (res) switch (TYPE) { - case 3: return true; // some - case 5: return val; // find - case 6: return index; // findIndex - case 2: result.push(val); // filter - } else if (IS_EVERY) return false; // every - } - } - return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; - }; -}; - -var _arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) { - var O = _toObject(this); - var len = _toLength(O.length); - var to = _toAbsoluteIndex(target, len); - var from = _toAbsoluteIndex(start, len); - var end = arguments.length > 2 ? arguments[2] : undefined; - var count = Math.min((end === undefined ? len : _toAbsoluteIndex(end, len)) - from, len - to); - var inc = 1; - if (from < to && to < from + count) { - inc = -1; - from += count - 1; - to += count - 1; - } - while (count-- > 0) { - if (from in O) O[to] = O[from]; - else delete O[to]; - to += inc; - from += inc; - } return O; -}; - -var _typedArray = createCommonjsModule(function (module) { -if (_descriptors) { - var LIBRARY = _library; - var global = _global; - var fails = _fails; - var $export = _export; - var $typed = _typed; - var $buffer = _typedBuffer; - var ctx = _ctx; - var anInstance = _anInstance; - var propertyDesc = _propertyDesc; - var hide = _hide; - var redefineAll = _redefineAll; - var toInteger = _toInteger; - var toLength = _toLength; - var toIndex = _toIndex; - var toAbsoluteIndex = _toAbsoluteIndex; - var toPrimitive = _toPrimitive; - var has = _has; - var classof = _classof; - var isObject = _isObject; - var toObject = _toObject; - var isArrayIter = _isArrayIter; - var create = _objectCreate; - var getPrototypeOf = _objectGpo; - var gOPN = _objectGopn.f; - var getIterFn = core_getIteratorMethod; - var uid = _uid; - var wks = _wks; - var createArrayMethod = _arrayMethods; - var createArrayIncludes = _arrayIncludes; - var speciesConstructor = _speciesConstructor; - var ArrayIterators = es6_array_iterator; - var Iterators = _iterators; - var $iterDetect = _iterDetect; - var setSpecies = _setSpecies; - var arrayFill = _arrayFill; - var arrayCopyWithin = _arrayCopyWithin; - var $DP = _objectDp; - var $GOPD = _objectGopd; - var dP = $DP.f; - var gOPD = $GOPD.f; - var RangeError = global.RangeError; - var TypeError = global.TypeError; - var Uint8Array = global.Uint8Array; - var ARRAY_BUFFER = 'ArrayBuffer'; - var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER; - var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT'; - var PROTOTYPE = 'prototype'; - var ArrayProto = Array[PROTOTYPE]; - var $ArrayBuffer = $buffer.ArrayBuffer; - var $DataView = $buffer.DataView; - var arrayForEach = createArrayMethod(0); - var arrayFilter = createArrayMethod(2); - var arraySome = createArrayMethod(3); - var arrayEvery = createArrayMethod(4); - var arrayFind = createArrayMethod(5); - var arrayFindIndex = createArrayMethod(6); - var arrayIncludes = createArrayIncludes(true); - var arrayIndexOf = createArrayIncludes(false); - var arrayValues = ArrayIterators.values; - var arrayKeys = ArrayIterators.keys; - var arrayEntries = ArrayIterators.entries; - var arrayLastIndexOf = ArrayProto.lastIndexOf; - var arrayReduce = ArrayProto.reduce; - var arrayReduceRight = ArrayProto.reduceRight; - var arrayJoin = ArrayProto.join; - var arraySort = ArrayProto.sort; - var arraySlice = ArrayProto.slice; - var arrayToString = ArrayProto.toString; - var arrayToLocaleString = ArrayProto.toLocaleString; - var ITERATOR = wks('iterator'); - var TAG = wks('toStringTag'); - var TYPED_CONSTRUCTOR = uid('typed_constructor'); - var DEF_CONSTRUCTOR = uid('def_constructor'); - var ALL_CONSTRUCTORS = $typed.CONSTR; - var TYPED_ARRAY = $typed.TYPED; - var VIEW = $typed.VIEW; - var WRONG_LENGTH = 'Wrong length!'; - - var $map = createArrayMethod(1, function (O, length) { - return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length); - }); - - var LITTLE_ENDIAN = fails(function () { - // eslint-disable-next-line no-undef - return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1; - }); - - var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () { - new Uint8Array(1).set({}); - }); - - var toOffset = function (it, BYTES) { - var offset = toInteger(it); - if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!'); - return offset; - }; - - var validate = function (it) { - if (isObject(it) && TYPED_ARRAY in it) return it; - throw TypeError(it + ' is not a typed array!'); - }; - - var allocate = function (C, length) { - if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) { - throw TypeError('It is not a typed array constructor!'); - } return new C(length); - }; - - var speciesFromList = function (O, list) { - return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list); - }; - - var fromList = function (C, list) { - var index = 0; - var length = list.length; - var result = allocate(C, length); - while (length > index) result[index] = list[index++]; - return result; - }; - - var addGetter = function (it, key, internal) { - dP(it, key, { get: function () { return this._d[internal]; } }); - }; - - var $from = function from(source /* , mapfn, thisArg */) { - var O = toObject(source); - var aLen = arguments.length; - var mapfn = aLen > 1 ? arguments[1] : undefined; - var mapping = mapfn !== undefined; - var iterFn = getIterFn(O); - var i, length, values, result, step, iterator; - if (iterFn != undefined && !isArrayIter(iterFn)) { - for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) { - values.push(step.value); - } O = values; - } - if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2); - for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) { - result[i] = mapping ? mapfn(O[i], i) : O[i]; - } - return result; - }; - - var $of = function of(/* ...items */) { - var index = 0; - var length = arguments.length; - var result = allocate(this, length); - while (length > index) result[index] = arguments[index++]; - return result; - }; - - // iOS Safari 6.x fails here - var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); }); - - var $toLocaleString = function toLocaleString() { - return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments); - }; - - var proto = { - copyWithin: function copyWithin(target, start /* , end */) { - return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined); - }, - every: function every(callbackfn /* , thisArg */) { - return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); - }, - fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars - return arrayFill.apply(validate(this), arguments); - }, - filter: function filter(callbackfn /* , thisArg */) { - return speciesFromList(this, arrayFilter(validate(this), callbackfn, - arguments.length > 1 ? arguments[1] : undefined)); - }, - find: function find(predicate /* , thisArg */) { - return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined); - }, - findIndex: function findIndex(predicate /* , thisArg */) { - return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined); - }, - forEach: function forEach(callbackfn /* , thisArg */) { - arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); - }, - indexOf: function indexOf(searchElement /* , fromIndex */) { - return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); - }, - includes: function includes(searchElement /* , fromIndex */) { - return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined); - }, - join: function join(separator) { // eslint-disable-line no-unused-vars - return arrayJoin.apply(validate(this), arguments); - }, - lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars - return arrayLastIndexOf.apply(validate(this), arguments); - }, - map: function map(mapfn /* , thisArg */) { - return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined); - }, - reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars - return arrayReduce.apply(validate(this), arguments); - }, - reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars - return arrayReduceRight.apply(validate(this), arguments); - }, - reverse: function reverse() { - var that = this; - var length = validate(that).length; - var middle = Math.floor(length / 2); - var index = 0; - var value; - while (index < middle) { - value = that[index]; - that[index++] = that[--length]; - that[length] = value; - } return that; - }, - some: function some(callbackfn /* , thisArg */) { - return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); - }, - sort: function sort(comparefn) { - return arraySort.call(validate(this), comparefn); - }, - subarray: function subarray(begin, end) { - var O = validate(this); - var length = O.length; - var $begin = toAbsoluteIndex(begin, length); - return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))( - O.buffer, - O.byteOffset + $begin * O.BYTES_PER_ELEMENT, - toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin) - ); - } - }; - - var $slice = function slice(start, end) { - return speciesFromList(this, arraySlice.call(validate(this), start, end)); - }; - - var $set = function set(arrayLike /* , offset */) { - validate(this); - var offset = toOffset(arguments[1], 1); - var length = this.length; - var src = toObject(arrayLike); - var len = toLength(src.length); - var index = 0; - if (len + offset > length) throw RangeError(WRONG_LENGTH); - while (index < len) this[offset + index] = src[index++]; - }; - - var $iterators = { - entries: function entries() { - return arrayEntries.call(validate(this)); - }, - keys: function keys() { - return arrayKeys.call(validate(this)); - }, - values: function values() { - return arrayValues.call(validate(this)); - } - }; - - var isTAIndex = function (target, key) { - return isObject(target) - && target[TYPED_ARRAY] - && typeof key != 'symbol' - && key in target - && String(+key) == String(key); - }; - var $getDesc = function getOwnPropertyDescriptor(target, key) { - return isTAIndex(target, key = toPrimitive(key, true)) - ? propertyDesc(2, target[key]) - : gOPD(target, key); - }; - var $setDesc = function defineProperty(target, key, desc) { - if (isTAIndex(target, key = toPrimitive(key, true)) - && isObject(desc) - && has(desc, 'value') - && !has(desc, 'get') - && !has(desc, 'set') - // TODO: add validation descriptor w/o calling accessors - && !desc.configurable - && (!has(desc, 'writable') || desc.writable) - && (!has(desc, 'enumerable') || desc.enumerable) - ) { - target[key] = desc.value; - return target; - } return dP(target, key, desc); - }; - - if (!ALL_CONSTRUCTORS) { - $GOPD.f = $getDesc; - $DP.f = $setDesc; - } - - $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', { - getOwnPropertyDescriptor: $getDesc, - defineProperty: $setDesc - }); - - if (fails(function () { arrayToString.call({}); })) { - arrayToString = arrayToLocaleString = function toString() { - return arrayJoin.call(this); - }; - } - - var $TypedArrayPrototype$ = redefineAll({}, proto); - redefineAll($TypedArrayPrototype$, $iterators); - hide($TypedArrayPrototype$, ITERATOR, $iterators.values); - redefineAll($TypedArrayPrototype$, { - slice: $slice, - set: $set, - constructor: function () { /* noop */ }, - toString: arrayToString, - toLocaleString: $toLocaleString - }); - addGetter($TypedArrayPrototype$, 'buffer', 'b'); - addGetter($TypedArrayPrototype$, 'byteOffset', 'o'); - addGetter($TypedArrayPrototype$, 'byteLength', 'l'); - addGetter($TypedArrayPrototype$, 'length', 'e'); - dP($TypedArrayPrototype$, TAG, { - get: function () { return this[TYPED_ARRAY]; } - }); - - // eslint-disable-next-line max-statements - module.exports = function (KEY, BYTES, wrapper, CLAMPED) { - CLAMPED = !!CLAMPED; - var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array'; - var GETTER = 'get' + KEY; - var SETTER = 'set' + KEY; - var TypedArray = global[NAME]; - var Base = TypedArray || {}; - var TAC = TypedArray && getPrototypeOf(TypedArray); - var FORCED = !TypedArray || !$typed.ABV; - var O = {}; - var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE]; - var getter = function (that, index) { - var data = that._d; - return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN); - }; - var setter = function (that, index, value) { - var data = that._d; - if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff; - data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN); - }; - var addElement = function (that, index) { - dP(that, index, { - get: function () { - return getter(this, index); - }, - set: function (value) { - return setter(this, index, value); - }, - enumerable: true - }); - }; - if (FORCED) { - TypedArray = wrapper(function (that, data, $offset, $length) { - anInstance(that, TypedArray, NAME, '_d'); - var index = 0; - var offset = 0; - var buffer, byteLength, length, klass; - if (!isObject(data)) { - length = toIndex(data); - byteLength = length * BYTES; - buffer = new $ArrayBuffer(byteLength); - } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) { - buffer = data; - offset = toOffset($offset, BYTES); - var $len = data.byteLength; - if ($length === undefined) { - if ($len % BYTES) throw RangeError(WRONG_LENGTH); - byteLength = $len - offset; - if (byteLength < 0) throw RangeError(WRONG_LENGTH); - } else { - byteLength = toLength($length) * BYTES; - if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH); - } - length = byteLength / BYTES; - } else if (TYPED_ARRAY in data) { - return fromList(TypedArray, data); - } else { - return $from.call(TypedArray, data); - } - hide(that, '_d', { - b: buffer, - o: offset, - l: byteLength, - e: length, - v: new $DataView(buffer) - }); - while (index < length) addElement(that, index++); - }); - TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$); - hide(TypedArrayPrototype, 'constructor', TypedArray); - } else if (!fails(function () { - TypedArray(1); - }) || !fails(function () { - new TypedArray(-1); // eslint-disable-line no-new - }) || !$iterDetect(function (iter) { - new TypedArray(); // eslint-disable-line no-new - new TypedArray(null); // eslint-disable-line no-new - new TypedArray(1.5); // eslint-disable-line no-new - new TypedArray(iter); // eslint-disable-line no-new - }, true)) { - TypedArray = wrapper(function (that, data, $offset, $length) { - anInstance(that, TypedArray, NAME); - var klass; - // `ws` module bug, temporarily remove validation length for Uint8Array - // https://github.com/websockets/ws/pull/645 - if (!isObject(data)) return new Base(toIndex(data)); - if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) { - return $length !== undefined - ? new Base(data, toOffset($offset, BYTES), $length) - : $offset !== undefined - ? new Base(data, toOffset($offset, BYTES)) - : new Base(data); - } - if (TYPED_ARRAY in data) return fromList(TypedArray, data); - return $from.call(TypedArray, data); - }); - arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) { - if (!(key in TypedArray)) hide(TypedArray, key, Base[key]); - }); - TypedArray[PROTOTYPE] = TypedArrayPrototype; - if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray; - } - var $nativeIterator = TypedArrayPrototype[ITERATOR]; - var CORRECT_ITER_NAME = !!$nativeIterator - && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined); - var $iterator = $iterators.values; - hide(TypedArray, TYPED_CONSTRUCTOR, true); - hide(TypedArrayPrototype, TYPED_ARRAY, NAME); - hide(TypedArrayPrototype, VIEW, true); - hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray); - - if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) { - dP(TypedArrayPrototype, TAG, { - get: function () { return NAME; } - }); - } - - O[NAME] = TypedArray; - - $export($export.G + $export.W + $export.F * (TypedArray != Base), O); - - $export($export.S, NAME, { - BYTES_PER_ELEMENT: BYTES - }); - - $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, { - from: $from, - of: $of - }); - - if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES); - - $export($export.P, NAME, proto); - - setSpecies(NAME); - - $export($export.P + $export.F * FORCED_SET, NAME, { set: $set }); - - $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators); - - if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString; - - $export($export.P + $export.F * fails(function () { - new TypedArray(1).slice(); - }), NAME, { slice: $slice }); - - $export($export.P + $export.F * (fails(function () { - return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString(); - }) || !fails(function () { - TypedArrayPrototype.toLocaleString.call([1, 2]); - })), NAME, { toLocaleString: $toLocaleString }); - - Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator; - if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator); - }; -} else module.exports = function () { /* empty */ }; -}); - -_typedArray('Uint8', 1, function (init) { - return function Uint8Array(data, byteOffset, length) { - return init(this, data, byteOffset, length); - }; -}); - -var Texture = -/*#__PURE__*/ -function () { - function Texture(gl, name, options) { - if (options === void 0) { - options = {}; - } - - options = Texture.sliceOptions(options); // exclude any non-texture-specific props - - this.gl = gl; - this.texture = gl.createTexture(); - - if (this.texture) { - this.valid = true; - } - - this.bind(); - this.name = name; - this.retain_count = 0; - this.config_type = null; - this.loading = null; // a Promise object to track the loading state of this texture - - this.loaded = false; // successfully loaded as expected - - this.filtering = options.filtering; - this.density = options.density || 1; // native pixel density of texture - - this.sprites = options.sprites; - this.texcoords = {}; // sprite UVs ([0, 1] range) - - this.sizes = {}; // sprite sizes (pixel size) - - this.css_sizes = {}; // sprite sizes, adjusted for native texture pixel density - - this.aspects = {}; // sprite aspect ratios - // Default to a 1-pixel transparent black texture so we can safely render while we wait for an image to load - // See: http://stackoverflow.com/questions/19722247/webgl-wait-for-texture-to-load - - this.setData(1, 1, new Uint8Array([0, 0, 0, 0]), { - filtering: 'nearest' - }); - this.loaded = false; // don't consider loaded when only placeholder data is present - // Destroy previous texture if present - - if (Texture.textures[this.name]) { - // Preserve previous retain count - this.retain_count = Texture.textures[this.name].retain_count; - Texture.textures[this.name].retain_count = 0; // allow to be freed - - Texture.textures[this.name].destroy(); - } // Cache texture instance and definition - - - Texture.textures[this.name] = this; - Texture.texture_configs[this.name] = JSON.stringify(Object.assign({ - name: name - }, options)); - this.load(options); - log('trace', "creating Texture " + this.name); - } // Destroy a single texture instance - - - var _proto = Texture.prototype; - - _proto.destroy = function destroy(_temp) { - var _ref = _temp === void 0 ? {} : _temp, - force = _ref.force; - - if (this.retain_count > 0 && !force) { - log('error', "Texture '" + this.name + "': destroying texture with retain count of '" + this.retain_count + "'"); - return; - } - - if (!this.valid) { - return; - } - - this.gl.deleteTexture(this.texture); - this.texture = null; - - if (Texture.textures[this.name] === this) { - delete Texture.textures[this.name]; - delete Texture.texture_configs[this.name]; - } - - this.valid = false; - log('trace', "destroying Texture " + this.name); - }; - - _proto.retain = function retain() { - this.retain_count++; - }; - - _proto.release = function release() { - if (this.retain_count <= 0) { - log('error', "Texture '" + this.name + "': releasing texture with retain count of '" + this.retain_count + "'"); - } - - this.retain_count--; - - if (this.retain_count <= 0) { - this.destroy(); - } - }; - - _proto.bind = function bind(unit) { - if (unit === void 0) { - unit = 0; - } - - if (!this.valid) { - return; - } - - if (Texture.activeUnit !== unit) { - this.gl.activeTexture(this.gl.TEXTURE0 + unit); - Texture.activeUnit = unit; - Texture.boundTexture = null; // texture must be re-bound when unit changes - } - - if (Texture.boundTexture !== this.texture) { - this.gl.bindTexture(this.gl.TEXTURE_2D, this.texture); - Texture.boundTexture = this.texture; - } - }; - - _proto.load = function load(options) { - var _this = this; - - if (!options) { - return this.loading || Promise.resolve(this); - } - - this.loading = null; - - if (typeof options.url === 'string') { - this.config_type = 'url'; - this.setUrl(options.url, options); - } else if (options.element) { - this.config_type = 'element'; - this.setElement(options.element, options); - } else if (options.data && options.width && options.height) { - this.config_type = 'data'; - this.setData(options.width, options.height, options.data, options); - } - - this.loading = this.loading && this.loading.then(function () { - _this.calculateSprites(); - - return _this; - }) || Promise.resolve(this); - return this.loading; - } // Sets texture from an url - ; - - _proto.setUrl = function setUrl(url, options) { - var _this2 = this; - - if (options === void 0) { - options = {}; - } - - if (!this.valid) { - return; - } - - this.url = url; // save URL reference (will be overwritten when element is loaded below) - - this.loading = new Promise(function (resolve) { - var image = new Image(); - - image.onload = function () { - try { - // For data URL images, first draw the image to a separate canvas element. Workaround for - // obscure bug seen with small (<28px) SVG images encoded as data URLs in Chrome and Safari. - if (_this2.url.slice(0, 5) === 'data:') { - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - canvas.width = image.width; - canvas.height = image.height; - ctx.drawImage(image, 0, 0); - - _this2.setElement(canvas, options); - } else { - _this2.setElement(image, options); - } - } catch (e) { - _this2.loaded = false; - log('warn', "Texture '" + _this2.name + "': failed to load url: '" + _this2.url + "'", e, options); - Texture.trigger('warning', { - message: "Failed to load texture from " + _this2.url, - error: e, - texture: options - }); - } - - _this2.loaded = true; - resolve(_this2); - }; - - image.onerror = function (e) { - // Warn and resolve on error - _this2.loaded = false; - log('warn', "Texture '" + _this2.name + "': failed to load url: '" + _this2.url + "'", e, options); - Texture.trigger('warning', { - message: "Failed to load texture from " + _this2.url, - error: e, - texture: options - }); - resolve(_this2); - }; // Safari has a bug loading data-URL images with CORS enabled, so it must be disabled in that case - // https://bugs.webkit.org/show_bug.cgi?id=123978 - - - if (!(Utils.isSafari() && _this2.url.slice(0, 5) === 'data:')) { - image.crossOrigin = 'anonymous'; - } - - image.src = _this2.url; - }); - return this.loading; - } // Sets texture to a raw image buffer - ; - - _proto.setData = function setData(width, height, data, options) { - if (options === void 0) { - options = {}; - } - - this.width = width; - this.height = height; // Convert regular array to typed array - - if (Array.isArray(data)) { - data = new Uint8Array(data); - } - - this.update(data, options); - this.setFiltering(options); - this.loaded = true; - this.loading = Promise.resolve(this); - return this.loading; - } // Sets the texture to track a element (canvas/image) - ; - - _proto.setElement = function setElement(element, options) { - var el = element; // a string element is interpeted as a CSS selector - - if (typeof element === 'string') { - element = document.querySelector(element); - } - - if (element instanceof HTMLCanvasElement || element instanceof HTMLImageElement || element instanceof HTMLVideoElement) { - this.update(element, options); - this.setFiltering(options); - } else { - this.loaded = false; - var msg = "the 'element' parameter (`element: " + JSON.stringify(el) + "`) must be a CSS "; - msg += 'selector string, or a , or