diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..46b61b1c3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] + +# Change these settings to your own preference +indent_style = space +indent_size = 2 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..c637f57d7 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,12 @@ +{ +"globals": { + "angular": true, + "lodash": true, + "expect": true, + "describe": true, + "it": true, + "xit": true, + "spyOn": true +}, + "extends": "airbnb" +} diff --git a/.gitignore b/.gitignore index 650751b26..f9d5bdb44 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,22 @@ -/.settings -/.project +.DS_Store +/.settings +/.project +node_modules +old/ +tmp/ +.tmp/ +*~ +app/components +/nbproject +.idea +.grunt +_SpecRunner.html +/spec/coverage +*.iml +/bower_components +.tmp +/app +/dist/coverage/ + +# Meteor package creation files +.versions diff --git a/.npmignore b/.npmignore new file mode 100644 index 000000000..1214ca43f --- /dev/null +++ b/.npmignore @@ -0,0 +1,17 @@ +.* +spec/ +*.json +.gitignore +travis.yml +*.html +package.js +*.md +src/ +gulp/ +scripts/ +node_modules/ +bower_components/ +tmp/ +.versions +*.coffee +dist/coverage/ diff --git a/.travis.yml b/.travis.yml index ee55a2a4d..edfd10806 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,30 @@ +language: node_js +node_js: +- '4' +before_script: PATH="$(npm bin):$PATH" npm install +script: npm run buildAll branches: only: - - master - - gh-pages-new -language: javascript + - master + - 2.3.X + - 2.2.X + - 2.1.X + - 2.0.X + - 1.2.X + - 1.0.X + - website +sudo: false +after_success: +- eval "$(ssh-agent -s)" +- chmod 600 .travis/deploy +- ssh-add .travis/deploy +- BRANCH=git branch +- echo Current Branch $BRANCH !!!!!!!!!!!!!!!!!!!! +- if [[ "$BRANCH" == "website" ]]; then echo "not syncing $BRANCH exiting"; exit 0; fi; +- git add -A +- git commit -am "buildAll from travis" +- git remote add deploy git@github.com:angular-ui/angular-google-maps.git +- git push deploy +"./.travis/deploy.enc": +- openssl aes-256-cbc -K $encrypted_471396ff623e_key -iv $encrypted_471396ff623e_iv + -in ./.travis/deploy.enc -out ./.travis/deploy -d diff --git a/.travis/deploy.enc b/.travis/deploy.enc new file mode 100644 index 000000000..eb9159a02 Binary files /dev/null and b/.travis/deploy.enc differ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..e96897fc8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,123 @@ + +### 2.4.1 (2017-01-05) + * **angular 1.6:** internal changes to support angular 1.6 + + +### 2.3.5 (2016-09-19) + + +#### Bug Fixes + +* **docs:** correct changelog version number ([62eb11fb](https://github.com/angular-ui/angular-google-maps/commit/62eb11fb)) +* **model-key:** model-key comparison on objects ([139c5e4a](https://github.com/angular-ui/angular-google-maps/commit/139c5e4a), closes [#1485](https://github.com/angular-ui/angular-google-maps/issues/1485)) + + + +### 2.3.4 (2016-08-15) + + +#### Bug Fixes + +* **build:** webpack-dev-server is a peer dependency of grunt-webpack ([e7631d28](https://github.com/angular-ui/angular-google-maps/commit/e7631d28)) +* **map-loader:** change includeScript to place maps api script tag to head element instead of bod ([8d6ed161](https://github.com/angular-ui/angular-google-maps/commit/8d6ed161)) + + + +### 2.3.3 (2016-05-13) + + + +### 2.3.2 (2016-02-11) + + +#### Bug Fixes + +* **angular 1.5:** working ([8ac35c3e](https://github.com/angular-ui/angular-google-maps/commit/8ac35c3e)) + + + +### 2.3.1 (2016-01-28) + + +#### Bug Fixes + +* **lodash:** #1682 check both directions 3.X to 4.X and 4.X to 3.X. ([cb3a20bd](https://github.com/angular-ui/angular-google-maps/commit/cb3a20bd)) + + + +### 2.2.2 (2016-01-21) + + +#### Bug Fixes + +* **EventsHelper removeEvents:** hasOwnProperty check to protect againt those that override Array.prototype issue ([4aa49942](https://github.com/angular-ui/angular-google-maps/commit/4aa49942)) +* **angular-simple-logger:** point to browser version of the lib ([6136cb81](https://github.com/angular-ui/angular-google-maps/commit/6136cb81)) +* **loader:** replace remove() with removeChild() to delete an existing ([86aa0fe8](https://github.com/angular-ui/angular-google-maps/commit/86aa0fe8)) +* **lodash:** lodash version also fixed to 3.X on devDependencies for node #1682 ([065568aa](https://github.com/angular-ui/angular-google-maps/commit/065568aa)) +* **lodash extensions:** fixed indenting and other mistakes ([4f303c08](https://github.com/angular-ui/angular-google-maps/commit/4f303c08)) +* **mapType:** options watch deep, is now watchCollection as it avoids infinite digests ([222e68f3](https://github.com/angular-ui/angular-google-maps/commit/222e68f3)) +* **travis:** remove underscore spec for now ([84db4848](https://github.com/angular-ui/angular-google-maps/commit/84db4848)) +* **window memory scope leaks:** - WindowsParent model now correctly destroys its child model's scopes. - coffeel ([42cca071](https://github.com/angular-ui/angular-google-maps/commit/42cca071)) + + + +### 2.2.1 (2015-09-11) + + +#### Bug Fixes + +* **meteor:** prepping for new release to have meteor working again ([6d01d4eb](https://github.com/angular-ui/angular-google-maps/commit/6d01d4eb)) + + + +### 2.2.0 (2015-09-06) + +#### Bug Fixes + +* **searchbox:** visibility fixes, issue #1471 ([265e2a3](https://github.com/angular-ui/angular-google-maps/commit/265e2a3)) + +#### Features + +* **uiGmapLogger:** internals outsourced to nemSimpleLogger which we now instantiate ([05af52c](https://github.com/angular-ui/angular-google-maps/commit/05af52c)) + + +### 2.1.6 (2015-08-27) + + +#### Bug Fixes + +* **circle:** scope properties update again even if the event attribute is not set in the dire ([b33d4a92](https://github.com/angular-ui/angular-google-maps/commit/b33d4a92)) +* **circle-parent-model:** circle radius and center events dupe firing fixed by boolean gates to not re-tri ([ae4f09b6](https://github.com/angular-ui/angular-google-maps/commit/ae4f09b6)) +* **is-ready max attempts:** Stop checking map's readiness after reaching max attempts issue #/1445 ([63637fe9](https://github.com/angular-ui/angular-google-maps/commit/63637fe9)) +* **lodash:** lodash polyfill for _.get , issue /#1433 ([705cd34c](https://github.com/angular-ui/angular-google-maps/commit/705cd34c)) +* **markerManager:** /#1449 adding destroy ([99609baa](https://github.com/angular-ui/angular-google-maps/commit/99609baa)) +* **markers-parent-model events:** internal events are not getting unhooked; added saftey check ([117be87a](https://github.com/angular-ui/angular-google-maps/commit/117be87a)) +* **markerspiderfier:** Check if spiderfier is on during an event to recreate the spiderfier if the mark ([cf178c87](https://github.com/angular-ui/angular-google-maps/commit/cf178c87)) +* **polylines polygons attribute watching:** updates not get set correctly fixes issue #1255 ([4274d5a0](https://github.com/angular-ui/angular-google-maps/commit/4274d5a0)) + + + +### 2.1.5 (2015-06-18) + + + +### 2.1.4 (2015-06-14) + + +#### Bug Fixes + +* **changelog:** on version bump the next version is used as the main header of the changelog ([cef77ecb](https://github.com/angular-ui/angular-google-maps/commit/cef77ecb)) +* **marker:** + * markers now update on model changes ([f46fd49e](https://github.com/angular-ui/angular-google-maps/commit/f46fd49e)) + * markers now update on model changes ([32086ad4](https://github.com/angular-ui/angular-google-maps/commit/32086ad4)) + + +#### Features + +* **RichMarker:** Build all post merge of feature RichMarker which marker and the markers directiv ([323e41f6](https://github.com/angular-ui/angular-google-maps/commit/323e41f6)) +* **better graphing:** switched to grunt-angular-architecture-graph ([b4f96dba](https://github.com/angular-ui/angular-google-maps/commit/b4f96dba)) +* **bump w changelog:** changelog added to all bumps ([e16a86e8](https://github.com/angular-ui/angular-google-maps/commit/e16a86e8)) +* **graphviz:** + * added to bump routines ([69b317fa](https://github.com/angular-ui/angular-google-maps/commit/69b317fa)) + * trying to aid in documentation and help people figure this out ([b6017de0](https://github.com/angular-ui/angular-google-maps/commit/b6017de0)) +* **grunt-changelog:** changelog added to our grunt build, sorry I did not know about this sooner. See ([84227c03](https://github.com/angular-ui/angular-google-maps/commit/84227c03)) diff --git a/Gruntfile.coffee b/Gruntfile.coffee new file mode 100644 index 000000000..86f49fc5d --- /dev/null +++ b/Gruntfile.coffee @@ -0,0 +1,167 @@ +log = require('util').log +_ = require 'lodash' +kickoff = require 'karma-kickoff' +argv = require('yargs').argv +coffeelint = require './grunt/coffeelint' +watch = require './grunt/options/watch' + + +module.exports = (grunt) -> + # Load the required plugins + require('./grunt/bower')(grunt) + [ + "grunt-contrib-uglify" + "grunt-contrib-jshint" + "grunt-contrib-concat" + "grunt-contrib-clean" + "grunt-contrib-connect" + "grunt-contrib-copy" + "grunt-contrib-watch" + "grunt-open" + "grunt-mkdir" + "grunt-contrib-coffee" + "grunt-conventional-changelog" + "grunt-bump" + 'grunt-replace' + 'grunt-subgrunt' + 'grunt-debug-task' + 'grunt-verbosity' + 'grunt-webpack' + 'grunt-angular-architecture-graph' + 'grunt-ng-annotate' + ].forEach (gruntLib) -> grunt.loadNpmTasks gruntLib + + #squishing this file done by moving grunt options out to its own file. This way we can focus on tasks! + options = require('./grunt/options')(grunt) + + allExamples = grunt.file.expand('example/*.html') + + #map allExamples listed from grunt.file.expand to an open format of 'example' -> path + allExamplesOpen = {} + allExamples.forEach (path) -> + root = path.replace('example/', '').replace('.html', '') + pathValue = "http://localhost:3100/#{path}" + allExamplesOpen[root] = + path: pathValue + + + showOpenType = (toIterate = allExamplesOpen) -> + _(toIterate).each (v, k) -> + log "#{k} -> #{v.path}" + + #showAllExamples() + + options.open = _.extend options.open, allExamplesOpen + grunt.initConfig options + + lints = _.keys(_.omit(watch.coffeelint, 'options')) + coffeeLints = lints.map (n) -> "coffeelint:#{n}" + coffeeLintsThrow = lints.map (n) -> "coffeelint:#{n}:throw" + + lints.forEach (n) -> + grunt.registerTask "coffeelint:#{n}", -> + coffeelint({src:watch.coffeelint[n].files, doThrow:false}, @async()) + + grunt.registerTask "coffeelint:#{n}:throw", -> + coffeelint({src:watch.coffeelint[n].files}, @async()) + + grunt.registerTask 'lint', coffeeLints + + grunt.registerTask 'lintWatch', lints.map (n) -> "watch:coffeelint-#{n}" + + grunt.registerTask 'build', coffeeLintsThrow.concat ['bower', 'clean:dist', 'jshint', 'mkdir', 'lint', 'coffee', 'ngAnnotate', + 'concat:libs', 'replace', 'webpack:commonjsDeps'] + + grunt.registerTask 'buildDist', ['build', 'concat:dist'] + + grunt.registerTask "default", [ 'verbosity', 'buildDist', 'copy', 'uglify:dist', 'uglify:streetview', 'karma'] + + grunt.registerTask "buildAll", ["build", "concat", "uglify", "copy", "karma", "graph"] + + # run default "grunt" prior to generate _SpecRunner.html + grunt.registerTask "spec", [ 'verbosity', "buildDist", + "copy", "karma", "open:jasmine", "watch:spec"] + + grunt.registerTask "coverage", ['connect:coverage','open:coverage', "watch:spec"] + + grunt.registerTask 'default-no-specs', [ + "clean:dist", "jshint", "mkdir", "coffee", "concat:libs", "replace", "concat:dist", + "copy", "uglify:dist"] + + grunt.registerTask 'offline', ['default-no-specs', 'watch:offline'] + + dev = ["clean:dist", "jshint", "mkdir", "coffee", "concat:libs", "replace", "webpack:commonjsDeps", "concat", "copy"] + + grunt.registerTask "dev", dev.concat ["uglify:distMapped", "uglify:streetviewMapped", "karma"] + + grunt.registerTask "fast", dev.concat ["karma"] + + + grunt.registerTask "build-street-view", ['clean:streetview','mkdir','coffee', 'concat:libs', 'replace', + 'concat:streetview', 'concat:streetviewMapped', 'uglify:streetview', 'uglify:streetviewMapped'] + + + # Run the example page by creating a local copy of angular-google-maps.js + # and running a webserver on port 3100 with livereload. Web page is opened + # automatically in the default browser. + grunt.registerTask 'graph', ['angular_architecture_graph'] + + grunt.registerTask 'bump-@-preminor', ['changelog', 'bump-only:preminor', 'buildAll', 'bump-commit'] + grunt.registerTask 'bump-@-prerelease', ['changelog','bump-only:prerelease', 'buildAll', 'bump-commit'] + grunt.registerTask 'bump-@', ['changelog','bump-only', 'buildAll', 'bump-commit'] + grunt.registerTask 'bump-@-minor', ['changelog','bump-only:minor', 'buildAll', 'bump-commit'] + grunt.registerTask 'bump-@-major', ['changelog','bump-only:major', 'buildAll', 'bump-commit'] + + exampleOpenTasks = [] + + _.each allExamplesOpen, (v, key) -> + basicTask = "open:" + key + #register individual task (runs by itself) + + grunt.registerTask key, ["fast", "clean:example", "connect:server", basicTask, "watch:all"] + exampleOpenTasks.push basicTask + + allExamplesTaskToRun = ["fast", "clean:example", "connect:server"].concat(exampleOpenTasks).concat ['watch:all'] + + listWithQuotes = (collection, doLog = true) -> + last = collection.length - 1 + all = '' + collection.forEach (t, i) -> + all += if i < last then "'#{t}'," else "'#{t}'" + if doLog + return log all + all + + grunt.registerTask 'listExamples', showOpenType + grunt.registerTask 'listAllOpen', -> + showOpenType(options.open) + + grunt.registerTask 'listAllExamplesTasks', -> + listWithQuotes exampleOpenTasks + + grunt.registerTask 'allExamples', allExamplesTaskToRun + + grunt.registerTask 'server', ["connect:server", "watch:all"] + grunt.registerTask 's', 'server' + + grunt.registerTask 'karma', 'karma runner', -> + kickoff @async(), + logFn: grunt.log.oklns + configFile: require.resolve './karma.conf.coffee' + + grunt.registerTask 'karma:acceptance', 'karma runner', -> + kickoff @async(), + logFn: grunt.log.oklns + configFile: require.resolve './karma.acceptance.conf.coffee' + + grunt.registerTask 'karmaSpecific', 'karma runner', -> + kickoff @async(), + configFile: require.resolve './karma.conf.coffee' + logFn: grunt.log.oklns + appendFiles: argv.files.split(',') + lengthToPop: 1 + reporters: ['mocha'] + + grunt.registerTask 'buildSpecFile', ['buildDist', 'karmaSpecific'] + grunt.registerTask 'buildSpec', ['buildDist', 'karma'] +#to see all tasks available don't forget "grunt --help" !!! diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..57f851fda --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,30 @@ + + + +Thanks to the guys of [React-Router](https://github.com/reactjs/react-router/), for [standardizing the way on how to report bugs](https://github.com/reactjs/react-router/blob/master/ISSUE_TEMPLATE.md) + +[An issue example](https://github.com/reactjs/react-router/issues/3480) + +## Version +2.3.3 + +## Test Case +[http://jsbin.com/hicebe/edit?html,css,js,output](http://jsbin.com/hicebe/edit?html,css,js,output) + +[Direct output here](http://output.jsbin.com/hicebe/) + +## Steps to reproduce + +## Expected Behavior + +## Actual Behavior diff --git a/README.md b/README.md index d1c0b87f2..a980a0817 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,127 @@ -angular-google-maps -=================== +## Project No longer actively maintained -AngularJS directives for the Google Maps Javascript API. Quite different from AngularUI's take on it. Up to you to decide what suits your needs. +This repo is heavily outdated and there are no maintainers. Therefore issue tracking has been disabled. -Please see the example in the tree. And be sure to [RTFM](http://nlaplante.github.io/angular-google-maps "read the documentation")! +With angular 2 and other competing projects we have decided to announce that this project is no longer activley maintained. If someone desires to take over the project please contact any of the admins. -Pull requests more than welcome! Enjoy! +As a warning this project is not activley watched by the admins and is checked here and there to fix any major issues. Therefore if something is **major**, contact someone directly via mentioning a users name/alias (will notify the user/admin). + +Alternatives: + +- [angularjs-google-maps](https://github.com/allenhwkim/angularjs-google-maps) +- [angular2-google-maps](https://github.com/SebastianM/angular2-google-maps) + +# angular-google-maps +> AngularJS directives for Google Maps +[![Dependencies](https://david-dm.org/angular-ui/angular-google-maps.svg)](https://david-dm.org/angular-ui/angular-google-maps)  +[![Dependencies](https://david-dm.org/angular-ui/angular-google-maps/dev-status.svg)](https://david-dm.org/angular-ui/angular-google-maps)  + +Builds: +- Master (2.3.X): [![Build Status](https://travis-ci.org/angular-ui/angular-google-maps.svg?branch=master)](https://travis-ci.org/angular-ui/angular-google-maps) + +- 2.2.X: [![Build Status](https://travis-ci.org/angular-ui/angular-google-maps.svg?branch=2.2.X)](https://travis-ci.org/angular-ui/angular-google-maps) + +- 2.1.X: [![Build Status](https://travis-ci.org/angular-ui/angular-google-maps.svg?branch=2.1.X)](https://travis-ci.org/angular-ui/angular-google-maps) + +- 2.0.X: [![Build Status](https://travis-ci.org/angular-ui/angular-google-maps.svg?branch=2.0.X)](https://travis-ci.org/angular-ui/angular-google-maps) + +task board: [![Stories in Ready](https://badge.waffle.io/angular-ui/angular-google-maps.png?label=ready&title=Ready)](https://waffle.io/angular-ui/angular-google-maps) + +[![Gitter chat](https://badges.gitter.im/angular-ui/angular-google-maps.svg)](https://gitter.im/angular-ui/angular-google-maps) + +  + +[![NPM](https://nodei.co/npm/angular-google-maps.png?downloads=true&downloadRank=true)](https://nodei.co/npm/angular-google-maps/) + +__________________ +## Getting started +This is a set of directives and services for AngularJS `~1.0.7+, ^1.2.2+`. + +## Dependencies + +Please always be checking the [package.json](./package.json) and [bower.json](./bower.json). They are the spoken word and will usually be more up to date **than this readme**. + +**Tip** *use some library which will always pull in your dependencies (no matter what the changes are) to your vendor.js. IE: [main-bower-files](https://github.com/ck86/main-bower-files)* + +Current Dependencies: +- [lodash](lodash.com) +- [angular](https://github.com/angular/angular.js) +- [angular-simple-logger](https://github.com/nmccready/angular-simple-logger) *as of 2.2.X* +- [google maps sdk](https://developers.google.com/maps/documentation/javascript/3.exp/reference), loaded for you by this directives services + +## Development and or Running the Build + +If you plan to hack on the directives or want to run the example, first thing to do is to install NPM dependencies: + +```shell +npm install && bower install +``` + +* Installing for [Meteor](https://www.meteor.com/) application: + +```shell +meteor add angularui:angular-google-maps +``` + +* Installing for [Meteor 1.3+](https://www.meteor.com/) application: + +```shell +meteor npm install --save angular-google-maps +``` + +### Building +To build the library after you made changes, simply run grunt: + +```shell +grunt +``` + +If you get errors from `jshint` or specs, just add the `--force` argument. + +### Generating SourceMap(s) +```shell +grunt buildAll +``` +This will generate source maps for development (angular-google-maps_dev_mapped.js) (non minified) and source maps to minified +(angular-google-maps_dev_mapped.min.js) files. They each have their own corresponding map files. To get the coinciding source +files you will need to copy the generated `/tmp` directory (currently not under scc). + +### Running the example +To run the example page, just run + +```shell +grunt example +``` + +and open your browser on `http://localhost:3000/example.html`. + +### Documentation +The various directives are documented at [official site](http://angular-ui.github.io/angular-google-maps). + +### Contributing + +Filing issues: + Prior to submitting an issue: +- Search open/**closed** issues, src examples (./examples), gitter, and then google plus community! **Again please search!** +- issues w/ plnkrs get attention quicker + +Pull Requests (PR) more than welcome! If you're adding new features, it would be appreciated if you would provide some docs about the feature. +This can be done either by adding a card to our [Waffle.io board](https://waffle.io/angular-ui/angular-google-maps), forking the website +branch and issuing a PR with the updated documentation page, or by opening an issue for us to add the documentation to the site. + +PR's should follow [angular git commit conventions](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit). + + +### Branching Scheme + +PRS to master are for 2.3.X only. + +If you want it rolled into a older release then target your PR to that respective branching name like 2.1.X. + +*Note: many fixes relevant to 2.0.X can be rolled up into 2.1.X, 2.2.X and 2.3.X* + +- master: points to the active targeted next release branch (2.3.X) +- 2.2.X: latest of 2.2.X +- 2.1.X: "" +- 2.0.X: "" +... etc diff --git a/bower.json b/bower.json new file mode 100644 index 000000000..0f1723832 --- /dev/null +++ b/bower.json @@ -0,0 +1,44 @@ +{ + "name": "angular-google-maps", + "version": "2.4.1", + "license": "MIT", + "main": "./dist/angular-google-maps.js", + "dependencies": { + "angular": "1.2 - 1.6", + "angular-simple-logger": ">=0.0.1", + "lodash": "3.X - 4.X", + "markerclustererplus": "^2.1.4", + "google-maps-utility-library-v3-markerwithlabel": "git://github.com/nmccready/google-maps-utility-library-v3-markerwithlabel.git", + "google-maps-utility-library-v3-infobox": "^1.1.14", + "google-maps-utility-library-v3-keydragzoom": "^2.0.9", + "js-rich-marker": "*" + }, + "ignore": [ + "*.json", + ".gitignore", + "travis.yml", + "*.html", + "package.js", + "*.markdown", + "example", + "src", + "grunt", + "website_libs", + "scripts", + "spec/coffee/directives", + "spec/coffee/providers", + "spec/coffee/usage", + "tmp", + "dist/coverage/", + "dist/architecture/" + ], + "devDependencies": { + "angular-mocks": "1.2 - 1.6", + "angular-route": "1.2 - 1.6", + "bootstrap-without-jquery": "git://github.com/tagawa/bootstrap-without-jquery.git", + "data-structures": "~1.4.2", + "OverlappingMarkerSpiderfier": "git://github.com/nmccready/OverlappingMarkerSpiderfier.git", + "underscore": "~1.8.3", + "uuid": "http://github.com/LiosK/UUID.js/archive/v3.2.tar.gz" + } +} diff --git a/coffeelint.json b/coffeelint.json new file mode 100644 index 000000000..921578a75 --- /dev/null +++ b/coffeelint.json @@ -0,0 +1,139 @@ +{ + "coffeescript_error": { + "level": "error" + }, + "arrow_spacing": { + "name": "arrow_spacing", + "level": "warn" + }, + "no_tabs": { + "name": "no_tabs", + "level": "error" + }, + "no_trailing_whitespace": { + "name": "no_trailing_whitespace", + "level": "warn", + "allowed_in_comments": false, + "allowed_in_empty_lines": true + }, + "max_line_length": { + "name": "max_line_length", + "value": 256, + "level": "warn", + "limitComments": true + }, + "line_endings": { + "name": "line_endings", + "level": "ignore", + "value": "unix" + }, + "no_trailing_semicolons": { + "name": "no_trailing_semicolons", + "level": "error" + }, + "indentation": { + "name": "indentation", + "value": 2, + "level": "error" + }, + "camel_case_classes": { + "name": "camel_case_classes", + "level": "error" + }, + "colon_assignment_spacing": { + "name": "colon_assignment_spacing", + "level": "ignore", + "spacing": { + "left": 0, + "right": 1 + } + }, + "no_implicit_braces": { + "name": "no_implicit_braces", + "level": "ignore", + "strict": true + }, + "no_plusplus": { + "name": "no_plusplus", + "level": "ignore" + }, + "no_throwing_strings": { + "name": "no_throwing_strings", + "level": "ignore" + }, + "no_backticks": { + "name": "no_backticks", + "level": "error" + }, + "no_implicit_parens": { + "name": "no_implicit_parens", + "level": "ignore" + }, + "no_empty_param_list": { + "name": "no_empty_param_list", + "level": "ignore" + }, + "no_stand_alone_at": { + "name": "no_stand_alone_at", + "level": "ignore" + }, + "space_operators": { + "name": "space_operators", + "level": "warn" + }, + "duplicate_key": { + "name": "duplicate_key", + "level": "error" + }, + "empty_constructor_needs_parens": { + "name": "empty_constructor_needs_parens", + "level": "ignore" + }, + "cyclomatic_complexity": { + "name": "cyclomatic_complexity", + "value": 10, + "level": "ignore" + }, + "newlines_after_classes": { + "name": "newlines_after_classes", + "value": 3, + "level": "ignore" + }, + "no_unnecessary_fat_arrows": { + "name": "no_unnecessary_fat_arrows", + "level": "warn" + }, + "missing_fat_arrows": { + "name": "missing_fat_arrows", + "level": "ignore" + }, + "non_empty_constructor_needs_parens": { + "name": "non_empty_constructor_needs_parens", + "level": "ignore" + }, + "check_scope": { + "module": "coffeescope2", + "level": "error", + "environments": ["es5", "node", "commonjs", "jasmine", "browser"], + "globals": { + "_": true, + "angular": true, + "google": true, + "inject": true, + "NgMapMarkerClusterer": true, + "MarkerWithLabel": true, + "RichMarker": true, + "PropMap": true + }, + "overwrite": false, + "shadow": false, + "shadow_builtins": true, + "shadow_exceptions": ["err", "next"], + "undefined": true, + "hoist_local": true, + "hoist_parent": true, + "unused_variables": true, + "unused_arguments": false, + "unused_classes": false + } +} diff --git a/component.json b/component.json deleted file mode 100644 index 3e002ff49..000000000 --- a/component.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "angular-google-maps", - "version": "1.0.0", - "main": "./src/angular-google-maps.js", - "dependencies": { - "angular": "~1.0.5" - } -} diff --git a/curl.json b/curl.json new file mode 100644 index 000000000..b68442d69 --- /dev/null +++ b/curl.json @@ -0,0 +1,9 @@ +{ + "devDependencies": { + "gmap-util-keydragzoom": "http://google-maps-utility-library-v3.googlecode.com/svn/tags/keydragzoom/2.0.9/src/keydragzoom.js", + "gmap-util-infobox": "http://google-maps-utility-library-v3.googlecode.com/svn/tags/infobox/1.1.13/src/infobox.js", + "gmap-util-markerclustererplus": "http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclustererplus/2.1.1/src/markerclusterer.js", + "gmap-util-markerwithlabel": "http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerwithlabel/1.1.10/src/markerwithlabel.js", + "gmap-util-richmarker": "http://google-maps-utility-library-v3.googlecode.com/svn/trunk/richmarker/src/richmarker.js" + } +} diff --git a/dist/angular-google-maps-street-view.js b/dist/angular-google-maps-street-view.js new file mode 100644 index 000000000..7d608823e --- /dev/null +++ b/dist/angular-google-maps-street-view.js @@ -0,0 +1,677 @@ +/*! angular-google-maps 2.4.1 2017-01-05 + * AngularJS directives for Google Maps + * git: https://github.com/angular-ui/angular-google-maps.git + */ +; +(function( window, angular, _, undefined ){ + 'use strict'; +/* +! +The MIT License + +Copyright (c) 2010-2013 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the 'Software'), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +angular-google-maps +https://github.com/angular-ui/angular-google-maps + +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module('uiGmapgoogle-maps.providers', ['nemLogging']); + + angular.module('uiGmapgoogle-maps.wrapped', []); + + angular.module('uiGmapgoogle-maps.extensions', ['uiGmapgoogle-maps.wrapped', 'uiGmapgoogle-maps.providers']); + + angular.module('uiGmapgoogle-maps.directives.api.utils', ['uiGmapgoogle-maps.extensions']); + + angular.module('uiGmapgoogle-maps.directives.api.managers', []); + + angular.module('uiGmapgoogle-maps.directives.api.options', ['uiGmapgoogle-maps.directives.api.utils']); + + angular.module('uiGmapgoogle-maps.directives.api.options.builders', []); + + angular.module('uiGmapgoogle-maps.directives.api.models.child', ['uiGmapgoogle-maps.directives.api.utils', 'uiGmapgoogle-maps.directives.api.options', 'uiGmapgoogle-maps.directives.api.options.builders']); + + angular.module('uiGmapgoogle-maps.directives.api.models.parent', ['uiGmapgoogle-maps.directives.api.managers', 'uiGmapgoogle-maps.directives.api.models.child', 'uiGmapgoogle-maps.providers']); + + angular.module('uiGmapgoogle-maps.directives.api', ['uiGmapgoogle-maps.directives.api.models.parent']); + + angular.module('uiGmapgoogle-maps', ['uiGmapgoogle-maps.directives.api', 'uiGmapgoogle-maps.providers']); + +}).call(this); +;angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapuuid', function() { + //BEGIN REPLACE + /* istanbul ignore next */ + /* + Version: core-1.0 + The MIT License: Copyright (c) 2012 LiosK. +*/ +function UUID(){}UUID.generate=function(){var a=UUID._gri,b=UUID._ha;return b(a(32),8)+"-"+b(a(16),4)+"-"+b(16384|a(12),4)+"-"+b(32768|a(14),4)+"-"+b(a(48),12)};UUID._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)d&1&&(c=e+c);return c}; + + //END REPLACE +return UUID; +}); +;(function() { + angular.module('uiGmapgoogle-maps.providers').factory('uiGmapMapScriptLoader', [ + '$q', 'uiGmapuuid', function($q, uuid) { + var getScriptUrl, includeScript, isGoogleMapsLoaded, scriptId, usedConfiguration; + scriptId = void 0; + usedConfiguration = void 0; + getScriptUrl = function(options) { + if (options.china) { + return 'http://maps.google.cn/maps/api/js?'; + } else { + if (options.transport === 'auto') { + return '//maps.googleapis.com/maps/api/js?'; + } else { + return options.transport + '://maps.googleapis.com/maps/api/js?'; + } + } + }; + includeScript = function(options) { + var omitOptions, query, script, scriptElem; + omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad']; + if (options.isGoogleMapsForWork) { + omitOptions.push('key'); + } + query = _.map(_.omit(options, omitOptions), function(v, k) { + return k + '=' + v; + }); + if (scriptId) { + scriptElem = document.getElementById(scriptId); + scriptElem.parentNode.removeChild(scriptElem); + } + query = query.join('&'); + script = document.createElement('script'); + script.id = scriptId = "ui_gmap_map_load_" + (uuid.generate()); + script.type = 'text/javascript'; + script.src = getScriptUrl(options) + query; + return document.head.appendChild(script); + }; + isGoogleMapsLoaded = function() { + return angular.isDefined(window.google) && angular.isDefined(window.google.maps); + }; + return { + load: function(options) { + var deferred, randomizedFunctionName; + deferred = $q.defer(); + if (isGoogleMapsLoaded()) { + deferred.resolve(window.google.maps); + return deferred.promise; + } + randomizedFunctionName = options.callback = 'onGoogleMapsReady' + Math.round(Math.random() * 1000); + window[randomizedFunctionName] = function() { + window[randomizedFunctionName] = null; + deferred.resolve(window.google.maps); + }; + if (window.navigator.connection && window.Connection && window.navigator.connection.type === window.Connection.NONE && !options.preventLoad) { + document.addEventListener('online', function() { + if (!isGoogleMapsLoaded()) { + return includeScript(options); + } + }); + } else if (!options.preventLoad) { + includeScript(options); + } + usedConfiguration = options; + usedConfiguration.randomizedFunctionName = randomizedFunctionName; + return deferred.promise; + }, + manualLoad: function() { + var config; + config = usedConfiguration; + if (!isGoogleMapsLoaded()) { + return includeScript(config); + } else { + if (window[config.randomizedFunctionName]) { + return window[config.randomizedFunctionName](); + } + } + } + }; + } + ]).provider('uiGmapGoogleMapApi', function() { + this.options = { + transport: 'https', + isGoogleMapsForWork: false, + china: false, + v: '3', + libraries: '', + language: 'en', + preventLoad: false + }; + this.configure = function(options) { + angular.extend(this.options, options); + }; + this.$get = [ + 'uiGmapMapScriptLoader', (function(_this) { + return function(loader) { + return loader.load(_this.options); + }; + })(this) + ]; + return this; + }).service('uiGmapGoogleMapApiManualLoader', [ + 'uiGmapMapScriptLoader', function(loader) { + return { + load: function() { + loader.manualLoad(); + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapLogger', [ + 'nemSimpleLogger', function(nemSimpleLogger) { + return nemSimpleLogger.spawn(); + } + ]); + +}).call(this); +; +/*global _:true, angular:true, google:true */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapGmapUtil', [ + 'uiGmapLogger', '$compile', function(Logger, $compile) { + var _isFalse, _isTruthy, getCoords, getLatitude, getLongitude, validateCoords; + _isTruthy = function(value, bool, optionsArray) { + return value === bool || optionsArray.indexOf(value) !== -1; + }; + _isFalse = function(value) { + return _isTruthy(value, false, ['false', 'FALSE', 0, 'n', 'N', 'no', 'NO']); + }; + getLatitude = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[1]; + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return value.coordinates[1]; + } else { + return value.latitude; + } + }; + getLongitude = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[0]; + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return value.coordinates[0]; + } else { + return value.longitude; + } + }; + getCoords = function(value) { + if (!value) { + return; + } + if (value instanceof google.maps.LatLng) { + return value; + } else if (Array.isArray(value) && value.length === 2) { + return new google.maps.LatLng(value[1], value[0]); + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return new google.maps.LatLng(value.coordinates[1], value.coordinates[0]); + } else { + return new google.maps.LatLng(value.latitude, value.longitude); + } + }; + validateCoords = function(coords) { + if (angular.isUndefined(coords)) { + return false; + } + if (_.isArray(coords)) { + if (coords.length === 2) { + return true; + } + } else if ((coords != null) && (coords != null ? coords.type : void 0)) { + if (coords.type === 'Point' && _.isArray(coords.coordinates) && coords.coordinates.length === 2) { + return true; + } + } + if (coords && angular.isDefined((coords != null ? coords.latitude : void 0) && angular.isDefined(coords != null ? coords.longitude : void 0))) { + return true; + } + return false; + }; + return { + setCoordsFromEvent: function(prevValue, newLatLon) { + if (!prevValue) { + return; + } + if (Array.isArray(prevValue) && prevValue.length === 2) { + prevValue[1] = newLatLon.lat(); + prevValue[0] = newLatLon.lng(); + } else if (angular.isDefined(prevValue.type) && prevValue.type === 'Point') { + prevValue.coordinates[1] = newLatLon.lat(); + prevValue.coordinates[0] = newLatLon.lng(); + } else { + prevValue.latitude = newLatLon.lat(); + prevValue.longitude = newLatLon.lng(); + } + return prevValue; + }, + getLabelPositionPoint: function(anchor) { + var xPos, yPos; + if (anchor === void 0) { + return void 0; + } + anchor = /^([-\d\.]+)\s([-\d\.]+)$/.exec(anchor); + xPos = parseFloat(anchor[1]); + yPos = parseFloat(anchor[2]); + if ((xPos != null) && (yPos != null)) { + return new google.maps.Point(xPos, yPos); + } + }, + createWindowOptions: function(gMarker, scope, content, defaults) { + var options; + if ((content != null) && (defaults != null) && ($compile != null)) { + options = angular.extend({}, defaults, { + content: this.buildContent(scope, defaults, content), + position: defaults.position != null ? defaults.position : angular.isObject(gMarker) ? gMarker.getPosition() : getCoords(scope.coords) + }); + if ((gMarker != null) && ((options != null ? options.pixelOffset : void 0) == null)) { + if (options.boxClass == null) { + + } else { + options.pixelOffset = { + height: 0, + width: -2 + }; + } + } + return options; + } else { + if (!defaults) { + Logger.error('infoWindow defaults not defined'); + if (!content) { + return Logger.error('infoWindow content not defined'); + } + } else { + return defaults; + } + } + }, + buildContent: function(scope, defaults, content) { + var parsed, ret; + if (defaults.content != null) { + ret = defaults.content; + } else { + if ($compile != null) { + content = content.replace(/^\s+|\s+$/g, ''); + parsed = content === '' ? '' : $compile(content)(scope); + if (parsed.length > 0) { + ret = parsed[0]; + } + } else { + ret = content; + } + } + return ret; + }, + defaultDelay: 50, + isTrue: function(value) { + return _isTruthy(value, true, ['true', 'TRUE', 1, 'y', 'Y', 'yes', 'YES']); + }, + isFalse: _isFalse, + isFalsy: function(value) { + return _isTruthy(value, false, [void 0, null]) || _isFalse(value); + }, + getCoords: getCoords, + validateCoords: validateCoords, + equalCoords: function(coord1, coord2) { + return getLatitude(coord1) === getLatitude(coord2) && getLongitude(coord1) === getLongitude(coord2); + }, + validatePath: function(path) { + var array, i, polygon, trackMaxVertices; + i = 0; + if (angular.isUndefined(path.type)) { + if (!Array.isArray(path) || path.length < 2) { + return false; + } + while (i < path.length) { + if (!((angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) || (typeof path[i].lat === 'function' && typeof path[i].lng === 'function'))) { + return false; + } + i++; + } + return true; + } else { + if (angular.isUndefined(path.coordinates)) { + return false; + } + if (path.type === 'Polygon') { + if (path.coordinates[0].length < 4) { + return false; + } + array = path.coordinates[0]; + } else if (path.type === 'MultiPolygon') { + trackMaxVertices = { + max: 0, + index: 0 + }; + _.forEach(path.coordinates, function(polygon, index) { + if (polygon[0].length > this.max) { + this.max = polygon[0].length; + return this.index = index; + } + }, trackMaxVertices); + polygon = path.coordinates[trackMaxVertices.index]; + array = polygon[0]; + if (array.length < 4) { + return false; + } + } else if (path.type === 'LineString') { + if (path.coordinates.length < 2) { + return false; + } + array = path.coordinates; + } else { + return false; + } + while (i < array.length) { + if (array[i].length !== 2) { + return false; + } + i++; + } + return true; + } + }, + convertPathPoints: function(path) { + var array, i, latlng, result, trackMaxVertices; + i = 0; + result = new google.maps.MVCArray(); + if (angular.isUndefined(path.type)) { + while (i < path.length) { + latlng; + if (angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) { + latlng = new google.maps.LatLng(path[i].latitude, path[i].longitude); + } else if (typeof path[i].lat === 'function' && typeof path[i].lng === 'function') { + latlng = path[i]; + } + result.push(latlng); + i++; + } + } else { + array; + if (path.type === 'Polygon') { + array = path.coordinates[0]; + } else if (path.type === 'MultiPolygon') { + trackMaxVertices = { + max: 0, + index: 0 + }; + _.forEach(path.coordinates, function(polygon, index) { + if (polygon[0].length > this.max) { + this.max = polygon[0].length; + return this.index = index; + } + }, trackMaxVertices); + array = path.coordinates[trackMaxVertices.index][0]; + } else if (path.type === 'LineString') { + array = path.coordinates; + } + while (i < array.length) { + result.push(new google.maps.LatLng(array[i][1], array[i][0])); + i++; + } + } + return result; + }, + getPath: function(object, key) { + var obj; + if ((key == null) || !_.isString(key)) { + return key; + } + obj = object; + _.each(key.split('.'), function(value) { + if (obj) { + return obj = obj[value]; + } + }); + return obj; + }, + validateBoundPoints: function(bounds) { + if (angular.isUndefined(bounds.sw.latitude) || angular.isUndefined(bounds.sw.longitude) || angular.isUndefined(bounds.ne.latitude) || angular.isUndefined(bounds.ne.longitude)) { + return false; + } + return true; + }, + convertBoundPoints: function(bounds) { + var result; + result = new google.maps.LatLngBounds(new google.maps.LatLng(bounds.sw.latitude, bounds.sw.longitude), new google.maps.LatLng(bounds.ne.latitude, bounds.ne.longitude)); + return result; + }, + fitMapBounds: function(map, bounds) { + return map.fitBounds(bounds); + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapEventsHelper", [ + "uiGmapLogger", function($log) { + var _getEventsObj, _hasEvents; + _hasEvents = function(obj) { + return angular.isDefined(obj.events) && (obj.events != null) && angular.isObject(obj.events); + }; + _getEventsObj = function(scope, model) { + if (_hasEvents(scope)) { + return scope; + } + if (_hasEvents(model)) { + return model; + } + }; + return { + setEvents: function(gObject, scope, model, ignores) { + var eventObj; + eventObj = _getEventsObj(scope, model); + if (eventObj != null) { + return _.compact(_.map(eventObj.events, function(eventHandler, eventName) { + var doIgnore; + if (ignores) { + doIgnore = _(ignores).includes(eventName); + } + if (eventObj.events.hasOwnProperty(eventName) && angular.isFunction(eventObj.events[eventName]) && !doIgnore) { + return google.maps.event.addListener(gObject, eventName, function() { + if (!scope.$evalAsync) { + scope.$evalAsync = function() {}; + } + return scope.$evalAsync(eventHandler.apply(scope, [gObject, eventName, model, arguments])); + }); + } + })); + } + }, + removeEvents: function(listeners) { + var key, l; + if (!listeners) { + return; + } + for (key in listeners) { + l = listeners[key]; + if (l && listeners.hasOwnProperty(key)) { + google.maps.event.removeListener(l); + } + } + } + }; + } + ]); + +}).call(this); +; +/* +@authors: +- Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +StreetViewPanorama Directive to care of basic initialization of StreetViewPanorama + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapStreetViewPanorama', [ + 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function(GoogleMapApi, $log, GmapUtil, EventsHelper) { + var name; + name = 'uiGmapStreetViewPanorama'; + return { + restrict: 'EMA', + template: '
', + replace: true, + scope: { + focalcoord: '=', + radius: '=?', + events: '=?', + options: '=?', + control: '=?', + povoptions: '=?', + imagestatus: '=' + }, + link: function(scope, element, attrs) { + return GoogleMapApi.then((function(_this) { + return function(maps) { + var clean, create, didCreateOptionsFromDirective, firstTime, handleSettings, listeners, opts, pano, povOpts, sv; + pano = void 0; + sv = void 0; + didCreateOptionsFromDirective = false; + listeners = void 0; + opts = null; + povOpts = null; + clean = function() { + EventsHelper.removeEvents(listeners); + if (pano != null) { + pano.unbind('position'); + pano.setVisible(false); + } + if (sv != null) { + if ((sv != null ? sv.setVisible : void 0) != null) { + sv.setVisible(false); + } + return sv = void 0; + } + }; + handleSettings = function(perspectivePoint, focalPoint) { + var heading; + heading = google.maps.geometry.spherical.computeHeading(perspectivePoint, focalPoint); + didCreateOptionsFromDirective = true; + scope.radius = scope.radius || 50; + povOpts = angular.extend({ + heading: heading, + zoom: 1, + pitch: 0 + }, scope.povoptions || {}); + opts = opts = angular.extend({ + navigationControl: false, + addressControl: false, + linksControl: false, + position: perspectivePoint, + pov: povOpts, + visible: true + }, scope.options || {}); + return didCreateOptionsFromDirective = false; + }; + create = function() { + var focalPoint; + if (!scope.focalcoord) { + $log.error(name + ": focalCoord needs to be defined"); + return; + } + if (!scope.radius) { + $log.error(name + ": needs a radius to set the camera view from its focal target."); + return; + } + clean(); + if (sv == null) { + sv = new google.maps.StreetViewService(); + } + if (scope.events) { + listeners = EventsHelper.setEvents(sv, scope, scope); + } + focalPoint = GmapUtil.getCoords(scope.focalcoord); + return sv.getPanoramaByLocation(focalPoint, scope.radius, function(streetViewPanoramaData, status) { + var ele, perspectivePoint, ref; + if (scope.imagestatus != null) { + scope.imagestatus = status; + } + if (((ref = scope.events) != null ? ref.image_status_changed : void 0) != null) { + scope.events.image_status_changed(sv, 'image_status_changed', scope, status); + } + if (status === "OK") { + perspectivePoint = streetViewPanoramaData.location.latLng; + handleSettings(perspectivePoint, focalPoint); + ele = element[0]; + return pano = new google.maps.StreetViewPanorama(ele, opts); + } + }); + }; + if (scope.control != null) { + scope.control.getOptions = function() { + return opts; + }; + scope.control.getPovOptions = function() { + return povOpts; + }; + scope.control.getGObject = function() { + return sv; + }; + scope.control.getGPano = function() { + return pano; + }; + } + scope.$watch('options', function(newValue, oldValue) { + if (newValue === oldValue || newValue === opts || didCreateOptionsFromDirective) { + return; + } + return create(); + }); + firstTime = true; + scope.$watch('focalcoord', function(newValue, oldValue) { + if (newValue === oldValue && !firstTime) { + return; + } + if (newValue == null) { + return; + } + firstTime = false; + return create(); + }); + return scope.$on('$destroy', function() { + return clean(); + }); + }; + })(this)); + } + }; + } + ]); + +}).call(this); +}( window, angular, _)); \ No newline at end of file diff --git a/dist/angular-google-maps-street-view.min.js b/dist/angular-google-maps-street-view.min.js new file mode 100644 index 000000000..a6753fc95 --- /dev/null +++ b/dist/angular-google-maps-street-view.min.js @@ -0,0 +1,7 @@ +/*! angular-google-maps 2.4.1 2017-01-05 + * AngularJS directives for Google Maps + * git: https://github.com/angular-ui/angular-google-maps.git + */ + +!function(a,b,c,d){"use strict";(function(){b.module("uiGmapgoogle-maps.providers",["nemLogging"]),b.module("uiGmapgoogle-maps.wrapped",[]),b.module("uiGmapgoogle-maps.extensions",["uiGmapgoogle-maps.wrapped","uiGmapgoogle-maps.providers"]),b.module("uiGmapgoogle-maps.directives.api.utils",["uiGmapgoogle-maps.extensions"]),b.module("uiGmapgoogle-maps.directives.api.managers",[]),b.module("uiGmapgoogle-maps.directives.api.options",["uiGmapgoogle-maps.directives.api.utils"]),b.module("uiGmapgoogle-maps.directives.api.options.builders",[]),b.module("uiGmapgoogle-maps.directives.api.models.child",["uiGmapgoogle-maps.directives.api.utils","uiGmapgoogle-maps.directives.api.options","uiGmapgoogle-maps.directives.api.options.builders"]),b.module("uiGmapgoogle-maps.directives.api.models.parent",["uiGmapgoogle-maps.directives.api.managers","uiGmapgoogle-maps.directives.api.models.child","uiGmapgoogle-maps.providers"]),b.module("uiGmapgoogle-maps.directives.api",["uiGmapgoogle-maps.directives.api.models.parent"]),b.module("uiGmapgoogle-maps",["uiGmapgoogle-maps.directives.api","uiGmapgoogle-maps.providers"])}).call(this),b.module("uiGmapgoogle-maps.wrapped").service("uiGmapuuid",function(){function a(){}return a.generate=function(){var b=a._gri,c=a._ha;return c(b(32),8)+"-"+c(b(16),4)+"-"+c(16384|b(12),4)+"-"+c(32768|b(14),4)+"-"+c(b(48),12)},a._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)1&d&&(c=e+c);return c},a}),function(){b.module("uiGmapgoogle-maps.providers").factory("uiGmapMapScriptLoader",["$q","uiGmapuuid",function(d,e){var f,g,h,i,j;return i=void 0,j=void 0,f=function(a){return a.china?"http://maps.google.cn/maps/api/js?":"auto"===a.transport?"//maps.googleapis.com/maps/api/js?":a.transport+"://maps.googleapis.com/maps/api/js?"},g=function(a){var b,d,g,h;return b=["transport","isGoogleMapsForWork","china","preventLoad"],a.isGoogleMapsForWork&&b.push("key"),d=c.map(c.omit(a,b),function(a,b){return b+"="+a}),i&&(h=document.getElementById(i),h.parentNode.removeChild(h)),d=d.join("&"),g=document.createElement("script"),g.id=i="ui_gmap_map_load_"+e.generate(),g.type="text/javascript",g.src=f(a)+d,document.head.appendChild(g)},h=function(){return b.isDefined(a.google)&&b.isDefined(a.google.maps)},{load:function(b){var c,e;return c=d.defer(),h()?(c.resolve(a.google.maps),c.promise):(e=b.callback="onGoogleMapsReady"+Math.round(1e3*Math.random()),a[e]=function(){a[e]=null,c.resolve(a.google.maps)},a.navigator.connection&&a.Connection&&a.navigator.connection.type===a.Connection.NONE&&!b.preventLoad?document.addEventListener("online",function(){if(!h())return g(b)}):b.preventLoad||g(b),j=b,j.randomizedFunctionName=e,c.promise)},manualLoad:function(){var b;return b=j,h()?a[b.randomizedFunctionName]?a[b.randomizedFunctionName]():void 0:g(b)}}}]).provider("uiGmapGoogleMapApi",function(){return this.options={transport:"https",isGoogleMapsForWork:!1,china:!1,v:"3",libraries:"",language:"en",preventLoad:!1},this.configure=function(a){b.extend(this.options,a)},this.$get=["uiGmapMapScriptLoader",function(a){return function(b){return b.load(a.options)}}(this)],this}).service("uiGmapGoogleMapApiManualLoader",["uiGmapMapScriptLoader",function(a){return{load:function(){a.manualLoad()}}}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapLogger",["nemSimpleLogger",function(a){return a.spawn()}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapGmapUtil",["uiGmapLogger","$compile",function(a,d){var e,f,g,h,i,j;return f=function(a,b,c){return a===b||c.indexOf(a)!==-1},e=function(a){return f(a,!1,["false","FALSE",0,"n","N","no","NO"])},h=function(a){return Array.isArray(a)&&2===a.length?a[1]:b.isDefined(a.type)&&"Point"===a.type?a.coordinates[1]:a.latitude},i=function(a){return Array.isArray(a)&&2===a.length?a[0]:b.isDefined(a.type)&&"Point"===a.type?a.coordinates[0]:a.longitude},g=function(a){if(a)return a instanceof google.maps.LatLng?a:Array.isArray(a)&&2===a.length?new google.maps.LatLng(a[1],a[0]):b.isDefined(a.type)&&"Point"===a.type?new google.maps.LatLng(a.coordinates[1],a.coordinates[0]):new google.maps.LatLng(a.latitude,a.longitude)},j=function(a){if(b.isUndefined(a))return!1;if(c.isArray(a)){if(2===a.length)return!0}else if(null!=a&&(null!=a?a.type:void 0)&&"Point"===a.type&&c.isArray(a.coordinates)&&2===a.coordinates.length)return!0;return!(!a||!b.isDefined((null!=a?a.latitude:void 0)&&b.isDefined(null!=a?a.longitude:void 0)))},{setCoordsFromEvent:function(a,c){if(a)return Array.isArray(a)&&2===a.length?(a[1]=c.lat(),a[0]=c.lng()):b.isDefined(a.type)&&"Point"===a.type?(a.coordinates[1]=c.lat(),a.coordinates[0]=c.lng()):(a.latitude=c.lat(),a.longitude=c.lng()),a},getLabelPositionPoint:function(a){var b,c;if(void 0!==a)return a=/^([-\d\.]+)\s([-\d\.]+)$/.exec(a),b=parseFloat(a[1]),c=parseFloat(a[2]),null!=b&&null!=c?new google.maps.Point(b,c):void 0},createWindowOptions:function(c,e,f,h){var i;return null!=f&&null!=h&&null!=d?(i=b.extend({},h,{content:this.buildContent(e,h,f),position:null!=h.position?h.position:b.isObject(c)?c.getPosition():g(e.coords)}),null!=c&&null==(null!=i?i.pixelOffset:void 0)&&(null==i.boxClass||(i.pixelOffset={height:0,width:-2})),i):h?h:(a.error("infoWindow defaults not defined"),f?void 0:a.error("infoWindow content not defined"))},buildContent:function(a,b,c){var e,f;return null!=b.content?f=b.content:null!=d?(c=c.replace(/^\s+|\s+$/g,""),e=""===c?"":d(c)(a),e.length>0&&(f=e[0])):f=c,f},defaultDelay:50,isTrue:function(a){return f(a,!0,["true","TRUE",1,"y","Y","yes","YES"])},isFalse:e,isFalsy:function(a){return f(a,!1,[void 0,null])||e(a)},getCoords:g,validateCoords:j,equalCoords:function(a,b){return h(a)===h(b)&&i(a)===i(b)},validatePath:function(a){var d,e,f,g;if(e=0,b.isUndefined(a.type)){if(!Array.isArray(a)||a.length<2)return!1;for(;ethis.max)return this.max=a[0].length,this.index=b},g),f=a.coordinates[g.index],d=f[0],d.length<4)return!1}else{if("LineString"!==a.type)return!1;if(a.coordinates.length<2)return!1;d=a.coordinates}for(;ethis.max)return this.max=a[0].length,this.index=b},h),d=a.coordinates[h.index][0]):"LineString"===a.type&&(d=a.coordinates);e',replace:!0,scope:{focalcoord:"=",radius:"=?",events:"=?",options:"=?",control:"=?",povoptions:"=?",imagestatus:"="},link:function(g,h,i){return a.then(function(a){return function(a){var i,j,k,l,m,n,o,p,q,r;return p=void 0,r=void 0,k=!1,n=void 0,o=null,q=null,i=function(){if(e.removeEvents(n),null!=p&&(p.unbind("position"),p.setVisible(!1)),null!=r)return null!=(null!=r?r.setVisible:void 0)&&r.setVisible(!1),r=void 0},m=function(a,c){var d;return d=google.maps.geometry.spherical.computeHeading(a,c),k=!0,g.radius=g.radius||50,q=b.extend({heading:d,zoom:1,pitch:0},g.povoptions||{}),o=o=b.extend({navigationControl:!1,addressControl:!1,linksControl:!1,position:a,pov:q,visible:!0},g.options||{}),k=!1},j=function(){var a;return g.focalcoord?g.radius?(i(),null==r&&(r=new google.maps.StreetViewService),g.events&&(n=e.setEvents(r,g,g)),a=d.getCoords(g.focalcoord),r.getPanoramaByLocation(a,g.radius,function(b,c){var d,e,f;if(null!=g.imagestatus&&(g.imagestatus=c),null!=(null!=(f=g.events)?f.image_status_changed:void 0)&&g.events.image_status_changed(r,"image_status_changed",g,c),"OK"===c)return e=b.location.latLng,m(e,a),d=h[0],p=new google.maps.StreetViewPanorama(d,o)})):void c.error(f+": needs a radius to set the camera view from its focal target."):void c.error(f+": focalCoord needs to be defined")},null!=g.control&&(g.control.getOptions=function(){return o},g.control.getPovOptions=function(){return q},g.control.getGObject=function(){return r},g.control.getGPano=function(){return p}),g.$watch("options",function(a,b){if(a!==b&&a!==o&&!k)return j()}),l=!0,g.$watch("focalcoord",function(a,b){if((a!==b||l)&&null!=a)return l=!1,j()}),g.$on("$destroy",function(){return i()})}}(this))}}}])}.call(this)}(window,angular,_); +//# sourceMappingURL=angular-google-maps-street-view_dev_mapped.min.js.map \ No newline at end of file diff --git a/dist/angular-google-maps-street-view_dev_mapped.js b/dist/angular-google-maps-street-view_dev_mapped.js new file mode 100644 index 000000000..a16d3a846 --- /dev/null +++ b/dist/angular-google-maps-street-view_dev_mapped.js @@ -0,0 +1,678 @@ +/*! angular-google-maps 2.4.1 2017-01-05 + * AngularJS directives for Google Maps + * git: https://github.com/angular-ui/angular-google-maps.git + */ +; +(function( window, angular, _, undefined ){ + 'use strict'; +/* +! +The MIT License + +Copyright (c) 2010-2013 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the 'Software'), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +angular-google-maps +https://github.com/angular-ui/angular-google-maps + +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module('uiGmapgoogle-maps.providers', ['nemLogging']); + + angular.module('uiGmapgoogle-maps.wrapped', []); + + angular.module('uiGmapgoogle-maps.extensions', ['uiGmapgoogle-maps.wrapped', 'uiGmapgoogle-maps.providers']); + + angular.module('uiGmapgoogle-maps.directives.api.utils', ['uiGmapgoogle-maps.extensions']); + + angular.module('uiGmapgoogle-maps.directives.api.managers', []); + + angular.module('uiGmapgoogle-maps.directives.api.options', ['uiGmapgoogle-maps.directives.api.utils']); + + angular.module('uiGmapgoogle-maps.directives.api.options.builders', []); + + angular.module('uiGmapgoogle-maps.directives.api.models.child', ['uiGmapgoogle-maps.directives.api.utils', 'uiGmapgoogle-maps.directives.api.options', 'uiGmapgoogle-maps.directives.api.options.builders']); + + angular.module('uiGmapgoogle-maps.directives.api.models.parent', ['uiGmapgoogle-maps.directives.api.managers', 'uiGmapgoogle-maps.directives.api.models.child', 'uiGmapgoogle-maps.providers']); + + angular.module('uiGmapgoogle-maps.directives.api', ['uiGmapgoogle-maps.directives.api.models.parent']); + + angular.module('uiGmapgoogle-maps', ['uiGmapgoogle-maps.directives.api', 'uiGmapgoogle-maps.providers']); + +}).call(this); +;angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapuuid', function() { + //BEGIN REPLACE + /* istanbul ignore next */ + /* + Version: core-1.0 + The MIT License: Copyright (c) 2012 LiosK. +*/ +function UUID(){}UUID.generate=function(){var a=UUID._gri,b=UUID._ha;return b(a(32),8)+"-"+b(a(16),4)+"-"+b(16384|a(12),4)+"-"+b(32768|a(14),4)+"-"+b(a(48),12)};UUID._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)d&1&&(c=e+c);return c}; + + //END REPLACE +return UUID; +}); +;(function() { + angular.module('uiGmapgoogle-maps.providers').factory('uiGmapMapScriptLoader', [ + '$q', 'uiGmapuuid', function($q, uuid) { + var getScriptUrl, includeScript, isGoogleMapsLoaded, scriptId, usedConfiguration; + scriptId = void 0; + usedConfiguration = void 0; + getScriptUrl = function(options) { + if (options.china) { + return 'http://maps.google.cn/maps/api/js?'; + } else { + if (options.transport === 'auto') { + return '//maps.googleapis.com/maps/api/js?'; + } else { + return options.transport + '://maps.googleapis.com/maps/api/js?'; + } + } + }; + includeScript = function(options) { + var omitOptions, query, script, scriptElem; + omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad']; + if (options.isGoogleMapsForWork) { + omitOptions.push('key'); + } + query = _.map(_.omit(options, omitOptions), function(v, k) { + return k + '=' + v; + }); + if (scriptId) { + scriptElem = document.getElementById(scriptId); + scriptElem.parentNode.removeChild(scriptElem); + } + query = query.join('&'); + script = document.createElement('script'); + script.id = scriptId = "ui_gmap_map_load_" + (uuid.generate()); + script.type = 'text/javascript'; + script.src = getScriptUrl(options) + query; + return document.head.appendChild(script); + }; + isGoogleMapsLoaded = function() { + return angular.isDefined(window.google) && angular.isDefined(window.google.maps); + }; + return { + load: function(options) { + var deferred, randomizedFunctionName; + deferred = $q.defer(); + if (isGoogleMapsLoaded()) { + deferred.resolve(window.google.maps); + return deferred.promise; + } + randomizedFunctionName = options.callback = 'onGoogleMapsReady' + Math.round(Math.random() * 1000); + window[randomizedFunctionName] = function() { + window[randomizedFunctionName] = null; + deferred.resolve(window.google.maps); + }; + if (window.navigator.connection && window.Connection && window.navigator.connection.type === window.Connection.NONE && !options.preventLoad) { + document.addEventListener('online', function() { + if (!isGoogleMapsLoaded()) { + return includeScript(options); + } + }); + } else if (!options.preventLoad) { + includeScript(options); + } + usedConfiguration = options; + usedConfiguration.randomizedFunctionName = randomizedFunctionName; + return deferred.promise; + }, + manualLoad: function() { + var config; + config = usedConfiguration; + if (!isGoogleMapsLoaded()) { + return includeScript(config); + } else { + if (window[config.randomizedFunctionName]) { + return window[config.randomizedFunctionName](); + } + } + } + }; + } + ]).provider('uiGmapGoogleMapApi', function() { + this.options = { + transport: 'https', + isGoogleMapsForWork: false, + china: false, + v: '3', + libraries: '', + language: 'en', + preventLoad: false + }; + this.configure = function(options) { + angular.extend(this.options, options); + }; + this.$get = [ + 'uiGmapMapScriptLoader', (function(_this) { + return function(loader) { + return loader.load(_this.options); + }; + })(this) + ]; + return this; + }).service('uiGmapGoogleMapApiManualLoader', [ + 'uiGmapMapScriptLoader', function(loader) { + return { + load: function() { + loader.manualLoad(); + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapLogger', [ + 'nemSimpleLogger', function(nemSimpleLogger) { + return nemSimpleLogger.spawn(); + } + ]); + +}).call(this); +; +/*global _:true, angular:true, google:true */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapGmapUtil', [ + 'uiGmapLogger', '$compile', function(Logger, $compile) { + var _isFalse, _isTruthy, getCoords, getLatitude, getLongitude, validateCoords; + _isTruthy = function(value, bool, optionsArray) { + return value === bool || optionsArray.indexOf(value) !== -1; + }; + _isFalse = function(value) { + return _isTruthy(value, false, ['false', 'FALSE', 0, 'n', 'N', 'no', 'NO']); + }; + getLatitude = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[1]; + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return value.coordinates[1]; + } else { + return value.latitude; + } + }; + getLongitude = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[0]; + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return value.coordinates[0]; + } else { + return value.longitude; + } + }; + getCoords = function(value) { + if (!value) { + return; + } + if (value instanceof google.maps.LatLng) { + return value; + } else if (Array.isArray(value) && value.length === 2) { + return new google.maps.LatLng(value[1], value[0]); + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return new google.maps.LatLng(value.coordinates[1], value.coordinates[0]); + } else { + return new google.maps.LatLng(value.latitude, value.longitude); + } + }; + validateCoords = function(coords) { + if (angular.isUndefined(coords)) { + return false; + } + if (_.isArray(coords)) { + if (coords.length === 2) { + return true; + } + } else if ((coords != null) && (coords != null ? coords.type : void 0)) { + if (coords.type === 'Point' && _.isArray(coords.coordinates) && coords.coordinates.length === 2) { + return true; + } + } + if (coords && angular.isDefined((coords != null ? coords.latitude : void 0) && angular.isDefined(coords != null ? coords.longitude : void 0))) { + return true; + } + return false; + }; + return { + setCoordsFromEvent: function(prevValue, newLatLon) { + if (!prevValue) { + return; + } + if (Array.isArray(prevValue) && prevValue.length === 2) { + prevValue[1] = newLatLon.lat(); + prevValue[0] = newLatLon.lng(); + } else if (angular.isDefined(prevValue.type) && prevValue.type === 'Point') { + prevValue.coordinates[1] = newLatLon.lat(); + prevValue.coordinates[0] = newLatLon.lng(); + } else { + prevValue.latitude = newLatLon.lat(); + prevValue.longitude = newLatLon.lng(); + } + return prevValue; + }, + getLabelPositionPoint: function(anchor) { + var xPos, yPos; + if (anchor === void 0) { + return void 0; + } + anchor = /^([-\d\.]+)\s([-\d\.]+)$/.exec(anchor); + xPos = parseFloat(anchor[1]); + yPos = parseFloat(anchor[2]); + if ((xPos != null) && (yPos != null)) { + return new google.maps.Point(xPos, yPos); + } + }, + createWindowOptions: function(gMarker, scope, content, defaults) { + var options; + if ((content != null) && (defaults != null) && ($compile != null)) { + options = angular.extend({}, defaults, { + content: this.buildContent(scope, defaults, content), + position: defaults.position != null ? defaults.position : angular.isObject(gMarker) ? gMarker.getPosition() : getCoords(scope.coords) + }); + if ((gMarker != null) && ((options != null ? options.pixelOffset : void 0) == null)) { + if (options.boxClass == null) { + + } else { + options.pixelOffset = { + height: 0, + width: -2 + }; + } + } + return options; + } else { + if (!defaults) { + Logger.error('infoWindow defaults not defined'); + if (!content) { + return Logger.error('infoWindow content not defined'); + } + } else { + return defaults; + } + } + }, + buildContent: function(scope, defaults, content) { + var parsed, ret; + if (defaults.content != null) { + ret = defaults.content; + } else { + if ($compile != null) { + content = content.replace(/^\s+|\s+$/g, ''); + parsed = content === '' ? '' : $compile(content)(scope); + if (parsed.length > 0) { + ret = parsed[0]; + } + } else { + ret = content; + } + } + return ret; + }, + defaultDelay: 50, + isTrue: function(value) { + return _isTruthy(value, true, ['true', 'TRUE', 1, 'y', 'Y', 'yes', 'YES']); + }, + isFalse: _isFalse, + isFalsy: function(value) { + return _isTruthy(value, false, [void 0, null]) || _isFalse(value); + }, + getCoords: getCoords, + validateCoords: validateCoords, + equalCoords: function(coord1, coord2) { + return getLatitude(coord1) === getLatitude(coord2) && getLongitude(coord1) === getLongitude(coord2); + }, + validatePath: function(path) { + var array, i, polygon, trackMaxVertices; + i = 0; + if (angular.isUndefined(path.type)) { + if (!Array.isArray(path) || path.length < 2) { + return false; + } + while (i < path.length) { + if (!((angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) || (typeof path[i].lat === 'function' && typeof path[i].lng === 'function'))) { + return false; + } + i++; + } + return true; + } else { + if (angular.isUndefined(path.coordinates)) { + return false; + } + if (path.type === 'Polygon') { + if (path.coordinates[0].length < 4) { + return false; + } + array = path.coordinates[0]; + } else if (path.type === 'MultiPolygon') { + trackMaxVertices = { + max: 0, + index: 0 + }; + _.forEach(path.coordinates, function(polygon, index) { + if (polygon[0].length > this.max) { + this.max = polygon[0].length; + return this.index = index; + } + }, trackMaxVertices); + polygon = path.coordinates[trackMaxVertices.index]; + array = polygon[0]; + if (array.length < 4) { + return false; + } + } else if (path.type === 'LineString') { + if (path.coordinates.length < 2) { + return false; + } + array = path.coordinates; + } else { + return false; + } + while (i < array.length) { + if (array[i].length !== 2) { + return false; + } + i++; + } + return true; + } + }, + convertPathPoints: function(path) { + var array, i, latlng, result, trackMaxVertices; + i = 0; + result = new google.maps.MVCArray(); + if (angular.isUndefined(path.type)) { + while (i < path.length) { + latlng; + if (angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) { + latlng = new google.maps.LatLng(path[i].latitude, path[i].longitude); + } else if (typeof path[i].lat === 'function' && typeof path[i].lng === 'function') { + latlng = path[i]; + } + result.push(latlng); + i++; + } + } else { + array; + if (path.type === 'Polygon') { + array = path.coordinates[0]; + } else if (path.type === 'MultiPolygon') { + trackMaxVertices = { + max: 0, + index: 0 + }; + _.forEach(path.coordinates, function(polygon, index) { + if (polygon[0].length > this.max) { + this.max = polygon[0].length; + return this.index = index; + } + }, trackMaxVertices); + array = path.coordinates[trackMaxVertices.index][0]; + } else if (path.type === 'LineString') { + array = path.coordinates; + } + while (i < array.length) { + result.push(new google.maps.LatLng(array[i][1], array[i][0])); + i++; + } + } + return result; + }, + getPath: function(object, key) { + var obj; + if ((key == null) || !_.isString(key)) { + return key; + } + obj = object; + _.each(key.split('.'), function(value) { + if (obj) { + return obj = obj[value]; + } + }); + return obj; + }, + validateBoundPoints: function(bounds) { + if (angular.isUndefined(bounds.sw.latitude) || angular.isUndefined(bounds.sw.longitude) || angular.isUndefined(bounds.ne.latitude) || angular.isUndefined(bounds.ne.longitude)) { + return false; + } + return true; + }, + convertBoundPoints: function(bounds) { + var result; + result = new google.maps.LatLngBounds(new google.maps.LatLng(bounds.sw.latitude, bounds.sw.longitude), new google.maps.LatLng(bounds.ne.latitude, bounds.ne.longitude)); + return result; + }, + fitMapBounds: function(map, bounds) { + return map.fitBounds(bounds); + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapEventsHelper", [ + "uiGmapLogger", function($log) { + var _getEventsObj, _hasEvents; + _hasEvents = function(obj) { + return angular.isDefined(obj.events) && (obj.events != null) && angular.isObject(obj.events); + }; + _getEventsObj = function(scope, model) { + if (_hasEvents(scope)) { + return scope; + } + if (_hasEvents(model)) { + return model; + } + }; + return { + setEvents: function(gObject, scope, model, ignores) { + var eventObj; + eventObj = _getEventsObj(scope, model); + if (eventObj != null) { + return _.compact(_.map(eventObj.events, function(eventHandler, eventName) { + var doIgnore; + if (ignores) { + doIgnore = _(ignores).includes(eventName); + } + if (eventObj.events.hasOwnProperty(eventName) && angular.isFunction(eventObj.events[eventName]) && !doIgnore) { + return google.maps.event.addListener(gObject, eventName, function() { + if (!scope.$evalAsync) { + scope.$evalAsync = function() {}; + } + return scope.$evalAsync(eventHandler.apply(scope, [gObject, eventName, model, arguments])); + }); + } + })); + } + }, + removeEvents: function(listeners) { + var key, l; + if (!listeners) { + return; + } + for (key in listeners) { + l = listeners[key]; + if (l && listeners.hasOwnProperty(key)) { + google.maps.event.removeListener(l); + } + } + } + }; + } + ]); + +}).call(this); +; +/* +@authors: +- Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +StreetViewPanorama Directive to care of basic initialization of StreetViewPanorama + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapStreetViewPanorama', [ + 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function(GoogleMapApi, $log, GmapUtil, EventsHelper) { + var name; + name = 'uiGmapStreetViewPanorama'; + return { + restrict: 'EMA', + template: '
', + replace: true, + scope: { + focalcoord: '=', + radius: '=?', + events: '=?', + options: '=?', + control: '=?', + povoptions: '=?', + imagestatus: '=' + }, + link: function(scope, element, attrs) { + return GoogleMapApi.then((function(_this) { + return function(maps) { + var clean, create, didCreateOptionsFromDirective, firstTime, handleSettings, listeners, opts, pano, povOpts, sv; + pano = void 0; + sv = void 0; + didCreateOptionsFromDirective = false; + listeners = void 0; + opts = null; + povOpts = null; + clean = function() { + EventsHelper.removeEvents(listeners); + if (pano != null) { + pano.unbind('position'); + pano.setVisible(false); + } + if (sv != null) { + if ((sv != null ? sv.setVisible : void 0) != null) { + sv.setVisible(false); + } + return sv = void 0; + } + }; + handleSettings = function(perspectivePoint, focalPoint) { + var heading; + heading = google.maps.geometry.spherical.computeHeading(perspectivePoint, focalPoint); + didCreateOptionsFromDirective = true; + scope.radius = scope.radius || 50; + povOpts = angular.extend({ + heading: heading, + zoom: 1, + pitch: 0 + }, scope.povoptions || {}); + opts = opts = angular.extend({ + navigationControl: false, + addressControl: false, + linksControl: false, + position: perspectivePoint, + pov: povOpts, + visible: true + }, scope.options || {}); + return didCreateOptionsFromDirective = false; + }; + create = function() { + var focalPoint; + if (!scope.focalcoord) { + $log.error(name + ": focalCoord needs to be defined"); + return; + } + if (!scope.radius) { + $log.error(name + ": needs a radius to set the camera view from its focal target."); + return; + } + clean(); + if (sv == null) { + sv = new google.maps.StreetViewService(); + } + if (scope.events) { + listeners = EventsHelper.setEvents(sv, scope, scope); + } + focalPoint = GmapUtil.getCoords(scope.focalcoord); + return sv.getPanoramaByLocation(focalPoint, scope.radius, function(streetViewPanoramaData, status) { + var ele, perspectivePoint, ref; + if (scope.imagestatus != null) { + scope.imagestatus = status; + } + if (((ref = scope.events) != null ? ref.image_status_changed : void 0) != null) { + scope.events.image_status_changed(sv, 'image_status_changed', scope, status); + } + if (status === "OK") { + perspectivePoint = streetViewPanoramaData.location.latLng; + handleSettings(perspectivePoint, focalPoint); + ele = element[0]; + return pano = new google.maps.StreetViewPanorama(ele, opts); + } + }); + }; + if (scope.control != null) { + scope.control.getOptions = function() { + return opts; + }; + scope.control.getPovOptions = function() { + return povOpts; + }; + scope.control.getGObject = function() { + return sv; + }; + scope.control.getGPano = function() { + return pano; + }; + } + scope.$watch('options', function(newValue, oldValue) { + if (newValue === oldValue || newValue === opts || didCreateOptionsFromDirective) { + return; + } + return create(); + }); + firstTime = true; + scope.$watch('focalcoord', function(newValue, oldValue) { + if (newValue === oldValue && !firstTime) { + return; + } + if (newValue == null) { + return; + } + firstTime = false; + return create(); + }); + return scope.$on('$destroy', function() { + return clean(); + }); + }; + })(this)); + } + }; + } + ]); + +}).call(this); +}( window, angular, _)); +//# sourceMappingURL=angular-google-maps-street-view_dev_mapped.js.map \ No newline at end of file diff --git a/dist/angular-google-maps-street-view_dev_mapped.js.map b/dist/angular-google-maps-street-view_dev_mapped.js.map new file mode 100644 index 000000000..61276f948 --- /dev/null +++ b/dist/angular-google-maps-street-view_dev_mapped.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../tmp/src/coffee/module.js","../tmp/wrapped_uuid.js","../tmp/src/coffee/providers/map-loader.js","../tmp/src/coffee/directives/api/utils/logger.js","../tmp/src/coffee/directives/api/utils/gmap-util.js","../tmp/src/coffee/directives/api/utils/events-helper.js","../tmp/src/coffee/directives/street-view-panorama.js"],"names":[],"mappings":";;;;;;eAAA;AACA,EAAE;AACF,CAAC;AACD,GAAG,CAAC,GAAG,CAAC,OAAO;AACf;AACA,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG;AACzD;AACA,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;AAC5E,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,IAAI;AAC7E,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM;AAC5E,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI;AACzE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACrE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC;AACxD;AACA,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE;AAC1E,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;AACnD;AACA,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE;AAC1E,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC;AACxE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;AAC3E,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK;AACtE,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;AAC7E,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACzE,GAAG,CAAC,QAAQ,CAAC;AACb;AACA,OAAO,CAAC,MAAM,CAAC,IAAI;AACnB,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;AACjD;AACA,CAAC,OAAO;AACR,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB;AAChE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS;AACjD,CAAC,EAAE;AACH;AACA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,UAAU,IAAI;AAChE;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI;AAClD;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI;AAC/G;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,IAAI;AAC7F;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI;AAClE;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI;AACzG;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI;AAC1E;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI;AAC/M;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI;AAClM;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI;AACzG;AACA,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI;AAC3G;AACA,GAAG,IAAI,CAAC,IAAI,EAAE;CCxDd,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE;AAC3C,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnC,EAAE,EAAE,KAAK,CAAC,OAAO;AACjB,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAC5B,EAAE,EAAE;AACJ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3C,EAAE;AACF,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE;AAC5Z;AACA,EAAE,EAAE,GAAG,CAAC,OAAO;AACf,MAAM,CAAC,IAAI,CAAC;AACZ,GAAG;CCZH,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;AAClF,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,MAAM,GAAG,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC;AACvF,MAAM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxB,MAAM,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjC,MAAM,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACxC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5B,UAAU,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG;AACtD,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7C,YAAY,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG;AACxD,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAClB,YAAY,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG;AAC7E,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,MAAM,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACzC,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC;AACnD,QAAQ,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,GAAG;AACnF,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAC1C,UAAU,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG;AAClC,QAAQ,CAAC;AACT,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAQ,GAAG;AACX,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvB,UAAU,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE;AACzD,UAAU,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,EAAE;AACxD,QAAQ,CAAC;AACT,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM;AAChC,QAAQ,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG;AAClD,QAAQ,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI;AACvE,QAAQ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE;AACxC,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACnD,QAAQ,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACjD,MAAM,EAAE;AACR,MAAM,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,QAAQ,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACzF,MAAM,EAAE;AACR,MAAM,MAAM,CAAC,CAAC;AACd,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACjC,UAAU,GAAG,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC;AAC/C,UAAU,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;AAChC,UAAU,EAAE,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC;AACrC,YAAY,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACjD,YAAY,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;AACpC,UAAU,CAAC;AACX,UAAU,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;AAC7G,UAAU,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,YAAY,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,YAAY,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACjD,UAAU,EAAE;AACZ,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AACxJ,YAAY,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC5D,cAAc,EAAE,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC;AAC1C,gBAAgB,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;AAC9C,cAAc,CAAC;AACf,YAAY,GAAG;AACf,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5C,YAAY,aAAa,CAAC,OAAO,EAAE;AACnC,UAAU,CAAC;AACX,UAAU,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC;AACtC,UAAU,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAC;AAC5E,UAAU,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;AAClC,QAAQ,EAAE;AACV,QAAQ,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChC,UAAU,GAAG,CAAC,MAAM,CAAC;AACrB,UAAU,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC;AACrC,UAAU,EAAE,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC;AACtC,YAAY,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE;AACzC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAClB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC;AACxD,cAAc,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,sBAAsB,IAAI;AAC7D,YAAY,CAAC;AACb,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,IAAI,CAAC;AACL,EAAE,GAAG,QAAQ,EAAE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,MAAM,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE;AACzB,MAAM,mBAAmB,CAAC,CAAC,KAAK,CAAC;AACjC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC;AACnB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACb,MAAM,SAAS,CAAC,CAAC,GAAG;AACpB,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;AACrB,MAAM,WAAW,CAAC,CAAC,KAAK;AACxB,IAAI,EAAE;AACN,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACxC,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;AAC5C,IAAI,EAAE;AACN,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACjB,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,QAAQ,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACjC,UAAU,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AAC5C,QAAQ,EAAE;AACV,MAAM,GAAG,IAAI,CAAC;AACd,IAAI,EAAE;AACN,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,EAAE,GAAG,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;AAChD,IAAI,CAAC,qBAAqB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,MAAM,MAAM,CAAC,CAAC;AACd,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1B,UAAU,MAAM,CAAC,UAAU,GAAG;AAC9B,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,IAAI,CAAC;AACL,EAAE,GAAG;AACL;AACA,GAAG,IAAI,CAAC,IAAI,EAAE;CC9Gd,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;AACpF,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;AAClD,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,GAAG;AACrC,IAAI,CAAC;AACL,EAAE,GAAG;AACL;AACA,GAAG,IAAI,CAAC,IAAI,EAAE;CCPd;AACA,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAC7C;AACA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;AACtF,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5D,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC;AACpF,MAAM,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACvD,QAAQ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpE,MAAM,EAAE;AACR,MAAM,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI;AACpF,MAAM,EAAE;AACR,MAAM,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,UAAU,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AAC1B,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7E,UAAU,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE;AACtC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChB,UAAU,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;AAChC,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,MAAM,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,UAAU,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AAC1B,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7E,UAAU,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE;AACtC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChB,UAAU,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;AACjC,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,MAAM,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACnC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACrB,UAAU,MAAM,CAAC;AACjB,QAAQ,CAAC;AACT,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAClD,UAAU,MAAM,CAAC,KAAK,CAAC;AACvB,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,UAAU,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG;AAC5D,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7E,UAAU,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG;AACpF,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAChB,UAAU,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE;AACzE,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,MAAM,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACzC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1C,UAAU,MAAM,CAAC,KAAK,CAAC;AACvB,QAAQ,CAAC;AACT,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,YAAY,MAAM,CAAC,IAAI,CAAC;AACxB,UAAU,CAAC;AACX,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACjF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5G,YAAY,MAAM,CAAC,IAAI,CAAC;AACxB,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACxJ,UAAU,MAAM,CAAC,IAAI,CAAC;AACtB,QAAQ,CAAC;AACT,QAAQ,MAAM,CAAC,KAAK,CAAC;AACrB,MAAM,EAAE;AACR,MAAM,MAAM,CAAC,CAAC;AACd,QAAQ,kBAAkB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5D,UAAU,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;AAC3B,YAAY,MAAM,CAAC;AACnB,UAAU,CAAC;AACX,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,YAAY,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG;AAC3C,YAAY,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG;AAC3C,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACvF,YAAY,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG;AACvD,YAAY,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG;AACvD,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAClB,YAAY,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG;AACjD,YAAY,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG;AAClD,UAAU,CAAC;AACX,UAAU,MAAM,CAAC,SAAS,CAAC;AAC3B,QAAQ,EAAE;AACV,QAAQ,qBAAqB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACjD,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AACzB,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,YAAY,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1B,UAAU,CAAC;AACX,UAAU,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE;AAC3D,UAAU,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG;AACvC,UAAU,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG;AACvC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,YAAY,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AACrD,UAAU,CAAC;AACX,QAAQ,EAAE;AACV,QAAQ,mBAAmB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1E,UAAU,GAAG,CAAC,OAAO,CAAC;AACtB,UAAU,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9E,YAAY,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpD,cAAc,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;AACnE,cAAc,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;AACnJ,YAAY,GAAG;AACf,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAClG,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C;AACA,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;AACtB,gBAAgB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACvC,kBAAkB,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B,kBAAkB,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3B,gBAAgB,EAAE;AAClB,cAAc,CAAC;AACf,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,OAAO,CAAC;AAC3B,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAClB,YAAY,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC5B,cAAc,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,GAAG;AAC9D,cAAc,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7B,gBAAgB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG;AACtE,cAAc,CAAC;AACf,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,cAAc,MAAM,CAAC,QAAQ,CAAC;AAC9B,YAAY,CAAC;AACb,UAAU,CAAC;AACX,QAAQ,EAAE;AACV,QAAQ,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1D,UAAU,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC;AAC1B,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACzC,YAAY,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;AACnC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAClB,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,cAAc,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;AAC1D,cAAc,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;AACtE,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,gBAAgB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE;AAChC,cAAc,CAAC;AACf,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,cAAc,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5B,YAAY,CAAC;AACb,UAAU,CAAC;AACX,UAAU,MAAM,CAAC,GAAG,CAAC;AACrB,QAAQ,EAAE;AACV,QAAQ,YAAY,CAAC,CAAC,EAAE,CAAC;AACzB,QAAQ,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,UAAU,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI;AACrF,QAAQ,EAAE;AACV,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC;AAC1B,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,UAAU,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;AAC5E,QAAQ,EAAE;AACV,QAAQ,SAAS,CAAC,CAAC,SAAS,CAAC;AAC7B,QAAQ,cAAc,CAAC,CAAC,cAAc,CAAC;AACvC,QAAQ,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,UAAU,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE;AAC9G,QAAQ,EAAE;AACV,QAAQ,YAAY,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACtC,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC;AAClD,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,cAAc,MAAM,CAAC,KAAK,CAAC;AAC3B,YAAY,CAAC;AACb,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,cAAc,EAAE,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;AACjL,gBAAgB,MAAM,CAAC,KAAK,CAAC;AAC7B,cAAc,CAAC;AACf,cAAc,CAAC,GAAG;AAClB,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,IAAI,CAAC;AACxB,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAClB,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACxD,cAAc,MAAM,CAAC,KAAK,CAAC;AAC3B,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC1C,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,gBAAgB,MAAM,CAAC,KAAK,CAAC;AAC7B,cAAc,CAAC;AACf,cAAc,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE;AAC1C,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;AACtD,cAAc,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC;AACvB,gBAAgB,KAAK,CAAC,CAAC,CAAC;AACxB,cAAc,EAAE;AAChB,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,kBAAkB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAC/C,kBAAkB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5C,gBAAgB,CAAC;AACjB,cAAc,EAAE,CAAC,gBAAgB,EAAE;AACnC,cAAc,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACjE,cAAc,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE;AACjC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,gBAAgB,MAAM,CAAC,KAAK,CAAC;AAC7B,cAAc,CAAC;AACf,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;AACpD,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,gBAAgB,MAAM,CAAC,KAAK,CAAC;AAC7B,cAAc,CAAC;AACf,cAAc,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;AACvC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,cAAc,MAAM,CAAC,KAAK,CAAC;AAC3B,YAAY,CAAC;AACb,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACtC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,gBAAgB,MAAM,CAAC,KAAK,CAAC;AAC7B,cAAc,CAAC;AACf,cAAc,CAAC,GAAG;AAClB,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,IAAI,CAAC;AACxB,UAAU,CAAC;AACX,QAAQ,EAAE;AACV,QAAQ,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC;AACzD,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChB,UAAU,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG;AAC9C,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,cAAc,MAAM,CAAC;AACrB,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AAChG,gBAAgB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE;AACrF,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClG,gBAAgB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;AACjC,cAAc,CAAC;AACf,cAAc,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE;AAClC,cAAc,CAAC,GAAG;AAClB,YAAY,CAAC;AACb,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AAClB,YAAY,KAAK,CAAC;AAClB,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC1C,cAAc,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE;AAC1C,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;AACtD,cAAc,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC;AACvB,gBAAgB,KAAK,CAAC,CAAC,CAAC;AACxB,cAAc,EAAE;AAChB,cAAc,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,kBAAkB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAC/C,kBAAkB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5C,gBAAgB,CAAC;AACjB,cAAc,EAAE,CAAC,gBAAgB,EAAE;AACnC,cAAc,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE;AAClE,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;AACpD,cAAc,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;AACvC,YAAY,CAAC;AACb,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACtC,cAAc,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI;AAC5E,cAAc,CAAC,GAAG;AAClB,YAAY,CAAC;AACb,UAAU,CAAC;AACX,UAAU,MAAM,CAAC,MAAM,CAAC;AACxB,QAAQ,EAAE;AACV,QAAQ,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,UAAU,GAAG,CAAC,GAAG,CAAC;AAClB,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;AAClD,YAAY,MAAM,CAAC,GAAG,CAAC;AACvB,UAAU,CAAC;AACX,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACvB,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACtB,cAAc,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE;AACtC,YAAY,CAAC;AACb,UAAU,GAAG;AACb,UAAU,MAAM,CAAC,GAAG,CAAC;AACrB,QAAQ,EAAE;AACV,QAAQ,mBAAmB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;AAC3L,YAAY,MAAM,CAAC,KAAK,CAAC;AACzB,UAAU,CAAC;AACX,UAAU,MAAM,CAAC,IAAI,CAAC;AACtB,QAAQ,EAAE;AACV,QAAQ,kBAAkB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,UAAU,GAAG,CAAC,MAAM,CAAC;AACrB,UAAU,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,GAAG;AAClL,UAAU,MAAM,CAAC,MAAM,CAAC;AACxB,QAAQ,EAAE;AACV,QAAQ,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7C,UAAU,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;AACvC,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,IAAI,CAAC;AACL,EAAE,GAAG;AACL;AACA,GAAG,IAAI,CAAC,IAAI,EAAE;CCvRd,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAC1F,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;AACpC,MAAM,GAAG,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC;AACpC,MAAM,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAClC,QAAQ,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;AACrG,MAAM,EAAE;AACR,MAAM,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;AAChC,UAAU,MAAM,CAAC,KAAK,CAAC;AACvB,QAAQ,CAAC;AACT,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;AAChC,UAAU,MAAM,CAAC,KAAK,CAAC;AACvB,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,MAAM,MAAM,CAAC,CAAC;AACd,QAAQ,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,UAAU,GAAG,CAAC,QAAQ,CAAC;AACvB,UAAU,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;AACjD,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACjC,YAAY,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACvF,cAAc,GAAG,CAAC,QAAQ,CAAC;AAC3B,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5B,gBAAgB,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE;AAC1D,cAAc,CAAC;AACf,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7H,gBAAgB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACrF,kBAAkB,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AAC1C,oBAAoB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG;AACrD,kBAAkB,CAAC;AACnB,kBAAkB,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI;AAC7G,gBAAgB,GAAG;AACnB,cAAc,CAAC;AACf,YAAY,IAAI;AAChB,UAAU,CAAC;AACX,QAAQ,EAAE;AACV,QAAQ,YAAY,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3C,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrB,UAAU,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;AAC3B,YAAY,MAAM,CAAC;AACnB,UAAU,CAAC;AACX,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AAClC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;AAC/B,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;AACrD,cAAc,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE;AAClD,YAAY,CAAC;AACb,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,IAAI,CAAC;AACL,EAAE,GAAG;AACL;AACA,GAAG,IAAI,CAAC,IAAI,EAAE;CCpDd;AACA,EAAE;AACF,CAAC,OAAO,CAAC;AACT,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS;AACnD,CAAC,EAAE;AACH;AACA;AACA,EAAE;AACF,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,kBAAkB;AAClF,CAAC,EAAE;AACH;AACA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,GAAG,SAAS,EAAE,wBAAwB,EAAE,CAAC,CAAC;AAC7E,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACxI,MAAM,GAAG,CAAC,IAAI,CAAC;AACf,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,wBAAwB,EAAE;AACxC,MAAM,MAAM,CAAC,CAAC;AACd,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE;AACxB,QAAQ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AAChF,QAAQ,OAAO,CAAC,CAAC,IAAI,CAAC;AACtB,QAAQ,KAAK,CAAC,CAAC,CAAC;AAChB,UAAU,UAAU,CAAC,CAAC,IAAI;AAC1B,UAAU,MAAM,CAAC,CAAC,KAAK;AACvB,UAAU,MAAM,CAAC,CAAC,KAAK;AACvB,UAAU,OAAO,CAAC,CAAC,KAAK;AACxB,UAAU,OAAO,CAAC,CAAC,KAAK;AACxB,UAAU,UAAU,CAAC,CAAC,KAAK;AAC3B,UAAU,WAAW,CAAC,CAAC,GAAG;AAC1B,QAAQ,EAAE;AACV,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,UAAU,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,YAAY,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,cAAc,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;AAC9H,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1B,cAAc,6BAA6B,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,cAAc,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjC,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1B,cAAc,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7B,cAAc,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClC,gBAAgB,YAAY,CAAC,YAAY,CAAC,SAAS,EAAE;AACrD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,kBAAkB,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG;AAC1C,kBAAkB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AACzC,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACjC,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACtE,oBAAoB,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE;AACzC,kBAAkB,CAAC;AACnB,kBAAkB,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,gBAAgB,CAAC;AACjB,cAAc,EAAE;AAChB,cAAc,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACvE,gBAAgB,GAAG,CAAC,OAAO,CAAC;AAC5B,gBAAgB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE;AACtG,gBAAgB,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,gBAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAClD,gBAAgB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE;AAC1C,kBAAkB,OAAO,CAAC,CAAC,OAAO,CAAC;AACnC,kBAAkB,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1B,kBAAkB,KAAK,CAAC,CAAC,CAAC;AAC1B,gBAAgB,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI;AAC3C,gBAAgB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9C,kBAAkB,iBAAiB,CAAC,CAAC,KAAK,CAAC;AAC3C,kBAAkB,cAAc,CAAC,CAAC,KAAK,CAAC;AACxC,kBAAkB,YAAY,CAAC,CAAC,KAAK,CAAC;AACtC,kBAAkB,QAAQ,CAAC,CAAC,gBAAgB,CAAC;AAC7C,kBAAkB,GAAG,CAAC,CAAC,OAAO,CAAC;AAC/B,kBAAkB,OAAO,CAAC,CAAC,IAAI;AAC/B,gBAAgB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI;AACxC,gBAAgB,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,cAAc,EAAE;AAChB,cAAc,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnC,gBAAgB,GAAG,CAAC,UAAU,CAAC;AAC/B,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AACxC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,GAAG;AACxE,kBAAkB,MAAM,CAAC;AACzB,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI;AACtG,kBAAkB,MAAM,CAAC;AACzB,gBAAgB,CAAC;AACjB,gBAAgB,KAAK,GAAG;AACxB,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACjC,kBAAkB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,GAAG;AAC3D,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,kBAAkB,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;AACvE,gBAAgB,CAAC;AACjB,gBAAgB,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE;AAClE,gBAAgB,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACpH,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC;AACjD,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,kBAAkB,CAAC;AACnB,kBAAkB,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACnG,oBAAoB,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;AACjG,kBAAkB,CAAC;AACnB,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxC,oBAAoB,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC9E,oBAAoB,cAAc,CAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE;AACjE,oBAAoB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE;AACrC,oBAAoB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAChF,kBAAkB,CAAC;AACnB,gBAAgB,GAAG;AACnB,cAAc,EAAE;AAChB,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,gBAAgB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,kBAAkB,MAAM,CAAC,IAAI,CAAC;AAC9B,gBAAgB,EAAE;AAClB,gBAAgB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1D,kBAAkB,MAAM,CAAC,OAAO,CAAC;AACjC,gBAAgB,EAAE;AAClB,gBAAgB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,kBAAkB,MAAM,CAAC,EAAE,CAAC;AAC5B,gBAAgB,EAAE;AAClB,gBAAgB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACrD,kBAAkB,MAAM,CAAC,IAAI,CAAC;AAC9B,gBAAgB,EAAE;AAClB,cAAc,CAAC;AACf,cAAc,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpE,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC;AAClG,kBAAkB,MAAM,CAAC;AACzB,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,MAAM,GAAG;AAChC,cAAc,GAAG;AACjB,cAAc,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/B,cAAc,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvE,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1D,kBAAkB,MAAM,CAAC;AACzB,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,kBAAkB,MAAM,CAAC;AACzB,gBAAgB,CAAC;AACjB,gBAAgB,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAClC,gBAAgB,MAAM,CAAC,MAAM,GAAG;AAChC,cAAc,GAAG;AACjB,cAAc,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,gBAAgB,MAAM,CAAC,KAAK,GAAG;AAC/B,cAAc,GAAG;AACjB,YAAY,EAAE;AACd,UAAU,GAAG,IAAI,GAAG;AACpB,QAAQ,CAAC;AACT,MAAM,EAAE;AACR,IAAI,CAAC;AACL,EAAE,GAAG;AACL;AACA,GAAG,IAAI,CAAC,IAAI,EAAE","file":"angular-google-maps-street-view_dev_mapped.js","sourcesContent":["\n/*\n!\nThe MIT License\n\nCopyright (c) 2010-2013 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the 'Software'), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\nangular-google-maps\nhttps://github.com/angular-ui/angular-google-maps\n\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps.providers', ['nemLogging']);\n\n angular.module('uiGmapgoogle-maps.wrapped', []);\n\n angular.module('uiGmapgoogle-maps.extensions', ['uiGmapgoogle-maps.wrapped', 'uiGmapgoogle-maps.providers']);\n\n angular.module('uiGmapgoogle-maps.directives.api.utils', ['uiGmapgoogle-maps.extensions']);\n\n angular.module('uiGmapgoogle-maps.directives.api.managers', []);\n\n angular.module('uiGmapgoogle-maps.directives.api.options', ['uiGmapgoogle-maps.directives.api.utils']);\n\n angular.module('uiGmapgoogle-maps.directives.api.options.builders', []);\n\n angular.module('uiGmapgoogle-maps.directives.api.models.child', ['uiGmapgoogle-maps.directives.api.utils', 'uiGmapgoogle-maps.directives.api.options', 'uiGmapgoogle-maps.directives.api.options.builders']);\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent', ['uiGmapgoogle-maps.directives.api.managers', 'uiGmapgoogle-maps.directives.api.models.child', 'uiGmapgoogle-maps.providers']);\n\n angular.module('uiGmapgoogle-maps.directives.api', ['uiGmapgoogle-maps.directives.api.models.parent']);\n\n angular.module('uiGmapgoogle-maps', ['uiGmapgoogle-maps.directives.api', 'uiGmapgoogle-maps.providers']);\n\n}).call(this);\n","angular.module('uiGmapgoogle-maps.wrapped')\n.service('uiGmapuuid', function() {\n //BEGIN REPLACE\n /* istanbul ignore next */\n /*\n Version: core-1.0\n The MIT License: Copyright (c) 2012 LiosK.\n*/\nfunction UUID(){}UUID.generate=function(){var a=UUID._gri,b=UUID._ha;return b(a(32),8)+\"-\"+b(a(16),4)+\"-\"+b(16384|a(12),4)+\"-\"+b(32768|a(14),4)+\"-\"+b(a(48),12)};UUID._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)d&1&&(c=e+c);return c};\n\n //END REPLACE\nreturn UUID;\n});\n","(function() {\n angular.module('uiGmapgoogle-maps.providers').factory('uiGmapMapScriptLoader', [\n '$q', 'uiGmapuuid', function($q, uuid) {\n var getScriptUrl, includeScript, isGoogleMapsLoaded, scriptId, usedConfiguration;\n scriptId = void 0;\n usedConfiguration = void 0;\n getScriptUrl = function(options) {\n if (options.china) {\n return 'http://maps.google.cn/maps/api/js?';\n } else {\n if (options.transport === 'auto') {\n return '//maps.googleapis.com/maps/api/js?';\n } else {\n return options.transport + '://maps.googleapis.com/maps/api/js?';\n }\n }\n };\n includeScript = function(options) {\n var omitOptions, query, script, scriptElem;\n omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad'];\n if (options.isGoogleMapsForWork) {\n omitOptions.push('key');\n }\n query = _.map(_.omit(options, omitOptions), function(v, k) {\n return k + '=' + v;\n });\n if (scriptId) {\n scriptElem = document.getElementById(scriptId);\n scriptElem.parentNode.removeChild(scriptElem);\n }\n query = query.join('&');\n script = document.createElement('script');\n script.id = scriptId = \"ui_gmap_map_load_\" + (uuid.generate());\n script.type = 'text/javascript';\n script.src = getScriptUrl(options) + query;\n return document.head.appendChild(script);\n };\n isGoogleMapsLoaded = function() {\n return angular.isDefined(window.google) && angular.isDefined(window.google.maps);\n };\n return {\n load: function(options) {\n var deferred, randomizedFunctionName;\n deferred = $q.defer();\n if (isGoogleMapsLoaded()) {\n deferred.resolve(window.google.maps);\n return deferred.promise;\n }\n randomizedFunctionName = options.callback = 'onGoogleMapsReady' + Math.round(Math.random() * 1000);\n window[randomizedFunctionName] = function() {\n window[randomizedFunctionName] = null;\n deferred.resolve(window.google.maps);\n };\n if (window.navigator.connection && window.Connection && window.navigator.connection.type === window.Connection.NONE && !options.preventLoad) {\n document.addEventListener('online', function() {\n if (!isGoogleMapsLoaded()) {\n return includeScript(options);\n }\n });\n } else if (!options.preventLoad) {\n includeScript(options);\n }\n usedConfiguration = options;\n usedConfiguration.randomizedFunctionName = randomizedFunctionName;\n return deferred.promise;\n },\n manualLoad: function() {\n var config;\n config = usedConfiguration;\n if (!isGoogleMapsLoaded()) {\n return includeScript(config);\n } else {\n if (window[config.randomizedFunctionName]) {\n return window[config.randomizedFunctionName]();\n }\n }\n }\n };\n }\n ]).provider('uiGmapGoogleMapApi', function() {\n this.options = {\n transport: 'https',\n isGoogleMapsForWork: false,\n china: false,\n v: '3',\n libraries: '',\n language: 'en',\n preventLoad: false\n };\n this.configure = function(options) {\n angular.extend(this.options, options);\n };\n this.$get = [\n 'uiGmapMapScriptLoader', (function(_this) {\n return function(loader) {\n return loader.load(_this.options);\n };\n })(this)\n ];\n return this;\n }).service('uiGmapGoogleMapApiManualLoader', [\n 'uiGmapMapScriptLoader', function(loader) {\n return {\n load: function() {\n loader.manualLoad();\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapLogger', [\n 'nemSimpleLogger', function(nemSimpleLogger) {\n return nemSimpleLogger.spawn();\n }\n ]);\n\n}).call(this);\n","\n/*global _:true, angular:true, google:true */\n\n(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapGmapUtil', [\n 'uiGmapLogger', '$compile', function(Logger, $compile) {\n var _isFalse, _isTruthy, getCoords, getLatitude, getLongitude, validateCoords;\n _isTruthy = function(value, bool, optionsArray) {\n return value === bool || optionsArray.indexOf(value) !== -1;\n };\n _isFalse = function(value) {\n return _isTruthy(value, false, ['false', 'FALSE', 0, 'n', 'N', 'no', 'NO']);\n };\n getLatitude = function(value) {\n if (Array.isArray(value) && value.length === 2) {\n return value[1];\n } else if (angular.isDefined(value.type) && value.type === 'Point') {\n return value.coordinates[1];\n } else {\n return value.latitude;\n }\n };\n getLongitude = function(value) {\n if (Array.isArray(value) && value.length === 2) {\n return value[0];\n } else if (angular.isDefined(value.type) && value.type === 'Point') {\n return value.coordinates[0];\n } else {\n return value.longitude;\n }\n };\n getCoords = function(value) {\n if (!value) {\n return;\n }\n if (value instanceof google.maps.LatLng) {\n return value;\n } else if (Array.isArray(value) && value.length === 2) {\n return new google.maps.LatLng(value[1], value[0]);\n } else if (angular.isDefined(value.type) && value.type === 'Point') {\n return new google.maps.LatLng(value.coordinates[1], value.coordinates[0]);\n } else {\n return new google.maps.LatLng(value.latitude, value.longitude);\n }\n };\n validateCoords = function(coords) {\n if (angular.isUndefined(coords)) {\n return false;\n }\n if (_.isArray(coords)) {\n if (coords.length === 2) {\n return true;\n }\n } else if ((coords != null) && (coords != null ? coords.type : void 0)) {\n if (coords.type === 'Point' && _.isArray(coords.coordinates) && coords.coordinates.length === 2) {\n return true;\n }\n }\n if (coords && angular.isDefined((coords != null ? coords.latitude : void 0) && angular.isDefined(coords != null ? coords.longitude : void 0))) {\n return true;\n }\n return false;\n };\n return {\n setCoordsFromEvent: function(prevValue, newLatLon) {\n if (!prevValue) {\n return;\n }\n if (Array.isArray(prevValue) && prevValue.length === 2) {\n prevValue[1] = newLatLon.lat();\n prevValue[0] = newLatLon.lng();\n } else if (angular.isDefined(prevValue.type) && prevValue.type === 'Point') {\n prevValue.coordinates[1] = newLatLon.lat();\n prevValue.coordinates[0] = newLatLon.lng();\n } else {\n prevValue.latitude = newLatLon.lat();\n prevValue.longitude = newLatLon.lng();\n }\n return prevValue;\n },\n getLabelPositionPoint: function(anchor) {\n var xPos, yPos;\n if (anchor === void 0) {\n return void 0;\n }\n anchor = /^([-\\d\\.]+)\\s([-\\d\\.]+)$/.exec(anchor);\n xPos = parseFloat(anchor[1]);\n yPos = parseFloat(anchor[2]);\n if ((xPos != null) && (yPos != null)) {\n return new google.maps.Point(xPos, yPos);\n }\n },\n createWindowOptions: function(gMarker, scope, content, defaults) {\n var options;\n if ((content != null) && (defaults != null) && ($compile != null)) {\n options = angular.extend({}, defaults, {\n content: this.buildContent(scope, defaults, content),\n position: defaults.position != null ? defaults.position : angular.isObject(gMarker) ? gMarker.getPosition() : getCoords(scope.coords)\n });\n if ((gMarker != null) && ((options != null ? options.pixelOffset : void 0) == null)) {\n if (options.boxClass == null) {\n\n } else {\n options.pixelOffset = {\n height: 0,\n width: -2\n };\n }\n }\n return options;\n } else {\n if (!defaults) {\n Logger.error('infoWindow defaults not defined');\n if (!content) {\n return Logger.error('infoWindow content not defined');\n }\n } else {\n return defaults;\n }\n }\n },\n buildContent: function(scope, defaults, content) {\n var parsed, ret;\n if (defaults.content != null) {\n ret = defaults.content;\n } else {\n if ($compile != null) {\n content = content.replace(/^\\s+|\\s+$/g, '');\n parsed = content === '' ? '' : $compile(content)(scope);\n if (parsed.length > 0) {\n ret = parsed[0];\n }\n } else {\n ret = content;\n }\n }\n return ret;\n },\n defaultDelay: 50,\n isTrue: function(value) {\n return _isTruthy(value, true, ['true', 'TRUE', 1, 'y', 'Y', 'yes', 'YES']);\n },\n isFalse: _isFalse,\n isFalsy: function(value) {\n return _isTruthy(value, false, [void 0, null]) || _isFalse(value);\n },\n getCoords: getCoords,\n validateCoords: validateCoords,\n equalCoords: function(coord1, coord2) {\n return getLatitude(coord1) === getLatitude(coord2) && getLongitude(coord1) === getLongitude(coord2);\n },\n validatePath: function(path) {\n var array, i, polygon, trackMaxVertices;\n i = 0;\n if (angular.isUndefined(path.type)) {\n if (!Array.isArray(path) || path.length < 2) {\n return false;\n }\n while (i < path.length) {\n if (!((angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) || (typeof path[i].lat === 'function' && typeof path[i].lng === 'function'))) {\n return false;\n }\n i++;\n }\n return true;\n } else {\n if (angular.isUndefined(path.coordinates)) {\n return false;\n }\n if (path.type === 'Polygon') {\n if (path.coordinates[0].length < 4) {\n return false;\n }\n array = path.coordinates[0];\n } else if (path.type === 'MultiPolygon') {\n trackMaxVertices = {\n max: 0,\n index: 0\n };\n _.forEach(path.coordinates, function(polygon, index) {\n if (polygon[0].length > this.max) {\n this.max = polygon[0].length;\n return this.index = index;\n }\n }, trackMaxVertices);\n polygon = path.coordinates[trackMaxVertices.index];\n array = polygon[0];\n if (array.length < 4) {\n return false;\n }\n } else if (path.type === 'LineString') {\n if (path.coordinates.length < 2) {\n return false;\n }\n array = path.coordinates;\n } else {\n return false;\n }\n while (i < array.length) {\n if (array[i].length !== 2) {\n return false;\n }\n i++;\n }\n return true;\n }\n },\n convertPathPoints: function(path) {\n var array, i, latlng, result, trackMaxVertices;\n i = 0;\n result = new google.maps.MVCArray();\n if (angular.isUndefined(path.type)) {\n while (i < path.length) {\n latlng;\n if (angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) {\n latlng = new google.maps.LatLng(path[i].latitude, path[i].longitude);\n } else if (typeof path[i].lat === 'function' && typeof path[i].lng === 'function') {\n latlng = path[i];\n }\n result.push(latlng);\n i++;\n }\n } else {\n array;\n if (path.type === 'Polygon') {\n array = path.coordinates[0];\n } else if (path.type === 'MultiPolygon') {\n trackMaxVertices = {\n max: 0,\n index: 0\n };\n _.forEach(path.coordinates, function(polygon, index) {\n if (polygon[0].length > this.max) {\n this.max = polygon[0].length;\n return this.index = index;\n }\n }, trackMaxVertices);\n array = path.coordinates[trackMaxVertices.index][0];\n } else if (path.type === 'LineString') {\n array = path.coordinates;\n }\n while (i < array.length) {\n result.push(new google.maps.LatLng(array[i][1], array[i][0]));\n i++;\n }\n }\n return result;\n },\n getPath: function(object, key) {\n var obj;\n if ((key == null) || !_.isString(key)) {\n return key;\n }\n obj = object;\n _.each(key.split('.'), function(value) {\n if (obj) {\n return obj = obj[value];\n }\n });\n return obj;\n },\n validateBoundPoints: function(bounds) {\n if (angular.isUndefined(bounds.sw.latitude) || angular.isUndefined(bounds.sw.longitude) || angular.isUndefined(bounds.ne.latitude) || angular.isUndefined(bounds.ne.longitude)) {\n return false;\n }\n return true;\n },\n convertBoundPoints: function(bounds) {\n var result;\n result = new google.maps.LatLngBounds(new google.maps.LatLng(bounds.sw.latitude, bounds.sw.longitude), new google.maps.LatLng(bounds.ne.latitude, bounds.ne.longitude));\n return result;\n },\n fitMapBounds: function(map, bounds) {\n return map.fitBounds(bounds);\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module(\"uiGmapgoogle-maps.directives.api.utils\").service(\"uiGmapEventsHelper\", [\n \"uiGmapLogger\", function($log) {\n var _getEventsObj, _hasEvents;\n _hasEvents = function(obj) {\n return angular.isDefined(obj.events) && (obj.events != null) && angular.isObject(obj.events);\n };\n _getEventsObj = function(scope, model) {\n if (_hasEvents(scope)) {\n return scope;\n }\n if (_hasEvents(model)) {\n return model;\n }\n };\n return {\n setEvents: function(gObject, scope, model, ignores) {\n var eventObj;\n eventObj = _getEventsObj(scope, model);\n if (eventObj != null) {\n return _.compact(_.map(eventObj.events, function(eventHandler, eventName) {\n var doIgnore;\n if (ignores) {\n doIgnore = _(ignores).includes(eventName);\n }\n if (eventObj.events.hasOwnProperty(eventName) && angular.isFunction(eventObj.events[eventName]) && !doIgnore) {\n return google.maps.event.addListener(gObject, eventName, function() {\n if (!scope.$evalAsync) {\n scope.$evalAsync = function() {};\n }\n return scope.$evalAsync(eventHandler.apply(scope, [gObject, eventName, model, arguments]));\n });\n }\n }));\n }\n },\n removeEvents: function(listeners) {\n var key, l;\n if (!listeners) {\n return;\n }\n for (key in listeners) {\n l = listeners[key];\n if (l && listeners.hasOwnProperty(key)) {\n google.maps.event.removeListener(l);\n }\n }\n }\n };\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors:\n- Nicholas McCready - https://twitter.com/nmccready\n */\n\n\n/*\nStreetViewPanorama Directive to care of basic initialization of StreetViewPanorama\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapStreetViewPanorama', [\n 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function(GoogleMapApi, $log, GmapUtil, EventsHelper) {\n var name;\n name = 'uiGmapStreetViewPanorama';\n return {\n restrict: 'EMA',\n template: '
',\n replace: true,\n scope: {\n focalcoord: '=',\n radius: '=?',\n events: '=?',\n options: '=?',\n control: '=?',\n povoptions: '=?',\n imagestatus: '='\n },\n link: function(scope, element, attrs) {\n return GoogleMapApi.then((function(_this) {\n return function(maps) {\n var clean, create, didCreateOptionsFromDirective, firstTime, handleSettings, listeners, opts, pano, povOpts, sv;\n pano = void 0;\n sv = void 0;\n didCreateOptionsFromDirective = false;\n listeners = void 0;\n opts = null;\n povOpts = null;\n clean = function() {\n EventsHelper.removeEvents(listeners);\n if (pano != null) {\n pano.unbind('position');\n pano.setVisible(false);\n }\n if (sv != null) {\n if ((sv != null ? sv.setVisible : void 0) != null) {\n sv.setVisible(false);\n }\n return sv = void 0;\n }\n };\n handleSettings = function(perspectivePoint, focalPoint) {\n var heading;\n heading = google.maps.geometry.spherical.computeHeading(perspectivePoint, focalPoint);\n didCreateOptionsFromDirective = true;\n scope.radius = scope.radius || 50;\n povOpts = angular.extend({\n heading: heading,\n zoom: 1,\n pitch: 0\n }, scope.povoptions || {});\n opts = opts = angular.extend({\n navigationControl: false,\n addressControl: false,\n linksControl: false,\n position: perspectivePoint,\n pov: povOpts,\n visible: true\n }, scope.options || {});\n return didCreateOptionsFromDirective = false;\n };\n create = function() {\n var focalPoint;\n if (!scope.focalcoord) {\n $log.error(name + \": focalCoord needs to be defined\");\n return;\n }\n if (!scope.radius) {\n $log.error(name + \": needs a radius to set the camera view from its focal target.\");\n return;\n }\n clean();\n if (sv == null) {\n sv = new google.maps.StreetViewService();\n }\n if (scope.events) {\n listeners = EventsHelper.setEvents(sv, scope, scope);\n }\n focalPoint = GmapUtil.getCoords(scope.focalcoord);\n return sv.getPanoramaByLocation(focalPoint, scope.radius, function(streetViewPanoramaData, status) {\n var ele, perspectivePoint, ref;\n if (scope.imagestatus != null) {\n scope.imagestatus = status;\n }\n if (((ref = scope.events) != null ? ref.image_status_changed : void 0) != null) {\n scope.events.image_status_changed(sv, 'image_status_changed', scope, status);\n }\n if (status === \"OK\") {\n perspectivePoint = streetViewPanoramaData.location.latLng;\n handleSettings(perspectivePoint, focalPoint);\n ele = element[0];\n return pano = new google.maps.StreetViewPanorama(ele, opts);\n }\n });\n };\n if (scope.control != null) {\n scope.control.getOptions = function() {\n return opts;\n };\n scope.control.getPovOptions = function() {\n return povOpts;\n };\n scope.control.getGObject = function() {\n return sv;\n };\n scope.control.getGPano = function() {\n return pano;\n };\n }\n scope.$watch('options', function(newValue, oldValue) {\n if (newValue === oldValue || newValue === opts || didCreateOptionsFromDirective) {\n return;\n }\n return create();\n });\n firstTime = true;\n scope.$watch('focalcoord', function(newValue, oldValue) {\n if (newValue === oldValue && !firstTime) {\n return;\n }\n if (newValue == null) {\n return;\n }\n firstTime = false;\n return create();\n });\n return scope.$on('$destroy', function() {\n return clean();\n });\n };\n })(this));\n }\n };\n }\n ]);\n\n}).call(this);\n"]} \ No newline at end of file diff --git a/dist/angular-google-maps-street-view_dev_mapped.min.js b/dist/angular-google-maps-street-view_dev_mapped.min.js new file mode 100644 index 000000000..a6753fc95 --- /dev/null +++ b/dist/angular-google-maps-street-view_dev_mapped.min.js @@ -0,0 +1,7 @@ +/*! angular-google-maps 2.4.1 2017-01-05 + * AngularJS directives for Google Maps + * git: https://github.com/angular-ui/angular-google-maps.git + */ + +!function(a,b,c,d){"use strict";(function(){b.module("uiGmapgoogle-maps.providers",["nemLogging"]),b.module("uiGmapgoogle-maps.wrapped",[]),b.module("uiGmapgoogle-maps.extensions",["uiGmapgoogle-maps.wrapped","uiGmapgoogle-maps.providers"]),b.module("uiGmapgoogle-maps.directives.api.utils",["uiGmapgoogle-maps.extensions"]),b.module("uiGmapgoogle-maps.directives.api.managers",[]),b.module("uiGmapgoogle-maps.directives.api.options",["uiGmapgoogle-maps.directives.api.utils"]),b.module("uiGmapgoogle-maps.directives.api.options.builders",[]),b.module("uiGmapgoogle-maps.directives.api.models.child",["uiGmapgoogle-maps.directives.api.utils","uiGmapgoogle-maps.directives.api.options","uiGmapgoogle-maps.directives.api.options.builders"]),b.module("uiGmapgoogle-maps.directives.api.models.parent",["uiGmapgoogle-maps.directives.api.managers","uiGmapgoogle-maps.directives.api.models.child","uiGmapgoogle-maps.providers"]),b.module("uiGmapgoogle-maps.directives.api",["uiGmapgoogle-maps.directives.api.models.parent"]),b.module("uiGmapgoogle-maps",["uiGmapgoogle-maps.directives.api","uiGmapgoogle-maps.providers"])}).call(this),b.module("uiGmapgoogle-maps.wrapped").service("uiGmapuuid",function(){function a(){}return a.generate=function(){var b=a._gri,c=a._ha;return c(b(32),8)+"-"+c(b(16),4)+"-"+c(16384|b(12),4)+"-"+c(32768|b(14),4)+"-"+c(b(48),12)},a._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)1&d&&(c=e+c);return c},a}),function(){b.module("uiGmapgoogle-maps.providers").factory("uiGmapMapScriptLoader",["$q","uiGmapuuid",function(d,e){var f,g,h,i,j;return i=void 0,j=void 0,f=function(a){return a.china?"http://maps.google.cn/maps/api/js?":"auto"===a.transport?"//maps.googleapis.com/maps/api/js?":a.transport+"://maps.googleapis.com/maps/api/js?"},g=function(a){var b,d,g,h;return b=["transport","isGoogleMapsForWork","china","preventLoad"],a.isGoogleMapsForWork&&b.push("key"),d=c.map(c.omit(a,b),function(a,b){return b+"="+a}),i&&(h=document.getElementById(i),h.parentNode.removeChild(h)),d=d.join("&"),g=document.createElement("script"),g.id=i="ui_gmap_map_load_"+e.generate(),g.type="text/javascript",g.src=f(a)+d,document.head.appendChild(g)},h=function(){return b.isDefined(a.google)&&b.isDefined(a.google.maps)},{load:function(b){var c,e;return c=d.defer(),h()?(c.resolve(a.google.maps),c.promise):(e=b.callback="onGoogleMapsReady"+Math.round(1e3*Math.random()),a[e]=function(){a[e]=null,c.resolve(a.google.maps)},a.navigator.connection&&a.Connection&&a.navigator.connection.type===a.Connection.NONE&&!b.preventLoad?document.addEventListener("online",function(){if(!h())return g(b)}):b.preventLoad||g(b),j=b,j.randomizedFunctionName=e,c.promise)},manualLoad:function(){var b;return b=j,h()?a[b.randomizedFunctionName]?a[b.randomizedFunctionName]():void 0:g(b)}}}]).provider("uiGmapGoogleMapApi",function(){return this.options={transport:"https",isGoogleMapsForWork:!1,china:!1,v:"3",libraries:"",language:"en",preventLoad:!1},this.configure=function(a){b.extend(this.options,a)},this.$get=["uiGmapMapScriptLoader",function(a){return function(b){return b.load(a.options)}}(this)],this}).service("uiGmapGoogleMapApiManualLoader",["uiGmapMapScriptLoader",function(a){return{load:function(){a.manualLoad()}}}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapLogger",["nemSimpleLogger",function(a){return a.spawn()}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapGmapUtil",["uiGmapLogger","$compile",function(a,d){var e,f,g,h,i,j;return f=function(a,b,c){return a===b||c.indexOf(a)!==-1},e=function(a){return f(a,!1,["false","FALSE",0,"n","N","no","NO"])},h=function(a){return Array.isArray(a)&&2===a.length?a[1]:b.isDefined(a.type)&&"Point"===a.type?a.coordinates[1]:a.latitude},i=function(a){return Array.isArray(a)&&2===a.length?a[0]:b.isDefined(a.type)&&"Point"===a.type?a.coordinates[0]:a.longitude},g=function(a){if(a)return a instanceof google.maps.LatLng?a:Array.isArray(a)&&2===a.length?new google.maps.LatLng(a[1],a[0]):b.isDefined(a.type)&&"Point"===a.type?new google.maps.LatLng(a.coordinates[1],a.coordinates[0]):new google.maps.LatLng(a.latitude,a.longitude)},j=function(a){if(b.isUndefined(a))return!1;if(c.isArray(a)){if(2===a.length)return!0}else if(null!=a&&(null!=a?a.type:void 0)&&"Point"===a.type&&c.isArray(a.coordinates)&&2===a.coordinates.length)return!0;return!(!a||!b.isDefined((null!=a?a.latitude:void 0)&&b.isDefined(null!=a?a.longitude:void 0)))},{setCoordsFromEvent:function(a,c){if(a)return Array.isArray(a)&&2===a.length?(a[1]=c.lat(),a[0]=c.lng()):b.isDefined(a.type)&&"Point"===a.type?(a.coordinates[1]=c.lat(),a.coordinates[0]=c.lng()):(a.latitude=c.lat(),a.longitude=c.lng()),a},getLabelPositionPoint:function(a){var b,c;if(void 0!==a)return a=/^([-\d\.]+)\s([-\d\.]+)$/.exec(a),b=parseFloat(a[1]),c=parseFloat(a[2]),null!=b&&null!=c?new google.maps.Point(b,c):void 0},createWindowOptions:function(c,e,f,h){var i;return null!=f&&null!=h&&null!=d?(i=b.extend({},h,{content:this.buildContent(e,h,f),position:null!=h.position?h.position:b.isObject(c)?c.getPosition():g(e.coords)}),null!=c&&null==(null!=i?i.pixelOffset:void 0)&&(null==i.boxClass||(i.pixelOffset={height:0,width:-2})),i):h?h:(a.error("infoWindow defaults not defined"),f?void 0:a.error("infoWindow content not defined"))},buildContent:function(a,b,c){var e,f;return null!=b.content?f=b.content:null!=d?(c=c.replace(/^\s+|\s+$/g,""),e=""===c?"":d(c)(a),e.length>0&&(f=e[0])):f=c,f},defaultDelay:50,isTrue:function(a){return f(a,!0,["true","TRUE",1,"y","Y","yes","YES"])},isFalse:e,isFalsy:function(a){return f(a,!1,[void 0,null])||e(a)},getCoords:g,validateCoords:j,equalCoords:function(a,b){return h(a)===h(b)&&i(a)===i(b)},validatePath:function(a){var d,e,f,g;if(e=0,b.isUndefined(a.type)){if(!Array.isArray(a)||a.length<2)return!1;for(;ethis.max)return this.max=a[0].length,this.index=b},g),f=a.coordinates[g.index],d=f[0],d.length<4)return!1}else{if("LineString"!==a.type)return!1;if(a.coordinates.length<2)return!1;d=a.coordinates}for(;ethis.max)return this.max=a[0].length,this.index=b},h),d=a.coordinates[h.index][0]):"LineString"===a.type&&(d=a.coordinates);e',replace:!0,scope:{focalcoord:"=",radius:"=?",events:"=?",options:"=?",control:"=?",povoptions:"=?",imagestatus:"="},link:function(g,h,i){return a.then(function(a){return function(a){var i,j,k,l,m,n,o,p,q,r;return p=void 0,r=void 0,k=!1,n=void 0,o=null,q=null,i=function(){if(e.removeEvents(n),null!=p&&(p.unbind("position"),p.setVisible(!1)),null!=r)return null!=(null!=r?r.setVisible:void 0)&&r.setVisible(!1),r=void 0},m=function(a,c){var d;return d=google.maps.geometry.spherical.computeHeading(a,c),k=!0,g.radius=g.radius||50,q=b.extend({heading:d,zoom:1,pitch:0},g.povoptions||{}),o=o=b.extend({navigationControl:!1,addressControl:!1,linksControl:!1,position:a,pov:q,visible:!0},g.options||{}),k=!1},j=function(){var a;return g.focalcoord?g.radius?(i(),null==r&&(r=new google.maps.StreetViewService),g.events&&(n=e.setEvents(r,g,g)),a=d.getCoords(g.focalcoord),r.getPanoramaByLocation(a,g.radius,function(b,c){var d,e,f;if(null!=g.imagestatus&&(g.imagestatus=c),null!=(null!=(f=g.events)?f.image_status_changed:void 0)&&g.events.image_status_changed(r,"image_status_changed",g,c),"OK"===c)return e=b.location.latLng,m(e,a),d=h[0],p=new google.maps.StreetViewPanorama(d,o)})):void c.error(f+": needs a radius to set the camera view from its focal target."):void c.error(f+": focalCoord needs to be defined")},null!=g.control&&(g.control.getOptions=function(){return o},g.control.getPovOptions=function(){return q},g.control.getGObject=function(){return r},g.control.getGPano=function(){return p}),g.$watch("options",function(a,b){if(a!==b&&a!==o&&!k)return j()}),l=!0,g.$watch("focalcoord",function(a,b){if((a!==b||l)&&null!=a)return l=!1,j()}),g.$on("$destroy",function(){return i()})}}(this))}}}])}.call(this)}(window,angular,_); +//# sourceMappingURL=angular-google-maps-street-view_dev_mapped.min.js.map \ No newline at end of file diff --git a/dist/angular-google-maps-street-view_dev_mapped.min.js.map b/dist/angular-google-maps-street-view_dev_mapped.min.js.map new file mode 100644 index 000000000..db17f2fcd --- /dev/null +++ b/dist/angular-google-maps-street-view_dev_mapped.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["angular-google-maps-street-view_dev_mapped.js"],"names":["window","angular","_","undefined","module","call","this","service","UUID","generate","a","_gri","b","_ha","NaN","Math","random","c","toString","d","length","e","factory","$q","uuid","getScriptUrl","includeScript","isGoogleMapsLoaded","scriptId","usedConfiguration","options","china","transport","omitOptions","query","script","scriptElem","isGoogleMapsForWork","push","map","omit","v","k","document","getElementById","parentNode","removeChild","join","createElement","id","type","src","head","appendChild","isDefined","google","maps","load","deferred","randomizedFunctionName","defer","resolve","promise","callback","round","navigator","connection","Connection","NONE","preventLoad","addEventListener","manualLoad","config","provider","libraries","language","configure","extend","$get","_this","loader","nemSimpleLogger","spawn","Logger","$compile","_isFalse","_isTruthy","getCoords","getLatitude","getLongitude","validateCoords","value","bool","optionsArray","indexOf","Array","isArray","coordinates","latitude","longitude","LatLng","coords","isUndefined","setCoordsFromEvent","prevValue","newLatLon","lat","lng","getLabelPositionPoint","anchor","xPos","yPos","exec","parseFloat","Point","createWindowOptions","gMarker","scope","content","defaults","buildContent","position","isObject","getPosition","pixelOffset","boxClass","height","width","error","parsed","ret","replace","defaultDelay","isTrue","isFalse","isFalsy","equalCoords","coord1","coord2","validatePath","path","array","i","polygon","trackMaxVertices","max","index","forEach","convertPathPoints","latlng","result","MVCArray","getPath","object","key","obj","isString","each","split","validateBoundPoints","bounds","sw","ne","convertBoundPoints","LatLngBounds","fitMapBounds","fitBounds","$log","_getEventsObj","_hasEvents","events","model","setEvents","gObject","ignores","eventObj","compact","eventHandler","eventName","doIgnore","includes","hasOwnProperty","isFunction","event","addListener","$evalAsync","apply","arguments","removeEvents","listeners","l","removeListener","directive","GoogleMapApi","GmapUtil","EventsHelper","name","restrict","template","focalcoord","radius","control","povoptions","imagestatus","link","element","attrs","then","clean","create","didCreateOptionsFromDirective","firstTime","handleSettings","opts","pano","povOpts","sv","unbind","setVisible","perspectivePoint","focalPoint","heading","geometry","spherical","computeHeading","zoom","pitch","navigationControl","addressControl","linksControl","pov","visible","StreetViewService","getPanoramaByLocation","streetViewPanoramaData","status","ele","ref","image_status_changed","location","latLng","StreetViewPanorama","getOptions","getPovOptions","getGObject","getGPano","$watch","newValue","oldValue","$on"],"mappings":"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","file":"angular-google-maps-street-view_dev_mapped.min.js"} \ No newline at end of file diff --git a/dist/angular-google-maps.js b/dist/angular-google-maps.js new file mode 100644 index 000000000..01c249a50 --- /dev/null +++ b/dist/angular-google-maps.js @@ -0,0 +1,14176 @@ +/*! angular-google-maps 2.4.1 2017-01-05 + * AngularJS directives for Google Maps + * git: https://github.com/angular-ui/angular-google-maps.git + */ +; +(function( window, angular, _, undefined ){ + 'use strict'; +/* +! +The MIT License + +Copyright (c) 2010-2013 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the 'Software'), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +angular-google-maps +https://github.com/angular-ui/angular-google-maps + +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module('uiGmapgoogle-maps.providers', ['nemLogging']); + + angular.module('uiGmapgoogle-maps.wrapped', []); + + angular.module('uiGmapgoogle-maps.extensions', ['uiGmapgoogle-maps.wrapped', 'uiGmapgoogle-maps.providers']); + + angular.module('uiGmapgoogle-maps.directives.api.utils', ['uiGmapgoogle-maps.extensions']); + + angular.module('uiGmapgoogle-maps.directives.api.managers', []); + + angular.module('uiGmapgoogle-maps.directives.api.options', ['uiGmapgoogle-maps.directives.api.utils']); + + angular.module('uiGmapgoogle-maps.directives.api.options.builders', []); + + angular.module('uiGmapgoogle-maps.directives.api.models.child', ['uiGmapgoogle-maps.directives.api.utils', 'uiGmapgoogle-maps.directives.api.options', 'uiGmapgoogle-maps.directives.api.options.builders']); + + angular.module('uiGmapgoogle-maps.directives.api.models.parent', ['uiGmapgoogle-maps.directives.api.managers', 'uiGmapgoogle-maps.directives.api.models.child', 'uiGmapgoogle-maps.providers']); + + angular.module('uiGmapgoogle-maps.directives.api', ['uiGmapgoogle-maps.directives.api.models.parent']); + + angular.module('uiGmapgoogle-maps', ['uiGmapgoogle-maps.directives.api', 'uiGmapgoogle-maps.providers']); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.providers').factory('uiGmapMapScriptLoader', [ + '$q', 'uiGmapuuid', function($q, uuid) { + var getScriptUrl, includeScript, isGoogleMapsLoaded, scriptId, usedConfiguration; + scriptId = void 0; + usedConfiguration = void 0; + getScriptUrl = function(options) { + if (options.china) { + return 'http://maps.google.cn/maps/api/js?'; + } else { + if (options.transport === 'auto') { + return '//maps.googleapis.com/maps/api/js?'; + } else { + return options.transport + '://maps.googleapis.com/maps/api/js?'; + } + } + }; + includeScript = function(options) { + var omitOptions, query, script, scriptElem; + omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad']; + if (options.isGoogleMapsForWork) { + omitOptions.push('key'); + } + query = _.map(_.omit(options, omitOptions), function(v, k) { + return k + '=' + v; + }); + if (scriptId) { + scriptElem = document.getElementById(scriptId); + scriptElem.parentNode.removeChild(scriptElem); + } + query = query.join('&'); + script = document.createElement('script'); + script.id = scriptId = "ui_gmap_map_load_" + (uuid.generate()); + script.type = 'text/javascript'; + script.src = getScriptUrl(options) + query; + return document.head.appendChild(script); + }; + isGoogleMapsLoaded = function() { + return angular.isDefined(window.google) && angular.isDefined(window.google.maps); + }; + return { + load: function(options) { + var deferred, randomizedFunctionName; + deferred = $q.defer(); + if (isGoogleMapsLoaded()) { + deferred.resolve(window.google.maps); + return deferred.promise; + } + randomizedFunctionName = options.callback = 'onGoogleMapsReady' + Math.round(Math.random() * 1000); + window[randomizedFunctionName] = function() { + window[randomizedFunctionName] = null; + deferred.resolve(window.google.maps); + }; + if (window.navigator.connection && window.Connection && window.navigator.connection.type === window.Connection.NONE && !options.preventLoad) { + document.addEventListener('online', function() { + if (!isGoogleMapsLoaded()) { + return includeScript(options); + } + }); + } else if (!options.preventLoad) { + includeScript(options); + } + usedConfiguration = options; + usedConfiguration.randomizedFunctionName = randomizedFunctionName; + return deferred.promise; + }, + manualLoad: function() { + var config; + config = usedConfiguration; + if (!isGoogleMapsLoaded()) { + return includeScript(config); + } else { + if (window[config.randomizedFunctionName]) { + return window[config.randomizedFunctionName](); + } + } + } + }; + } + ]).provider('uiGmapGoogleMapApi', function() { + this.options = { + transport: 'https', + isGoogleMapsForWork: false, + china: false, + v: '3', + libraries: '', + language: 'en', + preventLoad: false + }; + this.configure = function(options) { + angular.extend(this.options, options); + }; + this.$get = [ + 'uiGmapMapScriptLoader', (function(_this) { + return function(loader) { + return loader.load(_this.options); + }; + })(this) + ]; + return this; + }).service('uiGmapGoogleMapApiManualLoader', [ + 'uiGmapMapScriptLoader', function(loader) { + return { + load: function() { + loader.manualLoad(); + } + }; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.extensions').service('uiGmapExtendGWin', function() { + return { + init: _.once(function() { + var uiGmapInfoBox; + if (!(google || (typeof google !== "undefined" && google !== null ? google.maps : void 0) || (google.maps.InfoWindow != null))) { + return; + } + google.maps.InfoWindow.prototype._open = google.maps.InfoWindow.prototype.open; + google.maps.InfoWindow.prototype._close = google.maps.InfoWindow.prototype.close; + google.maps.InfoWindow.prototype._isOpen = false; + google.maps.InfoWindow.prototype.open = function(map, anchor, recurse) { + if (recurse != null) { + return; + } + this._isOpen = true; + this._open(map, anchor, true); + }; + google.maps.InfoWindow.prototype.close = function(recurse) { + if (recurse != null) { + return; + } + this._isOpen = false; + this._close(true); + }; + google.maps.InfoWindow.prototype.isOpen = function(val) { + if (val == null) { + val = void 0; + } + if (val == null) { + return this._isOpen; + } else { + return this._isOpen = val; + } + }; + + /* + Do the same for InfoBox + TODO: Clean this up so the logic is defined once, wait until develop becomes master as this will be easier + */ + if (window.InfoBox) { + window.InfoBox.prototype._open = window.InfoBox.prototype.open; + window.InfoBox.prototype._close = window.InfoBox.prototype.close; + window.InfoBox.prototype._isOpen = false; + window.InfoBox.prototype.open = function(map, anchor) { + this._isOpen = true; + this._open(map, anchor); + }; + window.InfoBox.prototype.close = function() { + this._isOpen = false; + this._close(); + }; + window.InfoBox.prototype.isOpen = function(val) { + if (val == null) { + val = void 0; + } + if (val == null) { + return this._isOpen; + } else { + return this._isOpen = val; + } + }; + uiGmapInfoBox = (function(superClass) { + extend(uiGmapInfoBox, superClass); + + function uiGmapInfoBox(opts) { + this.getOrigCloseBoxImg_ = bind(this.getOrigCloseBoxImg_, this); + this.getCloseBoxDiv_ = bind(this.getCloseBoxDiv_, this); + var box; + box = new window.InfoBox(opts); + _.extend(this, box); + if (opts.closeBoxDiv != null) { + this.closeBoxDiv_ = opts.closeBoxDiv; + } + } + + uiGmapInfoBox.prototype.getCloseBoxDiv_ = function() { + return this.closeBoxDiv_; + }; + + uiGmapInfoBox.prototype.getCloseBoxImg_ = function() { + var div, img; + div = this.getCloseBoxDiv_(); + img = this.getOrigCloseBoxImg_(); + return div || img; + }; + + uiGmapInfoBox.prototype.getOrigCloseBoxImg_ = function() { + var img; + img = ""; + if (this.closeBoxURL_ !== "") { + img = " 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + get = function(object, path, defaultValue) { + var result; + result = object === null ? void 0 : baseGet(object, toPath(path), path + ''); + if (result === void 0) { + return defaultValue; + } else { + return result; + } + }; + _.get = get; + } + + /* + Author Nick McCready + Intersection of Objects if the arrays have something in common each intersecting object will be returned + in an new array. + */ + this.intersectionObjects = function(array1, array2, comparison) { + var res; + if (comparison == null) { + comparison = void 0; + } + res = _.map(array1, function(obj1) { + return _.find(array2, function(obj2) { + if (comparison != null) { + return comparison(obj1, obj2); + } else { + return _.isEqual(obj1, obj2); + } + }); + }); + return _.filter(res, function(o) { + return o != null; + }); + }; + this.containsObject = _.includeObject = function(obj, target, comparison) { + if (comparison == null) { + comparison = void 0; + } + if (obj === null) { + return false; + } + return _.some(obj, function(value) { + if (comparison != null) { + return comparison(value, target); + } else { + return _.isEqual(value, target); + } + }); + }; + this.differenceObjects = function(array1, array2, comparison) { + if (comparison == null) { + comparison = void 0; + } + return _.filter(array1, (function(_this) { + return function(value) { + return !_this.containsObject(array2, value, comparison); + }; + })(this)); + }; + this.withoutObjects = this.differenceObjects; + this.indexOfObject = function(array, item, comparison, isSorted) { + var i, length; + if (array == null) { + return -1; + } + i = 0; + length = array.length; + if (isSorted) { + if (typeof isSorted === "number") { + i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); + } else { + i = _.sortedIndex(array, item); + return (array[i] === item ? i : -1); + } + } + while (i < length) { + if (comparison != null) { + if (comparison(array[i], item)) { + return i; + } + } else { + if (_.isEqual(array[i], item)) { + return i; + } + } + i++; + } + return -1; + }; + this.isNullOrUndefined = function(thing) { + return _.isNull(thing || _.isUndefined(thing)); + }; + return this; + }); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.extensions').factory('uiGmapString', function() { + return function(str) { + this.contains = function(value, fromIndex) { + return str.indexOf(value, fromIndex) !== -1; + }; + return this; + }; + }); + +}).call(this); +; +/*global _:true,angular:true, */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmap_sync', [ + function() { + return { + fakePromise: function() { + var _cb; + _cb = void 0; + return { + then: function(cb) { + return _cb = cb; + }, + resolve: function() { + return _cb.apply(void 0, arguments); + } + }; + } + }; + } + ]).service('uiGmap_async', [ + '$timeout', 'uiGmapPromise', 'uiGmapLogger', '$q', 'uiGmapDataStructures', 'uiGmapGmapUtil', function($timeout, uiGmapPromise, $log, $q, uiGmapDataStructures, uiGmapGmapUtil) { + var ExposedPromise, PromiseQueueManager, SniffedPromise, _getIterateeValue, _ignoreFields, defaultChunkSize, doChunk, doSkippPromise, each, errorObject, getArrayAndKeys, isInProgress, kickPromise, logTryCatch, managePromiseQueue, map, maybeCancelPromises, promiseStatus, promiseTypes, tryCatch; + promiseTypes = uiGmapPromise.promiseTypes; + isInProgress = uiGmapPromise.isInProgress; + promiseStatus = uiGmapPromise.promiseStatus; + ExposedPromise = uiGmapPromise.ExposedPromise; + SniffedPromise = uiGmapPromise.SniffedPromise; + kickPromise = function(sniffedPromise, cancelCb) { + var promise; + promise = sniffedPromise.promise(); + promise.promiseType = sniffedPromise.promiseType; + if (promise.$$state) { + $log.debug("promiseType: " + promise.promiseType + ", state: " + (promiseStatus(promise.$$state.status))); + } + promise.cancelCb = cancelCb; + return promise; + }; + doSkippPromise = function(sniffedPromise, lastPromise) { + if (sniffedPromise.promiseType === promiseTypes.create && lastPromise.promiseType !== promiseTypes["delete"] && lastPromise.promiseType !== promiseTypes.init) { + $log.debug("lastPromise.promiseType " + lastPromise.promiseType + ", newPromiseType: " + sniffedPromise.promiseType + ", SKIPPED MUST COME AFTER DELETE ONLY"); + return true; + } + return false; + }; + maybeCancelPromises = function(queue, sniffedPromise, lastPromise) { + var first; + if (sniffedPromise.promiseType === promiseTypes["delete"] && lastPromise.promiseType !== promiseTypes["delete"]) { + if ((lastPromise.cancelCb != null) && _.isFunction(lastPromise.cancelCb) && isInProgress(lastPromise)) { + $log.debug("promiseType: " + sniffedPromise.promiseType + ", CANCELING LAST PROMISE type: " + lastPromise.promiseType); + lastPromise.cancelCb('cancel safe'); + first = queue.peek(); + if ((first != null) && isInProgress(first)) { + if (first.hasOwnProperty("cancelCb") && _.isFunction(first.cancelCb)) { + $log.debug("promiseType: " + first.promiseType + ", CANCELING FIRST PROMISE type: " + first.promiseType); + return first.cancelCb('cancel safe'); + } else { + return $log.warn('first promise was not cancelable'); + } + } + } + } + }; + + /* + From a High Level: + This is a SniffedPromiseQueueManager (looking to rename) where the queue is existingPiecesObj.existingPieces. + This is a function and should not be considered a class. + So it is run to manage the state (cancel, skip, link) as needed. + Purpose: + The whole point is to check if there is existing async work going on. If so we wait on it. + + arguments: + - existingPiecesObj = Queue + - sniffedPromise = object wrapper holding a function to a pending (function) promise (promise: fnPromise) + with its intended type. + - cancelCb = callback which accepts a string, this string is intended to be returned at the end of _async.each iterator + + Where the cancelCb passed msg is 'cancel safe' _async.each will drop out and fall through. Thus canceling the promise + gracefully without messing up state. + + Synopsis: + + - Promises have been broken down to 4 states create, update,delete (3 main) and init. (Helps boil down problems in ordering) + where (init) is special to indicate that it is one of the first or to allow a create promise to work beyond being after a delete + + - Every Promise that comes in is enqueued and linked to the last promise in the queue. + + - A promise can be skipped or canceled to save cycles. + + Saved Cycles: + - Skipped - This will only happen if async work comes in out of order. Where a pending create promise (un-executed) comes in + after a delete promise. + - Canceled - Where an incoming promise (un-executed promise) is of type delete and the any lastPromise is not a delete type. + + + NOTE: + - You should not muck with existingPieces as its state is dependent on this functional loop. + - PromiseQueueManager should not be thought of as a class that has a life expectancy (it has none). It's sole + purpose is to link, skip, and kill promises. It also manages the promise queue existingPieces. + */ + PromiseQueueManager = function(existingPiecesObj, sniffedPromise, cancelCb) { + var lastPromise, newPromise; + if (!existingPiecesObj.existingPieces) { + existingPiecesObj.existingPieces = new uiGmapDataStructures.Queue(); + return existingPiecesObj.existingPieces.enqueue(kickPromise(sniffedPromise, cancelCb)); + } else { + lastPromise = _.last(existingPiecesObj.existingPieces._content); + if (doSkippPromise(sniffedPromise, lastPromise)) { + return; + } + maybeCancelPromises(existingPiecesObj.existingPieces, sniffedPromise, lastPromise); + newPromise = ExposedPromise(lastPromise["finally"](function() { + return kickPromise(sniffedPromise, cancelCb); + })); + newPromise.cancelCb = cancelCb; + newPromise.promiseType = sniffedPromise.promiseType; + existingPiecesObj.existingPieces.enqueue(newPromise); + return lastPromise["finally"](function() { + return existingPiecesObj.existingPieces.dequeue(); + }); + } + }; + managePromiseQueue = function(objectToLock, promiseType, msg, cancelCb, fnPromise) { + var cancelLogger; + if (msg == null) { + msg = ''; + } + cancelLogger = function(msg) { + $log.debug(msg + ": " + msg); + if ((cancelCb != null) && _.isFunction(cancelCb)) { + return cancelCb(msg); + } + }; + return PromiseQueueManager(objectToLock, SniffedPromise(fnPromise, promiseType), cancelLogger); + }; + defaultChunkSize = 80; + errorObject = { + value: null + }; + tryCatch = function(fn, ctx, args) { + var e, error1; + try { + return fn.apply(ctx, args); + } catch (error1) { + e = error1; + errorObject.value = e; + return errorObject; + } + }; + logTryCatch = function(fn, ctx, deferred, args) { + var msg, result; + result = tryCatch(fn, ctx, args); + if (result === errorObject) { + msg = "error within chunking iterator: " + errorObject.value; + $log.error(msg); + deferred.reject(msg); + } + if (result === 'cancel safe') { + return false; + } + return true; + }; + _getIterateeValue = function(collection, array, index) { + var _isArray, valOrKey; + _isArray = collection === array; + valOrKey = array[index]; + if (_isArray) { + return valOrKey; + } + return collection[valOrKey]; + }; + _ignoreFields = ['length', 'forEach', 'map']; + getArrayAndKeys = function(collection, keys, bailOutCb, cb) { + var array, propName, val; + if (angular.isArray(collection)) { + array = collection; + } else { + if (keys) { + array = keys; + } else { + array = []; + for (propName in collection) { + val = collection[propName]; + if (collection.hasOwnProperty(propName) && !_.includes(_ignoreFields, propName)) { + array.push(propName); + } + } + } + } + if (cb == null) { + cb = bailOutCb; + } + if (angular.isArray(array) && !(array != null ? array.length : void 0)) { + if (cb !== bailOutCb) { + return bailOutCb(); + } + } + return cb(array, keys); + }; + + /* + Author: Nicholas McCready & jfriend00 + _async handles things asynchronous-like :), to allow the UI to be free'd to do other things + Code taken from http://stackoverflow.com/questions/10344498/best-way-to-iterate-over-an-array-without-blocking-the-ui + + The design of any functionality of _async is to be like lodash/underscore and replicate it but call things + asynchronously underneath. Each should be sufficient for most things to be derived from. + + Optional Asynchronous Chunking via promises. + */ + doChunk = function(collection, chunkSizeOrDontChunk, pauseMilli, chunkCb, pauseCb, overallD, index, _keys) { + return getArrayAndKeys(collection, _keys, function(array, keys) { + var cnt, i, keepGoing, val; + if (chunkSizeOrDontChunk && chunkSizeOrDontChunk < array.length) { + cnt = chunkSizeOrDontChunk; + } else { + cnt = array.length; + } + i = index; + keepGoing = true; + while (keepGoing && cnt-- && i < (array ? array.length : i + 1)) { + val = _getIterateeValue(collection, array, i); + keepGoing = angular.isFunction(val) ? true : logTryCatch(chunkCb, void 0, overallD, [val, i]); + ++i; + } + if (array) { + if (keepGoing && i < array.length) { + index = i; + if (chunkSizeOrDontChunk) { + if ((pauseCb != null) && _.isFunction(pauseCb)) { + logTryCatch(pauseCb, void 0, overallD, []); + } + return $timeout(function() { + return doChunk(collection, chunkSizeOrDontChunk, pauseMilli, chunkCb, pauseCb, overallD, index, keys); + }, pauseMilli, false); + } + } else { + return overallD.resolve(); + } + } + }); + }; + each = function(collection, chunk, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, _keys) { + var error, overallD, ret; + if (chunkSizeOrDontChunk == null) { + chunkSizeOrDontChunk = defaultChunkSize; + } + if (index == null) { + index = 0; + } + if (pauseMilli == null) { + pauseMilli = 1; + } + ret = void 0; + overallD = uiGmapPromise.defer(); + ret = overallD.promise; + if (!pauseMilli) { + error = 'pause (delay) must be set from _async!'; + $log.error(error); + overallD.reject(error); + return ret; + } + return getArrayAndKeys(collection, _keys, function() { + overallD.resolve(); + return ret; + }, function(array, keys) { + doChunk(collection, chunkSizeOrDontChunk, pauseMilli, chunk, pauseCb, overallD, index, keys); + return ret; + }); + }; + map = function(collection, iterator, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, _keys) { + var results; + results = []; + return getArrayAndKeys(collection, _keys, function() { + return uiGmapPromise.resolve(results); + }, function(array, keys) { + return each(collection, function(o) { + return results.push(iterator(o)); + }, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, keys).then(function() { + return results; + }); + }); + }; + return { + each: each, + map: map, + managePromiseQueue: managePromiseQueue, + promiseLock: managePromiseQueue, + defaultChunkSize: defaultChunkSize, + getArrayAndKeys: getArrayAndKeys, + chunkSizeFrom: function(fromSize, ret) { + if (ret == null) { + ret = void 0; + } + if (_.isNumber(fromSize)) { + ret = fromSize; + } + if (uiGmapGmapUtil.isFalse(fromSize) || fromSize === false) { + ret = false; + } + return ret; + } + }; + } + ]); + +}).call(this); +;(function() { + var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapBaseObject', function() { + var BaseObject, baseObjectKeywords; + baseObjectKeywords = ['extended', 'included']; + BaseObject = (function() { + function BaseObject() {} + + BaseObject.extend = function(obj) { + var key, ref, value; + for (key in obj) { + value = obj[key]; + if (indexOf.call(baseObjectKeywords, key) < 0) { + this[key] = value; + } + } + if ((ref = obj.extended) != null) { + ref.apply(this); + } + return this; + }; + + BaseObject.include = function(obj) { + var key, ref, value; + for (key in obj) { + value = obj[key]; + if (indexOf.call(baseObjectKeywords, key) < 0) { + this.prototype[key] = value; + } + } + if ((ref = obj.included) != null) { + ref.apply(this); + } + return this; + }; + + return BaseObject; + + })(); + return BaseObject; + }); + +}).call(this); +; +/* + Useful function callbacks that should be defined at later time. + Mainly to be used for specs to verify creation / linking. + + This is to lead a common design in notifying child stuff. + */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapChildEvents', function() { + return { + onChildCreation: function(child) {} + }; + }); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapCtrlHandle', [ + '$q', function($q) { + var CtrlHandle; + return CtrlHandle = { + handle: function($scope, $element) { + $scope.$on('$destroy', function() { + return CtrlHandle.handle($scope); + }); + $scope.deferred = $q.defer(); + return { + getScope: function() { + return $scope; + } + }; + }, + mapPromise: function(scope, ctrl) { + var mapScope; + mapScope = ctrl.getScope(); + mapScope.deferred.promise.then(function(map) { + return scope.map = map; + }); + return mapScope.deferred.promise; + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapEventsHelper", [ + "uiGmapLogger", function($log) { + var _getEventsObj, _hasEvents; + _hasEvents = function(obj) { + return angular.isDefined(obj.events) && (obj.events != null) && angular.isObject(obj.events); + }; + _getEventsObj = function(scope, model) { + if (_hasEvents(scope)) { + return scope; + } + if (_hasEvents(model)) { + return model; + } + }; + return { + setEvents: function(gObject, scope, model, ignores) { + var eventObj; + eventObj = _getEventsObj(scope, model); + if (eventObj != null) { + return _.compact(_.map(eventObj.events, function(eventHandler, eventName) { + var doIgnore; + if (ignores) { + doIgnore = _(ignores).includes(eventName); + } + if (eventObj.events.hasOwnProperty(eventName) && angular.isFunction(eventObj.events[eventName]) && !doIgnore) { + return google.maps.event.addListener(gObject, eventName, function() { + if (!scope.$evalAsync) { + scope.$evalAsync = function() {}; + } + return scope.$evalAsync(eventHandler.apply(scope, [gObject, eventName, model, arguments])); + }); + } + })); + } + }, + removeEvents: function(listeners) { + var key, l; + if (!listeners) { + return; + } + for (key in listeners) { + l = listeners[key]; + if (l && listeners.hasOwnProperty(key)) { + google.maps.event.removeListener(l); + } + } + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapFitHelper', [ + 'uiGmapLogger', '$timeout', function($log, $timeout) { + return { + fit: function(markersOrPoints, gMap) { + var bounds, everSet, key, markerOrPoint, point; + if (gMap && (markersOrPoints != null ? markersOrPoints.length : void 0)) { + bounds = new google.maps.LatLngBounds(); + everSet = false; + for (key in markersOrPoints) { + markerOrPoint = markersOrPoints[key]; + if (markerOrPoint) { + if (!everSet) { + everSet = true; + } + point = _.isFunction(markerOrPoint.getPosition) ? markerOrPoint.getPosition() : markerOrPoint; + } + bounds.extend(point); + } + if (everSet) { + return $timeout(function() { + return gMap.fitBounds(bounds); + }); + } + } + } + }; + } + ]); + +}).call(this); +; +/*global _:true, angular:true, google:true */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapGmapUtil', [ + 'uiGmapLogger', '$compile', function(Logger, $compile) { + var _isFalse, _isTruthy, getCoords, getLatitude, getLongitude, validateCoords; + _isTruthy = function(value, bool, optionsArray) { + return value === bool || optionsArray.indexOf(value) !== -1; + }; + _isFalse = function(value) { + return _isTruthy(value, false, ['false', 'FALSE', 0, 'n', 'N', 'no', 'NO']); + }; + getLatitude = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[1]; + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return value.coordinates[1]; + } else { + return value.latitude; + } + }; + getLongitude = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[0]; + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return value.coordinates[0]; + } else { + return value.longitude; + } + }; + getCoords = function(value) { + if (!value) { + return; + } + if (value instanceof google.maps.LatLng) { + return value; + } else if (Array.isArray(value) && value.length === 2) { + return new google.maps.LatLng(value[1], value[0]); + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return new google.maps.LatLng(value.coordinates[1], value.coordinates[0]); + } else { + return new google.maps.LatLng(value.latitude, value.longitude); + } + }; + validateCoords = function(coords) { + if (angular.isUndefined(coords)) { + return false; + } + if (_.isArray(coords)) { + if (coords.length === 2) { + return true; + } + } else if ((coords != null) && (coords != null ? coords.type : void 0)) { + if (coords.type === 'Point' && _.isArray(coords.coordinates) && coords.coordinates.length === 2) { + return true; + } + } + if (coords && angular.isDefined((coords != null ? coords.latitude : void 0) && angular.isDefined(coords != null ? coords.longitude : void 0))) { + return true; + } + return false; + }; + return { + setCoordsFromEvent: function(prevValue, newLatLon) { + if (!prevValue) { + return; + } + if (Array.isArray(prevValue) && prevValue.length === 2) { + prevValue[1] = newLatLon.lat(); + prevValue[0] = newLatLon.lng(); + } else if (angular.isDefined(prevValue.type) && prevValue.type === 'Point') { + prevValue.coordinates[1] = newLatLon.lat(); + prevValue.coordinates[0] = newLatLon.lng(); + } else { + prevValue.latitude = newLatLon.lat(); + prevValue.longitude = newLatLon.lng(); + } + return prevValue; + }, + getLabelPositionPoint: function(anchor) { + var xPos, yPos; + if (anchor === void 0) { + return void 0; + } + anchor = /^([-\d\.]+)\s([-\d\.]+)$/.exec(anchor); + xPos = parseFloat(anchor[1]); + yPos = parseFloat(anchor[2]); + if ((xPos != null) && (yPos != null)) { + return new google.maps.Point(xPos, yPos); + } + }, + createWindowOptions: function(gMarker, scope, content, defaults) { + var options; + if ((content != null) && (defaults != null) && ($compile != null)) { + options = angular.extend({}, defaults, { + content: this.buildContent(scope, defaults, content), + position: defaults.position != null ? defaults.position : angular.isObject(gMarker) ? gMarker.getPosition() : getCoords(scope.coords) + }); + if ((gMarker != null) && ((options != null ? options.pixelOffset : void 0) == null)) { + if (options.boxClass == null) { + + } else { + options.pixelOffset = { + height: 0, + width: -2 + }; + } + } + return options; + } else { + if (!defaults) { + Logger.error('infoWindow defaults not defined'); + if (!content) { + return Logger.error('infoWindow content not defined'); + } + } else { + return defaults; + } + } + }, + buildContent: function(scope, defaults, content) { + var parsed, ret; + if (defaults.content != null) { + ret = defaults.content; + } else { + if ($compile != null) { + content = content.replace(/^\s+|\s+$/g, ''); + parsed = content === '' ? '' : $compile(content)(scope); + if (parsed.length > 0) { + ret = parsed[0]; + } + } else { + ret = content; + } + } + return ret; + }, + defaultDelay: 50, + isTrue: function(value) { + return _isTruthy(value, true, ['true', 'TRUE', 1, 'y', 'Y', 'yes', 'YES']); + }, + isFalse: _isFalse, + isFalsy: function(value) { + return _isTruthy(value, false, [void 0, null]) || _isFalse(value); + }, + getCoords: getCoords, + validateCoords: validateCoords, + equalCoords: function(coord1, coord2) { + return getLatitude(coord1) === getLatitude(coord2) && getLongitude(coord1) === getLongitude(coord2); + }, + validatePath: function(path) { + var array, i, polygon, trackMaxVertices; + i = 0; + if (angular.isUndefined(path.type)) { + if (!Array.isArray(path) || path.length < 2) { + return false; + } + while (i < path.length) { + if (!((angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) || (typeof path[i].lat === 'function' && typeof path[i].lng === 'function'))) { + return false; + } + i++; + } + return true; + } else { + if (angular.isUndefined(path.coordinates)) { + return false; + } + if (path.type === 'Polygon') { + if (path.coordinates[0].length < 4) { + return false; + } + array = path.coordinates[0]; + } else if (path.type === 'MultiPolygon') { + trackMaxVertices = { + max: 0, + index: 0 + }; + _.forEach(path.coordinates, function(polygon, index) { + if (polygon[0].length > this.max) { + this.max = polygon[0].length; + return this.index = index; + } + }, trackMaxVertices); + polygon = path.coordinates[trackMaxVertices.index]; + array = polygon[0]; + if (array.length < 4) { + return false; + } + } else if (path.type === 'LineString') { + if (path.coordinates.length < 2) { + return false; + } + array = path.coordinates; + } else { + return false; + } + while (i < array.length) { + if (array[i].length !== 2) { + return false; + } + i++; + } + return true; + } + }, + convertPathPoints: function(path) { + var array, i, latlng, result, trackMaxVertices; + i = 0; + result = new google.maps.MVCArray(); + if (angular.isUndefined(path.type)) { + while (i < path.length) { + latlng; + if (angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) { + latlng = new google.maps.LatLng(path[i].latitude, path[i].longitude); + } else if (typeof path[i].lat === 'function' && typeof path[i].lng === 'function') { + latlng = path[i]; + } + result.push(latlng); + i++; + } + } else { + array; + if (path.type === 'Polygon') { + array = path.coordinates[0]; + } else if (path.type === 'MultiPolygon') { + trackMaxVertices = { + max: 0, + index: 0 + }; + _.forEach(path.coordinates, function(polygon, index) { + if (polygon[0].length > this.max) { + this.max = polygon[0].length; + return this.index = index; + } + }, trackMaxVertices); + array = path.coordinates[trackMaxVertices.index][0]; + } else if (path.type === 'LineString') { + array = path.coordinates; + } + while (i < array.length) { + result.push(new google.maps.LatLng(array[i][1], array[i][0])); + i++; + } + } + return result; + }, + getPath: function(object, key) { + var obj; + if ((key == null) || !_.isString(key)) { + return key; + } + obj = object; + _.each(key.split('.'), function(value) { + if (obj) { + return obj = obj[value]; + } + }); + return obj; + }, + validateBoundPoints: function(bounds) { + if (angular.isUndefined(bounds.sw.latitude) || angular.isUndefined(bounds.sw.longitude) || angular.isUndefined(bounds.ne.latitude) || angular.isUndefined(bounds.ne.longitude)) { + return false; + } + return true; + }, + convertBoundPoints: function(bounds) { + var result; + result = new google.maps.LatLngBounds(new google.maps.LatLng(bounds.sw.latitude, bounds.sw.longitude), new google.maps.LatLng(bounds.ne.latitude, bounds.ne.longitude)); + return result; + }, + fitMapBounds: function(map, bounds) { + return map.fitBounds(bounds); + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapIsReady', [ + '$q', '$timeout', function($q, $timeout) { + var _checkIfReady, _ctr, _promises, _proms; + _ctr = 0; + _proms = []; + _promises = function() { + return $q.all(_proms); + }; + _checkIfReady = function(deferred, expectedInstances, retriesLeft) { + return $timeout(function() { + if (retriesLeft <= 0) { + deferred.reject('Your maps are not found we have checked the maximum amount of times. :)'); + return; + } + if (_ctr !== expectedInstances) { + _checkIfReady(deferred, expectedInstances, retriesLeft - 1); + } else { + deferred.resolve(_promises()); + } + }, 100); + }; + return { + spawn: function() { + var d; + d = $q.defer(); + _proms.push(d.promise); + _ctr += 1; + return { + instance: _ctr, + deferred: d + }; + }, + promises: _promises, + instances: function() { + return _ctr; + }, + promise: function(expectedInstances, numRetries) { + var d; + if (expectedInstances == null) { + expectedInstances = 1; + } + if (numRetries == null) { + numRetries = 50; + } + d = $q.defer(); + _checkIfReady(d, expectedInstances, numRetries); + return d.promise; + }, + reset: function() { + _ctr = 0; + _proms.length = 0; + }, + decrement: function() { + if (_ctr > 0) { + _ctr -= 1; + } + if (_proms.length) { + _proms.length -= 1; + } + } + }; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapLinked", [ + "uiGmapBaseObject", function(BaseObject) { + var Linked; + Linked = (function(superClass) { + extend(Linked, superClass); + + function Linked(scope, element, attrs, ctrls) { + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.ctrls = ctrls; + } + + return Linked; + + })(BaseObject); + return Linked; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapLogger', [ + 'nemSimpleLogger', function(nemSimpleLogger) { + return nemSimpleLogger.spawn(); + } + ]); + +}).call(this); +; +/*global _:true, angular:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapModelKey', [ + 'uiGmapBaseObject', 'uiGmapGmapUtil', function(BaseObject, GmapUtil) { + return (function(superClass) { + extend(_Class, superClass); + + function _Class(scope1, _interface) { + this.scope = scope1; + this["interface"] = _interface != null ? _interface : { + scopeKeys: [] + }; + this.modelsLength = bind(this.modelsLength, this); + this.updateChild = bind(this.updateChild, this); + this.destroy = bind(this.destroy, this); + this.setChildScope = bind(this.setChildScope, this); + this.getChanges = bind(this.getChanges, this); + this.getProp = bind(this.getProp, this); + this.setIdKey = bind(this.setIdKey, this); + this.modelKeyComparison = bind(this.modelKeyComparison, this); + _Class.__super__.constructor.call(this); + this.defaultIdKey = 'id'; + this.idKey = void 0; + } + + _Class.prototype.evalModelHandle = function(model, modelKey) { + if ((model == null) || (modelKey == null)) { + return; + } + if (modelKey === 'self') { + return model; + } else { + if (_.isFunction(modelKey)) { + modelKey = modelKey(); + } + return GmapUtil.getPath(model, modelKey); + } + }; + + _Class.prototype.modelKeyComparison = function(model1, model2) { + var coord1, coord2, hasCoords, isEqual, scope, without; + hasCoords = this["interface"].scopeKeys.indexOf('coords') >= 0; + if (hasCoords && (this.scope.coords != null) || !hasCoords) { + scope = this.scope; + } + if (scope == null) { + throw 'No scope set!'; + } + if (hasCoords) { + coord1 = this.scopeOrModelVal('coords', scope, model1); + coord2 = this.scopeOrModelVal('coords', scope, model2); + isEqual = GmapUtil.equalCoords(coord1, coord2); + if (!isEqual) { + return isEqual; + } + } + without = _.without(this["interface"].scopeKeys, 'coords'); + isEqual = _.every(without, (function(_this) { + return function(k) { + var m1, m2; + m1 = _this.scopeOrModelVal(scope[k], scope, model1); + m2 = _this.scopeOrModelVal(scope[k], scope, model2); + if (scope.deepComparison) { + return _.isEqual(m1, m2); + } else { + return m1 === m2; + } + }; + })(this)); + return isEqual; + }; + + _Class.prototype.setIdKey = function(scope) { + return this.idKey = scope.idKey != null ? scope.idKey : this.defaultIdKey; + }; + + _Class.prototype.setVal = function(model, key, newValue) { + this.modelOrKey(model, key = newValue); + return model; + }; + + _Class.prototype.modelOrKey = function(model, key) { + if (key == null) { + return; + } + if (key !== 'self') { + return GmapUtil.getPath(model, key); + } + return model; + }; + + _Class.prototype.getProp = function(propName, scope, model) { + return this.scopeOrModelVal(propName, scope, model); + }; + + + /* + For the cases were watching a large object we only want to know the list of props + that actually changed. + Also we want to limit the amount of props we analyze to whitelisted props that are + actually tracked by scope. (should make things faster with whitelisted) + */ + + _Class.prototype.getChanges = function(now, prev, whitelistedProps) { + var c, changes, prop; + if (whitelistedProps) { + prev = _.pick(prev, whitelistedProps); + now = _.pick(now, whitelistedProps); + } + changes = {}; + prop = {}; + c = {}; + for (prop in now) { + if (!prev || prev[prop] !== now[prop]) { + if (_.isArray(now[prop])) { + changes[prop] = now[prop]; + } else if (_.isObject(now[prop])) { + c = this.getChanges(now[prop], (prev ? prev[prop] : null)); + if (!_.isEmpty(c)) { + changes[prop] = c; + } + } else { + changes[prop] = now[prop]; + } + } + } + return changes; + }; + + _Class.prototype.scopeOrModelVal = function(key, scope, model, doWrap) { + var maybeWrap, modelKey, modelProp, scopeProp; + if (doWrap == null) { + doWrap = false; + } + maybeWrap = function(isScope, ret, doWrap) { + if (doWrap == null) { + doWrap = false; + } + if (doWrap) { + return { + isScope: isScope, + value: ret + }; + } + return ret; + }; + scopeProp = _.get(scope, key); + if (_.isFunction(scopeProp)) { + return maybeWrap(true, scopeProp(model), doWrap); + } + if (_.isObject(scopeProp)) { + return maybeWrap(true, scopeProp, doWrap); + } + if (!_.isString(scopeProp)) { + return maybeWrap(true, scopeProp, doWrap); + } + modelKey = scopeProp; + if (!modelKey) { + modelProp = _.get(model, key); + } else { + modelProp = modelKey === 'self' ? model : _.get(model, modelKey); + } + if (_.isFunction(modelProp)) { + return maybeWrap(false, modelProp(), doWrap); + } + return maybeWrap(false, modelProp, doWrap); + }; + + _Class.prototype.setChildScope = function(keys, childScope, model) { + var isScopeObj, key, name, newValue; + for (key in keys) { + name = keys[key]; + isScopeObj = this.scopeOrModelVal(name, childScope, model, true); + if ((isScopeObj != null ? isScopeObj.value : void 0) != null) { + newValue = isScopeObj.value; + if (newValue !== childScope[name]) { + childScope[name] = newValue; + } + } + } + return childScope.model = model; + }; + + _Class.prototype.onDestroy = function(scope) {}; + + _Class.prototype.destroy = function(manualOverride) { + var ref; + if (manualOverride == null) { + manualOverride = false; + } + if ((this.scope != null) && !((ref = this.scope) != null ? ref.$$destroyed : void 0) && (this.needToManualDestroy || manualOverride)) { + return this.scope.$destroy(); + } else { + return this.clean(); + } + }; + + _Class.prototype.updateChild = function(child, model) { + if (model[this.idKey] == null) { + this.$log.error("Model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."); + return; + } + return child.updateModel(model); + }; + + _Class.prototype.modelsLength = function(arrayOrObjModels) { + var len, toCheck; + if (arrayOrObjModels == null) { + arrayOrObjModels = void 0; + } + len = 0; + toCheck = arrayOrObjModels ? arrayOrObjModels : this.scope.models; + if (toCheck == null) { + return len; + } + if (angular.isArray(toCheck) || (toCheck.length != null)) { + len = toCheck.length; + } else { + len = Object.keys(toCheck).length; + } + return len; + }; + + return _Class; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapModelsWatcher', [ + 'uiGmapLogger', 'uiGmap_async', '$q', 'uiGmapPromise', function(Logger, _async, $q, uiGmapPromise) { + return { + didQueueInitPromise: function(existingPiecesObj, scope) { + if (scope.models.length === 0) { + _async.promiseLock(existingPiecesObj, uiGmapPromise.promiseTypes.init, null, null, (function() { + return uiGmapPromise.resolve(); + })); + return true; + } + return false; + }, + figureOutState: function(idKey, scope, childObjects, comparison, callBack) { + var adds, children, mappedScopeModelIds, removals, updates; + adds = []; + mappedScopeModelIds = {}; + removals = []; + updates = []; + scope.models.forEach(function(m) { + var child; + if (m[idKey] != null) { + mappedScopeModelIds[m[idKey]] = {}; + if (childObjects.get(m[idKey]) == null) { + return adds.push(m); + } else { + child = childObjects.get(m[idKey]); + if (!comparison(m, child.clonedModel, scope)) { + return updates.push({ + model: m, + child: child + }); + } + } + } else { + return Logger.error(' id missing for model #{m.toString()},\ncan not use do comparison/insertion'); + } + }); + children = childObjects.values(); + children.forEach(function(c) { + var id; + if (c == null) { + Logger.error('child undefined in ModelsWatcher.'); + return; + } + if (c.model == null) { + Logger.error('child.model undefined in ModelsWatcher.'); + return; + } + id = c.model[idKey]; + if (mappedScopeModelIds[id] == null) { + return removals.push(c); + } + }); + return { + adds: adds, + removals: removals, + updates: updates + }; + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapPromise', [ + '$q', '$timeout', 'uiGmapLogger', function($q, $timeout, $log) { + var ExposedPromise, SniffedPromise, defer, isInProgress, isResolved, promise, promiseStatus, promiseStatuses, promiseTypes, resolve, strPromiseStatuses; + promiseTypes = { + create: 'create', + update: 'update', + "delete": 'delete', + init: 'init' + }; + promiseStatuses = { + IN_PROGRESS: 0, + RESOLVED: 1, + REJECTED: 2 + }; + strPromiseStatuses = (function() { + var obj; + obj = {}; + obj["" + promiseStatuses.IN_PROGRESS] = 'in-progress'; + obj["" + promiseStatuses.RESOLVED] = 'resolved'; + obj["" + promiseStatuses.REJECTED] = 'rejected'; + return obj; + })(); + isInProgress = function(promise) { + if (promise.$$state) { + return promise.$$state.status === promiseStatuses.IN_PROGRESS; + } + if (!promise.hasOwnProperty("$$v")) { + return true; + } + }; + isResolved = function(promise) { + if (promise.$$state) { + return promise.$$state.status === promiseStatuses.RESOLVED; + } + if (promise.hasOwnProperty("$$v")) { + return true; + } + }; + promiseStatus = function(status) { + return strPromiseStatuses[status] || 'done w error'; + }; + ExposedPromise = function(promise) { + var cancelDeferred, combined, wrapped; + cancelDeferred = $q.defer(); + combined = $q.all([promise, cancelDeferred.promise]); + wrapped = $q.defer(); + promise.then(cancelDeferred.resolve, (function() {}), function(notify) { + cancelDeferred.notify(notify); + return wrapped.notify(notify); + }); + combined.then(function(successes) { + return wrapped.resolve(successes[0] || successes[1]); + }, function(error) { + return wrapped.reject(error); + }); + wrapped.promise.cancel = function(reason) { + if (reason == null) { + reason = 'canceled'; + } + return cancelDeferred.reject(reason); + }; + wrapped.promise.notify = function(msg) { + if (msg == null) { + msg = 'cancel safe'; + } + wrapped.notify(msg); + if (promise.hasOwnProperty('notify')) { + return promise.notify(msg); + } + }; + if (promise.promiseType != null) { + wrapped.promise.promiseType = promise.promiseType; + } + return wrapped.promise; + }; + SniffedPromise = function(fnPromise, promiseType) { + return { + promise: fnPromise, + promiseType: promiseType + }; + }; + defer = function() { + return $q.defer(); + }; + resolve = function() { + var d; + d = $q.defer(); + d.resolve.apply(void 0, arguments); + return d.promise; + }; + promise = function(fnToWrap) { + var d; + if (!_.isFunction(fnToWrap)) { + $log.error("uiGmapPromise.promise() only accepts functions"); + return; + } + d = $q.defer(); + $timeout(function() { + var result; + result = fnToWrap(); + return d.resolve(result); + }); + return d.promise; + }; + return { + defer: defer, + promise: promise, + resolve: resolve, + promiseTypes: promiseTypes, + isInProgress: isInProgress, + isResolved: isResolved, + promiseStatus: promiseStatus, + ExposedPromise: ExposedPromise, + SniffedPromise: SniffedPromise + }; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapPropMap", function() { + + /* + Simple Object Map with a length property to make it easy to track length/size + */ + var PropMap; + return PropMap = (function() { + function PropMap() { + this.removeAll = bind(this.removeAll, this); + this.slice = bind(this.slice, this); + this.push = bind(this.push, this); + this.keys = bind(this.keys, this); + this.values = bind(this.values, this); + this.remove = bind(this.remove, this); + this.put = bind(this.put, this); + this.stateChanged = bind(this.stateChanged, this); + this.get = bind(this.get, this); + this.length = 0; + this.dict = {}; + this.didValsStateChange = false; + this.didKeysStateChange = false; + this.allVals = []; + this.allKeys = []; + } + + PropMap.prototype.get = function(key) { + return this.dict[key]; + }; + + PropMap.prototype.stateChanged = function() { + this.didValsStateChange = true; + return this.didKeysStateChange = true; + }; + + PropMap.prototype.put = function(key, value) { + if (this.get(key) == null) { + this.length++; + } + this.stateChanged(); + return this.dict[key] = value; + }; + + PropMap.prototype.remove = function(key, isSafe) { + var value; + if (isSafe == null) { + isSafe = false; + } + if (isSafe && !this.get(key)) { + return void 0; + } + value = this.dict[key]; + delete this.dict[key]; + this.length--; + this.stateChanged(); + return value; + }; + + PropMap.prototype.valuesOrKeys = function(str) { + var keys, vals; + if (str == null) { + str = 'Keys'; + } + if (!this["did" + str + "StateChange"]) { + return this['all' + str]; + } + vals = []; + keys = []; + _.each(this.dict, function(v, k) { + vals.push(v); + return keys.push(k); + }); + this.didKeysStateChange = false; + this.didValsStateChange = false; + this.allVals = vals; + this.allKeys = keys; + return this['all' + str]; + }; + + PropMap.prototype.values = function() { + return this.valuesOrKeys('Vals'); + }; + + PropMap.prototype.keys = function() { + return this.valuesOrKeys(); + }; + + PropMap.prototype.push = function(obj, key) { + if (key == null) { + key = "key"; + } + return this.put(obj[key], obj); + }; + + PropMap.prototype.slice = function() { + return this.keys().map((function(_this) { + return function(k) { + return _this.remove(k); + }; + })(this)); + }; + + PropMap.prototype.removeAll = function() { + return this.slice(); + }; + + PropMap.prototype.each = function(cb) { + return _.each(this.dict, function(v, k) { + return cb(v); + }); + }; + + PropMap.prototype.map = function(cb) { + return _.map(this.dict, function(v, k) { + return cb(v); + }); + }; + + return PropMap; + + })(); + }); + +}).call(this); +; +/*globals angular,_ */ + +(function() { + angular.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapPropertyAction", [ + "uiGmapLogger", function(Logger) { + var PropertyAction; + PropertyAction = function(setterFn) { + this.setIfChange = function(callingKey) { + return function(newVal, oldVal) { + if (!_.isEqual(oldVal, newVal)) { + return setterFn(callingKey, newVal); + } + }; + }; + this.sic = this.setIfChange; + return this; + }; + return PropertyAction; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps.directives.api.managers').factory('uiGmapClustererMarkerManager', [ + 'uiGmapLogger', 'uiGmapFitHelper', 'uiGmapPropMap', 'uiGmapEventsHelper', function($log, FitHelper, PropMap, EventsHelper) { + var ClustererMarkerManager; + ClustererMarkerManager = (function() { + ClustererMarkerManager.type = 'ClustererMarkerManager'; + + function ClustererMarkerManager(gMap, opt_markers, opt_options, opt_events) { + if (opt_markers == null) { + opt_markers = {}; + } + this.opt_options = opt_options != null ? opt_options : {}; + this.opt_events = opt_events; + this.getGMarkers = bind(this.getGMarkers, this); + this.fit = bind(this.fit, this); + this.destroy = bind(this.destroy, this); + this.attachEvents = bind(this.attachEvents, this); + this.clear = bind(this.clear, this); + this.draw = bind(this.draw, this); + this.removeMany = bind(this.removeMany, this); + this.remove = bind(this.remove, this); + this.addMany = bind(this.addMany, this); + this.update = bind(this.update, this); + this.add = bind(this.add, this); + this.type = ClustererMarkerManager.type; + this.clusterer = new NgMapMarkerClusterer(gMap, opt_markers, this.opt_options); + this.propMapGMarkers = new PropMap(); + this.attachEvents(this.opt_events, 'opt_events'); + this.clusterer.setIgnoreHidden(true); + this.noDrawOnSingleAddRemoves = true; + $log.info(this); + } + + ClustererMarkerManager.prototype.checkKey = function(gMarker) { + var msg; + if (gMarker.key == null) { + msg = 'gMarker.key undefined and it is REQUIRED!!'; + return $log.error(msg); + } + }; + + ClustererMarkerManager.prototype.add = function(gMarker) { + this.checkKey(gMarker); + this.clusterer.addMarker(gMarker, this.noDrawOnSingleAddRemoves); + this.propMapGMarkers.put(gMarker.key, gMarker); + return this.checkSync(); + }; + + ClustererMarkerManager.prototype.update = function(gMarker) { + this.remove(gMarker); + return this.add(gMarker); + }; + + ClustererMarkerManager.prototype.addMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.add(gMarker); + }; + })(this)); + }; + + ClustererMarkerManager.prototype.remove = function(gMarker) { + var exists; + this.checkKey(gMarker); + exists = this.propMapGMarkers.get(gMarker.key); + if (exists) { + this.clusterer.removeMarker(gMarker, this.noDrawOnSingleAddRemoves); + this.propMapGMarkers.remove(gMarker.key); + } + return this.checkSync(); + }; + + ClustererMarkerManager.prototype.removeMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.remove(gMarker); + }; + })(this)); + }; + + ClustererMarkerManager.prototype.draw = function() { + return this.clusterer.repaint(); + }; + + ClustererMarkerManager.prototype.clear = function() { + this.removeMany(this.getGMarkers()); + return this.clusterer.repaint(); + }; + + ClustererMarkerManager.prototype.attachEvents = function(options, optionsName) { + var eventHandler, eventName, results; + this.listeners = []; + if (angular.isDefined(options) && (options != null) && angular.isObject(options)) { + results = []; + for (eventName in options) { + eventHandler = options[eventName]; + if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) { + $log.info(optionsName + ": Attaching event: " + eventName + " to clusterer"); + results.push(this.listeners.push(google.maps.event.addListener(this.clusterer, eventName, options[eventName]))); + } else { + results.push(void 0); + } + } + return results; + } + }; + + ClustererMarkerManager.prototype.clearEvents = function() { + EventsHelper.removeEvents(this.listeners); + return this.listeners = []; + }; + + ClustererMarkerManager.prototype.destroy = function() { + this.clearEvents(); + return this.clear(); + }; + + ClustererMarkerManager.prototype.fit = function() { + return FitHelper.fit(this.getGMarkers(), this.clusterer.getMap()); + }; + + ClustererMarkerManager.prototype.getGMarkers = function() { + return this.clusterer.getMarkers().values(); + }; + + ClustererMarkerManager.prototype.checkSync = function() {}; + + return ClustererMarkerManager; + + })(); + return ClustererMarkerManager; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.managers').service('uiGmapGoogleMapObjectManager', [ + function() { + var _availableInstances, _usedInstances; + _availableInstances = []; + _usedInstances = []; + return { + createMapInstance: function(parentElement, options) { + var instance; + instance = null; + if (_availableInstances.length === 0) { + instance = new google.maps.Map(parentElement, options); + _usedInstances.push(instance); + } else { + instance = _availableInstances.pop(); + angular.element(parentElement).append(instance.getDiv()); + instance.setOptions(options); + _usedInstances.push(instance); + } + return instance; + }, + recycleMapInstance: function(instance) { + var index; + index = _usedInstances.indexOf(instance); + if (index < 0) { + throw new Error('Expected map instance to be a previously used instance'); + } + _usedInstances.splice(index, 1); + return _availableInstances.push(instance); + } + }; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module("uiGmapgoogle-maps.directives.api.managers").factory("uiGmapMarkerManager", [ + "uiGmapLogger", "uiGmapFitHelper", "uiGmapPropMap", function(Logger, FitHelper, PropMap) { + var MarkerManager; + MarkerManager = (function() { + MarkerManager.type = 'MarkerManager'; + + function MarkerManager(gMap, opt_markers, opt_options) { + this.getGMarkers = bind(this.getGMarkers, this); + this.fit = bind(this.fit, this); + this.handleOptDraw = bind(this.handleOptDraw, this); + this.clear = bind(this.clear, this); + this.destroy = bind(this.destroy, this); + this.draw = bind(this.draw, this); + this.removeMany = bind(this.removeMany, this); + this.remove = bind(this.remove, this); + this.addMany = bind(this.addMany, this); + this.update = bind(this.update, this); + this.add = bind(this.add, this); + this.type = MarkerManager.type; + this.gMap = gMap; + this.gMarkers = new PropMap(); + this.$log = Logger; + this.$log.info(this); + } + + MarkerManager.prototype.add = function(gMarker, optDraw) { + var exists, msg; + if (optDraw == null) { + optDraw = true; + } + if (gMarker.key == null) { + msg = "gMarker.key undefined and it is REQUIRED!!"; + Logger.error(msg); + throw msg; + } + exists = this.gMarkers.get(gMarker.key); + if (!exists) { + this.handleOptDraw(gMarker, optDraw, true); + return this.gMarkers.put(gMarker.key, gMarker); + } + }; + + MarkerManager.prototype.update = function(gMarker, optDraw) { + if (optDraw == null) { + optDraw = true; + } + this.remove(gMarker, optDraw); + return this.add(gMarker, optDraw); + }; + + MarkerManager.prototype.addMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.add(gMarker); + }; + })(this)); + }; + + MarkerManager.prototype.remove = function(gMarker, optDraw) { + if (optDraw == null) { + optDraw = true; + } + this.handleOptDraw(gMarker, optDraw, false); + if (this.gMarkers.get(gMarker.key)) { + return this.gMarkers.remove(gMarker.key); + } + }; + + MarkerManager.prototype.removeMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(marker) { + return _this.remove(marker); + }; + })(this)); + }; + + MarkerManager.prototype.draw = function() { + var deletes; + deletes = []; + this.gMarkers.each((function(_this) { + return function(gMarker) { + if (!gMarker.isDrawn) { + if (gMarker.doAdd) { + gMarker.setMap(_this.gMap); + return gMarker.isDrawn = true; + } else { + return deletes.push(gMarker); + } + } + }; + })(this)); + return deletes.forEach((function(_this) { + return function(gMarker) { + gMarker.isDrawn = false; + return _this.remove(gMarker, true); + }; + })(this)); + }; + + MarkerManager.prototype.destroy = function() { + return this.clear(); + }; + + MarkerManager.prototype.clear = function() { + this.gMarkers.each(function(gMarker) { + return gMarker.setMap(null); + }); + delete this.gMarkers; + return this.gMarkers = new PropMap(); + }; + + MarkerManager.prototype.handleOptDraw = function(gMarker, optDraw, doAdd) { + if (optDraw === true) { + if (doAdd) { + gMarker.setMap(this.gMap); + } else { + gMarker.setMap(null); + } + return gMarker.isDrawn = true; + } else { + gMarker.isDrawn = false; + return gMarker.doAdd = doAdd; + } + }; + + MarkerManager.prototype.fit = function() { + return FitHelper.fit(this.getGMarkers(), this.gMap); + }; + + MarkerManager.prototype.getGMarkers = function() { + return this.gMarkers.values(); + }; + + return MarkerManager; + + })(); + return MarkerManager; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps.directives.api.managers').factory('uiGmapSpiderfierMarkerManager', [ + 'uiGmapLogger', 'uiGmapFitHelper', 'uiGmapPropMap', 'uiGmapMarkerSpiderfier', function($log, FitHelper, PropMap, MarkerSpiderfier) { + var SpiderfierMarkerManager; + return SpiderfierMarkerManager = (function() { + SpiderfierMarkerManager.type = 'SpiderfierMarkerManager'; + + function SpiderfierMarkerManager(gMap, opt_markers, opt_options, opt_events, scope) { + if (opt_markers == null) { + opt_markers = {}; + } + this.opt_options = opt_options != null ? opt_options : {}; + this.opt_events = opt_events; + this.scope = scope; + this.isSpiderfied = bind(this.isSpiderfied, this); + this.getGMarkers = bind(this.getGMarkers, this); + this.fit = bind(this.fit, this); + this.destroy = bind(this.destroy, this); + this.attachEvents = bind(this.attachEvents, this); + this.clear = bind(this.clear, this); + this.removeMany = bind(this.removeMany, this); + this.remove = bind(this.remove, this); + this.addMany = bind(this.addMany, this); + this.update = bind(this.update, this); + this.add = bind(this.add, this); + this.type = SpiderfierMarkerManager.type; + this.markerSpiderfier = new MarkerSpiderfier(gMap, this.opt_options); + this.propMapGMarkers = new PropMap(); + this.attachEvents(this.opt_events, 'opt_events'); + this.noDrawOnSingleAddRemoves = true; + $log.info(this); + } + + SpiderfierMarkerManager.prototype.checkKey = function(gMarker) { + var msg; + if (gMarker.key == null) { + msg = 'gMarker.key undefined and it is REQUIRED!!'; + return $log.error(msg); + } + }; + + SpiderfierMarkerManager.prototype.add = function(gMarker) { + gMarker.setMap(this.markerSpiderfier.map); + this.checkKey(gMarker); + this.markerSpiderfier.addMarker(gMarker, this.noDrawOnSingleAddRemoves); + this.propMapGMarkers.put(gMarker.key, gMarker); + return this.checkSync(); + }; + + SpiderfierMarkerManager.prototype.update = function(gMarker) { + this.remove(gMarker); + return this.add(gMarker); + }; + + SpiderfierMarkerManager.prototype.addMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.add(gMarker); + }; + })(this)); + }; + + SpiderfierMarkerManager.prototype.remove = function(gMarker) { + var exists; + this.checkKey(gMarker); + exists = this.propMapGMarkers.get(gMarker.key); + if (exists) { + gMarker.setMap(null); + this.markerSpiderfier.removeMarker(gMarker, this.noDrawOnSingleAddRemoves); + this.propMapGMarkers.remove(gMarker.key); + } + return this.checkSync(); + }; + + SpiderfierMarkerManager.prototype.removeMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.remove(gMarker); + }; + })(this)); + }; + + SpiderfierMarkerManager.prototype.draw = function() {}; + + SpiderfierMarkerManager.prototype.clear = function() { + return this.removeMany(this.getGMarkers()); + }; + + SpiderfierMarkerManager.prototype.attachEvents = function(options, optionsName) { + if (angular.isDefined(options) && (options != null) && angular.isObject(options)) { + return _.each(options, (function(_this) { + return function(eventHandler, eventName) { + if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) { + $log.info(optionsName + ": Attaching event: " + eventName + " to markerSpiderfier"); + return _this.markerSpiderfier.addListener(eventName, function() { + if (eventName === 'spiderfy' || eventName === 'unspiderfy') { + return _this.scope.$evalAsync(options[eventName].apply(options, arguments)); + } else { + return _this.scope.$evalAsync(options[eventName].apply(options, [arguments[0], eventName, arguments[0].model, arguments])); + } + }); + } + }; + })(this)); + } + }; + + SpiderfierMarkerManager.prototype.clearEvents = function(options, optionsName) { + var eventHandler, eventName; + if (angular.isDefined(options) && (options != null) && angular.isObject(options)) { + for (eventName in options) { + eventHandler = options[eventName]; + if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) { + $log.info(optionsName + ": Clearing event: " + eventName + " to markerSpiderfier"); + this.markerSpiderfier.clearListeners(eventName); + } + } + } + }; + + SpiderfierMarkerManager.prototype.destroy = function() { + this.clearEvents(this.opt_events, 'opt_events'); + return this.clear(); + }; + + SpiderfierMarkerManager.prototype.fit = function() { + return FitHelper.fit(this.getGMarkers(), this.markerSpiderfier.map); + }; + + SpiderfierMarkerManager.prototype.getGMarkers = function() { + return this.markerSpiderfier.getMarkers(); + }; + + SpiderfierMarkerManager.prototype.isSpiderfied = function() { + return _.find(this.getGMarkers(), function(gMarker) { + return (gMarker != null ? gMarker._omsData : void 0) != null; + }); + }; + + SpiderfierMarkerManager.prototype.checkSync = function() {}; + + return SpiderfierMarkerManager; + + })(); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').factory('uiGmapadd-events', [ + '$timeout', function($timeout) { + var addEvent, addEvents; + addEvent = function(target, eventName, handler) { + return google.maps.event.addListener(target, eventName, function() { + handler.apply(this, arguments); + return $timeout((function() {}), true); + }); + }; + addEvents = function(target, eventName, handler) { + var remove; + if (handler) { + return addEvent(target, eventName, handler); + } + remove = []; + angular.forEach(eventName, function(_handler, key) { + return remove.push(addEvent(target, key, _handler)); + }); + return function() { + angular.forEach(remove, function(listener) { + return google.maps.event.removeListener(listener); + }); + return remove = null; + }; + }; + return addEvents; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').factory('uiGmaparray-sync', [ + 'uiGmapadd-events', function(mapEvents) { + return function(mapArray, scope, pathEval, pathChangedFn) { + var geojsonArray, geojsonHandlers, geojsonWatcher, isSetFromScope, legacyHandlers, legacyWatcher, mapArrayListener, scopePath, watchListener; + isSetFromScope = false; + scopePath = scope.$eval(pathEval); + if (!scope["static"]) { + legacyHandlers = { + set_at: function(index) { + var value; + if (isSetFromScope) { + return; + } + value = mapArray.getAt(index); + if (!value) { + return; + } + if (!value.lng || !value.lat) { + return scopePath[index] = value; + } else { + scopePath[index].latitude = value.lat(); + return scopePath[index].longitude = value.lng(); + } + }, + insert_at: function(index) { + var value; + if (isSetFromScope) { + return; + } + value = mapArray.getAt(index); + if (!value) { + return; + } + if (!value.lng || !value.lat) { + return scopePath.splice(index, 0, value); + } else { + return scopePath.splice(index, 0, { + latitude: value.lat(), + longitude: value.lng() + }); + } + }, + remove_at: function(index) { + if (isSetFromScope) { + return; + } + return scopePath.splice(index, 1); + } + }; + geojsonArray; + if (scopePath.type === 'Polygon') { + geojsonArray = scopePath.coordinates[0]; + } else if (scopePath.type === 'LineString') { + geojsonArray = scopePath.coordinates; + } + geojsonHandlers = { + set_at: function(index) { + var value; + if (isSetFromScope) { + return; + } + value = mapArray.getAt(index); + if (!(value && value.lng && value.lat)) { + return; + } + geojsonArray[index][1] = value.lat(); + return geojsonArray[index][0] = value.lng(); + }, + insert_at: function(index) { + var value; + if (isSetFromScope) { + return; + } + value = mapArray.getAt(index); + if (!value) { + return; + } + if (!value.lng || !value.lat) { + return; + } + return geojsonArray.splice(index, 0, [value.lng(), value.lat()]); + }, + remove_at: function(index) { + if (isSetFromScope) { + return; + } + return geojsonArray.splice(index, 1); + } + }; + mapArrayListener = mapEvents(mapArray, angular.isUndefined(scopePath.type) ? legacyHandlers : geojsonHandlers); + } + legacyWatcher = function(newPath) { + var changed, i, l, newLength, newValue, oldArray, oldLength, oldValue; + isSetFromScope = true; + oldArray = mapArray; + changed = false; + if (newPath) { + i = 0; + oldLength = oldArray.getLength(); + newLength = newPath.length; + l = Math.min(oldLength, newLength); + newValue = void 0; + while (i < l) { + oldValue = oldArray.getAt(i); + newValue = newPath[i]; + if (typeof newValue.equals === 'function') { + if (!newValue.equals(oldValue)) { + oldArray.setAt(i, newValue); + changed = true; + } + } else { + if ((oldValue.lat() !== newValue.latitude) || (oldValue.lng() !== newValue.longitude)) { + oldArray.setAt(i, new google.maps.LatLng(newValue.latitude, newValue.longitude)); + changed = true; + } + } + i++; + } + while (i < newLength) { + newValue = newPath[i]; + if (typeof newValue.lat === 'function' && typeof newValue.lng === 'function') { + oldArray.push(newValue); + } else { + oldArray.push(new google.maps.LatLng(newValue.latitude, newValue.longitude)); + } + changed = true; + i++; + } + while (i < oldLength) { + oldArray.pop(); + changed = true; + i++; + } + } + isSetFromScope = false; + if (changed) { + return pathChangedFn(oldArray); + } + }; + geojsonWatcher = function(newPath) { + var array, changed, i, l, newLength, newValue, oldArray, oldLength, oldValue; + isSetFromScope = true; + oldArray = mapArray; + changed = false; + if (newPath) { + array; + if (scopePath.type === 'Polygon') { + array = newPath.coordinates[0]; + } else if (scopePath.type === 'LineString') { + array = newPath.coordinates; + } + i = 0; + oldLength = oldArray.getLength(); + newLength = array.length; + l = Math.min(oldLength, newLength); + newValue = void 0; + while (i < l) { + oldValue = oldArray.getAt(i); + newValue = array[i]; + if ((oldValue.lat() !== newValue[1]) || (oldValue.lng() !== newValue[0])) { + oldArray.setAt(i, new google.maps.LatLng(newValue[1], newValue[0])); + changed = true; + } + i++; + } + while (i < newLength) { + newValue = array[i]; + oldArray.push(new google.maps.LatLng(newValue[1], newValue[0])); + changed = true; + i++; + } + while (i < oldLength) { + oldArray.pop(); + changed = true; + i++; + } + } + isSetFromScope = false; + if (changed) { + return pathChangedFn(oldArray); + } + }; + watchListener; + if (!scope["static"]) { + if (angular.isUndefined(scopePath.type)) { + watchListener = scope.$watchCollection(pathEval, legacyWatcher); + } else { + watchListener = scope.$watch(pathEval, geojsonWatcher, true); + } + } + return function() { + if (mapArrayListener) { + mapArrayListener(); + mapArrayListener = null; + } + if (watchListener) { + watchListener(); + return watchListener = null; + } + }; + }; + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapChromeFixes", [ + '$timeout', function($timeout) { + return { + maybeRepaint: function(el) { + if (el) { + el.style.opacity = 0.9; + return $timeout(function() { + return el.style.opacity = 1; + }); + } + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').service('uiGmapObjectIterators', function() { + var _ignores, _iterators, _slapForEach, _slapMap; + _ignores = ['length', 'forEach', 'map']; + _iterators = []; + _slapForEach = function(object) { + object.forEach = function(cb) { + return _.each(_.omit(object, _ignores), function(val) { + if (!_.isFunction(val)) { + return cb(val); + } + }); + }; + return object; + }; + _iterators.push(_slapForEach); + _slapMap = function(object) { + object.map = function(cb) { + return _.map(_.omit(object, _ignores), function(val) { + if (!_.isFunction(val)) { + return cb(val); + } + }); + }; + return object; + }; + _iterators.push(_slapMap); + return { + slapMap: _slapMap, + slapForEach: _slapForEach, + slapAll: function(object) { + _iterators.forEach(function(it) { + return it(object); + }); + return object; + } + }; + }); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.options.builders').service('uiGmapCommonOptionsBuilder', [ + 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapModelKey', function(BaseObject, $log, ModelKey) { + var CommonOptionsBuilder; + return CommonOptionsBuilder = (function(superClass) { + extend(CommonOptionsBuilder, superClass); + + function CommonOptionsBuilder() { + this.watchProps = bind(this.watchProps, this); + this.buildOpts = bind(this.buildOpts, this); + return CommonOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + CommonOptionsBuilder.prototype.props = [ + 'clickable', 'draggable', 'editable', 'visible', { + prop: 'stroke', + isColl: true + } + ]; + + CommonOptionsBuilder.prototype.getCorrectModel = function(scope) { + if (angular.isDefined(scope != null ? scope.model : void 0)) { + return scope.model; + } else { + return scope; + } + }; + + CommonOptionsBuilder.prototype.buildOpts = function(customOpts, cachedEval, forEachOpts) { + var model, opts, stroke; + if (customOpts == null) { + customOpts = {}; + } + if (forEachOpts == null) { + forEachOpts = {}; + } + if (!this.scope) { + $log.error('this.scope not defined in CommonOptionsBuilder can not buildOpts'); + return; + } + if (!this.gMap) { + $log.error('this.map not defined in CommonOptionsBuilder can not buildOpts'); + return; + } + model = this.getCorrectModel(this.scope); + stroke = this.scopeOrModelVal('stroke', this.scope, model); + opts = angular.extend(customOpts, this.DEFAULTS, { + map: this.gMap, + strokeColor: stroke != null ? stroke.color : void 0, + strokeOpacity: stroke != null ? stroke.opacity : void 0, + strokeWeight: stroke != null ? stroke.weight : void 0 + }); + angular.forEach(angular.extend(forEachOpts, { + clickable: true, + draggable: false, + editable: false, + "static": false, + fit: false, + visible: true, + zIndex: 0, + icons: [] + }), (function(_this) { + return function(defaultValue, key) { + var val; + val = cachedEval ? cachedEval[key] : _this.scopeOrModelVal(key, _this.scope, model); + if (angular.isUndefined(val)) { + return opts[key] = defaultValue; + } else { + return opts[key] = model[key]; + } + }; + })(this)); + if (opts["static"]) { + opts.editable = false; + } + return opts; + }; + + CommonOptionsBuilder.prototype.watchProps = function(props) { + if (props == null) { + props = this.props; + } + return props.forEach((function(_this) { + return function(prop) { + if ((_this.attrs[prop] != null) || (_this.attrs[prop != null ? prop.prop : void 0] != null)) { + if (prop != null ? prop.isColl : void 0) { + return _this.scope.$watchCollection(prop.prop, _this.setMyOptions); + } else { + return _this.scope.$watch(prop, _this.setMyOptions); + } + } + }; + })(this)); + }; + + return CommonOptionsBuilder; + + })(ModelKey); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.options.builders').factory('uiGmapPolylineOptionsBuilder', [ + 'uiGmapCommonOptionsBuilder', function(CommonOptionsBuilder) { + var PolylineOptionsBuilder; + return PolylineOptionsBuilder = (function(superClass) { + extend(PolylineOptionsBuilder, superClass); + + function PolylineOptionsBuilder() { + return PolylineOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + PolylineOptionsBuilder.prototype.buildOpts = function(pathPoints, cachedEval) { + return PolylineOptionsBuilder.__super__.buildOpts.call(this, { + path: pathPoints + }, cachedEval, { + geodesic: false + }); + }; + + return PolylineOptionsBuilder; + + })(CommonOptionsBuilder); + } + ]).factory('uiGmapShapeOptionsBuilder', [ + 'uiGmapCommonOptionsBuilder', function(CommonOptionsBuilder) { + var ShapeOptionsBuilder; + return ShapeOptionsBuilder = (function(superClass) { + extend(ShapeOptionsBuilder, superClass); + + function ShapeOptionsBuilder() { + return ShapeOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + ShapeOptionsBuilder.prototype.buildOpts = function(customOpts, cachedEval, forEachOpts) { + var fill, model; + model = this.getCorrectModel(this.scope); + fill = cachedEval ? cachedEval['fill'] : this.scopeOrModelVal('fill', this.scope, model); + customOpts = angular.extend(customOpts, { + fillColor: fill != null ? fill.color : void 0, + fillOpacity: fill != null ? fill.opacity : void 0 + }); + return ShapeOptionsBuilder.__super__.buildOpts.call(this, customOpts, cachedEval, forEachOpts); + }; + + return ShapeOptionsBuilder; + + })(CommonOptionsBuilder); + } + ]).factory('uiGmapPolygonOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) { + var PolygonOptionsBuilder; + return PolygonOptionsBuilder = (function(superClass) { + extend(PolygonOptionsBuilder, superClass); + + function PolygonOptionsBuilder() { + return PolygonOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + PolygonOptionsBuilder.prototype.buildOpts = function(pathPoints, cachedEval) { + return PolygonOptionsBuilder.__super__.buildOpts.call(this, { + path: pathPoints + }, cachedEval, { + geodesic: false + }); + }; + + return PolygonOptionsBuilder; + + })(ShapeOptionsBuilder); + } + ]).factory('uiGmapRectangleOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) { + var RectangleOptionsBuilder; + return RectangleOptionsBuilder = (function(superClass) { + extend(RectangleOptionsBuilder, superClass); + + function RectangleOptionsBuilder() { + return RectangleOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + RectangleOptionsBuilder.prototype.buildOpts = function(bounds, cachedEval) { + return RectangleOptionsBuilder.__super__.buildOpts.call(this, { + bounds: bounds + }, cachedEval); + }; + + return RectangleOptionsBuilder; + + })(ShapeOptionsBuilder); + } + ]).factory('uiGmapCircleOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) { + var CircleOptionsBuilder; + return CircleOptionsBuilder = (function(superClass) { + extend(CircleOptionsBuilder, superClass); + + function CircleOptionsBuilder() { + return CircleOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + CircleOptionsBuilder.prototype.buildOpts = function(center, radius, cachedEval) { + return CircleOptionsBuilder.__super__.buildOpts.call(this, { + center: center, + radius: radius + }, cachedEval); + }; + + return CircleOptionsBuilder; + + })(ShapeOptionsBuilder); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.options').service('uiGmapMarkerOptions', [ + 'uiGmapLogger', 'uiGmapGmapUtil', function($log, GmapUtil) { + return _.extend(GmapUtil, { + createOptions: function(coords, icon, defaults, map) { + var opts; + if (defaults == null) { + defaults = {}; + } + opts = angular.extend({}, defaults, { + position: defaults.position != null ? defaults.position : GmapUtil.getCoords(coords), + visible: defaults.visible != null ? defaults.visible : GmapUtil.validateCoords(coords) + }); + if ((defaults.icon != null) || (icon != null)) { + opts = angular.extend(opts, { + icon: defaults.icon != null ? defaults.icon : icon + }); + } + if (map != null) { + opts.map = map; + } + return opts; + }, + isLabel: function(options) { + if (options == null) { + return false; + } + return (options.labelContent != null) || (options.labelAnchor != null) || (options.labelClass != null) || (options.labelStyle != null) || (options.labelVisible != null); + } + }); + } + ]); + +}).call(this); +; +/*global _,angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapBasePolyChildModel', [ + 'uiGmapLogger', '$timeout', 'uiGmaparray-sync', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function($log, $timeout, arraySync, GmapUtil, EventsHelper) { + return function(Builder, gFactory) { + var BasePolyChildModel; + return BasePolyChildModel = (function(superClass) { + extend(BasePolyChildModel, superClass); + + BasePolyChildModel.include(GmapUtil); + + function BasePolyChildModel(arg) { + var create, gObjectChangeCb, ref; + this.scope = arg.scope, this.attrs = arg.attrs, this.gMap = arg.gMap, this.defaults = arg.defaults, this.model = arg.model, gObjectChangeCb = arg.gObjectChangeCb, this.isScopeModel = (ref = arg.isScopeModel) != null ? ref : false; + this.clean = bind(this.clean, this); + if (this.isScopeModel) { + this.clonedModel = _.clone(this.model, true); + } + this.isDragging = false; + this.internalEvents = { + dragend: (function(_this) { + return function() { + return _.defer(function() { + return _this.isDragging = false; + }); + }; + })(this), + dragstart: (function(_this) { + return function() { + return _this.isDragging = true; + }; + })(this) + }; + create = (function(_this) { + return function() { + var maybeCachedEval; + if (_this.isDragging) { + return; + } + _this.pathPoints = _this.convertPathPoints(_this.scope.path); + if (_this.gObject != null) { + _this.clean(); + } + if (_this.scope.model != null) { + maybeCachedEval = _this.scope; + } + if (_this.pathPoints.length > 0) { + _this.gObject = gFactory(_this.buildOpts(_this.pathPoints, maybeCachedEval)); + } + if (_this.gObject) { + arraySync(_this.gObject.getPath(), _this.scope, 'path', function(pathPoints) { + _this.pathPoints = pathPoints; + if (gObjectChangeCb != null) { + return gObjectChangeCb(); + } + }); + if (angular.isDefined(_this.scope.events) && angular.isObject(_this.scope.events)) { + _this.listeners = _this.model ? EventsHelper.setEvents(_this.gObject, _this.scope, _this.model) : EventsHelper.setEvents(_this.gObject, _this.scope, _this.scope); + } + return _this.internalListeners = _this.model ? EventsHelper.setEvents(_this.gObject, { + events: _this.internalEvents + }, _this.model) : EventsHelper.setEvents(_this.gObject, { + events: _this.internalEvents + }, _this.scope); + } + }; + })(this); + create(); + this.scope.$watch('path', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue) || !_this.gObject) { + return create(); + } + }; + })(this), true); + if (!this.scope["static"] && angular.isDefined(this.scope.editable)) { + this.scope.$watch('editable', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + newValue = !_this.isFalse(newValue); + return (ref1 = _this.gObject) != null ? ref1.setEditable(newValue) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.draggable)) { + this.scope.$watch('draggable', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + newValue = !_this.isFalse(newValue); + return (ref1 = _this.gObject) != null ? ref1.setDraggable(newValue) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.visible)) { + this.scope.$watch('visible', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + newValue = !_this.isFalse(newValue); + } + return (ref1 = _this.gObject) != null ? ref1.setVisible(newValue) : void 0; + }; + })(this), true); + } + if (angular.isDefined(this.scope.geodesic)) { + this.scope.$watch('geodesic', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + newValue = !_this.isFalse(newValue); + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.weight)) { + this.scope.$watch('stroke.weight', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.color)) { + this.scope.$watch('stroke.color', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.opacity)) { + this.scope.$watch('stroke.opacity', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.icons)) { + this.scope.$watch('icons', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + this.scope.$on('$destroy', (function(_this) { + return function() { + _this.clean(); + return _this.scope = null; + }; + })(this)); + if (angular.isDefined(this.scope.fill) && angular.isDefined(this.scope.fill.color)) { + this.scope.$watch('fill.color', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath())); + } + }; + })(this)); + } + if (angular.isDefined(this.scope.fill) && angular.isDefined(this.scope.fill.opacity)) { + this.scope.$watch('fill.opacity', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath())); + } + }; + })(this)); + } + if (angular.isDefined(this.scope.zIndex)) { + this.scope.$watch('zIndex', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath())); + } + }; + })(this)); + } + } + + BasePolyChildModel.prototype.clean = function() { + var ref; + EventsHelper.removeEvents(this.listeners); + EventsHelper.removeEvents(this.internalListeners); + if ((ref = this.gObject) != null) { + ref.setMap(null); + } + return this.gObject = null; + }; + + return BasePolyChildModel; + + })(Builder); + }; + } + ]); + +}).call(this); +; +/* +@authors +Nicholas McCready - https://twitter.com/nmccready +Original idea from: http://stackoverflow.com/questions/22758950/google-map-drawing-freehand , & + http://jsfiddle.net/YsQdh/88/ + */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapDrawFreeHandChildModel', [ + 'uiGmapLogger', '$q', function($log, $q) { + var drawFreeHand, freeHandMgr; + drawFreeHand = function(map, polys, done) { + var move, poly; + poly = new google.maps.Polyline({ + map: map, + clickable: false + }); + move = google.maps.event.addListener(map, 'mousemove', function(e) { + return poly.getPath().push(e.latLng); + }); + google.maps.event.addListenerOnce(map, 'mouseup', function(e) { + var path; + google.maps.event.removeListener(move); + path = poly.getPath(); + poly.setMap(null); + polys.push(new google.maps.Polygon({ + map: map, + path: path + })); + poly = null; + google.maps.event.clearListeners(map.getDiv(), 'mousedown'); + return done(); + }); + return void 0; + }; + freeHandMgr = function(map1, scope) { + var disableMap, enableMap; + this.map = map1; + disableMap = (function(_this) { + return function() { + var mapOptions; + mapOptions = { + draggable: false, + disableDefaultUI: true, + scrollwheel: false, + disableDoubleClickZoom: false + }; + $log.info('disabling map move'); + return _this.map.setOptions(mapOptions); + }; + })(this); + enableMap = (function(_this) { + return function() { + var mapOptions, ref; + mapOptions = { + draggable: true, + disableDefaultUI: false, + scrollwheel: true, + disableDoubleClickZoom: true + }; + if ((ref = _this.deferred) != null) { + ref.resolve(); + } + return _.defer(function() { + return _this.map.setOptions(_.extend(mapOptions, scope.options)); + }); + }; + })(this); + this.engage = (function(_this) { + return function(polys1) { + _this.polys = polys1; + _this.deferred = $q.defer(); + disableMap(); + $log.info('DrawFreeHandChildModel is engaged (drawing).'); + google.maps.event.addDomListener(_this.map.getDiv(), 'mousedown', function(e) { + return drawFreeHand(_this.map, _this.polys, enableMap); + }); + return _this.deferred.promise; + }; + })(this); + return this; + }; + return freeHandMgr; + } + ]); + +}).call(this); +; +/*global _:true,angular:true,google:true, RichMarker:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapMarkerChildModel', [ + 'uiGmapModelKey', 'uiGmapGmapUtil', 'uiGmapLogger', 'uiGmapEventsHelper', 'uiGmapPropertyAction', 'uiGmapMarkerOptions', 'uiGmapIMarker', 'uiGmapMarkerManager', 'uiGmapPromise', function(ModelKey, GmapUtil, $log, EventsHelper, PropertyAction, MarkerOptions, IMarker, MarkerManager, uiGmapPromise) { + var MarkerChildModel; + MarkerChildModel = (function(superClass) { + var destroy; + + extend(MarkerChildModel, superClass); + + MarkerChildModel.include(GmapUtil); + + MarkerChildModel.include(EventsHelper); + + MarkerChildModel.include(MarkerOptions); + + destroy = function(child) { + if ((child != null ? child.gObject : void 0) != null) { + child.removeEvents(child.externalListeners); + child.removeEvents(child.internalListeners); + if (child != null ? child.gObject : void 0) { + if (child.removeFromManager) { + child.gManager.remove(child.gObject); + } + child.gObject.setMap(null); + return child.gObject = null; + } + } + }; + + function MarkerChildModel(opts) { + this.internalEvents = bind(this.internalEvents, this); + this.setLabelOptions = bind(this.setLabelOptions, this); + this.setOptions = bind(this.setOptions, this); + this.setIcon = bind(this.setIcon, this); + this.setCoords = bind(this.setCoords, this); + this.isNotValid = bind(this.isNotValid, this); + this.maybeSetScopeValue = bind(this.maybeSetScopeValue, this); + this.createMarker = bind(this.createMarker, this); + this.setMyScope = bind(this.setMyScope, this); + this.updateModel = bind(this.updateModel, this); + this.handleModelChanges = bind(this.handleModelChanges, this); + this.destroy = bind(this.destroy, this); + var action, ref, ref1, ref2, ref3, ref4, scope; + scope = opts.scope, this.model = opts.model, this.keys = opts.keys, this.gMap = opts.gMap, this.defaults = (ref = opts.defaults) != null ? ref : {}, this.doClick = opts.doClick, this.gManager = opts.gManager, this.doDrawSelf = (ref1 = opts.doDrawSelf) != null ? ref1 : true, this.trackModel = (ref2 = opts.trackModel) != null ? ref2 : true, this.needRedraw = (ref3 = opts.needRedraw) != null ? ref3 : false, this.isScopeModel = (ref4 = opts.isScopeModel) != null ? ref4 : false; + if (this.isScopeModel) { + this.clonedModel = _.clone(this.model, true); + } + this.deferred = uiGmapPromise.defer(); + _.each(this.keys, (function(_this) { + return function(v, k) { + var keyValue; + keyValue = _this.keys[k]; + if ((keyValue != null) && !_.isFunction(keyValue) && _.isString(keyValue)) { + return _this[k + 'Key'] = keyValue; + } + }; + })(this)); + this.idKey = this.idKeyKey || 'id'; + if (this.model[this.idKey] != null) { + this.id = this.model[this.idKey]; + } + MarkerChildModel.__super__.constructor.call(this, scope); + this.scope.getGMarker = (function(_this) { + return function() { + return _this.gObject; + }; + })(this); + this.firstTime = true; + if (this.trackModel) { + this.scope.model = this.model; + this.scope.$watch('model', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.handleModelChanges(newValue, oldValue); + } + }; + })(this), true); + } else { + action = new PropertyAction((function(_this) { + return function(calledKey) { + if (_.isFunction(calledKey)) { + calledKey = 'all'; + } + if (!_this.firstTime) { + return _this.setMyScope(calledKey, scope); + } + }; + })(this), false); + _.each(this.keys, function(v, k) { + return scope.$watch(k, action.sic(k), true); + }); + } + this.scope.$on('$destroy', (function(_this) { + return function() { + return destroy(_this); + }; + })(this)); + this.createMarker(this.model); + $log.info(this); + } + + MarkerChildModel.prototype.destroy = function(removeFromManager) { + if (removeFromManager == null) { + removeFromManager = true; + } + this.removeFromManager = removeFromManager; + return this.scope.$destroy(); + }; + + MarkerChildModel.prototype.handleModelChanges = function(newValue, oldValue) { + var changes, ctr, len; + changes = this.getChanges(newValue, oldValue, IMarker.keys); + if (!this.firstTime) { + ctr = 0; + len = _.keys(changes).length; + return _.each(changes, (function(_this) { + return function(v, k) { + var doDraw; + ctr += 1; + doDraw = len === ctr; + _this.setMyScope(k, newValue, oldValue, false, true, doDraw); + return _this.needRedraw = true; + }; + })(this)); + } + }; + + MarkerChildModel.prototype.updateModel = function(model) { + if (this.isScopeModel) { + this.clonedModel = _.clone(model, true); + } + return this.setMyScope('all', model, this.model); + }; + + MarkerChildModel.prototype.renderGMarker = function(doDraw, validCb) { + var coords, isSpiderfied, ref; + if (doDraw == null) { + doDraw = true; + } + coords = this.getProp('coords', this.scope, this.model); + if (((ref = this.gManager) != null ? ref.isSpiderfied : void 0) != null) { + isSpiderfied = this.gManager.isSpiderfied(); + } + if (coords != null) { + if (!this.validateCoords(coords)) { + $log.debug('MarkerChild does not have coords yet. They may be defined later.'); + return; + } + if (validCb != null) { + validCb(); + } + if (doDraw && this.gObject) { + this.gManager.add(this.gObject); + } + if (isSpiderfied) { + return this.gManager.markerSpiderfier.spiderListener(this.gObject, window.event); + } + } else { + if (doDraw && this.gObject) { + return this.gManager.remove(this.gObject); + } + } + }; + + MarkerChildModel.prototype.setMyScope = function(thingThatChanged, model, oldModel, isInit, doDraw) { + var justCreated; + if (oldModel == null) { + oldModel = void 0; + } + if (isInit == null) { + isInit = false; + } + if (doDraw == null) { + doDraw = true; + } + if (model == null) { + model = this.model; + } else { + this.model = model; + } + if (!this.gObject) { + this.setOptions(this.scope, doDraw); + justCreated = true; + } + switch (thingThatChanged) { + case 'all': + return _.each(this.keys, (function(_this) { + return function(v, k) { + return _this.setMyScope(k, model, oldModel, isInit, doDraw); + }; + })(this)); + case 'icon': + return this.maybeSetScopeValue({ + gSetter: this.setIcon, + doDraw: doDraw + }); + case 'coords': + return this.maybeSetScopeValue({ + gSetter: this.setCoords, + doDraw: doDraw + }); + case 'options': + if (!justCreated) { + return this.createMarker(model, oldModel, isInit, doDraw); + } + } + }; + + MarkerChildModel.prototype.createMarker = function(model, oldModel, isInit, doDraw) { + if (oldModel == null) { + oldModel = void 0; + } + if (isInit == null) { + isInit = false; + } + if (doDraw == null) { + doDraw = true; + } + this.maybeSetScopeValue({ + gSetter: this.setOptions, + doDraw: doDraw + }); + return this.firstTime = false; + }; + + MarkerChildModel.prototype.maybeSetScopeValue = function(arg) { + var doDraw, gSetter, ref; + gSetter = arg.gSetter, doDraw = (ref = arg.doDraw) != null ? ref : true; + if (gSetter != null) { + gSetter(this.scope, doDraw); + } + if (this.doDrawSelf && doDraw) { + return this.gManager.draw(); + } + }; + + MarkerChildModel.prototype.isNotValid = function(scope, doCheckGmarker) { + var hasIdenticalScopes, hasNoGmarker; + if (doCheckGmarker == null) { + doCheckGmarker = true; + } + hasNoGmarker = !doCheckGmarker ? false : this.gObject === void 0; + hasIdenticalScopes = !this.trackModel ? scope.$id !== this.scope.$id : false; + return hasIdenticalScopes || hasNoGmarker; + }; + + MarkerChildModel.prototype.setCoords = function(scope, doDraw) { + if (doDraw == null) { + doDraw = true; + } + if (this.isNotValid(scope) || (this.gObject == null)) { + return; + } + return this.renderGMarker(doDraw, (function(_this) { + return function() { + var newGValue, newModelVal, oldGValue; + newModelVal = _this.getProp('coords', scope, _this.model); + newGValue = _this.getCoords(newModelVal); + oldGValue = _this.gObject.getPosition(); + if ((oldGValue != null) && (newGValue != null)) { + if (newGValue.lng() === oldGValue.lng() && newGValue.lat() === oldGValue.lat()) { + return; + } + } + _this.gObject.setPosition(newGValue); + return _this.gObject.setVisible(_this.validateCoords(newModelVal)); + }; + })(this)); + }; + + MarkerChildModel.prototype.setIcon = function(scope, doDraw) { + if (doDraw == null) { + doDraw = true; + } + if (this.isNotValid(scope) || (this.gObject == null)) { + return; + } + return this.renderGMarker(doDraw, (function(_this) { + return function() { + var coords, newValue, oldValue; + oldValue = _this.gObject.getIcon(); + newValue = _this.getProp('icon', scope, _this.model); + if (oldValue === newValue) { + return; + } + _this.gObject.setIcon(newValue); + coords = _this.getProp('coords', scope, _this.model); + _this.gObject.setPosition(_this.getCoords(coords)); + return _this.gObject.setVisible(_this.validateCoords(coords)); + }; + })(this)); + }; + + MarkerChildModel.prototype.setOptions = function(scope, doDraw) { + var ref; + if (doDraw == null) { + doDraw = true; + } + if (this.isNotValid(scope, false)) { + return; + } + this.renderGMarker(doDraw, (function(_this) { + return function() { + var _options, coords, icon; + coords = _this.getProp('coords', scope, _this.model); + icon = _this.getProp('icon', scope, _this.model); + _options = _this.getProp('options', scope, _this.model); + _this.opts = _this.createOptions(coords, icon, _options); + if (_this.isLabel(_this.gObject) !== _this.isLabel(_this.opts) && (_this.gObject != null)) { + _this.gManager.remove(_this.gObject); + _this.gObject = void 0; + } + if (_this.gObject != null) { + _this.gObject.setOptions(_this.setLabelOptions(_this.opts)); + } + if (!_this.gObject) { + if (_this.isLabel(_this.opts)) { + _this.gObject = new MarkerWithLabel(_this.setLabelOptions(_this.opts)); + } else if (_this.opts.content) { + _this.gObject = new RichMarker(_this.opts); + _this.gObject.getIcon = _this.gObject.getContent; + _this.gObject.setIcon = _this.gObject.setContent; + } else { + _this.gObject = new google.maps.Marker(_this.opts); + } + _.extend(_this.gObject, { + model: _this.model + }); + } + if (_this.externalListeners) { + _this.removeEvents(_this.externalListeners); + } + if (_this.internalListeners) { + _this.removeEvents(_this.internalListeners); + } + _this.externalListeners = _this.setEvents(_this.gObject, _this.scope, _this.model, ['dragend']); + _this.internalListeners = _this.setEvents(_this.gObject, { + events: _this.internalEvents(), + $evalAsync: function() {} + }, _this.model); + if (_this.id != null) { + return _this.gObject.key = _this.id; + } + }; + })(this)); + if (this.gObject && (this.gObject.getMap() || this.gManager.type !== MarkerManager.type)) { + this.deferred.resolve(this.gObject); + } else { + if (!this.gObject) { + return this.deferred.reject('gObject is null'); + } + if (!(((ref = this.gObject) != null ? ref.getMap() : void 0) && this.gManager.type === MarkerManager.type)) { + $log.debug('gObject has no map yet'); + this.deferred.resolve(this.gObject); + } + } + if (this.model[this.fitKey]) { + return this.gManager.fit(); + } + }; + + MarkerChildModel.prototype.setLabelOptions = function(opts) { + if (opts.labelAnchor) { + opts.labelAnchor = this.getLabelPositionPoint(opts.labelAnchor); + } + return opts; + }; + + MarkerChildModel.prototype.internalEvents = function() { + return { + dragend: (function(_this) { + return function(marker, eventName, model, mousearg) { + var events, modelToSet, newCoords; + modelToSet = _this.trackModel ? _this.scope.model : _this.model; + newCoords = _this.setCoordsFromEvent(_this.modelOrKey(modelToSet, _this.coordsKey), _this.gObject.getPosition()); + modelToSet = _this.setVal(model, _this.coordsKey, newCoords); + events = _this.scope.events; + if ((events != null ? events.dragend : void 0) != null) { + events.dragend(marker, eventName, modelToSet, mousearg); + } + return _this.scope.$apply(); + }; + })(this), + click: (function(_this) { + return function(marker, eventName, model, mousearg) { + var click; + click = _this.getProp('click', _this.scope, _this.model); + if (_this.doClick && angular.isFunction(click)) { + return _this.scope.$evalAsync(click(marker, eventName, _this.model, mousearg)); + } + }; + })(this) + }; + }; + + return MarkerChildModel; + + })(ModelKey); + return MarkerChildModel; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygonChildModel', [ + 'uiGmapBasePolyChildModel', 'uiGmapPolygonOptionsBuilder', function(BaseGen, Builder) { + var PolygonChildModel, base, gFactory; + gFactory = function(opts) { + return new google.maps.Polygon(opts); + }; + base = new BaseGen(Builder, gFactory); + return PolygonChildModel = (function(superClass) { + extend(PolygonChildModel, superClass); + + function PolygonChildModel() { + return PolygonChildModel.__super__.constructor.apply(this, arguments); + } + + return PolygonChildModel; + + })(base); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolylineChildModel', [ + 'uiGmapBasePolyChildModel', 'uiGmapPolylineOptionsBuilder', function(BaseGen, Builder) { + var PolylineChildModel, base, gFactory; + gFactory = function(opts) { + return new google.maps.Polyline(opts); + }; + base = BaseGen(Builder, gFactory); + return PolylineChildModel = (function(superClass) { + extend(PolylineChildModel, superClass); + + function PolylineChildModel() { + return PolylineChildModel.__super__.constructor.apply(this, arguments); + } + + return PolylineChildModel; + + })(base); + } + ]); + +}).call(this); +; +/*global _:true,angular:true,google:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapWindowChildModel', [ + 'uiGmapBaseObject', 'uiGmapGmapUtil', 'uiGmapLogger', '$compile', '$http', '$templateCache', 'uiGmapChromeFixes', 'uiGmapEventsHelper', function(BaseObject, GmapUtil, $log, $compile, $http, $templateCache, ChromeFixes, EventsHelper) { + var WindowChildModel; + WindowChildModel = (function(superClass) { + extend(WindowChildModel, superClass); + + WindowChildModel.include(GmapUtil); + + WindowChildModel.include(EventsHelper); + + function WindowChildModel(opts) { + this.updateModel = bind(this.updateModel, this); + this.destroy = bind(this.destroy, this); + this.remove = bind(this.remove, this); + this.getLatestPosition = bind(this.getLatestPosition, this); + this.hideWindow = bind(this.hideWindow, this); + this.showWindow = bind(this.showWindow, this); + this.handleClick = bind(this.handleClick, this); + this.watchOptions = bind(this.watchOptions, this); + this.watchCoords = bind(this.watchCoords, this); + this.createGWin = bind(this.createGWin, this); + this.watchElement = bind(this.watchElement, this); + this.watchAndDoShow = bind(this.watchAndDoShow, this); + this.doShow = bind(this.doShow, this); + var maybeMarker, ref, ref1, ref2, ref3; + this.model = (ref = opts.model) != null ? ref : {}, this.scope = opts.scope, this.opts = opts.opts, this.isIconVisibleOnClick = opts.isIconVisibleOnClick, this.gMap = opts.gMap, this.markerScope = opts.markerScope, this.element = opts.element, this.needToManualDestroy = (ref1 = opts.needToManualDestroy) != null ? ref1 : false, this.markerIsVisibleAfterWindowClose = (ref2 = opts.markerIsVisibleAfterWindowClose) != null ? ref2 : true, this.isScopeModel = (ref3 = opts.isScopeModel) != null ? ref3 : false; + if (this.isScopeModel) { + this.clonedModel = _.clone(this.model, true); + } + this.getGmarker = function() { + var ref4, ref5; + if (((ref4 = this.markerScope) != null ? ref4['getGMarker'] : void 0) != null) { + return (ref5 = this.markerScope) != null ? ref5.getGMarker() : void 0; + } + }; + this.listeners = []; + this.createGWin(); + maybeMarker = this.getGmarker(); + if (maybeMarker != null) { + maybeMarker.setClickable(true); + } + this.watchElement(); + this.watchOptions(); + this.watchCoords(); + this.watchAndDoShow(); + this.scope.$on('$destroy', (function(_this) { + return function() { + return _this.destroy(); + }; + })(this)); + $log.info(this); + } + + WindowChildModel.prototype.doShow = function(wasOpen) { + if (this.scope.show === true || wasOpen) { + return this.showWindow(); + } else { + return this.hideWindow(); + } + }; + + WindowChildModel.prototype.watchAndDoShow = function() { + if (this.model.show != null) { + this.scope.show = this.model.show; + } + this.scope.$watch('show', this.doShow, true); + return this.doShow(); + }; + + WindowChildModel.prototype.watchElement = function() { + return this.scope.$watch((function(_this) { + return function() { + var ref, wasOpen; + if (!(_this.element || _this.html)) { + return; + } + if (_this.html !== _this.element.html() && _this.gObject) { + if ((ref = _this.opts) != null) { + ref.content = void 0; + } + wasOpen = _this.gObject.isOpen(); + _this.remove(); + return _this.createGWin(wasOpen); + } + }; + })(this)); + }; + + WindowChildModel.prototype.createGWin = function(isOpen) { + var _opts, defaults, maybeMarker, ref, ref1; + if (isOpen == null) { + isOpen = false; + } + maybeMarker = this.getGmarker(); + defaults = {}; + if (this.opts != null) { + if (this.scope.coords) { + this.opts.position = this.getCoords(this.scope.coords); + } + defaults = this.opts; + } + if (this.element) { + this.html = _.isObject(this.element) ? this.element.html() : this.element; + } + _opts = this.scope.options ? this.scope.options : defaults; + this.opts = this.createWindowOptions(maybeMarker, this.markerScope || this.scope, this.html, _opts); + if (this.opts != null) { + if (!this.gObject) { + if (this.opts.boxClass && (window.InfoBox && typeof window.InfoBox === 'function')) { + this.gObject = new window.InfoBox(this.opts); + } else { + this.gObject = new google.maps.InfoWindow(this.opts); + } + this.listeners.push(google.maps.event.addListener(this.gObject, 'domready', function() { + return ChromeFixes.maybeRepaint(this.content); + })); + this.listeners.push(google.maps.event.addListener(this.gObject, 'closeclick', (function(_this) { + return function() { + if (maybeMarker) { + maybeMarker.setAnimation(_this.oldMarkerAnimation); + if (_this.markerIsVisibleAfterWindowClose) { + _.delay(function() { + maybeMarker.setVisible(false); + return maybeMarker.setVisible(_this.markerIsVisibleAfterWindowClose); + }, 250); + } + } + _this.gObject.close(); + _this.model.show = false; + if (_this.scope.closeClick != null) { + return _this.scope.$evalAsync(_this.scope.closeClick()); + } else { + return _this.scope.$evalAsync(); + } + }; + })(this))); + } + this.gObject.setContent(this.opts.content); + this.handleClick(((ref = this.scope) != null ? (ref1 = ref.options) != null ? ref1.forceClick : void 0 : void 0) || isOpen); + return this.doShow(this.gObject.isOpen()); + } + }; + + WindowChildModel.prototype.watchCoords = function() { + var scope; + scope = this.markerScope != null ? this.markerScope : this.scope; + return scope.$watch('coords', (function(_this) { + return function(newValue, oldValue) { + var pos; + if (newValue !== oldValue) { + if (newValue == null) { + _this.hideWindow(); + } else if (!_this.validateCoords(newValue)) { + $log.error("WindowChildMarker cannot render marker as scope.coords as no position on marker: " + (JSON.stringify(_this.model))); + return; + } + pos = _this.getCoords(newValue); + _this.doShow(); + _this.gObject.setPosition(pos); + if (_this.opts) { + return _this.opts.position = pos; + } + } + }; + })(this), true); + }; + + WindowChildModel.prototype.watchOptions = function() { + return this.scope.$watch('options', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + _this.opts = newValue; + if (_this.gObject != null) { + _this.gObject.setOptions(_this.opts); + if ((_this.opts.visible != null) && _this.opts.visible) { + return _this.showWindow(); + } else if (_this.opts.visible != null) { + return _this.hideWindow(); + } + } + } + }; + })(this), true); + }; + + WindowChildModel.prototype.handleClick = function(forceClick) { + var click, maybeMarker; + if (this.gObject == null) { + return; + } + maybeMarker = this.getGmarker(); + click = (function(_this) { + return function() { + if (_this.gObject == null) { + _this.createGWin(); + } + _this.showWindow(); + if (maybeMarker != null) { + _this.initialMarkerVisibility = maybeMarker.getVisible(); + _this.oldMarkerAnimation = maybeMarker.getAnimation(); + return maybeMarker.setVisible(_this.isIconVisibleOnClick); + } + }; + })(this); + if (forceClick) { + click(); + } + if (maybeMarker) { + return this.listeners = this.listeners.concat(this.setEvents(maybeMarker, { + events: { + click: click + } + }, this.model)); + } + }; + + WindowChildModel.prototype.showWindow = function() { + var compiled, show, templateScope; + if (this.gObject == null) { + return; + } + templateScope = null; + show = (function(_this) { + return function() { + var isOpen, maybeMarker, pos; + if (!_this.gObject.isOpen()) { + maybeMarker = _this.getGmarker(); + if ((_this.gObject != null) && (_this.gObject.getPosition != null)) { + pos = _this.gObject.getPosition(); + } + if (maybeMarker) { + pos = maybeMarker.getPosition(); + } + if (!pos) { + return; + } + _this.gObject.open(_this.gMap, maybeMarker); + isOpen = _this.gObject.isOpen(); + if (_this.model.show !== isOpen) { + return _this.model.show = isOpen; + } + } + }; + })(this); + if (this.scope.templateUrl) { + $http.get(this.scope.templateUrl, { + cache: $templateCache + }).then((function(_this) { + return function(content) { + var compiled; + templateScope = _this.scope.$new(); + if (angular.isDefined(_this.scope.templateParameter)) { + templateScope.parameter = _this.scope.templateParameter; + } + compiled = $compile(content.data)(templateScope); + _this.gObject.setContent(compiled[0]); + return show(); + }; + })(this)); + } else if (this.scope.template) { + templateScope = this.scope.$new(); + if (angular.isDefined(this.scope.templateParameter)) { + templateScope.parameter = this.scope.templateParameter; + } + compiled = $compile(this.scope.template)(templateScope); + this.gObject.setContent(compiled[0]); + show(); + } else { + show(); + } + return this.scope.$on('destroy', function() { + return templateScope.$destroy(); + }); + }; + + WindowChildModel.prototype.hideWindow = function() { + if ((this.gObject != null) && this.gObject.isOpen()) { + return this.gObject.close(); + } + }; + + WindowChildModel.prototype.getLatestPosition = function(overridePos) { + var maybeMarker; + maybeMarker = this.getGmarker(); + if ((this.gObject != null) && (maybeMarker != null) && !overridePos) { + return this.gObject.setPosition(maybeMarker.getPosition()); + } else { + if (overridePos) { + return this.gObject.setPosition(overridePos); + } + } + }; + + WindowChildModel.prototype.remove = function() { + this.hideWindow(); + this.removeEvents(this.listeners); + this.listeners.length = 0; + delete this.gObject; + return delete this.opts; + }; + + WindowChildModel.prototype.destroy = function(manualOverride) { + var ref; + if (manualOverride == null) { + manualOverride = false; + } + this.remove(); + if (((this.scope != null) && !((ref = this.scope) != null ? ref.$$destroyed : void 0)) && (this.needToManualDestroy || manualOverride)) { + return this.scope.$destroy(); + } + }; + + WindowChildModel.prototype.updateModel = function(model) { + if (this.isScopeModel) { + this.clonedModel = _.clone(model, true); + } + return _.extend(this.model, this.clonedModel || model); + }; + + return WindowChildModel; + + })(BaseObject); + return WindowChildModel; + } + ]); + +}).call(this); +; +/*global _, angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapBasePolysParentModel', [ + '$timeout', 'uiGmapLogger', 'uiGmapModelKey', 'uiGmapModelsWatcher', 'uiGmapPropMap', 'uiGmap_async', 'uiGmapPromise', 'uiGmapFitHelper', function($timeout, $log, ModelKey, ModelsWatcher, PropMap, _async, uiGmapPromise, FitHelper) { + return function(IPoly, PolyChildModel, gObjectName) { + var BasePolysParentModel; + return BasePolysParentModel = (function(superClass) { + extend(BasePolysParentModel, superClass); + + BasePolysParentModel.include(ModelsWatcher); + + function BasePolysParentModel(scope, element, attrs, gMap1, defaults) { + this.element = element; + this.attrs = attrs; + this.gMap = gMap1; + this.defaults = defaults; + this.maybeFit = bind(this.maybeFit, this); + this.createChild = bind(this.createChild, this); + this.pieceMeal = bind(this.pieceMeal, this); + this.createAllNew = bind(this.createAllNew, this); + this.watchIdKey = bind(this.watchIdKey, this); + this.createChildScopes = bind(this.createChildScopes, this); + this.watchDestroy = bind(this.watchDestroy, this); + this.onDestroy = bind(this.onDestroy, this); + this.rebuildAll = bind(this.rebuildAll, this); + this.doINeedToWipe = bind(this.doINeedToWipe, this); + this.watchModels = bind(this.watchModels, this); + BasePolysParentModel.__super__.constructor.call(this, scope); + this["interface"] = IPoly; + this.$log = $log; + this.plurals = new PropMap(); + _.each(IPoly.scopeKeys, (function(_this) { + return function(name) { + return _this[name + 'Key'] = void 0; + }; + })(this)); + this.models = void 0; + this.firstTime = true; + this.$log.info(this); + this.createChildScopes(); + } + + BasePolysParentModel.prototype.watchModels = function(scope) { + + /* + This was watchCollection but not all model changes were being caught. + TODO: Make the directive flexible in overriding whether we watch models (and depth) via watch or watchColleciton. + */ + return scope.$watch('models', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + if (_this.doINeedToWipe(newValue) || scope.doRebuildAll) { + return _this.rebuildAll(scope, true, true); + } else { + return _this.createChildScopes(false); + } + } + }; + })(this), true); + }; + + BasePolysParentModel.prototype.doINeedToWipe = function(newValue) { + var newValueIsEmpty; + newValueIsEmpty = newValue != null ? newValue.length === 0 : true; + return this.plurals.length > 0 && newValueIsEmpty; + }; + + BasePolysParentModel.prototype.rebuildAll = function(scope, doCreate, doDelete) { + return this.onDestroy(doDelete).then((function(_this) { + return function() { + if (doCreate) { + return _this.createChildScopes(); + } + }; + })(this)); + }; + + BasePolysParentModel.prototype.onDestroy = function() { + BasePolysParentModel.__super__.onDestroy.call(this, this.scope); + return _async.promiseLock(this, uiGmapPromise.promiseTypes["delete"], void 0, void 0, (function(_this) { + return function() { + return _async.each(_this.plurals.values(), function(child) { + return child.destroy(true); + }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() { + var ref; + return (ref = _this.plurals) != null ? ref.removeAll() : void 0; + }); + }; + })(this)); + }; + + BasePolysParentModel.prototype.watchDestroy = function(scope) { + return scope.$on('$destroy', (function(_this) { + return function() { + return _this.rebuildAll(scope, false, true); + }; + })(this)); + }; + + BasePolysParentModel.prototype.createChildScopes = function(isCreatingFromScratch) { + if (isCreatingFromScratch == null) { + isCreatingFromScratch = true; + } + if (angular.isUndefined(this.scope.models)) { + this.$log.error("No models to create " + gObjectName + "s from! I Need direct models!"); + return; + } + if ((this.gMap == null) || (this.scope.models == null)) { + return; + } + this.watchIdKey(this.scope); + if (isCreatingFromScratch) { + return this.createAllNew(this.scope, false); + } else { + return this.pieceMeal(this.scope, false); + } + }; + + BasePolysParentModel.prototype.watchIdKey = function(scope) { + this.setIdKey(scope); + return scope.$watch('idKey', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue && (newValue == null)) { + _this.idKey = newValue; + return _this.rebuildAll(scope, true, true); + } + }; + })(this)); + }; + + BasePolysParentModel.prototype.createAllNew = function(scope, isArray) { + var maybeCanceled; + if (isArray == null) { + isArray = false; + } + this.models = scope.models; + if (this.firstTime) { + this.watchModels(scope); + this.watchDestroy(scope); + } + if (this.didQueueInitPromise(this, scope)) { + return; + } + maybeCanceled = null; + return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return _async.map(scope.models, function(model) { + var child; + child = _this.createChild(model, _this.gMap); + if (maybeCanceled) { + $log.debug('createNew should fall through safely'); + child.isEnabled = false; + } + maybeCanceled; + return child.pathPoints.getArray(); + }, _async.chunkSizeFrom(scope.chunk)).then(function(pathPoints) { + _this.maybeFit(pathPoints); + return _this.firstTime = false; + }); + }; + })(this)); + }; + + BasePolysParentModel.prototype.pieceMeal = function(scope, isArray) { + var maybeCanceled, payload; + if (isArray == null) { + isArray = true; + } + if (scope.$$destroyed) { + return; + } + maybeCanceled = null; + payload = null; + this.models = scope.models; + if ((scope != null) && this.modelsLength() && this.plurals.length) { + return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return uiGmapPromise.promise(function() { + return _this.figureOutState(_this.idKey, scope, _this.plurals, _this.modelKeyComparison); + }).then(function(state) { + payload = state; + if (payload.updates.length) { + _async.each(payload.updates, function(obj) { + _.extend(obj.child.scope, obj.model); + return obj.child.model = obj.model; + }); + } + return _async.each(payload.removals, function(child) { + if (child != null) { + child.destroy(); + _this.plurals.remove(child.model[_this.idKey]); + return maybeCanceled; + } + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + return _async.each(payload.adds, function(modelToAdd) { + if (maybeCanceled) { + $log.debug('pieceMeal should fall through safely'); + } + _this.createChild(modelToAdd, _this.gMap); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)).then(function() { + return _this.maybeFit(); + }); + }); + }; + })(this)); + } else { + this.inProgress = false; + return this.rebuildAll(this.scope, true, true); + } + }; + + BasePolysParentModel.prototype.createChild = function(model, gMap) { + var child, childScope; + childScope = this.scope.$new(false); + this.setChildScope(IPoly.scopeKeys, childScope, model); + childScope.$watch('model', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.setChildScope(IPoly.scopeKeys, childScope, newValue); + } + }; + })(this), true); + childScope["static"] = this.scope["static"]; + child = new PolyChildModel({ + isScopeModel: true, + scope: childScope, + attrs: this.attrs, + gMap: gMap, + defaults: this.defaults, + model: model, + gObjectChangeCb: (function(_this) { + return function() { + return _this.maybeFit(); + }; + })(this) + }); + if (model[this.idKey] == null) { + this.$log.error(gObjectName + " model has no id to assign a child to.\nThis is required for performance. Please assign id,\nor redirect id to a different key."); + return; + } + this.plurals.put(model[this.idKey], child); + return child; + }; + + BasePolysParentModel.prototype.maybeFit = function(pathPoints) { + if (pathPoints == null) { + pathPoints = this.plurals.map(function(p) { + return p.pathPoints; + }); + } + if (this.scope.fit) { + pathPoints = _.flatten(pathPoints); + return FitHelper.fit(pathPoints, this.gMap); + } + }; + + return BasePolysParentModel; + + })(ModelKey); + }; + } + ]); + +}).call(this); +; +/*globals angular, _, google */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapCircleParentModel', [ + 'uiGmapLogger', '$timeout', 'uiGmapGmapUtil', 'uiGmapEventsHelper', 'uiGmapCircleOptionsBuilder', function($log, $timeout, GmapUtil, EventsHelper, Builder) { + var CircleParentModel, _settingFromDirective; + _settingFromDirective = function(scope, fn) { + scope.settingFromDirective = true; + fn(); + return $timeout(function() { + return scope.settingFromDirective = false; + }); + }; + return CircleParentModel = (function(superClass) { + extend(CircleParentModel, superClass); + + CircleParentModel.include(GmapUtil); + + CircleParentModel.include(EventsHelper); + + function CircleParentModel(scope, element, attrs, gMap, DEFAULTS) { + var clean, gObject, lastRadius; + this.attrs = attrs; + this.gMap = gMap; + this.DEFAULTS = DEFAULTS; + this.scope = scope; + lastRadius = null; + clean = (function(_this) { + return function() { + lastRadius = null; + if (_this.listeners != null) { + _this.removeEvents(_this.listeners); + return _this.listeners = void 0; + } + }; + })(this); + gObject = new google.maps.Circle(this.buildOpts(GmapUtil.getCoords(scope.center), scope.radius)); + this.setMyOptions = (function(_this) { + return function(newVals, oldVals) { + if (scope.settingFromDirective) { + return; + } + if (!(_.isEqual(newVals, oldVals) && newVals === oldVals && ((newVals != null) && (oldVals != null) ? newVals.coordinates === oldVals.coordinates : true))) { + return gObject.setOptions(_this.buildOpts(GmapUtil.getCoords(scope.center), scope.radius)); + } + }; + })(this); + this.props = this.props.concat([ + { + prop: 'center', + isColl: true + }, { + prop: 'fill', + isColl: true + }, 'radius', 'zIndex' + ]); + this.watchProps(); + if (this.scope.control != null) { + this.scope.control.getCircle = function() { + return gObject; + }; + } + clean(); + this.listeners = this.setEvents(gObject, scope, scope, ['radius_changed']) || []; + this.listeners.push(google.maps.event.addListener(gObject, 'radius_changed', function() { + + /* + possible google bug, and or because a circle has two radii + radius_changed appears to fire twice (original and new) which is not too helpful + therefore we will check for radius changes manually and bail out if nothing has changed + */ + var newRadius, work; + newRadius = gObject.getRadius(); + if (newRadius === lastRadius) { + return; + } + lastRadius = newRadius; + work = function() { + return _settingFromDirective(scope, function() { + var ref, ref1; + if (newRadius !== scope.radius) { + scope.radius = newRadius; + } + if (((ref = scope.events) != null ? ref.radius_changed : void 0) && _.isFunction((ref1 = scope.events) != null ? ref1.radius_changed : void 0)) { + return scope.events.radius_changed(gObject, 'radius_changed', scope, arguments); + } + }); + }; + if (!angular.mock) { + return scope.$evalAsync(function() { + return work(); + }); + } else { + return work(); + } + })); + this.listeners.push(google.maps.event.addListener(gObject, 'center_changed', function() { + return scope.$evalAsync(function() { + return _settingFromDirective(scope, function() { + if (angular.isDefined(scope.center.type)) { + scope.center.coordinates[1] = gObject.getCenter().lat(); + return scope.center.coordinates[0] = gObject.getCenter().lng(); + } else { + scope.center.latitude = gObject.getCenter().lat(); + return scope.center.longitude = gObject.getCenter().lng(); + } + }); + }); + })); + scope.$on('$destroy', function() { + clean(); + return gObject.setMap(null); + }); + $log.info(this); + } + + return CircleParentModel; + + })(Builder); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapDrawingManagerParentModel', [ + 'uiGmapLogger', '$timeout', 'uiGmapBaseObject', 'uiGmapEventsHelper', function($log, $timeout, BaseObject, EventsHelper) { + var DrawingManagerParentModel; + return DrawingManagerParentModel = (function(superClass) { + extend(DrawingManagerParentModel, superClass); + + DrawingManagerParentModel.include(EventsHelper); + + function DrawingManagerParentModel(scope, element, attrs, map) { + var gObject, listeners; + this.scope = scope; + this.attrs = attrs; + this.map = map; + gObject = new google.maps.drawing.DrawingManager(this.scope.options); + gObject.setMap(this.map); + listeners = void 0; + if (this.scope.control != null) { + this.scope.control.getDrawingManager = function() { + return gObject; + }; + } + if (!this.scope["static"] && this.scope.options) { + this.scope.$watch('options', function(newValue) { + return gObject != null ? gObject.setOptions(newValue) : void 0; + }, true); + } + if (this.scope.events != null) { + listeners = this.setEvents(gObject, this.scope, this.scope); + this.scope.$watch('events', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue)) { + if (listeners != null) { + _this.removeEvents(listeners); + } + return listeners = _this.setEvents(gObject, _this.scope, _this.scope); + } + }; + })(this)); + } + this.scope.$on('$destroy', (function(_this) { + return function() { + if (listeners != null) { + _this.removeEvents(listeners); + } + gObject.setMap(null); + return gObject = null; + }; + })(this)); + } + + return DrawingManagerParentModel; + + })(BaseObject); + } + ]); + +}).call(this); +; +/* + - interface for all markers to derrive from + - to enforce a minimum set of requirements + - attributes + - coords + - icon + - implementation needed on watches + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapIMarkerParentModel", [ + "uiGmapModelKey", "uiGmapLogger", function(ModelKey, Logger) { + var IMarkerParentModel; + IMarkerParentModel = (function(superClass) { + extend(IMarkerParentModel, superClass); + + IMarkerParentModel.prototype.DEFAULTS = {}; + + function IMarkerParentModel(scope1, element, attrs, map) { + this.scope = scope1; + this.element = element; + this.attrs = attrs; + this.map = map; + this.onWatch = bind(this.onWatch, this); + this.watch = bind(this.watch, this); + this.validateScope = bind(this.validateScope, this); + IMarkerParentModel.__super__.constructor.call(this, this.scope); + this.$log = Logger; + if (!this.validateScope(this.scope)) { + throw new String("Unable to construct IMarkerParentModel due to invalid scope"); + } + this.doClick = angular.isDefined(this.attrs.click); + if (this.scope.options != null) { + this.DEFAULTS = this.scope.options; + } + this.watch('coords', this.scope); + this.watch('icon', this.scope); + this.watch('options', this.scope); + this.scope.$on("$destroy", (function(_this) { + return function() { + return _this.onDestroy(_this.scope); + }; + })(this)); + } + + IMarkerParentModel.prototype.validateScope = function(scope) { + var ret; + if (scope == null) { + this.$log.error(this.constructor.name + ": invalid scope used"); + return false; + } + ret = scope.coords != null; + if (!ret) { + this.$log.error(this.constructor.name + ": no valid coords attribute found"); + return false; + } + return ret; + }; + + IMarkerParentModel.prototype.watch = function(propNameToWatch, scope, equalityCheck) { + if (equalityCheck == null) { + equalityCheck = true; + } + return scope.$watch(propNameToWatch, (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue)) { + return _this.onWatch(propNameToWatch, scope, newValue, oldValue); + } + }; + })(this), equalityCheck); + }; + + IMarkerParentModel.prototype.onWatch = function(propNameToWatch, scope, newValue, oldValue) {}; + + return IMarkerParentModel; + + })(ModelKey); + return IMarkerParentModel; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapIWindowParentModel", [ + "uiGmapModelKey", "uiGmapGmapUtil", "uiGmapLogger", function(ModelKey, GmapUtil, Logger) { + var IWindowParentModel; + return IWindowParentModel = (function(superClass) { + extend(IWindowParentModel, superClass); + + IWindowParentModel.include(GmapUtil); + + function IWindowParentModel(scope, element, attrs, ctrls, $timeout, $compile, $http, $templateCache) { + IWindowParentModel.__super__.constructor.call(this, scope); + this.$log = Logger; + this.$timeout = $timeout; + this.$compile = $compile; + this.$http = $http; + this.$templateCache = $templateCache; + this.DEFAULTS = {}; + if (scope.options != null) { + this.DEFAULTS = scope.options; + } + } + + IWindowParentModel.prototype.getItem = function(scope, modelsPropToIterate, index) { + if (modelsPropToIterate === 'models') { + return scope[modelsPropToIterate][index]; + } + return scope[modelsPropToIterate].get(index); + }; + + return IWindowParentModel; + + })(ModelKey); + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapLayerParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', '$timeout', function(BaseObject, Logger, $timeout) { + var LayerParentModel; + LayerParentModel = (function(superClass) { + extend(LayerParentModel, superClass); + + function LayerParentModel(scope, element, attrs, gMap, onLayerCreated, $log) { + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.gMap = gMap; + this.onLayerCreated = onLayerCreated != null ? onLayerCreated : void 0; + this.$log = $log != null ? $log : Logger; + this.createGoogleLayer = bind(this.createGoogleLayer, this); + if (this.attrs.type == null) { + this.$log.info('type attribute for the layer directive is mandatory. Layer creation aborted!!'); + return; + } + this.createGoogleLayer(); + this.doShow = true; + if (angular.isDefined(this.attrs.show)) { + this.doShow = this.scope.show; + } + if (this.doShow && (this.gMap != null)) { + this.gObject.setMap(this.gMap); + } + this.scope.$watch('show', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + _this.doShow = newValue; + if (newValue) { + return _this.gObject.setMap(_this.gMap); + } else { + return _this.gObject.setMap(null); + } + } + }; + })(this), true); + this.scope.$watch('options', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue && _this.doShow) { + return _this.gObject.setOptions(newValue); + } + }; + })(this), true); + this.scope.$on('$destroy', (function(_this) { + return function() { + return _this.gObject.setMap(null); + }; + })(this)); + } + + LayerParentModel.prototype.createGoogleLayer = function() { + var base; + if (this.attrs.options == null) { + this.gObject = this.attrs.namespace === void 0 ? new google.maps[this.attrs.type]() : new google.maps[this.attrs.namespace][this.attrs.type](); + } else { + this.gObject = this.attrs.namespace === void 0 ? new google.maps[this.attrs.type](this.scope.options) : new google.maps[this.attrs.namespace][this.attrs.type](this.scope.options); + } + if ((this.gObject != null) && this.doShow) { + this.gObject.setMap(this.gMap); + } + if ((this.gObject != null) && (this.onLayerCreated != null)) { + return typeof (base = this.onLayerCreated(this.scope, this.gObject)) === "function" ? base(this.gObject) : void 0; + } + }; + + return LayerParentModel; + + })(BaseObject); + return LayerParentModel; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapMapTypeParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', function(BaseObject, Logger) { + var MapTypeParentModel; + MapTypeParentModel = (function(superClass) { + extend(MapTypeParentModel, superClass); + + function MapTypeParentModel(scope, element, attrs, gMap, $log, childModel, propMap) { + var watchChildModelOptions, watchChildModelShow, watchOptions, watchShow; + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.gMap = gMap; + this.$log = $log != null ? $log : Logger; + this.childModel = childModel; + this.propMap = propMap; + this.refreshShown = bind(this.refreshShown, this); + this.hideOverlay = bind(this.hideOverlay, this); + this.showOverlay = bind(this.showOverlay, this); + this.refreshMapType = bind(this.refreshMapType, this); + this.createMapType = bind(this.createMapType, this); + if (this.scope.options == null) { + this.$log.info('options attribute for the map-type directive is mandatory. Map type creation aborted!!'); + return; + } + this.id = this.gMap.overlayMapTypesCount = this.gMap.overlayMapTypesCount + 1 || 0; + this.doShow = true; + this.createMapType(); + this.refreshShown(); + if (this.doShow && (this.gMap != null)) { + this.showOverlay(); + } + watchChildModelShow = (function(_this) { + return function() { + return _this.childModel[_this.attrs.show]; + }; + })(this); + watchShow = this.childModel ? watchChildModelShow : 'show'; + this.scope.$watch(watchShow, (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + _this.doShow = newValue; + if (newValue) { + return _this.showOverlay(); + } else { + return _this.hideOverlay(); + } + } + }; + })(this)); + watchChildModelOptions = (function(_this) { + return function() { + return _this.childModel[_this.attrs.options]; + }; + })(this); + watchOptions = this.childModel ? watchChildModelOptions : 'options'; + this.scope.$watchCollection(watchOptions, (function(_this) { + return function(newValue, oldValue) { + var different, mapTypeProps; + if (!_.isEqual(newValue, oldValue)) { + mapTypeProps = ['tileSize', 'maxZoom', 'minZoom', 'name', 'alt']; + different = _.some(mapTypeProps, function(prop) { + return !oldValue || !newValue || !_.isEqual(newValue[prop], oldValue[prop]); + }); + if (different) { + return _this.refreshMapType(); + } + } + }; + })(this)); + if (angular.isDefined(this.attrs.refresh)) { + this.scope.$watch('refresh', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue)) { + return _this.refreshMapType(); + } + }; + })(this), true); + } + this.scope.$on('$destroy', (function(_this) { + return function() { + _this.hideOverlay(); + return _this.mapType = null; + }; + })(this)); + } + + MapTypeParentModel.prototype.createMapType = function() { + var id, idAttr, mapType; + mapType = this.childModel ? (this.attrs.options ? this.childModel[this.attrs.options] : this.childModel) : this.scope.options; + if (mapType.getTile != null) { + this.mapType = mapType; + } else if (mapType.getTileUrl != null) { + this.mapType = new google.maps.ImageMapType(mapType); + } else { + this.$log.info('options should provide either getTile or getTileUrl methods. Map type creation aborted!!'); + return; + } + idAttr = this.attrs.id ? (this.childModel ? this.attrs.id : 'id') : void 0; + id = idAttr ? (this.childModel ? this.childModel[idAttr] : this.scope[idAttr]) : void 0; + if (id) { + this.gMap.mapTypes.set(id, this.mapType); + if (!angular.isDefined(this.attrs.show)) { + this.doShow = false; + } + } + this.mapType.layerId = this.id; + if (this.childModel && angular.isDefined(this.scope.index)) { + return this.propMap.put(this.mapType.layerId, this.scope.index); + } + }; + + MapTypeParentModel.prototype.refreshMapType = function() { + this.hideOverlay(); + this.mapType = null; + this.createMapType(); + if (this.doShow && (this.gMap != null)) { + return this.showOverlay(); + } + }; + + MapTypeParentModel.prototype.showOverlay = function() { + var found; + if (angular.isDefined(this.scope.index)) { + found = false; + if (this.gMap.overlayMapTypes.getLength()) { + this.gMap.overlayMapTypes.forEach((function(_this) { + return function(mapType, index) { + var layerIndex; + if (!found) { + layerIndex = _this.propMap.get(mapType.layerId.toString()); + if (layerIndex > _this.scope.index || !angular.isDefined(layerIndex)) { + found = true; + _this.gMap.overlayMapTypes.insertAt(index, _this.mapType); + } + } + }; + })(this)); + if (!found) { + return this.gMap.overlayMapTypes.push(this.mapType); + } + } else { + return this.gMap.overlayMapTypes.push(this.mapType); + } + } else { + return this.gMap.overlayMapTypes.push(this.mapType); + } + }; + + MapTypeParentModel.prototype.hideOverlay = function() { + var found; + found = false; + return this.gMap.overlayMapTypes.forEach((function(_this) { + return function(mapType, index) { + if (!found && mapType.layerId === _this.id) { + found = true; + _this.gMap.overlayMapTypes.removeAt(index); + } + }; + })(this)); + }; + + MapTypeParentModel.prototype.refreshShown = function() { + return this.doShow = angular.isDefined(this.attrs.show) ? (this.childModel ? this.childModel[this.attrs.show] : this.scope.show) : true; + }; + + return MapTypeParentModel; + + })(BaseObject); + return MapTypeParentModel; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapMapTypesParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapMapTypeParentModel', 'uiGmapPropMap', function(BaseObject, Logger, MapTypeParentModel, PropMap) { + var MapTypesParentModel; + MapTypesParentModel = (function(superClass) { + extend(MapTypesParentModel, superClass); + + function MapTypesParentModel(scope, element, attrs, gMap, $log) { + var pMap; + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.gMap = gMap; + this.$log = $log != null ? $log : Logger; + if (this.attrs.mapTypes == null) { + this.$log.info('layers attribute for the map-types directive is mandatory. Map types creation aborted!!'); + return; + } + pMap = new PropMap; + this.scope.mapTypes.forEach((function(_this) { + return function(l, i) { + var childScope, mockAttr; + mockAttr = { + options: _this.scope.options, + show: _this.scope.show, + refresh: _this.scope.refresh + }; + childScope = _this.scope.$new(); + childScope.index = i; + new MapTypeParentModel(childScope, null, mockAttr, _this.gMap, _this.$log, l, pMap); + }; + })(this)); + } + + return MapTypesParentModel; + + })(BaseObject); + return MapTypesParentModel; + } + ]); + +}).call(this); +; +/*global _:true,angular:true, */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapMarkersParentModel", [ + "uiGmapIMarkerParentModel", "uiGmapModelsWatcher", "uiGmapPropMap", "uiGmapMarkerChildModel", "uiGmap_async", "uiGmapClustererMarkerManager", "uiGmapMarkerManager", "$timeout", "uiGmapIMarker", "uiGmapPromise", "uiGmapGmapUtil", "uiGmapLogger", "uiGmapSpiderfierMarkerManager", function(IMarkerParentModel, ModelsWatcher, PropMap, MarkerChildModel, _async, ClustererMarkerManager, MarkerManager, $timeout, IMarker, uiGmapPromise, GmapUtil, $log, SpiderfierMarkerManager) { + var MarkersParentModel, _setPlurals; + _setPlurals = function(val, objToSet) { + objToSet.plurals = new PropMap(); + objToSet.scope.plurals = objToSet.plurals; + return objToSet; + }; + MarkersParentModel = (function(superClass) { + extend(MarkersParentModel, superClass); + + MarkersParentModel.include(GmapUtil); + + MarkersParentModel.include(ModelsWatcher); + + function MarkersParentModel(scope, element, attrs, map) { + this.maybeExecMappedEvent = bind(this.maybeExecMappedEvent, this); + this.onDestroy = bind(this.onDestroy, this); + this.newChildMarker = bind(this.newChildMarker, this); + this.pieceMeal = bind(this.pieceMeal, this); + this.rebuildAll = bind(this.rebuildAll, this); + this.createAllNew = bind(this.createAllNew, this); + this.bindToTypeEvents = bind(this.bindToTypeEvents, this); + this.createChildScopes = bind(this.createChildScopes, this); + this.validateScope = bind(this.validateScope, this); + this.onWatch = bind(this.onWatch, this); + MarkersParentModel.__super__.constructor.call(this, scope, element, attrs, map); + this["interface"] = IMarker; + _setPlurals(new PropMap(), this); + this.scope.pluralsUpdate = { + updateCtr: 0 + }; + this.$log.info(this); + this.doRebuildAll = this.scope.doRebuildAll != null ? this.scope.doRebuildAll : false; + this.setIdKey(this.scope); + this.scope.$watch('doRebuildAll', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.doRebuildAll = newValue; + } + }; + })(this)); + if (!this.modelsLength()) { + this.modelsRendered = false; + } + this.scope.$watch('models', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue) || !_this.modelsRendered) { + if (newValue.length === 0 && oldValue.length === 0) { + return; + } + _this.modelsRendered = true; + return _this.onWatch('models', _this.scope, newValue, oldValue); + } + }; + })(this), !this.isTrue(attrs.modelsbyref)); + this.watch('doCluster', this.scope); + this.watch('type', this.scope); + this.watch('clusterOptions', this.scope); + this.watch('clusterEvents', this.scope); + this.watch('typeOptions', this.scope); + this.watch('typeEvents', this.scope); + this.watch('fit', this.scope); + this.watch('idKey', this.scope); + this.gManager = void 0; + this.createAllNew(this.scope); + } + + MarkersParentModel.prototype.onWatch = function(propNameToWatch, scope, newValue, oldValue) { + if (propNameToWatch === "idKey" && newValue !== oldValue) { + this.idKey = newValue; + } + if (this.doRebuildAll || (propNameToWatch === 'doCluster' || propNameToWatch === 'type')) { + return this.rebuildAll(scope); + } else { + return this.pieceMeal(scope); + } + }; + + MarkersParentModel.prototype.validateScope = function(scope) { + var modelsNotDefined; + modelsNotDefined = angular.isUndefined(scope.models) || scope.models === void 0; + if (modelsNotDefined) { + this.$log.error(this.constructor.name + ": no valid models attribute found"); + } + return MarkersParentModel.__super__.validateScope.call(this, scope) || modelsNotDefined; + }; + + + /* + Not used internally by this parent + created for consistency for external control in the API + */ + + MarkersParentModel.prototype.createChildScopes = function(isCreatingFromScratch) { + if ((this.gMap == null) || (this.scope.models == null)) { + return; + } + if (isCreatingFromScratch) { + return this.createAllNew(this.scope, false); + } else { + return this.pieceMeal(this.scope, false); + } + }; + + MarkersParentModel.prototype.bindToTypeEvents = function(typeEvents, events) { + var internalHandles, self; + if (events == null) { + events = ['click', 'mouseout', 'mouseover']; + } + + /* + You should only be binding to events that produce groups/clusters of somthing. + Otherwise use the orginal event handle. + For Example: Click on a cluster pushes a cluster/group obj through which has getMarkers + However Spiderfy's click is for a single marker so this is not ideal for that. + */ + self = this; + if (!this.origTypeEvents) { + this.origTypeEvents = {}; + _.each(events, (function(_this) { + return function(eventName) { + return _this.origTypeEvents[eventName] = typeEvents != null ? typeEvents[eventName] : void 0; + }; + })(this)); + } else { + angular.extend(typeEvents, this.origTypeEvents); + } + internalHandles = {}; + _.each(events, function(eventName) { + return internalHandles[eventName] = function(group) { + return self.maybeExecMappedEvent(group, eventName); + }; + }); + return angular.extend(typeEvents, internalHandles); + }; + + MarkersParentModel.prototype.createAllNew = function(scope) { + var isSpiderfied, maybeCanceled, typeEvents, typeOptions; + if (this.gManager != null) { + if (this.gManager instanceof SpiderfierMarkerManager) { + isSpiderfied = this.gManager.isSpiderfied(); + } + this.gManager.clear(); + delete this.gManager; + } + typeEvents = scope.typeEvents || scope.clusterEvents; + typeOptions = scope.typeOptions || scope.clusterOptions; + if (scope.doCluster || scope.type === 'cluster') { + if (typeEvents != null) { + this.bindToTypeEvents(typeEvents); + } + this.gManager = new ClustererMarkerManager(this.map, void 0, typeOptions, typeEvents); + } else if (scope.type === 'spider') { + if (typeEvents != null) { + this.bindToTypeEvents(typeEvents, ['spiderfy', 'unspiderfy']); + } + this.gManager = new SpiderfierMarkerManager(this.map, void 0, typeOptions, typeEvents, this.scope); + if (isSpiderfied) { + this.gManager.spiderfy(); + } + } else { + this.gManager = new MarkerManager(this.map); + } + if (this.didQueueInitPromise(this, scope)) { + return; + } + maybeCanceled = null; + return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return _async.each(scope.models, function(model) { + _this.newChildMarker(model, scope); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)).then(function() { + _this.modelsRendered = true; + if (scope.fit) { + _this.gManager.fit(); + } + _this.gManager.draw(); + return _this.scope.pluralsUpdate.updateCtr += 1; + }, _async.chunkSizeFrom(scope.chunk)); + }; + })(this)); + }; + + MarkersParentModel.prototype.rebuildAll = function(scope) { + var ref; + if (!scope.doRebuild && scope.doRebuild !== void 0) { + return; + } + if ((ref = this.scope.plurals) != null ? ref.length : void 0) { + return this.onDestroy(scope).then((function(_this) { + return function() { + return _this.createAllNew(scope); + }; + })(this)); + } else { + return this.createAllNew(scope); + } + }; + + MarkersParentModel.prototype.pieceMeal = function(scope) { + var maybeCanceled, payload; + if (scope.$$destroyed) { + return; + } + maybeCanceled = null; + payload = null; + if (this.modelsLength() && this.scope.plurals.length) { + return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return uiGmapPromise.promise((function() { + return _this.figureOutState(_this.idKey, scope, _this.scope.plurals, _this.modelKeyComparison); + })).then(function(state) { + payload = state; + return _async.each(payload.removals, function(child) { + if (child != null) { + if (child.destroy != null) { + child.destroy(); + } + _this.scope.plurals.remove(child.id); + return maybeCanceled; + } + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + return _async.each(payload.adds, function(modelToAdd) { + _this.newChildMarker(modelToAdd, scope); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + return _async.each(payload.updates, function(update) { + _this.updateChild(update.child, update.model); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + if (payload.adds.length > 0 || payload.removals.length > 0 || payload.updates.length > 0) { + scope.plurals = _this.scope.plurals; + if (scope.fit) { + _this.gManager.fit(); + } + _this.gManager.draw(); + } + return _this.scope.pluralsUpdate.updateCtr += 1; + }); + }; + })(this)); + } else { + this.inProgress = false; + return this.rebuildAll(scope); + } + }; + + MarkersParentModel.prototype.newChildMarker = function(model, scope) { + var child, childScope, keys; + if (!model) { + throw 'model undefined'; + } + if (model[this.idKey] == null) { + this.$log.error("Marker model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."); + return; + } + this.$log.info('child', child, 'markers', this.scope.markerModels); + childScope = scope.$new(false); + childScope.events = scope.events; + keys = {}; + IMarker.scopeKeys.forEach(function(k) { + return keys[k] = scope[k]; + }); + child = new MarkerChildModel({ + scope: childScope, + model: model, + keys: keys, + gMap: this.map, + defaults: this.DEFAULTS, + doClick: this.doClick, + gManager: this.gManager, + doDrawSelf: false, + isScopeModel: true + }); + this.scope.plurals.put(model[this.idKey], child); + return child; + }; + + MarkersParentModel.prototype.onDestroy = function(scope) { + MarkersParentModel.__super__.onDestroy.call(this, scope); + return _async.promiseLock(this, uiGmapPromise.promiseTypes["delete"], void 0, void 0, (function(_this) { + return function() { + return _async.each(_this.scope.plurals.values(), function(model) { + if (model != null) { + return model.destroy(false); + } + }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() { + if (_this.gManager != null) { + _this.gManager.destroy(); + } + _this.plurals.removeAll(); + if (_this.plurals !== _this.scope.plurals) { + console.error('plurals out of sync for MarkersParentModel'); + } + return _this.scope.pluralsUpdate.updateCtr += 1; + }); + }; + })(this)); + }; + + MarkersParentModel.prototype.maybeExecMappedEvent = function(group, fnName) { + var pair, typeEvents; + if (this.scope.$$destroyed) { + return; + } + typeEvents = this.scope.typeEvents || this.scope.clusterEvents; + if (_.isFunction(typeEvents != null ? typeEvents[fnName] : void 0)) { + pair = this.mapTypeToPlurals(group); + if (this.origTypeEvents[fnName]) { + return this.origTypeEvents[fnName](pair.group, pair.mapped); + } + } + }; + + MarkersParentModel.prototype.mapTypeToPlurals = function(group) { + var arrayToMap, mapped, ref; + if (_.isArray(group)) { + arrayToMap = group; + } else if (_.isFunction(group.getMarkers)) { + arrayToMap = group.getMarkers(); + } + if (arrayToMap == null) { + $log.error("Unable to map event as we cannot find the array group to map"); + return; + } + if ((ref = this.scope.plurals.values()) != null ? ref.length : void 0) { + mapped = arrayToMap.map((function(_this) { + return function(g) { + return _this.scope.plurals.get(g.key).model; + }; + })(this)); + } else { + mapped = []; + } + return { + cluster: group, + mapped: mapped, + group: group + }; + }; + + MarkersParentModel.prototype.getItem = function(scope, modelsPropToIterate, index) { + if (modelsPropToIterate === 'models') { + return scope[modelsPropToIterate][index]; + } + return scope[modelsPropToIterate].get(index); + }; + + return MarkersParentModel; + + })(IMarkerParentModel); + return MarkersParentModel; + } + ]); + +}).call(this); +;(function() { + ['Polygon', 'Polyline'].forEach(function(name) { + return angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory("uiGmap" + name + "sParentModel", [ + 'uiGmapBasePolysParentModel', "uiGmap" + name + "ChildModel", "uiGmapI" + name, function(BasePolysParentModel, ChildModel, IPoly) { + return BasePolysParentModel(IPoly, ChildModel, name); + } + ]); + }); + +}).call(this); +; +/*globals angular, _, google */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapRectangleParentModel', [ + 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', 'uiGmapRectangleOptionsBuilder', function($log, GmapUtil, EventsHelper, Builder) { + var RectangleParentModel; + return RectangleParentModel = (function(superClass) { + extend(RectangleParentModel, superClass); + + RectangleParentModel.include(GmapUtil); + + RectangleParentModel.include(EventsHelper); + + function RectangleParentModel(scope, element, attrs, gMap, DEFAULTS) { + var bounds, clear, createBounds, dragging, fit, gObject, init, listeners, myListeners, settingBoundsFromScope, updateBounds; + this.scope = scope; + this.attrs = attrs; + this.gMap = gMap; + this.DEFAULTS = DEFAULTS; + bounds = void 0; + dragging = false; + myListeners = []; + listeners = void 0; + fit = (function(_this) { + return function() { + if (_this.isTrue(_this.attrs.fit)) { + return _this.fitMapBounds(_this.gMap, bounds); + } + }; + })(this); + createBounds = (function(_this) { + return function() { + var ref, ref1, ref2; + if ((_this.scope.bounds != null) && (((ref = _this.scope.bounds) != null ? ref.sw : void 0) != null) && (((ref1 = _this.scope.bounds) != null ? ref1.ne : void 0) != null) && _this.validateBoundPoints(_this.scope.bounds)) { + bounds = _this.convertBoundPoints(_this.scope.bounds); + return $log.info("new new bounds created: " + (JSON.stringify(bounds))); + } else if ((_this.scope.bounds.getNorthEast != null) && (_this.scope.bounds.getSouthWest != null)) { + return bounds = _this.scope.bounds; + } else { + if (_this.scope.bounds != null) { + return $log.error("Invalid bounds for newValue: " + (JSON.stringify((ref2 = _this.scope) != null ? ref2.bounds : void 0))); + } + } + }; + })(this); + createBounds(); + gObject = new google.maps.Rectangle(this.buildOpts(bounds)); + $log.info("gObject (rectangle) created: " + gObject); + settingBoundsFromScope = false; + updateBounds = (function(_this) { + return function() { + var b, ne, sw; + b = gObject.getBounds(); + ne = b.getNorthEast(); + sw = b.getSouthWest(); + if (settingBoundsFromScope) { + return; + } + return _this.scope.$evalAsync(function(s) { + if ((s.bounds != null) && (s.bounds.sw != null) && (s.bounds.ne != null)) { + s.bounds.ne = { + latitude: ne.lat(), + longitude: ne.lng() + }; + s.bounds.sw = { + latitude: sw.lat(), + longitude: sw.lng() + }; + } + if ((s.bounds.getNorthEast != null) && (s.bounds.getSouthWest != null)) { + return s.bounds = b; + } + }); + }; + })(this); + init = (function(_this) { + return function() { + fit(); + _this.removeEvents(myListeners); + myListeners.push(google.maps.event.addListener(gObject, 'dragstart', function() { + return dragging = true; + })); + myListeners.push(google.maps.event.addListener(gObject, 'dragend', function() { + dragging = false; + return updateBounds(); + })); + return myListeners.push(google.maps.event.addListener(gObject, 'bounds_changed', function() { + if (dragging) { + return; + } + return updateBounds(); + })); + }; + })(this); + clear = (function(_this) { + return function() { + _this.removeEvents(myListeners); + if (listeners != null) { + _this.removeEvents(listeners); + } + return gObject.setMap(null); + }; + })(this); + if (bounds != null) { + init(); + } + this.scope.$watch('bounds', (function(newValue, oldValue) { + var isNew; + if (_.isEqual(newValue, oldValue) && (bounds != null) || dragging) { + return; + } + settingBoundsFromScope = true; + if (newValue == null) { + clear(); + return; + } + if (bounds == null) { + isNew = true; + } else { + fit(); + } + createBounds(); + gObject.setBounds(bounds); + settingBoundsFromScope = false; + if (isNew && (bounds != null)) { + return init(); + } + }), true); + this.setMyOptions = (function(_this) { + return function(newVals, oldVals) { + if (!_.isEqual(newVals, oldVals)) { + if ((bounds != null) && (newVals != null)) { + return gObject.setOptions(_this.buildOpts(bounds)); + } + } + }; + })(this); + this.props.push('bounds'); + this.watchProps(this.props); + if (this.attrs.events != null) { + listeners = this.setEvents(gObject, this.scope, this.scope); + this.scope.$watch('events', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue)) { + if (listeners != null) { + _this.removeEvents(listeners); + } + return listeners = _this.setEvents(gObject, _this.scope, _this.scope); + } + }; + })(this)); + } + this.scope.$on('$destroy', function() { + return clear(); + }); + $log.info(this); + } + + return RectangleParentModel; + + })(Builder); + } + ]); + +}).call(this); +; +/*global angular:true, google:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapSearchBoxParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapEventsHelper', function(BaseObject, Logger, EventsHelper) { + var SearchBoxParentModel; + SearchBoxParentModel = (function(superClass) { + extend(SearchBoxParentModel, superClass); + + SearchBoxParentModel.include(EventsHelper); + + function SearchBoxParentModel(scope, element, attrs, gMap, ctrlPosition, template, $log) { + var controlDiv; + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.gMap = gMap; + this.ctrlPosition = ctrlPosition; + this.template = template; + this.$log = $log != null ? $log : Logger; + this.setVisibility = bind(this.setVisibility, this); + this.getBounds = bind(this.getBounds, this); + this.setBounds = bind(this.setBounds, this); + this.createSearchBox = bind(this.createSearchBox, this); + this.addToParentDiv = bind(this.addToParentDiv, this); + this.addAsMapControl = bind(this.addAsMapControl, this); + this.init = bind(this.init, this); + if (this.attrs.template == null) { + this.$log.error('template attribute for the search-box directive is mandatory. Places Search Box creation aborted!!'); + return; + } + if (angular.isUndefined(this.scope.options)) { + this.scope.options = {}; + this.scope.options.visible = true; + } + if (angular.isUndefined(this.scope.options.visible)) { + this.scope.options.visible = true; + } + if (angular.isUndefined(this.scope.options.autocomplete)) { + this.scope.options.autocomplete = false; + } + this.visible = this.scope.options.visible; + this.autocomplete = this.scope.options.autocomplete; + controlDiv = angular.element('
'); + controlDiv.append(this.template); + this.input = controlDiv.find('input')[0]; + this.init(); + } + + SearchBoxParentModel.prototype.init = function() { + this.createSearchBox(); + this.scope.$watch('options', (function(_this) { + return function(newValue, oldValue) { + if (angular.isObject(newValue)) { + if (newValue.bounds != null) { + _this.setBounds(newValue.bounds); + } + if (newValue.visible != null) { + if (_this.visible !== newValue.visible) { + return _this.setVisibility(newValue.visible); + } + } + } + }; + })(this), true); + if (this.attrs.parentdiv != null) { + this.addToParentDiv(); + } else { + this.addAsMapControl(); + } + if (!this.visible) { + this.setVisibility(this.visible); + } + if (this.autocomplete) { + this.listener = google.maps.event.addListener(this.gObject, 'place_changed', (function(_this) { + return function() { + return _this.places = _this.gObject.getPlace(); + }; + })(this)); + } else { + this.listener = google.maps.event.addListener(this.gObject, 'places_changed', (function(_this) { + return function() { + return _this.places = _this.gObject.getPlaces(); + }; + })(this)); + } + this.listeners = this.setEvents(this.gObject, this.scope, this.scope); + this.$log.info(this); + this.scope.$on('$stateChangeSuccess', (function(_this) { + return function() { + if (_this.attrs.parentdiv != null) { + return _this.addToParentDiv(); + } + }; + })(this)); + return this.scope.$on('$destroy', (function(_this) { + return function() { + return _this.gObject = null; + }; + })(this)); + }; + + SearchBoxParentModel.prototype.addAsMapControl = function() { + return this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input); + }; + + SearchBoxParentModel.prototype.addToParentDiv = function() { + var ref; + this.parentDiv = angular.element(document.getElementById(this.scope.parentdiv)); + if ((ref = this.parentDiv) != null ? ref.length : void 0) { + return this.parentDiv.append(this.input); + } + }; + + SearchBoxParentModel.prototype.createSearchBox = function() { + if (this.autocomplete) { + return this.gObject = new google.maps.places.Autocomplete(this.input, this.scope.options); + } else { + return this.gObject = new google.maps.places.SearchBox(this.input, this.scope.options); + } + }; + + SearchBoxParentModel.prototype.setBounds = function(bounds) { + if (angular.isUndefined(bounds.isEmpty)) { + this.$log.error('Error: SearchBoxParentModel setBounds. Bounds not an instance of LatLngBounds.'); + } else { + if (bounds.isEmpty() === false) { + if (this.gObject != null) { + return this.gObject.setBounds(bounds); + } + } + } + }; + + SearchBoxParentModel.prototype.getBounds = function() { + return this.gObject.getBounds(); + }; + + SearchBoxParentModel.prototype.setVisibility = function(val) { + if (this.attrs.parentdiv != null) { + if (val === false) { + this.parentDiv.addClass("ng-hide"); + } else { + this.parentDiv.removeClass("ng-hide"); + } + } else { + if (val === false) { + this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].clear(); + } else { + this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input); + } + } + return this.visible = val; + }; + + return SearchBoxParentModel; + + })(BaseObject); + return SearchBoxParentModel; + } + ]); + +}).call(this); +; +/*global _,angular */ + + +/* + WindowsChildModel generator where there are many ChildModels to a parent. + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapWindowsParentModel', [ + 'uiGmapIWindowParentModel', 'uiGmapModelsWatcher', 'uiGmapPropMap', 'uiGmapWindowChildModel', 'uiGmapLinked', 'uiGmap_async', 'uiGmapLogger', '$timeout', '$compile', '$http', '$templateCache', '$interpolate', 'uiGmapPromise', 'uiGmapIWindow', 'uiGmapGmapUtil', function(IWindowParentModel, ModelsWatcher, PropMap, WindowChildModel, Linked, _async, $log, $timeout, $compile, $http, $templateCache, $interpolate, uiGmapPromise, IWindow, GmapUtil) { + var WindowsParentModel; + WindowsParentModel = (function(superClass) { + extend(WindowsParentModel, superClass); + + WindowsParentModel.include(ModelsWatcher); + + function WindowsParentModel(scope, element, attrs, ctrls, gMap1, markersScope) { + this.gMap = gMap1; + this.markersScope = markersScope; + this.modelKeyComparison = bind(this.modelKeyComparison, this); + this.interpolateContent = bind(this.interpolateContent, this); + this.setChildScope = bind(this.setChildScope, this); + this.createWindow = bind(this.createWindow, this); + this.setContentKeys = bind(this.setContentKeys, this); + this.pieceMeal = bind(this.pieceMeal, this); + this.createAllNew = bind(this.createAllNew, this); + this.watchIdKey = bind(this.watchIdKey, this); + this.createChildScopes = bind(this.createChildScopes, this); + this.watchOurScope = bind(this.watchOurScope, this); + this.watchDestroy = bind(this.watchDestroy, this); + this.onDestroy = bind(this.onDestroy, this); + this.rebuildAll = bind(this.rebuildAll, this); + this.doINeedToWipe = bind(this.doINeedToWipe, this); + this.watchModels = bind(this.watchModels, this); + this.go = bind(this.go, this); + WindowsParentModel.__super__.constructor.call(this, scope, element, attrs, ctrls, $timeout, $compile, $http, $templateCache); + this["interface"] = IWindow; + this.plurals = new PropMap(); + _.each(IWindow.scopeKeys, (function(_this) { + return function(name) { + return _this[name + 'Key'] = void 0; + }; + })(this)); + this.linked = new Linked(scope, element, attrs, ctrls); + this.contentKeys = void 0; + this.isIconVisibleOnClick = void 0; + this.firstTime = true; + this.firstWatchModels = true; + this.$log.info(self); + this.parentScope = void 0; + this.go(scope); + } + + WindowsParentModel.prototype.go = function(scope) { + this.watchOurScope(scope); + this.doRebuildAll = this.scope.doRebuildAll != null ? this.scope.doRebuildAll : false; + scope.$watch('doRebuildAll', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.doRebuildAll = newValue; + } + }; + })(this)); + return this.createChildScopes(); + }; + + WindowsParentModel.prototype.watchModels = function(scope) { + var itemToWatch; + itemToWatch = this.markersScope != null ? 'pluralsUpdate' : 'models'; + return scope.$watch(itemToWatch, (function(_this) { + return function(newValue, oldValue) { + var doScratch; + if (!_.isEqual(newValue, oldValue) || _this.firstWatchModels) { + _this.firstWatchModels = false; + if (_this.doRebuildAll || _this.doINeedToWipe(scope.models)) { + return _this.rebuildAll(scope, true, true); + } else { + doScratch = _this.plurals.length === 0; + if (_this.existingPieces != null) { + return _.last(_this.existingPieces._content).then(function() { + return _this.createChildScopes(doScratch); + }); + } else { + return _this.createChildScopes(doScratch); + } + } + } + }; + })(this), true); + }; + + WindowsParentModel.prototype.doINeedToWipe = function(newValue) { + var newValueIsEmpty; + newValueIsEmpty = newValue != null ? newValue.length === 0 : true; + return this.plurals.length > 0 && newValueIsEmpty; + }; + + WindowsParentModel.prototype.rebuildAll = function(scope, doCreate, doDelete) { + return this.onDestroy(doDelete).then((function(_this) { + return function() { + if (doCreate) { + return _this.createChildScopes(); + } + }; + })(this)); + }; + + WindowsParentModel.prototype.onDestroy = function(scope) { + WindowsParentModel.__super__.onDestroy.call(this, this.scope); + return _async.promiseLock(this, uiGmapPromise.promiseTypes["delete"], void 0, void 0, (function(_this) { + return function() { + return _async.each(_this.plurals.values(), function(child) { + return child.destroy(true); + }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() { + var ref; + return (ref = _this.plurals) != null ? ref.removeAll() : void 0; + }); + }; + })(this)); + }; + + WindowsParentModel.prototype.watchDestroy = function(scope) { + return scope.$on('$destroy', (function(_this) { + return function() { + _this.firstWatchModels = true; + _this.firstTime = true; + return _this.rebuildAll(scope, false, true); + }; + })(this)); + }; + + WindowsParentModel.prototype.watchOurScope = function(scope) { + return _.each(IWindow.scopeKeys, (function(_this) { + return function(name) { + var nameKey; + nameKey = name + 'Key'; + return _this[nameKey] = typeof scope[name] === 'function' ? scope[name]() : scope[name]; + }; + })(this)); + }; + + WindowsParentModel.prototype.createChildScopes = function(isCreatingFromScratch) { + var modelsNotDefined, ref, ref1; + if (isCreatingFromScratch == null) { + isCreatingFromScratch = true; + } + + /* + being that we cannot tell the difference in Key String vs. a normal value string (TemplateUrl) + we will assume that all scope values are string expressions either pointing to a key (propName) or using + 'self' to point the model as container/object of interest. + + This may force redundant information into the model, but this appears to be the most flexible approach. + */ + this.isIconVisibleOnClick = true; + if (angular.isDefined(this.linked.attrs.isiconvisibleonclick)) { + this.isIconVisibleOnClick = this.linked.scope.isIconVisibleOnClick; + } + modelsNotDefined = angular.isUndefined(this.linked.scope.models); + if (modelsNotDefined && (this.markersScope === void 0 || (((ref = this.markersScope) != null ? ref.plurals : void 0) === void 0 || ((ref1 = this.markersScope) != null ? ref1.models : void 0) === void 0))) { + this.$log.error('No models to create windows from! Need direct models or models derived from markers!'); + return; + } + if (this.gMap != null) { + if (this.linked.scope.models != null) { + this.watchIdKey(this.linked.scope); + if (isCreatingFromScratch) { + return this.createAllNew(this.linked.scope, false); + } else { + return this.pieceMeal(this.linked.scope, false); + } + } else { + this.parentScope = this.markersScope; + this.watchIdKey(this.parentScope); + if (isCreatingFromScratch) { + return this.createAllNew(this.markersScope, true, 'plurals', false); + } else { + return this.pieceMeal(this.markersScope, true, 'plurals', false); + } + } + } + }; + + WindowsParentModel.prototype.watchIdKey = function(scope) { + this.setIdKey(scope); + return scope.$watch('idKey', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue && (newValue == null)) { + _this.idKey = newValue; + return _this.rebuildAll(scope, true, true); + } + }; + })(this)); + }; + + WindowsParentModel.prototype.createAllNew = function(scope, hasGMarker, modelsPropToIterate, isArray) { + var maybeCanceled; + if (modelsPropToIterate == null) { + modelsPropToIterate = 'models'; + } + if (isArray == null) { + isArray = false; + } + if (this.firstTime) { + this.watchModels(scope); + this.watchDestroy(scope); + } + this.setContentKeys(scope.models); + if (this.didQueueInitPromise(this, scope)) { + return; + } + maybeCanceled = null; + return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return _async.each(scope.models, function(model) { + var gMarker, ref; + gMarker = hasGMarker ? (ref = _this.getItem(scope, modelsPropToIterate, model[_this.idKey])) != null ? ref.gObject : void 0 : void 0; + if (!maybeCanceled) { + if (!gMarker && _this.markersScope) { + $log.error('Unable to get gMarker from markersScope!'); + } + _this.createWindow(model, gMarker, _this.gMap); + } + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)).then(function() { + return _this.firstTime = false; + }); + }; + })(this)); + }; + + WindowsParentModel.prototype.pieceMeal = function(scope, hasGMarker, modelsPropToIterate, isArray) { + var maybeCanceled, payload; + if (modelsPropToIterate == null) { + modelsPropToIterate = 'models'; + } + if (isArray == null) { + isArray = true; + } + if (scope.$$destroyed) { + return; + } + maybeCanceled = null; + payload = null; + if ((scope != null) && this.modelsLength() && this.plurals.length) { + return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return uiGmapPromise.promise((function() { + return _this.figureOutState(_this.idKey, scope, _this.plurals, _this.modelKeyComparison); + })).then(function(state) { + payload = state; + return _async.each(payload.removals, function(child) { + if (child != null) { + _this.plurals.remove(child.id); + if (child.destroy != null) { + child.destroy(true); + } + return maybeCanceled; + } + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + return _async.each(payload.adds, function(modelToAdd) { + var gMarker, ref; + gMarker = (ref = _this.getItem(scope, modelsPropToIterate, modelToAdd[_this.idKey])) != null ? ref.gObject : void 0; + if (!gMarker) { + throw 'Gmarker undefined'; + } + _this.createWindow(modelToAdd, gMarker, _this.gMap); + return maybeCanceled; + }); + }).then(function() { + return _async.each(payload.updates, function(update) { + _this.updateChild(update.child, update.model); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)); + }); + }; + })(this)); + } else { + $log.debug('pieceMeal: rebuildAll'); + return this.rebuildAll(this.scope, true, true); + } + }; + + WindowsParentModel.prototype.setContentKeys = function(models) { + if (this.modelsLength(models)) { + return this.contentKeys = Object.keys(models[0]); + } + }; + + WindowsParentModel.prototype.createWindow = function(model, gMarker, gMap) { + var child, childScope, fakeElement, opts, ref, ref1; + childScope = this.linked.scope.$new(false); + this.setChildScope(childScope, model); + childScope.$watch('model', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.setChildScope(childScope, newValue); + } + }; + })(this), true); + fakeElement = { + html: (function(_this) { + return function() { + return _this.interpolateContent(_this.linked.element.html(), model); + }; + })(this) + }; + this.DEFAULTS = this.scopeOrModelVal(this.optionsKey, this.scope, model) || {}; + opts = this.createWindowOptions(gMarker, childScope, fakeElement.html(), this.DEFAULTS); + child = new WindowChildModel({ + model: model, + scope: childScope, + opts: opts, + isIconVisibleOnClick: this.isIconVisibleOnClick, + gMap: gMap, + markerScope: (ref = this.markersScope) != null ? (ref1 = ref.plurals.get(model[this.idKey])) != null ? ref1.scope : void 0 : void 0, + element: fakeElement, + needToManualDestroy: false, + markerIsVisibleAfterWindowClose: true, + isScopeModel: true + }); + if (model[this.idKey] == null) { + this.$log.error('Window model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key.'); + return; + } + this.plurals.put(model[this.idKey], child); + return child; + }; + + WindowsParentModel.prototype.setChildScope = function(childScope, model) { + _.each(IWindow.scopeKeys, (function(_this) { + return function(name) { + var nameKey, newValue; + nameKey = name + 'Key'; + newValue = _this[nameKey] === 'self' ? model : model[_this[nameKey]]; + if (newValue !== childScope[name]) { + return childScope[name] = newValue; + } + }; + })(this)); + return childScope.model = model; + }; + + WindowsParentModel.prototype.interpolateContent = function(content, model) { + var exp, i, interpModel, key, len, ref; + if (this.contentKeys === void 0 || this.contentKeys.length === 0) { + return; + } + exp = $interpolate(content); + interpModel = {}; + ref = this.contentKeys; + for (i = 0, len = ref.length; i < len; i++) { + key = ref[i]; + interpModel[key] = model[key]; + } + return exp(interpModel); + }; + + WindowsParentModel.prototype.modelKeyComparison = function(model1, model2) { + var isEqual, scope; + scope = this.scope.coords != null ? this.scope : this.parentScope; + if (scope == null) { + throw 'No scope or parentScope set!'; + } + isEqual = GmapUtil.equalCoords(this.evalModelHandle(model1, scope.coords), this.evalModelHandle(model2, scope.coords)); + if (!isEqual) { + return isEqual; + } + isEqual = _.every(_.without(this["interface"].scopeKeys, 'coords'), (function(_this) { + return function(k) { + return _this.evalModelHandle(model1, scope[k]) === _this.evalModelHandle(model2, scope[k]); + }; + })(this)); + return isEqual; + }; + + return WindowsParentModel; + + })(IWindowParentModel); + return WindowsParentModel; + } + ]); + +}).call(this); +; +/*global angular, _ */ + +(function() { + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapCircle", [ + "uiGmapICircle", "uiGmapCircleParentModel", function(ICircle, CircleParentModel) { + return _.extend(ICircle, { + link: function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then(function(gMap) { + return new CircleParentModel(scope, element, attrs, gMap); + }); + } + }); + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapControl", [ + "uiGmapIControl", "$http", "$templateCache", "$compile", "$controller", 'uiGmapGoogleMapApi', function(IControl, $http, $templateCache, $compile, $controller, GoogleMapApi) { + var Control; + return Control = (function(superClass) { + extend(Control, superClass); + + function Control() { + this.link = bind(this.link, this); + Control.__super__.constructor.call(this); + } + + Control.prototype.transclude = true; + + Control.prototype.link = function(scope, element, attrs, ctrl, transclude) { + return GoogleMapApi.then((function(_this) { + return function(maps) { + var hasTranscludedContent, index, position; + hasTranscludedContent = angular.isUndefined(scope.template); + index = angular.isDefined(scope.index && !isNaN(parseInt(scope.index))) ? parseInt(scope.index) : void 0; + position = angular.isDefined(scope.position) ? scope.position.toUpperCase().replace(/-/g, '_') : 'TOP_CENTER'; + if (!maps.ControlPosition[position]) { + _this.$log.error('mapControl: invalid position property'); + return; + } + return IControl.mapPromise(scope, ctrl).then(function(map) { + var control, controlDiv, pushControl; + control = void 0; + controlDiv = angular.element('
'); + pushControl = function(map, control, index) { + if (index) { + control[0].index = index; + } + return map.controls[google.maps.ControlPosition[position]].push(control[0]); + }; + if (hasTranscludedContent) { + return transclude(function(transcludeEl) { + controlDiv.append(transcludeEl); + return pushControl(map, controlDiv.children(), index); + }); + } else { + return $http.get(scope.template, { + cache: $templateCache + }).then(function(arg) { + var data, templateCtrl, templateScope; + data = arg.data; + templateScope = scope.$new(); + controlDiv.append(data); + if (angular.isDefined(scope.controller)) { + templateCtrl = $controller(scope.controller, { + $scope: templateScope + }); + controlDiv.children().data('$ngControllerController', templateCtrl); + } + return control = $compile(controlDiv.children())(templateScope); + })["catch"](function(error) { + return _this.$log.error('mapControl: template could not be found'); + }).then(function() { + return pushControl(map, control, index); + }); + } + }); + }; + })(this)); + }; + + return Control; + + })(IControl); + } + ]); + +}).call(this); +; +/*globals angular, _ */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapDragZoom', [ + 'uiGmapCtrlHandle', 'uiGmapPropertyAction', function(CtrlHandle, PropertyAction) { + return { + restrict: 'EMA', + transclude: true, + template: '', + require: '^' + 'uiGmapGoogleMap', + scope: { + keyboardkey: '=', + options: '=', + spec: '=' + }, + controller: [ + '$scope', '$element', function($scope, $element) { + $scope.ctrlType = 'uiGmapDragZoom'; + return _.extend(this, CtrlHandle.handle($scope, $element)); + } + ], + link: function(scope, element, attrs, ctrl) { + return CtrlHandle.mapPromise(scope, ctrl).then(function(map) { + var enableKeyDragZoom, setKeyAction, setOptionsAction; + enableKeyDragZoom = function(opts) { + return map.enableKeyDragZoom(opts); + }; + setKeyAction = new PropertyAction(function(key, newVal) { + if (newVal) { + return enableKeyDragZoom({ + key: newVal + }); + } else { + return enableKeyDragZoom(); + } + }); + setOptionsAction = new PropertyAction(function(key, newVal) { + if (newVal) { + return enableKeyDragZoom(newVal); + } + }); + scope.$watch('keyboardkey', setKeyAction.sic('keyboardkey')); + setKeyAction.sic(scope.keyboardkey); + scope.$watch('options', setOptionsAction.sic('options')); + return setOptionsAction.sic(scope.options); + }); + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapDrawingManager", [ + "uiGmapIDrawingManager", "uiGmapDrawingManagerParentModel", function(IDrawingManager, DrawingManagerParentModel) { + return _.extend(IDrawingManager, { + link: function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then(function(map) { + return new DrawingManagerParentModel(scope, element, attrs, map); + }); + } + }); + } + ]); + +}).call(this); +; +/* + - Link up Polygons to be sent back to a controller + - inject the draw function into a controllers scope so that controller can call the directive to draw on demand + - draw function creates the DrawFreeHandChildModel which manages itself + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapApiFreeDrawPolygons', [ + 'uiGmapLogger', 'uiGmapBaseObject', 'uiGmapCtrlHandle', 'uiGmapDrawFreeHandChildModel', 'uiGmapLodash', function($log, BaseObject, CtrlHandle, DrawFreeHandChildModel, uiGmapLodash) { + var FreeDrawPolygons; + return FreeDrawPolygons = (function(superClass) { + extend(FreeDrawPolygons, superClass); + + function FreeDrawPolygons() { + this.link = bind(this.link, this); + return FreeDrawPolygons.__super__.constructor.apply(this, arguments); + } + + FreeDrawPolygons.include(CtrlHandle); + + FreeDrawPolygons.prototype.restrict = 'EMA'; + + FreeDrawPolygons.prototype.replace = true; + + FreeDrawPolygons.prototype.require = '^' + 'uiGmapGoogleMap'; + + FreeDrawPolygons.prototype.scope = { + polygons: '=', + draw: '=' + }; + + FreeDrawPolygons.prototype.link = function(scope, element, attrs, ctrl) { + return this.mapPromise(scope, ctrl).then((function(_this) { + return function(map) { + var freeHand, listener; + if (!scope.polygons) { + return $log.error('No polygons to bind to!'); + } + if (!_.isArray(scope.polygons)) { + return $log.error('Free Draw Polygons must be of type Array!'); + } + freeHand = new DrawFreeHandChildModel(map, ctrl.getScope()); + listener = void 0; + return scope.draw = function() { + if (typeof listener === "function") { + listener(); + } + return freeHand.engage(scope.polygons).then(function() { + var firstTime; + firstTime = true; + return listener = scope.$watchCollection('polygons', function(newValue, oldValue) { + var removals; + if (firstTime || newValue === oldValue) { + firstTime = false; + return; + } + removals = uiGmapLodash.differenceObjects(oldValue, newValue); + return removals.forEach(function(p) { + return p.setMap(null); + }); + }); + }); + }; + }; + })(this)); + }; + + return FreeDrawPolygons; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api").service("uiGmapICircle", [ + function() { + return { + restrict: "EA", + replace: true, + require: '^' + 'uiGmapGoogleMap', + scope: { + center: "=center", + radius: "=radius", + stroke: "=stroke", + fill: "=fill", + clickable: "=", + draggable: "=", + editable: "=", + geodesic: "=", + icons: "=icons", + visible: "=", + events: "=", + control: "=", + zIndex: "=zindex" + } + }; + } + ]); + +}).call(this); +; +/* + - interface for all controls to derive from + - to enforce a minimum set of requirements + - attributes + - template + - position + - controller + - index + */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIControl", [ + "uiGmapBaseObject", "uiGmapLogger", "uiGmapCtrlHandle", function(BaseObject, Logger, CtrlHandle) { + var IControl; + return IControl = (function(superClass) { + extend(IControl, superClass); + + IControl.extend(CtrlHandle); + + function IControl() { + this.restrict = 'EA'; + this.replace = true; + this.require = '^' + 'uiGmapGoogleMap'; + this.scope = { + template: '@template', + position: '@position', + controller: '@controller', + index: '@index' + }; + this.$log = Logger; + } + + IControl.prototype.link = function(scope, element, attrs, ctrl) { + throw new Error("Not implemented!!"); + }; + + return IControl; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapIDrawingManager', [ + function() { + return { + restrict: 'EA', + replace: true, + require: '^' + 'uiGmapGoogleMap', + scope: { + "static": '@', + control: '=', + options: '=', + events: '=' + } + }; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIMarker', [ + 'uiGmapBaseObject', 'uiGmapCtrlHandle', function(BaseObject, CtrlHandle) { + var IMarker; + return IMarker = (function(superClass) { + extend(IMarker, superClass); + + IMarker.scope = { + coords: '=coords', + icon: '=icon', + click: '&click', + options: '=options', + events: '=events', + fit: '=fit', + idKey: '=idkey', + control: '=control' + }; + + IMarker.scopeKeys = _.keys(IMarker.scope); + + IMarker.keys = IMarker.scopeKeys; + + IMarker.extend(CtrlHandle); + + function IMarker() { + this.restrict = 'EMA'; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.replace = true; + this.scope = _.extend(this.scope || {}, IMarker.scope); + } + + return IMarker; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIPolygon', [ + 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapCtrlHandle', function(GmapUtil, BaseObject, Logger, CtrlHandle) { + var IPolygon; + return IPolygon = (function(superClass) { + extend(IPolygon, superClass); + + IPolygon.scope = { + path: '=path', + stroke: '=stroke', + clickable: '=', + draggable: '=', + editable: '=', + geodesic: '=', + fill: '=', + icons: '=icons', + visible: '=', + "static": '=', + events: '=', + zIndex: '=zindex', + fit: '=', + control: '=control' + }; + + IPolygon.scopeKeys = _.keys(IPolygon.scope); + + IPolygon.include(GmapUtil); + + IPolygon.extend(CtrlHandle); + + function IPolygon() {} + + IPolygon.prototype.restrict = 'EMA'; + + IPolygon.prototype.replace = true; + + IPolygon.prototype.require = '^' + 'uiGmapGoogleMap'; + + IPolygon.prototype.scope = IPolygon.scope; + + IPolygon.prototype.DEFAULTS = {}; + + IPolygon.prototype.$log = Logger; + + return IPolygon; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIPolyline', [ + 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapCtrlHandle', function(GmapUtil, BaseObject, Logger, CtrlHandle) { + var IPolyline; + return IPolyline = (function(superClass) { + extend(IPolyline, superClass); + + IPolyline.scope = { + path: '=', + stroke: '=', + clickable: '=', + draggable: '=', + editable: '=', + geodesic: '=', + icons: '=', + visible: '=', + "static": '=', + fit: '=', + events: '=', + zIndex: '=zindex' + }; + + IPolyline.scopeKeys = _.keys(IPolyline.scope); + + IPolyline.include(GmapUtil); + + IPolyline.extend(CtrlHandle); + + function IPolyline() {} + + IPolyline.prototype.restrict = 'EMA'; + + IPolyline.prototype.replace = true; + + IPolyline.prototype.require = '^' + 'uiGmapGoogleMap'; + + IPolyline.prototype.scope = IPolyline.scope; + + IPolyline.prototype.DEFAULTS = {}; + + IPolyline.prototype.$log = Logger; + + return IPolyline; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapIRectangle', [ + function() { + 'use strict'; + return { + restrict: 'EMA', + require: '^' + 'uiGmapGoogleMap', + replace: true, + scope: { + bounds: '=', + stroke: '=', + clickable: '=', + draggable: '=', + editable: '=', + fill: '=', + visible: '=', + events: '=' + } + }; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIWindow', [ + 'uiGmapBaseObject', 'uiGmapChildEvents', 'uiGmapCtrlHandle', function(BaseObject, ChildEvents, CtrlHandle) { + var IWindow; + return IWindow = (function(superClass) { + extend(IWindow, superClass); + + IWindow.scope = { + coords: '=coords', + template: '=template', + templateUrl: '=templateurl', + templateParameter: '=templateparameter', + isIconVisibleOnClick: '=isiconvisibleonclick', + closeClick: '&closeclick', + options: '=options', + control: '=control', + show: '=show' + }; + + IWindow.scopeKeys = _.keys(IWindow.scope); + + IWindow.include(ChildEvents); + + IWindow.extend(CtrlHandle); + + function IWindow() { + this.restrict = 'EMA'; + this.template = void 0; + this.transclude = true; + this.priority = -100; + this.require = '^' + 'uiGmapGoogleMap'; + this.replace = true; + this.scope = _.extend(this.scope || {}, IWindow.scope); + } + + return IWindow; + + })(BaseObject); + } + ]); + +}).call(this); +; +/*globals angular,_,google */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapMap', ['$timeout', '$q', '$log', 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapCtrlHandle', 'uiGmapIsReady', 'uiGmapuuid', 'uiGmapExtendGWin', 'uiGmapExtendMarkerClusterer', 'uiGmapGoogleMapsUtilV3', 'uiGmapGoogleMapApi', 'uiGmapEventsHelper', 'uiGmapGoogleMapObjectManager', function($timeout, $q, $log, uiGmapGmapUtil, uiGmapBaseObject, uiGmapCtrlHandle, uiGmapIsReady, uiGmapuuid, uiGmapExtendGWin, uiGmapExtendMarkerClusterer, uiGmapGoogleMapsUtilV3, uiGmapGoogleMapApi, uiGmapEventsHelper, uiGmapGoogleMapObjectManager) { + var DEFAULTS, Map, initializeItems; + DEFAULTS = void 0; + initializeItems = [uiGmapGoogleMapsUtilV3, uiGmapExtendGWin, uiGmapExtendMarkerClusterer]; + return Map = (function(superClass) { + extend(Map, superClass); + + Map.include(uiGmapGmapUtil); + + function Map() { + this.link = bind(this.link, this); + var ctrlFn; + ctrlFn = function($scope) { + var ctrlObj, retCtrl; + retCtrl = void 0; + $scope.$on('$destroy', function() { + return uiGmapIsReady.decrement(); + }); + ctrlObj = uiGmapCtrlHandle.handle($scope); + $scope.ctrlType = 'Map'; + $scope.deferred.promise.then(function() { + return initializeItems.forEach(function(i) { + return i.init(); + }); + }); + ctrlObj.getMap = function() { + return $scope.map; + }; + retCtrl = _.extend(this, ctrlObj); + return retCtrl; + }; + this.controller = ['$scope', ctrlFn]; + } + + Map.prototype.restrict = 'EMA'; + + Map.prototype.transclude = true; + + Map.prototype.replace = false; + + Map.prototype.template = "
\n
"; + + Map.prototype.scope = { + center: '=', + zoom: '=', + dragging: '=', + control: '=', + options: '=', + events: '=', + eventOpts: '=', + styles: '=', + bounds: '=', + update: '=' + }; + + Map.prototype.link = function(scope, element, attrs) { + var listeners; + listeners = []; + scope.$on('$destroy', function() { + uiGmapEventsHelper.removeEvents(listeners); + if (attrs.recycleMapInstance === 'true' && scope.map) { + uiGmapGoogleMapObjectManager.recycleMapInstance(scope.map); + return scope.map = null; + } + }); + scope.idleAndZoomChanged = false; + return uiGmapGoogleMapApi.then((function(_this) { + return function(maps) { + var _gMap, customListeners, disabledEvents, dragging, el, eventName, getEventHandler, mapOptions, maybeHookToEvent, opts, ref, resolveSpawned, settingFromDirective, spawned, type, updateCenter, zoomPromise; + DEFAULTS = { + mapTypeId: maps.MapTypeId.ROADMAP + }; + spawned = uiGmapIsReady.spawn(); + resolveSpawned = function() { + return spawned.deferred.resolve({ + instance: spawned.instance, + map: _gMap + }); + }; + if (!angular.isDefined(scope.center) && !angular.isDefined(scope.bounds)) { + $log.error('angular-google-maps: a center or bounds property is required'); + return; + } + if (!angular.isDefined(scope.center)) { + scope.center = new google.maps.LatLngBounds(_this.getCoords(scope.bounds.southwest), _this.getCoords(scope.bounds.northeast)).getCenter(); + } + if (!angular.isDefined(scope.zoom)) { + scope.zoom = 10; + } + el = angular.element(element); + el.addClass('angular-google-map'); + opts = { + options: {} + }; + if (attrs.options) { + opts.options = scope.options; + } + if (attrs.styles) { + opts.styles = scope.styles; + } + if (attrs.type) { + type = attrs.type.toUpperCase(); + if (google.maps.MapTypeId.hasOwnProperty(type)) { + opts.mapTypeId = google.maps.MapTypeId[attrs.type.toUpperCase()]; + } else { + $log.error("angular-google-maps: invalid map type '" + attrs.type + "'"); + } + } + mapOptions = angular.extend({}, DEFAULTS, opts, { + center: _this.getCoords(scope.center), + zoom: scope.zoom, + bounds: scope.bounds + }); + if (attrs.recycleMapInstance === 'true') { + _gMap = uiGmapGoogleMapObjectManager.createMapInstance(el.find('div')[1], mapOptions); + } else { + _gMap = new google.maps.Map(el.find('div')[1], mapOptions); + } + _gMap['uiGmap_id'] = uiGmapuuid.generate(); + dragging = false; + listeners.push(google.maps.event.addListenerOnce(_gMap, 'idle', function() { + scope.deferred.resolve(_gMap); + return resolveSpawned(); + })); + disabledEvents = attrs.events && (((ref = scope.events) != null ? ref.blacklist : void 0) != null) ? scope.events.blacklist : []; + if (_.isString(disabledEvents)) { + disabledEvents = [disabledEvents]; + } + maybeHookToEvent = function(eventName, fn, prefn) { + if (!_.includes(disabledEvents, eventName)) { + if (prefn) { + prefn(); + } + return listeners.push(google.maps.event.addListener(_gMap, eventName, function() { + var ref1; + if (!((ref1 = scope.update) != null ? ref1.lazy : void 0)) { + return fn(); + } + })); + } + }; + if (!_.includes(disabledEvents, 'all')) { + maybeHookToEvent('dragstart', function() { + dragging = true; + return scope.$evalAsync(function(s) { + if (s.dragging != null) { + return s.dragging = dragging; + } + }); + }); + maybeHookToEvent('dragend', function() { + dragging = false; + return scope.$evalAsync(function(s) { + if (s.dragging != null) { + return s.dragging = dragging; + } + }); + }); + updateCenter = function(c, s) { + var cLat, cLng; + if (c == null) { + c = _gMap.center; + } + if (s == null) { + s = scope; + } + if (!_.includes(disabledEvents, 'center')) { + cLat = c.lat(); + cLng = c.lng(); + if (angular.isDefined(s.center.type)) { + if (s.center.coordinates[1] !== cLat) { + s.center.coordinates[1] = cLat; + } + if (s.center.coordinates[0] !== cLng) { + return s.center.coordinates[0] = cLng; + } + } else { + if (s.center.latitude !== cLat) { + s.center.latitude = cLat; + } + if (s.center.longitude !== cLng) { + return s.center.longitude = cLng; + } + } + } + }; + settingFromDirective = false; + maybeHookToEvent('idle', function() { + var b, ne, sw; + b = _gMap.getBounds(); + ne = b.getNorthEast(); + sw = b.getSouthWest(); + settingFromDirective = true; + return scope.$evalAsync(function(s) { + updateCenter(); + if (!_.isUndefined(s.bounds) && !_.includes(disabledEvents, 'bounds')) { + s.bounds.northeast = { + latitude: ne.lat(), + longitude: ne.lng() + }; + s.bounds.southwest = { + latitude: sw.lat(), + longitude: sw.lng() + }; + } + if (!_.includes(disabledEvents, 'zoom')) { + s.zoom = _gMap.zoom; + scope.idleAndZoomChanged = !scope.idleAndZoomChanged; + } + return settingFromDirective = false; + }); + }); + } + if (angular.isDefined(scope.events) && scope.events !== null && angular.isObject(scope.events)) { + getEventHandler = function(eventName) { + return function() { + return scope.events[eventName].apply(scope, [_gMap, eventName, arguments]); + }; + }; + customListeners = []; + for (eventName in scope.events) { + if (scope.events.hasOwnProperty(eventName) && angular.isFunction(scope.events[eventName])) { + customListeners.push(google.maps.event.addListener(_gMap, eventName, getEventHandler(eventName))); + } + } + listeners.concat(customListeners); + } + _gMap.getOptions = function() { + return mapOptions; + }; + scope.map = _gMap; + if ((attrs.control != null) && (scope.control != null)) { + scope.control.refresh = function(maybeCoords) { + var coords, ref1, ref2; + if (_gMap == null) { + return; + } + if (((typeof google !== "undefined" && google !== null ? (ref1 = google.maps) != null ? (ref2 = ref1.event) != null ? ref2.trigger : void 0 : void 0 : void 0) != null) && (_gMap != null)) { + google.maps.event.trigger(_gMap, 'resize'); + } + if (((maybeCoords != null ? maybeCoords.latitude : void 0) != null) && ((maybeCoords != null ? maybeCoords.longitude : void 0) != null)) { + coords = _this.getCoords(maybeCoords); + if (_this.isTrue(attrs.pan)) { + return _gMap.panTo(coords); + } else { + return _gMap.setCenter(coords); + } + } + }; + scope.control.getGMap = function() { + return _gMap; + }; + scope.control.getMapOptions = function() { + return mapOptions; + }; + scope.control.getCustomEventListeners = function() { + return customListeners; + }; + scope.control.removeEvents = function(yourListeners) { + return uiGmapEventsHelper.removeEvents(yourListeners); + }; + } + scope.$watch('center', function(newValue, oldValue) { + var coords; + if (newValue === oldValue || settingFromDirective) { + return; + } + coords = _this.getCoords(scope.center); + if (coords.lat() === _gMap.center.lat() && coords.lng() === _gMap.center.lng()) { + return; + } + if (!dragging) { + if (!_this.validateCoords(newValue)) { + $log.error("Invalid center for newValue: " + (JSON.stringify(newValue))); + } + if (_this.isTrue(attrs.pan) && scope.zoom === _gMap.zoom) { + return _gMap.panTo(coords); + } else { + return _gMap.setCenter(coords); + } + } + }, true); + zoomPromise = null; + scope.$watch('zoom', function(newValue, oldValue) { + var ref1, ref2; + if (newValue == null) { + return; + } + if (_.isEqual(newValue, oldValue) || (_gMap != null ? _gMap.getZoom() : void 0) === (scope != null ? scope.zoom : void 0) || settingFromDirective) { + return; + } + if (zoomPromise != null) { + $timeout.cancel(zoomPromise); + } + return zoomPromise = $timeout(function() { + return _gMap.setZoom(newValue); + }, ((ref1 = scope.eventOpts) != null ? (ref2 = ref1.debounce) != null ? ref2.zoomMs : void 0 : void 0) + 20, false); + }); + scope.$watch('bounds', function(newValue, oldValue) { + var bounds, ne, ref1, ref2, ref3, ref4, sw; + if (newValue === oldValue) { + return; + } + if (((newValue != null ? (ref1 = newValue.northeast) != null ? ref1.latitude : void 0 : void 0) == null) || ((newValue != null ? (ref2 = newValue.northeast) != null ? ref2.longitude : void 0 : void 0) == null) || ((newValue != null ? (ref3 = newValue.southwest) != null ? ref3.latitude : void 0 : void 0) == null) || ((newValue != null ? (ref4 = newValue.southwest) != null ? ref4.longitude : void 0 : void 0) == null)) { + $log.error("Invalid map bounds for new value: " + (JSON.stringify(newValue))); + return; + } + ne = new google.maps.LatLng(newValue.northeast.latitude, newValue.northeast.longitude); + sw = new google.maps.LatLng(newValue.southwest.latitude, newValue.southwest.longitude); + bounds = new google.maps.LatLngBounds(sw, ne); + return _gMap.fitBounds(bounds); + }); + return ['options', 'styles'].forEach(function(toWatch) { + return scope.$watch(toWatch, function(newValue, oldValue) { + if (_.isEqual(newValue, oldValue)) { + return; + } + if (toWatch === 'options') { + opts.options = newValue; + } else { + opts.options[toWatch] = newValue; + } + if (_gMap != null) { + return _gMap.setOptions(opts); + } + }, true); + }); + }; + })(this)); + }; + + return Map; + + })(uiGmapBaseObject); + }]); + +}).call(this); +; +/*global _:true,angular:true */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMarker", [ + "uiGmapIMarker", "uiGmapMarkerChildModel", "uiGmapMarkerManager", "uiGmapLogger", function(IMarker, MarkerChildModel, MarkerManager, $log) { + var Marker; + return Marker = (function(superClass) { + extend(Marker, superClass); + + function Marker() { + Marker.__super__.constructor.call(this); + this.template = ''; + $log.info(this); + } + + Marker.prototype.controller = [ + '$scope', '$element', function($scope, $element) { + $scope.ctrlType = 'Marker'; + return _.extend(this, IMarker.handle($scope, $element)); + } + ]; + + Marker.prototype.link = function(scope, element, attrs, ctrl) { + var mapPromise; + mapPromise = IMarker.mapPromise(scope, ctrl); + mapPromise.then(function(gMap) { + var gManager, keys, m; + gManager = new MarkerManager(gMap); + keys = _.object(IMarker.keys, IMarker.keys); + m = new MarkerChildModel({ + scope: scope, + model: scope, + keys: keys, + gMap: gMap, + doClick: true, + gManager: gManager, + doDrawSelf: false, + trackModel: false + }); + m.deferred.promise.then(function(gMarker) { + return scope.deferred.resolve(gMarker); + }); + if (scope.control != null) { + return scope.control.getGMarkers = gManager.getGMarkers; + } + }); + return scope.$on('$destroy', function() { + var gManager; + if (typeof gManager !== "undefined" && gManager !== null) { + gManager.clear(); + } + return gManager = null; + }); + }; + + return Marker; + + })(IMarker); + } + ]); + +}).call(this); +; +/*global _:true,angular:true */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMarkers", [ + "uiGmapIMarker", "uiGmapPlural", "uiGmapMarkersParentModel", "uiGmap_sync", "uiGmapLogger", function(IMarker, Plural, MarkersParentModel, _sync, $log) { + var Markers; + return Markers = (function(superClass) { + extend(Markers, superClass); + + function Markers() { + Markers.__super__.constructor.call(this); + this.template = ''; + Plural.extend(this, { + doCluster: '=?docluster', + clusterOptions: '=clusteroptions', + clusterEvents: '=clusterevents', + modelsByRef: '=modelsbyref', + type: '=?type', + typeOptions: '=?typeoptions', + typeEvents: '=?typeevents', + deepComparison: '=?deepcomparison' + }); + $log.info(this); + } + + Markers.prototype.controller = [ + '$scope', '$element', function($scope, $element) { + $scope.ctrlType = 'Markers'; + return _.extend(this, IMarker.handle($scope, $element)); + } + ]; + + Markers.prototype.link = function(scope, element, attrs, ctrl) { + var parentModel, ready; + parentModel = void 0; + ready = function() { + return scope.deferred.resolve(); + }; + return IMarker.mapPromise(scope, ctrl).then(function(map) { + var mapScope; + mapScope = ctrl.getScope(); + mapScope.$watch('idleAndZoomChanged', function() { + return _.defer(parentModel.gManager.draw); + }); + parentModel = new MarkersParentModel(scope, element, attrs, map); + Plural.link(scope, parentModel); + if (scope.control != null) { + scope.control.getGMarkers = function() { + var ref; + return (ref = parentModel.gManager) != null ? ref.getGMarkers() : void 0; + }; + scope.control.getChildMarkers = function() { + return parentModel.plurals; + }; + } + return _.last(parentModel.existingPieces._content).then(function() { + return ready(); + }); + }); + }; + + return Markers; + + })(IMarker); + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapPlural', [ + function() { + var _initControl; + _initControl = function(scope, parent) { + if (scope.control == null) { + return; + } + scope.control.updateModels = function(models) { + scope.models = models; + return parent.createChildScopes(false); + }; + scope.control.newModels = function(models) { + scope.models = models; + return parent.rebuildAll(scope, true, true); + }; + scope.control.clean = function() { + return parent.rebuildAll(scope, false, true); + }; + scope.control.getPlurals = function() { + return parent.plurals; + }; + scope.control.getManager = function() { + return parent.gManager; + }; + scope.control.hasManager = function() { + return (parent.gManager != null) === true; + }; + return scope.control.managerDraw = function() { + var ref; + if (scope.control.hasManager()) { + return (ref = scope.control.getManager()) != null ? ref.draw() : void 0; + } + }; + }; + return { + extend: function(obj, obj2) { + return _.extend(obj.scope || {}, obj2 || {}, { + idKey: '=idkey', + doRebuildAll: '=dorebuildall', + models: '=models', + chunk: '=chunk', + cleanchunk: '=cleanchunk', + control: '=control', + deepComparison: '=deepcomparison' + }); + }, + link: function(scope, parent) { + return _initControl(scope, parent); + } + }; + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygon', [ + 'uiGmapIPolygon', '$timeout', 'uiGmapPolygonChildModel', function(IPolygon, $timeout, PolygonChild) { + var Polygon; + return Polygon = (function(superClass) { + extend(Polygon, superClass); + + function Polygon() { + this.link = bind(this.link, this); + return Polygon.__super__.constructor.apply(this, arguments); + } + + Polygon.prototype.link = function(scope, element, attrs, mapCtrl) { + var children, promise; + children = []; + promise = IPolygon.mapPromise(scope, mapCtrl); + if (scope.control != null) { + scope.control.getInstance = this; + scope.control.polygons = children; + scope.control.promise = promise; + } + return promise.then((function(_this) { + return function(gMap) { + return children.push(new PolygonChild({ + scope: scope, + attrs: attrs, + gMap: gMap, + defaults: _this.DEFAULTS + })); + }; + })(this)); + }; + + return Polygon; + + })(IPolygon); + } + ]); + +}).call(this); +; +/*global angular:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygons', [ + 'uiGmapIPolygon', '$timeout', 'uiGmapPolygonsParentModel', 'uiGmapPlural', function(Interface, $timeout, ParentModel, Plural) { + var Polygons; + return Polygons = (function(superClass) { + extend(Polygons, superClass); + + function Polygons() { + this.link = bind(this.link, this); + Polygons.__super__.constructor.call(this); + Plural.extend(this); + this.$log.info(this); + } + + Polygons.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(map) { + if (angular.isUndefined(scope.path) || scope.path === null) { + _this.$log.warn('polygons: no valid path attribute found'); + } + if (!scope.models) { + _this.$log.warn('polygons: no models found to create from'); + } + return Plural.link(scope, new ParentModel(scope, element, attrs, map, _this.DEFAULTS)); + }; + })(this)); + }; + + return Polygons; + + })(Interface); + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolyline', [ + 'uiGmapIPolyline', '$timeout', 'uiGmapPolylineChildModel', function(IPolyline, $timeout, PolylineChildModel) { + var Polyline; + return Polyline = (function(superClass) { + extend(Polyline, superClass); + + function Polyline() { + this.link = bind(this.link, this); + return Polyline.__super__.constructor.apply(this, arguments); + } + + Polyline.prototype.link = function(scope, element, attrs, mapCtrl) { + return IPolyline.mapPromise(scope, mapCtrl).then((function(_this) { + return function(gMap) { + if (angular.isUndefined(scope.path) || scope.path === null || !_this.validatePath(scope.path)) { + _this.$log.warn('polyline: no valid path attribute found'); + } + return new PolylineChildModel({ + scope: scope, + attrs: attrs, + gMap: gMap, + defaults: _this.DEFAULTS + }); + }; + })(this)); + }; + + return Polyline; + + })(IPolyline); + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolylines', [ + 'uiGmapIPolyline', '$timeout', 'uiGmapPolylinesParentModel', 'uiGmapPlural', function(IPolyline, $timeout, PolylinesParentModel, Plural) { + var Polylines; + return Polylines = (function(superClass) { + extend(Polylines, superClass); + + function Polylines() { + this.link = bind(this.link, this); + Polylines.__super__.constructor.call(this); + Plural.extend(this); + this.$log.info(this); + } + + Polylines.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(gMap) { + if (angular.isUndefined(scope.path) || scope.path === null) { + _this.$log.warn('polylines: no valid path attribute found'); + } + if (!scope.models) { + _this.$log.warn('polylines: no models found to create from'); + } + return Plural.link(scope, new PolylinesParentModel(scope, element, attrs, gMap, _this.DEFAULTS)); + }; + })(this)); + }; + + return Polylines; + + })(IPolyline); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapRectangle', [ + 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapIRectangle', 'uiGmapRectangleParentModel', function($log, GmapUtil, IRectangle, RectangleParentModel) { + return _.extend(IRectangle, { + link: function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then(function(gMap) { + return new RectangleParentModel(scope, element, attrs, gMap); + }); + } + }); + } + ]); + +}).call(this); +; +/*global angular:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapWindow', [ + 'uiGmapIWindow', 'uiGmapGmapUtil', 'uiGmapWindowChildModel', 'uiGmapLodash', 'uiGmapLogger', function(IWindow, GmapUtil, WindowChildModel, uiGmapLodash, $log) { + var Window; + return Window = (function(superClass) { + extend(Window, superClass); + + Window.include(GmapUtil); + + function Window() { + this.link = bind(this.link, this); + Window.__super__.constructor.call(this); + this.require = ['^' + 'uiGmapGoogleMap', '^?' + 'uiGmapMarker']; + this.template = ''; + $log.debug(this); + this.childWindows = []; + } + + Window.prototype.link = function(scope, element, attrs, ctrls) { + var markerCtrl, markerScope; + markerCtrl = ctrls.length > 1 && (ctrls[1] != null) ? ctrls[1] : void 0; + markerScope = markerCtrl != null ? markerCtrl.getScope() : void 0; + this.mapPromise = IWindow.mapPromise(scope, ctrls[0]); + return this.mapPromise.then((function(_this) { + return function(gMap) { + var isIconVisibleOnClick; + isIconVisibleOnClick = true; + if (angular.isDefined(attrs.isiconvisibleonclick)) { + isIconVisibleOnClick = scope.isIconVisibleOnClick; + } + if (!markerCtrl) { + _this.init(scope, element, isIconVisibleOnClick, gMap); + return; + } + return markerScope.deferred.promise.then(function(gMarker) { + return _this.init(scope, element, isIconVisibleOnClick, gMap, markerScope); + }); + }; + })(this)); + }; + + Window.prototype.init = function(scope, element, isIconVisibleOnClick, gMap, markerScope) { + var childWindow, defaults, gMarker, hasScopeCoords, opts; + defaults = scope.options != null ? scope.options : {}; + hasScopeCoords = (scope != null) && this.validateCoords(scope.coords); + if ((markerScope != null ? markerScope['getGMarker'] : void 0) != null) { + gMarker = markerScope.getGMarker(); + } + opts = hasScopeCoords ? this.createWindowOptions(gMarker, scope, element.html(), defaults) : defaults; + if (gMap != null) { + childWindow = new WindowChildModel({ + scope: scope, + opts: opts, + isIconVisibleOnClick: isIconVisibleOnClick, + gMap: gMap, + markerScope: markerScope, + element: element + }); + this.childWindows.push(childWindow); + scope.$on('$destroy', (function(_this) { + return function() { + _this.childWindows = uiGmapLodash.withoutObjects(_this.childWindows, [childWindow], function(child1, child2) { + return child1.scope.$id === child2.scope.$id; + }); + return _this.childWindows.length = 0; + }; + })(this)); + } + if (scope.control != null) { + scope.control.getGWindows = (function(_this) { + return function() { + return _this.childWindows.map(function(child) { + return child.gObject; + }); + }; + })(this); + scope.control.getChildWindows = (function(_this) { + return function() { + return _this.childWindows; + }; + })(this); + scope.control.getPlurals = scope.control.getChildWindows; + scope.control.showWindow = (function(_this) { + return function() { + return _this.childWindows.map(function(child) { + return child.showWindow(); + }); + }; + })(this); + scope.control.hideWindow = (function(_this) { + return function() { + return _this.childWindows.map(function(child) { + return child.hideWindow(); + }); + }; + })(this); + } + if ((this.onChildCreation != null) && (childWindow != null)) { + return this.onChildCreation(childWindow); + } + }; + + return Window; + + })(IWindow); + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapWindows', [ + 'uiGmapIWindow', 'uiGmapPlural', 'uiGmapWindowsParentModel', 'uiGmapPromise', 'uiGmapLogger', function(IWindow, Plural, WindowsParentModel, uiGmapPromise, $log) { + + /* + Windows directive where many windows map to the models property + */ + var Windows; + return Windows = (function(superClass) { + extend(Windows, superClass); + + function Windows() { + this.link = bind(this.link, this); + Windows.__super__.constructor.call(this); + this.require = ['^' + 'uiGmapGoogleMap', '^?' + 'uiGmapMarkers']; + this.template = ''; + Plural.extend(this); + $log.debug(this); + } + + Windows.prototype.link = function(scope, element, attrs, ctrls) { + var mapScope, markerCtrl, markerScope; + mapScope = ctrls[0].getScope(); + markerCtrl = ctrls.length > 1 && (ctrls[1] != null) ? ctrls[1] : void 0; + markerScope = markerCtrl != null ? markerCtrl.getScope() : void 0; + return mapScope.deferred.promise.then((function(_this) { + return function(map) { + var promise, ref; + promise = (markerScope != null ? (ref = markerScope.deferred) != null ? ref.promise : void 0 : void 0) || uiGmapPromise.resolve(); + return promise.then(function() { + var pieces, ref1; + pieces = (ref1 = _this.parentModel) != null ? ref1.existingPieces : void 0; + if (pieces) { + return pieces.then(function() { + return _this.init(scope, element, attrs, ctrls, map, markerScope); + }); + } else { + return _this.init(scope, element, attrs, ctrls, map, markerScope); + } + }); + }; + })(this)); + }; + + Windows.prototype.init = function(scope, element, attrs, ctrls, map, additionalScope) { + var parentModel; + parentModel = new WindowsParentModel(scope, element, attrs, ctrls, map, additionalScope); + Plural.link(scope, parentModel); + if (scope.control != null) { + scope.control.getGWindows = function() { + return parentModel.plurals.map(function(child) { + return child.gObject; + }); + }; + return scope.control.getChildWindows = function() { + return parentModel.plurals; + }; + } + }; + + return Windows; + + })(IWindow); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Nick Baugh - https://github.com/niftylettuce + */ + + +/*globals angular */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapGoogleMap", ['uiGmapMap', function(uiGmapMap) { + return new uiGmapMap(); + }]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map marker directive + +This directive is used to create a marker on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute icon optional} string url to image used for marker icon +{attribute animate optional} if set to false, the marker won't be animated (on by default) + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapMarker', [ + '$timeout', 'uiGmapMarker', function($timeout, Marker) { + return new Marker($timeout); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map marker directive + +This directive is used to create a marker on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute icon optional} string url to image used for marker icon +{attribute animate optional} if set to false, the marker won't be animated (on by default) + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapMarkers', [ + '$timeout', 'uiGmapMarkers', function($timeout, Markers) { + return new Markers($timeout); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Rick Huizinga - https://plus.google.com/+RickHuizinga + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapPolygon', [ + 'uiGmapPolygon', function(Polygon) { + return new Polygon(); + } + ]); + +}).call(this); +; +/* +@authors +Julian Popescu - https://github.com/jpopesculian +Rick Huizinga - https://plus.google.com/+RickHuizinga + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive("uiGmapCircle", [ + "uiGmapCircle", function(Circle) { + return Circle; + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapPolyline", [ + "uiGmapPolyline", function(Polyline) { + return new Polyline(); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapPolylines', [ + 'uiGmapPolylines', function(Polylines) { + return new Polylines(); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Chentsu Lin - https://github.com/ChenTsuLin + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapRectangle", [ + "uiGmapLogger", "uiGmapRectangle", function($log, Rectangle) { + return Rectangle; + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map info window directive + +This directive is used to create an info window on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute show optional} map will show when this expression returns true + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapWindow", [ + "$timeout", "$compile", "$http", "$templateCache", "uiGmapWindow", function($timeout, $compile, $http, $templateCache, Window) { + return new Window($timeout, $compile, $http, $templateCache); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map info window directive + +This directive is used to create an info window on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute show optional} map will show when this expression returns true + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapWindows", [ + "$timeout", "$compile", "$http", "$templateCache", "$interpolate", "uiGmapWindows", function($timeout, $compile, $http, $templateCache, $interpolate, Windows) { + return new Windows($timeout, $compile, $http, $templateCache, $interpolate); + } + ]); + +}).call(this); +; +/* +@authors: +- Nicolas Laplante https://plus.google.com/108189012221374960701 +- Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map Layer directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. + +{attribute show optional} true (default) shows the trafficlayer otherwise it is hidden + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps').directive('uiGmapLayer', [ + '$timeout', 'uiGmapLogger', 'uiGmapLayerParentModel', function($timeout, Logger, LayerParentModel) { + var Layer; + Layer = (function() { + function Layer() { + this.link = bind(this.link, this); + this.$log = Logger; + this.restrict = 'EMA'; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.template = ''; + this.replace = true; + this.scope = { + show: '=show', + type: '=type', + namespace: '=namespace', + options: '=options', + onCreated: '&oncreated' + }; + } + + Layer.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(map) { + if (scope.onCreated != null) { + return new LayerParentModel(scope, element, attrs, map, scope.onCreated); + } else { + return new LayerParentModel(scope, element, attrs, map); + } + }; + })(this)); + }; + + return Layer; + + })(); + return new Layer(); + } + ]); + +}).call(this); +; +/* +@authors +Adam Kreitals, kreitals@hotmail.com + */ + + +/* +mapControl directive + +This directive is used to create a custom control element on an existing map. +This directive creates a new scope. + +{attribute template required} string url of the template to be used for the control +{attribute position optional} string position of the control of the form top-left or TOP_LEFT defaults to TOP_CENTER +{attribute controller optional} string controller to be applied to the template +{attribute index optional} number index for controlling the order of similarly positioned mapControl elements + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapMapControl", [ + "uiGmapControl", function(Control) { + return new Control(); + } + ]); + +}).call(this); +; +/* +@authors +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapDragZoom', [ + 'uiGmapDragZoom', function(DragZoom) { + return DragZoom; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').directive("uiGmapDrawingManager", [ + "uiGmapDrawingManager", function(DrawingManager) { + return DrawingManager; + } + ]); + +}).call(this); +; +/* +@authors +Nicholas McCready - https://twitter.com/nmccready + * Brunt of the work is in DrawFreeHandChildModel + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapFreeDrawPolygons', [ + 'uiGmapApiFreeDrawPolygons', function(FreeDrawPolygons) { + return new FreeDrawPolygons(); + } + ]); + +}).call(this); +; +/* +Map Layer directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. + +{attribute show optional} true (default) shows the trafficlayer otherwise it is hidden + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module("uiGmapgoogle-maps").directive("uiGmapMapType", [ + "$timeout", "uiGmapLogger", "uiGmapMapTypeParentModel", function($timeout, Logger, MapTypeParentModel) { + var MapType; + MapType = (function() { + function MapType() { + this.link = bind(this.link, this); + this.$log = Logger; + this.restrict = "EMA"; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.template = ''; + this.replace = true; + this.scope = { + show: "=show", + options: '=options', + refresh: '=refresh', + id: '@' + }; + } + + MapType.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(map) { + return new MapTypeParentModel(scope, element, attrs, map); + }; + })(this)); + }; + + return MapType; + + })(); + return new MapType(); + } + ]); + +}).call(this); +; +/* +Map Layers directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps').directive("uiGmapMapTypes", [ + "$timeout", "uiGmapLogger", "uiGmapMapTypesParentModel", function($timeout, Logger, MapTypesParentModel) { + var MapTypes; + MapTypes = (function() { + function MapTypes() { + this.link = bind(this.link, this); + this.$log = Logger; + this.restrict = "EMA"; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.template = ''; + this.scope = { + mapTypes: "=mapTypes", + show: "=show", + options: "=options", + refresh: "=refresh", + id: "=idKey" + }; + } + + MapTypes.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(map) { + return new MapTypesParentModel(scope, element, attrs, map); + }; + })(this)); + }; + + return MapTypes; + + })(); + return new MapTypes(); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Rick Huizinga - https://plus.google.com/+RickHuizinga + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapPolygons', [ + 'uiGmapPolygons', function(Polygons) { + return new Polygons(); + } + ]); + +}).call(this); +; +/* +@authors: +- Nicolas Laplante https://plus.google.com/108189012221374960701 +- Nicholas McCready - https://twitter.com/nmccready +- Carrie Kengle - http://about.me/carrie + */ + + +/* +Places Search Box directive + +This directive is used to create a Places Search Box. +This directive creates a new scope. + +{attribute input required} HTMLInputElement +{attribute options optional} The options that can be set on a SearchBox object (google.maps.places.SearchBoxOptions object specification) + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps').directive('uiGmapSearchBox', [ + 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapSearchBoxParentModel', '$http', '$templateCache', '$compile', function(GoogleMapApi, Logger, SearchBoxParentModel, $http, $templateCache, $compile) { + var SearchBox; + SearchBox = (function() { + SearchBox.prototype.require = 'ngModel'; + + function SearchBox() { + this.link = bind(this.link, this); + this.$log = Logger; + this.restrict = 'EMA'; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.template = ''; + this.replace = true; + this.scope = { + template: '=template', + events: '=events', + position: '=?position', + options: '=?options', + parentdiv: '=?parentdiv', + ngModel: "=?" + }; + } + + SearchBox.prototype.link = function(scope, element, attrs, mapCtrl) { + return GoogleMapApi.then((function(_this) { + return function(maps) { + if (scope.template == null) { + $templateCache.put('uigmap-searchbox-default.tpl.html', ''); + scope.template = 'uigmap-searchbox-default.tpl.html'; + } + return $http.get(scope.template, { + cache: $templateCache + }).then(function(arg) { + var data; + data = arg.data; + if (angular.isUndefined(scope.events)) { + _this.$log.error('searchBox: the events property is required'); + return; + } + return mapCtrl.getScope().deferred.promise.then(function(map) { + var ctrlPosition; + ctrlPosition = angular.isDefined(scope.position) ? scope.position.toUpperCase().replace(/-/g, '_') : 'TOP_LEFT'; + if (!maps.ControlPosition[ctrlPosition]) { + _this.$log.error('searchBox: invalid position property'); + return; + } + return new SearchBoxParentModel(scope, element, attrs, map, ctrlPosition, $compile(data)(scope)); + }); + }); + }; + })(this)); + }; + + return SearchBox; + + })(); + return new SearchBox(); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapShow', [ + '$animate', 'uiGmapLogger', function($animate, $log) { + return { + scope: { + 'uiGmapShow': '=', + 'uiGmapAfterShow': '&', + 'uiGmapAfterHide': '&' + }, + link: function(scope, element) { + var angular_post_1_3_handle, angular_pre_1_3_handle, handle; + angular_post_1_3_handle = function(animateAction, cb) { + return $animate[animateAction](element, 'ng-hide').then(function() { + return cb(); + }); + }; + angular_pre_1_3_handle = function(animateAction, cb) { + return $animate[animateAction](element, 'ng-hide', cb); + }; + handle = function(animateAction, cb) { + if (angular.version.major > 1) { + return $log.error("uiGmapShow is not supported for Angular Major greater than 1.\nYour Major is " + angular.version.major + "\""); + } + if (angular.version.major === 1 && angular.version.minor < 3) { + return angular_pre_1_3_handle(animateAction, cb); + } + return angular_post_1_3_handle(animateAction, cb); + }; + return scope.$watch('uiGmapShow', function(show) { + if (show) { + handle('removeClass', scope.uiGmapAfterShow); + } + if (!show) { + return handle('addClass', scope.uiGmapAfterHide); + } + }); + } + }; + } + ]); + +}).call(this); +; +/* +@authors: +- Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +StreetViewPanorama Directive to care of basic initialization of StreetViewPanorama + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapStreetViewPanorama', [ + 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function(GoogleMapApi, $log, GmapUtil, EventsHelper) { + var name; + name = 'uiGmapStreetViewPanorama'; + return { + restrict: 'EMA', + template: '
', + replace: true, + scope: { + focalcoord: '=', + radius: '=?', + events: '=?', + options: '=?', + control: '=?', + povoptions: '=?', + imagestatus: '=' + }, + link: function(scope, element, attrs) { + return GoogleMapApi.then((function(_this) { + return function(maps) { + var clean, create, didCreateOptionsFromDirective, firstTime, handleSettings, listeners, opts, pano, povOpts, sv; + pano = void 0; + sv = void 0; + didCreateOptionsFromDirective = false; + listeners = void 0; + opts = null; + povOpts = null; + clean = function() { + EventsHelper.removeEvents(listeners); + if (pano != null) { + pano.unbind('position'); + pano.setVisible(false); + } + if (sv != null) { + if ((sv != null ? sv.setVisible : void 0) != null) { + sv.setVisible(false); + } + return sv = void 0; + } + }; + handleSettings = function(perspectivePoint, focalPoint) { + var heading; + heading = google.maps.geometry.spherical.computeHeading(perspectivePoint, focalPoint); + didCreateOptionsFromDirective = true; + scope.radius = scope.radius || 50; + povOpts = angular.extend({ + heading: heading, + zoom: 1, + pitch: 0 + }, scope.povoptions || {}); + opts = opts = angular.extend({ + navigationControl: false, + addressControl: false, + linksControl: false, + position: perspectivePoint, + pov: povOpts, + visible: true + }, scope.options || {}); + return didCreateOptionsFromDirective = false; + }; + create = function() { + var focalPoint; + if (!scope.focalcoord) { + $log.error(name + ": focalCoord needs to be defined"); + return; + } + if (!scope.radius) { + $log.error(name + ": needs a radius to set the camera view from its focal target."); + return; + } + clean(); + if (sv == null) { + sv = new google.maps.StreetViewService(); + } + if (scope.events) { + listeners = EventsHelper.setEvents(sv, scope, scope); + } + focalPoint = GmapUtil.getCoords(scope.focalcoord); + return sv.getPanoramaByLocation(focalPoint, scope.radius, function(streetViewPanoramaData, status) { + var ele, perspectivePoint, ref; + if (scope.imagestatus != null) { + scope.imagestatus = status; + } + if (((ref = scope.events) != null ? ref.image_status_changed : void 0) != null) { + scope.events.image_status_changed(sv, 'image_status_changed', scope, status); + } + if (status === "OK") { + perspectivePoint = streetViewPanoramaData.location.latLng; + handleSettings(perspectivePoint, focalPoint); + ele = element[0]; + return pano = new google.maps.StreetViewPanorama(ele, opts); + } + }); + }; + if (scope.control != null) { + scope.control.getOptions = function() { + return opts; + }; + scope.control.getPovOptions = function() { + return povOpts; + }; + scope.control.getGObject = function() { + return sv; + }; + scope.control.getGPano = function() { + return pano; + }; + } + scope.$watch('options', function(newValue, oldValue) { + if (newValue === oldValue || newValue === opts || didCreateOptionsFromDirective) { + return; + } + return create(); + }); + firstTime = true; + scope.$watch('focalcoord', function(newValue, oldValue) { + if (newValue === oldValue && !firstTime) { + return; + } + if (newValue == null) { + return; + } + firstTime = false; + return create(); + }); + return scope.$on('$destroy', function() { + return clean(); + }); + }; + })(this)); + } + }; + } + ]); + +}).call(this); +;angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapuuid', function() { + //BEGIN REPLACE + /* istanbul ignore next */ + /* + Version: core-1.0 + The MIT License: Copyright (c) 2012 LiosK. +*/ +function UUID(){}UUID.generate=function(){var a=UUID._gri,b=UUID._ha;return b(a(32),8)+"-"+b(a(16),4)+"-"+b(16384|a(12),4)+"-"+b(32768|a(14),4)+"-"+b(a(48),12)};UUID._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)d&1&&(c=e+c);return c}; + + //END REPLACE +return UUID; +}); +;// wrap the utility libraries needed in ./lib +// http://google-maps-utility-library-v3.googlecode.com/svn/ +angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapGoogleMapsUtilV3', function () { + return { + init: _.once(function () { + //BEGIN REPLACE + /* istanbul ignore next */ + +function(){ + function ClusterIcon(cluster,styles){cluster.getMarkerClusterer().extend(ClusterIcon,google.maps.OverlayView),this.cluster_=cluster,this.className_=cluster.getMarkerClusterer().getClusterClass(),this.styles_=styles,this.center_=null,this.div_=null,this.sums_=null,this.visible_=!1,this.setMap(cluster.getMap())}function Cluster(mc){this.markerClusterer_=mc,this.map_=mc.getMap(),this.gridSize_=mc.getGridSize(),this.minClusterSize_=mc.getMinimumClusterSize(),this.averageCenter_=mc.getAverageCenter(),this.hideLabel_=mc.getHideLabel(),this.markers_=[],this.center_=null,this.bounds_=null,this.clusterIcon_=new ClusterIcon(this,mc.getStyles())}function MarkerClusterer(map,opt_markers,opt_options){this.extend(MarkerClusterer,google.maps.OverlayView),opt_markers=opt_markers||[],opt_options=opt_options||{},this.markers_=[],this.clusters_=[],this.listeners_=[],this.activeMap_=null,this.ready_=!1,this.gridSize_=opt_options.gridSize||60,this.minClusterSize_=opt_options.minimumClusterSize||2,this.maxZoom_=opt_options.maxZoom||null,this.styles_=opt_options.styles||[],this.title_=opt_options.title||"",this.zoomOnClick_=!0,void 0!==opt_options.zoomOnClick&&(this.zoomOnClick_=opt_options.zoomOnClick),this.averageCenter_=!1,void 0!==opt_options.averageCenter&&(this.averageCenter_=opt_options.averageCenter),this.ignoreHidden_=!1,void 0!==opt_options.ignoreHidden&&(this.ignoreHidden_=opt_options.ignoreHidden),this.enableRetinaIcons_=!1,void 0!==opt_options.enableRetinaIcons&&(this.enableRetinaIcons_=opt_options.enableRetinaIcons),this.hideLabel_=!1,void 0!==opt_options.hideLabel&&(this.hideLabel_=opt_options.hideLabel),this.imagePath_=opt_options.imagePath||MarkerClusterer.IMAGE_PATH,this.imageExtension_=opt_options.imageExtension||MarkerClusterer.IMAGE_EXTENSION,this.imageSizes_=opt_options.imageSizes||MarkerClusterer.IMAGE_SIZES,this.calculator_=opt_options.calculator||MarkerClusterer.CALCULATOR,this.batchSize_=opt_options.batchSize||MarkerClusterer.BATCH_SIZE,this.batchSizeIE_=opt_options.batchSizeIE||MarkerClusterer.BATCH_SIZE_IE,this.clusterClass_=opt_options.clusterClass||"cluster",-1!==navigator.userAgent.toLowerCase().indexOf("msie")&&(this.batchSize_=this.batchSizeIE_),this.setupStyles_(),this.addMarkers(opt_markers,!0),this.setMap(map)}ClusterIcon.prototype.onAdd=function(){var cMouseDownInCluster,cDraggingMapByCluster,cClusterIcon=this;this.div_=document.createElement("div"),this.div_.className=this.className_,this.visible_&&this.show(),this.getPanes().overlayMouseTarget.appendChild(this.div_),this.boundsChangedListener_=google.maps.event.addListener(this.getMap(),"bounds_changed",function(){cDraggingMapByCluster=cMouseDownInCluster}),google.maps.event.addDomListener(this.div_,"mousedown",function(){cMouseDownInCluster=!0,cDraggingMapByCluster=!1}),google.maps.event.addDomListener(this.div_,"click",function(e){if(cMouseDownInCluster=!1,!cDraggingMapByCluster){var theBounds,mz,mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,"click",cClusterIcon.cluster_),google.maps.event.trigger(mc,"clusterclick",cClusterIcon.cluster_),mc.getZoomOnClick()&&(mz=mc.getMaxZoom(),theBounds=cClusterIcon.cluster_.getBounds(),mc.getMap().fitBounds(theBounds),setTimeout(function(){mc.getMap().fitBounds(theBounds),null!==mz&&mc.getMap().getZoom()>mz&&mc.getMap().setZoom(mz+1)},100)),e.cancelBubble=!0,e.stopPropagation&&e.stopPropagation()}}),google.maps.event.addDomListener(this.div_,"mouseover",function(){var mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,"mouseover",cClusterIcon.cluster_)}),google.maps.event.addDomListener(this.div_,"mouseout",function(){var mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,"mouseout",cClusterIcon.cluster_)})},ClusterIcon.prototype.onRemove=function(){this.div_&&this.div_.parentNode&&(this.hide(),google.maps.event.removeListener(this.boundsChangedListener_),google.maps.event.clearInstanceListeners(this.div_),this.div_.parentNode.removeChild(this.div_),this.div_=null)},ClusterIcon.prototype.draw=function(){if(this.visible_){var pos=this.getPosFromLatLng_(this.center_);this.div_.style.top=pos.y+"px",this.div_.style.left=pos.x+"px"}},ClusterIcon.prototype.hide=function(){this.div_&&(this.div_.style.display="none"),this.visible_=!1},ClusterIcon.prototype.show=function(){if(this.div_){var img="",bp=this.backgroundPosition_.split(" "),spriteH=parseInt(bp[0].trim(),10),spriteV=parseInt(bp[1].trim(),10),pos=this.getPosFromLatLng_(this.center_);this.div_.style.cssText=this.createCss(pos),img="",this.div_.innerHTML=img+"
"+(this.cluster_.hideLabel_?" ":this.sums_.text)+"
",this.div_.title="undefined"==typeof this.sums_.title||""===this.sums_.title?this.cluster_.getMarkerClusterer().getTitle():this.sums_.title,this.div_.style.display=""}this.visible_=!0},ClusterIcon.prototype.useStyle=function(sums){this.sums_=sums;var index=Math.max(0,sums.index-1);index=Math.min(this.styles_.length-1,index);var style=this.styles_[index];this.url_=style.url,this.height_=style.height,this.width_=style.width,this.anchorText_=style.anchorText||[0,0],this.anchorIcon_=style.anchorIcon||[parseInt(this.height_/2,10),parseInt(this.width_/2,10)],this.textColor_=style.textColor||"black",this.textSize_=style.textSize||11,this.textDecoration_=style.textDecoration||"none",this.fontWeight_=style.fontWeight||"bold",this.fontStyle_=style.fontStyle||"normal",this.fontFamily_=style.fontFamily||"Arial,sans-serif",this.backgroundPosition_=style.backgroundPosition||"0 0"},ClusterIcon.prototype.setCenter=function(center){this.center_=center},ClusterIcon.prototype.createCss=function(pos){var style=[];return style.push("cursor: pointer;"),style.push("position: absolute; top: "+pos.y+"px; left: "+pos.x+"px;"),style.push("width: "+this.width_+"px; height: "+this.height_+"px;"),style.join("")},ClusterIcon.prototype.getPosFromLatLng_=function(latlng){var pos=this.getProjection().fromLatLngToDivPixel(latlng);return pos.x-=this.anchorIcon_[1],pos.y-=this.anchorIcon_[0],pos.x=parseInt(pos.x,10),pos.y=parseInt(pos.y,10),pos},Cluster.prototype.getSize=function(){return this.markers_.length},Cluster.prototype.getMarkers=function(){return this.markers_},Cluster.prototype.getCenter=function(){return this.center_},Cluster.prototype.getMap=function(){return this.map_},Cluster.prototype.getMarkerClusterer=function(){return this.markerClusterer_},Cluster.prototype.getBounds=function(){var i,bounds=new google.maps.LatLngBounds(this.center_,this.center_),markers=this.getMarkers();for(i=0;imz)marker.getMap()!==this.map_&&marker.setMap(this.map_);else if(mCounti;i++)this.markers_[i].setMap(null);else marker.setMap(null);return!0},Cluster.prototype.isMarkerInClusterBounds=function(marker){return this.bounds_.contains(marker.getPosition())},Cluster.prototype.calculateBounds_=function(){var bounds=new google.maps.LatLngBounds(this.center_,this.center_);this.bounds_=this.markerClusterer_.getExtendedBounds(bounds)},Cluster.prototype.updateIcon_=function(){var mCount=this.markers_.length,mz=this.markerClusterer_.getMaxZoom();if(null!==mz&&this.map_.getZoom()>mz)return void this.clusterIcon_.hide();if(mCounti;i++)if(marker===this.markers_[i])return!0;return!1},MarkerClusterer.prototype.onAdd=function(){var cMarkerClusterer=this;this.activeMap_=this.getMap(),this.ready_=!0,this.repaint(),this.listeners_=[google.maps.event.addListener(this.getMap(),"zoom_changed",function(){cMarkerClusterer.resetViewport_(!1),(this.getZoom()===(this.get("minZoom")||0)||this.getZoom()===this.get("maxZoom"))&&google.maps.event.trigger(this,"idle")}),google.maps.event.addListener(this.getMap(),"idle",function(){cMarkerClusterer.redraw_()})]},MarkerClusterer.prototype.onRemove=function(){var i;for(i=0;i0))for(i=0;id&&(distance=d,clusterToAddTo=cluster));clusterToAddTo&&clusterToAddTo.isMarkerInClusterBounds(marker)?clusterToAddTo.addMarker(marker):(cluster=new Cluster(this),cluster.addMarker(marker),this.clusters_.push(cluster))},MarkerClusterer.prototype.createClusters_=function(iFirst){var i,marker,mapBounds,cMarkerClusterer=this;if(this.ready_){0===iFirst&&(google.maps.event.trigger(this,"clusteringbegin",this),"undefined"!=typeof this.timerRefStatic&&(clearTimeout(this.timerRefStatic),delete this.timerRefStatic)),mapBounds=this.getMap().getZoom()>3?new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),this.getMap().getBounds().getNorthEast()):new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,-178.48388434375),new google.maps.LatLng(-85.08136444384544,178.00048865625));var bounds=this.getExtendedBounds(mapBounds),iLast=Math.min(iFirst+this.batchSize_,this.markers_.length);for(i=iFirst;iLast>i;i++)marker=this.markers_[i],!marker.isAdded&&this.isMarkerInBounds_(marker,bounds)&&(!this.ignoreHidden_||this.ignoreHidden_&&marker.getVisible())&&this.addToClosestCluster_(marker);if(iLastOverlayView class. + *

+ * An InfoBox behaves like a google.maps.InfoWindow, but it supports several + * additional properties for advanced styling. An InfoBox can also be used as a map label. + *

+ * An InfoBox also fires the same events as a google.maps.InfoWindow. + */ + +/*jslint browser:true */ +/*global google */ + +/** + * @name InfoBoxOptions + * @class This class represents the optional parameter passed to the {@link InfoBox} constructor. + * @property {string|Node} content The content of the InfoBox (plain text or an HTML DOM node). + * @property {boolean} [disableAutoPan=false] Disable auto-pan on open. + * @property {number} maxWidth The maximum width (in pixels) of the InfoBox. Set to 0 if no maximum. + * @property {Size} pixelOffset The offset (in pixels) from the top left corner of the InfoBox + * (or the bottom left corner if the alignBottom property is true) + * to the map pixel corresponding to position. + * @property {LatLng} position The geographic location at which to display the InfoBox. + * @property {number} zIndex The CSS z-index style value for the InfoBox. + * Note: This value overrides a zIndex setting specified in the boxStyle property. + * @property {string} [boxClass="infoBox"] The name of the CSS class defining the styles for the InfoBox container. + * @property {Object} [boxStyle] An object literal whose properties define specific CSS + * style values to be applied to the InfoBox. Style values defined here override those that may + * be defined in the boxClass style sheet. If this property is changed after the + * InfoBox has been created, all previously set styles (except those defined in the style sheet) + * are removed from the InfoBox before the new style values are applied. + * @property {string} closeBoxMargin The CSS margin style value for the close box. + * The default is "2px" (a 2-pixel margin on all sides). + * @property {string} closeBoxURL The URL of the image representing the close box. + * Note: The default is the URL for Google's standard close box. + * Set this property to "" if no close box is required. + * @property {Size} infoBoxClearance Minimum offset (in pixels) from the InfoBox to the + * map edge after an auto-pan. + * @property {boolean} [isHidden=false] Hide the InfoBox on open. + * [Deprecated in favor of the visible property.] + * @property {boolean} [visible=true] Show the InfoBox on open. + * @property {boolean} alignBottom Align the bottom left corner of the InfoBox to the position + * location (default is false which means that the top left corner of the InfoBox is aligned). + * @property {string} pane The pane where the InfoBox is to appear (default is "floatPane"). + * Set the pane to "mapPane" if the InfoBox is being used as a map label. + * Valid pane names are the property names for the google.maps.MapPanes object. + * @property {boolean} enableEventPropagation Propagate mousedown, mousemove, mouseover, mouseout, + * mouseup, click, dblclick, touchstart, touchend, touchmove, and contextmenu events in the InfoBox + * (default is false to mimic the behavior of a google.maps.InfoWindow). Set + * this property to true if the InfoBox is being used as a map label. + */ + +/** + * Creates an InfoBox with the options specified in {@link InfoBoxOptions}. + * Call InfoBox.open to add the box to the map. + * @constructor + * @param {InfoBoxOptions} [opt_opts] + */ +function InfoBox(opt_opts) { + + opt_opts = opt_opts || {}; + + google.maps.OverlayView.apply(this, arguments); + + // Standard options (in common with google.maps.InfoWindow): + // + this.content_ = opt_opts.content || ""; + this.disableAutoPan_ = opt_opts.disableAutoPan || false; + this.maxWidth_ = opt_opts.maxWidth || 0; + this.pixelOffset_ = opt_opts.pixelOffset || new google.maps.Size(0, 0); + this.position_ = opt_opts.position || new google.maps.LatLng(0, 0); + this.zIndex_ = opt_opts.zIndex || null; + + // Additional options (unique to InfoBox): + // + this.boxClass_ = opt_opts.boxClass || "infoBox"; + this.boxStyle_ = opt_opts.boxStyle || {}; + this.closeBoxMargin_ = opt_opts.closeBoxMargin || "2px"; + this.closeBoxURL_ = opt_opts.closeBoxURL || "http://www.google.com/intl/en_us/mapfiles/close.gif"; + if (opt_opts.closeBoxURL === "") { + this.closeBoxURL_ = ""; + } + this.infoBoxClearance_ = opt_opts.infoBoxClearance || new google.maps.Size(1, 1); + + if (typeof opt_opts.visible === "undefined") { + if (typeof opt_opts.isHidden === "undefined") { + opt_opts.visible = true; + } else { + opt_opts.visible = !opt_opts.isHidden; + } + } + this.isHidden_ = !opt_opts.visible; + + this.alignBottom_ = opt_opts.alignBottom || false; + this.pane_ = opt_opts.pane || "floatPane"; + this.enableEventPropagation_ = opt_opts.enableEventPropagation || false; + + this.div_ = null; + this.closeListener_ = null; + this.moveListener_ = null; + this.contextListener_ = null; + this.eventListeners_ = null; + this.fixedWidthSet_ = null; +} + +/* InfoBox extends OverlayView in the Google Maps API v3. + */ +InfoBox.prototype = new google.maps.OverlayView(); + +/** + * Creates the DIV representing the InfoBox. + * @private + */ +InfoBox.prototype.createInfoBoxDiv_ = function () { + + var i; + var events; + var bw; + var me = this; + + // This handler prevents an event in the InfoBox from being passed on to the map. + // + var cancelHandler = function (e) { + e.cancelBubble = true; + if (e.stopPropagation) { + e.stopPropagation(); + } + }; + + // This handler ignores the current event in the InfoBox and conditionally prevents + // the event from being passed on to the map. It is used for the contextmenu event. + // + var ignoreHandler = function (e) { + + e.returnValue = false; + + if (e.preventDefault) { + + e.preventDefault(); + } + + if (!me.enableEventPropagation_) { + + cancelHandler(e); + } + }; + + if (!this.div_) { + + this.div_ = document.createElement("div"); + + this.setBoxStyle_(); + + if (typeof this.content_.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + this.content_; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(this.content_); + } + + // Add the InfoBox DIV to the DOM + this.getPanes()[this.pane_].appendChild(this.div_); + + this.addClickHandler_(); + + if (this.div_.style.width) { + + this.fixedWidthSet_ = true; + + } else { + + if (this.maxWidth_ !== 0 && this.div_.offsetWidth > this.maxWidth_) { + + this.div_.style.width = this.maxWidth_; + this.div_.style.overflow = "auto"; + this.fixedWidthSet_ = true; + + } else { // The following code is needed to overcome problems with MSIE + + bw = this.getBoxWidths_(); + + this.div_.style.width = (this.div_.offsetWidth - bw.left - bw.right) + "px"; + this.fixedWidthSet_ = false; + } + } + + this.panBox_(this.disableAutoPan_); + + if (!this.enableEventPropagation_) { + + this.eventListeners_ = []; + + // Cancel event propagation. + // + // Note: mousemove not included (to resolve Issue 152) + events = ["mousedown", "mouseover", "mouseout", "mouseup", + "click", "dblclick", "touchstart", "touchend", "touchmove"]; + + for (i = 0; i < events.length; i++) { + + this.eventListeners_.push(google.maps.event.addDomListener(this.div_, events[i], cancelHandler)); + } + + // Workaround for Google bug that causes the cursor to change to a pointer + // when the mouse moves over a marker underneath InfoBox. + this.eventListeners_.push(google.maps.event.addDomListener(this.div_, "mouseover", function (e) { + this.style.cursor = "default"; + })); + } + + this.contextListener_ = google.maps.event.addDomListener(this.div_, "contextmenu", ignoreHandler); + + /** + * This event is fired when the DIV containing the InfoBox's content is attached to the DOM. + * @name InfoBox#domready + * @event + */ + google.maps.event.trigger(this, "domready"); + } +}; + +/** + * Returns the HTML tag for the close box. + * @private + */ +InfoBox.prototype.getCloseBoxImg_ = function () { + + var img = ""; + + if (this.closeBoxURL_ !== "") { + + img = " mapWidth) { + xOffset = pixPosition.x + iwWidth + iwOffsetX + padX - mapWidth; + } + if (this.alignBottom_) { + if (pixPosition.y < (-iwOffsetY + padY + iwHeight)) { + yOffset = pixPosition.y + iwOffsetY - padY - iwHeight; + } else if ((pixPosition.y + iwOffsetY + padY) > mapHeight) { + yOffset = pixPosition.y + iwOffsetY + padY - mapHeight; + } + } else { + if (pixPosition.y < (-iwOffsetY + padY)) { + yOffset = pixPosition.y + iwOffsetY - padY; + } else if ((pixPosition.y + iwHeight + iwOffsetY + padY) > mapHeight) { + yOffset = pixPosition.y + iwHeight + iwOffsetY + padY - mapHeight; + } + } + + if (!(xOffset === 0 && yOffset === 0)) { + + // Move the map to the shifted center. + // + var c = map.getCenter(); + map.panBy(xOffset, yOffset); + } + } + } +}; + +/** + * Sets the style of the InfoBox by setting the style sheet and applying + * other specific styles requested. + * @private + */ +InfoBox.prototype.setBoxStyle_ = function () { + + var i, boxStyle; + + if (this.div_) { + + // Apply style values from the style sheet defined in the boxClass parameter: + this.div_.className = this.boxClass_; + + // Clear existing inline style values: + this.div_.style.cssText = ""; + + // Apply style values defined in the boxStyle parameter: + boxStyle = this.boxStyle_; + for (i in boxStyle) { + + if (boxStyle.hasOwnProperty(i)) { + + this.div_.style[i] = boxStyle[i]; + } + } + + // Fix for iOS disappearing InfoBox problem. + // See http://stackoverflow.com/questions/9229535/google-maps-markers-disappear-at-certain-zoom-level-only-on-iphone-ipad + this.div_.style.WebkitTransform = "translateZ(0)"; + + // Fix up opacity style for benefit of MSIE: + // + if (typeof this.div_.style.opacity !== "undefined" && this.div_.style.opacity !== "") { + // See http://www.quirksmode.org/css/opacity.html + this.div_.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(Opacity=" + (this.div_.style.opacity * 100) + ")\""; + this.div_.style.filter = "alpha(opacity=" + (this.div_.style.opacity * 100) + ")"; + } + + // Apply required styles: + // + this.div_.style.position = "absolute"; + this.div_.style.visibility = 'hidden'; + if (this.zIndex_ !== null) { + + this.div_.style.zIndex = this.zIndex_; + } + } +}; + +/** + * Get the widths of the borders of the InfoBox. + * @private + * @return {Object} widths object (top, bottom left, right) + */ +InfoBox.prototype.getBoxWidths_ = function () { + + var computedStyle; + var bw = {top: 0, bottom: 0, left: 0, right: 0}; + var box = this.div_; + + if (document.defaultView && document.defaultView.getComputedStyle) { + + computedStyle = box.ownerDocument.defaultView.getComputedStyle(box, ""); + + if (computedStyle) { + + // The computed styles are always in pixel units (good!) + bw.top = parseInt(computedStyle.borderTopWidth, 10) || 0; + bw.bottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; + bw.left = parseInt(computedStyle.borderLeftWidth, 10) || 0; + bw.right = parseInt(computedStyle.borderRightWidth, 10) || 0; + } + + } else if (document.documentElement.currentStyle) { // MSIE + + if (box.currentStyle) { + + // The current styles may not be in pixel units, but assume they are (bad!) + bw.top = parseInt(box.currentStyle.borderTopWidth, 10) || 0; + bw.bottom = parseInt(box.currentStyle.borderBottomWidth, 10) || 0; + bw.left = parseInt(box.currentStyle.borderLeftWidth, 10) || 0; + bw.right = parseInt(box.currentStyle.borderRightWidth, 10) || 0; + } + } + + return bw; +}; + +/** + * Invoked when close is called. Do not call it directly. + */ +InfoBox.prototype.onRemove = function () { + + if (this.div_) { + + this.div_.parentNode.removeChild(this.div_); + this.div_ = null; + } +}; + +/** + * Draws the InfoBox based on the current map projection and zoom level. + */ +InfoBox.prototype.draw = function () { + + this.createInfoBoxDiv_(); + + var pixPosition = this.getProjection().fromLatLngToDivPixel(this.position_); + + this.div_.style.left = (pixPosition.x + this.pixelOffset_.width) + "px"; + + if (this.alignBottom_) { + this.div_.style.bottom = -(pixPosition.y + this.pixelOffset_.height) + "px"; + } else { + this.div_.style.top = (pixPosition.y + this.pixelOffset_.height) + "px"; + } + + if (this.isHidden_) { + + this.div_.style.visibility = "hidden"; + + } else { + + this.div_.style.visibility = "visible"; + } +}; + +/** + * Sets the options for the InfoBox. Note that changes to the maxWidth, + * closeBoxMargin, closeBoxURL, and enableEventPropagation + * properties have no affect until the current InfoBox is closed and a new one + * is opened. + * @param {InfoBoxOptions} opt_opts + */ +InfoBox.prototype.setOptions = function (opt_opts) { + if (typeof opt_opts.boxClass !== "undefined") { // Must be first + + this.boxClass_ = opt_opts.boxClass; + this.setBoxStyle_(); + } + if (typeof opt_opts.boxStyle !== "undefined") { // Must be second + + this.boxStyle_ = opt_opts.boxStyle; + this.setBoxStyle_(); + } + if (typeof opt_opts.content !== "undefined") { + + this.setContent(opt_opts.content); + } + if (typeof opt_opts.disableAutoPan !== "undefined") { + + this.disableAutoPan_ = opt_opts.disableAutoPan; + } + if (typeof opt_opts.maxWidth !== "undefined") { + + this.maxWidth_ = opt_opts.maxWidth; + } + if (typeof opt_opts.pixelOffset !== "undefined") { + + this.pixelOffset_ = opt_opts.pixelOffset; + } + if (typeof opt_opts.alignBottom !== "undefined") { + + this.alignBottom_ = opt_opts.alignBottom; + } + if (typeof opt_opts.position !== "undefined") { + + this.setPosition(opt_opts.position); + } + if (typeof opt_opts.zIndex !== "undefined") { + + this.setZIndex(opt_opts.zIndex); + } + if (typeof opt_opts.closeBoxMargin !== "undefined") { + + this.closeBoxMargin_ = opt_opts.closeBoxMargin; + } + if (typeof opt_opts.closeBoxURL !== "undefined") { + + this.closeBoxURL_ = opt_opts.closeBoxURL; + } + if (typeof opt_opts.infoBoxClearance !== "undefined") { + + this.infoBoxClearance_ = opt_opts.infoBoxClearance; + } + if (typeof opt_opts.isHidden !== "undefined") { + + this.isHidden_ = opt_opts.isHidden; + } + if (typeof opt_opts.visible !== "undefined") { + + this.isHidden_ = !opt_opts.visible; + } + if (typeof opt_opts.enableEventPropagation !== "undefined") { + + this.enableEventPropagation_ = opt_opts.enableEventPropagation; + } + + if (this.div_) { + + this.draw(); + } +}; + +/** + * Sets the content of the InfoBox. + * The content can be plain text or an HTML DOM node. + * @param {string|Node} content + */ +InfoBox.prototype.setContent = function (content) { + this.content_ = content; + + if (this.div_) { + + if (this.closeListener_) { + + google.maps.event.removeListener(this.closeListener_); + this.closeListener_ = null; + } + + // Odd code required to make things work with MSIE. + // + if (!this.fixedWidthSet_) { + + this.div_.style.width = ""; + } + + if (typeof content.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + content; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(content); + } + + // Perverse code required to make things work with MSIE. + // (Ensures the close box does, in fact, float to the right.) + // + if (!this.fixedWidthSet_) { + this.div_.style.width = this.div_.offsetWidth + "px"; + if (typeof content.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + content; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(content); + } + } + + this.addClickHandler_(); + } + + /** + * This event is fired when the content of the InfoBox changes. + * @name InfoBox#content_changed + * @event + */ + google.maps.event.trigger(this, "content_changed"); +}; + +/** + * Sets the geographic location of the InfoBox. + * @param {LatLng} latlng + */ +InfoBox.prototype.setPosition = function (latlng) { + + this.position_ = latlng; + + if (this.div_) { + + this.draw(); + } + + /** + * This event is fired when the position of the InfoBox changes. + * @name InfoBox#position_changed + * @event + */ + google.maps.event.trigger(this, "position_changed"); +}; + +/** + * Sets the zIndex style for the InfoBox. + * @param {number} index + */ +InfoBox.prototype.setZIndex = function (index) { + + this.zIndex_ = index; + + if (this.div_) { + + this.div_.style.zIndex = index; + } + + /** + * This event is fired when the zIndex of the InfoBox changes. + * @name InfoBox#zindex_changed + * @event + */ + google.maps.event.trigger(this, "zindex_changed"); +}; + +/** + * Sets the visibility of the InfoBox. + * @param {boolean} isVisible + */ +InfoBox.prototype.setVisible = function (isVisible) { + + this.isHidden_ = !isVisible; + if (this.div_) { + this.div_.style.visibility = (this.isHidden_ ? "hidden" : "visible"); + } +}; + +/** + * Returns the content of the InfoBox. + * @returns {string} + */ +InfoBox.prototype.getContent = function () { + + return this.content_; +}; + +/** + * Returns the geographic location of the InfoBox. + * @returns {LatLng} + */ +InfoBox.prototype.getPosition = function () { + + return this.position_; +}; + +/** + * Returns the zIndex for the InfoBox. + * @returns {number} + */ +InfoBox.prototype.getZIndex = function () { + + return this.zIndex_; +}; + +/** + * Returns a flag indicating whether the InfoBox is visible. + * @returns {boolean} + */ +InfoBox.prototype.getVisible = function () { + + var isVisible; + + if ((typeof this.getMap() === "undefined") || (this.getMap() === null)) { + isVisible = false; + } else { + isVisible = !this.isHidden_; + } + return isVisible; +}; + +/** + * Shows the InfoBox. [Deprecated; use setVisible instead.] + */ +InfoBox.prototype.show = function () { + + this.isHidden_ = false; + if (this.div_) { + this.div_.style.visibility = "visible"; + } +}; + +/** + * Hides the InfoBox. [Deprecated; use setVisible instead.] + */ +InfoBox.prototype.hide = function () { + + this.isHidden_ = true; + if (this.div_) { + this.div_.style.visibility = "hidden"; + } +}; + +/** + * Adds the InfoBox to the specified map or Street View panorama. If anchor + * (usually a google.maps.Marker) is specified, the position + * of the InfoBox is set to the position of the anchor. If the + * anchor is dragged to a new location, the InfoBox moves as well. + * @param {Map|StreetViewPanorama} map + * @param {MVCObject} [anchor] + */ +InfoBox.prototype.open = function (map, anchor) { + + var me = this; + + if (anchor) { + + this.position_ = anchor.getPosition(); + this.moveListener_ = google.maps.event.addListener(anchor, "position_changed", function () { + me.setPosition(this.getPosition()); + }); + } + + this.setMap(map); + + if (this.div_) { + + this.panBox_(); + } +}; + +/** + * Removes the InfoBox from the map. + */ +InfoBox.prototype.close = function () { + + var i; + + if (this.closeListener_) { + + google.maps.event.removeListener(this.closeListener_); + this.closeListener_ = null; + } + + if (this.eventListeners_) { + + for (i = 0; i < this.eventListeners_.length; i++) { + + google.maps.event.removeListener(this.eventListeners_[i]); + } + this.eventListeners_ = null; + } + + if (this.moveListener_) { + + google.maps.event.removeListener(this.moveListener_); + this.moveListener_ = null; + } + + if (this.contextListener_) { + + google.maps.event.removeListener(this.contextListener_); + this.contextListener_ = null; + } + + this.setMap(null); +}; + +/** + * google-maps-utility-library-v3-keydragzoom + * + * @version: 2.0.9 + * @author: Nianwei Liu [nianwei at gmail dot com] & Gary Little [gary at luxcentral dot com] + * @contributors: undefined + * @date: Fri May 13 2016 13:45:18 GMT-0400 (EDT) + * @license: Apache License 2.0 + */ +/** + * @fileoverview This library adds a drag zoom capability to a V3 Google map. + * When drag zoom is enabled, holding down a designated hot key (shift | ctrl | alt) + * while dragging a box around an area of interest will zoom the map in to that area when + * the mouse button is released. Optionally, a visual control can also be supplied for turning + * a drag zoom operation on and off. + * Only one line of code is needed: google.maps.Map.enableKeyDragZoom(); + *

+ * NOTE: Do not use Ctrl as the hot key with Google Maps JavaScript API V3 since, unlike with V2, + * it causes a context menu to appear when running on the Macintosh. + *

+ * Note that if the map's container has a border around it, the border widths must be specified + * in pixel units (or as thin, medium, or thick). This is required because of an MSIE limitation. + *

NL: 2009-05-28: initial port to core API V3. + *
NL: 2009-11-02: added a temp fix for -moz-transform for FF3.5.x using code from Paul Kulchenko (http://notebook.kulchenko.com/maps/gridmove). + *
NL: 2010-02-02: added a fix for IE flickering on divs onmousemove, caused by scroll value when get mouse position. + *
GL: 2010-06-15: added a visual control option. + */ +(function () { + /*jslint browser:true */ + /*global window,google */ + /* Utility functions use "var funName=function()" syntax to allow use of the */ + /* Dean Edwards Packer compression tool (with Shrink variables, without Base62 encode). */ + + /** + * Converts "thin", "medium", and "thick" to pixel widths + * in an MSIE environment. Not called for other browsers + * because getComputedStyle() returns pixel widths automatically. + * @param {string} widthValue The value of the border width parameter. + */ + var toPixels = function (widthValue) { + var px; + switch (widthValue) { + case "thin": + px = "2px"; + break; + case "medium": + px = "4px"; + break; + case "thick": + px = "6px"; + break; + default: + px = widthValue; + } + return px; + }; + /** + * Get the widths of the borders of an HTML element. + * + * @param {Node} h The HTML element. + * @return {Object} The width object {top, bottom left, right}. + */ + var getBorderWidths = function (h) { + var computedStyle; + var bw = {}; + if (document.defaultView && document.defaultView.getComputedStyle) { + computedStyle = h.ownerDocument.defaultView.getComputedStyle(h, ""); + if (computedStyle) { + // The computed styles are always in pixel units (good!) + bw.top = parseInt(computedStyle.borderTopWidth, 10) || 0; + bw.bottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; + bw.left = parseInt(computedStyle.borderLeftWidth, 10) || 0; + bw.right = parseInt(computedStyle.borderRightWidth, 10) || 0; + return bw; + } + } else if (document.documentElement.currentStyle) { // MSIE + if (h.currentStyle) { + // The current styles may not be in pixel units so try to convert (bad!) + bw.top = parseInt(toPixels(h.currentStyle.borderTopWidth), 10) || 0; + bw.bottom = parseInt(toPixels(h.currentStyle.borderBottomWidth), 10) || 0; + bw.left = parseInt(toPixels(h.currentStyle.borderLeftWidth), 10) || 0; + bw.right = parseInt(toPixels(h.currentStyle.borderRightWidth), 10) || 0; + return bw; + } + } + // Shouldn't get this far for any modern browser + bw.top = parseInt(h.style["border-top-width"], 10) || 0; + bw.bottom = parseInt(h.style["border-bottom-width"], 10) || 0; + bw.left = parseInt(h.style["border-left-width"], 10) || 0; + bw.right = parseInt(h.style["border-right-width"], 10) || 0; + return bw; + }; + + // Page scroll values for use by getMousePosition. To prevent flickering on MSIE + // they are calculated only when the document actually scrolls, not every time the + // mouse moves (as they would be if they were calculated inside getMousePosition). + var scroll = { + x: 0, + y: 0 + }; + var getScrollValue = function (e) { + scroll.x = (typeof document.documentElement.scrollLeft !== "undefined" ? document.documentElement.scrollLeft : document.body.scrollLeft); + scroll.y = (typeof document.documentElement.scrollTop !== "undefined" ? document.documentElement.scrollTop : document.body.scrollTop); + }; + getScrollValue(); + + /** + * Get the position of the mouse relative to the document. + * @param {Event} e The mouse event. + * @return {Object} The position object {left, top}. + */ + var getMousePosition = function (e) { + var posX = 0, posY = 0; + e = e || window.event; + if (typeof e.pageX !== "undefined") { + posX = e.pageX; + posY = e.pageY; + } else if (typeof e.clientX !== "undefined") { // MSIE + posX = e.clientX + scroll.x; + posY = e.clientY + scroll.y; + } + return { + left: posX, + top: posY + }; + }; + /** + * Get the position of an HTML element relative to the document. + * @param {Node} h The HTML element. + * @return {Object} The position object {left, top}. + */ + var getElementPosition = function (h) { + var posX = h.offsetLeft; + var posY = h.offsetTop; + var parent = h.offsetParent; + // Add offsets for all ancestors in the hierarchy + while (parent !== null) { + // Adjust for scrolling elements which may affect the map position. + // + // See http://www.howtocreate.co.uk/tutorials/javascript/browserspecific + // + // "...make sure that every element [on a Web page] with an overflow + // of anything other than visible also has a position style set to + // something other than the default static..." + if (parent !== document.body && parent !== document.documentElement) { + posX -= parent.scrollLeft; + posY -= parent.scrollTop; + } + // See http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/4cb86c0c1037a5e5 + // Example: http://notebook.kulchenko.com/maps/gridmove + var m = parent; + // This is the "normal" way to get offset information: + var moffx = m.offsetLeft; + var moffy = m.offsetTop; + // This covers those cases where a transform is used: + if (!moffx && !moffy && window.getComputedStyle) { + var matrix = document.defaultView.getComputedStyle(m, null).MozTransform || + document.defaultView.getComputedStyle(m, null).WebkitTransform; + if (matrix) { + if (typeof matrix === "string") { + var parms = matrix.split(","); + moffx += parseInt(parms[4], 10) || 0; + moffy += parseInt(parms[5], 10) || 0; + } + } + } + posX += moffx; + posY += moffy; + parent = parent.offsetParent; + } + return { + left: posX, + top: posY + }; + }; + /** + * Set the properties of an object to those from another object. + * @param {Object} obj The target object. + * @param {Object} vals The source object. + */ + var setVals = function (obj, vals) { + if (obj && vals) { + for (var x in vals) { + if (vals.hasOwnProperty(x)) { + obj[x] = vals[x]; + } + } + } + return obj; + }; + /** + * Set the opacity. If op is not passed in, this function just performs an MSIE fix. + * @param {Node} h The HTML element. + * @param {number} op The opacity value (0-1). + */ + var setOpacity = function (h, op) { + if (typeof op !== "undefined") { + h.style.opacity = op; + } + if (typeof h.style.opacity !== "undefined" && h.style.opacity !== "") { + h.style.filter = "alpha(opacity=" + (h.style.opacity * 100) + ")"; + } + }; + /** + * @name KeyDragZoomOptions + * @class This class represents the optional parameter passed into google.maps.Map.enableKeyDragZoom. + * @property {string} [key="shift"] The hot key to hold down to activate a drag zoom, shift | ctrl | alt. + * NOTE: Do not use Ctrl as the hot key with Google Maps JavaScript API V3 since, unlike with V2, + * it causes a context menu to appear when running on the Macintosh. Also note that the + * alt hot key refers to the Option key on a Macintosh. + * @property {Object} [boxStyle={border: "4px solid #736AFF"}] + * An object literal defining the CSS styles of the zoom box. + * Border widths must be specified in pixel units (or as thin, medium, or thick). + * @property {Object} [veilStyle={backgroundColor: "gray", opacity: 0.25, cursor: "crosshair"}] + * An object literal defining the CSS styles of the veil pane which covers the map when a drag + * zoom is activated. The previous name for this property was paneStyle but the use + * of this name is now deprecated. + * @property {boolean} [noZoom=false] A flag indicating whether to disable zooming after an area is + * selected. Set this to true to allow KeyDragZoom to be used as a simple area + * selection tool. + * @property {boolean} [visualEnabled=false] A flag indicating whether a visual control is to be used. + * @property {string} [visualClass=""] The name of the CSS class defining the styles for the visual + * control. To prevent the visual control from being printed, set this property to the name of + * a class, defined inside a @media print rule, which sets the CSS + * display style to none. + * @property {ControlPosition} [visualPosition=google.maps.ControlPosition.LEFT_TOP] + * The position of the visual control. + * @property {Size} [visualPositionOffset=google.maps.Size(35, 0)] The width and height values + * provided by this property are the offsets (in pixels) from the location at which the control + * would normally be drawn to the desired drawing location. + * @property {number} [visualPositionIndex=null] The index of the visual control. + * The index is for controlling the placement of the control relative to other controls at the + * position given by visualPosition; controls with a lower index are placed first. + * Use a negative value to place the control before any default controls. No index is + * generally required. + * @property {String} [visualSprite="http://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png"] + * The URL of the sprite image used for showing the visual control in the on, off, and hot + * (i.e., when the mouse is over the control) states. The three images within the sprite must + * be the same size and arranged in on-hot-off order in a single row with no spaces between images. + * @property {Size} [visualSize=google.maps.Size(20, 20)] The width and height values provided by + * this property are the size (in pixels) of each of the images within visualSprite. + * @property {Object} [visualTips={off: "Turn on drag zoom mode", on: "Turn off drag zoom mode"}] + * An object literal defining the help tips that appear when + * the mouse moves over the visual control. The off property is the tip to be shown + * when the control is off and the on property is the tip to be shown when the + * control is on. + */ + /** + * @name DragZoom + * @class This class represents a drag zoom object for a map. The object is activated by holding down the hot key + * or by turning on the visual control. + * This object is created when google.maps.Map.enableKeyDragZoom is called; it cannot be created directly. + * Use google.maps.Map.getDragZoomObject to gain access to this object in order to attach event listeners. + * @param {Map} map The map to which the DragZoom object is to be attached. + * @param {KeyDragZoomOptions} [opt_zoomOpts] The optional parameters. + */ + function DragZoom(map, opt_zoomOpts) { + var me = this; + var ov = new google.maps.OverlayView(); + ov.onAdd = function () { + me.init_(map, opt_zoomOpts); + }; + ov.draw = function () { + }; + ov.onRemove = function () { + }; + ov.setMap(map); + this.prjov_ = ov; + } + /** + * Initialize the tool. + * @param {Map} map The map to which the DragZoom object is to be attached. + * @param {KeyDragZoomOptions} [opt_zoomOpts] The optional parameters. + */ + DragZoom.prototype.init_ = function (map, opt_zoomOpts) { + var i; + var me = this; + this.map_ = map; + opt_zoomOpts = opt_zoomOpts || {}; + this.key_ = opt_zoomOpts.key || "shift"; + this.key_ = this.key_.toLowerCase(); + this.borderWidths_ = getBorderWidths(this.map_.getDiv()); + this.veilDiv_ = []; + for (i = 0; i < 4; i++) { + this.veilDiv_[i] = document.createElement("div"); + // Prevents selection of other elements on the webpage + // when a drag zoom operation is in progress: + this.veilDiv_[i].onselectstart = function () { + return false; + }; + // Apply default style values for the veil: + setVals(this.veilDiv_[i].style, { + backgroundColor: "gray", + opacity: 0.25, + cursor: "crosshair" + }); + // Apply style values specified in veilStyle parameter: + setVals(this.veilDiv_[i].style, opt_zoomOpts.paneStyle); // Old option name was "paneStyle" + setVals(this.veilDiv_[i].style, opt_zoomOpts.veilStyle); // New name is "veilStyle" + // Apply mandatory style values: + setVals(this.veilDiv_[i].style, { + position: "absolute", + overflow: "hidden", + display: "none" + }); + // Workaround for Firefox Shift-Click problem: + if (this.key_ === "shift") { + this.veilDiv_[i].style.MozUserSelect = "none"; + } + setOpacity(this.veilDiv_[i]); + // An IE fix: If the background is transparent it cannot capture mousedown + // events, so if it is, change the background to white with 0 opacity. + if (this.veilDiv_[i].style.backgroundColor === "transparent") { + this.veilDiv_[i].style.backgroundColor = "white"; + setOpacity(this.veilDiv_[i], 0); + } + this.map_.getDiv().appendChild(this.veilDiv_[i]); + } + + this.noZoom_ = opt_zoomOpts.noZoom || false; + this.visualEnabled_ = opt_zoomOpts.visualEnabled || false; + this.visualClass_ = opt_zoomOpts.visualClass || ""; + this.visualPosition_ = opt_zoomOpts.visualPosition || google.maps.ControlPosition.LEFT_TOP; + this.visualPositionOffset_ = opt_zoomOpts.visualPositionOffset || new google.maps.Size(35, 0); + this.visualPositionIndex_ = opt_zoomOpts.visualPositionIndex || null; + this.visualSprite_ = opt_zoomOpts.visualSprite || "http" + (document.location.protocol === "https:" ? "s" : "") + "://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png"; + this.visualSize_ = opt_zoomOpts.visualSize || new google.maps.Size(20, 20); + this.visualTips_ = opt_zoomOpts.visualTips || {}; + this.visualTips_.off = this.visualTips_.off || "Turn on drag zoom mode"; + this.visualTips_.on = this.visualTips_.on || "Turn off drag zoom mode"; + + this.boxDiv_ = document.createElement("div"); + // Apply default style values for the zoom box: + setVals(this.boxDiv_.style, { + border: "4px solid #736AFF" + }); + // Apply style values specified in boxStyle parameter: + setVals(this.boxDiv_.style, opt_zoomOpts.boxStyle); + // Apply mandatory style values: + setVals(this.boxDiv_.style, { + position: "absolute", + display: "none" + }); + setOpacity(this.boxDiv_); + this.map_.getDiv().appendChild(this.boxDiv_); + this.boxBorderWidths_ = getBorderWidths(this.boxDiv_); + + this.listeners_ = [ + google.maps.event.addDomListener(document, "keydown", function (e) { + me.onKeyDown_(e); + }), + google.maps.event.addDomListener(document, "keyup", function (e) { + me.onKeyUp_(e); + }), + google.maps.event.addDomListener(this.veilDiv_[0], "mousedown", function (e) { + me.onMouseDown_(e); + }), + google.maps.event.addDomListener(this.veilDiv_[1], "mousedown", function (e) { + me.onMouseDown_(e); + }), + google.maps.event.addDomListener(this.veilDiv_[2], "mousedown", function (e) { + me.onMouseDown_(e); + }), + google.maps.event.addDomListener(this.veilDiv_[3], "mousedown", function (e) { + me.onMouseDown_(e); + }), + google.maps.event.addDomListener(document, "mousedown", function (e) { + me.onMouseDownDocument_(e); + }), + google.maps.event.addDomListener(document, "mousemove", function (e) { + me.onMouseMove_(e); + }), + google.maps.event.addDomListener(document, "mouseup", function (e) { + me.onMouseUp_(e); + }), + google.maps.event.addDomListener(window, "scroll", getScrollValue) + ]; + + this.hotKeyDown_ = false; + this.mouseDown_ = false; + this.dragging_ = false; + this.startPt_ = null; + this.endPt_ = null; + this.mapWidth_ = null; + this.mapHeight_ = null; + this.mousePosn_ = null; + this.mapPosn_ = null; + + if (this.visualEnabled_) { + this.buttonDiv_ = this.initControl_(this.visualPositionOffset_); + if (this.visualPositionIndex_ !== null) { + this.buttonDiv_.index = this.visualPositionIndex_; + } + this.map_.controls[this.visualPosition_].push(this.buttonDiv_); + this.controlIndex_ = this.map_.controls[this.visualPosition_].length - 1; + } + }; + /** + * Initializes the visual control and returns its DOM element. + * @param {Size} offset The offset of the control from its normal position. + * @return {Node} The DOM element containing the visual control. + */ + DragZoom.prototype.initControl_ = function (offset) { + var control; + var image; + var me = this; + + control = document.createElement("div"); + control.className = this.visualClass_; + control.style.position = "relative"; + control.style.overflow = "hidden"; + control.style.height = this.visualSize_.height + "px"; + control.style.width = this.visualSize_.width + "px"; + control.title = this.visualTips_.off; + image = document.createElement("img"); + image.src = this.visualSprite_; + image.style.position = "absolute"; + image.style.left = -(this.visualSize_.width * 2) + "px"; + image.style.top = 0 + "px"; + control.appendChild(image); + control.onclick = function (e) { + me.hotKeyDown_ = !me.hotKeyDown_; + if (me.hotKeyDown_) { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 0) + "px"; + me.buttonDiv_.title = me.visualTips_.on; + me.activatedByControl_ = true; + google.maps.event.trigger(me, "activate"); + } else { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 2) + "px"; + me.buttonDiv_.title = me.visualTips_.off; + google.maps.event.trigger(me, "deactivate"); + } + me.onMouseMove_(e); // Updates the veil + }; + control.onmouseover = function () { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 1) + "px"; + }; + control.onmouseout = function () { + if (me.hotKeyDown_) { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 0) + "px"; + me.buttonDiv_.title = me.visualTips_.on; + } else { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 2) + "px"; + me.buttonDiv_.title = me.visualTips_.off; + } + }; + control.ondragstart = function () { + return false; + }; + setVals(control.style, { + cursor: "pointer", + marginTop: offset.height + "px", + marginLeft: offset.width + "px" + }); + return control; + }; + /** + * Returns true if the hot key is being pressed when an event occurs. + * @param {Event} e The keyboard event. + * @return {boolean} Flag indicating whether the hot key is down. + */ + DragZoom.prototype.isHotKeyDown_ = function (e) { + var isHot; + e = e || window.event; + isHot = (e.shiftKey && this.key_ === "shift") || (e.altKey && this.key_ === "alt") || (e.ctrlKey && this.key_ === "ctrl"); + if (!isHot) { + // Need to look at keyCode for Opera because it + // doesn't set the shiftKey, altKey, ctrlKey properties + // unless a non-modifier event is being reported. + // + // See http://cross-browser.com/x/examples/shift_mode.php + // Also see http://unixpapa.com/js/key.html + switch (e.keyCode) { + case 16: + if (this.key_ === "shift") { + isHot = true; + } + break; + case 17: + if (this.key_ === "ctrl") { + isHot = true; + } + break; + case 18: + if (this.key_ === "alt") { + isHot = true; + } + break; + } + } + return isHot; + }; + /** + * Returns true if the mouse is on top of the map div. + * The position is captured in onMouseMove_. + * @return {boolean} + */ + DragZoom.prototype.isMouseOnMap_ = function () { + var mousePosn = this.mousePosn_; + if (mousePosn) { + var mapPosn = this.mapPosn_; + var mapDiv = this.map_.getDiv(); + return mousePosn.left > mapPosn.left && mousePosn.left < (mapPosn.left + mapDiv.offsetWidth) && + mousePosn.top > mapPosn.top && mousePosn.top < (mapPosn.top + mapDiv.offsetHeight); + } else { + // if user never moved mouse + return false; + } + }; + /** + * Show the veil if the hot key is down and the mouse is over the map, + * otherwise hide the veil. + */ + DragZoom.prototype.setVeilVisibility_ = function () { + var i; + if (this.map_ && this.hotKeyDown_ && this.isMouseOnMap_()) { + var mapDiv = this.map_.getDiv(); + this.mapWidth_ = mapDiv.offsetWidth - (this.borderWidths_.left + this.borderWidths_.right); + this.mapHeight_ = mapDiv.offsetHeight - (this.borderWidths_.top + this.borderWidths_.bottom); + if (this.activatedByControl_) { // Veil covers entire map (except control) + var left = parseInt(this.buttonDiv_.style.left, 10) + this.visualPositionOffset_.width; + var top = parseInt(this.buttonDiv_.style.top, 10) + this.visualPositionOffset_.height; + var width = this.visualSize_.width; + var height = this.visualSize_.height; + // Left veil rectangle: + this.veilDiv_[0].style.top = "0px"; + this.veilDiv_[0].style.left = "0px"; + this.veilDiv_[0].style.width = left + "px"; + this.veilDiv_[0].style.height = this.mapHeight_ + "px"; + // Right veil rectangle: + this.veilDiv_[1].style.top = "0px"; + this.veilDiv_[1].style.left = (left + width) + "px"; + this.veilDiv_[1].style.width = (this.mapWidth_ - (left + width)) + "px"; + this.veilDiv_[1].style.height = this.mapHeight_ + "px"; + // Top veil rectangle: + this.veilDiv_[2].style.top = "0px"; + this.veilDiv_[2].style.left = left + "px"; + this.veilDiv_[2].style.width = width + "px"; + this.veilDiv_[2].style.height = top + "px"; + // Bottom veil rectangle: + this.veilDiv_[3].style.top = (top + height) + "px"; + this.veilDiv_[3].style.left = left + "px"; + this.veilDiv_[3].style.width = width + "px"; + this.veilDiv_[3].style.height = (this.mapHeight_ - (top + height)) + "px"; + for (i = 0; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.display = "block"; + } + } else { + this.veilDiv_[0].style.left = "0px"; + this.veilDiv_[0].style.top = "0px"; + this.veilDiv_[0].style.width = this.mapWidth_ + "px"; + this.veilDiv_[0].style.height = this.mapHeight_ + "px"; + for (i = 1; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.width = "0px"; + this.veilDiv_[i].style.height = "0px"; + } + for (i = 0; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.display = "block"; + } + } + } else { + for (i = 0; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.display = "none"; + } + } + }; + /** + * Handle key down. Show the veil if the hot key has been pressed. + * @param {Event} e The keyboard event. + */ + DragZoom.prototype.onKeyDown_ = function (e) { + if (this.map_ && !this.hotKeyDown_ && this.isHotKeyDown_(e)) { + this.mapPosn_ = getElementPosition(this.map_.getDiv()); + this.hotKeyDown_ = true; + this.activatedByControl_ = false; + this.setVeilVisibility_(); + /** + * This event is fired when the hot key is pressed. + * @name DragZoom#activate + * @event + */ + google.maps.event.trigger(this, "activate"); + } + }; + /** + * Get the google.maps.Point of the mouse position. + * @param {Event} e The mouse event. + * @return {Point} The mouse position. + */ + DragZoom.prototype.getMousePoint_ = function (e) { + var mousePosn = getMousePosition(e); + var p = new google.maps.Point(); + p.x = mousePosn.left - this.mapPosn_.left - this.borderWidths_.left; + p.y = mousePosn.top - this.mapPosn_.top - this.borderWidths_.top; + p.x = Math.min(p.x, this.mapWidth_); + p.y = Math.min(p.y, this.mapHeight_); + p.x = Math.max(p.x, 0); + p.y = Math.max(p.y, 0); + return p; + }; + /** + * Handle mouse down. + * @param {Event} e The mouse event. + */ + DragZoom.prototype.onMouseDown_ = function (e) { + if (this.map_ && this.hotKeyDown_) { + this.mapPosn_ = getElementPosition(this.map_.getDiv()); + this.dragging_ = true; + this.startPt_ = this.endPt_ = this.getMousePoint_(e); + this.boxDiv_.style.width = this.boxDiv_.style.height = "0px"; + var prj = this.prjov_.getProjection(); + var latlng = prj.fromContainerPixelToLatLng(this.startPt_); + /** + * This event is fired when the drag operation begins. + * The parameter passed is the geographic position of the starting point. + * @name DragZoom#dragstart + * @param {LatLng} latlng The geographic position of the starting point. + * @event + */ + google.maps.event.trigger(this, "dragstart", latlng); + } + }; + /** + * Handle mouse down at the document level. + * @param {Event} e The mouse event. + */ + DragZoom.prototype.onMouseDownDocument_ = function (e) { + this.mouseDown_ = true; + }; + /** + * Handle mouse move. + * @param {Event} e The mouse event. + */ + DragZoom.prototype.onMouseMove_ = function (e) { + this.mousePosn_ = getMousePosition(e); + if (this.dragging_) { + this.endPt_ = this.getMousePoint_(e); + var left = Math.min(this.startPt_.x, this.endPt_.x); + var top = Math.min(this.startPt_.y, this.endPt_.y); + var width = Math.abs(this.startPt_.x - this.endPt_.x); + var height = Math.abs(this.startPt_.y - this.endPt_.y); + // For benefit of MSIE 7/8 ensure following values are not negative: + var boxWidth = Math.max(0, width - (this.boxBorderWidths_.left + this.boxBorderWidths_.right)); + var boxHeight = Math.max(0, height - (this.boxBorderWidths_.top + this.boxBorderWidths_.bottom)); + // Left veil rectangle: + this.veilDiv_[0].style.top = "0px"; + this.veilDiv_[0].style.left = "0px"; + this.veilDiv_[0].style.width = left + "px"; + this.veilDiv_[0].style.height = this.mapHeight_ + "px"; + // Right veil rectangle: + this.veilDiv_[1].style.top = "0px"; + this.veilDiv_[1].style.left = (left + width) + "px"; + this.veilDiv_[1].style.width = (this.mapWidth_ - (left + width)) + "px"; + this.veilDiv_[1].style.height = this.mapHeight_ + "px"; + // Top veil rectangle: + this.veilDiv_[2].style.top = "0px"; + this.veilDiv_[2].style.left = left + "px"; + this.veilDiv_[2].style.width = width + "px"; + this.veilDiv_[2].style.height = top + "px"; + // Bottom veil rectangle: + this.veilDiv_[3].style.top = (top + height) + "px"; + this.veilDiv_[3].style.left = left + "px"; + this.veilDiv_[3].style.width = width + "px"; + this.veilDiv_[3].style.height = (this.mapHeight_ - (top + height)) + "px"; + // Selection rectangle: + this.boxDiv_.style.top = top + "px"; + this.boxDiv_.style.left = left + "px"; + this.boxDiv_.style.width = boxWidth + "px"; + this.boxDiv_.style.height = boxHeight + "px"; + this.boxDiv_.style.display = "block"; + /** + * This event is fired repeatedly while the user drags a box across the area of interest. + * The southwest and northeast point are passed as parameters of type google.maps.Point + * (for performance reasons), relative to the map container. Also passed is the projection object + * so that the event listener, if necessary, can convert the pixel positions to geographic + * coordinates using google.maps.MapCanvasProjection.fromContainerPixelToLatLng. + * @name DragZoom#drag + * @param {Point} southwestPixel The southwest point of the selection area. + * @param {Point} northeastPixel The northeast point of the selection area. + * @param {MapCanvasProjection} prj The projection object. + * @event + */ + google.maps.event.trigger(this, "drag", new google.maps.Point(left, top + height), new google.maps.Point(left + width, top), this.prjov_.getProjection()); + } else if (!this.mouseDown_) { + this.mapPosn_ = getElementPosition(this.map_.getDiv()); + this.setVeilVisibility_(); + } + }; + /** + * Handle mouse up. + * @param {Event} e The mouse event. + */ + DragZoom.prototype.onMouseUp_ = function (e) { + var z; + var me = this; + this.mouseDown_ = false; + if (this.dragging_) { + if ((this.getMousePoint_(e).x === this.startPt_.x) && (this.getMousePoint_(e).y === this.startPt_.y)) { + this.onKeyUp_(e); // Cancel event + return; + } + var left = Math.min(this.startPt_.x, this.endPt_.x); + var top = Math.min(this.startPt_.y, this.endPt_.y); + var width = Math.abs(this.startPt_.x - this.endPt_.x); + var height = Math.abs(this.startPt_.y - this.endPt_.y); + // Google Maps API bug: setCenter() doesn't work as expected if the map has a + // border on the left or top. The code here includes a workaround for this problem. + var kGoogleCenteringBug = true; + if (kGoogleCenteringBug) { + left += this.borderWidths_.left; + top += this.borderWidths_.top; + } + + var prj = this.prjov_.getProjection(); + var sw = prj.fromContainerPixelToLatLng(new google.maps.Point(left, top + height)); + var ne = prj.fromContainerPixelToLatLng(new google.maps.Point(left + width, top)); + var bnds = new google.maps.LatLngBounds(sw, ne); + + if (this.noZoom_) { + this.boxDiv_.style.display = "none"; + } else { + // Sometimes fitBounds causes a zoom OUT, so restore original zoom level if this happens. + z = this.map_.getZoom(); + this.map_.fitBounds(bnds); + if (this.map_.getZoom() < z) { + this.map_.setZoom(z); + } + + // Redraw box after zoom: + var swPt = prj.fromLatLngToContainerPixel(sw); + var nePt = prj.fromLatLngToContainerPixel(ne); + if (kGoogleCenteringBug) { + swPt.x -= this.borderWidths_.left; + swPt.y -= this.borderWidths_.top; + nePt.x -= this.borderWidths_.left; + nePt.y -= this.borderWidths_.top; + } + this.boxDiv_.style.left = swPt.x + "px"; + this.boxDiv_.style.top = nePt.y + "px"; + this.boxDiv_.style.width = (Math.abs(nePt.x - swPt.x) - (this.boxBorderWidths_.left + this.boxBorderWidths_.right)) + "px"; + this.boxDiv_.style.height = (Math.abs(nePt.y - swPt.y) - (this.boxBorderWidths_.top + this.boxBorderWidths_.bottom)) + "px"; + // Hide box asynchronously after 1 second: + setTimeout(function () { + me.boxDiv_.style.display = "none"; + }, 1000); + } + this.dragging_ = false; + this.onMouseMove_(e); // Updates the veil + /** + * This event is fired when the drag operation ends. + * The parameter passed is the geographic bounds of the selected area. + * Note that this event is not fired if the hot key is released before the drag operation ends. + * @name DragZoom#dragend + * @param {LatLngBounds} bnds The geographic bounds of the selected area. + * @event + */ + google.maps.event.trigger(this, "dragend", bnds); + // if the hot key isn't down, the drag zoom must have been activated by turning + // on the visual control. In this case, finish up by simulating a key up event. + if (!this.isHotKeyDown_(e)) { + this.onKeyUp_(e); + } + } + }; + /** + * Handle key up. + * @param {Event} e The keyboard event. + */ + DragZoom.prototype.onKeyUp_ = function (e) { + var i; + var left, top, width, height, prj, sw, ne; + var bnds = null; + if (this.map_ && this.hotKeyDown_) { + this.hotKeyDown_ = false; + if (this.dragging_) { + this.boxDiv_.style.display = "none"; + this.dragging_ = false; + // Calculate the bounds when drag zoom was cancelled + left = Math.min(this.startPt_.x, this.endPt_.x); + top = Math.min(this.startPt_.y, this.endPt_.y); + width = Math.abs(this.startPt_.x - this.endPt_.x); + height = Math.abs(this.startPt_.y - this.endPt_.y); + prj = this.prjov_.getProjection(); + sw = prj.fromContainerPixelToLatLng(new google.maps.Point(left, top + height)); + ne = prj.fromContainerPixelToLatLng(new google.maps.Point(left + width, top)); + bnds = new google.maps.LatLngBounds(sw, ne); + } + for (i = 0; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.display = "none"; + } + if (this.visualEnabled_) { + this.buttonDiv_.firstChild.style.left = -(this.visualSize_.width * 2) + "px"; + this.buttonDiv_.title = this.visualTips_.off; + this.buttonDiv_.style.display = ""; + } + /** + * This event is fired when the hot key is released. + * The parameter passed is the geographic bounds of the selected area immediately + * before the hot key was released. + * @name DragZoom#deactivate + * @param {LatLngBounds} bnds The geographic bounds of the selected area immediately + * before the hot key was released. + * @event + */ + google.maps.event.trigger(this, "deactivate", bnds); + } + }; + /** + * @name google.maps.Map + * @class These are new methods added to the Google Maps JavaScript API V3's + * Map + * class. + */ + /** + * Enables drag zoom. The user can zoom to an area of interest by holding down the hot key + * (shift | ctrl | alt ) while dragging a box around the area or by turning + * on the visual control then dragging a box around the area. + * @param {KeyDragZoomOptions} opt_zoomOpts The optional parameters. + */ + google.maps.Map.prototype.enableKeyDragZoom = function (opt_zoomOpts) { + this.dragZoom_ = new DragZoom(this, opt_zoomOpts); + }; + /** + * Disables drag zoom. + */ + google.maps.Map.prototype.disableKeyDragZoom = function () { + var i; + var d = this.dragZoom_; + if (d) { + for (i = 0; i < d.listeners_.length; ++i) { + google.maps.event.removeListener(d.listeners_[i]); + } + this.getDiv().removeChild(d.boxDiv_); + for (i = 0; i < d.veilDiv_.length; i++) { + this.getDiv().removeChild(d.veilDiv_[i]); + } + if (d.visualEnabled_) { + // Remove the custom control: + this.controls[d.visualPosition_].removeAt(d.controlIndex_); + } + d.prjov_.setMap(null); + this.dragZoom_ = null; + } + }; + /** + * Returns true if the drag zoom feature has been enabled. + * @return {boolean} + */ + google.maps.Map.prototype.keyDragZoomEnabled = function () { + return this.dragZoom_ !== null; + }; + /** + * Returns the DragZoom object which is created when google.maps.Map.enableKeyDragZoom is called. + * With this object you can use google.maps.event.addListener to attach event listeners + * for the "activate", "deactivate", "dragstart", "drag", and "dragend" events. + * @return {DragZoom} + */ + google.maps.Map.prototype.getDragZoomObject = function () { + return this.dragZoom_; + }; +})(); + +/** + * google-maps-utility-library-v3-markerwithlabel + * + * @version: 1.1.10 + * @author: Gary Little (inspired by code from Marc Ridey of Google). + * @contributors: Nicholas McCready + * @date: Fri May 13 2016 16:29:58 GMT-0400 (EDT) + * @license: Apache License 2.0 + */ +/** + * MarkerWithLabel allows you to define markers with associated labels. As you would expect, + * if the marker is draggable, so too will be the label. In addition, a marker with a label + * responds to all mouse events in the same manner as a regular marker. It also fires mouse + * events and "property changed" events just as a regular marker would. Version 1.1 adds + * support for the raiseOnDrag feature introduced in API V3.3. + *

+ * If you drag a marker by its label, you can cancel the drag and return the marker to its + * original position by pressing the Esc key. This doesn't work if you drag the marker + * itself because this feature is not (yet) supported in the google.maps.Marker class. + */ + +/*jslint browser:true */ +/*global document,google */ + +/** + * @param {Function} childCtor Child class. + * @param {Function} parentCtor Parent class. + * @private + */ +function inherits(childCtor, parentCtor) { + /* @constructor */ + function tempCtor() {} + tempCtor.prototype = parentCtor.prototype; + childCtor.superClass_ = parentCtor.prototype; + childCtor.prototype = new tempCtor(); + /* @override */ + childCtor.prototype.constructor = childCtor; +} + +/** + * This constructor creates a label and associates it with a marker. + * It is for the private use of the MarkerWithLabel class. + * @constructor + * @param {Marker} marker The marker with which the label is to be associated. + * @param {string} crossURL The URL of the cross image =. + * @param {string} handCursor The URL of the hand cursor. + * @private + */ +function MarkerLabel_(marker, crossURL, handCursorURL) { + this.marker_ = marker; + this.handCursorURL_ = marker.handCursorURL; + + this.labelDiv_ = document.createElement("div"); + this.labelDiv_.style.cssText = "position: absolute; overflow: hidden;"; + + // Set up the DIV for handling mouse events in the label. This DIV forms a transparent veil + // in the "overlayMouseTarget" pane, a veil that covers just the label. This is done so that + // events can be captured even if the label is in the shadow of a google.maps.InfoWindow. + // Code is included here to ensure the veil is always exactly the same size as the label. + this.eventDiv_ = document.createElement("div"); + this.eventDiv_.style.cssText = this.labelDiv_.style.cssText; + + // This is needed for proper behavior on MSIE: + this.eventDiv_.setAttribute("onselectstart", "return false;"); + this.eventDiv_.setAttribute("ondragstart", "return false;"); + + // Get the DIV for the "X" to be displayed when the marker is raised. + this.crossDiv_ = MarkerLabel_.getSharedCross(crossURL); +} + +inherits(MarkerLabel_, google.maps.OverlayView); + +/** + * Returns the DIV for the cross used when dragging a marker when the + * raiseOnDrag parameter set to true. One cross is shared with all markers. + * @param {string} crossURL The URL of the cross image =. + * @private + */ +MarkerLabel_.getSharedCross = function (crossURL) { + var div; + if (typeof MarkerLabel_.getSharedCross.crossDiv === "undefined") { + div = document.createElement("img"); + div.style.cssText = "position: absolute; z-index: 1000002; display: none;"; + // Hopefully Google never changes the standard "X" attributes: + div.style.marginLeft = "-8px"; + div.style.marginTop = "-9px"; + div.src = crossURL; + MarkerLabel_.getSharedCross.crossDiv = div; + } + return MarkerLabel_.getSharedCross.crossDiv; +}; + +/** + * Adds the DIV representing the label to the DOM. This method is called + * automatically when the marker's setMap method is called. + * @private + */ +MarkerLabel_.prototype.onAdd = function () { + var me = this; + var cMouseIsDown = false; + var cDraggingLabel = false; + var cSavedZIndex; + var cLatOffset, cLngOffset; + var cIgnoreClick; + var cRaiseEnabled; + var cStartPosition; + var cStartCenter; + // Constants: + var cRaiseOffset = 20; + var cDraggingCursor = "url("https://github.com/+%20this.handCursorURL_%20+")"; + + // Stops all processing of an event. + // + var cAbortEvent = function (e) { + if (e.preventDefault) { + e.preventDefault(); + } + e.cancelBubble = true; + if (e.stopPropagation) { + e.stopPropagation(); + } + }; + + var cStopBounce = function () { + me.marker_.setAnimation(null); + }; + + this.getPanes().overlayImage.appendChild(this.labelDiv_); + this.getPanes().overlayMouseTarget.appendChild(this.eventDiv_); + // One cross is shared with all markers, so only add it once: + if (typeof MarkerLabel_.getSharedCross.processed === "undefined") { + this.getPanes().overlayImage.appendChild(this.crossDiv_); + MarkerLabel_.getSharedCross.processed = true; + } + + this.listeners_ = [ + google.maps.event.addDomListener(this.eventDiv_, "mouseover", function (e) { + if (me.marker_.getDraggable() || me.marker_.getClickable()) { + this.style.cursor = "pointer"; + google.maps.event.trigger(me.marker_, "mouseover", e); + } + }), + google.maps.event.addDomListener(this.eventDiv_, "mouseout", function (e) { + if ((me.marker_.getDraggable() || me.marker_.getClickable()) && !cDraggingLabel) { + this.style.cursor = me.marker_.getCursor(); + google.maps.event.trigger(me.marker_, "mouseout", e); + } + }), + google.maps.event.addDomListener(this.eventDiv_, "mousedown", function (e) { + cDraggingLabel = false; + if (me.marker_.getDraggable()) { + cMouseIsDown = true; + this.style.cursor = cDraggingCursor; + } + if (me.marker_.getDraggable() || me.marker_.getClickable()) { + google.maps.event.trigger(me.marker_, "mousedown", e); + cAbortEvent(e); // Prevent map pan when starting a drag on a label + } + }), + google.maps.event.addDomListener(document, "mouseup", function (mEvent) { + var position; + if (cMouseIsDown) { + cMouseIsDown = false; + me.eventDiv_.style.cursor = "pointer"; + google.maps.event.trigger(me.marker_, "mouseup", mEvent); + } + if (cDraggingLabel) { + if (cRaiseEnabled) { // Lower the marker & label + position = me.getProjection().fromLatLngToDivPixel(me.marker_.getPosition()); + position.y += cRaiseOffset; + me.marker_.setPosition(me.getProjection().fromDivPixelToLatLng(position)); + // This is not the same bouncing style as when the marker portion is dragged, + // but it will have to do: + try { // Will fail if running Google Maps API earlier than V3.3 + me.marker_.setAnimation(google.maps.Animation.BOUNCE); + setTimeout(cStopBounce, 1406); + } catch (e) {} + } + me.crossDiv_.style.display = "none"; + me.marker_.setZIndex(cSavedZIndex); + cIgnoreClick = true; // Set flag to ignore the click event reported after a label drag + cDraggingLabel = false; + mEvent.latLng = me.marker_.getPosition(); + google.maps.event.trigger(me.marker_, "dragend", mEvent); + } + }), + google.maps.event.addListener(me.marker_.getMap(), "mousemove", function (mEvent) { + var position; + if (cMouseIsDown) { + if (cDraggingLabel) { + // Change the reported location from the mouse position to the marker position: + mEvent.latLng = new google.maps.LatLng(mEvent.latLng.lat() - cLatOffset, mEvent.latLng.lng() - cLngOffset); + position = me.getProjection().fromLatLngToDivPixel(mEvent.latLng); + if (cRaiseEnabled) { + me.crossDiv_.style.left = position.x + "px"; + me.crossDiv_.style.top = position.y + "px"; + me.crossDiv_.style.display = ""; + position.y -= cRaiseOffset; + } + me.marker_.setPosition(me.getProjection().fromDivPixelToLatLng(position)); + if (cRaiseEnabled) { // Don't raise the veil; this hack needed to make MSIE act properly + me.eventDiv_.style.top = (position.y + cRaiseOffset) + "px"; + } + google.maps.event.trigger(me.marker_, "drag", mEvent); + } else { + // Calculate offsets from the click point to the marker position: + cLatOffset = mEvent.latLng.lat() - me.marker_.getPosition().lat(); + cLngOffset = mEvent.latLng.lng() - me.marker_.getPosition().lng(); + cSavedZIndex = me.marker_.getZIndex(); + cStartPosition = me.marker_.getPosition(); + cStartCenter = me.marker_.getMap().getCenter(); + cRaiseEnabled = me.marker_.get("raiseOnDrag"); + cDraggingLabel = true; + me.marker_.setZIndex(1000000); // Moves the marker & label to the foreground during a drag + mEvent.latLng = me.marker_.getPosition(); + google.maps.event.trigger(me.marker_, "dragstart", mEvent); + } + } + }), + google.maps.event.addDomListener(document, "keydown", function (e) { + if (cDraggingLabel) { + if (e.keyCode === 27) { // Esc key + cRaiseEnabled = false; + me.marker_.setPosition(cStartPosition); + me.marker_.getMap().setCenter(cStartCenter); + google.maps.event.trigger(document, "mouseup", e); + } + } + }), + google.maps.event.addDomListener(this.eventDiv_, "click", function (e) { + if (me.marker_.getDraggable() || me.marker_.getClickable()) { + if (cIgnoreClick) { // Ignore the click reported when a label drag ends + cIgnoreClick = false; + } else { + google.maps.event.trigger(me.marker_, "click", e); + cAbortEvent(e); // Prevent click from being passed on to map + } + } + }), + google.maps.event.addDomListener(this.eventDiv_, "dblclick", function (e) { + if (me.marker_.getDraggable() || me.marker_.getClickable()) { + google.maps.event.trigger(me.marker_, "dblclick", e); + cAbortEvent(e); // Prevent map zoom when double-clicking on a label + } + }), + google.maps.event.addListener(this.marker_, "dragstart", function (mEvent) { + if (!cDraggingLabel) { + cRaiseEnabled = this.get("raiseOnDrag"); + } + }), + google.maps.event.addListener(this.marker_, "drag", function (mEvent) { + if (!cDraggingLabel) { + if (cRaiseEnabled) { + me.setPosition(cRaiseOffset); + // During a drag, the marker's z-index is temporarily set to 1000000 to + // ensure it appears above all other markers. Also set the label's z-index + // to 1000000 (plus or minus 1 depending on whether the label is supposed + // to be above or below the marker). + me.labelDiv_.style.zIndex = 1000000 + (this.get("labelInBackground") ? -1 : +1); + } + } + }), + google.maps.event.addListener(this.marker_, "dragend", function (mEvent) { + if (!cDraggingLabel) { + if (cRaiseEnabled) { + me.setPosition(0); // Also restores z-index of label + } + } + }), + google.maps.event.addListener(this.marker_, "position_changed", function () { + me.setPosition(); + }), + google.maps.event.addListener(this.marker_, "zindex_changed", function () { + me.setZIndex(); + }), + google.maps.event.addListener(this.marker_, "visible_changed", function () { + me.setVisible(); + }), + google.maps.event.addListener(this.marker_, "labelvisible_changed", function () { + me.setVisible(); + }), + google.maps.event.addListener(this.marker_, "title_changed", function () { + me.setTitle(); + }), + google.maps.event.addListener(this.marker_, "labelcontent_changed", function () { + me.setContent(); + }), + google.maps.event.addListener(this.marker_, "labelanchor_changed", function () { + me.setAnchor(); + }), + google.maps.event.addListener(this.marker_, "labelclass_changed", function () { + me.setStyles(); + }), + google.maps.event.addListener(this.marker_, "labelstyle_changed", function () { + me.setStyles(); + }) + ]; +}; + +/** + * Removes the DIV for the label from the DOM. It also removes all event handlers. + * This method is called automatically when the marker's setMap(null) + * method is called. + * @private + */ +MarkerLabel_.prototype.onRemove = function () { + var i; + this.labelDiv_.parentNode.removeChild(this.labelDiv_); + this.eventDiv_.parentNode.removeChild(this.eventDiv_); + + // Remove event listeners: + for (i = 0; i < this.listeners_.length; i++) { + google.maps.event.removeListener(this.listeners_[i]); + } +}; + +/** + * Draws the label on the map. + * @private + */ +MarkerLabel_.prototype.draw = function () { + this.setContent(); + this.setTitle(); + this.setStyles(); +}; + +/** + * Sets the content of the label. + * The content can be plain text or an HTML DOM node. + * @private + */ +MarkerLabel_.prototype.setContent = function () { + var content = this.marker_.get("labelContent"); + if (typeof content.nodeType === "undefined") { + this.labelDiv_.innerHTML = content; + this.eventDiv_.innerHTML = this.labelDiv_.innerHTML; + } else { + this.labelDiv_.innerHTML = ""; // Remove current content + this.labelDiv_.appendChild(content); + content = content.cloneNode(true); + this.eventDiv_.innerHTML = ""; // Remove current content + this.eventDiv_.appendChild(content); + } +}; + +/** + * Sets the content of the tool tip for the label. It is + * always set to be the same as for the marker itself. + * @private + */ +MarkerLabel_.prototype.setTitle = function () { + this.eventDiv_.title = this.marker_.getTitle() || ""; +}; + +/** + * Sets the style of the label by setting the style sheet and applying + * other specific styles requested. + * @private + */ +MarkerLabel_.prototype.setStyles = function () { + var i, labelStyle; + + // Apply style values from the style sheet defined in the labelClass parameter: + this.labelDiv_.className = this.marker_.get("labelClass"); + this.eventDiv_.className = this.labelDiv_.className; + + // Clear existing inline style values: + this.labelDiv_.style.cssText = ""; + this.eventDiv_.style.cssText = ""; + // Apply style values defined in the labelStyle parameter: + labelStyle = this.marker_.get("labelStyle"); + for (i in labelStyle) { + if (labelStyle.hasOwnProperty(i)) { + this.labelDiv_.style[i] = labelStyle[i]; + this.eventDiv_.style[i] = labelStyle[i]; + } + } + this.setMandatoryStyles(); +}; + +/** + * Sets the mandatory styles to the DIV representing the label as well as to the + * associated event DIV. This includes setting the DIV position, z-index, and visibility. + * @private + */ +MarkerLabel_.prototype.setMandatoryStyles = function () { + this.labelDiv_.style.position = "absolute"; + this.labelDiv_.style.overflow = "hidden"; + // Make sure the opacity setting causes the desired effect on MSIE: + if (typeof this.labelDiv_.style.opacity !== "undefined" && this.labelDiv_.style.opacity !== "") { + this.labelDiv_.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.labelDiv_.style.opacity * 100) + ")\""; + this.labelDiv_.style.filter = "alpha(opacity=" + (this.labelDiv_.style.opacity * 100) + ")"; + } + + this.eventDiv_.style.position = this.labelDiv_.style.position; + this.eventDiv_.style.overflow = this.labelDiv_.style.overflow; + this.eventDiv_.style.opacity = 0.01; // Don't use 0; DIV won't be clickable on MSIE + this.eventDiv_.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(opacity=1)\""; + this.eventDiv_.style.filter = "alpha(opacity=1)"; // For MSIE + + this.setAnchor(); + this.setPosition(); // This also updates z-index, if necessary. + this.setVisible(); +}; + +/** + * Sets the anchor point of the label. + * @private + */ +MarkerLabel_.prototype.setAnchor = function () { + var anchor = this.marker_.get("labelAnchor"); + this.labelDiv_.style.marginLeft = -anchor.x + "px"; + this.labelDiv_.style.marginTop = -anchor.y + "px"; + this.eventDiv_.style.marginLeft = -anchor.x + "px"; + this.eventDiv_.style.marginTop = -anchor.y + "px"; +}; + +/** + * Sets the position of the label. The z-index is also updated, if necessary. + * @private + */ +MarkerLabel_.prototype.setPosition = function (yOffset) { + var position = this.getProjection().fromLatLngToDivPixel(this.marker_.getPosition()); + if (typeof yOffset === "undefined") { + yOffset = 0; + } + this.labelDiv_.style.left = Math.round(position.x) + "px"; + this.labelDiv_.style.top = Math.round(position.y - yOffset) + "px"; + this.eventDiv_.style.left = this.labelDiv_.style.left; + this.eventDiv_.style.top = this.labelDiv_.style.top; + + this.setZIndex(); +}; + +/** + * Sets the z-index of the label. If the marker's z-index property has not been defined, the z-index + * of the label is set to the vertical coordinate of the label. This is in keeping with the default + * stacking order for Google Maps: markers to the south are in front of markers to the north. + * @private + */ +MarkerLabel_.prototype.setZIndex = function () { + var zAdjust = (this.marker_.get("labelInBackground") ? -1 : +1); + if (typeof this.marker_.getZIndex() === "undefined") { + this.labelDiv_.style.zIndex = parseInt(this.labelDiv_.style.top, 10) + zAdjust; + this.eventDiv_.style.zIndex = this.labelDiv_.style.zIndex; + } else { + this.labelDiv_.style.zIndex = this.marker_.getZIndex() + zAdjust; + this.eventDiv_.style.zIndex = this.labelDiv_.style.zIndex; + } +}; + +/** + * Sets the visibility of the label. The label is visible only if the marker itself is + * visible (i.e., its visible property is true) and the labelVisible property is true. + * @private + */ +MarkerLabel_.prototype.setVisible = function () { + if (this.marker_.get("labelVisible")) { + this.labelDiv_.style.display = this.marker_.getVisible() ? "block" : "none"; + } else { + this.labelDiv_.style.display = "none"; + } + this.eventDiv_.style.display = this.labelDiv_.style.display; +}; + +/** + * @name MarkerWithLabelOptions + * @class This class represents the optional parameter passed to the {@link MarkerWithLabel} constructor. + * The properties available are the same as for google.maps.Marker with the addition + * of the properties listed below. To change any of these additional properties after the labeled + * marker has been created, call google.maps.Marker.set(propertyName, propertyValue). + *

+ * When any of these properties changes, a property changed event is fired. The names of these + * events are derived from the name of the property and are of the form propertyname_changed. + * For example, if the content of the label changes, a labelcontent_changed event + * is fired. + *

+ * @property {string|Node} [labelContent] The content of the label (plain text or an HTML DOM node). + * @property {Point} [labelAnchor] By default, a label is drawn with its anchor point at (0,0) so + * that its top left corner is positioned at the anchor point of the associated marker. Use this + * property to change the anchor point of the label. For example, to center a 50px-wide label + * beneath a marker, specify a labelAnchor of google.maps.Point(25, 0). + * (Note: x-values increase to the right and y-values increase to the top.) + * @property {string} [labelClass] The name of the CSS class defining the styles for the label. + * Note that style values for position, overflow, top, + * left, zIndex, display, marginLeft, and + * marginTop are ignored; these styles are for internal use only. + * @property {Object} [labelStyle] An object literal whose properties define specific CSS + * style values to be applied to the label. Style values defined here override those that may + * be defined in the labelClass style sheet. If this property is changed after the + * label has been created, all previously set styles (except those defined in the style sheet) + * are removed from the label before the new style values are applied. + * Note that style values for position, overflow, top, + * left, zIndex, display, marginLeft, and + * marginTop are ignored; these styles are for internal use only. + * @property {boolean} [labelInBackground] A flag indicating whether a label that overlaps its + * associated marker should appear in the background (i.e., in a plane below the marker). + * The default is false, which causes the label to appear in the foreground. + * @property {boolean} [labelVisible] A flag indicating whether the label is to be visible. + * The default is true. Note that even if labelVisible is + * true, the label will not be visible unless the associated marker is also + * visible (i.e., unless the marker's visible property is true). + * @property {boolean} [raiseOnDrag] A flag indicating whether the label and marker are to be + * raised when the marker is dragged. The default is true. If a draggable marker is + * being created and a version of Google Maps API earlier than V3.3 is being used, this property + * must be set to false. + * @property {boolean} [optimized] A flag indicating whether rendering is to be optimized for the + * marker. Important: The optimized rendering technique is not supported by MarkerWithLabel, + * so the value of this parameter is always forced to false. + * @property {string} [crossImage="http://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png"] + * The URL of the cross image to be displayed while dragging a marker. + * @property {string} [handCursor="http://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur"] + * The URL of the cursor to be displayed while dragging a marker. + */ +/** + * Creates a MarkerWithLabel with the options specified in {@link MarkerWithLabelOptions}. + * @constructor + * @param {MarkerWithLabelOptions} [opt_options] The optional parameters. + */ +function MarkerWithLabel(opt_options) { + opt_options = opt_options || {}; + opt_options.labelContent = opt_options.labelContent || ""; + opt_options.labelAnchor = opt_options.labelAnchor || new google.maps.Point(0, 0); + opt_options.labelClass = opt_options.labelClass || "markerLabels"; + opt_options.labelStyle = opt_options.labelStyle || {}; + opt_options.labelInBackground = opt_options.labelInBackground || false; + if (typeof opt_options.labelVisible === "undefined") { + opt_options.labelVisible = true; + } + if (typeof opt_options.raiseOnDrag === "undefined") { + opt_options.raiseOnDrag = true; + } + if (typeof opt_options.clickable === "undefined") { + opt_options.clickable = true; + } + if (typeof opt_options.draggable === "undefined") { + opt_options.draggable = false; + } + if (typeof opt_options.optimized === "undefined") { + opt_options.optimized = false; + } + opt_options.crossImage = opt_options.crossImage || "http" + (document.location.protocol === "https:" ? "s" : "") + "://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png"; + opt_options.handCursor = opt_options.handCursor || "http" + (document.location.protocol === "https:" ? "s" : "") + "://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur"; + opt_options.optimized = false; // Optimized rendering is not supported + + this.label = new MarkerLabel_(this, opt_options.crossImage, opt_options.handCursor); // Bind the label to the marker + + // Call the parent constructor. It calls Marker.setValues to initialize, so all + // the new parameters are conveniently saved and can be accessed with get/set. + // Marker.set triggers a property changed event (called "propertyname_changed") + // that the marker label listens for in order to react to state changes. + google.maps.Marker.apply(this, arguments); +} + +inherits(MarkerWithLabel, google.maps.Marker); + +/** + * Overrides the standard Marker setMap function. + * @param {Map} theMap The map to which the marker is to be added. + * @private + */ +MarkerWithLabel.prototype.setMap = function (theMap) { + + // Call the inherited function... + google.maps.Marker.prototype.setMap.apply(this, arguments); + + // ... then deal with the label: + this.label.setMap(theMap); +}; + +// ==ClosureCompiler== +// @compilation_level ADVANCED_OPTIMIZATIONS +// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/maps/google_maps_api_v3.js +// @output_wrapper (function() {%output%})(); +// ==/ClosureCompiler== + +/** + * @license + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A RichMarker that allows any HTML/DOM to be added to a map and be draggable. + * + * @param {Object.=} opt_options Optional properties to set. + * @extends {google.maps.OverlayView} + * @constructor + */ +function RichMarker(opt_options) { + var options = opt_options || {}; + + /** + * @type {boolean} + * @private + */ + this.ready_ = false; + + /** + * @type {boolean} + * @private + */ + this.dragging_ = false; + + if (opt_options['visible'] == undefined) { + opt_options['visible'] = true; + } + + if (opt_options['shadow'] == undefined) { + opt_options['shadow'] = '7px -3px 5px rgba(88,88,88,0.7)'; + } + + if (opt_options['anchor'] == undefined) { + opt_options['anchor'] = RichMarkerPosition['BOTTOM']; + } + + this.setValues(options); +} +RichMarker.prototype = new google.maps.OverlayView(); +window['RichMarker'] = RichMarker; + + +/** + * Returns the current visibility state of the marker. + * + * @return {boolean} The visiblity of the marker. + */ +RichMarker.prototype.getVisible = function() { + return /** @type {boolean} */ (this.get('visible')); +}; +RichMarker.prototype['getVisible'] = RichMarker.prototype.getVisible; + + +/** + * Sets the visiblility state of the marker. + * + * @param {boolean} visible The visiblilty of the marker. + */ +RichMarker.prototype.setVisible = function(visible) { + this.set('visible', visible); +}; +RichMarker.prototype['setVisible'] = RichMarker.prototype.setVisible; + + +/** + * The visible changed event. + */ +RichMarker.prototype.visible_changed = function() { + if (this.ready_) { + this.markerWrapper_.style['display'] = this.getVisible() ? '' : 'none'; + this.draw(); + } +}; +RichMarker.prototype['visible_changed'] = RichMarker.prototype.visible_changed; + + +/** + * Sets the marker to be flat. + * + * @param {boolean} flat If the marker is to be flat or not. + */ +RichMarker.prototype.setFlat = function(flat) { + this.set('flat', !!flat); +}; +RichMarker.prototype['setFlat'] = RichMarker.prototype.setFlat; + + +/** + * If the makrer is flat or not. + * + * @return {boolean} True the marker is flat. + */ +RichMarker.prototype.getFlat = function() { + return /** @type {boolean} */ (this.get('flat')); +}; +RichMarker.prototype['getFlat'] = RichMarker.prototype.getFlat; + + +/** + * Get the width of the marker. + * + * @return {Number} The width of the marker. + */ +RichMarker.prototype.getWidth = function() { + return /** @type {Number} */ (this.get('width')); +}; +RichMarker.prototype['getWidth'] = RichMarker.prototype.getWidth; + + +/** + * Get the height of the marker. + * + * @return {Number} The height of the marker. + */ +RichMarker.prototype.getHeight = function() { + return /** @type {Number} */ (this.get('height')); +}; +RichMarker.prototype['getHeight'] = RichMarker.prototype.getHeight; + + +/** + * Sets the marker's box shadow. + * + * @param {string} shadow The box shadow to set. + */ +RichMarker.prototype.setShadow = function(shadow) { + this.set('shadow', shadow); + this.flat_changed(); +}; +RichMarker.prototype['setShadow'] = RichMarker.prototype.setShadow; + + +/** + * Gets the marker's box shadow. + * + * @return {string} The box shadow. + */ +RichMarker.prototype.getShadow = function() { + return /** @type {string} */ (this.get('shadow')); +}; +RichMarker.prototype['getShadow'] = RichMarker.prototype.getShadow; + + +/** + * Flat changed event. + */ +RichMarker.prototype.flat_changed = function() { + if (!this.ready_) { + return; + } + + this.markerWrapper_.style['boxShadow'] = + this.markerWrapper_.style['webkitBoxShadow'] = + this.markerWrapper_.style['MozBoxShadow'] = + this.getFlat() ? '' : this.getShadow(); +}; +RichMarker.prototype['flat_changed'] = RichMarker.prototype.flat_changed; + + +/** + * Sets the zIndex of the marker. + * + * @param {Number} index The index to set. + */ +RichMarker.prototype.setZIndex = function(index) { + this.set('zIndex', index); +}; +RichMarker.prototype['setZIndex'] = RichMarker.prototype.setZIndex; + + +/** + * Gets the zIndex of the marker. + * + * @return {Number} The zIndex of the marker. + */ +RichMarker.prototype.getZIndex = function() { + return /** @type {Number} */ (this.get('zIndex')); +}; +RichMarker.prototype['getZIndex'] = RichMarker.prototype.getZIndex; + + +/** + * zIndex changed event. + */ +RichMarker.prototype.zIndex_changed = function() { + if (this.getZIndex() && this.ready_) { + this.markerWrapper_.style.zIndex = this.getZIndex(); + } +}; +RichMarker.prototype['zIndex_changed'] = RichMarker.prototype.zIndex_changed; + +/** + * Whether the marker is draggable or not. + * + * @return {boolean} True if the marker is draggable. + */ +RichMarker.prototype.getDraggable = function() { + return /** @type {boolean} */ (this.get('draggable')); +}; +RichMarker.prototype['getDraggable'] = RichMarker.prototype.getDraggable; + + +/** + * Sets the marker to be draggable or not. + * + * @param {boolean} draggable If the marker is draggable or not. + */ +RichMarker.prototype.setDraggable = function(draggable) { + this.set('draggable', !!draggable); +}; +RichMarker.prototype['setDraggable'] = RichMarker.prototype.setDraggable; + + +/** + * Draggable property changed callback. + */ +RichMarker.prototype.draggable_changed = function() { + if (this.ready_) { + if (this.getDraggable()) { + this.addDragging_(this.markerWrapper_); + } else { + this.removeDragListeners_(); + } + } +}; +RichMarker.prototype['draggable_changed'] = + RichMarker.prototype.draggable_changed; + + +/** + * Gets the postiton of the marker. + * + * @return {google.maps.LatLng} The position of the marker. + */ +RichMarker.prototype.getPosition = function() { + return /** @type {google.maps.LatLng} */ (this.get('position')); +}; +RichMarker.prototype['getPosition'] = RichMarker.prototype.getPosition; + + +/** + * Sets the position of the marker. + * + * @param {google.maps.LatLng} position The position to set. + */ +RichMarker.prototype.setPosition = function(position) { + this.set('position', position); +}; +RichMarker.prototype['setPosition'] = RichMarker.prototype.setPosition; + + +/** + * Position changed event. + */ +RichMarker.prototype.position_changed = function() { + this.draw(); +}; +RichMarker.prototype['position_changed'] = + RichMarker.prototype.position_changed; + + +/** + * Gets the anchor. + * + * @return {google.maps.Size} The position of the anchor. + */ +RichMarker.prototype.getAnchor = function() { + return /** @type {google.maps.Size} */ (this.get('anchor')); +}; +RichMarker.prototype['getAnchor'] = RichMarker.prototype.getAnchor; + + +/** + * Sets the anchor. + * + * @param {RichMarkerPosition|google.maps.Size} anchor The anchor to set. + */ +RichMarker.prototype.setAnchor = function(anchor) { + this.set('anchor', anchor); +}; +RichMarker.prototype['setAnchor'] = RichMarker.prototype.setAnchor; + + +/** + * Anchor changed event. + */ +RichMarker.prototype.anchor_changed = function() { + this.draw(); +}; +RichMarker.prototype['anchor_changed'] = RichMarker.prototype.anchor_changed; + + +/** + * Converts a HTML string to a document fragment. + * + * @param {string} htmlString The HTML string to convert. + * @return {Node} A HTML document fragment. + * @private + */ +RichMarker.prototype.htmlToDocumentFragment_ = function(htmlString) { + var tempDiv = document.createElement('DIV'); + tempDiv.innerHTML = htmlString; + if (tempDiv.childNodes.length == 1) { + return /** @type {!Node} */ (tempDiv.removeChild(tempDiv.firstChild)); + } else { + var fragment = document.createDocumentFragment(); + while (tempDiv.firstChild) { + fragment.appendChild(tempDiv.firstChild); + } + return fragment; + } +}; + + +/** + * Removes all children from the node. + * + * @param {Node} node The node to remove all children from. + * @private + */ +RichMarker.prototype.removeChildren_ = function(node) { + if (!node) { + return; + } + + var child; + while (child = node.firstChild) { + node.removeChild(child); + } +}; + + +/** + * Sets the content of the marker. + * + * @param {string|Node} content The content to set. + */ +RichMarker.prototype.setContent = function(content) { + this.set('content', content); +}; +RichMarker.prototype['setContent'] = RichMarker.prototype.setContent; + + +/** + * Get the content of the marker. + * + * @return {string|Node} The marker content. + */ +RichMarker.prototype.getContent = function() { + return /** @type {Node|string} */ (this.get('content')); +}; +RichMarker.prototype['getContent'] = RichMarker.prototype.getContent; + + +/** + * Sets the marker content and adds loading events to images + */ +RichMarker.prototype.content_changed = function() { + if (!this.markerContent_) { + // Marker content area doesnt exist. + return; + } + + this.removeChildren_(this.markerContent_); + var content = this.getContent(); + if (content) { + if (typeof content == 'string') { + content = content.replace(/^\s*([\S\s]*)\b\s*$/, '$1'); + content = this.htmlToDocumentFragment_(content); + } + this.markerContent_.appendChild(content); + + var that = this; + var images = this.markerContent_.getElementsByTagName('IMG'); + for (var i = 0, image; image = images[i]; i++) { + // By default, a browser lets a image be dragged outside of the browser, + // so by calling preventDefault we stop this behaviour and allow the image + // to be dragged around the map and now out of the browser and onto the + // desktop. + google.maps.event.addDomListener(image, 'mousedown', function(e) { + if (that.getDraggable()) { + if (e.preventDefault) { + e.preventDefault(); + } + e.returnValue = false; + } + }); + + // Because we don't know the size of an image till it loads, add a + // listener to the image load so the marker can resize and reposition + // itself to be the correct height. + google.maps.event.addDomListener(image, 'load', function() { + that.draw(); + }); + } + + google.maps.event.trigger(this, 'domready'); + } + + if (this.ready_) { + this.draw(); + } +}; +RichMarker.prototype['content_changed'] = RichMarker.prototype.content_changed; + +/** + * Sets the cursor. + * + * @param {string} whichCursor What cursor to show. + * @private + */ +RichMarker.prototype.setCursor_ = function(whichCursor) { + if (!this.ready_) { + return; + } + + var cursor = ''; + if (navigator.userAgent.indexOf('Gecko/') !== -1) { + // Moz has some nice cursors :) + if (whichCursor == 'dragging') { + cursor = '-moz-grabbing'; + } + + if (whichCursor == 'dragready') { + cursor = '-moz-grab'; + } + + if (whichCursor == 'draggable') { + cursor = 'pointer'; + } + } else { + if (whichCursor == 'dragging' || whichCursor == 'dragready') { + cursor = 'move'; + } + + if (whichCursor == 'draggable') { + cursor = 'pointer'; + } + } + + if (this.markerWrapper_.style.cursor != cursor) { + this.markerWrapper_.style.cursor = cursor; + } +}; + +/** + * Start dragging. + * + * @param {Event} e The event. + */ +RichMarker.prototype.startDrag = function(e) { + if (!this.getDraggable()) { + return; + } + + if (!this.dragging_) { + this.dragging_ = true; + var map = this.getMap(); + this.mapDraggable_ = map.get('draggable'); + map.set('draggable', false); + + // Store the current mouse position + this.mouseX_ = e.clientX; + this.mouseY_ = e.clientY; + + this.setCursor_('dragready'); + + // Stop the text from being selectable while being dragged + this.markerWrapper_.style['MozUserSelect'] = 'none'; + this.markerWrapper_.style['KhtmlUserSelect'] = 'none'; + this.markerWrapper_.style['WebkitUserSelect'] = 'none'; + + this.markerWrapper_['unselectable'] = 'on'; + this.markerWrapper_['onselectstart'] = function() { + return false; + }; + + this.addDraggingListeners_(); + + google.maps.event.trigger(this, 'dragstart'); + } +}; + + +/** + * Stop dragging. + */ +RichMarker.prototype.stopDrag = function() { + if (!this.getDraggable()) { + return; + } + + if (this.dragging_) { + this.dragging_ = false; + this.getMap().set('draggable', this.mapDraggable_); + this.mouseX_ = this.mouseY_ = this.mapDraggable_ = null; + + // Allow the text to be selectable again + this.markerWrapper_.style['MozUserSelect'] = ''; + this.markerWrapper_.style['KhtmlUserSelect'] = ''; + this.markerWrapper_.style['WebkitUserSelect'] = ''; + this.markerWrapper_['unselectable'] = 'off'; + this.markerWrapper_['onselectstart'] = function() {}; + + this.removeDraggingListeners_(); + + this.setCursor_('draggable'); + google.maps.event.trigger(this, 'dragend'); + + this.draw(); + } +}; + + +/** + * Handles the drag event. + * + * @param {Event} e The event. + */ +RichMarker.prototype.drag = function(e) { + if (!this.getDraggable() || !this.dragging_) { + // This object isn't draggable or we have stopped dragging + this.stopDrag(); + return; + } + + var dx = this.mouseX_ - e.clientX; + var dy = this.mouseY_ - e.clientY; + + this.mouseX_ = e.clientX; + this.mouseY_ = e.clientY; + + var left = parseInt(this.markerWrapper_.style['left'], 10) - dx; + var top = parseInt(this.markerWrapper_.style['top'], 10) - dy; + + this.markerWrapper_.style['left'] = left + 'px'; + this.markerWrapper_.style['top'] = top + 'px'; + + var offset = this.getOffset_(); + + // Set the position property and adjust for the anchor offset + var point = new google.maps.Point(left - offset.width, top - offset.height); + var projection = this.getProjection(); + this.setPosition(projection.fromDivPixelToLatLng(point)); + + this.setCursor_('dragging'); + google.maps.event.trigger(this, 'drag'); +}; + + +/** + * Removes the drag listeners associated with the marker. + * + * @private + */ +RichMarker.prototype.removeDragListeners_ = function() { + if (this.draggableListener_) { + google.maps.event.removeListener(this.draggableListener_); + delete this.draggableListener_; + } + this.setCursor_(''); +}; + + +/** + * Add dragability events to the marker. + * + * @param {Node} node The node to apply dragging to. + * @private + */ +RichMarker.prototype.addDragging_ = function(node) { + if (!node) { + return; + } + + var that = this; + this.draggableListener_ = + google.maps.event.addDomListener(node, 'mousedown', function(e) { + that.startDrag(e); + }); + + this.setCursor_('draggable'); +}; + + +/** + * Add dragging listeners. + * + * @private + */ +RichMarker.prototype.addDraggingListeners_ = function() { + var that = this; + if (this.markerWrapper_.setCapture) { + this.markerWrapper_.setCapture(true); + this.draggingListeners_ = [ + google.maps.event.addDomListener(this.markerWrapper_, 'mousemove', function(e) { + that.drag(e); + }, true), + google.maps.event.addDomListener(this.markerWrapper_, 'mouseup', function() { + that.stopDrag(); + that.markerWrapper_.releaseCapture(); + }, true) + ]; + } else { + this.draggingListeners_ = [ + google.maps.event.addDomListener(window, 'mousemove', function(e) { + that.drag(e); + }, true), + google.maps.event.addDomListener(window, 'mouseup', function() { + that.stopDrag(); + }, true) + ]; + } +}; + + +/** + * Remove dragging listeners. + * + * @private + */ +RichMarker.prototype.removeDraggingListeners_ = function() { + if (this.draggingListeners_) { + for (var i = 0, listener; listener = this.draggingListeners_[i]; i++) { + google.maps.event.removeListener(listener); + } + this.draggingListeners_.length = 0; + } +}; + + +/** + * Get the anchor offset. + * + * @return {google.maps.Size} The size offset. + * @private + */ +RichMarker.prototype.getOffset_ = function() { + var anchor = this.getAnchor(); + if (typeof anchor == 'object') { + return /** @type {google.maps.Size} */ (anchor); + } + + var offset = new google.maps.Size(0, 0); + if (!this.markerContent_) { + return offset; + } + + var width = this.markerContent_.offsetWidth; + var height = this.markerContent_.offsetHeight; + + switch (anchor) { + case RichMarkerPosition['TOP_LEFT']: + break; + case RichMarkerPosition['TOP']: + offset.width = -width / 2; + break; + case RichMarkerPosition['TOP_RIGHT']: + offset.width = -width; + break; + case RichMarkerPosition['LEFT']: + offset.height = -height / 2; + break; + case RichMarkerPosition['MIDDLE']: + offset.width = -width / 2; + offset.height = -height / 2; + break; + case RichMarkerPosition['RIGHT']: + offset.width = -width; + offset.height = -height / 2; + break; + case RichMarkerPosition['BOTTOM_LEFT']: + offset.height = -height; + break; + case RichMarkerPosition['BOTTOM']: + offset.width = -width / 2; + offset.height = -height; + break; + case RichMarkerPosition['BOTTOM_RIGHT']: + offset.width = -width; + offset.height = -height; + break; + } + + return offset; +}; + + +/** + * Adding the marker to a map. + * Implementing the interface. + */ +RichMarker.prototype.onAdd = function() { + if (!this.markerWrapper_) { + this.markerWrapper_ = document.createElement('DIV'); + this.markerWrapper_.style['position'] = 'absolute'; + } + + if (this.getZIndex()) { + this.markerWrapper_.style['zIndex'] = this.getZIndex(); + } + + this.markerWrapper_.style['display'] = this.getVisible() ? '' : 'none'; + + if (!this.markerContent_) { + this.markerContent_ = document.createElement('DIV'); + this.markerWrapper_.appendChild(this.markerContent_); + + var that = this; + google.maps.event.addDomListener(this.markerContent_, 'click', function(e) { + google.maps.event.trigger(that, 'click'); + }); + google.maps.event.addDomListener(this.markerContent_, 'mouseover', function(e) { + google.maps.event.trigger(that, 'mouseover'); + }); + google.maps.event.addDomListener(this.markerContent_, 'mouseout', function(e) { + google.maps.event.trigger(that, 'mouseout'); + }); + } + + this.ready_ = true; + this.content_changed(); + this.flat_changed(); + this.draggable_changed(); + + var panes = this.getPanes(); + if (panes) { + panes.overlayMouseTarget.appendChild(this.markerWrapper_); + } + + google.maps.event.trigger(this, 'ready'); +}; +RichMarker.prototype['onAdd'] = RichMarker.prototype.onAdd; + + +/** + * Impelementing the interface. + */ +RichMarker.prototype.draw = function() { + if (!this.ready_ || this.dragging_) { + return; + } + + var projection = this.getProjection(); + + if (!projection) { + // The map projection is not ready yet so do nothing + return; + } + + var latLng = /** @type {google.maps.LatLng} */ (this.get('position')); + var pos = projection.fromLatLngToDivPixel(latLng); + + var offset = this.getOffset_(); + this.markerWrapper_.style['top'] = (pos.y + offset.height) + 'px'; + this.markerWrapper_.style['left'] = (pos.x + offset.width) + 'px'; + + var height = this.markerContent_.offsetHeight; + var width = this.markerContent_.offsetWidth; + + if (width != this.get('width')) { + this.set('width', width); + } + + if (height != this.get('height')) { + this.set('height', height); + } +}; +RichMarker.prototype['draw'] = RichMarker.prototype.draw; + + +/** + * Removing a marker from the map. + * Implementing the interface. + */ +RichMarker.prototype.onRemove = function() { + if (this.markerWrapper_ && this.markerWrapper_.parentNode) { + this.markerWrapper_.parentNode.removeChild(this.markerWrapper_); + } + this.removeDragListeners_(); +}; +RichMarker.prototype['onRemove'] = RichMarker.prototype.onRemove; + + +/** + * RichMarker Anchor positions + * @enum {number} + */ +var RichMarkerPosition = { + 'TOP_LEFT': 1, + 'TOP': 2, + 'TOP_RIGHT': 3, + 'LEFT': 4, + 'MIDDLE': 5, + 'RIGHT': 6, + 'BOTTOM_LEFT': 7, + 'BOTTOM': 8, + 'BOTTOM_RIGHT': 9 +}; +window['RichMarkerPosition'] = RichMarkerPosition; + + + //TODO: export / passthese on in the service instead of window + window.InfoBox = InfoBox; + window.Cluster = Cluster; + window.ClusterIcon = ClusterIcon; + window.MarkerClusterer = MarkerClusterer; + window.MarkerLabel_ = MarkerLabel_; + window.MarkerWithLabel = MarkerWithLabel; + window.RichMarker = RichMarker; + }(); + //END REPLACE + }) + }; +}); +;/******/ (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] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = 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; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + /* istanbul ignore next */ + angular.module('uiGmapgoogle-maps.wrapped') + .service('uiGmapDataStructures', function() { + return { + Graph: __webpack_require__(1).Graph, + Queue: __webpack_require__(1).Queue + }; + }); + + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + (function() { + module.exports = { + Graph: __webpack_require__(2), + Heap: __webpack_require__(3), + LinkedList: __webpack_require__(4), + Map: __webpack_require__(5), + Queue: __webpack_require__(6), + RedBlackTree: __webpack_require__(7), + Trie: __webpack_require__(8) + }; + + }).call(this); + + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + /* + Graph implemented as a modified incidence list. O(1) for every typical + operation except `removeNode()` at O(E) where E is the number of edges. + + ## Overview example: + + ```js + var graph = new Graph; + graph.addNode('A'); // => a node object. For more info, log the output or check + // the documentation for addNode + graph.addNode('B'); + graph.addNode('C'); + graph.addEdge('A', 'C'); // => an edge object + graph.addEdge('A', 'B'); + graph.getEdge('B', 'A'); // => undefined. Directed edge! + graph.getEdge('A', 'B'); // => the edge object previously added + graph.getEdge('A', 'B').weight = 2 // weight is the only built-in handy property + // of an edge object. Feel free to attach + // other properties + graph.getInEdgesOf('B'); // => array of edge objects, in this case only one; + // connecting A to B + graph.getOutEdgesOf('A'); // => array of edge objects, one to B and one to C + graph.getAllEdgesOf('A'); // => all the in and out edges. Edge directed toward + // the node itself are only counted once + forEachNode(function(nodeObject) { + console.log(node); + }); + forEachEdge(function(edgeObject) { + console.log(edgeObject); + }); + graph.removeNode('C'); // => 'C'. The edge between A and C also removed + graph.removeEdge('A', 'B'); // => the edge object removed + ``` + + ## Properties: + + - nodeSize: total number of nodes. + - edgeSize: total number of edges. + */ + + + (function() { + var Graph, + __hasProp = {}.hasOwnProperty; + + Graph = (function() { + function Graph() { + this._nodes = {}; + this.nodeSize = 0; + this.edgeSize = 0; + } + + Graph.prototype.addNode = function(id) { + /* + The `id` is a unique identifier for the node, and should **not** change + after it's added. It will be used for adding, retrieving and deleting + related edges too. + + **Note** that, internally, the ids are kept in an object. JavaScript's + object hashes the id `'2'` and `2` to the same key, so please stick to a + simple id data type such as number or string. + + _Returns:_ the node object. Feel free to attach additional custom properties + on it for graph algorithms' needs. **Undefined if node id already exists**, + as to avoid accidental overrides. + */ + + if (!this._nodes[id]) { + this.nodeSize++; + return this._nodes[id] = { + _outEdges: {}, + _inEdges: {} + }; + } + }; + + Graph.prototype.getNode = function(id) { + /* + _Returns:_ the node object. Feel free to attach additional custom properties + on it for graph algorithms' needs. + */ + + return this._nodes[id]; + }; + + Graph.prototype.removeNode = function(id) { + /* + _Returns:_ the node object removed, or undefined if it didn't exist in the + first place. + */ + + var inEdgeId, nodeToRemove, outEdgeId, _ref, _ref1; + nodeToRemove = this._nodes[id]; + if (!nodeToRemove) { + return; + } else { + _ref = nodeToRemove._outEdges; + for (outEdgeId in _ref) { + if (!__hasProp.call(_ref, outEdgeId)) continue; + this.removeEdge(id, outEdgeId); + } + _ref1 = nodeToRemove._inEdges; + for (inEdgeId in _ref1) { + if (!__hasProp.call(_ref1, inEdgeId)) continue; + this.removeEdge(inEdgeId, id); + } + this.nodeSize--; + delete this._nodes[id]; + } + return nodeToRemove; + }; + + Graph.prototype.addEdge = function(fromId, toId, weight) { + var edgeToAdd, fromNode, toNode; + if (weight == null) { + weight = 1; + } + /* + `fromId` and `toId` are the node id specified when it was created using + `addNode()`. `weight` is optional and defaults to 1. Ignoring it effectively + makes this an unweighted graph. Under the hood, `weight` is just a normal + property of the edge object. + + _Returns:_ the edge object created. Feel free to attach additional custom + properties on it for graph algorithms' needs. **Or undefined** if the nodes + of id `fromId` or `toId` aren't found, or if an edge already exists between + the two nodes. + */ + + if (this.getEdge(fromId, toId)) { + return; + } + fromNode = this._nodes[fromId]; + toNode = this._nodes[toId]; + if (!fromNode || !toNode) { + return; + } + edgeToAdd = { + weight: weight + }; + fromNode._outEdges[toId] = edgeToAdd; + toNode._inEdges[fromId] = edgeToAdd; + this.edgeSize++; + return edgeToAdd; + }; + + Graph.prototype.getEdge = function(fromId, toId) { + /* + _Returns:_ the edge object, or undefined if the nodes of id `fromId` or + `toId` aren't found. + */ + + var fromNode, toNode; + fromNode = this._nodes[fromId]; + toNode = this._nodes[toId]; + if (!fromNode || !toNode) { + + } else { + return fromNode._outEdges[toId]; + } + }; + + Graph.prototype.removeEdge = function(fromId, toId) { + /* + _Returns:_ the edge object removed, or undefined of edge wasn't found. + */ + + var edgeToDelete, fromNode, toNode; + fromNode = this._nodes[fromId]; + toNode = this._nodes[toId]; + edgeToDelete = this.getEdge(fromId, toId); + if (!edgeToDelete) { + return; + } + delete fromNode._outEdges[toId]; + delete toNode._inEdges[fromId]; + this.edgeSize--; + return edgeToDelete; + }; + + Graph.prototype.getInEdgesOf = function(nodeId) { + /* + _Returns:_ an array of edge objects that are directed toward the node, or + empty array if no such edge or node exists. + */ + + var fromId, inEdges, toNode, _ref; + toNode = this._nodes[nodeId]; + inEdges = []; + _ref = toNode != null ? toNode._inEdges : void 0; + for (fromId in _ref) { + if (!__hasProp.call(_ref, fromId)) continue; + inEdges.push(this.getEdge(fromId, nodeId)); + } + return inEdges; + }; + + Graph.prototype.getOutEdgesOf = function(nodeId) { + /* + _Returns:_ an array of edge objects that go out of the node, or empty array + if no such edge or node exists. + */ + + var fromNode, outEdges, toId, _ref; + fromNode = this._nodes[nodeId]; + outEdges = []; + _ref = fromNode != null ? fromNode._outEdges : void 0; + for (toId in _ref) { + if (!__hasProp.call(_ref, toId)) continue; + outEdges.push(this.getEdge(nodeId, toId)); + } + return outEdges; + }; + + Graph.prototype.getAllEdgesOf = function(nodeId) { + /* + **Note:** not the same as concatenating `getInEdgesOf()` and + `getOutEdgesOf()`. Some nodes might have an edge pointing toward itself. + This method solves that duplication. + + _Returns:_ an array of edge objects linked to the node, no matter if they're + outgoing or coming. Duplicate edge created by self-pointing nodes are + removed. Only one copy stays. Empty array if node has no edge. + */ + + var i, inEdges, outEdges, selfEdge, _i, _ref, _ref1; + inEdges = this.getInEdgesOf(nodeId); + outEdges = this.getOutEdgesOf(nodeId); + if (inEdges.length === 0) { + return outEdges; + } + selfEdge = this.getEdge(nodeId, nodeId); + for (i = _i = 0, _ref = inEdges.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + if (inEdges[i] === selfEdge) { + _ref1 = [inEdges[inEdges.length - 1], inEdges[i]], inEdges[i] = _ref1[0], inEdges[inEdges.length - 1] = _ref1[1]; + inEdges.pop(); + break; + } + } + return inEdges.concat(outEdges); + }; + + Graph.prototype.forEachNode = function(operation) { + /* + Traverse through the graph in an arbitrary manner, visiting each node once. + Pass a function of the form `fn(nodeObject, nodeId)`. + + _Returns:_ undefined. + */ + + var nodeId, nodeObject, _ref; + _ref = this._nodes; + for (nodeId in _ref) { + if (!__hasProp.call(_ref, nodeId)) continue; + nodeObject = _ref[nodeId]; + operation(nodeObject, nodeId); + } + }; + + Graph.prototype.forEachEdge = function(operation) { + /* + Traverse through the graph in an arbitrary manner, visiting each edge once. + Pass a function of the form `fn(edgeObject)`. + + _Returns:_ undefined. + */ + + var edgeObject, nodeId, nodeObject, toId, _ref, _ref1; + _ref = this._nodes; + for (nodeId in _ref) { + if (!__hasProp.call(_ref, nodeId)) continue; + nodeObject = _ref[nodeId]; + _ref1 = nodeObject._outEdges; + for (toId in _ref1) { + if (!__hasProp.call(_ref1, toId)) continue; + edgeObject = _ref1[toId]; + operation(edgeObject); + } + } + }; + + return Graph; + + })(); + + module.exports = Graph; + + }).call(this); + + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + /* + Minimum heap, i.e. smallest node at root. + + **Note:** does not accept null or undefined. This is by design. Those values + cause comparison problems and might report false negative during extraction. + + ## Overview example: + + ```js + var heap = new Heap([5, 6, 3, 4]); + heap.add(10); // => 10 + heap.removeMin(); // => 3 + heap.peekMin(); // => 4 + ``` + + ## Properties: + + - size: total number of items. + */ + + + (function() { + var Heap, _leftChild, _parent, _rightChild; + + Heap = (function() { + function Heap(dataToHeapify) { + var i, item, _i, _j, _len, _ref; + if (dataToHeapify == null) { + dataToHeapify = []; + } + /* + Pass an optional array to be heapified. Takes only O(n) time. + */ + + this._data = [void 0]; + for (_i = 0, _len = dataToHeapify.length; _i < _len; _i++) { + item = dataToHeapify[_i]; + if (item != null) { + this._data.push(item); + } + } + if (this._data.length > 1) { + for (i = _j = 2, _ref = this._data.length; 2 <= _ref ? _j < _ref : _j > _ref; i = 2 <= _ref ? ++_j : --_j) { + this._upHeap(i); + } + } + this.size = this._data.length - 1; + } + + Heap.prototype.add = function(value) { + /* + **Remember:** rejects null and undefined for mentioned reasons. + + _Returns:_ the value added. + */ + + if (value == null) { + return; + } + this._data.push(value); + this._upHeap(this._data.length - 1); + this.size++; + return value; + }; + + Heap.prototype.removeMin = function() { + /* + _Returns:_ the smallest item (the root). + */ + + var min; + if (this._data.length === 1) { + return; + } + this.size--; + if (this._data.length === 2) { + return this._data.pop(); + } + min = this._data[1]; + this._data[1] = this._data.pop(); + this._downHeap(); + return min; + }; + + Heap.prototype.peekMin = function() { + /* + Check the smallest item without removing it. + + _Returns:_ the smallest item (the root). + */ + + return this._data[1]; + }; + + Heap.prototype._upHeap = function(index) { + var valueHolder, _ref; + valueHolder = this._data[index]; + while (this._data[index] < this._data[_parent(index)] && index > 1) { + _ref = [this._data[_parent(index)], this._data[index]], this._data[index] = _ref[0], this._data[_parent(index)] = _ref[1]; + index = _parent(index); + } + }; + + Heap.prototype._downHeap = function() { + var currentIndex, smallerChildIndex, _ref; + currentIndex = 1; + while (_leftChild(currentIndex < this._data.length)) { + smallerChildIndex = _leftChild(currentIndex); + if (smallerChildIndex < this._data.length - 1) { + if (this._data[_rightChild(currentIndex)] < this._data[smallerChildIndex]) { + smallerChildIndex = _rightChild(currentIndex); + } + } + if (this._data[smallerChildIndex] < this._data[currentIndex]) { + _ref = [this._data[currentIndex], this._data[smallerChildIndex]], this._data[smallerChildIndex] = _ref[0], this._data[currentIndex] = _ref[1]; + currentIndex = smallerChildIndex; + } else { + break; + } + } + }; + + return Heap; + + })(); + + _parent = function(index) { + return index >> 1; + }; + + _leftChild = function(index) { + return index << 1; + }; + + _rightChild = function(index) { + return (index << 1) + 1; + }; + + module.exports = Heap; + + }).call(this); + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + /* + Doubly Linked. + + ## Overview example: + + ```js + var list = new LinkedList([5, 4, 9]); + list.add(12); // => 12 + list.head.next.value; // => 4 + list.tail.value; // => 12 + list.at(-1); // => 12 + list.removeAt(2); // => 9 + list.remove(4); // => 4 + list.indexOf(5); // => 0 + list.add(5, 1); // => 5. Second 5 at position 1. + list.indexOf(5, 1); // => 1 + ``` + + ## Properties: + + - head: first item. + - tail: last item. + - size: total number of items. + - item.value: value passed to the item when calling `add()`. + - item.prev: previous item. + - item.next: next item. + */ + + + (function() { + var LinkedList; + + LinkedList = (function() { + function LinkedList(valuesToAdd) { + var value, _i, _len; + if (valuesToAdd == null) { + valuesToAdd = []; + } + /* + Can pass an array of elements to link together during `new LinkedList()` + initiation. + */ + + this.head = { + prev: void 0, + value: void 0, + next: void 0 + }; + this.tail = { + prev: void 0, + value: void 0, + next: void 0 + }; + this.size = 0; + for (_i = 0, _len = valuesToAdd.length; _i < _len; _i++) { + value = valuesToAdd[_i]; + this.add(value); + } + } + + LinkedList.prototype.at = function(position) { + /* + Get the item at `position` (optional). Accepts negative index: + + ```js + myList.at(-1); // Returns the last element. + ``` + However, passing a negative index that surpasses the boundary will return + undefined: + + ```js + myList = new LinkedList([2, 6, 8, 3]) + myList.at(-5); // Undefined. + myList.at(-4); // 2. + ``` + _Returns:_ item gotten, or undefined if not found. + */ + + var currentNode, i, _i, _j, _ref; + if (!((-this.size <= position && position < this.size))) { + return; + } + position = this._adjust(position); + if (position * 2 < this.size) { + currentNode = this.head; + for (i = _i = 1; _i <= position; i = _i += 1) { + currentNode = currentNode.next; + } + } else { + currentNode = this.tail; + for (i = _j = 1, _ref = this.size - position - 1; _j <= _ref; i = _j += 1) { + currentNode = currentNode.prev; + } + } + return currentNode; + }; + + LinkedList.prototype.add = function(value, position) { + var currentNode, nodeToAdd, _ref, _ref1, _ref2; + if (position == null) { + position = this.size; + } + /* + Add a new item at `position` (optional). Defaults to adding at the end. + `position`, just like in `at()`, can be negative (within the negative + boundary). Position specifies the place the value's going to be, and the old + node will be pushed higher. `add(-2)` on list of size 7 is the same as + `add(5)`. + + _Returns:_ item added. + */ + + if (!((-this.size <= position && position <= this.size))) { + return; + } + nodeToAdd = { + value: value + }; + position = this._adjust(position); + if (this.size === 0) { + this.head = nodeToAdd; + } else { + if (position === 0) { + _ref = [nodeToAdd, this.head, nodeToAdd], this.head.prev = _ref[0], nodeToAdd.next = _ref[1], this.head = _ref[2]; + } else { + currentNode = this.at(position - 1); + _ref1 = [currentNode.next, nodeToAdd, nodeToAdd, currentNode], nodeToAdd.next = _ref1[0], (_ref2 = currentNode.next) != null ? _ref2.prev = _ref1[1] : void 0, currentNode.next = _ref1[2], nodeToAdd.prev = _ref1[3]; + } + } + if (position === this.size) { + this.tail = nodeToAdd; + } + this.size++; + return value; + }; + + LinkedList.prototype.removeAt = function(position) { + var currentNode, valueToReturn, _ref; + if (position == null) { + position = this.size - 1; + } + /* + Remove an item at index `position` (optional). Defaults to the last item. + Index can be negative (within the boundary). + + _Returns:_ item removed. + */ + + if (!((-this.size <= position && position < this.size))) { + return; + } + if (this.size === 0) { + return; + } + position = this._adjust(position); + if (this.size === 1) { + valueToReturn = this.head.value; + this.head.value = this.tail.value = void 0; + } else { + if (position === 0) { + valueToReturn = this.head.value; + this.head = this.head.next; + this.head.prev = void 0; + } else { + currentNode = this.at(position); + valueToReturn = currentNode.value; + currentNode.prev.next = currentNode.next; + if ((_ref = currentNode.next) != null) { + _ref.prev = currentNode.prev; + } + if (position === this.size - 1) { + this.tail = currentNode.prev; + } + } + } + this.size--; + return valueToReturn; + }; + + LinkedList.prototype.remove = function(value) { + /* + Remove the item using its value instead of position. **Will remove the fist + occurrence of `value`.** + + _Returns:_ the value, or undefined if value's not found. + */ + + var currentNode; + if (value == null) { + return; + } + currentNode = this.head; + while (currentNode && currentNode.value !== value) { + currentNode = currentNode.next; + } + if (!currentNode) { + return; + } + if (this.size === 1) { + this.head.value = this.tail.value = void 0; + } else if (currentNode === this.head) { + this.head = this.head.next; + this.head.prev = void 0; + } else if (currentNode === this.tail) { + this.tail = this.tail.prev; + this.tail.next = void 0; + } else { + currentNode.prev.next = currentNode.next; + currentNode.next.prev = currentNode.prev; + } + this.size--; + return value; + }; + + LinkedList.prototype.indexOf = function(value, startingPosition) { + var currentNode, position; + if (startingPosition == null) { + startingPosition = 0; + } + /* + Find the index of an item, similarly to `array.indexOf()`. Defaults to start + searching from the beginning, by can start at another position by passing + `startingPosition`. This parameter can also be negative; but unlike the + other methods of this class, `startingPosition` (optional) can be as small + as desired; a value of -999 for a list of size 5 will start searching + normally, at the beginning. + + **Note:** searches forwardly, **not** backwardly, i.e: + + ```js + var myList = new LinkedList([2, 3, 1, 4, 3, 5]) + myList.indexOf(3, -3); // Returns 4, not 1 + ``` + _Returns:_ index of item found, or -1 if not found. + */ + + if (((this.head.value == null) && !this.head.next) || startingPosition >= this.size) { + return -1; + } + startingPosition = Math.max(0, this._adjust(startingPosition)); + currentNode = this.at(startingPosition); + position = startingPosition; + while (currentNode) { + if (currentNode.value === value) { + break; + } + currentNode = currentNode.next; + position++; + } + if (position === this.size) { + return -1; + } else { + return position; + } + }; + + LinkedList.prototype._adjust = function(position) { + if (position < 0) { + return this.size + position; + } else { + return position; + } + }; + + return LinkedList; + + })(); + + module.exports = LinkedList; + + }).call(this); + + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + + /* + Kind of a stopgap measure for the upcoming [JavaScript + Map](http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets) + + **Note:** due to JavaScript's limitations, hashing something other than Boolean, + Number, String, Undefined, Null, RegExp, Function requires a hack that inserts a + hidden unique property into the object. This means `set`, `get`, `has` and + `delete` must employ the same object, and not a mere identical copy as in the + case of, say, a string. + + ## Overview example: + + ```js + var map = new Map({'alice': 'wonderland', 20: 'ok'}); + map.set('20', 5); // => 5 + map.get('20'); // => 5 + map.has('alice'); // => true + map.delete(20) // => true + var arr = [1, 2]; + map.add(arr, 'goody'); // => 'goody' + map.has(arr); // => true + map.has([1, 2]); // => false. Needs to compare by reference + map.forEach(function(key, value) { + console.log(key, value); + }); + ``` + + ## Properties: + + - size: The total number of `(key, value)` pairs. + */ + + + (function() { + var Map, SPECIAL_TYPE_KEY_PREFIX, _extractDataType, _isSpecialType, + __hasProp = {}.hasOwnProperty; + + SPECIAL_TYPE_KEY_PREFIX = '_mapId_'; + + Map = (function() { + Map._mapIdTracker = 0; + + Map._newMapId = function() { + return this._mapIdTracker++; + }; + + function Map(objectToMap) { + /* + Pass an optional object whose (key, value) pair will be hashed. **Careful** + not to pass something like {5: 'hi', '5': 'hello'}, since JavaScript's + native object behavior will crush the first 5 property before it gets to + constructor. + */ + + var key, value; + this._content = {}; + this._itemId = 0; + this._id = Map._newMapId(); + this.size = 0; + for (key in objectToMap) { + if (!__hasProp.call(objectToMap, key)) continue; + value = objectToMap[key]; + this.set(key, value); + } + } + + Map.prototype.hash = function(key, makeHash) { + var propertyForMap, type; + if (makeHash == null) { + makeHash = false; + } + /* + The hash function for hashing keys is public. Feel free to replace it with + your own. The `makeHash` parameter is optional and accepts a boolean + (defaults to `false`) indicating whether or not to produce a new hash (for + the first use, naturally). + + _Returns:_ the hash. + */ + + type = _extractDataType(key); + if (_isSpecialType(key)) { + propertyForMap = SPECIAL_TYPE_KEY_PREFIX + this._id; + if (makeHash && !key[propertyForMap]) { + key[propertyForMap] = this._itemId++; + } + return propertyForMap + '_' + key[propertyForMap]; + } else { + return type + '_' + key; + } + }; + + Map.prototype.set = function(key, value) { + /* + _Returns:_ value. + */ + + if (!this.has(key)) { + this.size++; + } + this._content[this.hash(key, true)] = [value, key]; + return value; + }; + + Map.prototype.get = function(key) { + /* + _Returns:_ value corresponding to the key, or undefined if not found. + */ + + var _ref; + return (_ref = this._content[this.hash(key)]) != null ? _ref[0] : void 0; + }; + + Map.prototype.has = function(key) { + /* + Check whether a value exists for the key. + + _Returns:_ true or false. + */ + + return this.hash(key) in this._content; + }; + + Map.prototype["delete"] = function(key) { + /* + Remove the (key, value) pair. + + _Returns:_ **true or false**. Unlike most of this library, this method + doesn't return the deleted value. This is so that it conforms to the future + JavaScript `map.delete()`'s behavior. + */ + + var hashedKey; + hashedKey = this.hash(key); + if (hashedKey in this._content) { + delete this._content[hashedKey]; + if (_isSpecialType(key)) { + delete key[SPECIAL_TYPE_KEY_PREFIX + this._id]; + } + this.size--; + return true; + } + return false; + }; + + Map.prototype.forEach = function(operation) { + /* + Traverse through the map. Pass a function of the form `fn(key, value)`. + + _Returns:_ undefined. + */ + + var key, value, _ref; + _ref = this._content; + for (key in _ref) { + if (!__hasProp.call(_ref, key)) continue; + value = _ref[key]; + operation(value[1], value[0]); + } + }; + + return Map; + + })(); + + _isSpecialType = function(key) { + var simpleHashableTypes, simpleType, type, _i, _len; + simpleHashableTypes = ['Boolean', 'Number', 'String', 'Undefined', 'Null', 'RegExp', 'Function']; + type = _extractDataType(key); + for (_i = 0, _len = simpleHashableTypes.length; _i < _len; _i++) { + simpleType = simpleHashableTypes[_i]; + if (type === simpleType) { + return false; + } + } + return true; + }; + + _extractDataType = function(type) { + return Object.prototype.toString.apply(type).match(/\[object (.+)\]/)[1]; + }; + + module.exports = Map; + + }).call(this); + + +/***/ }, +/* 6 */ +/***/ function(module, exports) { + + /* + Amortized O(1) dequeue! + + ## Overview example: + + ```js + var queue = new Queue([1, 6, 4]); + queue.enqueue(10); // => 10 + queue.dequeue(); // => 1 + queue.dequeue(); // => 6 + queue.dequeue(); // => 4 + queue.peek(); // => 10 + queue.dequeue(); // => 10 + queue.peek(); // => undefined + ``` + + ## Properties: + + - size: The total number of items. + */ + + + (function() { + var Queue; + + Queue = (function() { + function Queue(initialArray) { + if (initialArray == null) { + initialArray = []; + } + /* + Pass an optional array to be transformed into a queue. The item at index 0 + is the first to be dequeued. + */ + + this._content = initialArray; + this._dequeueIndex = 0; + this.size = this._content.length; + } + + Queue.prototype.enqueue = function(item) { + /* + _Returns:_ the item. + */ + + this.size++; + this._content.push(item); + return item; + }; + + Queue.prototype.dequeue = function() { + /* + _Returns:_ the dequeued item. + */ + + var itemToDequeue; + if (this.size === 0) { + return; + } + this.size--; + itemToDequeue = this._content[this._dequeueIndex]; + this._dequeueIndex++; + if (this._dequeueIndex * 2 > this._content.length) { + this._content = this._content.slice(this._dequeueIndex); + this._dequeueIndex = 0; + } + return itemToDequeue; + }; + + Queue.prototype.peek = function() { + /* + Check the next item to be dequeued, without removing it. + + _Returns:_ the item. + */ + + return this._content[this._dequeueIndex]; + }; + + return Queue; + + })(); + + module.exports = Queue; + + }).call(this); + + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + + /* + Credit to Wikipedia's article on [Red-black + tree](http://en.wikipedia.org/wiki/Red–black_tree) + + **Note:** doesn't handle duplicate entries, undefined and null. This is by + design. + + ## Overview example: + + ```js + var rbt = new RedBlackTree([7, 5, 1, 8]); + rbt.add(2); // => 2 + rbt.add(10); // => 10 + rbt.has(5); // => true + rbt.peekMin(); // => 1 + rbt.peekMax(); // => 10 + rbt.removeMin(); // => 1 + rbt.removeMax(); // => 10 + rbt.remove(8); // => 8 + ``` + + ## Properties: + + - size: The total number of items. + */ + + + (function() { + var BLACK, NODE_FOUND, NODE_TOO_BIG, NODE_TOO_SMALL, RED, RedBlackTree, STOP_SEARCHING, _findNode, _grandParentOf, _isLeft, _leftOrRight, _peekMaxNode, _peekMinNode, _siblingOf, _uncleOf; + + NODE_FOUND = 0; + + NODE_TOO_BIG = 1; + + NODE_TOO_SMALL = 2; + + STOP_SEARCHING = 3; + + RED = 1; + + BLACK = 2; + + RedBlackTree = (function() { + function RedBlackTree(valuesToAdd) { + var value, _i, _len; + if (valuesToAdd == null) { + valuesToAdd = []; + } + /* + Pass an optional array to be turned into binary tree. **Note:** does not + accept duplicate, undefined and null. + */ + + this._root; + this.size = 0; + for (_i = 0, _len = valuesToAdd.length; _i < _len; _i++) { + value = valuesToAdd[_i]; + if (value != null) { + this.add(value); + } + } + } + + RedBlackTree.prototype.add = function(value) { + /* + Again, make sure to not pass a value already in the tree, or undefined, or + null. + + _Returns:_ value added. + */ + + var currentNode, foundNode, nodeToInsert, _ref; + if (value == null) { + return; + } + this.size++; + nodeToInsert = { + value: value, + _color: RED + }; + if (!this._root) { + this._root = nodeToInsert; + } else { + foundNode = _findNode(this._root, function(node) { + if (value === node.value) { + return NODE_FOUND; + } else { + if (value < node.value) { + if (node._left) { + return NODE_TOO_BIG; + } else { + nodeToInsert._parent = node; + node._left = nodeToInsert; + return STOP_SEARCHING; + } + } else { + if (node._right) { + return NODE_TOO_SMALL; + } else { + nodeToInsert._parent = node; + node._right = nodeToInsert; + return STOP_SEARCHING; + } + } + } + }); + if (foundNode != null) { + return; + } + } + currentNode = nodeToInsert; + while (true) { + if (currentNode === this._root) { + currentNode._color = BLACK; + break; + } + if (currentNode._parent._color === BLACK) { + break; + } + if (((_ref = _uncleOf(currentNode)) != null ? _ref._color : void 0) === RED) { + currentNode._parent._color = BLACK; + _uncleOf(currentNode)._color = BLACK; + _grandParentOf(currentNode)._color = RED; + currentNode = _grandParentOf(currentNode); + continue; + } + if (!_isLeft(currentNode) && _isLeft(currentNode._parent)) { + this._rotateLeft(currentNode._parent); + currentNode = currentNode._left; + } else if (_isLeft(currentNode) && !_isLeft(currentNode._parent)) { + this._rotateRight(currentNode._parent); + currentNode = currentNode._right; + } + currentNode._parent._color = BLACK; + _grandParentOf(currentNode)._color = RED; + if (_isLeft(currentNode)) { + this._rotateRight(_grandParentOf(currentNode)); + } else { + this._rotateLeft(_grandParentOf(currentNode)); + } + break; + } + return value; + }; + + RedBlackTree.prototype.has = function(value) { + /* + _Returns:_ true or false. + */ + + var foundNode; + foundNode = _findNode(this._root, function(node) { + if (value === node.value) { + return NODE_FOUND; + } else if (value < node.value) { + return NODE_TOO_BIG; + } else { + return NODE_TOO_SMALL; + } + }); + if (foundNode) { + return true; + } else { + return false; + } + }; + + RedBlackTree.prototype.peekMin = function() { + /* + Check the minimum value without removing it. + + _Returns:_ the minimum value. + */ + + var _ref; + return (_ref = _peekMinNode(this._root)) != null ? _ref.value : void 0; + }; + + RedBlackTree.prototype.peekMax = function() { + /* + Check the maximum value without removing it. + + _Returns:_ the maximum value. + */ + + var _ref; + return (_ref = _peekMaxNode(this._root)) != null ? _ref.value : void 0; + }; + + RedBlackTree.prototype.remove = function(value) { + /* + _Returns:_ the value removed, or undefined if the value's not found. + */ + + var foundNode; + foundNode = _findNode(this._root, function(node) { + if (value === node.value) { + return NODE_FOUND; + } else if (value < node.value) { + return NODE_TOO_BIG; + } else { + return NODE_TOO_SMALL; + } + }); + if (!foundNode) { + return; + } + this._removeNode(this._root, foundNode); + this.size--; + return value; + }; + + RedBlackTree.prototype.removeMin = function() { + /* + _Returns:_ smallest item removed, or undefined if tree's empty. + */ + + var nodeToRemove, valueToReturn; + nodeToRemove = _peekMinNode(this._root); + if (!nodeToRemove) { + return; + } + valueToReturn = nodeToRemove.value; + this._removeNode(this._root, nodeToRemove); + return valueToReturn; + }; + + RedBlackTree.prototype.removeMax = function() { + /* + _Returns:_ biggest item removed, or undefined if tree's empty. + */ + + var nodeToRemove, valueToReturn; + nodeToRemove = _peekMaxNode(this._root); + if (!nodeToRemove) { + return; + } + valueToReturn = nodeToRemove.value; + this._removeNode(this._root, nodeToRemove); + return valueToReturn; + }; + + RedBlackTree.prototype._removeNode = function(root, node) { + var sibling, successor, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7; + if (node._left && node._right) { + successor = _peekMinNode(node._right); + node.value = successor.value; + node = successor; + } + successor = node._left || node._right; + if (!successor) { + successor = { + color: BLACK, + _right: void 0, + _left: void 0, + isLeaf: true + }; + } + successor._parent = node._parent; + if ((_ref = node._parent) != null) { + _ref[_leftOrRight(node)] = successor; + } + if (node._color === BLACK) { + if (successor._color === RED) { + successor._color = BLACK; + if (!successor._parent) { + this._root = successor; + } + } else { + while (true) { + if (!successor._parent) { + if (!successor.isLeaf) { + this._root = successor; + } else { + this._root = void 0; + } + break; + } + sibling = _siblingOf(successor); + if ((sibling != null ? sibling._color : void 0) === RED) { + successor._parent._color = RED; + sibling._color = BLACK; + if (_isLeft(successor)) { + this._rotateLeft(successor._parent); + } else { + this._rotateRight(successor._parent); + } + } + sibling = _siblingOf(successor); + if (successor._parent._color === BLACK && (!sibling || (sibling._color === BLACK && (!sibling._left || sibling._left._color === BLACK) && (!sibling._right || sibling._right._color === BLACK)))) { + if (sibling != null) { + sibling._color = RED; + } + if (successor.isLeaf) { + successor._parent[_leftOrRight(successor)] = void 0; + } + successor = successor._parent; + continue; + } + if (successor._parent._color === RED && (!sibling || (sibling._color === BLACK && (!sibling._left || ((_ref1 = sibling._left) != null ? _ref1._color : void 0) === BLACK) && (!sibling._right || ((_ref2 = sibling._right) != null ? _ref2._color : void 0) === BLACK)))) { + if (sibling != null) { + sibling._color = RED; + } + successor._parent._color = BLACK; + break; + } + if ((sibling != null ? sibling._color : void 0) === BLACK) { + if (_isLeft(successor) && (!sibling._right || sibling._right._color === BLACK) && ((_ref3 = sibling._left) != null ? _ref3._color : void 0) === RED) { + sibling._color = RED; + if ((_ref4 = sibling._left) != null) { + _ref4._color = BLACK; + } + this._rotateRight(sibling); + } else if (!_isLeft(successor) && (!sibling._left || sibling._left._color === BLACK) && ((_ref5 = sibling._right) != null ? _ref5._color : void 0) === RED) { + sibling._color = RED; + if ((_ref6 = sibling._right) != null) { + _ref6._color = BLACK; + } + this._rotateLeft(sibling); + } + break; + } + sibling = _siblingOf(successor); + sibling._color = successor._parent._color; + if (_isLeft(successor)) { + sibling._right._color = BLACK; + this._rotateRight(successor._parent); + } else { + sibling._left._color = BLACK; + this._rotateLeft(successor._parent); + } + } + } + } + if (successor.isLeaf) { + return (_ref7 = successor._parent) != null ? _ref7[_leftOrRight(successor)] = void 0 : void 0; + } + }; + + RedBlackTree.prototype._rotateLeft = function(node) { + var _ref, _ref1; + if ((_ref = node._parent) != null) { + _ref[_leftOrRight(node)] = node._right; + } + node._right._parent = node._parent; + node._parent = node._right; + node._right = node._right._left; + node._parent._left = node; + if ((_ref1 = node._right) != null) { + _ref1._parent = node; + } + if (node._parent._parent == null) { + return this._root = node._parent; + } + }; + + RedBlackTree.prototype._rotateRight = function(node) { + var _ref, _ref1; + if ((_ref = node._parent) != null) { + _ref[_leftOrRight(node)] = node._left; + } + node._left._parent = node._parent; + node._parent = node._left; + node._left = node._left._right; + node._parent._right = node; + if ((_ref1 = node._left) != null) { + _ref1._parent = node; + } + if (node._parent._parent == null) { + return this._root = node._parent; + } + }; + + return RedBlackTree; + + })(); + + _isLeft = function(node) { + return node === node._parent._left; + }; + + _leftOrRight = function(node) { + if (_isLeft(node)) { + return '_left'; + } else { + return '_right'; + } + }; + + _findNode = function(startingNode, comparator) { + var comparisonResult, currentNode, foundNode; + currentNode = startingNode; + foundNode = void 0; + while (currentNode) { + comparisonResult = comparator(currentNode); + if (comparisonResult === NODE_FOUND) { + foundNode = currentNode; + break; + } + if (comparisonResult === NODE_TOO_BIG) { + currentNode = currentNode._left; + } else if (comparisonResult === NODE_TOO_SMALL) { + currentNode = currentNode._right; + } else if (comparisonResult === STOP_SEARCHING) { + break; + } + } + return foundNode; + }; + + _peekMinNode = function(startingNode) { + return _findNode(startingNode, function(node) { + if (node._left) { + return NODE_TOO_BIG; + } else { + return NODE_FOUND; + } + }); + }; + + _peekMaxNode = function(startingNode) { + return _findNode(startingNode, function(node) { + if (node._right) { + return NODE_TOO_SMALL; + } else { + return NODE_FOUND; + } + }); + }; + + _grandParentOf = function(node) { + var _ref; + return (_ref = node._parent) != null ? _ref._parent : void 0; + }; + + _uncleOf = function(node) { + if (!_grandParentOf(node)) { + return; + } + if (_isLeft(node._parent)) { + return _grandParentOf(node)._right; + } else { + return _grandParentOf(node)._left; + } + }; + + _siblingOf = function(node) { + if (_isLeft(node)) { + return node._parent._right; + } else { + return node._parent._left; + } + }; + + module.exports = RedBlackTree; + + }).call(this); + + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + /* + Good for fast insertion/removal/lookup of strings. + + ## Overview example: + + ```js + var trie = new Trie(['bear', 'beer']); + trie.add('hello'); // => 'hello' + trie.add('helloha!'); // => 'helloha!' + trie.has('bears'); // => false + trie.longestPrefixOf('beatrice'); // => 'bea' + trie.wordsWithPrefix('hel'); // => ['hello', 'helloha!'] + trie.remove('beers'); // => undefined. 'beer' still exists + trie.remove('Beer') // => undefined. Case-sensitive + trie.remove('beer') // => 'beer'. Removed + ``` + + ## Properties: + + - size: The total number of words. + */ + + + (function() { + var Queue, Trie, WORD_END, _hasAtLeastNChildren, + __hasProp = {}.hasOwnProperty; + + Queue = __webpack_require__(6); + + WORD_END = 'end'; + + Trie = (function() { + function Trie(words) { + var word, _i, _len; + if (words == null) { + words = []; + } + /* + Pass an optional array of strings to be inserted initially. + */ + + this._root = {}; + this.size = 0; + for (_i = 0, _len = words.length; _i < _len; _i++) { + word = words[_i]; + this.add(word); + } + } + + Trie.prototype.add = function(word) { + /* + Add a whole string to the trie. + + _Returns:_ the word added. Will return undefined (without adding the value) + if the word passed is null or undefined. + */ + + var currentNode, letter, _i, _len; + if (word == null) { + return; + } + this.size++; + currentNode = this._root; + for (_i = 0, _len = word.length; _i < _len; _i++) { + letter = word[_i]; + if (currentNode[letter] == null) { + currentNode[letter] = {}; + } + currentNode = currentNode[letter]; + } + currentNode[WORD_END] = true; + return word; + }; + + Trie.prototype.has = function(word) { + /* + __Returns:_ true or false. + */ + + var currentNode, letter, _i, _len; + if (word == null) { + return false; + } + currentNode = this._root; + for (_i = 0, _len = word.length; _i < _len; _i++) { + letter = word[_i]; + if (currentNode[letter] == null) { + return false; + } + currentNode = currentNode[letter]; + } + if (currentNode[WORD_END]) { + return true; + } else { + return false; + } + }; + + Trie.prototype.longestPrefixOf = function(word) { + /* + Find all words containing the prefix. The word itself counts as a prefix. + + ```js + var trie = new Trie; + trie.add('hello'); + trie.longestPrefixOf('he'); // 'he' + trie.longestPrefixOf('hello'); // 'hello' + trie.longestPrefixOf('helloha!'); // 'hello' + ``` + + _Returns:_ the prefix string, or empty string if no prefix found. + */ + + var currentNode, letter, prefix, _i, _len; + if (word == null) { + return ''; + } + currentNode = this._root; + prefix = ''; + for (_i = 0, _len = word.length; _i < _len; _i++) { + letter = word[_i]; + if (currentNode[letter] == null) { + break; + } + prefix += letter; + currentNode = currentNode[letter]; + } + return prefix; + }; + + Trie.prototype.wordsWithPrefix = function(prefix) { + /* + Find all words containing the prefix. The word itself counts as a prefix. + **Watch out for edge cases.** + + ```js + var trie = new Trie; + trie.wordsWithPrefix(''); // []. Check later case below. + trie.add(''); + trie.wordsWithPrefix(''); // [''] + trie.add('he'); + trie.add('hello'); + trie.add('hell'); + trie.add('bear'); + trie.add('z'); + trie.add('zebra'); + trie.wordsWithPrefix('hel'); // ['hell', 'hello'] + ``` + + _Returns:_ an array of strings, or empty array if no word found. + */ + + var accumulatedLetters, currentNode, letter, node, queue, subNode, words, _i, _len, _ref; + if (prefix == null) { + return []; + } + (prefix != null) || (prefix = ''); + words = []; + currentNode = this._root; + for (_i = 0, _len = prefix.length; _i < _len; _i++) { + letter = prefix[_i]; + currentNode = currentNode[letter]; + if (currentNode == null) { + return []; + } + } + queue = new Queue(); + queue.enqueue([currentNode, '']); + while (queue.size !== 0) { + _ref = queue.dequeue(), node = _ref[0], accumulatedLetters = _ref[1]; + if (node[WORD_END]) { + words.push(prefix + accumulatedLetters); + } + for (letter in node) { + if (!__hasProp.call(node, letter)) continue; + subNode = node[letter]; + queue.enqueue([subNode, accumulatedLetters + letter]); + } + } + return words; + }; + + Trie.prototype.remove = function(word) { + /* + _Returns:_ the string removed, or undefined if the word in its whole doesn't + exist. **Note:** this means removing `beers` when only `beer` exists will + return undefined and conserve `beer`. + */ + + var currentNode, i, letter, prefix, _i, _j, _len, _ref; + if (word == null) { + return; + } + currentNode = this._root; + prefix = []; + for (_i = 0, _len = word.length; _i < _len; _i++) { + letter = word[_i]; + if (currentNode[letter] == null) { + return; + } + currentNode = currentNode[letter]; + prefix.push([letter, currentNode]); + } + if (!currentNode[WORD_END]) { + return; + } + this.size--; + delete currentNode[WORD_END]; + if (_hasAtLeastNChildren(currentNode, 1)) { + return word; + } + for (i = _j = _ref = prefix.length - 1; _ref <= 1 ? _j <= 1 : _j >= 1; i = _ref <= 1 ? ++_j : --_j) { + if (!_hasAtLeastNChildren(prefix[i][1], 1)) { + delete prefix[i - 1][1][prefix[i][0]]; + } else { + break; + } + } + if (!_hasAtLeastNChildren(this._root[prefix[0][0]], 1)) { + delete this._root[prefix[0][0]]; + } + return word; + }; + + return Trie; + + })(); + + _hasAtLeastNChildren = function(node, n) { + var child, childCount; + if (n === 0) { + return true; + } + childCount = 0; + for (child in node) { + if (!__hasProp.call(node, child)) continue; + childCount++; + if (childCount >= n) { + return true; + } + } + return false; + }; + + module.exports = Trie; + + }).call(this); + + +/***/ } +/******/ ]);;angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapMarkerSpiderfier', [ 'uiGmapGoogleMapApi', function(GoogleMapApi) { + var self = this; + /* istanbul ignore next */ + +function(){ + +/** @preserve OverlappingMarkerSpiderfier +https://github.com/jawj/OverlappingMarkerSpiderfier +Copyright (c) 2011 - 2013 George MacKerron +Released under the MIT licence: http://opensource.org/licenses/mit-license +Note: The Google Maps API v3 must be included *before* this code + */ +var hasProp = {}.hasOwnProperty, + slice = [].slice; + +this['OverlappingMarkerSpiderfier'] = (function() { + var ge, gm, j, lcH, lcU, len, mt, p, ref, twoPi, x; + + p = _Class.prototype; + + ref = [_Class, p]; + for (j = 0, len = ref.length; j < len; j++) { + x = ref[j]; + x['VERSION'] = '0.3.3'; + } + + gm = void 0; + + ge = void 0; + + mt = void 0; + + twoPi = Math.PI * 2; + + p['keepSpiderfied'] = false; + + p['markersWontHide'] = false; + + p['markersWontMove'] = false; + + p['nearbyDistance'] = 20; + + p['circleSpiralSwitchover'] = 9; + + p['circleFootSeparation'] = 23; + + p['circleStartAngle'] = twoPi / 12; + + p['spiralFootSeparation'] = 26; + + p['spiralLengthStart'] = 11; + + p['spiralLengthFactor'] = 4; + + p['spiderfiedZIndex'] = 1000; + + p['usualLegZIndex'] = 10; + + p['highlightedLegZIndex'] = 20; + + p['event'] = 'click'; + + p['minZoomLevel'] = false; + + p['legWeight'] = 1.5; + + p['legColors'] = { + 'usual': {}, + 'highlighted': {} + }; + + lcU = p['legColors']['usual']; + + lcH = p['legColors']['highlighted']; + + _Class['initializeGoogleMaps'] = function(google) { + gm = google.maps; + ge = gm.event; + mt = gm.MapTypeId; + lcU[mt.HYBRID] = lcU[mt.SATELLITE] = '#fff'; + lcH[mt.HYBRID] = lcH[mt.SATELLITE] = '#f00'; + lcU[mt.TERRAIN] = lcU[mt.ROADMAP] = '#444'; + lcH[mt.TERRAIN] = lcH[mt.ROADMAP] = '#f00'; + this.ProjHelper = function(map) { + return this.setMap(map); + }; + this.ProjHelper.prototype = new gm.OverlayView(); + return this.ProjHelper.prototype['draw'] = function() {}; + }; + + function _Class(map1, opts) { + var e, k, l, len1, ref1, v; + this.map = map1; + if (opts == null) { + opts = {}; + } + for (k in opts) { + if (!hasProp.call(opts, k)) continue; + v = opts[k]; + this[k] = v; + } + this.projHelper = new this.constructor.ProjHelper(this.map); + this.initMarkerArrays(); + this.listeners = {}; + ref1 = ['click', 'zoom_changed', 'maptypeid_changed']; + for (l = 0, len1 = ref1.length; l < len1; l++) { + e = ref1[l]; + ge.addListener(this.map, e, (function(_this) { + return function() { + return _this['unspiderfy'](); + }; + })(this)); + } + } + + p.initMarkerArrays = function() { + this.markers = []; + return this.markerListenerRefs = []; + }; + + p['addMarker'] = function(marker) { + var listenerRefs; + if (marker['_oms'] != null) { + return this; + } + marker['_oms'] = true; + listenerRefs = [ + ge.addListener(marker, this['event'], (function(_this) { + return function(event) { + return _this.spiderListener(marker, event); + }; + })(this)) + ]; + if (!this['markersWontHide']) { + listenerRefs.push(ge.addListener(marker, 'visible_changed', (function(_this) { + return function() { + return _this.markerChangeListener(marker, false); + }; + })(this))); + } + if (!this['markersWontMove']) { + listenerRefs.push(ge.addListener(marker, 'position_changed', (function(_this) { + return function() { + return _this.markerChangeListener(marker, true); + }; + })(this))); + } + this.markerListenerRefs.push(listenerRefs); + this.markers.push(marker); + return this; + }; + + p.markerChangeListener = function(marker, positionChanged) { + if ((marker['_omsData'] != null) && (positionChanged || !marker.getVisible()) && !((this.spiderfying != null) || (this.unspiderfying != null))) { + return this['unspiderfy'](positionChanged ? marker : null); + } + }; + + p['getMarkers'] = function() { + return this.markers.slice(0); + }; + + p['removeMarker'] = function(marker) { + var i, l, len1, listenerRef, listenerRefs; + if (marker['_omsData'] != null) { + this['unspiderfy'](); + } + i = this.arrIndexOf(this.markers, marker); + if (i < 0) { + return this; + } + listenerRefs = this.markerListenerRefs.splice(i, 1)[0]; + for (l = 0, len1 = listenerRefs.length; l < len1; l++) { + listenerRef = listenerRefs[l]; + ge.removeListener(listenerRef); + } + delete marker['_oms']; + this.markers.splice(i, 1); + return this; + }; + + p['clearMarkers'] = function() { + var i, l, len1, len2, listenerRef, listenerRefs, marker, n, ref1; + this['unspiderfy'](); + ref1 = this.markers; + for (i = l = 0, len1 = ref1.length; l < len1; i = ++l) { + marker = ref1[i]; + listenerRefs = this.markerListenerRefs[i]; + for (n = 0, len2 = listenerRefs.length; n < len2; n++) { + listenerRef = listenerRefs[n]; + ge.removeListener(listenerRef); + } + delete marker['_oms']; + } + this.initMarkerArrays(); + return this; + }; + + p['addListener'] = function(event, func) { + var base; + ((base = this.listeners)[event] != null ? base[event] : base[event] = []).push(func); + return this; + }; + + p['removeListener'] = function(event, func) { + var i; + i = this.arrIndexOf(this.listeners[event], func); + if (!(i < 0)) { + this.listeners[event].splice(i, 1); + } + return this; + }; + + p['clearListeners'] = function(event) { + this.listeners[event] = []; + return this; + }; + + p.trigger = function() { + var args, event, func, l, len1, ref1, ref2, results; + event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; + ref2 = (ref1 = this.listeners[event]) != null ? ref1 : []; + results = []; + for (l = 0, len1 = ref2.length; l < len1; l++) { + func = ref2[l]; + results.push(func.apply(null, args)); + } + return results; + }; + + p.generatePtsCircle = function(count, centerPt) { + var angle, angleStep, circumference, i, l, legLength, ref1, results; + circumference = this['circleFootSeparation'] * (2 + count); + legLength = circumference / twoPi; + angleStep = twoPi / count; + results = []; + for (i = l = 0, ref1 = count; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) { + angle = this['circleStartAngle'] + i * angleStep; + results.push(new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))); + } + return results; + }; + + p.generatePtsSpiral = function(count, centerPt) { + var angle, i, l, legLength, pt, ref1, results; + legLength = this['spiralLengthStart']; + angle = 0; + results = []; + for (i = l = 0, ref1 = count; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) { + angle += this['spiralFootSeparation'] / legLength + i * 0.0005; + pt = new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle)); + legLength += twoPi * this['spiralLengthFactor'] / angle; + results.push(pt); + } + return results; + }; + + p.spiderListener = function(marker, event) { + var $this, clear, l, len1, m, mPt, markerPt, markerSpiderfied, nDist, nearbyMarkerData, nonNearbyMarkers, pxSq, ref1; + markerSpiderfied = marker['_omsData'] != null; + if (!(markerSpiderfied && this['keepSpiderfied'])) { + if (this['event'] === 'mouseover') { + $this = this; + clear = function() { + return $this['unspiderfy'](); + }; + window.clearTimeout(p.timeout); + p.timeout = setTimeout(clear, 3000); + } else { + this['unspiderfy'](); + } + } + if (markerSpiderfied || this.map.getStreetView().getVisible() || this.map.getMapTypeId() === 'GoogleEarthAPI') { + return this.trigger('click', marker, event); + } else { + nearbyMarkerData = []; + nonNearbyMarkers = []; + nDist = this['nearbyDistance']; + pxSq = nDist * nDist; + markerPt = this.llToPt(marker.position); + ref1 = this.markers; + for (l = 0, len1 = ref1.length; l < len1; l++) { + m = ref1[l]; + if (!((m.map != null) && m.getVisible())) { + continue; + } + mPt = this.llToPt(m.position); + if (this.ptDistanceSq(mPt, markerPt) < pxSq) { + nearbyMarkerData.push({ + marker: m, + markerPt: mPt + }); + } else { + nonNearbyMarkers.push(m); + } + } + if (nearbyMarkerData.length === 1) { + return this.trigger('click', marker, event); + } else { + return this.spiderfy(nearbyMarkerData, nonNearbyMarkers); + } + } + }; + + p['markersNearMarker'] = function(marker, firstOnly) { + var l, len1, m, mPt, markerPt, markers, nDist, pxSq, ref1, ref2, ref3; + if (firstOnly == null) { + firstOnly = false; + } + if (this.projHelper.getProjection() == null) { + throw "Must wait for 'idle' event on map before calling markersNearMarker"; + } + nDist = this['nearbyDistance']; + pxSq = nDist * nDist; + markerPt = this.llToPt(marker.position); + markers = []; + ref1 = this.markers; + for (l = 0, len1 = ref1.length; l < len1; l++) { + m = ref1[l]; + if (m === marker || (m.map == null) || !m.getVisible()) { + continue; + } + mPt = this.llToPt((ref2 = (ref3 = m['_omsData']) != null ? ref3.usualPosition : void 0) != null ? ref2 : m.position); + if (this.ptDistanceSq(mPt, markerPt) < pxSq) { + markers.push(m); + if (firstOnly) { + break; + } + } + } + return markers; + }; + + p['markersNearAnyOtherMarker'] = function() { + var i, i1, i2, l, len1, len2, len3, m, m1, m1Data, m2, m2Data, mData, n, nDist, pxSq, q, ref1, ref2, ref3, results; + if (this.projHelper.getProjection() == null) { + throw "Must wait for 'idle' event on map before calling markersNearAnyOtherMarker"; + } + nDist = this['nearbyDistance']; + pxSq = nDist * nDist; + mData = (function() { + var l, len1, ref1, ref2, ref3, results; + ref1 = this.markers; + results = []; + for (l = 0, len1 = ref1.length; l < len1; l++) { + m = ref1[l]; + results.push({ + pt: this.llToPt((ref2 = (ref3 = m['_omsData']) != null ? ref3.usualPosition : void 0) != null ? ref2 : m.position), + willSpiderfy: false + }); + } + return results; + }).call(this); + ref1 = this.markers; + for (i1 = l = 0, len1 = ref1.length; l < len1; i1 = ++l) { + m1 = ref1[i1]; + if (!((m1.map != null) && m1.getVisible())) { + continue; + } + m1Data = mData[i1]; + if (m1Data.willSpiderfy) { + continue; + } + ref2 = this.markers; + for (i2 = n = 0, len2 = ref2.length; n < len2; i2 = ++n) { + m2 = ref2[i2]; + if (i2 === i1) { + continue; + } + if (!((m2.map != null) && m2.getVisible())) { + continue; + } + m2Data = mData[i2]; + if (i2 < i1 && !m2Data.willSpiderfy) { + continue; + } + if (this.ptDistanceSq(m1Data.pt, m2Data.pt) < pxSq) { + m1Data.willSpiderfy = m2Data.willSpiderfy = true; + break; + } + } + } + ref3 = this.markers; + results = []; + for (i = q = 0, len3 = ref3.length; q < len3; i = ++q) { + m = ref3[i]; + if (mData[i].willSpiderfy) { + results.push(m); + } + } + return results; + }; + + p.makeHighlightListenerFuncs = function(marker) { + return { + highlight: (function(_this) { + return function() { + return marker['_omsData'].leg.setOptions({ + strokeColor: _this['legColors']['highlighted'][_this.map.mapTypeId], + zIndex: _this['highlightedLegZIndex'] + }); + }; + })(this), + unhighlight: (function(_this) { + return function() { + return marker['_omsData'].leg.setOptions({ + strokeColor: _this['legColors']['usual'][_this.map.mapTypeId], + zIndex: _this['usualLegZIndex'] + }); + }; + })(this) + }; + }; + + p.spiderfy = function(markerData, nonNearbyMarkers) { + var bodyPt, footLl, footPt, footPts, highlightListenerFuncs, leg, marker, md, nearestMarkerDatum, numFeet, spiderfiedMarkers; + if (this['minZoomLevel'] && this.map.getZoom() < this['minZoomLevel']) { + return false; + } + this.spiderfying = true; + numFeet = markerData.length; + bodyPt = this.ptAverage((function() { + var l, len1, results; + results = []; + for (l = 0, len1 = markerData.length; l < len1; l++) { + md = markerData[l]; + results.push(md.markerPt); + } + return results; + })()); + footPts = numFeet >= this['circleSpiralSwitchover'] ? this.generatePtsSpiral(numFeet, bodyPt).reverse() : this.generatePtsCircle(numFeet, bodyPt); + spiderfiedMarkers = (function() { + var l, len1, results; + results = []; + for (l = 0, len1 = footPts.length; l < len1; l++) { + footPt = footPts[l]; + footLl = this.ptToLl(footPt); + nearestMarkerDatum = this.minExtract(markerData, (function(_this) { + return function(md) { + return _this.ptDistanceSq(md.markerPt, footPt); + }; + })(this)); + marker = nearestMarkerDatum.marker; + leg = new gm.Polyline({ + map: this.map, + path: [marker.position, footLl], + strokeColor: this['legColors']['usual'][this.map.mapTypeId], + strokeWeight: this['legWeight'], + zIndex: this['usualLegZIndex'] + }); + marker['_omsData'] = { + usualPosition: marker.position, + leg: leg + }; + if (this['legColors']['highlighted'][this.map.mapTypeId] !== this['legColors']['usual'][this.map.mapTypeId]) { + highlightListenerFuncs = this.makeHighlightListenerFuncs(marker); + marker['_omsData'].hightlightListeners = { + highlight: ge.addListener(marker, 'mouseover', highlightListenerFuncs.highlight), + unhighlight: ge.addListener(marker, 'mouseout', highlightListenerFuncs.unhighlight) + }; + } + marker.setPosition(footLl); + marker.setZIndex(Math.round(this['spiderfiedZIndex'] + footPt.y)); + results.push(marker); + } + return results; + }).call(this); + delete this.spiderfying; + this.spiderfied = true; + return this.trigger('spiderfy', spiderfiedMarkers, nonNearbyMarkers); + }; + + p['unspiderfy'] = function(markerNotToMove) { + var l, len1, listeners, marker, nonNearbyMarkers, ref1, unspiderfiedMarkers; + if (markerNotToMove == null) { + markerNotToMove = null; + } + if (this.spiderfied == null) { + return this; + } + this.unspiderfying = true; + unspiderfiedMarkers = []; + nonNearbyMarkers = []; + ref1 = this.markers; + for (l = 0, len1 = ref1.length; l < len1; l++) { + marker = ref1[l]; + if (marker['_omsData'] != null) { + marker['_omsData'].leg.setMap(null); + if (marker !== markerNotToMove) { + marker.setPosition(marker['_omsData'].usualPosition); + } + marker.setZIndex(null); + listeners = marker['_omsData'].hightlightListeners; + if (listeners != null) { + ge.removeListener(listeners.highlight); + ge.removeListener(listeners.unhighlight); + } + delete marker['_omsData']; + unspiderfiedMarkers.push(marker); + } else { + nonNearbyMarkers.push(marker); + } + } + delete this.unspiderfying; + delete this.spiderfied; + this.trigger('unspiderfy', unspiderfiedMarkers, nonNearbyMarkers); + return this; + }; + + p.ptDistanceSq = function(pt1, pt2) { + var dx, dy; + dx = pt1.x - pt2.x; + dy = pt1.y - pt2.y; + return dx * dx + dy * dy; + }; + + p.ptAverage = function(pts) { + var l, len1, numPts, pt, sumX, sumY; + sumX = sumY = 0; + for (l = 0, len1 = pts.length; l < len1; l++) { + pt = pts[l]; + sumX += pt.x; + sumY += pt.y; + } + numPts = pts.length; + return new gm.Point(sumX / numPts, sumY / numPts); + }; + + p.llToPt = function(ll) { + return this.projHelper.getProjection().fromLatLngToDivPixel(ll); + }; + + p.ptToLl = function(pt) { + return this.projHelper.getProjection().fromDivPixelToLatLng(pt); + }; + + p.minExtract = function(set, func) { + var bestIndex, bestVal, index, item, l, len1, val; + for (index = l = 0, len1 = set.length; l < len1; index = ++l) { + item = set[index]; + val = func(item); + if ((typeof bestIndex === "undefined" || bestIndex === null) || val < bestVal) { + bestVal = val; + bestIndex = index; + } + } + return set.splice(bestIndex, 1)[0]; + }; + + p.arrIndexOf = function(arr, obj) { + var i, l, len1, o; + if (arr.indexOf != null) { + return arr.indexOf(obj); + } + for (i = l = 0, len1 = arr.length; l < len1; i = ++l) { + o = arr[i]; + if (o === obj) { + return i; + } + } + return -1; + }; + + return _Class; + +})(); + + }.apply(self); + + GoogleMapApi.then(function(){ + self.OverlappingMarkerSpiderfier.initializeGoogleMaps(window.google); + }); + return this.OverlappingMarkerSpiderfier; +}]); +;/** + * Performance overrides on MarkerClusterer custom to Angular Google Maps + * + * Created by Petr Bruna ccg1415 and Nick McCready on 7/13/14. + */ +angular.module('uiGmapgoogle-maps.extensions') +.service('uiGmapExtendMarkerClusterer',['uiGmapLodash', 'uiGmapPropMap', function (uiGmapLodash, PropMap) { + return { + init: _.once(function () { + (function () { + var __hasProp = {}.hasOwnProperty, + __extends = function (child, parent) { + for (var key in parent) { + if (__hasProp.call(parent, key)) child[key] = parent[key]; + } + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }; + + window.NgMapCluster = (function (_super) { + __extends(NgMapCluster, _super); + + function NgMapCluster(opts) { + NgMapCluster.__super__.constructor.call(this, opts); + this.markers_ = new PropMap(); + } + + /** + * Adds a marker to the cluster. + * + * @param {google.maps.Marker} marker The marker to be added. + * @return {boolean} True if the marker was added. + * @ignore + */ + NgMapCluster.prototype.addMarker = function (marker) { + var i; + var mCount; + var mz; + + if (this.isMarkerAlreadyAdded_(marker)) { + var oldMarker = this.markers_.get(marker.key); + if (oldMarker.getPosition().lat() == marker.getPosition().lat() && oldMarker.getPosition().lon() == marker.getPosition().lon()) //if nothing has changed + return false; + } + + if (!this.center_) { + this.center_ = marker.getPosition(); + this.calculateBounds_(); + } else { + if (this.averageCenter_) { + var l = this.markers_.length + 1; + var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l; + var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l; + this.center_ = new google.maps.LatLng(lat, lng); + this.calculateBounds_(); + } + } + marker.isAdded = true; + this.markers_.push(marker); + + mCount = this.markers_.length; + mz = this.markerClusterer_.getMaxZoom(); + if (mz !== null && this.map_.getZoom() > mz) { + // Zoomed in past max zoom, so show the marker. + if (marker.getMap() !== this.map_) { + marker.setMap(this.map_); + } + } else if (mCount < this.minClusterSize_) { + // Min cluster size not reached so show the marker. + if (marker.getMap() !== this.map_) { + marker.setMap(this.map_); + } + } else if (mCount === this.minClusterSize_) { + // Hide the markers that were showing. + this.markers_.each(function (m) { + m.setMap(null); + }); + } else { + marker.setMap(null); + } + + //this.updateIcon_(); + return true; + }; + + /** + * Determines if a marker has already been added to the cluster. + * + * @param {google.maps.Marker} marker The marker to check. + * @return {boolean} True if the marker has already been added. + */ + NgMapCluster.prototype.isMarkerAlreadyAdded_ = function (marker) { + return uiGmapLodash.isNullOrUndefined(this.markers_.get(marker.key)); + }; + + + /** + * Returns the bounds of the cluster. + * + * @return {google.maps.LatLngBounds} the cluster bounds. + * @ignore + */ + NgMapCluster.prototype.getBounds = function () { + var i; + var bounds = new google.maps.LatLngBounds(this.center_, this.center_); + this.getMarkers().each(function(m){ + bounds.extend(m.getPosition()); + }); + return bounds; + }; + + + /** + * Removes the cluster from the map. + * + * @ignore + */ + NgMapCluster.prototype.remove = function () { + this.clusterIcon_.setMap(null); + this.markers_ = new PropMap(); + delete this.markers_; + }; + + + return NgMapCluster; + + })(Cluster); + + + window.NgMapMarkerClusterer = (function (_super) { + __extends(NgMapMarkerClusterer, _super); + + function NgMapMarkerClusterer(map, opt_markers, opt_options) { + NgMapMarkerClusterer.__super__.constructor.call(this, map, opt_markers, opt_options); + this.markers_ = new PropMap(); + } + + /** + * Removes all clusters and markers from the map and also removes all markers + * managed by the clusterer. + */ + NgMapMarkerClusterer.prototype.clearMarkers = function () { + this.resetViewport_(true); + this.markers_ = new PropMap(); + }; + /** + * Removes a marker and returns true if removed, false if not. + * + * @param {google.maps.Marker} marker The marker to remove + * @return {boolean} Whether the marker was removed or not + */ + NgMapMarkerClusterer.prototype.removeMarker_ = function (marker) { + if (!this.markers_.get(marker.key)) { + return false; + } + marker.setMap(null); + this.markers_.remove(marker.key); // Remove the marker from the list of managed markers + return true; + }; + + /** + * Creates the clusters. This is done in batches to avoid timeout errors + * in some browsers when there is a huge number of markers. + * + * @param {number} iFirst The index of the first marker in the batch of + * markers to be added to clusters. + */ + NgMapMarkerClusterer.prototype.createClusters_ = function (iFirst) { + var i, marker; + var mapBounds; + var cMarkerClusterer = this; + if (!this.ready_) { + return; + } + + // Cancel previous batch processing if we're working on the first batch: + if (iFirst === 0) { + /** + * This event is fired when the MarkerClusterer begins + * clustering markers. + * @name MarkerClusterer#clusteringbegin + * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered. + * @event + */ + google.maps.event.trigger(this, 'clusteringbegin', this); + + if (typeof this.timerRefStatic !== 'undefined') { + clearTimeout(this.timerRefStatic); + delete this.timerRefStatic; + } + } + + // Get our current map view bounds. + // Create a new bounds object so we don't affect the map. + // + // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug: + if (this.getMap().getZoom() > 3) { + mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(), + this.getMap().getBounds().getNorthEast()); + } else { + mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625)); + } + var bounds = this.getExtendedBounds(mapBounds); + + var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length); + + var _ms = this.markers_.values(); + for (i = iFirst; i < iLast; i++) { + marker = _ms[i]; + if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) { + if (!this.ignoreHidden_ || (this.ignoreHidden_ && marker.getVisible())) { + this.addToClosestCluster_(marker); + } + } + } + + if (iLast < this.markers_.length) { + this.timerRefStatic = setTimeout(function () { + cMarkerClusterer.createClusters_(iLast); + }, 0); + } else { + // custom addition by ui-gmap + // update icon for all clusters + for (i = 0; i < this.clusters_.length; i++) { + this.clusters_[i].updateIcon_(); + } + + delete this.timerRefStatic; + + /** + * This event is fired when the MarkerClusterer stops + * clustering markers. + * @name MarkerClusterer#clusteringend + * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered. + * @event + */ + google.maps.event.trigger(this, 'clusteringend', this); + } + }; + + /** + * Adds a marker to a cluster, or creates a new cluster. + * + * @param {google.maps.Marker} marker The marker to add. + */ + NgMapMarkerClusterer.prototype.addToClosestCluster_ = function (marker) { + var i, d, cluster, center; + var distance = 40000; // Some large number + var clusterToAddTo = null; + for (i = 0; i < this.clusters_.length; i++) { + cluster = this.clusters_[i]; + center = cluster.getCenter(); + if (center) { + d = this.distanceBetweenPoints_(center, marker.getPosition()); + if (d < distance) { + distance = d; + clusterToAddTo = cluster; + } + } + } + + if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) { + clusterToAddTo.addMarker(marker); + } else { + cluster = new NgMapCluster(this); + cluster.addMarker(marker); + this.clusters_.push(cluster); + } + }; + + /** + * Redraws all the clusters. + */ + NgMapMarkerClusterer.prototype.redraw_ = function () { + this.createClusters_(0); + }; + + + /** + * Removes all clusters from the map. The markers are also removed from the map + * if opt_hide is set to true. + * + * @param {boolean} [opt_hide] Set to true to also remove the markers + * from the map. + */ + NgMapMarkerClusterer.prototype.resetViewport_ = function (opt_hide) { + var i, marker; + // Remove all the clusters + for (i = 0; i < this.clusters_.length; i++) { + this.clusters_[i].remove(); + } + this.clusters_ = []; + + // Reset the markers to not be added and to be removed from the map. + this.markers_.each(function (marker) { + marker.isAdded = false; + if (opt_hide) { + marker.setMap(null); + } + }); + }; + + /** + * Extends an object's prototype by another's. + * + * @param {Object} obj1 The object to be extended. + * @param {Object} obj2 The object to extend with. + * @return {Object} The new extended object. + * @ignore + */ + NgMapMarkerClusterer.prototype.extend = function (obj1, obj2) { + return (function (object) { + var property; + for (property in object.prototype) { + if (property !== 'constructor') + this.prototype[property] = object.prototype[property]; + } + return this; + }).apply(obj1, [obj2]); + }; + //////////////////////////////////////////////////////////////////////////////// + /* + Other overrides relevant to MarkerClusterPlus + */ + //////////////////////////////////////////////////////////////////////////////// + /** + * Positions and shows the icon. + */ + ClusterIcon.prototype.show = function () { + if (this.div_) { + var img = ""; + // NOTE: values must be specified in px units + var bp = this.backgroundPosition_.split(" "); + var spriteH = parseInt(bp[0].trim(), 10); + var spriteV = parseInt(bp[1].trim(), 10); + var pos = this.getPosFromLatLng_(this.center_); + this.div_.style.cssText = this.createCss(pos); + img = ""; + this.div_.innerHTML = img + "

" + this.sums_.text + "
"; + if (typeof this.sums_.title === "undefined" || this.sums_.title === "") { + this.div_.title = this.cluster_.getMarkerClusterer().getTitle(); + } else { + this.div_.title = this.sums_.title; + } + this.div_.style.display = ""; + } + this.visible_ = true; + }; + //END OTHER OVERRIDES + //////////////////////////////////////////////////////////////////////////////// + + return NgMapMarkerClusterer; + + })(MarkerClusterer); + }).call(this); + }) + }; +}]); +}( window, angular, _)); \ No newline at end of file diff --git a/dist/angular-google-maps.min.js b/dist/angular-google-maps.min.js new file mode 100644 index 000000000..80e73fada --- /dev/null +++ b/dist/angular-google-maps.min.js @@ -0,0 +1,13 @@ +/*! angular-google-maps 2.4.1 2017-01-05 + * AngularJS directives for Google Maps + * git: https://github.com/angular-ui/angular-google-maps.git + */ + +!function(a,b,c,d){"use strict";(function(){b.module("uiGmapgoogle-maps.providers",["nemLogging"]),b.module("uiGmapgoogle-maps.wrapped",[]),b.module("uiGmapgoogle-maps.extensions",["uiGmapgoogle-maps.wrapped","uiGmapgoogle-maps.providers"]),b.module("uiGmapgoogle-maps.directives.api.utils",["uiGmapgoogle-maps.extensions"]),b.module("uiGmapgoogle-maps.directives.api.managers",[]),b.module("uiGmapgoogle-maps.directives.api.options",["uiGmapgoogle-maps.directives.api.utils"]),b.module("uiGmapgoogle-maps.directives.api.options.builders",[]),b.module("uiGmapgoogle-maps.directives.api.models.child",["uiGmapgoogle-maps.directives.api.utils","uiGmapgoogle-maps.directives.api.options","uiGmapgoogle-maps.directives.api.options.builders"]),b.module("uiGmapgoogle-maps.directives.api.models.parent",["uiGmapgoogle-maps.directives.api.managers","uiGmapgoogle-maps.directives.api.models.child","uiGmapgoogle-maps.providers"]),b.module("uiGmapgoogle-maps.directives.api",["uiGmapgoogle-maps.directives.api.models.parent"]),b.module("uiGmapgoogle-maps",["uiGmapgoogle-maps.directives.api","uiGmapgoogle-maps.providers"])}).call(this),function(){b.module("uiGmapgoogle-maps.providers").factory("uiGmapMapScriptLoader",["$q","uiGmapuuid",function(d,e){var f,g,h,i,j;return i=void 0,j=void 0,f=function(a){return a.china?"http://maps.google.cn/maps/api/js?":"auto"===a.transport?"//maps.googleapis.com/maps/api/js?":a.transport+"://maps.googleapis.com/maps/api/js?"},g=function(a){var b,d,g,h;return b=["transport","isGoogleMapsForWork","china","preventLoad"],a.isGoogleMapsForWork&&b.push("key"),d=c.map(c.omit(a,b),function(a,b){return b+"="+a}),i&&(h=document.getElementById(i),h.parentNode.removeChild(h)),d=d.join("&"),g=document.createElement("script"),g.id=i="ui_gmap_map_load_"+e.generate(),g.type="text/javascript",g.src=f(a)+d,document.head.appendChild(g)},h=function(){return b.isDefined(a.google)&&b.isDefined(a.google.maps)},{load:function(b){var c,e;return c=d.defer(),h()?(c.resolve(a.google.maps),c.promise):(e=b.callback="onGoogleMapsReady"+Math.round(1e3*Math.random()),a[e]=function(){a[e]=null,c.resolve(a.google.maps)},a.navigator.connection&&a.Connection&&a.navigator.connection.type===a.Connection.NONE&&!b.preventLoad?document.addEventListener("online",function(){if(!h())return g(b)}):b.preventLoad||g(b),j=b,j.randomizedFunctionName=e,c.promise)},manualLoad:function(){var b;return b=j,h()?a[b.randomizedFunctionName]?a[b.randomizedFunctionName]():void 0:g(b)}}}]).provider("uiGmapGoogleMapApi",function(){return this.options={transport:"https",isGoogleMapsForWork:!1,china:!1,v:"3",libraries:"",language:"en",preventLoad:!1},this.configure=function(a){b.extend(this.options,a)},this.$get=["uiGmapMapScriptLoader",function(a){return function(b){return b.load(a.options)}}(this)],this}).service("uiGmapGoogleMapApiManualLoader",["uiGmapMapScriptLoader",function(a){return{load:function(){a.manualLoad()}}}])}.call(this),function(){var d=function(a,b){return function(){return a.apply(b,arguments)}},e=function(a,b){function c(){this.constructor=a}for(var d in b)f.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},f={}.hasOwnProperty;b.module("uiGmapgoogle-maps.extensions").service("uiGmapExtendGWin",function(){return{init:c.once(function(){var b;if(google||("undefined"!=typeof google&&null!==google?google.maps:void 0)||null!=google.maps.InfoWindow)return google.maps.InfoWindow.prototype._open=google.maps.InfoWindow.prototype.open,google.maps.InfoWindow.prototype._close=google.maps.InfoWindow.prototype.close,google.maps.InfoWindow.prototype._isOpen=!1,google.maps.InfoWindow.prototype.open=function(a,b,c){null==c&&(this._isOpen=!0,this._open(a,b,!0))},google.maps.InfoWindow.prototype.close=function(a){null==a&&(this._isOpen=!1,this._close(!0))},google.maps.InfoWindow.prototype.isOpen=function(a){return null==a&&(a=void 0),null==a?this._isOpen:this._isOpen=a},a.InfoBox&&(a.InfoBox.prototype._open=a.InfoBox.prototype.open,a.InfoBox.prototype._close=a.InfoBox.prototype.close,a.InfoBox.prototype._isOpen=!1,a.InfoBox.prototype.open=function(a,b){this._isOpen=!0,this._open(a,b)},a.InfoBox.prototype.close=function(){this._isOpen=!1,this._close()},a.InfoBox.prototype.isOpen=function(a){return null==a&&(a=void 0),null==a?this._isOpen:this._isOpen=a},b=function(b){function f(b){this.getOrigCloseBoxImg_=d(this.getOrigCloseBoxImg_,this),this.getCloseBoxDiv_=d(this.getCloseBoxDiv_,this);var e;e=new a.InfoBox(b),c.extend(this,e),null!=b.closeBoxDiv&&(this.closeBoxDiv_=b.closeBoxDiv)}return e(f,b),f.prototype.getCloseBoxDiv_=function(){return this.closeBoxDiv_},f.prototype.getCloseBoxImg_=function(){var a,b;return a=this.getCloseBoxDiv_(),b=this.getOrigCloseBoxImg_(),a||b},f.prototype.getOrigCloseBoxImg_=function(){var a;return a="",""!==this.closeBoxURL_&&(a="0&&(f=e[0])):f=c,f},defaultDelay:50,isTrue:function(a){return f(a,!0,["true","TRUE",1,"y","Y","yes","YES"])},isFalse:e,isFalsy:function(a){return f(a,!1,[void 0,null])||e(a)},getCoords:g,validateCoords:j,equalCoords:function(a,b){return h(a)===h(b)&&i(a)===i(b)},validatePath:function(a){var d,e,f,g;if(e=0,b.isUndefined(a.type)){if(!Array.isArray(a)||a.length<2)return!1;for(;ethis.max)return this.max=a[0].length,this.index=b},g),f=a.coordinates[g.index],d=f[0],d.length<4)return!1}else{if("LineString"!==a.type)return!1;if(a.coordinates.length<2)return!1;d=a.coordinates}for(;ethis.max)return this.max=a[0].length,this.index=b},h),d=a.coordinates[h.index][0]):"LineString"===a.type&&(d=a.coordinates);e0&&(d-=1),f.length&&(f.length-=1)}}}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapLinked",["uiGmapBaseObject",function(b){var c;return c=function(b){function c(a,b,c,d){this.scope=a,this.element=b,this.attrs=c,this.ctrls=d}return a(c,b),c}(b)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapLogger",["nemSimpleLogger",function(a){return a.spawn()}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapModelKey",["uiGmapBaseObject","uiGmapGmapUtil",function(e,f){return function(e){function g(b,c){this.scope=b,this.interface=null!=c?c:{scopeKeys:[]},this.modelsLength=a(this.modelsLength,this),this.updateChild=a(this.updateChild,this),this.destroy=a(this.destroy,this),this.setChildScope=a(this.setChildScope,this),this.getChanges=a(this.getChanges,this),this.getProp=a(this.getProp,this),this.setIdKey=a(this.setIdKey,this),this.modelKeyComparison=a(this.modelKeyComparison,this),g.__super__.constructor.call(this),this.defaultIdKey="id",this.idKey=void 0}return d(g,e),g.prototype.evalModelHandle=function(a,b){if(null!=a&&null!=b)return"self"===b?a:(c.isFunction(b)&&(b=b()),f.getPath(a,b))},g.prototype.modelKeyComparison=function(a,b){var d,e,g,h,i,j;if(g=this.interface.scopeKeys.indexOf("coords")>=0,(g&&null!=this.scope.coords||!g)&&(i=this.scope),null==i)throw"No scope set!";return g&&(d=this.scopeOrModelVal("coords",i,a),e=this.scopeOrModelVal("coords",i,b),h=f.equalCoords(d,e),!h)?h:(j=c.without(this.interface.scopeKeys,"coords"),h=c.every(j,function(d){return function(e){var f,g;return f=d.scopeOrModelVal(i[e],i,a),g=d.scopeOrModelVal(i[e],i,b),i.deepComparison?c.isEqual(f,g):f===g}}(this)))},g.prototype.setIdKey=function(a){return this.idKey=null!=a.idKey?a.idKey:this.defaultIdKey},g.prototype.setVal=function(a,b,c){return this.modelOrKey(a,b=c),a},g.prototype.modelOrKey=function(a,b){if(null!=b)return"self"!==b?f.getPath(a,b):a},g.prototype.getProp=function(a,b,c){return this.scopeOrModelVal(a,b,c)},g.prototype.getChanges=function(a,b,d){var e,f,g;d&&(b=c.pick(b,d),a=c.pick(a,d)),f={},g={},e={};for(g in a)b&&b[g]===a[g]||(c.isArray(a[g])?f[g]=a[g]:c.isObject(a[g])?(e=this.getChanges(a[g],b?b[g]:null),c.isEmpty(e)||(f[g]=e)):f[g]=a[g]);return f},g.prototype.scopeOrModelVal=function(a,b,d,e){var f,g,h,i;return null==e&&(e=!1),f=function(a,b,c){return null==c&&(c=!1),c?{isScope:a,value:b}:b},i=c.get(b,a),c.isFunction(i)?f(!0,i(d),e):c.isObject(i)?f(!0,i,e):c.isString(i)?(g=i,h=g?"self"===g?d:c.get(d,g):c.get(d,a),c.isFunction(h)?f(!1,h(),e):f(!1,h,e)):f(!0,i,e)},g.prototype.setChildScope=function(a,b,c){var d,e,f,g;for(e in a)f=a[e],d=this.scopeOrModelVal(f,b,c,!0),null!=(null!=d?d.value:void 0)&&(g=d.value,g!==b[f]&&(b[f]=g));return b.model=c},g.prototype.onDestroy=function(a){},g.prototype.destroy=function(a){var b;return null==a&&(a=!1),null==this.scope||(null!=(b=this.scope)?b.$$destroyed:void 0)||!this.needToManualDestroy&&!a?this.clean():this.scope.$destroy()},g.prototype.updateChild=function(a,b){return null==b[this.idKey]?void this.$log.error("Model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."):a.updateModel(b)},g.prototype.modelsLength=function(a){var c,d;return null==a&&(a=void 0),c=0,d=a?a:this.scope.models,null==d?c:c=b.isArray(d)||null!=d.length?d.length:Object.keys(d).length},g}(e)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapModelsWatcher",["uiGmapLogger","uiGmap_async","$q","uiGmapPromise",function(a,b,c,d){return{didQueueInitPromise:function(a,c){return 0===c.models.length&&(b.promiseLock(a,d.promiseTypes.init,null,null,function(){return d.resolve()}),!0)},figureOutState:function(b,c,d,e,f){var g,h,i,j,k;return g=[],i={},j=[],k=[],c.models.forEach(function(f){var h;return null==f[b]?a.error(" id missing for model #{m.toString()},\ncan not use do comparison/insertion"):(i[f[b]]={},null==d.get(f[b])?g.push(f):(h=d.get(f[b]),e(f,h.clonedModel,c)?void 0:k.push({model:f,child:h})))}),h=d.values(),h.forEach(function(c){var d;return null==c?void a.error("child undefined in ModelsWatcher."):null==c.model?void a.error("child.model undefined in ModelsWatcher."):(d=c.model[b],null==i[d]?j.push(c):void 0)}),{adds:g,removals:j,updates:k}}}}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapPromise",["$q","$timeout","uiGmapLogger",function(a,b,d){var e,f,g,h,i,j,k,l,m,n,o;return m={create:"create",update:"update",delete:"delete",init:"init"},l={IN_PROGRESS:0,RESOLVED:1,REJECTED:2},o=function(){var a;return a={},a[""+l.IN_PROGRESS]="in-progress",a[""+l.RESOLVED]="resolved",a[""+l.REJECTED]="rejected",a}(),h=function(a){return a.$$state?a.$$state.status===l.IN_PROGRESS:!a.hasOwnProperty("$$v")||void 0},i=function(a){return a.$$state?a.$$state.status===l.RESOLVED:!!a.hasOwnProperty("$$v")||void 0},k=function(a){return o[a]||"done w error"},e=function(b){var c,d,e;return c=a.defer(),d=a.all([b,c.promise]),e=a.defer(),b.then(c.resolve,function(){},function(a){return c.notify(a),e.notify(a)}),d.then(function(a){return e.resolve(a[0]||a[1])},function(a){return e.reject(a)}),e.promise.cancel=function(a){return null==a&&(a="canceled"),c.reject(a)},e.promise.notify=function(a){if(null==a&&(a="cancel safe"),e.notify(a),b.hasOwnProperty("notify"))return b.notify(a)},null!=b.promiseType&&(e.promise.promiseType=b.promiseType),e.promise},f=function(a,b){return{promise:a,promiseType:b}},g=function(){return a.defer()},n=function(){var b;return b=a.defer(),b.resolve.apply(void 0,arguments),b.promise},j=function(e){var f;return c.isFunction(e)?(f=a.defer(),b(function(){var a;return a=e(),f.resolve(a)}),f.promise):void d.error("uiGmapPromise.promise() only accepts functions")},{defer:g,promise:j,resolve:n,promiseTypes:m,isInProgress:h,isResolved:i,promiseStatus:k,ExposedPromise:e,SniffedPromise:f}}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapPropMap",function(){var b;return b=function(){function b(){this.removeAll=a(this.removeAll,this),this.slice=a(this.slice,this),this.push=a(this.push,this),this.keys=a(this.keys,this),this.values=a(this.values,this),this.remove=a(this.remove,this),this.put=a(this.put,this),this.stateChanged=a(this.stateChanged,this),this.get=a(this.get,this),this.length=0,this.dict={},this.didValsStateChange=!1,this.didKeysStateChange=!1,this.allVals=[],this.allKeys=[]}return b.prototype.get=function(a){return this.dict[a]},b.prototype.stateChanged=function(){return this.didValsStateChange=!0,this.didKeysStateChange=!0},b.prototype.put=function(a,b){return null==this.get(a)&&this.length++,this.stateChanged(),this.dict[a]=b},b.prototype.remove=function(a,b){var c;if(null==b&&(b=!1),!b||this.get(a))return c=this.dict[a],delete this.dict[a],this.length--,this.stateChanged(),c},b.prototype.valuesOrKeys=function(a){var b,d;return null==a&&(a="Keys"),this["did"+a+"StateChange"]?(d=[],b=[],c.each(this.dict,function(a,c){return d.push(a),b.push(c)}),this.didKeysStateChange=!1,this.didValsStateChange=!1,this.allVals=d,this.allKeys=b,this["all"+a]):this["all"+a]},b.prototype.values=function(){return this.valuesOrKeys("Vals")},b.prototype.keys=function(){return this.valuesOrKeys()},b.prototype.push=function(a,b){return null==b&&(b="key"),this.put(a[b],a)},b.prototype.slice=function(){return this.keys().map(function(a){return function(b){return a.remove(b)}}(this))},b.prototype.removeAll=function(){return this.slice()},b.prototype.each=function(a){return c.each(this.dict,function(b,c){return a(b)})},b.prototype.map=function(a){return c.map(this.dict,function(b,c){return a(b)})},b}()})}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapPropertyAction",["uiGmapLogger",function(a){var b;return b=function(a){return this.setIfChange=function(b){return function(d,e){if(!c.isEqual(e,d))return a(b,d)}},this.sic=this.setIfChange,this}}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps.directives.api.managers").factory("uiGmapClustererMarkerManager",["uiGmapLogger","uiGmapFitHelper","uiGmapPropMap","uiGmapEventsHelper",function(c,d,e,f){var g;return g=function(){function g(b,d,f,h){null==d&&(d={}),this.opt_options=null!=f?f:{},this.opt_events=h,this.getGMarkers=a(this.getGMarkers,this),this.fit=a(this.fit,this),this.destroy=a(this.destroy,this),this.attachEvents=a(this.attachEvents,this),this.clear=a(this.clear,this),this.draw=a(this.draw,this),this.removeMany=a(this.removeMany,this),this.remove=a(this.remove,this),this.addMany=a(this.addMany,this),this.update=a(this.update,this),this.add=a(this.add,this),this.type=g.type,this.clusterer=new NgMapMarkerClusterer(b,d,this.opt_options),this.propMapGMarkers=new e,this.attachEvents(this.opt_events,"opt_events"),this.clusterer.setIgnoreHidden(!0),this.noDrawOnSingleAddRemoves=!0,c.info(this)}return g.type="ClustererMarkerManager",g.prototype.checkKey=function(a){var b;if(null==a.key)return b="gMarker.key undefined and it is REQUIRED!!",c.error(b)},g.prototype.add=function(a){return this.checkKey(a),this.clusterer.addMarker(a,this.noDrawOnSingleAddRemoves),this.propMapGMarkers.put(a.key,a),this.checkSync()},g.prototype.update=function(a){return this.remove(a),this.add(a)},g.prototype.addMany=function(a){return a.forEach(function(a){return function(b){return a.add(b)}}(this))},g.prototype.remove=function(a){var b;return this.checkKey(a),b=this.propMapGMarkers.get(a.key),b&&(this.clusterer.removeMarker(a,this.noDrawOnSingleAddRemoves),this.propMapGMarkers.remove(a.key)),this.checkSync()},g.prototype.removeMany=function(a){return a.forEach(function(a){return function(b){return a.remove(b)}}(this))},g.prototype.draw=function(){return this.clusterer.repaint()},g.prototype.clear=function(){return this.removeMany(this.getGMarkers()),this.clusterer.repaint()},g.prototype.attachEvents=function(a,d){var e,f,g;if(this.listeners=[],b.isDefined(a)&&null!=a&&b.isObject(a)){g=[];for(f in a)e=a[f],a.hasOwnProperty(f)&&b.isFunction(a[f])?(c.info(d+": Attaching event: "+f+" to clusterer"),g.push(this.listeners.push(google.maps.event.addListener(this.clusterer,f,a[f])))):g.push(void 0);return g}},g.prototype.clearEvents=function(){return f.removeEvents(this.listeners),this.listeners=[]},g.prototype.destroy=function(){return this.clearEvents(),this.clear()},g.prototype.fit=function(){return d.fit(this.getGMarkers(),this.clusterer.getMap())},g.prototype.getGMarkers=function(){return this.clusterer.getMarkers().values()},g.prototype.checkSync=function(){},g}()}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.managers").service("uiGmapGoogleMapObjectManager",[function(){var a,c;return a=[],c=[],{createMapInstance:function(d,e){var f;return f=null,0===a.length?(f=new google.maps.Map(d,e),c.push(f)):(f=a.pop(),b.element(d).append(f.getDiv()),f.setOptions(e),c.push(f)),f},recycleMapInstance:function(b){var d;if(d=c.indexOf(b),d<0)throw new Error("Expected map instance to be a previously used instance");return c.splice(d,1),a.push(b)}}}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps.directives.api.managers").factory("uiGmapMarkerManager",["uiGmapLogger","uiGmapFitHelper","uiGmapPropMap",function(b,c,d){var e;return e=function(){function e(c,f,g){this.getGMarkers=a(this.getGMarkers,this),this.fit=a(this.fit,this),this.handleOptDraw=a(this.handleOptDraw,this),this.clear=a(this.clear,this),this.destroy=a(this.destroy,this),this.draw=a(this.draw,this),this.removeMany=a(this.removeMany,this),this.remove=a(this.remove,this),this.addMany=a(this.addMany,this),this.update=a(this.update,this),this.add=a(this.add,this),this.type=e.type,this.gMap=c,this.gMarkers=new d,this.$log=b,this.$log.info(this)}return e.type="MarkerManager",e.prototype.add=function(a,c){var d,e;if(null==c&&(c=!0),null==a.key)throw e="gMarker.key undefined and it is REQUIRED!!",b.error(e),e;if(d=this.gMarkers.get(a.key),!d)return this.handleOptDraw(a,c,!0),this.gMarkers.put(a.key,a)},e.prototype.update=function(a,b){return null==b&&(b=!0),this.remove(a,b),this.add(a,b)},e.prototype.addMany=function(a){return a.forEach(function(a){return function(b){return a.add(b)}}(this))},e.prototype.remove=function(a,b){if(null==b&&(b=!0),this.handleOptDraw(a,b,!1),this.gMarkers.get(a.key))return this.gMarkers.remove(a.key)},e.prototype.removeMany=function(a){return a.forEach(function(a){return function(b){return a.remove(b)}}(this))},e.prototype.draw=function(){var a;return a=[],this.gMarkers.each(function(b){return function(c){if(!c.isDrawn)return c.doAdd?(c.setMap(b.gMap),c.isDrawn=!0):a.push(c)}}(this)),a.forEach(function(a){return function(b){return b.isDrawn=!1,a.remove(b,!0)}}(this))},e.prototype.destroy=function(){return this.clear()},e.prototype.clear=function(){return this.gMarkers.each(function(a){ +return a.setMap(null)}),delete this.gMarkers,this.gMarkers=new d},e.prototype.handleOptDraw=function(a,b,c){return b===!0?(c?a.setMap(this.gMap):a.setMap(null),a.isDrawn=!0):(a.isDrawn=!1,a.doAdd=c)},e.prototype.fit=function(){return c.fit(this.getGMarkers(),this.gMap)},e.prototype.getGMarkers=function(){return this.gMarkers.values()},e}()}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps.directives.api.managers").factory("uiGmapSpiderfierMarkerManager",["uiGmapLogger","uiGmapFitHelper","uiGmapPropMap","uiGmapMarkerSpiderfier",function(d,e,f,g){var h;return h=function(){function h(b,c,e,i,j){null==c&&(c={}),this.opt_options=null!=e?e:{},this.opt_events=i,this.scope=j,this.isSpiderfied=a(this.isSpiderfied,this),this.getGMarkers=a(this.getGMarkers,this),this.fit=a(this.fit,this),this.destroy=a(this.destroy,this),this.attachEvents=a(this.attachEvents,this),this.clear=a(this.clear,this),this.removeMany=a(this.removeMany,this),this.remove=a(this.remove,this),this.addMany=a(this.addMany,this),this.update=a(this.update,this),this.add=a(this.add,this),this.type=h.type,this.markerSpiderfier=new g(b,this.opt_options),this.propMapGMarkers=new f,this.attachEvents(this.opt_events,"opt_events"),this.noDrawOnSingleAddRemoves=!0,d.info(this)}return h.type="SpiderfierMarkerManager",h.prototype.checkKey=function(a){var b;if(null==a.key)return b="gMarker.key undefined and it is REQUIRED!!",d.error(b)},h.prototype.add=function(a){return a.setMap(this.markerSpiderfier.map),this.checkKey(a),this.markerSpiderfier.addMarker(a,this.noDrawOnSingleAddRemoves),this.propMapGMarkers.put(a.key,a),this.checkSync()},h.prototype.update=function(a){return this.remove(a),this.add(a)},h.prototype.addMany=function(a){return a.forEach(function(a){return function(b){return a.add(b)}}(this))},h.prototype.remove=function(a){var b;return this.checkKey(a),b=this.propMapGMarkers.get(a.key),b&&(a.setMap(null),this.markerSpiderfier.removeMarker(a,this.noDrawOnSingleAddRemoves),this.propMapGMarkers.remove(a.key)),this.checkSync()},h.prototype.removeMany=function(a){return a.forEach(function(a){return function(b){return a.remove(b)}}(this))},h.prototype.draw=function(){},h.prototype.clear=function(){return this.removeMany(this.getGMarkers())},h.prototype.attachEvents=function(a,e){if(b.isDefined(a)&&null!=a&&b.isObject(a))return c.each(a,function(c){return function(f,g){if(a.hasOwnProperty(g)&&b.isFunction(a[g]))return d.info(e+": Attaching event: "+g+" to markerSpiderfier"),c.markerSpiderfier.addListener(g,function(){return"spiderfy"===g||"unspiderfy"===g?c.scope.$evalAsync(a[g].apply(a,arguments)):c.scope.$evalAsync(a[g].apply(a,[arguments[0],g,arguments[0].model,arguments]))})}}(this))},h.prototype.clearEvents=function(a,c){var e,f;if(b.isDefined(a)&&null!=a&&b.isObject(a))for(f in a)e=a[f],a.hasOwnProperty(f)&&b.isFunction(a[f])&&(d.info(c+": Clearing event: "+f+" to markerSpiderfier"),this.markerSpiderfier.clearListeners(f))},h.prototype.destroy=function(){return this.clearEvents(this.opt_events,"opt_events"),this.clear()},h.prototype.fit=function(){return e.fit(this.getGMarkers(),this.markerSpiderfier.map)},h.prototype.getGMarkers=function(){return this.markerSpiderfier.getMarkers()},h.prototype.isSpiderfied=function(){return c.find(this.getGMarkers(),function(a){return null!=(null!=a?a._omsData:void 0)})},h.prototype.checkSync=function(){},h}()}])}.call(this),function(){b.module("uiGmapgoogle-maps").factory("uiGmapadd-events",["$timeout",function(a){var c,d;return c=function(b,c,d){return google.maps.event.addListener(b,c,function(){return d.apply(this,arguments),a(function(){},!0)})},d=function(a,d,e){var f;return e?c(a,d,e):(f=[],b.forEach(d,function(b,d){return f.push(c(a,d,b))}),function(){return b.forEach(f,function(a){return google.maps.event.removeListener(a)}),f=null})}}])}.call(this),function(){b.module("uiGmapgoogle-maps").factory("uiGmaparray-sync",["uiGmapadd-events",function(a){return function(c,d,e,f){var g,h,i,j,k,l,m,n,o;return j=!1,n=d.$eval(e),d.static||(k={set_at:function(a){var b;if(!j&&(b=c.getAt(a)))return b.lng&&b.lat?(n[a].latitude=b.lat(),n[a].longitude=b.lng()):n[a]=b},insert_at:function(a){var b;if(!j&&(b=c.getAt(a)))return b.lng&&b.lat?n.splice(a,0,{latitude:b.lat(),longitude:b.lng()}):n.splice(a,0,b)},remove_at:function(a){if(!j)return n.splice(a,1)}},"Polygon"===n.type?g=n.coordinates[0]:"LineString"===n.type&&(g=n.coordinates),h={set_at:function(a){var b;if(!j&&(b=c.getAt(a),b&&b.lng&&b.lat))return g[a][1]=b.lat(),g[a][0]=b.lng()},insert_at:function(a){var b;if(!j&&(b=c.getAt(a),b&&b.lng&&b.lat))return g.splice(a,0,[b.lng(),b.lat()])},remove_at:function(a){if(!j)return g.splice(a,1)}},m=a(c,b.isUndefined(n.type)?k:h)),l=function(a){var b,d,e,g,h,i,k,l;if(j=!0,i=c,b=!1,a){for(d=0,k=i.getLength(),g=a.length,e=Math.min(k,g),h=void 0;d0&&(a.gObject=f(a.buildOpts(a.pathPoints,c))),a.gObject?(g(a.gObject.getPath(),a.scope,"path",function(b){if(a.pathPoints=b,null!=h)return h()}),b.isDefined(a.scope.events)&&b.isObject(a.scope.events)&&(a.listeners=a.model?i.setEvents(a.gObject,a.scope,a.model):i.setEvents(a.gObject,a.scope,a.scope)),a.internalListeners=a.model?i.setEvents(a.gObject,{events:a.internalEvents},a.model):i.setEvents(a.gObject,{events:a.internalEvents},a.scope)):void 0}}(this),e(),this.scope.$watch("path",function(a){return function(b,d){if(!c.isEqual(b,d)||!a.gObject)return e()}}(this),!0),!this.scope.static&&b.isDefined(this.scope.editable)&&this.scope.$watch("editable",function(a){return function(b,c){var d;if(b!==c)return b=!a.isFalse(b),null!=(d=a.gObject)?d.setEditable(b):void 0}}(this),!0),b.isDefined(this.scope.draggable)&&this.scope.$watch("draggable",function(a){return function(b,c){var d;if(b!==c)return b=!a.isFalse(b),null!=(d=a.gObject)?d.setDraggable(b):void 0}}(this),!0),b.isDefined(this.scope.visible)&&this.scope.$watch("visible",function(a){return function(b,c){var d;return b!==c&&(b=!a.isFalse(b)),null!=(d=a.gObject)?d.setVisible(b):void 0}}(this),!0),b.isDefined(this.scope.geodesic)&&this.scope.$watch("geodesic",function(a){return function(b,c){var d;if(b!==c)return b=!a.isFalse(b),null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),b.isDefined(this.scope.stroke)&&b.isDefined(this.scope.stroke.weight)&&this.scope.$watch("stroke.weight",function(a){return function(b,c){var d;if(b!==c)return null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),b.isDefined(this.scope.stroke)&&b.isDefined(this.scope.stroke.color)&&this.scope.$watch("stroke.color",function(a){return function(b,c){var d;if(b!==c)return null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),b.isDefined(this.scope.stroke)&&b.isDefined(this.scope.stroke.opacity)&&this.scope.$watch("stroke.opacity",function(a){return function(b,c){var d;if(b!==c)return null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),b.isDefined(this.scope.icons)&&this.scope.$watch("icons",function(a){return function(b,c){var d;if(b!==c)return null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),this.scope.$on("$destroy",function(a){return function(){return a.clean(),a.scope=null}}(this)),b.isDefined(this.scope.fill)&&b.isDefined(this.scope.fill.color)&&this.scope.$watch("fill.color",function(a){return function(b,c){if(b!==c)return a.gObject.setOptions(a.buildOpts(a.gObject.getPath()))}}(this)),b.isDefined(this.scope.fill)&&b.isDefined(this.scope.fill.opacity)&&this.scope.$watch("fill.opacity",function(a){return function(b,c){if(b!==c)return a.gObject.setOptions(a.buildOpts(a.gObject.getPath()))}}(this)),b.isDefined(this.scope.zIndex)&&this.scope.$watch("zIndex",function(a){return function(b,c){if(b!==c)return a.gObject.setOptions(a.buildOpts(a.gObject.getPath()))}}(this))}return d(j,e),j.include(h),j.prototype.clean=function(){var a;return i.removeEvents(this.listeners),i.removeEvents(this.internalListeners),null!=(a=this.gObject)&&a.setMap(null),this.gObject=null},j}(e)}}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.models.child").factory("uiGmapDrawFreeHandChildModel",["uiGmapLogger","$q",function(a,b){var d,e;return d=function(a,b,c){var d,e;e=new google.maps.Polyline({map:a,clickable:!1}),d=google.maps.event.addListener(a,"mousemove",function(a){return e.getPath().push(a.latLng)}),google.maps.event.addListenerOnce(a,"mouseup",function(f){var g;return google.maps.event.removeListener(d),g=e.getPath(),e.setMap(null),b.push(new google.maps.Polygon({map:a,path:g})),e=null,google.maps.event.clearListeners(a.getDiv(),"mousedown"),c()})},e=function(e,f){var g,h;return this.map=e,g=function(b){return function(){var c;return c={draggable:!1,disableDefaultUI:!0,scrollwheel:!1,disableDoubleClickZoom:!1},a.info("disabling map move"),b.map.setOptions(c)}}(this),h=function(a){return function(){var b,d;return b={draggable:!0,disableDefaultUI:!1,scrollwheel:!0,disableDoubleClickZoom:!0},null!=(d=a.deferred)&&d.resolve(),c.defer(function(){return a.map.setOptions(c.extend(b,f.options))})}}(this),this.engage=function(c){return function(e){return c.polys=e,c.deferred=b.defer(),g(),a.info("DrawFreeHandChildModel is engaged (drawing)."),google.maps.event.addDomListener(c.map.getDiv(),"mousedown",function(a){return d(c.map,c.polys,h)}),c.deferred.promise}}(this),this}}])}.call(this),function(){var d=function(a,b){return function(){return a.apply(b,arguments)}},e=function(a,b){function c(){this.constructor=a}for(var d in b)f.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},f={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.child").factory("uiGmapMarkerChildModel",["uiGmapModelKey","uiGmapGmapUtil","uiGmapLogger","uiGmapEventsHelper","uiGmapPropertyAction","uiGmapMarkerOptions","uiGmapIMarker","uiGmapMarkerManager","uiGmapPromise",function(f,g,h,i,j,k,l,m,n){var o;return o=function(f){function o(a){this.internalEvents=d(this.internalEvents,this),this.setLabelOptions=d(this.setLabelOptions,this),this.setOptions=d(this.setOptions,this),this.setIcon=d(this.setIcon,this),this.setCoords=d(this.setCoords,this),this.isNotValid=d(this.isNotValid,this),this.maybeSetScopeValue=d(this.maybeSetScopeValue,this),this.createMarker=d(this.createMarker,this),this.setMyScope=d(this.setMyScope,this),this.updateModel=d(this.updateModel,this),this.handleModelChanges=d(this.handleModelChanges,this),this.destroy=d(this.destroy,this);var b,e,f,g,i,k,l;l=a.scope,this.model=a.model,this.keys=a.keys,this.gMap=a.gMap,this.defaults=null!=(e=a.defaults)?e:{},this.doClick=a.doClick,this.gManager=a.gManager,this.doDrawSelf=null==(f=a.doDrawSelf)||f,this.trackModel=null==(g=a.trackModel)||g,this.needRedraw=null!=(i=a.needRedraw)&&i,this.isScopeModel=null!=(k=a.isScopeModel)&&k,this.isScopeModel&&(this.clonedModel=c.clone(this.model,!0)),this.deferred=n.defer(),c.each(this.keys,function(a){return function(b,d){var e;if(e=a.keys[d],null!=e&&!c.isFunction(e)&&c.isString(e))return a[d+"Key"]=e}}(this)),this.idKey=this.idKeyKey||"id",null!=this.model[this.idKey]&&(this.id=this.model[this.idKey]),o.__super__.constructor.call(this,l),this.scope.getGMarker=function(a){return function(){return a.gObject}}(this),this.firstTime=!0,this.trackModel?(this.scope.model=this.model,this.scope.$watch("model",function(a){return function(b,c){if(b!==c)return a.handleModelChanges(b,c)}}(this),!0)):(b=new j(function(a){return function(b){if(c.isFunction(b)&&(b="all"),!a.firstTime)return a.setMyScope(b,l)}}(this),!1),c.each(this.keys,function(a,c){return l.$watch(c,b.sic(c),!0)})),this.scope.$on("$destroy",function(a){return function(){return p(a)}}(this)),this.createMarker(this.model),h.info(this)}var p;return e(o,f),o.include(g),o.include(i),o.include(k),p=function(a){if(null!=(null!=a?a.gObject:void 0)&&(a.removeEvents(a.externalListeners),a.removeEvents(a.internalListeners),null!=a?a.gObject:void 0))return a.removeFromManager&&a.gManager.remove(a.gObject),a.gObject.setMap(null),a.gObject=null},o.prototype.destroy=function(a){return null==a&&(a=!0),this.removeFromManager=a,this.scope.$destroy()},o.prototype.handleModelChanges=function(a,b){var d,e,f;if(d=this.getChanges(a,b,l.keys),!this.firstTime)return e=0,f=c.keys(d).length,c.each(d,function(c){return function(d,g){var h;return e+=1,h=f===e,c.setMyScope(g,a,b,!1,!0,h),c.needRedraw=!0}}(this))},o.prototype.updateModel=function(a){return this.isScopeModel&&(this.clonedModel=c.clone(a,!0)),this.setMyScope("all",a,this.model)},o.prototype.renderGMarker=function(b,c){var d,e,f;if(null==b&&(b=!0),d=this.getProp("coords",this.scope,this.model),null!=(null!=(f=this.gManager)?f.isSpiderfied:void 0)&&(e=this.gManager.isSpiderfied()),null!=d){if(!this.validateCoords(d))return void h.debug("MarkerChild does not have coords yet. They may be defined later.");if(null!=c&&c(),b&&this.gObject&&this.gManager.add(this.gObject),e)return this.gManager.markerSpiderfier.spiderListener(this.gObject,a.event)}else if(b&&this.gObject)return this.gManager.remove(this.gObject)},o.prototype.setMyScope=function(a,b,d,e,f){var g;switch(null==d&&(d=void 0),null==e&&(e=!1),null==f&&(f=!0),null==b?b=this.model:this.model=b,this.gObject||(this.setOptions(this.scope,f),g=!0),a){case"all":return c.each(this.keys,function(a){return function(c,g){return a.setMyScope(g,b,d,e,f)}}(this));case"icon":return this.maybeSetScopeValue({gSetter:this.setIcon,doDraw:f});case"coords":return this.maybeSetScopeValue({gSetter:this.setCoords,doDraw:f});case"options":if(!g)return this.createMarker(b,d,e,f)}},o.prototype.createMarker=function(a,b,c,d){return null==b&&(b=void 0),null==c&&(c=!1),null==d&&(d=!0),this.maybeSetScopeValue({gSetter:this.setOptions,doDraw:d}),this.firstTime=!1},o.prototype.maybeSetScopeValue=function(a){var b,c,d;if(c=a.gSetter,b=null==(d=a.doDraw)||d,null!=c&&c(this.scope,b),this.doDrawSelf&&b)return this.gManager.draw()},o.prototype.isNotValid=function(a,b){var c,d;return null==b&&(b=!0),d=!!b&&void 0===this.gObject,c=!this.trackModel&&a.$id!==this.scope.$id,c||d},o.prototype.setCoords=function(a,b){if(null==b&&(b=!0),!this.isNotValid(a)&&null!=this.gObject)return this.renderGMarker(b,function(b){return function(){var c,d,e;if(d=b.getProp("coords",a,b.model),c=b.getCoords(d),e=b.gObject.getPosition(),null==e||null==c||c.lng()!==e.lng()||c.lat()!==e.lat())return b.gObject.setPosition(c),b.gObject.setVisible(b.validateCoords(d))}}(this))},o.prototype.setIcon=function(a,b){if(null==b&&(b=!0),!this.isNotValid(a)&&null!=this.gObject)return this.renderGMarker(b,function(b){return function(){var c,d,e;if(e=b.gObject.getIcon(),d=b.getProp("icon",a,b.model),e!==d)return b.gObject.setIcon(d),c=b.getProp("coords",a,b.model),b.gObject.setPosition(b.getCoords(c)),b.gObject.setVisible(b.validateCoords(c))}}(this))},o.prototype.setOptions=function(a,b){var d;if(null==b&&(b=!0),!this.isNotValid(a,!1)){if(this.renderGMarker(b,function(b){return function(){var d,e,f;if(e=b.getProp("coords",a,b.model),f=b.getProp("icon",a,b.model),d=b.getProp("options",a,b.model),b.opts=b.createOptions(e,f,d),b.isLabel(b.gObject)!==b.isLabel(b.opts)&&null!=b.gObject&&(b.gManager.remove(b.gObject),b.gObject=void 0),null!=b.gObject&&b.gObject.setOptions(b.setLabelOptions(b.opts)),b.gObject||(b.isLabel(b.opts)?b.gObject=new MarkerWithLabel(b.setLabelOptions(b.opts)):b.opts.content?(b.gObject=new RichMarker(b.opts),b.gObject.getIcon=b.gObject.getContent,b.gObject.setIcon=b.gObject.setContent):b.gObject=new google.maps.Marker(b.opts),c.extend(b.gObject,{model:b.model})),b.externalListeners&&b.removeEvents(b.externalListeners),b.internalListeners&&b.removeEvents(b.internalListeners),b.externalListeners=b.setEvents(b.gObject,b.scope,b.model,["dragend"]),b.internalListeners=b.setEvents(b.gObject,{events:b.internalEvents(),$evalAsync:function(){}},b.model),null!=b.id)return b.gObject.key=b.id}}(this)),this.gObject&&(this.gObject.getMap()||this.gManager.type!==m.type))this.deferred.resolve(this.gObject);else{if(!this.gObject)return this.deferred.reject("gObject is null");null!=(d=this.gObject)&&d.getMap()&&this.gManager.type===m.type||(h.debug("gObject has no map yet"),this.deferred.resolve(this.gObject))}return this.model[this.fitKey]?this.gManager.fit():void 0}},o.prototype.setLabelOptions=function(a){return a.labelAnchor&&(a.labelAnchor=this.getLabelPositionPoint(a.labelAnchor)),a},o.prototype.internalEvents=function(){return{dragend:function(a){return function(b,c,d,e){var f,g,h;return g=a.trackModel?a.scope.model:a.model,h=a.setCoordsFromEvent(a.modelOrKey(g,a.coordsKey),a.gObject.getPosition()),g=a.setVal(d,a.coordsKey,h),f=a.scope.events,null!=(null!=f?f.dragend:void 0)&&f.dragend(b,c,g,e),a.scope.$apply()}}(this),click:function(a){return function(c,d,e,f){var g;if(g=a.getProp("click",a.scope,a.model),a.doClick&&b.isFunction(g))return a.scope.$evalAsync(g(c,d,a.model,f))}}(this)}},o}(f)}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolygonChildModel",["uiGmapBasePolyChildModel","uiGmapPolygonOptionsBuilder",function(b,c){var d,e,f;return f=function(a){return new google.maps.Polygon(a)},e=new b(c,f),d=function(b){function c(){return c.__super__.constructor.apply(this,arguments)}return a(c,b),c}(e)}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolylineChildModel",["uiGmapBasePolyChildModel","uiGmapPolylineOptionsBuilder",function(b,c){var d,e,f;return f=function(a){return new google.maps.Polyline(a)},e=b(c,f),d=function(b){function c(){return c.__super__.constructor.apply(this,arguments)}return a(c,b),c}(e)}])}.call(this),function(){var d=function(a,b){return function(){return a.apply(b,arguments)}},e=function(a,b){function c(){this.constructor=a}for(var d in b)f.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},f={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.child").factory("uiGmapWindowChildModel",["uiGmapBaseObject","uiGmapGmapUtil","uiGmapLogger","$compile","$http","$templateCache","uiGmapChromeFixes","uiGmapEventsHelper",function(f,g,h,i,j,k,l,m){var n;return n=function(f){function n(a){this.updateModel=d(this.updateModel,this),this.destroy=d(this.destroy,this),this.remove=d(this.remove,this),this.getLatestPosition=d(this.getLatestPosition,this),this.hideWindow=d(this.hideWindow,this),this.showWindow=d(this.showWindow,this),this.handleClick=d(this.handleClick,this),this.watchOptions=d(this.watchOptions,this),this.watchCoords=d(this.watchCoords,this),this.createGWin=d(this.createGWin,this),this.watchElement=d(this.watchElement,this),this.watchAndDoShow=d(this.watchAndDoShow,this),this.doShow=d(this.doShow,this);var b,e,f,g,i;this.model=null!=(e=a.model)?e:{},this.scope=a.scope,this.opts=a.opts,this.isIconVisibleOnClick=a.isIconVisibleOnClick,this.gMap=a.gMap,this.markerScope=a.markerScope,this.element=a.element,this.needToManualDestroy=null!=(f=a.needToManualDestroy)&&f,this.markerIsVisibleAfterWindowClose=null==(g=a.markerIsVisibleAfterWindowClose)||g,this.isScopeModel=null!=(i=a.isScopeModel)&&i,this.isScopeModel&&(this.clonedModel=c.clone(this.model,!0)),this.getGmarker=function(){var a,b;if(null!=(null!=(a=this.markerScope)?a.getGMarker:void 0))return null!=(b=this.markerScope)?b.getGMarker():void 0},this.listeners=[],this.createGWin(),b=this.getGmarker(),null!=b&&b.setClickable(!0),this.watchElement(),this.watchOptions(),this.watchCoords(),this.watchAndDoShow(),this.scope.$on("$destroy",function(a){return function(){return a.destroy()}}(this)),h.info(this)}return e(n,f),n.include(g),n.include(m),n.prototype.doShow=function(a){return this.scope.show===!0||a?this.showWindow():this.hideWindow()},n.prototype.watchAndDoShow=function(){return null!=this.model.show&&(this.scope.show=this.model.show),this.scope.$watch("show",this.doShow,!0),this.doShow()},n.prototype.watchElement=function(){return this.scope.$watch(function(a){return function(){var b,c;if(a.element||a.html)return a.html!==a.element.html()&&a.gObject?(null!=(b=a.opts)&&(b.content=void 0),c=a.gObject.isOpen(),a.remove(),a.createGWin(c)):void 0}}(this))},n.prototype.createGWin=function(b){var d,e,f,g,h;if(null==b&&(b=!1),f=this.getGmarker(),e={},null!=this.opts&&(this.scope.coords&&(this.opts.position=this.getCoords(this.scope.coords)),e=this.opts),this.element&&(this.html=c.isObject(this.element)?this.element.html():this.element),d=this.scope.options?this.scope.options:e,this.opts=this.createWindowOptions(f,this.markerScope||this.scope,this.html,d),null!=this.opts)return this.gObject||(this.opts.boxClass&&a.InfoBox&&"function"==typeof a.InfoBox?this.gObject=new a.InfoBox(this.opts):this.gObject=new google.maps.InfoWindow(this.opts),this.listeners.push(google.maps.event.addListener(this.gObject,"domready",function(){return l.maybeRepaint(this.content)})),this.listeners.push(google.maps.event.addListener(this.gObject,"closeclick",function(a){return function(){return f&&(f.setAnimation(a.oldMarkerAnimation),a.markerIsVisibleAfterWindowClose&&c.delay(function(){return f.setVisible(!1),f.setVisible(a.markerIsVisibleAfterWindowClose)},250)),a.gObject.close(),a.model.show=!1,null!=a.scope.closeClick?a.scope.$evalAsync(a.scope.closeClick()):a.scope.$evalAsync()}}(this)))),this.gObject.setContent(this.opts.content),this.handleClick((null!=(g=this.scope)&&null!=(h=g.options)?h.forceClick:void 0)||b),this.doShow(this.gObject.isOpen())},n.prototype.watchCoords=function(){var a;return a=null!=this.markerScope?this.markerScope:this.scope,a.$watch("coords",function(a){return function(b,c){var d;if(b!==c){if(null==b)a.hideWindow();else if(!a.validateCoords(b))return void h.error("WindowChildMarker cannot render marker as scope.coords as no position on marker: "+JSON.stringify(a.model));if(d=a.getCoords(b),a.doShow(),a.gObject.setPosition(d),a.opts)return a.opts.position=d}}}(this),!0)},n.prototype.watchOptions=function(){return this.scope.$watch("options",function(a){return function(b,c){if(b!==c&&(a.opts=b,null!=a.gObject)){if(a.gObject.setOptions(a.opts),null!=a.opts.visible&&a.opts.visible)return a.showWindow();if(null!=a.opts.visible)return a.hideWindow()}}}(this),!0)},n.prototype.handleClick=function(a){var b,c;if(null!=this.gObject)return c=this.getGmarker(),b=function(a){return function(){if(null==a.gObject&&a.createGWin(),a.showWindow(),null!=c)return a.initialMarkerVisibility=c.getVisible(),a.oldMarkerAnimation=c.getAnimation(),c.setVisible(a.isIconVisibleOnClick)}}(this),a&&b(),c?this.listeners=this.listeners.concat(this.setEvents(c,{events:{click:b}},this.model)):void 0},n.prototype.showWindow=function(){var a,c,d;if(null!=this.gObject)return d=null,c=function(a){return function(){var b,c,d;if(!a.gObject.isOpen()){if(c=a.getGmarker(),null!=a.gObject&&null!=a.gObject.getPosition&&(d=a.gObject.getPosition()),c&&(d=c.getPosition()),!d)return;if(a.gObject.open(a.gMap,c),b=a.gObject.isOpen(),a.model.show!==b)return a.model.show=b}}}(this),this.scope.templateUrl?j.get(this.scope.templateUrl,{cache:k}).then(function(a){return function(e){var f;return d=a.scope.$new(),b.isDefined(a.scope.templateParameter)&&(d.parameter=a.scope.templateParameter),f=i(e.data)(d),a.gObject.setContent(f[0]),c()}}(this)):this.scope.template?(d=this.scope.$new(),b.isDefined(this.scope.templateParameter)&&(d.parameter=this.scope.templateParameter),a=i(this.scope.template)(d),this.gObject.setContent(a[0]),c()):c(),this.scope.$on("destroy",function(){return d.$destroy()})},n.prototype.hideWindow=function(){if(null!=this.gObject&&this.gObject.isOpen())return this.gObject.close()},n.prototype.getLatestPosition=function(a){var b;return b=this.getGmarker(),null==this.gObject||null==b||a?a?this.gObject.setPosition(a):void 0:this.gObject.setPosition(b.getPosition())},n.prototype.remove=function(){return this.hideWindow(),this.removeEvents(this.listeners),this.listeners.length=0,delete this.gObject,delete this.opts},n.prototype.destroy=function(a){var b;if(null==a&&(a=!1),this.remove(),null!=this.scope&&!(null!=(b=this.scope)?b.$$destroyed:void 0)&&(this.needToManualDestroy||a))return this.scope.$destroy()},n.prototype.updateModel=function(a){return this.isScopeModel&&(this.clonedModel=c.clone(a,!0)),c.extend(this.model,this.clonedModel||a)},n}(f)}])}.call(this), +function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapBasePolysParentModel",["$timeout","uiGmapLogger","uiGmapModelKey","uiGmapModelsWatcher","uiGmapPropMap","uiGmap_async","uiGmapPromise","uiGmapFitHelper",function(e,f,g,h,i,j,k,l){return function(e,m,n){var o;return o=function(g){function o(b,d,g,h,j){this.element=d,this.attrs=g,this.gMap=h,this.defaults=j,this.maybeFit=a(this.maybeFit,this),this.createChild=a(this.createChild,this),this.pieceMeal=a(this.pieceMeal,this),this.createAllNew=a(this.createAllNew,this),this.watchIdKey=a(this.watchIdKey,this),this.createChildScopes=a(this.createChildScopes,this),this.watchDestroy=a(this.watchDestroy,this),this.onDestroy=a(this.onDestroy,this),this.rebuildAll=a(this.rebuildAll,this),this.doINeedToWipe=a(this.doINeedToWipe,this),this.watchModels=a(this.watchModels,this),o.__super__.constructor.call(this,b),this.interface=e,this.$log=f,this.plurals=new i,c.each(e.scopeKeys,function(a){return function(b){return a[b+"Key"]=void 0}}(this)),this.models=void 0,this.firstTime=!0,this.$log.info(this),this.createChildScopes()}return d(o,g),o.include(h),o.prototype.watchModels=function(a){return a.$watch("models",function(b){return function(c,d){if(c!==d)return b.doINeedToWipe(c)||a.doRebuildAll?b.rebuildAll(a,!0,!0):b.createChildScopes(!1)}}(this),!0)},o.prototype.doINeedToWipe=function(a){var b;return b=null==a||0===a.length,this.plurals.length>0&&b},o.prototype.rebuildAll=function(a,b,c){return this.onDestroy(c).then(function(a){return function(){if(b)return a.createChildScopes()}}(this))},o.prototype.onDestroy=function(){return o.__super__.onDestroy.call(this,this.scope),j.promiseLock(this,k.promiseTypes.delete,void 0,void 0,function(a){return function(){return j.each(a.plurals.values(),function(a){return a.destroy(!0)},j.chunkSizeFrom(a.scope.cleanchunk,!1)).then(function(){var b;return null!=(b=a.plurals)?b.removeAll():void 0})}}(this))},o.prototype.watchDestroy=function(a){return a.$on("$destroy",function(b){return function(){return b.rebuildAll(a,!1,!0)}}(this))},o.prototype.createChildScopes=function(a){return null==a&&(a=!0),b.isUndefined(this.scope.models)?void this.$log.error("No models to create "+n+"s from! I Need direct models!"):null!=this.gMap&&null!=this.scope.models?(this.watchIdKey(this.scope),a?this.createAllNew(this.scope,!1):this.pieceMeal(this.scope,!1)):void 0},o.prototype.watchIdKey=function(a){return this.setIdKey(a),a.$watch("idKey",function(b){return function(c,d){if(c!==d&&null==c)return b.idKey=c,b.rebuildAll(a,!0,!0)}}(this))},o.prototype.createAllNew=function(a,b){var c;if(null==b&&(b=!1),this.models=a.models,this.firstTime&&(this.watchModels(a),this.watchDestroy(a)),!this.didQueueInitPromise(this,a))return c=null,j.promiseLock(this,k.promiseTypes.create,"createAllNew",function(a){return c=a},function(b){return function(){return j.map(a.models,function(a){var d;return d=b.createChild(a,b.gMap),c&&(f.debug("createNew should fall through safely"),d.isEnabled=!1),d.pathPoints.getArray()},j.chunkSizeFrom(a.chunk)).then(function(a){return b.maybeFit(a),b.firstTime=!1})}}(this))},o.prototype.pieceMeal=function(a,b){var d,e;if(null==b&&(b=!0),!a.$$destroyed)return d=null,e=null,this.models=a.models,null!=a&&this.modelsLength()&&this.plurals.length?j.promiseLock(this,k.promiseTypes.update,"pieceMeal",function(a){return d=a},function(b){return function(){return k.promise(function(){return b.figureOutState(b.idKey,a,b.plurals,b.modelKeyComparison)}).then(function(f){return e=f,e.updates.length&&j.each(e.updates,function(a){return c.extend(a.child.scope,a.model),a.child.model=a.model}),j.each(e.removals,function(a){if(null!=a)return a.destroy(),b.plurals.remove(a.model[b.idKey]),d},j.chunkSizeFrom(a.chunk))}).then(function(){return j.each(e.adds,function(a){return d&&f.debug("pieceMeal should fall through safely"),b.createChild(a,b.gMap),d},j.chunkSizeFrom(a.chunk)).then(function(){return b.maybeFit()})})}}(this)):(this.inProgress=!1,this.rebuildAll(this.scope,!0,!0))},o.prototype.createChild=function(a,b){var c,d;return d=this.scope.$new(!1),this.setChildScope(e.scopeKeys,d,a),d.$watch("model",function(a){return function(b,c){if(b!==c)return a.setChildScope(e.scopeKeys,d,b)}}(this),!0),d.static=this.scope.static,c=new m({isScopeModel:!0,scope:d,attrs:this.attrs,gMap:b,defaults:this.defaults,model:a,gObjectChangeCb:function(a){return function(){return a.maybeFit()}}(this)}),null==a[this.idKey]?void this.$log.error(n+" model has no id to assign a child to.\nThis is required for performance. Please assign id,\nor redirect id to a different key."):(this.plurals.put(a[this.idKey],c),c)},o.prototype.maybeFit=function(a){if(null==a&&(a=this.plurals.map(function(a){return a.pathPoints})),this.scope.fit)return a=c.flatten(a),l.fit(a,this.gMap)},o}(g)}}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapCircleParentModel",["uiGmapLogger","$timeout","uiGmapGmapUtil","uiGmapEventsHelper","uiGmapCircleOptionsBuilder",function(d,e,f,g,h){var i,j;return j=function(a,b){return a.settingFromDirective=!0,b(),e(function(){return a.settingFromDirective=!1})},i=function(e){function h(a,e,g,h,i){var k,l,m;this.attrs=g,this.gMap=h,this.DEFAULTS=i,this.scope=a,m=null,k=function(a){return function(){if(m=null,null!=a.listeners)return a.removeEvents(a.listeners),a.listeners=void 0}}(this),l=new google.maps.Circle(this.buildOpts(f.getCoords(a.center),a.radius)),this.setMyOptions=function(b){return function(d,e){if(!a.settingFromDirective)return!c.isEqual(d,e)||d!==e||null!=d&&null!=e&&d.coordinates!==e.coordinates?l.setOptions(b.buildOpts(f.getCoords(a.center),a.radius)):void 0}}(this),this.props=this.props.concat([{prop:"center",isColl:!0},{prop:"fill",isColl:!0},"radius","zIndex"]),this.watchProps(),null!=this.scope.control&&(this.scope.control.getCircle=function(){return l}),k(),this.listeners=this.setEvents(l,a,a,["radius_changed"])||[],this.listeners.push(google.maps.event.addListener(l,"radius_changed",function(){var d,e;if(d=l.getRadius(),d!==m)return m=d,e=function(){return j(a,function(){var b,e;if(d!==a.radius&&(a.radius=d),(null!=(b=a.events)?b.radius_changed:void 0)&&c.isFunction(null!=(e=a.events)?e.radius_changed:void 0))return a.events.radius_changed(l,"radius_changed",a,arguments)})},b.mock?e():a.$evalAsync(function(){return e()})})),this.listeners.push(google.maps.event.addListener(l,"center_changed",function(){return a.$evalAsync(function(){return j(a,function(){return b.isDefined(a.center.type)?(a.center.coordinates[1]=l.getCenter().lat(),a.center.coordinates[0]=l.getCenter().lng()):(a.center.latitude=l.getCenter().lat(),a.center.longitude=l.getCenter().lng())})})})),a.$on("$destroy",function(){return k(),l.setMap(null)}),d.info(this)}return a(h,e),h.include(f),h.include(g),h}(h)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapDrawingManagerParentModel",["uiGmapLogger","$timeout","uiGmapBaseObject","uiGmapEventsHelper",function(b,d,e,f){var g;return g=function(b){function d(a,b,d,e){var f,g;this.scope=a,this.attrs=d,this.map=e,f=new google.maps.drawing.DrawingManager(this.scope.options),f.setMap(this.map),g=void 0,null!=this.scope.control&&(this.scope.control.getDrawingManager=function(){return f}),!this.scope.static&&this.scope.options&&this.scope.$watch("options",function(a){return null!=f?f.setOptions(a):void 0},!0),null!=this.scope.events&&(g=this.setEvents(f,this.scope,this.scope),this.scope.$watch("events",function(a){return function(b,d){if(!c.isEqual(b,d))return null!=g&&a.removeEvents(g),g=a.setEvents(f,a.scope,a.scope)}}(this))),this.scope.$on("$destroy",function(a){return function(){return null!=g&&a.removeEvents(g),f.setMap(null),f=null}}(this))}return a(d,b),d.include(f),d}(e)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapIMarkerParentModel",["uiGmapModelKey","uiGmapLogger",function(e,f){var g;return g=function(e){function g(c,d,e,h){if(this.scope=c,this.element=d,this.attrs=e,this.map=h,this.onWatch=a(this.onWatch,this),this.watch=a(this.watch,this),this.validateScope=a(this.validateScope,this),g.__super__.constructor.call(this,this.scope),this.$log=f,!this.validateScope(this.scope))throw new String("Unable to construct IMarkerParentModel due to invalid scope");this.doClick=b.isDefined(this.attrs.click),null!=this.scope.options&&(this.DEFAULTS=this.scope.options),this.watch("coords",this.scope),this.watch("icon",this.scope),this.watch("options",this.scope),this.scope.$on("$destroy",function(a){return function(){return a.onDestroy(a.scope)}}(this))}return d(g,e),g.prototype.DEFAULTS={},g.prototype.validateScope=function(a){var b;return null==a?(this.$log.error(this.constructor.name+": invalid scope used"),!1):(b=null!=a.coords,b?b:(this.$log.error(this.constructor.name+": no valid coords attribute found"),!1))},g.prototype.watch=function(a,b,d){return null==d&&(d=!0),b.$watch(a,function(d){return function(e,f){if(!c.isEqual(e,f))return d.onWatch(a,b,e,f)}}(this),d)},g.prototype.onWatch=function(a,b,c,d){},g}(e)}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapIWindowParentModel",["uiGmapModelKey","uiGmapGmapUtil","uiGmapLogger",function(b,c,d){var e;return e=function(b){function e(a,b,c,f,g,h,i,j){e.__super__.constructor.call(this,a),this.$log=d,this.$timeout=g,this.$compile=h,this.$http=i,this.$templateCache=j,this.DEFAULTS={},null!=a.options&&(this.DEFAULTS=a.options)}return a(e,b),e.include(c),e.prototype.getItem=function(a,b,c){return"models"===b?a[b][c]:a[b].get(c)},e}(b)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapLayerParentModel",["uiGmapBaseObject","uiGmapLogger","$timeout",function(d,e,f){var g;return g=function(d){function f(c,d,f,g,h,i){return this.scope=c,this.element=d,this.attrs=f,this.gMap=g,this.onLayerCreated=null!=h?h:void 0,this.$log=null!=i?i:e,this.createGoogleLayer=a(this.createGoogleLayer,this),null==this.attrs.type?void this.$log.info("type attribute for the layer directive is mandatory. Layer creation aborted!!"):(this.createGoogleLayer(),this.doShow=!0,b.isDefined(this.attrs.show)&&(this.doShow=this.scope.show),this.doShow&&null!=this.gMap&&this.gObject.setMap(this.gMap),this.scope.$watch("show",function(a){return function(b,c){if(b!==c)return a.doShow=b,b?a.gObject.setMap(a.gMap):a.gObject.setMap(null)}}(this),!0),this.scope.$watch("options",function(a){return function(b,c){if(b!==c&&a.doShow)return a.gObject.setOptions(b)}}(this),!0),void this.scope.$on("$destroy",function(a){return function(){return a.gObject.setMap(null)}}(this)))}return c(f,d),f.prototype.createGoogleLayer=function(){var a;if(null==this.attrs.options?this.gObject=void 0===this.attrs.namespace?new google.maps[this.attrs.type]:new google.maps[this.attrs.namespace][this.attrs.type]:this.gObject=void 0===this.attrs.namespace?new google.maps[this.attrs.type](this.scope.options):new google.maps[this.attrs.namespace][this.attrs.type](this.scope.options),null!=this.gObject&&this.doShow&&this.gObject.setMap(this.gMap),null!=this.gObject&&null!=this.onLayerCreated)return"function"==typeof(a=this.onLayerCreated(this.scope,this.gObject))?a(this.gObject):void 0},f}(d)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapMapTypeParentModel",["uiGmapBaseObject","uiGmapLogger",function(e,f){var g;return g=function(e){function g(d,e,g,h,i,j,k){var l,m,n,o;return this.scope=d,this.element=e,this.attrs=g,this.gMap=h,this.$log=null!=i?i:f,this.childModel=j,this.propMap=k,this.refreshShown=a(this.refreshShown,this),this.hideOverlay=a(this.hideOverlay,this),this.showOverlay=a(this.showOverlay,this),this.refreshMapType=a(this.refreshMapType,this),this.createMapType=a(this.createMapType,this),null==this.scope.options?void this.$log.info("options attribute for the map-type directive is mandatory. Map type creation aborted!!"):(this.id=this.gMap.overlayMapTypesCount=this.gMap.overlayMapTypesCount+1||0,this.doShow=!0,this.createMapType(),this.refreshShown(),this.doShow&&null!=this.gMap&&this.showOverlay(),m=function(a){return function(){return a.childModel[a.attrs.show]}}(this),o=this.childModel?m:"show",this.scope.$watch(o,function(a){return function(b,c){if(b!==c)return a.doShow=b,b?a.showOverlay():a.hideOverlay()}}(this)),l=function(a){return function(){return a.childModel[a.attrs.options]}}(this),n=this.childModel?l:"options",this.scope.$watchCollection(n,function(a){return function(b,d){var e,f;if(!c.isEqual(b,d)&&(f=["tileSize","maxZoom","minZoom","name","alt"],e=c.some(f,function(a){return!d||!b||!c.isEqual(b[a],d[a])})))return a.refreshMapType()}}(this)),b.isDefined(this.attrs.refresh)&&this.scope.$watch("refresh",function(a){return function(b,d){if(!c.isEqual(b,d))return a.refreshMapType()}}(this),!0),void this.scope.$on("$destroy",function(a){return function(){return a.hideOverlay(),a.mapType=null}}(this)))}return d(g,e),g.prototype.createMapType=function(){var a,c,d;if(d=this.childModel?this.attrs.options?this.childModel[this.attrs.options]:this.childModel:this.scope.options,null!=d.getTile)this.mapType=d;else{if(null==d.getTileUrl)return void this.$log.info("options should provide either getTile or getTileUrl methods. Map type creation aborted!!");this.mapType=new google.maps.ImageMapType(d)}if(c=this.attrs.id?this.childModel?this.attrs.id:"id":void 0,a=c?this.childModel?this.childModel[c]:this.scope[c]:void 0,a&&(this.gMap.mapTypes.set(a,this.mapType),b.isDefined(this.attrs.show)||(this.doShow=!1)),this.mapType.layerId=this.id,this.childModel&&b.isDefined(this.scope.index))return this.propMap.put(this.mapType.layerId,this.scope.index)},g.prototype.refreshMapType=function(){if(this.hideOverlay(),this.mapType=null,this.createMapType(),this.doShow&&null!=this.gMap)return this.showOverlay()},g.prototype.showOverlay=function(){var a;return b.isDefined(this.scope.index)?(a=!1,this.gMap.overlayMapTypes.getLength()?(this.gMap.overlayMapTypes.forEach(function(c){return function(d,e){var f;a||(f=c.propMap.get(d.layerId.toString()),(f>c.scope.index||!b.isDefined(f))&&(a=!0,c.gMap.overlayMapTypes.insertAt(e,c.mapType)))}}(this)),a?void 0:this.gMap.overlayMapTypes.push(this.mapType)):this.gMap.overlayMapTypes.push(this.mapType)):this.gMap.overlayMapTypes.push(this.mapType)},g.prototype.hideOverlay=function(){var a;return a=!1,this.gMap.overlayMapTypes.forEach(function(b){return function(c,d){a||c.layerId!==b.id||(a=!0,b.gMap.overlayMapTypes.removeAt(d))}}(this))},g.prototype.refreshShown=function(){return this.doShow=!b.isDefined(this.attrs.show)||(this.childModel?this.childModel[this.attrs.show]:this.scope.show)},g}(e)}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapMapTypesParentModel",["uiGmapBaseObject","uiGmapLogger","uiGmapMapTypeParentModel","uiGmapPropMap",function(b,c,d,e){var f;return f=function(b){function f(a,b,f,g,h){var i;return this.scope=a,this.element=b,this.attrs=f,this.gMap=g,this.$log=null!=h?h:c,null==this.attrs.mapTypes?void this.$log.info("layers attribute for the map-types directive is mandatory. Map types creation aborted!!"):(i=new e,void this.scope.mapTypes.forEach(function(a){return function(b,c){var e,f;f={options:a.scope.options,show:a.scope.show,refresh:a.scope.refresh},e=a.scope.$new(),e.index=c,new d(e,null,f,a.gMap,a.$log,b,i)}}(this)))}return a(f,b),f}(b)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapMarkersParentModel",["uiGmapIMarkerParentModel","uiGmapModelsWatcher","uiGmapPropMap","uiGmapMarkerChildModel","uiGmap_async","uiGmapClustererMarkerManager","uiGmapMarkerManager","$timeout","uiGmapIMarker","uiGmapPromise","uiGmapGmapUtil","uiGmapLogger","uiGmapSpiderfierMarkerManager",function(e,f,g,h,i,j,k,l,m,n,o,p,q){var r,s;return s=function(a,b){return b.plurals=new g,b.scope.plurals=b.plurals,b},r=function(e){function l(b,d,e,f){this.maybeExecMappedEvent=a(this.maybeExecMappedEvent,this),this.onDestroy=a(this.onDestroy,this),this.newChildMarker=a(this.newChildMarker,this),this.pieceMeal=a(this.pieceMeal,this),this.rebuildAll=a(this.rebuildAll,this),this.createAllNew=a(this.createAllNew,this),this.bindToTypeEvents=a(this.bindToTypeEvents,this),this.createChildScopes=a(this.createChildScopes,this),this.validateScope=a(this.validateScope,this),this.onWatch=a(this.onWatch,this),l.__super__.constructor.call(this,b,d,e,f),this.interface=m,s(new g,this),this.scope.pluralsUpdate={updateCtr:0},this.$log.info(this),this.doRebuildAll=null!=this.scope.doRebuildAll&&this.scope.doRebuildAll,this.setIdKey(this.scope),this.scope.$watch("doRebuildAll",function(a){return function(b,c){if(b!==c)return a.doRebuildAll=b}}(this)),this.modelsLength()||(this.modelsRendered=!1),this.scope.$watch("models",function(a){return function(b,d){if(!c.isEqual(b,d)||!a.modelsRendered){if(0===b.length&&0===d.length)return;return a.modelsRendered=!0,a.onWatch("models",a.scope,b,d)}}}(this),!this.isTrue(e.modelsbyref)),this.watch("doCluster",this.scope),this.watch("type",this.scope),this.watch("clusterOptions",this.scope),this.watch("clusterEvents",this.scope),this.watch("typeOptions",this.scope),this.watch("typeEvents",this.scope),this.watch("fit",this.scope),this.watch("idKey",this.scope),this.gManager=void 0,this.createAllNew(this.scope)}return d(l,e),l.include(o),l.include(f),l.prototype.onWatch=function(a,b,c,d){return"idKey"===a&&c!==d&&(this.idKey=c),this.doRebuildAll||"doCluster"===a||"type"===a?this.rebuildAll(b):this.pieceMeal(b)},l.prototype.validateScope=function(a){var c;return c=b.isUndefined(a.models)||void 0===a.models,c&&this.$log.error(this.constructor.name+": no valid models attribute found"),l.__super__.validateScope.call(this,a)||c},l.prototype.createChildScopes=function(a){if(null!=this.gMap&&null!=this.scope.models)return a?this.createAllNew(this.scope,!1):this.pieceMeal(this.scope,!1)},l.prototype.bindToTypeEvents=function(a,d){var e,f;return null==d&&(d=["click","mouseout","mouseover"]),f=this,this.origTypeEvents?b.extend(a,this.origTypeEvents):(this.origTypeEvents={},c.each(d,function(b){return function(c){return b.origTypeEvents[c]=null!=a?a[c]:void 0}}(this))),e={},c.each(d,function(a){return e[a]=function(b){return f.maybeExecMappedEvent(b,a)}}),b.extend(a,e)},l.prototype.createAllNew=function(a){var b,c,d,e;if(null!=this.gManager&&(this.gManager instanceof q&&(b=this.gManager.isSpiderfied()),this.gManager.clear(),delete this.gManager),d=a.typeEvents||a.clusterEvents,e=a.typeOptions||a.clusterOptions,a.doCluster||"cluster"===a.type?(null!=d&&this.bindToTypeEvents(d),this.gManager=new j(this.map,void 0,e,d)):"spider"===a.type?(null!=d&&this.bindToTypeEvents(d,["spiderfy","unspiderfy"]),this.gManager=new q(this.map,void 0,e,d,this.scope),b&&this.gManager.spiderfy()):this.gManager=new k(this.map),!this.didQueueInitPromise(this,a))return c=null,i.promiseLock(this,n.promiseTypes.create,"createAllNew",function(a){return c=a},function(b){return function(){return i.each(a.models,function(d){return b.newChildMarker(d,a),c},i.chunkSizeFrom(a.chunk)).then(function(){return b.modelsRendered=!0,a.fit&&b.gManager.fit(),b.gManager.draw(),b.scope.pluralsUpdate.updateCtr+=1},i.chunkSizeFrom(a.chunk))}}(this))},l.prototype.rebuildAll=function(a){var b;if(a.doRebuild||void 0===a.doRebuild)return(null!=(b=this.scope.plurals)?b.length:void 0)?this.onDestroy(a).then(function(b){return function(){return b.createAllNew(a)}}(this)):this.createAllNew(a)},l.prototype.pieceMeal=function(a){var b,c;if(!a.$$destroyed)return b=null,c=null,this.modelsLength()&&this.scope.plurals.length?i.promiseLock(this,n.promiseTypes.update,"pieceMeal",function(a){return b=a},function(d){return function(){return n.promise(function(){return d.figureOutState(d.idKey,a,d.scope.plurals,d.modelKeyComparison)}).then(function(e){return c=e,i.each(c.removals,function(a){if(null!=a)return null!=a.destroy&&a.destroy(),d.scope.plurals.remove(a.id),b},i.chunkSizeFrom(a.chunk))}).then(function(){return i.each(c.adds,function(c){return d.newChildMarker(c,a),b},i.chunkSizeFrom(a.chunk))}).then(function(){return i.each(c.updates,function(a){return d.updateChild(a.child,a.model),b},i.chunkSizeFrom(a.chunk))}).then(function(){return(c.adds.length>0||c.removals.length>0||c.updates.length>0)&&(a.plurals=d.scope.plurals,a.fit&&d.gManager.fit(),d.gManager.draw()),d.scope.pluralsUpdate.updateCtr+=1})}}(this)):(this.inProgress=!1,this.rebuildAll(a))},l.prototype.newChildMarker=function(a,b){var c,d,e;if(!a)throw"model undefined";return null==a[this.idKey]?void this.$log.error("Marker model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."):(this.$log.info("child",c,"markers",this.scope.markerModels),d=b.$new(!1),d.events=b.events,e={},m.scopeKeys.forEach(function(a){return e[a]=b[a]}),c=new h({scope:d,model:a,keys:e,gMap:this.map,defaults:this.DEFAULTS,doClick:this.doClick,gManager:this.gManager,doDrawSelf:!1,isScopeModel:!0}),this.scope.plurals.put(a[this.idKey],c),c)},l.prototype.onDestroy=function(a){return l.__super__.onDestroy.call(this,a),i.promiseLock(this,n.promiseTypes.delete,void 0,void 0,function(a){return function(){return i.each(a.scope.plurals.values(),function(a){if(null!=a)return a.destroy(!1)},i.chunkSizeFrom(a.scope.cleanchunk,!1)).then(function(){return null!=a.gManager&&a.gManager.destroy(),a.plurals.removeAll(),a.plurals!==a.scope.plurals&&console.error("plurals out of sync for MarkersParentModel"),a.scope.pluralsUpdate.updateCtr+=1})}}(this))},l.prototype.maybeExecMappedEvent=function(a,b){var d,e;if(!this.scope.$$destroyed)return e=this.scope.typeEvents||this.scope.clusterEvents,c.isFunction(null!=e?e[b]:void 0)&&(d=this.mapTypeToPlurals(a),this.origTypeEvents[b])?this.origTypeEvents[b](d.group,d.mapped):void 0},l.prototype.mapTypeToPlurals=function(a){var b,d,e;return c.isArray(a)?b=a:c.isFunction(a.getMarkers)&&(b=a.getMarkers()),null==b?void p.error("Unable to map event as we cannot find the array group to map"):(d=(null!=(e=this.scope.plurals.values())?e.length:void 0)?b.map(function(a){return function(b){return a.scope.plurals.get(b.key).model}}(this)):[],{cluster:a,mapped:d,group:a})},l.prototype.getItem=function(a,b,c){return"models"===b?a[b][c]:a[b].get(c)},l}(e)}])}.call(this),function(){["Polygon","Polyline"].forEach(function(a){return b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmap"+a+"sParentModel",["uiGmapBasePolysParentModel","uiGmap"+a+"ChildModel","uiGmapI"+a,function(b,c,d){return b(d,c,a)}])})}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapRectangleParentModel",["uiGmapLogger","uiGmapGmapUtil","uiGmapEventsHelper","uiGmapRectangleOptionsBuilder",function(b,d,e,f){var g;return g=function(f){function g(a,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;this.scope=a,this.attrs=e,this.gMap=f,this.DEFAULTS=g,h=void 0,k=!1,p=[],o=void 0,l=function(a){return function(){if(a.isTrue(a.attrs.fit))return a.fitMapBounds(a.gMap,h)}}(this),j=function(a){return function(){var c,d,e;return null!=a.scope.bounds&&null!=(null!=(c=a.scope.bounds)?c.sw:void 0)&&null!=(null!=(d=a.scope.bounds)?d.ne:void 0)&&a.validateBoundPoints(a.scope.bounds)?(h=a.convertBoundPoints(a.scope.bounds),b.info("new new bounds created: "+JSON.stringify(h))):null!=a.scope.bounds.getNorthEast&&null!=a.scope.bounds.getSouthWest?h=a.scope.bounds:null!=a.scope.bounds?b.error("Invalid bounds for newValue: "+JSON.stringify(null!=(e=a.scope)?e.bounds:void 0)):void 0}}(this),j(),m=new google.maps.Rectangle(this.buildOpts(h)),b.info("gObject (rectangle) created: "+m),q=!1,r=function(a){return function(){var b,c,d;if(b=m.getBounds(),c=b.getNorthEast(),d=b.getSouthWest(),!q)return a.scope.$evalAsync(function(a){if(null!=a.bounds&&null!=a.bounds.sw&&null!=a.bounds.ne&&(a.bounds.ne={latitude:c.lat(),longitude:c.lng()},a.bounds.sw={latitude:d.lat(),longitude:d.lng()}),null!=a.bounds.getNorthEast&&null!=a.bounds.getSouthWest)return a.bounds=b})}}(this),n=function(a){return function(){return l(),a.removeEvents(p),p.push(google.maps.event.addListener(m,"dragstart",function(){return k=!0})),p.push(google.maps.event.addListener(m,"dragend",function(){return k=!1,r()})),p.push(google.maps.event.addListener(m,"bounds_changed",function(){if(!k)return r()}))}}(this),i=function(a){return function(){return a.removeEvents(p),null!=o&&a.removeEvents(o),m.setMap(null)}}(this),null!=h&&n(),this.scope.$watch("bounds",function(a,b){var d;if(!(c.isEqual(a,b)&&null!=h||k))return q=!0,null==a?void i():(null==h?d=!0:l(),j(),m.setBounds(h),q=!1,d&&null!=h?n():void 0)},!0),this.setMyOptions=function(a){return function(b,d){if(!c.isEqual(b,d)&&null!=h&&null!=b)return m.setOptions(a.buildOpts(h))}}(this),this.props.push("bounds"),this.watchProps(this.props),null!=this.attrs.events&&(o=this.setEvents(m,this.scope,this.scope),this.scope.$watch("events",function(a){return function(b,d){if(!c.isEqual(b,d))return null!=o&&a.removeEvents(o),o=a.setEvents(m,a.scope,a.scope)}}(this))),this.scope.$on("$destroy",function(){return i()}),b.info(this)}return a(g,f),g.include(d),g.include(e),g}(f)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapSearchBoxParentModel",["uiGmapBaseObject","uiGmapLogger","uiGmapEventsHelper",function(d,e,f){var g;return g=function(d){function g(c,d,f,g,h,i,j){var k;return this.scope=c,this.element=d,this.attrs=f,this.gMap=g,this.ctrlPosition=h,this.template=i,this.$log=null!=j?j:e,this.setVisibility=a(this.setVisibility,this),this.getBounds=a(this.getBounds,this),this.setBounds=a(this.setBounds,this),this.createSearchBox=a(this.createSearchBox,this),this.addToParentDiv=a(this.addToParentDiv,this),this.addAsMapControl=a(this.addAsMapControl,this),this.init=a(this.init,this),null==this.attrs.template?void this.$log.error("template attribute for the search-box directive is mandatory. Places Search Box creation aborted!!"):(b.isUndefined(this.scope.options)&&(this.scope.options={},this.scope.options.visible=!0),b.isUndefined(this.scope.options.visible)&&(this.scope.options.visible=!0),b.isUndefined(this.scope.options.autocomplete)&&(this.scope.options.autocomplete=!1),this.visible=this.scope.options.visible,this.autocomplete=this.scope.options.autocomplete,k=b.element("
"),k.append(this.template),this.input=k.find("input")[0],void this.init())}return c(g,d),g.include(f),g.prototype.init=function(){return this.createSearchBox(),this.scope.$watch("options",function(a){return function(c,d){if(b.isObject(c)&&(null!=c.bounds&&a.setBounds(c.bounds),null!=c.visible&&a.visible!==c.visible))return a.setVisibility(c.visible)}}(this),!0),null!=this.attrs.parentdiv?this.addToParentDiv():this.addAsMapControl(),this.visible||this.setVisibility(this.visible),this.autocomplete?this.listener=google.maps.event.addListener(this.gObject,"place_changed",function(a){return function(){return a.places=a.gObject.getPlace()}}(this)):this.listener=google.maps.event.addListener(this.gObject,"places_changed",function(a){return function(){return a.places=a.gObject.getPlaces()}}(this)),this.listeners=this.setEvents(this.gObject,this.scope,this.scope),this.$log.info(this),this.scope.$on("$stateChangeSuccess",function(a){return function(){if(null!=a.attrs.parentdiv)return a.addToParentDiv()}}(this)),this.scope.$on("$destroy",function(a){return function(){return a.gObject=null}}(this))},g.prototype.addAsMapControl=function(){return this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input)},g.prototype.addToParentDiv=function(){var a;if(this.parentDiv=b.element(document.getElementById(this.scope.parentdiv)),null!=(a=this.parentDiv)?a.length:void 0)return this.parentDiv.append(this.input)},g.prototype.createSearchBox=function(){return this.autocomplete?this.gObject=new google.maps.places.Autocomplete(this.input,this.scope.options):this.gObject=new google.maps.places.SearchBox(this.input,this.scope.options)},g.prototype.setBounds=function(a){if(b.isUndefined(a.isEmpty))this.$log.error("Error: SearchBoxParentModel setBounds. Bounds not an instance of LatLngBounds.");else if(a.isEmpty()===!1&&null!=this.gObject)return this.gObject.setBounds(a)},g.prototype.getBounds=function(){return this.gObject.getBounds()},g.prototype.setVisibility=function(a){return null!=this.attrs.parentdiv?a===!1?this.parentDiv.addClass("ng-hide"):this.parentDiv.removeClass("ng-hide"):a===!1?this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].clear():this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input),this.visible=a},g}(d)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapWindowsParentModel",["uiGmapIWindowParentModel","uiGmapModelsWatcher","uiGmapPropMap","uiGmapWindowChildModel","uiGmapLinked","uiGmap_async","uiGmapLogger","$timeout","$compile","$http","$templateCache","$interpolate","uiGmapPromise","uiGmapIWindow","uiGmapGmapUtil",function(e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){var t;return t=function(e){function t(b,d,e,f,h,j){this.gMap=h,this.markersScope=j,this.modelKeyComparison=a(this.modelKeyComparison,this), +this.interpolateContent=a(this.interpolateContent,this),this.setChildScope=a(this.setChildScope,this),this.createWindow=a(this.createWindow,this),this.setContentKeys=a(this.setContentKeys,this),this.pieceMeal=a(this.pieceMeal,this),this.createAllNew=a(this.createAllNew,this),this.watchIdKey=a(this.watchIdKey,this),this.createChildScopes=a(this.createChildScopes,this),this.watchOurScope=a(this.watchOurScope,this),this.watchDestroy=a(this.watchDestroy,this),this.onDestroy=a(this.onDestroy,this),this.rebuildAll=a(this.rebuildAll,this),this.doINeedToWipe=a(this.doINeedToWipe,this),this.watchModels=a(this.watchModels,this),this.go=a(this.go,this),t.__super__.constructor.call(this,b,d,e,f,l,m,n,o),this.interface=r,this.plurals=new g,c.each(r.scopeKeys,function(a){return function(b){return a[b+"Key"]=void 0}}(this)),this.linked=new i(b,d,e,f),this.contentKeys=void 0,this.isIconVisibleOnClick=void 0,this.firstTime=!0,this.firstWatchModels=!0,this.$log.info(self),this.parentScope=void 0,this.go(b)}return d(t,e),t.include(f),t.prototype.go=function(a){return this.watchOurScope(a),this.doRebuildAll=null!=this.scope.doRebuildAll&&this.scope.doRebuildAll,a.$watch("doRebuildAll",function(a){return function(b,c){if(b!==c)return a.doRebuildAll=b}}(this)),this.createChildScopes()},t.prototype.watchModels=function(a){var b;return b=null!=this.markersScope?"pluralsUpdate":"models",a.$watch(b,function(b){return function(d,e){var f;if(!c.isEqual(d,e)||b.firstWatchModels)return b.firstWatchModels=!1,b.doRebuildAll||b.doINeedToWipe(a.models)?b.rebuildAll(a,!0,!0):(f=0===b.plurals.length,null!=b.existingPieces?c.last(b.existingPieces._content).then(function(){return b.createChildScopes(f)}):b.createChildScopes(f))}}(this),!0)},t.prototype.doINeedToWipe=function(a){var b;return b=null==a||0===a.length,this.plurals.length>0&&b},t.prototype.rebuildAll=function(a,b,c){return this.onDestroy(c).then(function(a){return function(){if(b)return a.createChildScopes()}}(this))},t.prototype.onDestroy=function(a){return t.__super__.onDestroy.call(this,this.scope),j.promiseLock(this,q.promiseTypes.delete,void 0,void 0,function(a){return function(){return j.each(a.plurals.values(),function(a){return a.destroy(!0)},j.chunkSizeFrom(a.scope.cleanchunk,!1)).then(function(){var b;return null!=(b=a.plurals)?b.removeAll():void 0})}}(this))},t.prototype.watchDestroy=function(a){return a.$on("$destroy",function(b){return function(){return b.firstWatchModels=!0,b.firstTime=!0,b.rebuildAll(a,!1,!0)}}(this))},t.prototype.watchOurScope=function(a){return c.each(r.scopeKeys,function(b){return function(c){var d;return d=c+"Key",b[d]="function"==typeof a[c]?a[c]():a[c]}}(this))},t.prototype.createChildScopes=function(a){var c,d,e;return null==a&&(a=!0),this.isIconVisibleOnClick=!0,b.isDefined(this.linked.attrs.isiconvisibleonclick)&&(this.isIconVisibleOnClick=this.linked.scope.isIconVisibleOnClick),c=b.isUndefined(this.linked.scope.models),!c||void 0!==this.markersScope&&void 0!==(null!=(d=this.markersScope)?d.plurals:void 0)&&void 0!==(null!=(e=this.markersScope)?e.models:void 0)?null!=this.gMap?null!=this.linked.scope.models?(this.watchIdKey(this.linked.scope),a?this.createAllNew(this.linked.scope,!1):this.pieceMeal(this.linked.scope,!1)):(this.parentScope=this.markersScope,this.watchIdKey(this.parentScope),a?this.createAllNew(this.markersScope,!0,"plurals",!1):this.pieceMeal(this.markersScope,!0,"plurals",!1)):void 0:void this.$log.error("No models to create windows from! Need direct models or models derived from markers!")},t.prototype.watchIdKey=function(a){return this.setIdKey(a),a.$watch("idKey",function(b){return function(c,d){if(c!==d&&null==c)return b.idKey=c,b.rebuildAll(a,!0,!0)}}(this))},t.prototype.createAllNew=function(a,b,c,d){var e;if(null==c&&(c="models"),null==d&&(d=!1),this.firstTime&&(this.watchModels(a),this.watchDestroy(a)),this.setContentKeys(a.models),!this.didQueueInitPromise(this,a))return e=null,j.promiseLock(this,q.promiseTypes.create,"createAllNew",function(a){return e=a},function(d){return function(){return j.each(a.models,function(f){var g,h;return g=b&&null!=(h=d.getItem(a,c,f[d.idKey]))?h.gObject:void 0,e||(!g&&d.markersScope&&k.error("Unable to get gMarker from markersScope!"),d.createWindow(f,g,d.gMap)),e},j.chunkSizeFrom(a.chunk)).then(function(){return d.firstTime=!1})}}(this))},t.prototype.pieceMeal=function(a,b,c,d){var e,f;if(null==c&&(c="models"),null==d&&(d=!0),!a.$$destroyed)return e=null,f=null,null!=a&&this.modelsLength()&&this.plurals.length?j.promiseLock(this,q.promiseTypes.update,"pieceMeal",function(a){return e=a},function(b){return function(){return q.promise(function(){return b.figureOutState(b.idKey,a,b.plurals,b.modelKeyComparison)}).then(function(c){return f=c,j.each(f.removals,function(a){if(null!=a)return b.plurals.remove(a.id),null!=a.destroy&&a.destroy(!0),e},j.chunkSizeFrom(a.chunk))}).then(function(){return j.each(f.adds,function(d){var f,g;if(f=null!=(g=b.getItem(a,c,d[b.idKey]))?g.gObject:void 0,!f)throw"Gmarker undefined";return b.createWindow(d,f,b.gMap),e})}).then(function(){return j.each(f.updates,function(a){return b.updateChild(a.child,a.model),e},j.chunkSizeFrom(a.chunk))})}}(this)):(k.debug("pieceMeal: rebuildAll"),this.rebuildAll(this.scope,!0,!0))},t.prototype.setContentKeys=function(a){if(this.modelsLength(a))return this.contentKeys=Object.keys(a[0])},t.prototype.createWindow=function(a,b,c){var d,e,f,g,i,j;return e=this.linked.scope.$new(!1),this.setChildScope(e,a),e.$watch("model",function(a){return function(b,c){if(b!==c)return a.setChildScope(e,b)}}(this),!0),f={html:function(b){return function(){return b.interpolateContent(b.linked.element.html(),a)}}(this)},this.DEFAULTS=this.scopeOrModelVal(this.optionsKey,this.scope,a)||{},g=this.createWindowOptions(b,e,f.html(),this.DEFAULTS),d=new h({model:a,scope:e,opts:g,isIconVisibleOnClick:this.isIconVisibleOnClick,gMap:c,markerScope:null!=(i=this.markersScope)&&null!=(j=i.plurals.get(a[this.idKey]))?j.scope:void 0,element:f,needToManualDestroy:!1,markerIsVisibleAfterWindowClose:!0,isScopeModel:!0}),null==a[this.idKey]?void this.$log.error("Window model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."):(this.plurals.put(a[this.idKey],d),d)},t.prototype.setChildScope=function(a,b){return c.each(r.scopeKeys,function(c){return function(d){var e,f;if(e=d+"Key",f="self"===c[e]?b:b[c[e]],f!==a[d])return a[d]=f}}(this)),a.model=b},t.prototype.interpolateContent=function(a,b){var c,d,e,f,g,h;if(void 0!==this.contentKeys&&0!==this.contentKeys.length){for(c=p(a),e={},h=this.contentKeys,d=0,g=h.length;d"),o=function(a,b,c){return c&&(b[0].index=c),a.controls[google.maps.ControlPosition[n]].push(b[0])},j?l(function(a){return k.append(a),o(d,k.children(),m)}):e.get(a.template,{cache:f}).then(function(c){var d,e,f;return d=c.data,f=a.$new(),k.append(d),b.isDefined(a.controller)&&(e=h(a.controller,{$scope:f}),k.children().data("$ngControllerController",e)),i=g(k.children())(f)}).catch(function(a){return c.$log.error("mapControl: template could not be found")}).then(function(){return o(d,i,m)})}):void c.$log.error("mapControl: invalid position property")}}(this))},k}(d)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapDragZoom",["uiGmapCtrlHandle","uiGmapPropertyAction",function(a,b){return{restrict:"EMA",transclude:!0,template:'',require:"^uiGmapGoogleMap",scope:{keyboardkey:"=",options:"=",spec:"="},controller:["$scope","$element",function(b,d){return b.ctrlType="uiGmapDragZoom",c.extend(this,a.handle(b,d))}],link:function(c,d,e,f){return a.mapPromise(c,f).then(function(a){var d,e,f;return d=function(b){return a.enableKeyDragZoom(b)},e=new b(function(a,b){return b?d({key:b}):d()}),f=new b(function(a,b){if(b)return d(b)}),c.$watch("keyboardkey",e.sic("keyboardkey")),e.sic(c.keyboardkey),c.$watch("options",f.sic("options")),f.sic(c.options)})}}}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapDrawingManager",["uiGmapIDrawingManager","uiGmapDrawingManagerParentModel",function(a,b){return c.extend(a,{link:function(a,c,d,e){return e.getScope().deferred.promise.then(function(e){return new b(a,c,d,e)})}})}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapApiFreeDrawPolygons",["uiGmapLogger","uiGmapBaseObject","uiGmapCtrlHandle","uiGmapDrawFreeHandChildModel","uiGmapLodash",function(b,e,f,g,h){var i;return i=function(e){function i(){return this.link=a(this.link,this),i.__super__.constructor.apply(this,arguments)}return d(i,e),i.include(f),i.prototype.restrict="EMA",i.prototype.replace=!0,i.prototype.require="^uiGmapGoogleMap",i.prototype.scope={polygons:"=",draw:"="},i.prototype.link=function(a,d,e,f){return this.mapPromise(a,f).then(function(d){return function(d){var e,i;return a.polygons?c.isArray(a.polygons)?(e=new g(d,f.getScope()),i=void 0,a.draw=function(){return"function"==typeof i&&i(),e.engage(a.polygons).then(function(){var b;return b=!0,i=a.$watchCollection("polygons",function(a,c){var d;return b||a===c?void(b=!1):(d=h.differenceObjects(c,a),d.forEach(function(a){return a.setMap(null)}))})})}):b.error("Free Draw Polygons must be of type Array!"):b.error("No polygons to bind to!")}}(this))},i}(e)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapICircle",[function(){return{restrict:"EA",replace:!0,require:"^uiGmapGoogleMap",scope:{center:"=center",radius:"=radius",stroke:"=stroke",fill:"=fill",clickable:"=",draggable:"=",editable:"=",geodesic:"=",icons:"=icons",visible:"=",events:"=",control:"=",zIndex:"=zindex"}}}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIControl",["uiGmapBaseObject","uiGmapLogger","uiGmapCtrlHandle",function(b,c,d){var e;return e=function(b){function e(){this.restrict="EA",this.replace=!0,this.require="^uiGmapGoogleMap",this.scope={template:"@template",position:"@position",controller:"@controller",index:"@index"},this.$log=c}return a(e,b),e.extend(d),e.prototype.link=function(a,b,c,d){throw new Error("Not implemented!!")},e}(b)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapIDrawingManager",[function(){return{restrict:"EA",replace:!0,require:"^uiGmapGoogleMap",scope:{static:"@",control:"=",options:"=",events:"="}}}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIMarker",["uiGmapBaseObject","uiGmapCtrlHandle",function(b,d){var e;return e=function(b){function e(){this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.replace=!0,this.scope=c.extend(this.scope||{},e.scope)}return a(e,b),e.scope={coords:"=coords",icon:"=icon",click:"&click",options:"=options",events:"=events",fit:"=fit",idKey:"=idkey",control:"=control"},e.scopeKeys=c.keys(e.scope),e.keys=e.scopeKeys,e.extend(d),e}(b)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIPolygon",["uiGmapGmapUtil","uiGmapBaseObject","uiGmapLogger","uiGmapCtrlHandle",function(b,d,e,f){var g;return g=function(d){function g(){}return a(g,d),g.scope={path:"=path",stroke:"=stroke",clickable:"=",draggable:"=",editable:"=",geodesic:"=",fill:"=",icons:"=icons",visible:"=",static:"=",events:"=",zIndex:"=zindex",fit:"=",control:"=control"},g.scopeKeys=c.keys(g.scope),g.include(b),g.extend(f),g.prototype.restrict="EMA",g.prototype.replace=!0,g.prototype.require="^uiGmapGoogleMap",g.prototype.scope=g.scope,g.prototype.DEFAULTS={},g.prototype.$log=e,g}(d)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIPolyline",["uiGmapGmapUtil","uiGmapBaseObject","uiGmapLogger","uiGmapCtrlHandle",function(b,d,e,f){var g;return g=function(d){function g(){}return a(g,d),g.scope={path:"=",stroke:"=",clickable:"=",draggable:"=",editable:"=",geodesic:"=",icons:"=",visible:"=",static:"=",fit:"=",events:"=",zIndex:"=zindex"},g.scopeKeys=c.keys(g.scope),g.include(b),g.extend(f),g.prototype.restrict="EMA",g.prototype.replace=!0,g.prototype.require="^uiGmapGoogleMap",g.prototype.scope=g.scope,g.prototype.DEFAULTS={},g.prototype.$log=e,g}(d)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapIRectangle",[function(){return{restrict:"EMA",require:"^uiGmapGoogleMap",replace:!0,scope:{bounds:"=",stroke:"=",clickable:"=",draggable:"=",editable:"=",fill:"=",visible:"=",events:"="}}}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIWindow",["uiGmapBaseObject","uiGmapChildEvents","uiGmapCtrlHandle",function(b,d,e){var f;return f=function(b){function f(){this.restrict="EMA",this.template=void 0,this.transclude=!0,this.priority=-100,this.require="^uiGmapGoogleMap",this.replace=!0,this.scope=c.extend(this.scope||{},f.scope)}return a(f,b),f.scope={coords:"=coords",template:"=template",templateUrl:"=templateurl",templateParameter:"=templateparameter",isIconVisibleOnClick:"=isiconvisibleonclick",closeClick:"&closeclick",options:"=options",control:"=control",show:"=show"},f.scopeKeys=c.keys(f.scope),f.include(d),f.extend(e),f}(b)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMap",["$timeout","$q","$log","uiGmapGmapUtil","uiGmapBaseObject","uiGmapCtrlHandle","uiGmapIsReady","uiGmapuuid","uiGmapExtendGWin","uiGmapExtendMarkerClusterer","uiGmapGoogleMapsUtilV3","uiGmapGoogleMapApi","uiGmapEventsHelper","uiGmapGoogleMapObjectManager",function(e,f,g,h,i,j,k,l,m,n,o,p,q,r){var s,t,u;return s=void 0,u=[o,m,n],t=function(f){function i(){this.link=a(this.link,this);var b;b=function(a){var b,d;return d=void 0,a.$on("$destroy",function(){return k.decrement()}),b=j.handle(a),a.ctrlType="Map",a.deferred.promise.then(function(){return u.forEach(function(a){return a.init()})}),b.getMap=function(){return a.map},d=c.extend(this,b)},this.controller=["$scope",b]}return d(i,f),i.include(h),i.prototype.restrict="EMA",i.prototype.transclude=!0,i.prototype.replace=!1,i.prototype.template='
\n
',i.prototype.scope={center:"=",zoom:"=",dragging:"=",control:"=",options:"=",events:"=",eventOpts:"=",styles:"=",bounds:"=",update:"="},i.prototype.link=function(a,d,f){var h;return h=[],a.$on("$destroy",function(){if(q.removeEvents(h),"true"===f.recycleMapInstance&&a.map)return r.recycleMapInstance(a.map),a.map=null}),a.idleAndZoomChanged=!1,p.then(function(i){return function(j){var m,n,o,p,t,u,v,w,x,y,z,A,B,C,D,E,F;if(s={mapTypeId:j.MapTypeId.ROADMAP},C=k.spawn(),A=function(){return C.deferred.resolve({instance:C.instance,map:m})},!b.isDefined(a.center)&&!b.isDefined(a.bounds))return void g.error("angular-google-maps: a center or bounds property is required");if(b.isDefined(a.center)||(a.center=new google.maps.LatLngBounds(i.getCoords(a.bounds.southwest),i.getCoords(a.bounds.northeast)).getCenter()),b.isDefined(a.zoom)||(a.zoom=10),t=b.element(d),t.addClass("angular-google-map"),y={options:{}},f.options&&(y.options=a.options),f.styles&&(y.styles=a.styles),f.type&&(D=f.type.toUpperCase(),google.maps.MapTypeId.hasOwnProperty(D)?y.mapTypeId=google.maps.MapTypeId[f.type.toUpperCase()]:g.error("angular-google-maps: invalid map type '"+f.type+"'")),w=b.extend({},s,y,{center:i.getCoords(a.center),zoom:a.zoom,bounds:a.bounds}),m="true"===f.recycleMapInstance?r.createMapInstance(t.find("div")[1],w):new google.maps.Map(t.find("div")[1],w),m.uiGmap_id=l.generate(),p=!1,h.push(google.maps.event.addListenerOnce(m,"idle",function(){return a.deferred.resolve(m),A()})),o=f.events&&null!=(null!=(z=a.events)?z.blacklist:void 0)?a.events.blacklist:[],c.isString(o)&&(o=[o]),x=function(b,d,e){if(!c.includes(o,b))return e&&e(),h.push(google.maps.event.addListener(m,b,function(){var b;if(!(null!=(b=a.update)?b.lazy:void 0))return d()}))},c.includes(o,"all")||(x("dragstart",function(){return p=!0,a.$evalAsync(function(a){if(null!=a.dragging)return a.dragging=p})}),x("dragend",function(){return p=!1,a.$evalAsync(function(a){if(null!=a.dragging)return a.dragging=p})}),E=function(d,e){var f,g;if(null==d&&(d=m.center),null==e&&(e=a),!c.includes(o,"center"))if(f=d.lat(),g=d.lng(),b.isDefined(e.center.type)){if(e.center.coordinates[1]!==f&&(e.center.coordinates[1]=f),e.center.coordinates[0]!==g)return e.center.coordinates[0]=g}else if(e.center.latitude!==f&&(e.center.latitude=f),e.center.longitude!==g)return e.center.longitude=g},B=!1,x("idle",function(){var b,d,e;return b=m.getBounds(),d=b.getNorthEast(),e=b.getSouthWest(),B=!0,a.$evalAsync(function(b){return E(),c.isUndefined(b.bounds)||c.includes(o,"bounds")||(b.bounds.northeast={latitude:d.lat(),longitude:d.lng()},b.bounds.southwest={latitude:e.lat(),longitude:e.lng()}),c.includes(o,"zoom")||(b.zoom=m.zoom,a.idleAndZoomChanged=!a.idleAndZoomChanged),B=!1})})),b.isDefined(a.events)&&null!==a.events&&b.isObject(a.events)){v=function(b){return function(){return a.events[b].apply(a,[m,b,arguments])}},n=[];for(u in a.events)a.events.hasOwnProperty(u)&&b.isFunction(a.events[u])&&n.push(google.maps.event.addListener(m,u,v(u)));h.concat(n)}return m.getOptions=function(){return w},a.map=m,null!=f.control&&null!=a.control&&(a.control.refresh=function(a){var b,c,d;if(null!=m)return null!=("undefined"!=typeof google&&null!==google&&null!=(c=google.maps)&&null!=(d=c.event)?d.trigger:void 0)&&null!=m&&google.maps.event.trigger(m,"resize"),null!=(null!=a?a.latitude:void 0)&&null!=(null!=a?a.longitude:void 0)?(b=i.getCoords(a),i.isTrue(f.pan)?m.panTo(b):m.setCenter(b)):void 0},a.control.getGMap=function(){return m},a.control.getMapOptions=function(){return w},a.control.getCustomEventListeners=function(){return n},a.control.removeEvents=function(a){return q.removeEvents(a)}),a.$watch("center",function(b,c){var d;if(b!==c&&!B&&(d=i.getCoords(a.center),d.lat()!==m.center.lat()||d.lng()!==m.center.lng()))return p?void 0:(i.validateCoords(b)||g.error("Invalid center for newValue: "+JSON.stringify(b)),i.isTrue(f.pan)&&a.zoom===m.zoom?m.panTo(d):m.setCenter(d))},!0),F=null,a.$watch("zoom",function(b,d){var f,g;if(null!=b&&!c.isEqual(b,d)&&(null!=m?m.getZoom():void 0)!==(null!=a?a.zoom:void 0)&&!B)return null!=F&&e.cancel(F),F=e(function(){return m.setZoom(b)},(null!=(f=a.eventOpts)&&null!=(g=f.debounce)?g.zoomMs:void 0)+20,!1)}),a.$watch("bounds",function(a,b){var c,d,e,f,h,i,j;if(a!==b)return null==(null!=a&&null!=(e=a.northeast)?e.latitude:void 0)||null==(null!=a&&null!=(f=a.northeast)?f.longitude:void 0)||null==(null!=a&&null!=(h=a.southwest)?h.latitude:void 0)||null==(null!=a&&null!=(i=a.southwest)?i.longitude:void 0)?void g.error("Invalid map bounds for new value: "+JSON.stringify(a)):(d=new google.maps.LatLng(a.northeast.latitude,a.northeast.longitude),j=new google.maps.LatLng(a.southwest.latitude,a.southwest.longitude),c=new google.maps.LatLngBounds(j,d),m.fitBounds(c))}),["options","styles"].forEach(function(b){return a.$watch(b,function(a,d){if(!c.isEqual(a,d))return"options"===b?y.options=a:y.options[b]=a,null!=m?m.setOptions(y):void 0},!0)})}}(this))},i}(i)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMarker",["uiGmapIMarker","uiGmapMarkerChildModel","uiGmapMarkerManager","uiGmapLogger",function(b,d,e,f){var g;return g=function(g){function h(){h.__super__.constructor.call(this),this.template='',f.info(this)}return a(h,g),h.prototype.controller=["$scope","$element",function(a,d){return a.ctrlType="Marker",c.extend(this,b.handle(a,d))}],h.prototype.link=function(a,f,g,h){var i;return i=b.mapPromise(a,h),i.then(function(f){var g,h,i;if(g=new e(f),h=c.object(b.keys,b.keys),i=new d({scope:a,model:a,keys:h,gMap:f,doClick:!0,gManager:g,doDrawSelf:!1,trackModel:!1}),i.deferred.promise.then(function(b){return a.deferred.resolve(b)}),null!=a.control)return a.control.getGMarkers=g.getGMarkers}),a.$on("$destroy",function(){var a;return"undefined"!=typeof a&&null!==a&&a.clear(),a=null})},h}(b)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMarkers",["uiGmapIMarker","uiGmapPlural","uiGmapMarkersParentModel","uiGmap_sync","uiGmapLogger",function(b,d,e,f,g){var h;return h=function(f){function h(){h.__super__.constructor.call(this),this.template='',d.extend(this,{doCluster:"=?docluster",clusterOptions:"=clusteroptions",clusterEvents:"=clusterevents",modelsByRef:"=modelsbyref",type:"=?type",typeOptions:"=?typeoptions",typeEvents:"=?typeevents",deepComparison:"=?deepcomparison"}),g.info(this)}return a(h,f),h.prototype.controller=["$scope","$element",function(a,d){return a.ctrlType="Markers",c.extend(this,b.handle(a,d))}],h.prototype.link=function(a,f,g,h){var i,j;return i=void 0,j=function(){return a.deferred.resolve()},b.mapPromise(a,h).then(function(b){var k;return k=h.getScope(),k.$watch("idleAndZoomChanged",function(){return c.defer(i.gManager.draw)}),i=new e(a,f,g,b),d.link(a,i),null!=a.control&&(a.control.getGMarkers=function(){var a;return null!=(a=i.gManager)?a.getGMarkers():void 0},a.control.getChildMarkers=function(){return i.plurals}),c.last(i.existingPieces._content).then(function(){return j()})})},h}(b)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapPlural",[function(){var a;return a=function(a,b){if(null!=a.control)return a.control.updateModels=function(c){return a.models=c,b.createChildScopes(!1)},a.control.newModels=function(c){return a.models=c,b.rebuildAll(a,!0,!0)},a.control.clean=function(){return b.rebuildAll(a,!1,!0)},a.control.getPlurals=function(){return b.plurals},a.control.getManager=function(){return b.gManager},a.control.hasManager=function(){return null!=b.gManager==!0},a.control.managerDraw=function(){var b;if(a.control.hasManager())return null!=(b=a.control.getManager())?b.draw():void 0}},{extend:function(a,b){return c.extend(a.scope||{},b||{},{idKey:"=idkey",doRebuildAll:"=dorebuildall",models:"=models",chunk:"=chunk",cleanchunk:"=cleanchunk",control:"=control",deepComparison:"=deepcomparison"})},link:function(b,c){return a(b,c)}}}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolygon",["uiGmapIPolygon","$timeout","uiGmapPolygonChildModel",function(b,d,e){var f;return f=function(d){function f(){return this.link=a(this.link,this),f.__super__.constructor.apply(this,arguments)}return c(f,d),f.prototype.link=function(a,c,d,f){var g,h;return g=[],h=b.mapPromise(a,f),null!=a.control&&(a.control.getInstance=this,a.control.polygons=g,a.control.promise=h),h.then(function(b){return function(c){return g.push(new e({scope:a,attrs:d,gMap:c,defaults:b.DEFAULTS}))}}(this))},f}(b)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolygons",["uiGmapIPolygon","$timeout","uiGmapPolygonsParentModel","uiGmapPlural",function(d,e,f,g){var h;return h=function(d){function e(){this.link=a(this.link,this),e.__super__.constructor.call(this),g.extend(this),this.$log.info(this)}return c(e,d),e.prototype.link=function(a,c,d,e){return e.getScope().deferred.promise.then(function(e){return function(h){return(b.isUndefined(a.path)||null===a.path)&&e.$log.warn("polygons: no valid path attribute found"),a.models||e.$log.warn("polygons: no models found to create from"),g.link(a,new f(a,c,d,h,e.DEFAULTS))}}(this))},e}(d)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolyline",["uiGmapIPolyline","$timeout","uiGmapPolylineChildModel",function(d,e,f){var g;return g=function(e){function g(){return this.link=a(this.link,this),g.__super__.constructor.apply(this,arguments)}return c(g,e),g.prototype.link=function(a,c,e,g){return d.mapPromise(a,g).then(function(c){return function(d){return!b.isUndefined(a.path)&&null!==a.path&&c.validatePath(a.path)||c.$log.warn("polyline: no valid path attribute found"),new f({scope:a,attrs:e,gMap:d,defaults:c.DEFAULTS})}}(this))},g}(d)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolylines",["uiGmapIPolyline","$timeout","uiGmapPolylinesParentModel","uiGmapPlural",function(d,e,f,g){var h;return h=function(d){function e(){this.link=a(this.link,this),e.__super__.constructor.call(this),g.extend(this),this.$log.info(this)}return c(e,d),e.prototype.link=function(a,c,d,e){return e.getScope().deferred.promise.then(function(e){return function(h){return(b.isUndefined(a.path)||null===a.path)&&e.$log.warn("polylines: no valid path attribute found"),a.models||e.$log.warn("polylines: no models found to create from"),g.link(a,new f(a,c,d,h,e.DEFAULTS))}}(this))},e}(d)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapRectangle",["uiGmapLogger","uiGmapGmapUtil","uiGmapIRectangle","uiGmapRectangleParentModel",function(a,b,d,e){return c.extend(d,{link:function(a,b,c,d){return d.getScope().deferred.promise.then(function(d){return new e(a,b,c,d)})}})}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapWindow",["uiGmapIWindow","uiGmapGmapUtil","uiGmapWindowChildModel","uiGmapLodash","uiGmapLogger",function(d,e,f,g,h){var i;return i=function(i){function j(){this.link=a(this.link,this),j.__super__.constructor.call(this),this.require=["^uiGmapGoogleMap","^?uiGmapMarker"],this.template='',h.debug(this),this.childWindows=[]}return c(j,i),j.include(e),j.prototype.link=function(a,c,e,f){var g,h;return g=f.length>1&&null!=f[1]?f[1]:void 0,h=null!=g?g.getScope():void 0,this.mapPromise=d.mapPromise(a,f[0]),this.mapPromise.then(function(d){return function(f){var i;return i=!0,b.isDefined(e.isiconvisibleonclick)&&(i=a.isIconVisibleOnClick),g?h.deferred.promise.then(function(b){return d.init(a,c,i,f,h)}):void d.init(a,c,i,f)}}(this))},j.prototype.init=function(a,b,c,d,e){var h,i,j,k,l;if(i=null!=a.options?a.options:{},k=null!=a&&this.validateCoords(a.coords),null!=(null!=e?e.getGMarker:void 0)&&(j=e.getGMarker()),l=k?this.createWindowOptions(j,a,b.html(),i):i,null!=d&&(h=new f({scope:a,opts:l,isIconVisibleOnClick:c,gMap:d,markerScope:e,element:b}),this.childWindows.push(h),a.$on("$destroy",function(a){return function(){return a.childWindows=g.withoutObjects(a.childWindows,[h],function(a,b){return a.scope.$id===b.scope.$id}),a.childWindows.length=0}}(this))),null!=a.control&&(a.control.getGWindows=function(a){return function(){return a.childWindows.map(function(a){return a.gObject})}}(this),a.control.getChildWindows=function(a){return function(){return a.childWindows}}(this),a.control.getPlurals=a.control.getChildWindows,a.control.showWindow=function(a){return function(){return a.childWindows.map(function(a){return a.showWindow()})}}(this),a.control.hideWindow=function(a){return function(){return a.childWindows.map(function(a){return a.hideWindow()})}}(this)),null!=this.onChildCreation&&null!=h)return this.onChildCreation(h)},j}(d)}])}.call(this),function(){var a=function(a,b){return function(){ +return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapWindows",["uiGmapIWindow","uiGmapPlural","uiGmapWindowsParentModel","uiGmapPromise","uiGmapLogger",function(b,d,e,f,g){var h;return h=function(b){function h(){this.link=a(this.link,this),h.__super__.constructor.call(this),this.require=["^uiGmapGoogleMap","^?uiGmapMarkers"],this.template='',d.extend(this),g.debug(this)}return c(h,b),h.prototype.link=function(a,b,c,d){var e,g,h;return e=d[0].getScope(),g=d.length>1&&null!=d[1]?d[1]:void 0,h=null!=g?g.getScope():void 0,e.deferred.promise.then(function(e){return function(g){var i,j;return i=(null!=h&&null!=(j=h.deferred)?j.promise:void 0)||f.resolve(),i.then(function(){var f,i;return f=null!=(i=e.parentModel)?i.existingPieces:void 0,f?f.then(function(){return e.init(a,b,c,d,g,h)}):e.init(a,b,c,d,g,h)})}}(this))},h.prototype.init=function(a,b,c,f,g,h){var i;if(i=new e(a,b,c,f,g,h),d.link(a,i),null!=a.control)return a.control.getGWindows=function(){return i.plurals.map(function(a){return a.gObject})},a.control.getChildWindows=function(){return i.plurals}},h}(b)}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapGoogleMap",["uiGmapMap",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapMarker",["$timeout","uiGmapMarker",function(a,b){return new b(a)}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapMarkers",["$timeout","uiGmapMarkers",function(a,b){return new b(a)}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapPolygon",["uiGmapPolygon",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapCircle",["uiGmapCircle",function(a){return a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapPolyline",["uiGmapPolyline",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapPolylines",["uiGmapPolylines",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapRectangle",["uiGmapLogger","uiGmapRectangle",function(a,b){return b}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapWindow",["$timeout","$compile","$http","$templateCache","uiGmapWindow",function(a,b,c,d,e){return new e(a,b,c,d)}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapWindows",["$timeout","$compile","$http","$templateCache","$interpolate","uiGmapWindows",function(a,b,c,d,e,f){return new f(a,b,c,d,e)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps").directive("uiGmapLayer",["$timeout","uiGmapLogger","uiGmapLayerParentModel",function(b,c,d){var e;return new(e=function(){function b(){this.link=a(this.link,this),this.$log=c,this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.template="",this.replace=!0,this.scope={show:"=show",type:"=type",namespace:"=namespace",options:"=options",onCreated:"&oncreated"}}return b.prototype.link=function(a,b,c,e){return e.getScope().deferred.promise.then(function(e){return function(e){return null!=a.onCreated?new d(a,b,c,e,a.onCreated):new d(a,b,c,e)}}(this))},b}())}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapMapControl",["uiGmapControl",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapDragZoom",["uiGmapDragZoom",function(a){return a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapDrawingManager",["uiGmapDrawingManager",function(a){return a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapFreeDrawPolygons",["uiGmapApiFreeDrawPolygons",function(a){return new a}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps").directive("uiGmapMapType",["$timeout","uiGmapLogger","uiGmapMapTypeParentModel",function(b,c,d){var e;return new(e=function(){function b(){this.link=a(this.link,this),this.$log=c,this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.template='',this.replace=!0,this.scope={show:"=show",options:"=options",refresh:"=refresh",id:"@"}}return b.prototype.link=function(a,b,c,e){return e.getScope().deferred.promise.then(function(e){return function(e){return new d(a,b,c,e)}}(this))},b}())}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps").directive("uiGmapMapTypes",["$timeout","uiGmapLogger","uiGmapMapTypesParentModel",function(b,c,d){var e;return new(e=function(){function b(){this.link=a(this.link,this),this.$log=c,this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.template='',this.scope={mapTypes:"=mapTypes",show:"=show",options:"=options",refresh:"=refresh",id:"=idKey"}}return b.prototype.link=function(a,b,c,e){return e.getScope().deferred.promise.then(function(e){return function(e){return new d(a,b,c,e)}}(this))},b}())}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapPolygons",["uiGmapPolygons",function(a){return new a}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps").directive("uiGmapSearchBox",["uiGmapGoogleMapApi","uiGmapLogger","uiGmapSearchBoxParentModel","$http","$templateCache","$compile",function(c,d,e,f,g,h){var i;return new(i=function(){function i(){this.link=a(this.link,this),this.$log=d,this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.template="",this.replace=!0,this.scope={template:"=template",events:"=events",position:"=?position",options:"=?options",parentdiv:"=?parentdiv",ngModel:"=?"}}return i.prototype.require="ngModel",i.prototype.link=function(a,d,i,j){return c.then(function(c){return function(k){return null==a.template&&(g.put("uigmap-searchbox-default.tpl.html",''),a.template="uigmap-searchbox-default.tpl.html"),f.get(a.template,{cache:g}).then(function(f){var g;return g=f.data,b.isUndefined(a.events)?void c.$log.error("searchBox: the events property is required"):j.getScope().deferred.promise.then(function(f){var j;return j=b.isDefined(a.position)?a.position.toUpperCase().replace(/-/g,"_"):"TOP_LEFT",k.ControlPosition[j]?new e(a,d,i,f,j,h(g)(a)):void c.$log.error("searchBox: invalid position property")})})}}(this))},i}())}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapShow",["$animate","uiGmapLogger",function(a,c){return{scope:{uiGmapShow:"=",uiGmapAfterShow:"&",uiGmapAfterHide:"&"},link:function(d,e){var f,g,h;return f=function(b,c){return a[b](e,"ng-hide").then(function(){return c()})},g=function(b,c){return a[b](e,"ng-hide",c)},h=function(a,d){return b.version.major>1?c.error("uiGmapShow is not supported for Angular Major greater than 1.\nYour Major is "+b.version.major+'"'):1===b.version.major&&b.version.minor<3?g(a,d):f(a,d)},d.$watch("uiGmapShow",function(a){if(a&&h("removeClass",d.uiGmapAfterShow),!a)return h("addClass",d.uiGmapAfterHide)})}}}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapStreetViewPanorama",["uiGmapGoogleMapApi","uiGmapLogger","uiGmapGmapUtil","uiGmapEventsHelper",function(a,c,d,e){var f;return f="uiGmapStreetViewPanorama",{restrict:"EMA",template:'
',replace:!0,scope:{focalcoord:"=",radius:"=?",events:"=?",options:"=?",control:"=?",povoptions:"=?",imagestatus:"="},link:function(g,h,i){return a.then(function(a){return function(a){var i,j,k,l,m,n,o,p,q,r;return p=void 0,r=void 0,k=!1,n=void 0,o=null,q=null,i=function(){if(e.removeEvents(n),null!=p&&(p.unbind("position"),p.setVisible(!1)),null!=r)return null!=(null!=r?r.setVisible:void 0)&&r.setVisible(!1),r=void 0},m=function(a,c){var d;return d=google.maps.geometry.spherical.computeHeading(a,c),k=!0,g.radius=g.radius||50,q=b.extend({heading:d,zoom:1,pitch:0},g.povoptions||{}),o=o=b.extend({navigationControl:!1,addressControl:!1,linksControl:!1,position:a,pov:q,visible:!0},g.options||{}),k=!1},j=function(){var a;return g.focalcoord?g.radius?(i(),null==r&&(r=new google.maps.StreetViewService),g.events&&(n=e.setEvents(r,g,g)),a=d.getCoords(g.focalcoord),r.getPanoramaByLocation(a,g.radius,function(b,c){var d,e,f;if(null!=g.imagestatus&&(g.imagestatus=c),null!=(null!=(f=g.events)?f.image_status_changed:void 0)&&g.events.image_status_changed(r,"image_status_changed",g,c),"OK"===c)return e=b.location.latLng,m(e,a),d=h[0],p=new google.maps.StreetViewPanorama(d,o)})):void c.error(f+": needs a radius to set the camera view from its focal target."):void c.error(f+": focalCoord needs to be defined")},null!=g.control&&(g.control.getOptions=function(){return o},g.control.getPovOptions=function(){return q},g.control.getGObject=function(){return r},g.control.getGPano=function(){return p}),g.$watch("options",function(a,b){if(a!==b&&a!==o&&!k)return j()}),l=!0,g.$watch("focalcoord",function(a,b){if((a!==b||l)&&null!=a)return l=!1,j()}),g.$on("$destroy",function(){return i()})}}(this))}}}])}.call(this),b.module("uiGmapgoogle-maps.wrapped").service("uiGmapuuid",function(){function a(){}return a.generate=function(){var b=a._gri,c=a._ha;return c(b(32),8)+"-"+c(b(16),4)+"-"+c(16384|b(12),4)+"-"+c(32768|b(14),4)+"-"+c(b(48),12)},a._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)1&d&&(c=e+c);return c},a}),b.module("uiGmapgoogle-maps.wrapped").service("uiGmapGoogleMapsUtilV3",function(){return{init:c.once(function(){+function(){function b(a,c){a.getMarkerClusterer().extend(b,google.maps.OverlayView),this.cluster_=a,this.className_=a.getMarkerClusterer().getClusterClass(),this.styles_=c,this.center_=null,this.div_=null,this.sums_=null,this.visible_=!1,this.setMap(a.getMap())}function c(a){this.markerClusterer_=a,this.map_=a.getMap(),this.gridSize_=a.getGridSize(),this.minClusterSize_=a.getMinimumClusterSize(),this.averageCenter_=a.getAverageCenter(),this.hideLabel_=a.getHideLabel(),this.markers_=[],this.center_=null,this.bounds_=null,this.clusterIcon_=new b(this,a.getStyles())}function e(a,b,c){this.extend(e,google.maps.OverlayView),b=b||[],c=c||{},this.markers_=[],this.clusters_=[],this.listeners_=[],this.activeMap_=null,this.ready_=!1,this.gridSize_=c.gridSize||60,this.minClusterSize_=c.minimumClusterSize||2,this.maxZoom_=c.maxZoom||null,this.styles_=c.styles||[],this.title_=c.title||"",this.zoomOnClick_=!0,void 0!==c.zoomOnClick&&(this.zoomOnClick_=c.zoomOnClick),this.averageCenter_=!1,void 0!==c.averageCenter&&(this.averageCenter_=c.averageCenter),this.ignoreHidden_=!1,void 0!==c.ignoreHidden&&(this.ignoreHidden_=c.ignoreHidden),this.enableRetinaIcons_=!1,void 0!==c.enableRetinaIcons&&(this.enableRetinaIcons_=c.enableRetinaIcons),this.hideLabel_=!1,void 0!==c.hideLabel&&(this.hideLabel_=c.hideLabel),this.imagePath_=c.imagePath||e.IMAGE_PATH,this.imageExtension_=c.imageExtension||e.IMAGE_EXTENSION,this.imageSizes_=c.imageSizes||e.IMAGE_SIZES,this.calculator_=c.calculator||e.CALCULATOR,this.batchSize_=c.batchSize||e.BATCH_SIZE,this.batchSizeIE_=c.batchSizeIE||e.BATCH_SIZE_IE,this.clusterClass_=c.clusterClass||"cluster",-1!==navigator.userAgent.toLowerCase().indexOf("msie")&&(this.batchSize_=this.batchSizeIE_),this.setupStyles_(),this.addMarkers(b,!0),this.setMap(a)}function f(a){a=a||{},google.maps.OverlayView.apply(this,arguments),this.content_=a.content||"",this.disableAutoPan_=a.disableAutoPan||!1,this.maxWidth_=a.maxWidth||0,this.pixelOffset_=a.pixelOffset||new google.maps.Size(0,0),this.position_=a.position||new google.maps.LatLng(0,0),this.zIndex_=a.zIndex||null,this.boxClass_=a.boxClass||"infoBox",this.boxStyle_=a.boxStyle||{},this.closeBoxMargin_=a.closeBoxMargin||"2px",this.closeBoxURL_=a.closeBoxURL||"http://www.google.com/intl/en_us/mapfiles/close.gif",""===a.closeBoxURL&&(this.closeBoxURL_=""),this.infoBoxClearance_=a.infoBoxClearance||new google.maps.Size(1,1),"undefined"==typeof a.visible&&("undefined"==typeof a.isHidden?a.visible=!0:a.visible=!a.isHidden),this.isHidden_=!a.visible,this.alignBottom_=a.alignBottom||!1,this.pane_=a.pane||"floatPane",this.enableEventPropagation_=a.enableEventPropagation||!1,this.div_=null,this.closeListener_=null,this.moveListener_=null,this.contextListener_=null,this.eventListeners_=null,this.fixedWidthSet_=null}function g(a,b){function c(){}c.prototype=b.prototype,a.superClass_=b.prototype,a.prototype=new c,a.prototype.constructor=a}function h(a,b,c){this.marker_=a,this.handCursorURL_=a.handCursorURL,this.labelDiv_=document.createElement("div"),this.labelDiv_.style.cssText="position: absolute; overflow: hidden;",this.eventDiv_=document.createElement("div"),this.eventDiv_.style.cssText=this.labelDiv_.style.cssText,this.eventDiv_.setAttribute("onselectstart","return false;"),this.eventDiv_.setAttribute("ondragstart","return false;"),this.crossDiv_=h.getSharedCross(b)}function i(a){a=a||{},a.labelContent=a.labelContent||"",a.labelAnchor=a.labelAnchor||new google.maps.Point(0,0),a.labelClass=a.labelClass||"markerLabels",a.labelStyle=a.labelStyle||{},a.labelInBackground=a.labelInBackground||!1,"undefined"==typeof a.labelVisible&&(a.labelVisible=!0),"undefined"==typeof a.raiseOnDrag&&(a.raiseOnDrag=!0),"undefined"==typeof a.clickable&&(a.clickable=!0),"undefined"==typeof a.draggable&&(a.draggable=!1),"undefined"==typeof a.optimized&&(a.optimized=!1),a.crossImage=a.crossImage||"http"+("https:"===document.location.protocol?"s":"")+"://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png",a.handCursor=a.handCursor||"http"+("https:"===document.location.protocol?"s":"")+"://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur",a.optimized=!1,this.label=new h(this,a.crossImage,a.handCursor),google.maps.Marker.apply(this,arguments)}function j(a){var b=a||{};this.ready_=!1,this.dragging_=!1,a.visible==d&&(a.visible=!0),a.shadow==d&&(a.shadow="7px -3px 5px rgba(88,88,88,0.7)"),a.anchor==d&&(a.anchor=k.BOTTOM),this.setValues(b)}b.prototype.onAdd=function(){var a,b,c=this;this.div_=document.createElement("div"),this.div_.className=this.className_,this.visible_&&this.show(),this.getPanes().overlayMouseTarget.appendChild(this.div_),this.boundsChangedListener_=google.maps.event.addListener(this.getMap(),"bounds_changed",function(){b=a}),google.maps.event.addDomListener(this.div_,"mousedown",function(){a=!0,b=!1}),google.maps.event.addDomListener(this.div_,"click",function(d){if(a=!1,!b){var e,f,g=c.cluster_.getMarkerClusterer();google.maps.event.trigger(g,"click",c.cluster_),google.maps.event.trigger(g,"clusterclick",c.cluster_),g.getZoomOnClick()&&(f=g.getMaxZoom(),e=c.cluster_.getBounds(),g.getMap().fitBounds(e),setTimeout(function(){g.getMap().fitBounds(e),null!==f&&g.getMap().getZoom()>f&&g.getMap().setZoom(f+1)},100)),d.cancelBubble=!0,d.stopPropagation&&d.stopPropagation()}}),google.maps.event.addDomListener(this.div_,"mouseover",function(){var a=c.cluster_.getMarkerClusterer();google.maps.event.trigger(a,"mouseover",c.cluster_)}),google.maps.event.addDomListener(this.div_,"mouseout",function(){var a=c.cluster_.getMarkerClusterer();google.maps.event.trigger(a,"mouseout",c.cluster_)})},b.prototype.onRemove=function(){this.div_&&this.div_.parentNode&&(this.hide(),google.maps.event.removeListener(this.boundsChangedListener_),google.maps.event.clearInstanceListeners(this.div_),this.div_.parentNode.removeChild(this.div_),this.div_=null)},b.prototype.draw=function(){if(this.visible_){var a=this.getPosFromLatLng_(this.center_);this.div_.style.top=a.y+"px",this.div_.style.left=a.x+"px"}},b.prototype.hide=function(){this.div_&&(this.div_.style.display="none"),this.visible_=!1},b.prototype.show=function(){if(this.div_){var a="",b=this.backgroundPosition_.split(" "),c=parseInt(b[0].trim(),10),d=parseInt(b[1].trim(),10),e=this.getPosFromLatLng_(this.center_);this.div_.style.cssText=this.createCss(e),a="",this.div_.innerHTML=a+"
"+(this.cluster_.hideLabel_?" ":this.sums_.text)+"
",this.div_.title="undefined"==typeof this.sums_.title||""===this.sums_.title?this.cluster_.getMarkerClusterer().getTitle():this.sums_.title,this.div_.style.display=""}this.visible_=!0},b.prototype.useStyle=function(a){this.sums_=a;var b=Math.max(0,a.index-1);b=Math.min(this.styles_.length-1,b);var c=this.styles_[b];this.url_=c.url,this.height_=c.height,this.width_=c.width,this.anchorText_=c.anchorText||[0,0],this.anchorIcon_=c.anchorIcon||[parseInt(this.height_/2,10),parseInt(this.width_/2,10)],this.textColor_=c.textColor||"black",this.textSize_=c.textSize||11,this.textDecoration_=c.textDecoration||"none",this.fontWeight_=c.fontWeight||"bold",this.fontStyle_=c.fontStyle||"normal",this.fontFamily_=c.fontFamily||"Arial,sans-serif",this.backgroundPosition_=c.backgroundPosition||"0 0"},b.prototype.setCenter=function(a){this.center_=a},b.prototype.createCss=function(a){var b=[];return b.push("cursor: pointer;"),b.push("position: absolute; top: "+a.y+"px; left: "+a.x+"px;"),b.push("width: "+this.width_+"px; height: "+this.height_+"px;"),b.join("")},b.prototype.getPosFromLatLng_=function(a){var b=this.getProjection().fromLatLngToDivPixel(a);return b.x-=this.anchorIcon_[1],b.y-=this.anchorIcon_[0],b.x=parseInt(b.x,10),b.y=parseInt(b.y,10),b},c.prototype.getSize=function(){return this.markers_.length},c.prototype.getMarkers=function(){return this.markers_},c.prototype.getCenter=function(){return this.center_},c.prototype.getMap=function(){return this.map_},c.prototype.getMarkerClusterer=function(){return this.markerClusterer_},c.prototype.getBounds=function(){var a,b=new google.maps.LatLngBounds(this.center_,this.center_),c=this.getMarkers();for(a=0;ad)a.getMap()!==this.map_&&a.setMap(this.map_);else if(cb;b++)this.markers_[b].setMap(null);else a.setMap(null);return!0},c.prototype.isMarkerInClusterBounds=function(a){return this.bounds_.contains(a.getPosition())},c.prototype.calculateBounds_=function(){var a=new google.maps.LatLngBounds(this.center_,this.center_);this.bounds_=this.markerClusterer_.getExtendedBounds(a)},c.prototype.updateIcon_=function(){var a=this.markers_.length,b=this.markerClusterer_.getMaxZoom();if(null!==b&&this.map_.getZoom()>b)return void this.clusterIcon_.hide();if(ab;b++)if(a===this.markers_[b])return!0;return!1},e.prototype.onAdd=function(){var a=this;this.activeMap_=this.getMap(),this.ready_=!0,this.repaint(),this.listeners_=[google.maps.event.addListener(this.getMap(),"zoom_changed",function(){a.resetViewport_(!1),(this.getZoom()===(this.get("minZoom")||0)||this.getZoom()===this.get("maxZoom"))&&google.maps.event.trigger(this,"idle")}),google.maps.event.addListener(this.getMap(),"idle",function(){a.redraw_()})]},e.prototype.onRemove=function(){var a;for(a=0;a0))for(a=0;ad&&(g=d,h=e));h&&h.isMarkerInClusterBounds(a)?h.addMarker(a):(e=new c(this),e.addMarker(a),this.clusters_.push(e))},e.prototype.createClusters_=function(a){var b,c,d,e=this;if(this.ready_){0===a&&(google.maps.event.trigger(this,"clusteringbegin",this),"undefined"!=typeof this.timerRefStatic&&(clearTimeout(this.timerRefStatic),delete this.timerRefStatic)),d=this.getMap().getZoom()>3?new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),this.getMap().getBounds().getNorthEast()):new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,-178.48388434375),new google.maps.LatLng(-85.08136444384544,178.00048865625));var f=this.getExtendedBounds(d),g=Math.min(a+this.batchSize_,this.markers_.length);for(b=a;g>b;b++)c=this.markers_[b],!c.isAdded&&this.isMarkerInBounds_(c,f)&&(!this.ignoreHidden_||this.ignoreHidden_&&c.getVisible())&&this.addToClosestCluster_(c);if(gthis.maxWidth_?(this.div_.style.width=this.maxWidth_,this.div_.style.overflow="auto",this.fixedWidthSet_=!0):(c=this.getBoxWidths_(),this.div_.style.width=this.div_.offsetWidth-c.left-c.right+"px",this.fixedWidthSet_=!1),this.panBox_(this.disableAutoPan_),!this.enableEventPropagation_){for(this.eventListeners_=[],b=["mousedown","mouseover","mouseout","mouseup","click","dblclick","touchstart","touchend","touchmove"],a=0;ag&&(d=o.x+k+i+m-g),this.alignBottom_?o.y<-j+n+l?e=o.y+j-n-l:o.y+j+n>h&&(e=o.y+j+n-h):o.y<-j+n?e=o.y+j-n:o.y+l+j+n>h&&(e=o.y+l+j+n-h),0!==d||0!==e){b.getCenter();b.panBy(d,e)}}},f.prototype.setBoxStyle_=function(){var a,b;if(this.div_){this.div_.className=this.boxClass_,this.div_.style.cssText="",b=this.boxStyle_;for(a in b)b.hasOwnProperty(a)&&(this.div_.style[a]=b[a]);this.div_.style.WebkitTransform="translateZ(0)","undefined"!=typeof this.div_.style.opacity&&""!==this.div_.style.opacity&&(this.div_.style.MsFilter='"progid:DXImageTransform.Microsoft.Alpha(Opacity='+100*this.div_.style.opacity+')"',this.div_.style.filter="alpha(opacity="+100*this.div_.style.opacity+")"),this.div_.style.position="absolute",this.div_.style.visibility="hidden",null!==this.zIndex_&&(this.div_.style.zIndex=this.zIndex_)}},f.prototype.getBoxWidths_=function(){var a,b={top:0,bottom:0,left:0,right:0},c=this.div_;return document.defaultView&&document.defaultView.getComputedStyle?(a=c.ownerDocument.defaultView.getComputedStyle(c,""), +a&&(b.top=parseInt(a.borderTopWidth,10)||0,b.bottom=parseInt(a.borderBottomWidth,10)||0,b.left=parseInt(a.borderLeftWidth,10)||0,b.right=parseInt(a.borderRightWidth,10)||0)):document.documentElement.currentStyle&&c.currentStyle&&(b.top=parseInt(c.currentStyle.borderTopWidth,10)||0,b.bottom=parseInt(c.currentStyle.borderBottomWidth,10)||0,b.left=parseInt(c.currentStyle.borderLeftWidth,10)||0,b.right=parseInt(c.currentStyle.borderRightWidth,10)||0),b},f.prototype.onRemove=function(){this.div_&&(this.div_.parentNode.removeChild(this.div_),this.div_=null)},f.prototype.draw=function(){this.createInfoBoxDiv_();var a=this.getProjection().fromLatLngToDivPixel(this.position_);this.div_.style.left=a.x+this.pixelOffset_.width+"px",this.alignBottom_?this.div_.style.bottom=-(a.y+this.pixelOffset_.height)+"px":this.div_.style.top=a.y+this.pixelOffset_.height+"px",this.isHidden_?this.div_.style.visibility="hidden":this.div_.style.visibility="visible"},f.prototype.setOptions=function(a){"undefined"!=typeof a.boxClass&&(this.boxClass_=a.boxClass,this.setBoxStyle_()),"undefined"!=typeof a.boxStyle&&(this.boxStyle_=a.boxStyle,this.setBoxStyle_()),"undefined"!=typeof a.content&&this.setContent(a.content),"undefined"!=typeof a.disableAutoPan&&(this.disableAutoPan_=a.disableAutoPan),"undefined"!=typeof a.maxWidth&&(this.maxWidth_=a.maxWidth),"undefined"!=typeof a.pixelOffset&&(this.pixelOffset_=a.pixelOffset),"undefined"!=typeof a.alignBottom&&(this.alignBottom_=a.alignBottom),"undefined"!=typeof a.position&&this.setPosition(a.position),"undefined"!=typeof a.zIndex&&this.setZIndex(a.zIndex),"undefined"!=typeof a.closeBoxMargin&&(this.closeBoxMargin_=a.closeBoxMargin),"undefined"!=typeof a.closeBoxURL&&(this.closeBoxURL_=a.closeBoxURL),"undefined"!=typeof a.infoBoxClearance&&(this.infoBoxClearance_=a.infoBoxClearance),"undefined"!=typeof a.isHidden&&(this.isHidden_=a.isHidden),"undefined"!=typeof a.visible&&(this.isHidden_=!a.visible),"undefined"!=typeof a.enableEventPropagation&&(this.enableEventPropagation_=a.enableEventPropagation),this.div_&&this.draw()},f.prototype.setContent=function(a){this.content_=a,this.div_&&(this.closeListener_&&(google.maps.event.removeListener(this.closeListener_),this.closeListener_=null),this.fixedWidthSet_||(this.div_.style.width=""),"undefined"==typeof a.nodeType?this.div_.innerHTML=this.getCloseBoxImg_()+a:(this.div_.innerHTML=this.getCloseBoxImg_(),this.div_.appendChild(a)),this.fixedWidthSet_||(this.div_.style.width=this.div_.offsetWidth+"px","undefined"==typeof a.nodeType?this.div_.innerHTML=this.getCloseBoxImg_()+a:(this.div_.innerHTML=this.getCloseBoxImg_(),this.div_.appendChild(a))),this.addClickHandler_()),google.maps.event.trigger(this,"content_changed")},f.prototype.setPosition=function(a){this.position_=a,this.div_&&this.draw(),google.maps.event.trigger(this,"position_changed")},f.prototype.setZIndex=function(a){this.zIndex_=a,this.div_&&(this.div_.style.zIndex=a),google.maps.event.trigger(this,"zindex_changed")},f.prototype.setVisible=function(a){this.isHidden_=!a,this.div_&&(this.div_.style.visibility=this.isHidden_?"hidden":"visible")},f.prototype.getContent=function(){return this.content_},f.prototype.getPosition=function(){return this.position_},f.prototype.getZIndex=function(){return this.zIndex_},f.prototype.getVisible=function(){var a;return a="undefined"!=typeof this.getMap()&&null!==this.getMap()&&!this.isHidden_},f.prototype.show=function(){this.isHidden_=!1,this.div_&&(this.div_.style.visibility="visible")},f.prototype.hide=function(){this.isHidden_=!0,this.div_&&(this.div_.style.visibility="hidden")},f.prototype.open=function(a,b){var c=this;b&&(this.position_=b.getPosition(),this.moveListener_=google.maps.event.addListener(b,"position_changed",function(){c.setPosition(this.getPosition())})),this.setMap(a),this.div_&&this.panBox_()},f.prototype.close=function(){var a;if(this.closeListener_&&(google.maps.event.removeListener(this.closeListener_),this.closeListener_=null),this.eventListeners_){for(a=0;ab.left&&a.leftb.top&&a.topg;b=0<=g?++f:--f)if(c[b]===e){h=[c[c.length-1],c[b]],c[b]=h[0],c[c.length-1]=h[1],c.pop();break}return c.concat(d)},a.prototype.forEachNode=function(a){var b,d,e;e=this._nodes;for(b in e)c.call(e,b)&&(d=e[b],a(d,b))},a.prototype.forEachEdge=function(a){var b,d,e,f,g,h;g=this._nodes;for(d in g)if(c.call(g,d)){e=g[d],h=e._outEdges;for(f in h)c.call(h,f)&&(b=h[f],a(b))}},a}(),a.exports=b}).call(this)},function(a,b){(function(){var b,c,d,e;b=function(){function a(a){var b,c,d,e,f,g;for(null==a&&(a=[]),this._data=[void 0],d=0,f=a.length;d1)for(b=e=2,g=this._data.length;2<=g?eg;b=2<=g?++e:--e)this._upHeap(b);this.size=this._data.length-1}return a.prototype.add=function(a){if(null!=a)return this._data.push(a),this._upHeap(this._data.length-1),this.size++,a},a.prototype.removeMin=function(){var a;if(1!==this._data.length)return this.size--,2===this._data.length?this._data.pop():(a=this._data[1],this._data[1]=this._data.pop(),this._downHeap(),a)},a.prototype.peekMin=function(){return this._data[1]},a.prototype._upHeap=function(a){var b,c;for(b=this._data[a];this._data[a]1;)c=[this._data[d(a)],this._data[a]],this._data[a]=c[0],this._data[d(a)]=c[1],a=d(a)},a.prototype._downHeap=function(){var a,b,d;for(a=1;c(a>1},c=function(a){return a<<1},e=function(a){return(a<<1)+1},a.exports=b}).call(this)},function(a,b){(function(){var b;b=function(){function a(a){var b,c,d;for(null==a&&(a=[]),this.head={prev:void 0,value:void 0,next:void 0},this.tail={prev:void 0,value:void 0,next:void 0},this.size=0,c=0,d=a.length;c=this.size)return-1;for(b=Math.max(0,this._adjust(b)),c=this.at(b),d=b;c&&c.value!==a;)c=c.next,d++;return d===this.size?-1:d},a.prototype._adjust=function(a){return a<0?this.size+a:a},a}(),a.exports=b}).call(this)},function(a,b){(function(){var b,c,d,e,f={}.hasOwnProperty;c="_mapId_",b=function(){function a(b){var c,d;this._content={},this._itemId=0,this._id=a._newMapId(),this.size=0;for(c in b)f.call(b,c)&&(d=b[c],this.set(c,d))}return a._mapIdTracker=0,a._newMapId=function(){return this._mapIdTracker++},a.prototype.hash=function(a,b){var f,g;return null==b&&(b=!1),g=d(a),e(a)?(f=c+this._id,b&&!a[f]&&(a[f]=this._itemId++),f+"_"+a[f]):g+"_"+a},a.prototype.set=function(a,b){return this.has(a)||this.size++,this._content[this.hash(a,!0)]=[b,a],b},a.prototype.get=function(a){var b;return null!=(b=this._content[this.hash(a)])?b[0]:void 0},a.prototype.has=function(a){return this.hash(a)in this._content},a.prototype.delete=function(a){var b;return b=this.hash(a),b in this._content&&(delete this._content[b],e(a)&&delete a[c+this._id],this.size--,!0)},a.prototype.forEach=function(a){var b,c,d;d=this._content;for(b in d)f.call(d,b)&&(c=d[b],a(c[1],c[0]))},a}(),e=function(a){var b,c,e,f,g;for(b=["Boolean","Number","String","Undefined","Null","RegExp","Function"],e=d(a),f=0,g=b.length;fthis._content.length&&(this._content=this._content.slice(this._dequeueIndex),this._dequeueIndex=0),a},a.prototype.peek=function(){return this._content[this._dequeueIndex]},a}(),a.exports=b}).call(this)},function(a,b){(function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;c=0,d=1,e=2,h=3,f=1,b=2,g=function(){function a(a){var b,c,d;for(null==a&&(a=[]),this._root,this.size=0,c=0,d=a.length;c=1)&&!f(g[c][1],1);c=k<=1?++i:--i)delete g[c-1][1][g[c][0]];return f(this._root[g[0][0]],1)||delete this._root[g[0][0]],a}}},a}(),f=function(a,b){var c,d;if(0===b)return!0;d=0;for(c in a)if(g.call(a,c)&&(d++,d>=b))return!0;return!1},a.exports=d}).call(this)}]),b.module("uiGmapgoogle-maps.wrapped").service("uiGmapMarkerSpiderfier",["uiGmapGoogleMapApi",function(b){var c=this;return+function(){var b={}.hasOwnProperty,c=[].slice;this.OverlappingMarkerSpiderfier=function(){function d(a,c){var d,f,g,h,i,j;this.map=a,null==c&&(c={});for(f in c)b.call(c,f)&&(j=c[f],this[f]=j);for(this.projHelper=new this.constructor.ProjHelper(this.map),this.initMarkerArrays(),this.listeners={},i=["click","zoom_changed","maptypeid_changed"],g=0,h=i.length;gj;g=0<=j?++h:--h)c=this.circleStartAngle+g*d,k.push(new f.Point(b.x+i*Math.cos(c),b.y+i*Math.sin(c)));return k},l.generatePtsSpiral=function(a,b){var c,d,e,g,h,i,j;for(g=this.spiralLengthStart,c=0,j=[],d=e=0,i=a;0<=i?ei;d=0<=i?++e:--e)c+=this.spiralFootSeparation/g+5e-4*d,h=new f.Point(b.x+g*Math.cos(c),b.y+g*Math.sin(c)),g+=n*this.spiralLengthFactor/c,j.push(h);return j},l.spiderListener=function(b,c){var d,e,f,g,h,i,j,k,m,n,o,p,q;if(k=null!=b._omsData,k&&this.keepSpiderfied||("mouseover"===this.event?(d=this,e=function(){return d.unspiderfy()},a.clearTimeout(l.timeout),l.timeout=setTimeout(e,3e3)):this.unspiderfy()),k||this.map.getStreetView().getVisible()||"GoogleEarthAPI"===this.map.getMapTypeId())return this.trigger("click",b,c);for(n=[],o=[],m=this.nearbyDistance,p=m*m,j=this.llToPt(b.position),q=this.markers,f=0,g=q.length;f=this.circleSpiralSwitchover?this.generatePtsSpiral(n,c).reverse():this.generatePtsCircle(n,c),o=function(){var b,c,l;for(l=[],b=0,c=h.length;bc?a.getMap()!==this.map_&&a.setMap(this.map_):b3?new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),this.getMap().getBounds().getNorthEast()):new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,-178.48388434375),new google.maps.LatLng(-85.08136444384544,178.00048865625));var f=this.getExtendedBounds(d),g=Math.min(a+this.batchSize_,this.markers_.length),h=this.markers_.values();for(b=a;b",this.div_.innerHTML=a+"
"+this.sums_.text+"
","undefined"==typeof this.sums_.title||""===this.sums_.title?this.div_.title=this.cluster_.getMarkerClusterer().getTitle():this.div_.title=this.sums_.title,this.div_.style.display=""}this.visible_=!0},b}(MarkerClusterer)}).call(this)})}}])}(window,angular,_); +//# sourceMappingURL=angular-google-maps-street-view_dev_mapped.min.js.map \ No newline at end of file diff --git a/dist/angular-google-maps_dev_mapped.js b/dist/angular-google-maps_dev_mapped.js new file mode 100644 index 000000000..82e9dc1ba --- /dev/null +++ b/dist/angular-google-maps_dev_mapped.js @@ -0,0 +1,14177 @@ +/*! angular-google-maps 2.4.1 2017-01-05 + * AngularJS directives for Google Maps + * git: https://github.com/angular-ui/angular-google-maps.git + */ +; +(function( window, angular, _, undefined ){ + 'use strict'; +/* +! +The MIT License + +Copyright (c) 2010-2013 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the 'Software'), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +angular-google-maps +https://github.com/angular-ui/angular-google-maps + +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module('uiGmapgoogle-maps.providers', ['nemLogging']); + + angular.module('uiGmapgoogle-maps.wrapped', []); + + angular.module('uiGmapgoogle-maps.extensions', ['uiGmapgoogle-maps.wrapped', 'uiGmapgoogle-maps.providers']); + + angular.module('uiGmapgoogle-maps.directives.api.utils', ['uiGmapgoogle-maps.extensions']); + + angular.module('uiGmapgoogle-maps.directives.api.managers', []); + + angular.module('uiGmapgoogle-maps.directives.api.options', ['uiGmapgoogle-maps.directives.api.utils']); + + angular.module('uiGmapgoogle-maps.directives.api.options.builders', []); + + angular.module('uiGmapgoogle-maps.directives.api.models.child', ['uiGmapgoogle-maps.directives.api.utils', 'uiGmapgoogle-maps.directives.api.options', 'uiGmapgoogle-maps.directives.api.options.builders']); + + angular.module('uiGmapgoogle-maps.directives.api.models.parent', ['uiGmapgoogle-maps.directives.api.managers', 'uiGmapgoogle-maps.directives.api.models.child', 'uiGmapgoogle-maps.providers']); + + angular.module('uiGmapgoogle-maps.directives.api', ['uiGmapgoogle-maps.directives.api.models.parent']); + + angular.module('uiGmapgoogle-maps', ['uiGmapgoogle-maps.directives.api', 'uiGmapgoogle-maps.providers']); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.providers').factory('uiGmapMapScriptLoader', [ + '$q', 'uiGmapuuid', function($q, uuid) { + var getScriptUrl, includeScript, isGoogleMapsLoaded, scriptId, usedConfiguration; + scriptId = void 0; + usedConfiguration = void 0; + getScriptUrl = function(options) { + if (options.china) { + return 'http://maps.google.cn/maps/api/js?'; + } else { + if (options.transport === 'auto') { + return '//maps.googleapis.com/maps/api/js?'; + } else { + return options.transport + '://maps.googleapis.com/maps/api/js?'; + } + } + }; + includeScript = function(options) { + var omitOptions, query, script, scriptElem; + omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad']; + if (options.isGoogleMapsForWork) { + omitOptions.push('key'); + } + query = _.map(_.omit(options, omitOptions), function(v, k) { + return k + '=' + v; + }); + if (scriptId) { + scriptElem = document.getElementById(scriptId); + scriptElem.parentNode.removeChild(scriptElem); + } + query = query.join('&'); + script = document.createElement('script'); + script.id = scriptId = "ui_gmap_map_load_" + (uuid.generate()); + script.type = 'text/javascript'; + script.src = getScriptUrl(options) + query; + return document.head.appendChild(script); + }; + isGoogleMapsLoaded = function() { + return angular.isDefined(window.google) && angular.isDefined(window.google.maps); + }; + return { + load: function(options) { + var deferred, randomizedFunctionName; + deferred = $q.defer(); + if (isGoogleMapsLoaded()) { + deferred.resolve(window.google.maps); + return deferred.promise; + } + randomizedFunctionName = options.callback = 'onGoogleMapsReady' + Math.round(Math.random() * 1000); + window[randomizedFunctionName] = function() { + window[randomizedFunctionName] = null; + deferred.resolve(window.google.maps); + }; + if (window.navigator.connection && window.Connection && window.navigator.connection.type === window.Connection.NONE && !options.preventLoad) { + document.addEventListener('online', function() { + if (!isGoogleMapsLoaded()) { + return includeScript(options); + } + }); + } else if (!options.preventLoad) { + includeScript(options); + } + usedConfiguration = options; + usedConfiguration.randomizedFunctionName = randomizedFunctionName; + return deferred.promise; + }, + manualLoad: function() { + var config; + config = usedConfiguration; + if (!isGoogleMapsLoaded()) { + return includeScript(config); + } else { + if (window[config.randomizedFunctionName]) { + return window[config.randomizedFunctionName](); + } + } + } + }; + } + ]).provider('uiGmapGoogleMapApi', function() { + this.options = { + transport: 'https', + isGoogleMapsForWork: false, + china: false, + v: '3', + libraries: '', + language: 'en', + preventLoad: false + }; + this.configure = function(options) { + angular.extend(this.options, options); + }; + this.$get = [ + 'uiGmapMapScriptLoader', (function(_this) { + return function(loader) { + return loader.load(_this.options); + }; + })(this) + ]; + return this; + }).service('uiGmapGoogleMapApiManualLoader', [ + 'uiGmapMapScriptLoader', function(loader) { + return { + load: function() { + loader.manualLoad(); + } + }; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.extensions').service('uiGmapExtendGWin', function() { + return { + init: _.once(function() { + var uiGmapInfoBox; + if (!(google || (typeof google !== "undefined" && google !== null ? google.maps : void 0) || (google.maps.InfoWindow != null))) { + return; + } + google.maps.InfoWindow.prototype._open = google.maps.InfoWindow.prototype.open; + google.maps.InfoWindow.prototype._close = google.maps.InfoWindow.prototype.close; + google.maps.InfoWindow.prototype._isOpen = false; + google.maps.InfoWindow.prototype.open = function(map, anchor, recurse) { + if (recurse != null) { + return; + } + this._isOpen = true; + this._open(map, anchor, true); + }; + google.maps.InfoWindow.prototype.close = function(recurse) { + if (recurse != null) { + return; + } + this._isOpen = false; + this._close(true); + }; + google.maps.InfoWindow.prototype.isOpen = function(val) { + if (val == null) { + val = void 0; + } + if (val == null) { + return this._isOpen; + } else { + return this._isOpen = val; + } + }; + + /* + Do the same for InfoBox + TODO: Clean this up so the logic is defined once, wait until develop becomes master as this will be easier + */ + if (window.InfoBox) { + window.InfoBox.prototype._open = window.InfoBox.prototype.open; + window.InfoBox.prototype._close = window.InfoBox.prototype.close; + window.InfoBox.prototype._isOpen = false; + window.InfoBox.prototype.open = function(map, anchor) { + this._isOpen = true; + this._open(map, anchor); + }; + window.InfoBox.prototype.close = function() { + this._isOpen = false; + this._close(); + }; + window.InfoBox.prototype.isOpen = function(val) { + if (val == null) { + val = void 0; + } + if (val == null) { + return this._isOpen; + } else { + return this._isOpen = val; + } + }; + uiGmapInfoBox = (function(superClass) { + extend(uiGmapInfoBox, superClass); + + function uiGmapInfoBox(opts) { + this.getOrigCloseBoxImg_ = bind(this.getOrigCloseBoxImg_, this); + this.getCloseBoxDiv_ = bind(this.getCloseBoxDiv_, this); + var box; + box = new window.InfoBox(opts); + _.extend(this, box); + if (opts.closeBoxDiv != null) { + this.closeBoxDiv_ = opts.closeBoxDiv; + } + } + + uiGmapInfoBox.prototype.getCloseBoxDiv_ = function() { + return this.closeBoxDiv_; + }; + + uiGmapInfoBox.prototype.getCloseBoxImg_ = function() { + var div, img; + div = this.getCloseBoxDiv_(); + img = this.getOrigCloseBoxImg_(); + return div || img; + }; + + uiGmapInfoBox.prototype.getOrigCloseBoxImg_ = function() { + var img; + img = ""; + if (this.closeBoxURL_ !== "") { + img = " 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + get = function(object, path, defaultValue) { + var result; + result = object === null ? void 0 : baseGet(object, toPath(path), path + ''); + if (result === void 0) { + return defaultValue; + } else { + return result; + } + }; + _.get = get; + } + + /* + Author Nick McCready + Intersection of Objects if the arrays have something in common each intersecting object will be returned + in an new array. + */ + this.intersectionObjects = function(array1, array2, comparison) { + var res; + if (comparison == null) { + comparison = void 0; + } + res = _.map(array1, function(obj1) { + return _.find(array2, function(obj2) { + if (comparison != null) { + return comparison(obj1, obj2); + } else { + return _.isEqual(obj1, obj2); + } + }); + }); + return _.filter(res, function(o) { + return o != null; + }); + }; + this.containsObject = _.includeObject = function(obj, target, comparison) { + if (comparison == null) { + comparison = void 0; + } + if (obj === null) { + return false; + } + return _.some(obj, function(value) { + if (comparison != null) { + return comparison(value, target); + } else { + return _.isEqual(value, target); + } + }); + }; + this.differenceObjects = function(array1, array2, comparison) { + if (comparison == null) { + comparison = void 0; + } + return _.filter(array1, (function(_this) { + return function(value) { + return !_this.containsObject(array2, value, comparison); + }; + })(this)); + }; + this.withoutObjects = this.differenceObjects; + this.indexOfObject = function(array, item, comparison, isSorted) { + var i, length; + if (array == null) { + return -1; + } + i = 0; + length = array.length; + if (isSorted) { + if (typeof isSorted === "number") { + i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); + } else { + i = _.sortedIndex(array, item); + return (array[i] === item ? i : -1); + } + } + while (i < length) { + if (comparison != null) { + if (comparison(array[i], item)) { + return i; + } + } else { + if (_.isEqual(array[i], item)) { + return i; + } + } + i++; + } + return -1; + }; + this.isNullOrUndefined = function(thing) { + return _.isNull(thing || _.isUndefined(thing)); + }; + return this; + }); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.extensions').factory('uiGmapString', function() { + return function(str) { + this.contains = function(value, fromIndex) { + return str.indexOf(value, fromIndex) !== -1; + }; + return this; + }; + }); + +}).call(this); +; +/*global _:true,angular:true, */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmap_sync', [ + function() { + return { + fakePromise: function() { + var _cb; + _cb = void 0; + return { + then: function(cb) { + return _cb = cb; + }, + resolve: function() { + return _cb.apply(void 0, arguments); + } + }; + } + }; + } + ]).service('uiGmap_async', [ + '$timeout', 'uiGmapPromise', 'uiGmapLogger', '$q', 'uiGmapDataStructures', 'uiGmapGmapUtil', function($timeout, uiGmapPromise, $log, $q, uiGmapDataStructures, uiGmapGmapUtil) { + var ExposedPromise, PromiseQueueManager, SniffedPromise, _getIterateeValue, _ignoreFields, defaultChunkSize, doChunk, doSkippPromise, each, errorObject, getArrayAndKeys, isInProgress, kickPromise, logTryCatch, managePromiseQueue, map, maybeCancelPromises, promiseStatus, promiseTypes, tryCatch; + promiseTypes = uiGmapPromise.promiseTypes; + isInProgress = uiGmapPromise.isInProgress; + promiseStatus = uiGmapPromise.promiseStatus; + ExposedPromise = uiGmapPromise.ExposedPromise; + SniffedPromise = uiGmapPromise.SniffedPromise; + kickPromise = function(sniffedPromise, cancelCb) { + var promise; + promise = sniffedPromise.promise(); + promise.promiseType = sniffedPromise.promiseType; + if (promise.$$state) { + $log.debug("promiseType: " + promise.promiseType + ", state: " + (promiseStatus(promise.$$state.status))); + } + promise.cancelCb = cancelCb; + return promise; + }; + doSkippPromise = function(sniffedPromise, lastPromise) { + if (sniffedPromise.promiseType === promiseTypes.create && lastPromise.promiseType !== promiseTypes["delete"] && lastPromise.promiseType !== promiseTypes.init) { + $log.debug("lastPromise.promiseType " + lastPromise.promiseType + ", newPromiseType: " + sniffedPromise.promiseType + ", SKIPPED MUST COME AFTER DELETE ONLY"); + return true; + } + return false; + }; + maybeCancelPromises = function(queue, sniffedPromise, lastPromise) { + var first; + if (sniffedPromise.promiseType === promiseTypes["delete"] && lastPromise.promiseType !== promiseTypes["delete"]) { + if ((lastPromise.cancelCb != null) && _.isFunction(lastPromise.cancelCb) && isInProgress(lastPromise)) { + $log.debug("promiseType: " + sniffedPromise.promiseType + ", CANCELING LAST PROMISE type: " + lastPromise.promiseType); + lastPromise.cancelCb('cancel safe'); + first = queue.peek(); + if ((first != null) && isInProgress(first)) { + if (first.hasOwnProperty("cancelCb") && _.isFunction(first.cancelCb)) { + $log.debug("promiseType: " + first.promiseType + ", CANCELING FIRST PROMISE type: " + first.promiseType); + return first.cancelCb('cancel safe'); + } else { + return $log.warn('first promise was not cancelable'); + } + } + } + } + }; + + /* + From a High Level: + This is a SniffedPromiseQueueManager (looking to rename) where the queue is existingPiecesObj.existingPieces. + This is a function and should not be considered a class. + So it is run to manage the state (cancel, skip, link) as needed. + Purpose: + The whole point is to check if there is existing async work going on. If so we wait on it. + + arguments: + - existingPiecesObj = Queue + - sniffedPromise = object wrapper holding a function to a pending (function) promise (promise: fnPromise) + with its intended type. + - cancelCb = callback which accepts a string, this string is intended to be returned at the end of _async.each iterator + + Where the cancelCb passed msg is 'cancel safe' _async.each will drop out and fall through. Thus canceling the promise + gracefully without messing up state. + + Synopsis: + + - Promises have been broken down to 4 states create, update,delete (3 main) and init. (Helps boil down problems in ordering) + where (init) is special to indicate that it is one of the first or to allow a create promise to work beyond being after a delete + + - Every Promise that comes in is enqueued and linked to the last promise in the queue. + + - A promise can be skipped or canceled to save cycles. + + Saved Cycles: + - Skipped - This will only happen if async work comes in out of order. Where a pending create promise (un-executed) comes in + after a delete promise. + - Canceled - Where an incoming promise (un-executed promise) is of type delete and the any lastPromise is not a delete type. + + + NOTE: + - You should not muck with existingPieces as its state is dependent on this functional loop. + - PromiseQueueManager should not be thought of as a class that has a life expectancy (it has none). It's sole + purpose is to link, skip, and kill promises. It also manages the promise queue existingPieces. + */ + PromiseQueueManager = function(existingPiecesObj, sniffedPromise, cancelCb) { + var lastPromise, newPromise; + if (!existingPiecesObj.existingPieces) { + existingPiecesObj.existingPieces = new uiGmapDataStructures.Queue(); + return existingPiecesObj.existingPieces.enqueue(kickPromise(sniffedPromise, cancelCb)); + } else { + lastPromise = _.last(existingPiecesObj.existingPieces._content); + if (doSkippPromise(sniffedPromise, lastPromise)) { + return; + } + maybeCancelPromises(existingPiecesObj.existingPieces, sniffedPromise, lastPromise); + newPromise = ExposedPromise(lastPromise["finally"](function() { + return kickPromise(sniffedPromise, cancelCb); + })); + newPromise.cancelCb = cancelCb; + newPromise.promiseType = sniffedPromise.promiseType; + existingPiecesObj.existingPieces.enqueue(newPromise); + return lastPromise["finally"](function() { + return existingPiecesObj.existingPieces.dequeue(); + }); + } + }; + managePromiseQueue = function(objectToLock, promiseType, msg, cancelCb, fnPromise) { + var cancelLogger; + if (msg == null) { + msg = ''; + } + cancelLogger = function(msg) { + $log.debug(msg + ": " + msg); + if ((cancelCb != null) && _.isFunction(cancelCb)) { + return cancelCb(msg); + } + }; + return PromiseQueueManager(objectToLock, SniffedPromise(fnPromise, promiseType), cancelLogger); + }; + defaultChunkSize = 80; + errorObject = { + value: null + }; + tryCatch = function(fn, ctx, args) { + var e, error1; + try { + return fn.apply(ctx, args); + } catch (error1) { + e = error1; + errorObject.value = e; + return errorObject; + } + }; + logTryCatch = function(fn, ctx, deferred, args) { + var msg, result; + result = tryCatch(fn, ctx, args); + if (result === errorObject) { + msg = "error within chunking iterator: " + errorObject.value; + $log.error(msg); + deferred.reject(msg); + } + if (result === 'cancel safe') { + return false; + } + return true; + }; + _getIterateeValue = function(collection, array, index) { + var _isArray, valOrKey; + _isArray = collection === array; + valOrKey = array[index]; + if (_isArray) { + return valOrKey; + } + return collection[valOrKey]; + }; + _ignoreFields = ['length', 'forEach', 'map']; + getArrayAndKeys = function(collection, keys, bailOutCb, cb) { + var array, propName, val; + if (angular.isArray(collection)) { + array = collection; + } else { + if (keys) { + array = keys; + } else { + array = []; + for (propName in collection) { + val = collection[propName]; + if (collection.hasOwnProperty(propName) && !_.includes(_ignoreFields, propName)) { + array.push(propName); + } + } + } + } + if (cb == null) { + cb = bailOutCb; + } + if (angular.isArray(array) && !(array != null ? array.length : void 0)) { + if (cb !== bailOutCb) { + return bailOutCb(); + } + } + return cb(array, keys); + }; + + /* + Author: Nicholas McCready & jfriend00 + _async handles things asynchronous-like :), to allow the UI to be free'd to do other things + Code taken from http://stackoverflow.com/questions/10344498/best-way-to-iterate-over-an-array-without-blocking-the-ui + + The design of any functionality of _async is to be like lodash/underscore and replicate it but call things + asynchronously underneath. Each should be sufficient for most things to be derived from. + + Optional Asynchronous Chunking via promises. + */ + doChunk = function(collection, chunkSizeOrDontChunk, pauseMilli, chunkCb, pauseCb, overallD, index, _keys) { + return getArrayAndKeys(collection, _keys, function(array, keys) { + var cnt, i, keepGoing, val; + if (chunkSizeOrDontChunk && chunkSizeOrDontChunk < array.length) { + cnt = chunkSizeOrDontChunk; + } else { + cnt = array.length; + } + i = index; + keepGoing = true; + while (keepGoing && cnt-- && i < (array ? array.length : i + 1)) { + val = _getIterateeValue(collection, array, i); + keepGoing = angular.isFunction(val) ? true : logTryCatch(chunkCb, void 0, overallD, [val, i]); + ++i; + } + if (array) { + if (keepGoing && i < array.length) { + index = i; + if (chunkSizeOrDontChunk) { + if ((pauseCb != null) && _.isFunction(pauseCb)) { + logTryCatch(pauseCb, void 0, overallD, []); + } + return $timeout(function() { + return doChunk(collection, chunkSizeOrDontChunk, pauseMilli, chunkCb, pauseCb, overallD, index, keys); + }, pauseMilli, false); + } + } else { + return overallD.resolve(); + } + } + }); + }; + each = function(collection, chunk, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, _keys) { + var error, overallD, ret; + if (chunkSizeOrDontChunk == null) { + chunkSizeOrDontChunk = defaultChunkSize; + } + if (index == null) { + index = 0; + } + if (pauseMilli == null) { + pauseMilli = 1; + } + ret = void 0; + overallD = uiGmapPromise.defer(); + ret = overallD.promise; + if (!pauseMilli) { + error = 'pause (delay) must be set from _async!'; + $log.error(error); + overallD.reject(error); + return ret; + } + return getArrayAndKeys(collection, _keys, function() { + overallD.resolve(); + return ret; + }, function(array, keys) { + doChunk(collection, chunkSizeOrDontChunk, pauseMilli, chunk, pauseCb, overallD, index, keys); + return ret; + }); + }; + map = function(collection, iterator, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, _keys) { + var results; + results = []; + return getArrayAndKeys(collection, _keys, function() { + return uiGmapPromise.resolve(results); + }, function(array, keys) { + return each(collection, function(o) { + return results.push(iterator(o)); + }, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, keys).then(function() { + return results; + }); + }); + }; + return { + each: each, + map: map, + managePromiseQueue: managePromiseQueue, + promiseLock: managePromiseQueue, + defaultChunkSize: defaultChunkSize, + getArrayAndKeys: getArrayAndKeys, + chunkSizeFrom: function(fromSize, ret) { + if (ret == null) { + ret = void 0; + } + if (_.isNumber(fromSize)) { + ret = fromSize; + } + if (uiGmapGmapUtil.isFalse(fromSize) || fromSize === false) { + ret = false; + } + return ret; + } + }; + } + ]); + +}).call(this); +;(function() { + var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapBaseObject', function() { + var BaseObject, baseObjectKeywords; + baseObjectKeywords = ['extended', 'included']; + BaseObject = (function() { + function BaseObject() {} + + BaseObject.extend = function(obj) { + var key, ref, value; + for (key in obj) { + value = obj[key]; + if (indexOf.call(baseObjectKeywords, key) < 0) { + this[key] = value; + } + } + if ((ref = obj.extended) != null) { + ref.apply(this); + } + return this; + }; + + BaseObject.include = function(obj) { + var key, ref, value; + for (key in obj) { + value = obj[key]; + if (indexOf.call(baseObjectKeywords, key) < 0) { + this.prototype[key] = value; + } + } + if ((ref = obj.included) != null) { + ref.apply(this); + } + return this; + }; + + return BaseObject; + + })(); + return BaseObject; + }); + +}).call(this); +; +/* + Useful function callbacks that should be defined at later time. + Mainly to be used for specs to verify creation / linking. + + This is to lead a common design in notifying child stuff. + */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapChildEvents', function() { + return { + onChildCreation: function(child) {} + }; + }); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapCtrlHandle', [ + '$q', function($q) { + var CtrlHandle; + return CtrlHandle = { + handle: function($scope, $element) { + $scope.$on('$destroy', function() { + return CtrlHandle.handle($scope); + }); + $scope.deferred = $q.defer(); + return { + getScope: function() { + return $scope; + } + }; + }, + mapPromise: function(scope, ctrl) { + var mapScope; + mapScope = ctrl.getScope(); + mapScope.deferred.promise.then(function(map) { + return scope.map = map; + }); + return mapScope.deferred.promise; + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapEventsHelper", [ + "uiGmapLogger", function($log) { + var _getEventsObj, _hasEvents; + _hasEvents = function(obj) { + return angular.isDefined(obj.events) && (obj.events != null) && angular.isObject(obj.events); + }; + _getEventsObj = function(scope, model) { + if (_hasEvents(scope)) { + return scope; + } + if (_hasEvents(model)) { + return model; + } + }; + return { + setEvents: function(gObject, scope, model, ignores) { + var eventObj; + eventObj = _getEventsObj(scope, model); + if (eventObj != null) { + return _.compact(_.map(eventObj.events, function(eventHandler, eventName) { + var doIgnore; + if (ignores) { + doIgnore = _(ignores).includes(eventName); + } + if (eventObj.events.hasOwnProperty(eventName) && angular.isFunction(eventObj.events[eventName]) && !doIgnore) { + return google.maps.event.addListener(gObject, eventName, function() { + if (!scope.$evalAsync) { + scope.$evalAsync = function() {}; + } + return scope.$evalAsync(eventHandler.apply(scope, [gObject, eventName, model, arguments])); + }); + } + })); + } + }, + removeEvents: function(listeners) { + var key, l; + if (!listeners) { + return; + } + for (key in listeners) { + l = listeners[key]; + if (l && listeners.hasOwnProperty(key)) { + google.maps.event.removeListener(l); + } + } + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapFitHelper', [ + 'uiGmapLogger', '$timeout', function($log, $timeout) { + return { + fit: function(markersOrPoints, gMap) { + var bounds, everSet, key, markerOrPoint, point; + if (gMap && (markersOrPoints != null ? markersOrPoints.length : void 0)) { + bounds = new google.maps.LatLngBounds(); + everSet = false; + for (key in markersOrPoints) { + markerOrPoint = markersOrPoints[key]; + if (markerOrPoint) { + if (!everSet) { + everSet = true; + } + point = _.isFunction(markerOrPoint.getPosition) ? markerOrPoint.getPosition() : markerOrPoint; + } + bounds.extend(point); + } + if (everSet) { + return $timeout(function() { + return gMap.fitBounds(bounds); + }); + } + } + } + }; + } + ]); + +}).call(this); +; +/*global _:true, angular:true, google:true */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapGmapUtil', [ + 'uiGmapLogger', '$compile', function(Logger, $compile) { + var _isFalse, _isTruthy, getCoords, getLatitude, getLongitude, validateCoords; + _isTruthy = function(value, bool, optionsArray) { + return value === bool || optionsArray.indexOf(value) !== -1; + }; + _isFalse = function(value) { + return _isTruthy(value, false, ['false', 'FALSE', 0, 'n', 'N', 'no', 'NO']); + }; + getLatitude = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[1]; + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return value.coordinates[1]; + } else { + return value.latitude; + } + }; + getLongitude = function(value) { + if (Array.isArray(value) && value.length === 2) { + return value[0]; + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return value.coordinates[0]; + } else { + return value.longitude; + } + }; + getCoords = function(value) { + if (!value) { + return; + } + if (value instanceof google.maps.LatLng) { + return value; + } else if (Array.isArray(value) && value.length === 2) { + return new google.maps.LatLng(value[1], value[0]); + } else if (angular.isDefined(value.type) && value.type === 'Point') { + return new google.maps.LatLng(value.coordinates[1], value.coordinates[0]); + } else { + return new google.maps.LatLng(value.latitude, value.longitude); + } + }; + validateCoords = function(coords) { + if (angular.isUndefined(coords)) { + return false; + } + if (_.isArray(coords)) { + if (coords.length === 2) { + return true; + } + } else if ((coords != null) && (coords != null ? coords.type : void 0)) { + if (coords.type === 'Point' && _.isArray(coords.coordinates) && coords.coordinates.length === 2) { + return true; + } + } + if (coords && angular.isDefined((coords != null ? coords.latitude : void 0) && angular.isDefined(coords != null ? coords.longitude : void 0))) { + return true; + } + return false; + }; + return { + setCoordsFromEvent: function(prevValue, newLatLon) { + if (!prevValue) { + return; + } + if (Array.isArray(prevValue) && prevValue.length === 2) { + prevValue[1] = newLatLon.lat(); + prevValue[0] = newLatLon.lng(); + } else if (angular.isDefined(prevValue.type) && prevValue.type === 'Point') { + prevValue.coordinates[1] = newLatLon.lat(); + prevValue.coordinates[0] = newLatLon.lng(); + } else { + prevValue.latitude = newLatLon.lat(); + prevValue.longitude = newLatLon.lng(); + } + return prevValue; + }, + getLabelPositionPoint: function(anchor) { + var xPos, yPos; + if (anchor === void 0) { + return void 0; + } + anchor = /^([-\d\.]+)\s([-\d\.]+)$/.exec(anchor); + xPos = parseFloat(anchor[1]); + yPos = parseFloat(anchor[2]); + if ((xPos != null) && (yPos != null)) { + return new google.maps.Point(xPos, yPos); + } + }, + createWindowOptions: function(gMarker, scope, content, defaults) { + var options; + if ((content != null) && (defaults != null) && ($compile != null)) { + options = angular.extend({}, defaults, { + content: this.buildContent(scope, defaults, content), + position: defaults.position != null ? defaults.position : angular.isObject(gMarker) ? gMarker.getPosition() : getCoords(scope.coords) + }); + if ((gMarker != null) && ((options != null ? options.pixelOffset : void 0) == null)) { + if (options.boxClass == null) { + + } else { + options.pixelOffset = { + height: 0, + width: -2 + }; + } + } + return options; + } else { + if (!defaults) { + Logger.error('infoWindow defaults not defined'); + if (!content) { + return Logger.error('infoWindow content not defined'); + } + } else { + return defaults; + } + } + }, + buildContent: function(scope, defaults, content) { + var parsed, ret; + if (defaults.content != null) { + ret = defaults.content; + } else { + if ($compile != null) { + content = content.replace(/^\s+|\s+$/g, ''); + parsed = content === '' ? '' : $compile(content)(scope); + if (parsed.length > 0) { + ret = parsed[0]; + } + } else { + ret = content; + } + } + return ret; + }, + defaultDelay: 50, + isTrue: function(value) { + return _isTruthy(value, true, ['true', 'TRUE', 1, 'y', 'Y', 'yes', 'YES']); + }, + isFalse: _isFalse, + isFalsy: function(value) { + return _isTruthy(value, false, [void 0, null]) || _isFalse(value); + }, + getCoords: getCoords, + validateCoords: validateCoords, + equalCoords: function(coord1, coord2) { + return getLatitude(coord1) === getLatitude(coord2) && getLongitude(coord1) === getLongitude(coord2); + }, + validatePath: function(path) { + var array, i, polygon, trackMaxVertices; + i = 0; + if (angular.isUndefined(path.type)) { + if (!Array.isArray(path) || path.length < 2) { + return false; + } + while (i < path.length) { + if (!((angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) || (typeof path[i].lat === 'function' && typeof path[i].lng === 'function'))) { + return false; + } + i++; + } + return true; + } else { + if (angular.isUndefined(path.coordinates)) { + return false; + } + if (path.type === 'Polygon') { + if (path.coordinates[0].length < 4) { + return false; + } + array = path.coordinates[0]; + } else if (path.type === 'MultiPolygon') { + trackMaxVertices = { + max: 0, + index: 0 + }; + _.forEach(path.coordinates, function(polygon, index) { + if (polygon[0].length > this.max) { + this.max = polygon[0].length; + return this.index = index; + } + }, trackMaxVertices); + polygon = path.coordinates[trackMaxVertices.index]; + array = polygon[0]; + if (array.length < 4) { + return false; + } + } else if (path.type === 'LineString') { + if (path.coordinates.length < 2) { + return false; + } + array = path.coordinates; + } else { + return false; + } + while (i < array.length) { + if (array[i].length !== 2) { + return false; + } + i++; + } + return true; + } + }, + convertPathPoints: function(path) { + var array, i, latlng, result, trackMaxVertices; + i = 0; + result = new google.maps.MVCArray(); + if (angular.isUndefined(path.type)) { + while (i < path.length) { + latlng; + if (angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) { + latlng = new google.maps.LatLng(path[i].latitude, path[i].longitude); + } else if (typeof path[i].lat === 'function' && typeof path[i].lng === 'function') { + latlng = path[i]; + } + result.push(latlng); + i++; + } + } else { + array; + if (path.type === 'Polygon') { + array = path.coordinates[0]; + } else if (path.type === 'MultiPolygon') { + trackMaxVertices = { + max: 0, + index: 0 + }; + _.forEach(path.coordinates, function(polygon, index) { + if (polygon[0].length > this.max) { + this.max = polygon[0].length; + return this.index = index; + } + }, trackMaxVertices); + array = path.coordinates[trackMaxVertices.index][0]; + } else if (path.type === 'LineString') { + array = path.coordinates; + } + while (i < array.length) { + result.push(new google.maps.LatLng(array[i][1], array[i][0])); + i++; + } + } + return result; + }, + getPath: function(object, key) { + var obj; + if ((key == null) || !_.isString(key)) { + return key; + } + obj = object; + _.each(key.split('.'), function(value) { + if (obj) { + return obj = obj[value]; + } + }); + return obj; + }, + validateBoundPoints: function(bounds) { + if (angular.isUndefined(bounds.sw.latitude) || angular.isUndefined(bounds.sw.longitude) || angular.isUndefined(bounds.ne.latitude) || angular.isUndefined(bounds.ne.longitude)) { + return false; + } + return true; + }, + convertBoundPoints: function(bounds) { + var result; + result = new google.maps.LatLngBounds(new google.maps.LatLng(bounds.sw.latitude, bounds.sw.longitude), new google.maps.LatLng(bounds.ne.latitude, bounds.ne.longitude)); + return result; + }, + fitMapBounds: function(map, bounds) { + return map.fitBounds(bounds); + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapIsReady', [ + '$q', '$timeout', function($q, $timeout) { + var _checkIfReady, _ctr, _promises, _proms; + _ctr = 0; + _proms = []; + _promises = function() { + return $q.all(_proms); + }; + _checkIfReady = function(deferred, expectedInstances, retriesLeft) { + return $timeout(function() { + if (retriesLeft <= 0) { + deferred.reject('Your maps are not found we have checked the maximum amount of times. :)'); + return; + } + if (_ctr !== expectedInstances) { + _checkIfReady(deferred, expectedInstances, retriesLeft - 1); + } else { + deferred.resolve(_promises()); + } + }, 100); + }; + return { + spawn: function() { + var d; + d = $q.defer(); + _proms.push(d.promise); + _ctr += 1; + return { + instance: _ctr, + deferred: d + }; + }, + promises: _promises, + instances: function() { + return _ctr; + }, + promise: function(expectedInstances, numRetries) { + var d; + if (expectedInstances == null) { + expectedInstances = 1; + } + if (numRetries == null) { + numRetries = 50; + } + d = $q.defer(); + _checkIfReady(d, expectedInstances, numRetries); + return d.promise; + }, + reset: function() { + _ctr = 0; + _proms.length = 0; + }, + decrement: function() { + if (_ctr > 0) { + _ctr -= 1; + } + if (_proms.length) { + _proms.length -= 1; + } + } + }; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapLinked", [ + "uiGmapBaseObject", function(BaseObject) { + var Linked; + Linked = (function(superClass) { + extend(Linked, superClass); + + function Linked(scope, element, attrs, ctrls) { + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.ctrls = ctrls; + } + + return Linked; + + })(BaseObject); + return Linked; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapLogger', [ + 'nemSimpleLogger', function(nemSimpleLogger) { + return nemSimpleLogger.spawn(); + } + ]); + +}).call(this); +; +/*global _:true, angular:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapModelKey', [ + 'uiGmapBaseObject', 'uiGmapGmapUtil', function(BaseObject, GmapUtil) { + return (function(superClass) { + extend(_Class, superClass); + + function _Class(scope1, _interface) { + this.scope = scope1; + this["interface"] = _interface != null ? _interface : { + scopeKeys: [] + }; + this.modelsLength = bind(this.modelsLength, this); + this.updateChild = bind(this.updateChild, this); + this.destroy = bind(this.destroy, this); + this.setChildScope = bind(this.setChildScope, this); + this.getChanges = bind(this.getChanges, this); + this.getProp = bind(this.getProp, this); + this.setIdKey = bind(this.setIdKey, this); + this.modelKeyComparison = bind(this.modelKeyComparison, this); + _Class.__super__.constructor.call(this); + this.defaultIdKey = 'id'; + this.idKey = void 0; + } + + _Class.prototype.evalModelHandle = function(model, modelKey) { + if ((model == null) || (modelKey == null)) { + return; + } + if (modelKey === 'self') { + return model; + } else { + if (_.isFunction(modelKey)) { + modelKey = modelKey(); + } + return GmapUtil.getPath(model, modelKey); + } + }; + + _Class.prototype.modelKeyComparison = function(model1, model2) { + var coord1, coord2, hasCoords, isEqual, scope, without; + hasCoords = this["interface"].scopeKeys.indexOf('coords') >= 0; + if (hasCoords && (this.scope.coords != null) || !hasCoords) { + scope = this.scope; + } + if (scope == null) { + throw 'No scope set!'; + } + if (hasCoords) { + coord1 = this.scopeOrModelVal('coords', scope, model1); + coord2 = this.scopeOrModelVal('coords', scope, model2); + isEqual = GmapUtil.equalCoords(coord1, coord2); + if (!isEqual) { + return isEqual; + } + } + without = _.without(this["interface"].scopeKeys, 'coords'); + isEqual = _.every(without, (function(_this) { + return function(k) { + var m1, m2; + m1 = _this.scopeOrModelVal(scope[k], scope, model1); + m2 = _this.scopeOrModelVal(scope[k], scope, model2); + if (scope.deepComparison) { + return _.isEqual(m1, m2); + } else { + return m1 === m2; + } + }; + })(this)); + return isEqual; + }; + + _Class.prototype.setIdKey = function(scope) { + return this.idKey = scope.idKey != null ? scope.idKey : this.defaultIdKey; + }; + + _Class.prototype.setVal = function(model, key, newValue) { + this.modelOrKey(model, key = newValue); + return model; + }; + + _Class.prototype.modelOrKey = function(model, key) { + if (key == null) { + return; + } + if (key !== 'self') { + return GmapUtil.getPath(model, key); + } + return model; + }; + + _Class.prototype.getProp = function(propName, scope, model) { + return this.scopeOrModelVal(propName, scope, model); + }; + + + /* + For the cases were watching a large object we only want to know the list of props + that actually changed. + Also we want to limit the amount of props we analyze to whitelisted props that are + actually tracked by scope. (should make things faster with whitelisted) + */ + + _Class.prototype.getChanges = function(now, prev, whitelistedProps) { + var c, changes, prop; + if (whitelistedProps) { + prev = _.pick(prev, whitelistedProps); + now = _.pick(now, whitelistedProps); + } + changes = {}; + prop = {}; + c = {}; + for (prop in now) { + if (!prev || prev[prop] !== now[prop]) { + if (_.isArray(now[prop])) { + changes[prop] = now[prop]; + } else if (_.isObject(now[prop])) { + c = this.getChanges(now[prop], (prev ? prev[prop] : null)); + if (!_.isEmpty(c)) { + changes[prop] = c; + } + } else { + changes[prop] = now[prop]; + } + } + } + return changes; + }; + + _Class.prototype.scopeOrModelVal = function(key, scope, model, doWrap) { + var maybeWrap, modelKey, modelProp, scopeProp; + if (doWrap == null) { + doWrap = false; + } + maybeWrap = function(isScope, ret, doWrap) { + if (doWrap == null) { + doWrap = false; + } + if (doWrap) { + return { + isScope: isScope, + value: ret + }; + } + return ret; + }; + scopeProp = _.get(scope, key); + if (_.isFunction(scopeProp)) { + return maybeWrap(true, scopeProp(model), doWrap); + } + if (_.isObject(scopeProp)) { + return maybeWrap(true, scopeProp, doWrap); + } + if (!_.isString(scopeProp)) { + return maybeWrap(true, scopeProp, doWrap); + } + modelKey = scopeProp; + if (!modelKey) { + modelProp = _.get(model, key); + } else { + modelProp = modelKey === 'self' ? model : _.get(model, modelKey); + } + if (_.isFunction(modelProp)) { + return maybeWrap(false, modelProp(), doWrap); + } + return maybeWrap(false, modelProp, doWrap); + }; + + _Class.prototype.setChildScope = function(keys, childScope, model) { + var isScopeObj, key, name, newValue; + for (key in keys) { + name = keys[key]; + isScopeObj = this.scopeOrModelVal(name, childScope, model, true); + if ((isScopeObj != null ? isScopeObj.value : void 0) != null) { + newValue = isScopeObj.value; + if (newValue !== childScope[name]) { + childScope[name] = newValue; + } + } + } + return childScope.model = model; + }; + + _Class.prototype.onDestroy = function(scope) {}; + + _Class.prototype.destroy = function(manualOverride) { + var ref; + if (manualOverride == null) { + manualOverride = false; + } + if ((this.scope != null) && !((ref = this.scope) != null ? ref.$$destroyed : void 0) && (this.needToManualDestroy || manualOverride)) { + return this.scope.$destroy(); + } else { + return this.clean(); + } + }; + + _Class.prototype.updateChild = function(child, model) { + if (model[this.idKey] == null) { + this.$log.error("Model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."); + return; + } + return child.updateModel(model); + }; + + _Class.prototype.modelsLength = function(arrayOrObjModels) { + var len, toCheck; + if (arrayOrObjModels == null) { + arrayOrObjModels = void 0; + } + len = 0; + toCheck = arrayOrObjModels ? arrayOrObjModels : this.scope.models; + if (toCheck == null) { + return len; + } + if (angular.isArray(toCheck) || (toCheck.length != null)) { + len = toCheck.length; + } else { + len = Object.keys(toCheck).length; + } + return len; + }; + + return _Class; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapModelsWatcher', [ + 'uiGmapLogger', 'uiGmap_async', '$q', 'uiGmapPromise', function(Logger, _async, $q, uiGmapPromise) { + return { + didQueueInitPromise: function(existingPiecesObj, scope) { + if (scope.models.length === 0) { + _async.promiseLock(existingPiecesObj, uiGmapPromise.promiseTypes.init, null, null, (function() { + return uiGmapPromise.resolve(); + })); + return true; + } + return false; + }, + figureOutState: function(idKey, scope, childObjects, comparison, callBack) { + var adds, children, mappedScopeModelIds, removals, updates; + adds = []; + mappedScopeModelIds = {}; + removals = []; + updates = []; + scope.models.forEach(function(m) { + var child; + if (m[idKey] != null) { + mappedScopeModelIds[m[idKey]] = {}; + if (childObjects.get(m[idKey]) == null) { + return adds.push(m); + } else { + child = childObjects.get(m[idKey]); + if (!comparison(m, child.clonedModel, scope)) { + return updates.push({ + model: m, + child: child + }); + } + } + } else { + return Logger.error(' id missing for model #{m.toString()},\ncan not use do comparison/insertion'); + } + }); + children = childObjects.values(); + children.forEach(function(c) { + var id; + if (c == null) { + Logger.error('child undefined in ModelsWatcher.'); + return; + } + if (c.model == null) { + Logger.error('child.model undefined in ModelsWatcher.'); + return; + } + id = c.model[idKey]; + if (mappedScopeModelIds[id] == null) { + return removals.push(c); + } + }); + return { + adds: adds, + removals: removals, + updates: updates + }; + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapPromise', [ + '$q', '$timeout', 'uiGmapLogger', function($q, $timeout, $log) { + var ExposedPromise, SniffedPromise, defer, isInProgress, isResolved, promise, promiseStatus, promiseStatuses, promiseTypes, resolve, strPromiseStatuses; + promiseTypes = { + create: 'create', + update: 'update', + "delete": 'delete', + init: 'init' + }; + promiseStatuses = { + IN_PROGRESS: 0, + RESOLVED: 1, + REJECTED: 2 + }; + strPromiseStatuses = (function() { + var obj; + obj = {}; + obj["" + promiseStatuses.IN_PROGRESS] = 'in-progress'; + obj["" + promiseStatuses.RESOLVED] = 'resolved'; + obj["" + promiseStatuses.REJECTED] = 'rejected'; + return obj; + })(); + isInProgress = function(promise) { + if (promise.$$state) { + return promise.$$state.status === promiseStatuses.IN_PROGRESS; + } + if (!promise.hasOwnProperty("$$v")) { + return true; + } + }; + isResolved = function(promise) { + if (promise.$$state) { + return promise.$$state.status === promiseStatuses.RESOLVED; + } + if (promise.hasOwnProperty("$$v")) { + return true; + } + }; + promiseStatus = function(status) { + return strPromiseStatuses[status] || 'done w error'; + }; + ExposedPromise = function(promise) { + var cancelDeferred, combined, wrapped; + cancelDeferred = $q.defer(); + combined = $q.all([promise, cancelDeferred.promise]); + wrapped = $q.defer(); + promise.then(cancelDeferred.resolve, (function() {}), function(notify) { + cancelDeferred.notify(notify); + return wrapped.notify(notify); + }); + combined.then(function(successes) { + return wrapped.resolve(successes[0] || successes[1]); + }, function(error) { + return wrapped.reject(error); + }); + wrapped.promise.cancel = function(reason) { + if (reason == null) { + reason = 'canceled'; + } + return cancelDeferred.reject(reason); + }; + wrapped.promise.notify = function(msg) { + if (msg == null) { + msg = 'cancel safe'; + } + wrapped.notify(msg); + if (promise.hasOwnProperty('notify')) { + return promise.notify(msg); + } + }; + if (promise.promiseType != null) { + wrapped.promise.promiseType = promise.promiseType; + } + return wrapped.promise; + }; + SniffedPromise = function(fnPromise, promiseType) { + return { + promise: fnPromise, + promiseType: promiseType + }; + }; + defer = function() { + return $q.defer(); + }; + resolve = function() { + var d; + d = $q.defer(); + d.resolve.apply(void 0, arguments); + return d.promise; + }; + promise = function(fnToWrap) { + var d; + if (!_.isFunction(fnToWrap)) { + $log.error("uiGmapPromise.promise() only accepts functions"); + return; + } + d = $q.defer(); + $timeout(function() { + var result; + result = fnToWrap(); + return d.resolve(result); + }); + return d.promise; + }; + return { + defer: defer, + promise: promise, + resolve: resolve, + promiseTypes: promiseTypes, + isInProgress: isInProgress, + isResolved: isResolved, + promiseStatus: promiseStatus, + ExposedPromise: ExposedPromise, + SniffedPromise: SniffedPromise + }; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapPropMap", function() { + + /* + Simple Object Map with a length property to make it easy to track length/size + */ + var PropMap; + return PropMap = (function() { + function PropMap() { + this.removeAll = bind(this.removeAll, this); + this.slice = bind(this.slice, this); + this.push = bind(this.push, this); + this.keys = bind(this.keys, this); + this.values = bind(this.values, this); + this.remove = bind(this.remove, this); + this.put = bind(this.put, this); + this.stateChanged = bind(this.stateChanged, this); + this.get = bind(this.get, this); + this.length = 0; + this.dict = {}; + this.didValsStateChange = false; + this.didKeysStateChange = false; + this.allVals = []; + this.allKeys = []; + } + + PropMap.prototype.get = function(key) { + return this.dict[key]; + }; + + PropMap.prototype.stateChanged = function() { + this.didValsStateChange = true; + return this.didKeysStateChange = true; + }; + + PropMap.prototype.put = function(key, value) { + if (this.get(key) == null) { + this.length++; + } + this.stateChanged(); + return this.dict[key] = value; + }; + + PropMap.prototype.remove = function(key, isSafe) { + var value; + if (isSafe == null) { + isSafe = false; + } + if (isSafe && !this.get(key)) { + return void 0; + } + value = this.dict[key]; + delete this.dict[key]; + this.length--; + this.stateChanged(); + return value; + }; + + PropMap.prototype.valuesOrKeys = function(str) { + var keys, vals; + if (str == null) { + str = 'Keys'; + } + if (!this["did" + str + "StateChange"]) { + return this['all' + str]; + } + vals = []; + keys = []; + _.each(this.dict, function(v, k) { + vals.push(v); + return keys.push(k); + }); + this.didKeysStateChange = false; + this.didValsStateChange = false; + this.allVals = vals; + this.allKeys = keys; + return this['all' + str]; + }; + + PropMap.prototype.values = function() { + return this.valuesOrKeys('Vals'); + }; + + PropMap.prototype.keys = function() { + return this.valuesOrKeys(); + }; + + PropMap.prototype.push = function(obj, key) { + if (key == null) { + key = "key"; + } + return this.put(obj[key], obj); + }; + + PropMap.prototype.slice = function() { + return this.keys().map((function(_this) { + return function(k) { + return _this.remove(k); + }; + })(this)); + }; + + PropMap.prototype.removeAll = function() { + return this.slice(); + }; + + PropMap.prototype.each = function(cb) { + return _.each(this.dict, function(v, k) { + return cb(v); + }); + }; + + PropMap.prototype.map = function(cb) { + return _.map(this.dict, function(v, k) { + return cb(v); + }); + }; + + return PropMap; + + })(); + }); + +}).call(this); +; +/*globals angular,_ */ + +(function() { + angular.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapPropertyAction", [ + "uiGmapLogger", function(Logger) { + var PropertyAction; + PropertyAction = function(setterFn) { + this.setIfChange = function(callingKey) { + return function(newVal, oldVal) { + if (!_.isEqual(oldVal, newVal)) { + return setterFn(callingKey, newVal); + } + }; + }; + this.sic = this.setIfChange; + return this; + }; + return PropertyAction; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps.directives.api.managers').factory('uiGmapClustererMarkerManager', [ + 'uiGmapLogger', 'uiGmapFitHelper', 'uiGmapPropMap', 'uiGmapEventsHelper', function($log, FitHelper, PropMap, EventsHelper) { + var ClustererMarkerManager; + ClustererMarkerManager = (function() { + ClustererMarkerManager.type = 'ClustererMarkerManager'; + + function ClustererMarkerManager(gMap, opt_markers, opt_options, opt_events) { + if (opt_markers == null) { + opt_markers = {}; + } + this.opt_options = opt_options != null ? opt_options : {}; + this.opt_events = opt_events; + this.getGMarkers = bind(this.getGMarkers, this); + this.fit = bind(this.fit, this); + this.destroy = bind(this.destroy, this); + this.attachEvents = bind(this.attachEvents, this); + this.clear = bind(this.clear, this); + this.draw = bind(this.draw, this); + this.removeMany = bind(this.removeMany, this); + this.remove = bind(this.remove, this); + this.addMany = bind(this.addMany, this); + this.update = bind(this.update, this); + this.add = bind(this.add, this); + this.type = ClustererMarkerManager.type; + this.clusterer = new NgMapMarkerClusterer(gMap, opt_markers, this.opt_options); + this.propMapGMarkers = new PropMap(); + this.attachEvents(this.opt_events, 'opt_events'); + this.clusterer.setIgnoreHidden(true); + this.noDrawOnSingleAddRemoves = true; + $log.info(this); + } + + ClustererMarkerManager.prototype.checkKey = function(gMarker) { + var msg; + if (gMarker.key == null) { + msg = 'gMarker.key undefined and it is REQUIRED!!'; + return $log.error(msg); + } + }; + + ClustererMarkerManager.prototype.add = function(gMarker) { + this.checkKey(gMarker); + this.clusterer.addMarker(gMarker, this.noDrawOnSingleAddRemoves); + this.propMapGMarkers.put(gMarker.key, gMarker); + return this.checkSync(); + }; + + ClustererMarkerManager.prototype.update = function(gMarker) { + this.remove(gMarker); + return this.add(gMarker); + }; + + ClustererMarkerManager.prototype.addMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.add(gMarker); + }; + })(this)); + }; + + ClustererMarkerManager.prototype.remove = function(gMarker) { + var exists; + this.checkKey(gMarker); + exists = this.propMapGMarkers.get(gMarker.key); + if (exists) { + this.clusterer.removeMarker(gMarker, this.noDrawOnSingleAddRemoves); + this.propMapGMarkers.remove(gMarker.key); + } + return this.checkSync(); + }; + + ClustererMarkerManager.prototype.removeMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.remove(gMarker); + }; + })(this)); + }; + + ClustererMarkerManager.prototype.draw = function() { + return this.clusterer.repaint(); + }; + + ClustererMarkerManager.prototype.clear = function() { + this.removeMany(this.getGMarkers()); + return this.clusterer.repaint(); + }; + + ClustererMarkerManager.prototype.attachEvents = function(options, optionsName) { + var eventHandler, eventName, results; + this.listeners = []; + if (angular.isDefined(options) && (options != null) && angular.isObject(options)) { + results = []; + for (eventName in options) { + eventHandler = options[eventName]; + if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) { + $log.info(optionsName + ": Attaching event: " + eventName + " to clusterer"); + results.push(this.listeners.push(google.maps.event.addListener(this.clusterer, eventName, options[eventName]))); + } else { + results.push(void 0); + } + } + return results; + } + }; + + ClustererMarkerManager.prototype.clearEvents = function() { + EventsHelper.removeEvents(this.listeners); + return this.listeners = []; + }; + + ClustererMarkerManager.prototype.destroy = function() { + this.clearEvents(); + return this.clear(); + }; + + ClustererMarkerManager.prototype.fit = function() { + return FitHelper.fit(this.getGMarkers(), this.clusterer.getMap()); + }; + + ClustererMarkerManager.prototype.getGMarkers = function() { + return this.clusterer.getMarkers().values(); + }; + + ClustererMarkerManager.prototype.checkSync = function() {}; + + return ClustererMarkerManager; + + })(); + return ClustererMarkerManager; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.managers').service('uiGmapGoogleMapObjectManager', [ + function() { + var _availableInstances, _usedInstances; + _availableInstances = []; + _usedInstances = []; + return { + createMapInstance: function(parentElement, options) { + var instance; + instance = null; + if (_availableInstances.length === 0) { + instance = new google.maps.Map(parentElement, options); + _usedInstances.push(instance); + } else { + instance = _availableInstances.pop(); + angular.element(parentElement).append(instance.getDiv()); + instance.setOptions(options); + _usedInstances.push(instance); + } + return instance; + }, + recycleMapInstance: function(instance) { + var index; + index = _usedInstances.indexOf(instance); + if (index < 0) { + throw new Error('Expected map instance to be a previously used instance'); + } + _usedInstances.splice(index, 1); + return _availableInstances.push(instance); + } + }; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module("uiGmapgoogle-maps.directives.api.managers").factory("uiGmapMarkerManager", [ + "uiGmapLogger", "uiGmapFitHelper", "uiGmapPropMap", function(Logger, FitHelper, PropMap) { + var MarkerManager; + MarkerManager = (function() { + MarkerManager.type = 'MarkerManager'; + + function MarkerManager(gMap, opt_markers, opt_options) { + this.getGMarkers = bind(this.getGMarkers, this); + this.fit = bind(this.fit, this); + this.handleOptDraw = bind(this.handleOptDraw, this); + this.clear = bind(this.clear, this); + this.destroy = bind(this.destroy, this); + this.draw = bind(this.draw, this); + this.removeMany = bind(this.removeMany, this); + this.remove = bind(this.remove, this); + this.addMany = bind(this.addMany, this); + this.update = bind(this.update, this); + this.add = bind(this.add, this); + this.type = MarkerManager.type; + this.gMap = gMap; + this.gMarkers = new PropMap(); + this.$log = Logger; + this.$log.info(this); + } + + MarkerManager.prototype.add = function(gMarker, optDraw) { + var exists, msg; + if (optDraw == null) { + optDraw = true; + } + if (gMarker.key == null) { + msg = "gMarker.key undefined and it is REQUIRED!!"; + Logger.error(msg); + throw msg; + } + exists = this.gMarkers.get(gMarker.key); + if (!exists) { + this.handleOptDraw(gMarker, optDraw, true); + return this.gMarkers.put(gMarker.key, gMarker); + } + }; + + MarkerManager.prototype.update = function(gMarker, optDraw) { + if (optDraw == null) { + optDraw = true; + } + this.remove(gMarker, optDraw); + return this.add(gMarker, optDraw); + }; + + MarkerManager.prototype.addMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.add(gMarker); + }; + })(this)); + }; + + MarkerManager.prototype.remove = function(gMarker, optDraw) { + if (optDraw == null) { + optDraw = true; + } + this.handleOptDraw(gMarker, optDraw, false); + if (this.gMarkers.get(gMarker.key)) { + return this.gMarkers.remove(gMarker.key); + } + }; + + MarkerManager.prototype.removeMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(marker) { + return _this.remove(marker); + }; + })(this)); + }; + + MarkerManager.prototype.draw = function() { + var deletes; + deletes = []; + this.gMarkers.each((function(_this) { + return function(gMarker) { + if (!gMarker.isDrawn) { + if (gMarker.doAdd) { + gMarker.setMap(_this.gMap); + return gMarker.isDrawn = true; + } else { + return deletes.push(gMarker); + } + } + }; + })(this)); + return deletes.forEach((function(_this) { + return function(gMarker) { + gMarker.isDrawn = false; + return _this.remove(gMarker, true); + }; + })(this)); + }; + + MarkerManager.prototype.destroy = function() { + return this.clear(); + }; + + MarkerManager.prototype.clear = function() { + this.gMarkers.each(function(gMarker) { + return gMarker.setMap(null); + }); + delete this.gMarkers; + return this.gMarkers = new PropMap(); + }; + + MarkerManager.prototype.handleOptDraw = function(gMarker, optDraw, doAdd) { + if (optDraw === true) { + if (doAdd) { + gMarker.setMap(this.gMap); + } else { + gMarker.setMap(null); + } + return gMarker.isDrawn = true; + } else { + gMarker.isDrawn = false; + return gMarker.doAdd = doAdd; + } + }; + + MarkerManager.prototype.fit = function() { + return FitHelper.fit(this.getGMarkers(), this.gMap); + }; + + MarkerManager.prototype.getGMarkers = function() { + return this.gMarkers.values(); + }; + + return MarkerManager; + + })(); + return MarkerManager; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps.directives.api.managers').factory('uiGmapSpiderfierMarkerManager', [ + 'uiGmapLogger', 'uiGmapFitHelper', 'uiGmapPropMap', 'uiGmapMarkerSpiderfier', function($log, FitHelper, PropMap, MarkerSpiderfier) { + var SpiderfierMarkerManager; + return SpiderfierMarkerManager = (function() { + SpiderfierMarkerManager.type = 'SpiderfierMarkerManager'; + + function SpiderfierMarkerManager(gMap, opt_markers, opt_options, opt_events, scope) { + if (opt_markers == null) { + opt_markers = {}; + } + this.opt_options = opt_options != null ? opt_options : {}; + this.opt_events = opt_events; + this.scope = scope; + this.isSpiderfied = bind(this.isSpiderfied, this); + this.getGMarkers = bind(this.getGMarkers, this); + this.fit = bind(this.fit, this); + this.destroy = bind(this.destroy, this); + this.attachEvents = bind(this.attachEvents, this); + this.clear = bind(this.clear, this); + this.removeMany = bind(this.removeMany, this); + this.remove = bind(this.remove, this); + this.addMany = bind(this.addMany, this); + this.update = bind(this.update, this); + this.add = bind(this.add, this); + this.type = SpiderfierMarkerManager.type; + this.markerSpiderfier = new MarkerSpiderfier(gMap, this.opt_options); + this.propMapGMarkers = new PropMap(); + this.attachEvents(this.opt_events, 'opt_events'); + this.noDrawOnSingleAddRemoves = true; + $log.info(this); + } + + SpiderfierMarkerManager.prototype.checkKey = function(gMarker) { + var msg; + if (gMarker.key == null) { + msg = 'gMarker.key undefined and it is REQUIRED!!'; + return $log.error(msg); + } + }; + + SpiderfierMarkerManager.prototype.add = function(gMarker) { + gMarker.setMap(this.markerSpiderfier.map); + this.checkKey(gMarker); + this.markerSpiderfier.addMarker(gMarker, this.noDrawOnSingleAddRemoves); + this.propMapGMarkers.put(gMarker.key, gMarker); + return this.checkSync(); + }; + + SpiderfierMarkerManager.prototype.update = function(gMarker) { + this.remove(gMarker); + return this.add(gMarker); + }; + + SpiderfierMarkerManager.prototype.addMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.add(gMarker); + }; + })(this)); + }; + + SpiderfierMarkerManager.prototype.remove = function(gMarker) { + var exists; + this.checkKey(gMarker); + exists = this.propMapGMarkers.get(gMarker.key); + if (exists) { + gMarker.setMap(null); + this.markerSpiderfier.removeMarker(gMarker, this.noDrawOnSingleAddRemoves); + this.propMapGMarkers.remove(gMarker.key); + } + return this.checkSync(); + }; + + SpiderfierMarkerManager.prototype.removeMany = function(gMarkers) { + return gMarkers.forEach((function(_this) { + return function(gMarker) { + return _this.remove(gMarker); + }; + })(this)); + }; + + SpiderfierMarkerManager.prototype.draw = function() {}; + + SpiderfierMarkerManager.prototype.clear = function() { + return this.removeMany(this.getGMarkers()); + }; + + SpiderfierMarkerManager.prototype.attachEvents = function(options, optionsName) { + if (angular.isDefined(options) && (options != null) && angular.isObject(options)) { + return _.each(options, (function(_this) { + return function(eventHandler, eventName) { + if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) { + $log.info(optionsName + ": Attaching event: " + eventName + " to markerSpiderfier"); + return _this.markerSpiderfier.addListener(eventName, function() { + if (eventName === 'spiderfy' || eventName === 'unspiderfy') { + return _this.scope.$evalAsync(options[eventName].apply(options, arguments)); + } else { + return _this.scope.$evalAsync(options[eventName].apply(options, [arguments[0], eventName, arguments[0].model, arguments])); + } + }); + } + }; + })(this)); + } + }; + + SpiderfierMarkerManager.prototype.clearEvents = function(options, optionsName) { + var eventHandler, eventName; + if (angular.isDefined(options) && (options != null) && angular.isObject(options)) { + for (eventName in options) { + eventHandler = options[eventName]; + if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) { + $log.info(optionsName + ": Clearing event: " + eventName + " to markerSpiderfier"); + this.markerSpiderfier.clearListeners(eventName); + } + } + } + }; + + SpiderfierMarkerManager.prototype.destroy = function() { + this.clearEvents(this.opt_events, 'opt_events'); + return this.clear(); + }; + + SpiderfierMarkerManager.prototype.fit = function() { + return FitHelper.fit(this.getGMarkers(), this.markerSpiderfier.map); + }; + + SpiderfierMarkerManager.prototype.getGMarkers = function() { + return this.markerSpiderfier.getMarkers(); + }; + + SpiderfierMarkerManager.prototype.isSpiderfied = function() { + return _.find(this.getGMarkers(), function(gMarker) { + return (gMarker != null ? gMarker._omsData : void 0) != null; + }); + }; + + SpiderfierMarkerManager.prototype.checkSync = function() {}; + + return SpiderfierMarkerManager; + + })(); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').factory('uiGmapadd-events', [ + '$timeout', function($timeout) { + var addEvent, addEvents; + addEvent = function(target, eventName, handler) { + return google.maps.event.addListener(target, eventName, function() { + handler.apply(this, arguments); + return $timeout((function() {}), true); + }); + }; + addEvents = function(target, eventName, handler) { + var remove; + if (handler) { + return addEvent(target, eventName, handler); + } + remove = []; + angular.forEach(eventName, function(_handler, key) { + return remove.push(addEvent(target, key, _handler)); + }); + return function() { + angular.forEach(remove, function(listener) { + return google.maps.event.removeListener(listener); + }); + return remove = null; + }; + }; + return addEvents; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').factory('uiGmaparray-sync', [ + 'uiGmapadd-events', function(mapEvents) { + return function(mapArray, scope, pathEval, pathChangedFn) { + var geojsonArray, geojsonHandlers, geojsonWatcher, isSetFromScope, legacyHandlers, legacyWatcher, mapArrayListener, scopePath, watchListener; + isSetFromScope = false; + scopePath = scope.$eval(pathEval); + if (!scope["static"]) { + legacyHandlers = { + set_at: function(index) { + var value; + if (isSetFromScope) { + return; + } + value = mapArray.getAt(index); + if (!value) { + return; + } + if (!value.lng || !value.lat) { + return scopePath[index] = value; + } else { + scopePath[index].latitude = value.lat(); + return scopePath[index].longitude = value.lng(); + } + }, + insert_at: function(index) { + var value; + if (isSetFromScope) { + return; + } + value = mapArray.getAt(index); + if (!value) { + return; + } + if (!value.lng || !value.lat) { + return scopePath.splice(index, 0, value); + } else { + return scopePath.splice(index, 0, { + latitude: value.lat(), + longitude: value.lng() + }); + } + }, + remove_at: function(index) { + if (isSetFromScope) { + return; + } + return scopePath.splice(index, 1); + } + }; + geojsonArray; + if (scopePath.type === 'Polygon') { + geojsonArray = scopePath.coordinates[0]; + } else if (scopePath.type === 'LineString') { + geojsonArray = scopePath.coordinates; + } + geojsonHandlers = { + set_at: function(index) { + var value; + if (isSetFromScope) { + return; + } + value = mapArray.getAt(index); + if (!(value && value.lng && value.lat)) { + return; + } + geojsonArray[index][1] = value.lat(); + return geojsonArray[index][0] = value.lng(); + }, + insert_at: function(index) { + var value; + if (isSetFromScope) { + return; + } + value = mapArray.getAt(index); + if (!value) { + return; + } + if (!value.lng || !value.lat) { + return; + } + return geojsonArray.splice(index, 0, [value.lng(), value.lat()]); + }, + remove_at: function(index) { + if (isSetFromScope) { + return; + } + return geojsonArray.splice(index, 1); + } + }; + mapArrayListener = mapEvents(mapArray, angular.isUndefined(scopePath.type) ? legacyHandlers : geojsonHandlers); + } + legacyWatcher = function(newPath) { + var changed, i, l, newLength, newValue, oldArray, oldLength, oldValue; + isSetFromScope = true; + oldArray = mapArray; + changed = false; + if (newPath) { + i = 0; + oldLength = oldArray.getLength(); + newLength = newPath.length; + l = Math.min(oldLength, newLength); + newValue = void 0; + while (i < l) { + oldValue = oldArray.getAt(i); + newValue = newPath[i]; + if (typeof newValue.equals === 'function') { + if (!newValue.equals(oldValue)) { + oldArray.setAt(i, newValue); + changed = true; + } + } else { + if ((oldValue.lat() !== newValue.latitude) || (oldValue.lng() !== newValue.longitude)) { + oldArray.setAt(i, new google.maps.LatLng(newValue.latitude, newValue.longitude)); + changed = true; + } + } + i++; + } + while (i < newLength) { + newValue = newPath[i]; + if (typeof newValue.lat === 'function' && typeof newValue.lng === 'function') { + oldArray.push(newValue); + } else { + oldArray.push(new google.maps.LatLng(newValue.latitude, newValue.longitude)); + } + changed = true; + i++; + } + while (i < oldLength) { + oldArray.pop(); + changed = true; + i++; + } + } + isSetFromScope = false; + if (changed) { + return pathChangedFn(oldArray); + } + }; + geojsonWatcher = function(newPath) { + var array, changed, i, l, newLength, newValue, oldArray, oldLength, oldValue; + isSetFromScope = true; + oldArray = mapArray; + changed = false; + if (newPath) { + array; + if (scopePath.type === 'Polygon') { + array = newPath.coordinates[0]; + } else if (scopePath.type === 'LineString') { + array = newPath.coordinates; + } + i = 0; + oldLength = oldArray.getLength(); + newLength = array.length; + l = Math.min(oldLength, newLength); + newValue = void 0; + while (i < l) { + oldValue = oldArray.getAt(i); + newValue = array[i]; + if ((oldValue.lat() !== newValue[1]) || (oldValue.lng() !== newValue[0])) { + oldArray.setAt(i, new google.maps.LatLng(newValue[1], newValue[0])); + changed = true; + } + i++; + } + while (i < newLength) { + newValue = array[i]; + oldArray.push(new google.maps.LatLng(newValue[1], newValue[0])); + changed = true; + i++; + } + while (i < oldLength) { + oldArray.pop(); + changed = true; + i++; + } + } + isSetFromScope = false; + if (changed) { + return pathChangedFn(oldArray); + } + }; + watchListener; + if (!scope["static"]) { + if (angular.isUndefined(scopePath.type)) { + watchListener = scope.$watchCollection(pathEval, legacyWatcher); + } else { + watchListener = scope.$watch(pathEval, geojsonWatcher, true); + } + } + return function() { + if (mapArrayListener) { + mapArrayListener(); + mapArrayListener = null; + } + if (watchListener) { + watchListener(); + return watchListener = null; + } + }; + }; + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapChromeFixes", [ + '$timeout', function($timeout) { + return { + maybeRepaint: function(el) { + if (el) { + el.style.opacity = 0.9; + return $timeout(function() { + return el.style.opacity = 1; + }); + } + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').service('uiGmapObjectIterators', function() { + var _ignores, _iterators, _slapForEach, _slapMap; + _ignores = ['length', 'forEach', 'map']; + _iterators = []; + _slapForEach = function(object) { + object.forEach = function(cb) { + return _.each(_.omit(object, _ignores), function(val) { + if (!_.isFunction(val)) { + return cb(val); + } + }); + }; + return object; + }; + _iterators.push(_slapForEach); + _slapMap = function(object) { + object.map = function(cb) { + return _.map(_.omit(object, _ignores), function(val) { + if (!_.isFunction(val)) { + return cb(val); + } + }); + }; + return object; + }; + _iterators.push(_slapMap); + return { + slapMap: _slapMap, + slapForEach: _slapForEach, + slapAll: function(object) { + _iterators.forEach(function(it) { + return it(object); + }); + return object; + } + }; + }); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.options.builders').service('uiGmapCommonOptionsBuilder', [ + 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapModelKey', function(BaseObject, $log, ModelKey) { + var CommonOptionsBuilder; + return CommonOptionsBuilder = (function(superClass) { + extend(CommonOptionsBuilder, superClass); + + function CommonOptionsBuilder() { + this.watchProps = bind(this.watchProps, this); + this.buildOpts = bind(this.buildOpts, this); + return CommonOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + CommonOptionsBuilder.prototype.props = [ + 'clickable', 'draggable', 'editable', 'visible', { + prop: 'stroke', + isColl: true + } + ]; + + CommonOptionsBuilder.prototype.getCorrectModel = function(scope) { + if (angular.isDefined(scope != null ? scope.model : void 0)) { + return scope.model; + } else { + return scope; + } + }; + + CommonOptionsBuilder.prototype.buildOpts = function(customOpts, cachedEval, forEachOpts) { + var model, opts, stroke; + if (customOpts == null) { + customOpts = {}; + } + if (forEachOpts == null) { + forEachOpts = {}; + } + if (!this.scope) { + $log.error('this.scope not defined in CommonOptionsBuilder can not buildOpts'); + return; + } + if (!this.gMap) { + $log.error('this.map not defined in CommonOptionsBuilder can not buildOpts'); + return; + } + model = this.getCorrectModel(this.scope); + stroke = this.scopeOrModelVal('stroke', this.scope, model); + opts = angular.extend(customOpts, this.DEFAULTS, { + map: this.gMap, + strokeColor: stroke != null ? stroke.color : void 0, + strokeOpacity: stroke != null ? stroke.opacity : void 0, + strokeWeight: stroke != null ? stroke.weight : void 0 + }); + angular.forEach(angular.extend(forEachOpts, { + clickable: true, + draggable: false, + editable: false, + "static": false, + fit: false, + visible: true, + zIndex: 0, + icons: [] + }), (function(_this) { + return function(defaultValue, key) { + var val; + val = cachedEval ? cachedEval[key] : _this.scopeOrModelVal(key, _this.scope, model); + if (angular.isUndefined(val)) { + return opts[key] = defaultValue; + } else { + return opts[key] = model[key]; + } + }; + })(this)); + if (opts["static"]) { + opts.editable = false; + } + return opts; + }; + + CommonOptionsBuilder.prototype.watchProps = function(props) { + if (props == null) { + props = this.props; + } + return props.forEach((function(_this) { + return function(prop) { + if ((_this.attrs[prop] != null) || (_this.attrs[prop != null ? prop.prop : void 0] != null)) { + if (prop != null ? prop.isColl : void 0) { + return _this.scope.$watchCollection(prop.prop, _this.setMyOptions); + } else { + return _this.scope.$watch(prop, _this.setMyOptions); + } + } + }; + })(this)); + }; + + return CommonOptionsBuilder; + + })(ModelKey); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.options.builders').factory('uiGmapPolylineOptionsBuilder', [ + 'uiGmapCommonOptionsBuilder', function(CommonOptionsBuilder) { + var PolylineOptionsBuilder; + return PolylineOptionsBuilder = (function(superClass) { + extend(PolylineOptionsBuilder, superClass); + + function PolylineOptionsBuilder() { + return PolylineOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + PolylineOptionsBuilder.prototype.buildOpts = function(pathPoints, cachedEval) { + return PolylineOptionsBuilder.__super__.buildOpts.call(this, { + path: pathPoints + }, cachedEval, { + geodesic: false + }); + }; + + return PolylineOptionsBuilder; + + })(CommonOptionsBuilder); + } + ]).factory('uiGmapShapeOptionsBuilder', [ + 'uiGmapCommonOptionsBuilder', function(CommonOptionsBuilder) { + var ShapeOptionsBuilder; + return ShapeOptionsBuilder = (function(superClass) { + extend(ShapeOptionsBuilder, superClass); + + function ShapeOptionsBuilder() { + return ShapeOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + ShapeOptionsBuilder.prototype.buildOpts = function(customOpts, cachedEval, forEachOpts) { + var fill, model; + model = this.getCorrectModel(this.scope); + fill = cachedEval ? cachedEval['fill'] : this.scopeOrModelVal('fill', this.scope, model); + customOpts = angular.extend(customOpts, { + fillColor: fill != null ? fill.color : void 0, + fillOpacity: fill != null ? fill.opacity : void 0 + }); + return ShapeOptionsBuilder.__super__.buildOpts.call(this, customOpts, cachedEval, forEachOpts); + }; + + return ShapeOptionsBuilder; + + })(CommonOptionsBuilder); + } + ]).factory('uiGmapPolygonOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) { + var PolygonOptionsBuilder; + return PolygonOptionsBuilder = (function(superClass) { + extend(PolygonOptionsBuilder, superClass); + + function PolygonOptionsBuilder() { + return PolygonOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + PolygonOptionsBuilder.prototype.buildOpts = function(pathPoints, cachedEval) { + return PolygonOptionsBuilder.__super__.buildOpts.call(this, { + path: pathPoints + }, cachedEval, { + geodesic: false + }); + }; + + return PolygonOptionsBuilder; + + })(ShapeOptionsBuilder); + } + ]).factory('uiGmapRectangleOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) { + var RectangleOptionsBuilder; + return RectangleOptionsBuilder = (function(superClass) { + extend(RectangleOptionsBuilder, superClass); + + function RectangleOptionsBuilder() { + return RectangleOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + RectangleOptionsBuilder.prototype.buildOpts = function(bounds, cachedEval) { + return RectangleOptionsBuilder.__super__.buildOpts.call(this, { + bounds: bounds + }, cachedEval); + }; + + return RectangleOptionsBuilder; + + })(ShapeOptionsBuilder); + } + ]).factory('uiGmapCircleOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) { + var CircleOptionsBuilder; + return CircleOptionsBuilder = (function(superClass) { + extend(CircleOptionsBuilder, superClass); + + function CircleOptionsBuilder() { + return CircleOptionsBuilder.__super__.constructor.apply(this, arguments); + } + + CircleOptionsBuilder.prototype.buildOpts = function(center, radius, cachedEval) { + return CircleOptionsBuilder.__super__.buildOpts.call(this, { + center: center, + radius: radius + }, cachedEval); + }; + + return CircleOptionsBuilder; + + })(ShapeOptionsBuilder); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api.options').service('uiGmapMarkerOptions', [ + 'uiGmapLogger', 'uiGmapGmapUtil', function($log, GmapUtil) { + return _.extend(GmapUtil, { + createOptions: function(coords, icon, defaults, map) { + var opts; + if (defaults == null) { + defaults = {}; + } + opts = angular.extend({}, defaults, { + position: defaults.position != null ? defaults.position : GmapUtil.getCoords(coords), + visible: defaults.visible != null ? defaults.visible : GmapUtil.validateCoords(coords) + }); + if ((defaults.icon != null) || (icon != null)) { + opts = angular.extend(opts, { + icon: defaults.icon != null ? defaults.icon : icon + }); + } + if (map != null) { + opts.map = map; + } + return opts; + }, + isLabel: function(options) { + if (options == null) { + return false; + } + return (options.labelContent != null) || (options.labelAnchor != null) || (options.labelClass != null) || (options.labelStyle != null) || (options.labelVisible != null); + } + }); + } + ]); + +}).call(this); +; +/*global _,angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapBasePolyChildModel', [ + 'uiGmapLogger', '$timeout', 'uiGmaparray-sync', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function($log, $timeout, arraySync, GmapUtil, EventsHelper) { + return function(Builder, gFactory) { + var BasePolyChildModel; + return BasePolyChildModel = (function(superClass) { + extend(BasePolyChildModel, superClass); + + BasePolyChildModel.include(GmapUtil); + + function BasePolyChildModel(arg) { + var create, gObjectChangeCb, ref; + this.scope = arg.scope, this.attrs = arg.attrs, this.gMap = arg.gMap, this.defaults = arg.defaults, this.model = arg.model, gObjectChangeCb = arg.gObjectChangeCb, this.isScopeModel = (ref = arg.isScopeModel) != null ? ref : false; + this.clean = bind(this.clean, this); + if (this.isScopeModel) { + this.clonedModel = _.clone(this.model, true); + } + this.isDragging = false; + this.internalEvents = { + dragend: (function(_this) { + return function() { + return _.defer(function() { + return _this.isDragging = false; + }); + }; + })(this), + dragstart: (function(_this) { + return function() { + return _this.isDragging = true; + }; + })(this) + }; + create = (function(_this) { + return function() { + var maybeCachedEval; + if (_this.isDragging) { + return; + } + _this.pathPoints = _this.convertPathPoints(_this.scope.path); + if (_this.gObject != null) { + _this.clean(); + } + if (_this.scope.model != null) { + maybeCachedEval = _this.scope; + } + if (_this.pathPoints.length > 0) { + _this.gObject = gFactory(_this.buildOpts(_this.pathPoints, maybeCachedEval)); + } + if (_this.gObject) { + arraySync(_this.gObject.getPath(), _this.scope, 'path', function(pathPoints) { + _this.pathPoints = pathPoints; + if (gObjectChangeCb != null) { + return gObjectChangeCb(); + } + }); + if (angular.isDefined(_this.scope.events) && angular.isObject(_this.scope.events)) { + _this.listeners = _this.model ? EventsHelper.setEvents(_this.gObject, _this.scope, _this.model) : EventsHelper.setEvents(_this.gObject, _this.scope, _this.scope); + } + return _this.internalListeners = _this.model ? EventsHelper.setEvents(_this.gObject, { + events: _this.internalEvents + }, _this.model) : EventsHelper.setEvents(_this.gObject, { + events: _this.internalEvents + }, _this.scope); + } + }; + })(this); + create(); + this.scope.$watch('path', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue) || !_this.gObject) { + return create(); + } + }; + })(this), true); + if (!this.scope["static"] && angular.isDefined(this.scope.editable)) { + this.scope.$watch('editable', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + newValue = !_this.isFalse(newValue); + return (ref1 = _this.gObject) != null ? ref1.setEditable(newValue) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.draggable)) { + this.scope.$watch('draggable', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + newValue = !_this.isFalse(newValue); + return (ref1 = _this.gObject) != null ? ref1.setDraggable(newValue) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.visible)) { + this.scope.$watch('visible', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + newValue = !_this.isFalse(newValue); + } + return (ref1 = _this.gObject) != null ? ref1.setVisible(newValue) : void 0; + }; + })(this), true); + } + if (angular.isDefined(this.scope.geodesic)) { + this.scope.$watch('geodesic', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + newValue = !_this.isFalse(newValue); + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.weight)) { + this.scope.$watch('stroke.weight', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.color)) { + this.scope.$watch('stroke.color', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.opacity)) { + this.scope.$watch('stroke.opacity', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + if (angular.isDefined(this.scope.icons)) { + this.scope.$watch('icons', (function(_this) { + return function(newValue, oldValue) { + var ref1; + if (newValue !== oldValue) { + return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0; + } + }; + })(this), true); + } + this.scope.$on('$destroy', (function(_this) { + return function() { + _this.clean(); + return _this.scope = null; + }; + })(this)); + if (angular.isDefined(this.scope.fill) && angular.isDefined(this.scope.fill.color)) { + this.scope.$watch('fill.color', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath())); + } + }; + })(this)); + } + if (angular.isDefined(this.scope.fill) && angular.isDefined(this.scope.fill.opacity)) { + this.scope.$watch('fill.opacity', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath())); + } + }; + })(this)); + } + if (angular.isDefined(this.scope.zIndex)) { + this.scope.$watch('zIndex', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath())); + } + }; + })(this)); + } + } + + BasePolyChildModel.prototype.clean = function() { + var ref; + EventsHelper.removeEvents(this.listeners); + EventsHelper.removeEvents(this.internalListeners); + if ((ref = this.gObject) != null) { + ref.setMap(null); + } + return this.gObject = null; + }; + + return BasePolyChildModel; + + })(Builder); + }; + } + ]); + +}).call(this); +; +/* +@authors +Nicholas McCready - https://twitter.com/nmccready +Original idea from: http://stackoverflow.com/questions/22758950/google-map-drawing-freehand , & + http://jsfiddle.net/YsQdh/88/ + */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapDrawFreeHandChildModel', [ + 'uiGmapLogger', '$q', function($log, $q) { + var drawFreeHand, freeHandMgr; + drawFreeHand = function(map, polys, done) { + var move, poly; + poly = new google.maps.Polyline({ + map: map, + clickable: false + }); + move = google.maps.event.addListener(map, 'mousemove', function(e) { + return poly.getPath().push(e.latLng); + }); + google.maps.event.addListenerOnce(map, 'mouseup', function(e) { + var path; + google.maps.event.removeListener(move); + path = poly.getPath(); + poly.setMap(null); + polys.push(new google.maps.Polygon({ + map: map, + path: path + })); + poly = null; + google.maps.event.clearListeners(map.getDiv(), 'mousedown'); + return done(); + }); + return void 0; + }; + freeHandMgr = function(map1, scope) { + var disableMap, enableMap; + this.map = map1; + disableMap = (function(_this) { + return function() { + var mapOptions; + mapOptions = { + draggable: false, + disableDefaultUI: true, + scrollwheel: false, + disableDoubleClickZoom: false + }; + $log.info('disabling map move'); + return _this.map.setOptions(mapOptions); + }; + })(this); + enableMap = (function(_this) { + return function() { + var mapOptions, ref; + mapOptions = { + draggable: true, + disableDefaultUI: false, + scrollwheel: true, + disableDoubleClickZoom: true + }; + if ((ref = _this.deferred) != null) { + ref.resolve(); + } + return _.defer(function() { + return _this.map.setOptions(_.extend(mapOptions, scope.options)); + }); + }; + })(this); + this.engage = (function(_this) { + return function(polys1) { + _this.polys = polys1; + _this.deferred = $q.defer(); + disableMap(); + $log.info('DrawFreeHandChildModel is engaged (drawing).'); + google.maps.event.addDomListener(_this.map.getDiv(), 'mousedown', function(e) { + return drawFreeHand(_this.map, _this.polys, enableMap); + }); + return _this.deferred.promise; + }; + })(this); + return this; + }; + return freeHandMgr; + } + ]); + +}).call(this); +; +/*global _:true,angular:true,google:true, RichMarker:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapMarkerChildModel', [ + 'uiGmapModelKey', 'uiGmapGmapUtil', 'uiGmapLogger', 'uiGmapEventsHelper', 'uiGmapPropertyAction', 'uiGmapMarkerOptions', 'uiGmapIMarker', 'uiGmapMarkerManager', 'uiGmapPromise', function(ModelKey, GmapUtil, $log, EventsHelper, PropertyAction, MarkerOptions, IMarker, MarkerManager, uiGmapPromise) { + var MarkerChildModel; + MarkerChildModel = (function(superClass) { + var destroy; + + extend(MarkerChildModel, superClass); + + MarkerChildModel.include(GmapUtil); + + MarkerChildModel.include(EventsHelper); + + MarkerChildModel.include(MarkerOptions); + + destroy = function(child) { + if ((child != null ? child.gObject : void 0) != null) { + child.removeEvents(child.externalListeners); + child.removeEvents(child.internalListeners); + if (child != null ? child.gObject : void 0) { + if (child.removeFromManager) { + child.gManager.remove(child.gObject); + } + child.gObject.setMap(null); + return child.gObject = null; + } + } + }; + + function MarkerChildModel(opts) { + this.internalEvents = bind(this.internalEvents, this); + this.setLabelOptions = bind(this.setLabelOptions, this); + this.setOptions = bind(this.setOptions, this); + this.setIcon = bind(this.setIcon, this); + this.setCoords = bind(this.setCoords, this); + this.isNotValid = bind(this.isNotValid, this); + this.maybeSetScopeValue = bind(this.maybeSetScopeValue, this); + this.createMarker = bind(this.createMarker, this); + this.setMyScope = bind(this.setMyScope, this); + this.updateModel = bind(this.updateModel, this); + this.handleModelChanges = bind(this.handleModelChanges, this); + this.destroy = bind(this.destroy, this); + var action, ref, ref1, ref2, ref3, ref4, scope; + scope = opts.scope, this.model = opts.model, this.keys = opts.keys, this.gMap = opts.gMap, this.defaults = (ref = opts.defaults) != null ? ref : {}, this.doClick = opts.doClick, this.gManager = opts.gManager, this.doDrawSelf = (ref1 = opts.doDrawSelf) != null ? ref1 : true, this.trackModel = (ref2 = opts.trackModel) != null ? ref2 : true, this.needRedraw = (ref3 = opts.needRedraw) != null ? ref3 : false, this.isScopeModel = (ref4 = opts.isScopeModel) != null ? ref4 : false; + if (this.isScopeModel) { + this.clonedModel = _.clone(this.model, true); + } + this.deferred = uiGmapPromise.defer(); + _.each(this.keys, (function(_this) { + return function(v, k) { + var keyValue; + keyValue = _this.keys[k]; + if ((keyValue != null) && !_.isFunction(keyValue) && _.isString(keyValue)) { + return _this[k + 'Key'] = keyValue; + } + }; + })(this)); + this.idKey = this.idKeyKey || 'id'; + if (this.model[this.idKey] != null) { + this.id = this.model[this.idKey]; + } + MarkerChildModel.__super__.constructor.call(this, scope); + this.scope.getGMarker = (function(_this) { + return function() { + return _this.gObject; + }; + })(this); + this.firstTime = true; + if (this.trackModel) { + this.scope.model = this.model; + this.scope.$watch('model', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.handleModelChanges(newValue, oldValue); + } + }; + })(this), true); + } else { + action = new PropertyAction((function(_this) { + return function(calledKey) { + if (_.isFunction(calledKey)) { + calledKey = 'all'; + } + if (!_this.firstTime) { + return _this.setMyScope(calledKey, scope); + } + }; + })(this), false); + _.each(this.keys, function(v, k) { + return scope.$watch(k, action.sic(k), true); + }); + } + this.scope.$on('$destroy', (function(_this) { + return function() { + return destroy(_this); + }; + })(this)); + this.createMarker(this.model); + $log.info(this); + } + + MarkerChildModel.prototype.destroy = function(removeFromManager) { + if (removeFromManager == null) { + removeFromManager = true; + } + this.removeFromManager = removeFromManager; + return this.scope.$destroy(); + }; + + MarkerChildModel.prototype.handleModelChanges = function(newValue, oldValue) { + var changes, ctr, len; + changes = this.getChanges(newValue, oldValue, IMarker.keys); + if (!this.firstTime) { + ctr = 0; + len = _.keys(changes).length; + return _.each(changes, (function(_this) { + return function(v, k) { + var doDraw; + ctr += 1; + doDraw = len === ctr; + _this.setMyScope(k, newValue, oldValue, false, true, doDraw); + return _this.needRedraw = true; + }; + })(this)); + } + }; + + MarkerChildModel.prototype.updateModel = function(model) { + if (this.isScopeModel) { + this.clonedModel = _.clone(model, true); + } + return this.setMyScope('all', model, this.model); + }; + + MarkerChildModel.prototype.renderGMarker = function(doDraw, validCb) { + var coords, isSpiderfied, ref; + if (doDraw == null) { + doDraw = true; + } + coords = this.getProp('coords', this.scope, this.model); + if (((ref = this.gManager) != null ? ref.isSpiderfied : void 0) != null) { + isSpiderfied = this.gManager.isSpiderfied(); + } + if (coords != null) { + if (!this.validateCoords(coords)) { + $log.debug('MarkerChild does not have coords yet. They may be defined later.'); + return; + } + if (validCb != null) { + validCb(); + } + if (doDraw && this.gObject) { + this.gManager.add(this.gObject); + } + if (isSpiderfied) { + return this.gManager.markerSpiderfier.spiderListener(this.gObject, window.event); + } + } else { + if (doDraw && this.gObject) { + return this.gManager.remove(this.gObject); + } + } + }; + + MarkerChildModel.prototype.setMyScope = function(thingThatChanged, model, oldModel, isInit, doDraw) { + var justCreated; + if (oldModel == null) { + oldModel = void 0; + } + if (isInit == null) { + isInit = false; + } + if (doDraw == null) { + doDraw = true; + } + if (model == null) { + model = this.model; + } else { + this.model = model; + } + if (!this.gObject) { + this.setOptions(this.scope, doDraw); + justCreated = true; + } + switch (thingThatChanged) { + case 'all': + return _.each(this.keys, (function(_this) { + return function(v, k) { + return _this.setMyScope(k, model, oldModel, isInit, doDraw); + }; + })(this)); + case 'icon': + return this.maybeSetScopeValue({ + gSetter: this.setIcon, + doDraw: doDraw + }); + case 'coords': + return this.maybeSetScopeValue({ + gSetter: this.setCoords, + doDraw: doDraw + }); + case 'options': + if (!justCreated) { + return this.createMarker(model, oldModel, isInit, doDraw); + } + } + }; + + MarkerChildModel.prototype.createMarker = function(model, oldModel, isInit, doDraw) { + if (oldModel == null) { + oldModel = void 0; + } + if (isInit == null) { + isInit = false; + } + if (doDraw == null) { + doDraw = true; + } + this.maybeSetScopeValue({ + gSetter: this.setOptions, + doDraw: doDraw + }); + return this.firstTime = false; + }; + + MarkerChildModel.prototype.maybeSetScopeValue = function(arg) { + var doDraw, gSetter, ref; + gSetter = arg.gSetter, doDraw = (ref = arg.doDraw) != null ? ref : true; + if (gSetter != null) { + gSetter(this.scope, doDraw); + } + if (this.doDrawSelf && doDraw) { + return this.gManager.draw(); + } + }; + + MarkerChildModel.prototype.isNotValid = function(scope, doCheckGmarker) { + var hasIdenticalScopes, hasNoGmarker; + if (doCheckGmarker == null) { + doCheckGmarker = true; + } + hasNoGmarker = !doCheckGmarker ? false : this.gObject === void 0; + hasIdenticalScopes = !this.trackModel ? scope.$id !== this.scope.$id : false; + return hasIdenticalScopes || hasNoGmarker; + }; + + MarkerChildModel.prototype.setCoords = function(scope, doDraw) { + if (doDraw == null) { + doDraw = true; + } + if (this.isNotValid(scope) || (this.gObject == null)) { + return; + } + return this.renderGMarker(doDraw, (function(_this) { + return function() { + var newGValue, newModelVal, oldGValue; + newModelVal = _this.getProp('coords', scope, _this.model); + newGValue = _this.getCoords(newModelVal); + oldGValue = _this.gObject.getPosition(); + if ((oldGValue != null) && (newGValue != null)) { + if (newGValue.lng() === oldGValue.lng() && newGValue.lat() === oldGValue.lat()) { + return; + } + } + _this.gObject.setPosition(newGValue); + return _this.gObject.setVisible(_this.validateCoords(newModelVal)); + }; + })(this)); + }; + + MarkerChildModel.prototype.setIcon = function(scope, doDraw) { + if (doDraw == null) { + doDraw = true; + } + if (this.isNotValid(scope) || (this.gObject == null)) { + return; + } + return this.renderGMarker(doDraw, (function(_this) { + return function() { + var coords, newValue, oldValue; + oldValue = _this.gObject.getIcon(); + newValue = _this.getProp('icon', scope, _this.model); + if (oldValue === newValue) { + return; + } + _this.gObject.setIcon(newValue); + coords = _this.getProp('coords', scope, _this.model); + _this.gObject.setPosition(_this.getCoords(coords)); + return _this.gObject.setVisible(_this.validateCoords(coords)); + }; + })(this)); + }; + + MarkerChildModel.prototype.setOptions = function(scope, doDraw) { + var ref; + if (doDraw == null) { + doDraw = true; + } + if (this.isNotValid(scope, false)) { + return; + } + this.renderGMarker(doDraw, (function(_this) { + return function() { + var _options, coords, icon; + coords = _this.getProp('coords', scope, _this.model); + icon = _this.getProp('icon', scope, _this.model); + _options = _this.getProp('options', scope, _this.model); + _this.opts = _this.createOptions(coords, icon, _options); + if (_this.isLabel(_this.gObject) !== _this.isLabel(_this.opts) && (_this.gObject != null)) { + _this.gManager.remove(_this.gObject); + _this.gObject = void 0; + } + if (_this.gObject != null) { + _this.gObject.setOptions(_this.setLabelOptions(_this.opts)); + } + if (!_this.gObject) { + if (_this.isLabel(_this.opts)) { + _this.gObject = new MarkerWithLabel(_this.setLabelOptions(_this.opts)); + } else if (_this.opts.content) { + _this.gObject = new RichMarker(_this.opts); + _this.gObject.getIcon = _this.gObject.getContent; + _this.gObject.setIcon = _this.gObject.setContent; + } else { + _this.gObject = new google.maps.Marker(_this.opts); + } + _.extend(_this.gObject, { + model: _this.model + }); + } + if (_this.externalListeners) { + _this.removeEvents(_this.externalListeners); + } + if (_this.internalListeners) { + _this.removeEvents(_this.internalListeners); + } + _this.externalListeners = _this.setEvents(_this.gObject, _this.scope, _this.model, ['dragend']); + _this.internalListeners = _this.setEvents(_this.gObject, { + events: _this.internalEvents(), + $evalAsync: function() {} + }, _this.model); + if (_this.id != null) { + return _this.gObject.key = _this.id; + } + }; + })(this)); + if (this.gObject && (this.gObject.getMap() || this.gManager.type !== MarkerManager.type)) { + this.deferred.resolve(this.gObject); + } else { + if (!this.gObject) { + return this.deferred.reject('gObject is null'); + } + if (!(((ref = this.gObject) != null ? ref.getMap() : void 0) && this.gManager.type === MarkerManager.type)) { + $log.debug('gObject has no map yet'); + this.deferred.resolve(this.gObject); + } + } + if (this.model[this.fitKey]) { + return this.gManager.fit(); + } + }; + + MarkerChildModel.prototype.setLabelOptions = function(opts) { + if (opts.labelAnchor) { + opts.labelAnchor = this.getLabelPositionPoint(opts.labelAnchor); + } + return opts; + }; + + MarkerChildModel.prototype.internalEvents = function() { + return { + dragend: (function(_this) { + return function(marker, eventName, model, mousearg) { + var events, modelToSet, newCoords; + modelToSet = _this.trackModel ? _this.scope.model : _this.model; + newCoords = _this.setCoordsFromEvent(_this.modelOrKey(modelToSet, _this.coordsKey), _this.gObject.getPosition()); + modelToSet = _this.setVal(model, _this.coordsKey, newCoords); + events = _this.scope.events; + if ((events != null ? events.dragend : void 0) != null) { + events.dragend(marker, eventName, modelToSet, mousearg); + } + return _this.scope.$apply(); + }; + })(this), + click: (function(_this) { + return function(marker, eventName, model, mousearg) { + var click; + click = _this.getProp('click', _this.scope, _this.model); + if (_this.doClick && angular.isFunction(click)) { + return _this.scope.$evalAsync(click(marker, eventName, _this.model, mousearg)); + } + }; + })(this) + }; + }; + + return MarkerChildModel; + + })(ModelKey); + return MarkerChildModel; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygonChildModel', [ + 'uiGmapBasePolyChildModel', 'uiGmapPolygonOptionsBuilder', function(BaseGen, Builder) { + var PolygonChildModel, base, gFactory; + gFactory = function(opts) { + return new google.maps.Polygon(opts); + }; + base = new BaseGen(Builder, gFactory); + return PolygonChildModel = (function(superClass) { + extend(PolygonChildModel, superClass); + + function PolygonChildModel() { + return PolygonChildModel.__super__.constructor.apply(this, arguments); + } + + return PolygonChildModel; + + })(base); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolylineChildModel', [ + 'uiGmapBasePolyChildModel', 'uiGmapPolylineOptionsBuilder', function(BaseGen, Builder) { + var PolylineChildModel, base, gFactory; + gFactory = function(opts) { + return new google.maps.Polyline(opts); + }; + base = BaseGen(Builder, gFactory); + return PolylineChildModel = (function(superClass) { + extend(PolylineChildModel, superClass); + + function PolylineChildModel() { + return PolylineChildModel.__super__.constructor.apply(this, arguments); + } + + return PolylineChildModel; + + })(base); + } + ]); + +}).call(this); +; +/*global _:true,angular:true,google:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapWindowChildModel', [ + 'uiGmapBaseObject', 'uiGmapGmapUtil', 'uiGmapLogger', '$compile', '$http', '$templateCache', 'uiGmapChromeFixes', 'uiGmapEventsHelper', function(BaseObject, GmapUtil, $log, $compile, $http, $templateCache, ChromeFixes, EventsHelper) { + var WindowChildModel; + WindowChildModel = (function(superClass) { + extend(WindowChildModel, superClass); + + WindowChildModel.include(GmapUtil); + + WindowChildModel.include(EventsHelper); + + function WindowChildModel(opts) { + this.updateModel = bind(this.updateModel, this); + this.destroy = bind(this.destroy, this); + this.remove = bind(this.remove, this); + this.getLatestPosition = bind(this.getLatestPosition, this); + this.hideWindow = bind(this.hideWindow, this); + this.showWindow = bind(this.showWindow, this); + this.handleClick = bind(this.handleClick, this); + this.watchOptions = bind(this.watchOptions, this); + this.watchCoords = bind(this.watchCoords, this); + this.createGWin = bind(this.createGWin, this); + this.watchElement = bind(this.watchElement, this); + this.watchAndDoShow = bind(this.watchAndDoShow, this); + this.doShow = bind(this.doShow, this); + var maybeMarker, ref, ref1, ref2, ref3; + this.model = (ref = opts.model) != null ? ref : {}, this.scope = opts.scope, this.opts = opts.opts, this.isIconVisibleOnClick = opts.isIconVisibleOnClick, this.gMap = opts.gMap, this.markerScope = opts.markerScope, this.element = opts.element, this.needToManualDestroy = (ref1 = opts.needToManualDestroy) != null ? ref1 : false, this.markerIsVisibleAfterWindowClose = (ref2 = opts.markerIsVisibleAfterWindowClose) != null ? ref2 : true, this.isScopeModel = (ref3 = opts.isScopeModel) != null ? ref3 : false; + if (this.isScopeModel) { + this.clonedModel = _.clone(this.model, true); + } + this.getGmarker = function() { + var ref4, ref5; + if (((ref4 = this.markerScope) != null ? ref4['getGMarker'] : void 0) != null) { + return (ref5 = this.markerScope) != null ? ref5.getGMarker() : void 0; + } + }; + this.listeners = []; + this.createGWin(); + maybeMarker = this.getGmarker(); + if (maybeMarker != null) { + maybeMarker.setClickable(true); + } + this.watchElement(); + this.watchOptions(); + this.watchCoords(); + this.watchAndDoShow(); + this.scope.$on('$destroy', (function(_this) { + return function() { + return _this.destroy(); + }; + })(this)); + $log.info(this); + } + + WindowChildModel.prototype.doShow = function(wasOpen) { + if (this.scope.show === true || wasOpen) { + return this.showWindow(); + } else { + return this.hideWindow(); + } + }; + + WindowChildModel.prototype.watchAndDoShow = function() { + if (this.model.show != null) { + this.scope.show = this.model.show; + } + this.scope.$watch('show', this.doShow, true); + return this.doShow(); + }; + + WindowChildModel.prototype.watchElement = function() { + return this.scope.$watch((function(_this) { + return function() { + var ref, wasOpen; + if (!(_this.element || _this.html)) { + return; + } + if (_this.html !== _this.element.html() && _this.gObject) { + if ((ref = _this.opts) != null) { + ref.content = void 0; + } + wasOpen = _this.gObject.isOpen(); + _this.remove(); + return _this.createGWin(wasOpen); + } + }; + })(this)); + }; + + WindowChildModel.prototype.createGWin = function(isOpen) { + var _opts, defaults, maybeMarker, ref, ref1; + if (isOpen == null) { + isOpen = false; + } + maybeMarker = this.getGmarker(); + defaults = {}; + if (this.opts != null) { + if (this.scope.coords) { + this.opts.position = this.getCoords(this.scope.coords); + } + defaults = this.opts; + } + if (this.element) { + this.html = _.isObject(this.element) ? this.element.html() : this.element; + } + _opts = this.scope.options ? this.scope.options : defaults; + this.opts = this.createWindowOptions(maybeMarker, this.markerScope || this.scope, this.html, _opts); + if (this.opts != null) { + if (!this.gObject) { + if (this.opts.boxClass && (window.InfoBox && typeof window.InfoBox === 'function')) { + this.gObject = new window.InfoBox(this.opts); + } else { + this.gObject = new google.maps.InfoWindow(this.opts); + } + this.listeners.push(google.maps.event.addListener(this.gObject, 'domready', function() { + return ChromeFixes.maybeRepaint(this.content); + })); + this.listeners.push(google.maps.event.addListener(this.gObject, 'closeclick', (function(_this) { + return function() { + if (maybeMarker) { + maybeMarker.setAnimation(_this.oldMarkerAnimation); + if (_this.markerIsVisibleAfterWindowClose) { + _.delay(function() { + maybeMarker.setVisible(false); + return maybeMarker.setVisible(_this.markerIsVisibleAfterWindowClose); + }, 250); + } + } + _this.gObject.close(); + _this.model.show = false; + if (_this.scope.closeClick != null) { + return _this.scope.$evalAsync(_this.scope.closeClick()); + } else { + return _this.scope.$evalAsync(); + } + }; + })(this))); + } + this.gObject.setContent(this.opts.content); + this.handleClick(((ref = this.scope) != null ? (ref1 = ref.options) != null ? ref1.forceClick : void 0 : void 0) || isOpen); + return this.doShow(this.gObject.isOpen()); + } + }; + + WindowChildModel.prototype.watchCoords = function() { + var scope; + scope = this.markerScope != null ? this.markerScope : this.scope; + return scope.$watch('coords', (function(_this) { + return function(newValue, oldValue) { + var pos; + if (newValue !== oldValue) { + if (newValue == null) { + _this.hideWindow(); + } else if (!_this.validateCoords(newValue)) { + $log.error("WindowChildMarker cannot render marker as scope.coords as no position on marker: " + (JSON.stringify(_this.model))); + return; + } + pos = _this.getCoords(newValue); + _this.doShow(); + _this.gObject.setPosition(pos); + if (_this.opts) { + return _this.opts.position = pos; + } + } + }; + })(this), true); + }; + + WindowChildModel.prototype.watchOptions = function() { + return this.scope.$watch('options', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + _this.opts = newValue; + if (_this.gObject != null) { + _this.gObject.setOptions(_this.opts); + if ((_this.opts.visible != null) && _this.opts.visible) { + return _this.showWindow(); + } else if (_this.opts.visible != null) { + return _this.hideWindow(); + } + } + } + }; + })(this), true); + }; + + WindowChildModel.prototype.handleClick = function(forceClick) { + var click, maybeMarker; + if (this.gObject == null) { + return; + } + maybeMarker = this.getGmarker(); + click = (function(_this) { + return function() { + if (_this.gObject == null) { + _this.createGWin(); + } + _this.showWindow(); + if (maybeMarker != null) { + _this.initialMarkerVisibility = maybeMarker.getVisible(); + _this.oldMarkerAnimation = maybeMarker.getAnimation(); + return maybeMarker.setVisible(_this.isIconVisibleOnClick); + } + }; + })(this); + if (forceClick) { + click(); + } + if (maybeMarker) { + return this.listeners = this.listeners.concat(this.setEvents(maybeMarker, { + events: { + click: click + } + }, this.model)); + } + }; + + WindowChildModel.prototype.showWindow = function() { + var compiled, show, templateScope; + if (this.gObject == null) { + return; + } + templateScope = null; + show = (function(_this) { + return function() { + var isOpen, maybeMarker, pos; + if (!_this.gObject.isOpen()) { + maybeMarker = _this.getGmarker(); + if ((_this.gObject != null) && (_this.gObject.getPosition != null)) { + pos = _this.gObject.getPosition(); + } + if (maybeMarker) { + pos = maybeMarker.getPosition(); + } + if (!pos) { + return; + } + _this.gObject.open(_this.gMap, maybeMarker); + isOpen = _this.gObject.isOpen(); + if (_this.model.show !== isOpen) { + return _this.model.show = isOpen; + } + } + }; + })(this); + if (this.scope.templateUrl) { + $http.get(this.scope.templateUrl, { + cache: $templateCache + }).then((function(_this) { + return function(content) { + var compiled; + templateScope = _this.scope.$new(); + if (angular.isDefined(_this.scope.templateParameter)) { + templateScope.parameter = _this.scope.templateParameter; + } + compiled = $compile(content.data)(templateScope); + _this.gObject.setContent(compiled[0]); + return show(); + }; + })(this)); + } else if (this.scope.template) { + templateScope = this.scope.$new(); + if (angular.isDefined(this.scope.templateParameter)) { + templateScope.parameter = this.scope.templateParameter; + } + compiled = $compile(this.scope.template)(templateScope); + this.gObject.setContent(compiled[0]); + show(); + } else { + show(); + } + return this.scope.$on('destroy', function() { + return templateScope.$destroy(); + }); + }; + + WindowChildModel.prototype.hideWindow = function() { + if ((this.gObject != null) && this.gObject.isOpen()) { + return this.gObject.close(); + } + }; + + WindowChildModel.prototype.getLatestPosition = function(overridePos) { + var maybeMarker; + maybeMarker = this.getGmarker(); + if ((this.gObject != null) && (maybeMarker != null) && !overridePos) { + return this.gObject.setPosition(maybeMarker.getPosition()); + } else { + if (overridePos) { + return this.gObject.setPosition(overridePos); + } + } + }; + + WindowChildModel.prototype.remove = function() { + this.hideWindow(); + this.removeEvents(this.listeners); + this.listeners.length = 0; + delete this.gObject; + return delete this.opts; + }; + + WindowChildModel.prototype.destroy = function(manualOverride) { + var ref; + if (manualOverride == null) { + manualOverride = false; + } + this.remove(); + if (((this.scope != null) && !((ref = this.scope) != null ? ref.$$destroyed : void 0)) && (this.needToManualDestroy || manualOverride)) { + return this.scope.$destroy(); + } + }; + + WindowChildModel.prototype.updateModel = function(model) { + if (this.isScopeModel) { + this.clonedModel = _.clone(model, true); + } + return _.extend(this.model, this.clonedModel || model); + }; + + return WindowChildModel; + + })(BaseObject); + return WindowChildModel; + } + ]); + +}).call(this); +; +/*global _, angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapBasePolysParentModel', [ + '$timeout', 'uiGmapLogger', 'uiGmapModelKey', 'uiGmapModelsWatcher', 'uiGmapPropMap', 'uiGmap_async', 'uiGmapPromise', 'uiGmapFitHelper', function($timeout, $log, ModelKey, ModelsWatcher, PropMap, _async, uiGmapPromise, FitHelper) { + return function(IPoly, PolyChildModel, gObjectName) { + var BasePolysParentModel; + return BasePolysParentModel = (function(superClass) { + extend(BasePolysParentModel, superClass); + + BasePolysParentModel.include(ModelsWatcher); + + function BasePolysParentModel(scope, element, attrs, gMap1, defaults) { + this.element = element; + this.attrs = attrs; + this.gMap = gMap1; + this.defaults = defaults; + this.maybeFit = bind(this.maybeFit, this); + this.createChild = bind(this.createChild, this); + this.pieceMeal = bind(this.pieceMeal, this); + this.createAllNew = bind(this.createAllNew, this); + this.watchIdKey = bind(this.watchIdKey, this); + this.createChildScopes = bind(this.createChildScopes, this); + this.watchDestroy = bind(this.watchDestroy, this); + this.onDestroy = bind(this.onDestroy, this); + this.rebuildAll = bind(this.rebuildAll, this); + this.doINeedToWipe = bind(this.doINeedToWipe, this); + this.watchModels = bind(this.watchModels, this); + BasePolysParentModel.__super__.constructor.call(this, scope); + this["interface"] = IPoly; + this.$log = $log; + this.plurals = new PropMap(); + _.each(IPoly.scopeKeys, (function(_this) { + return function(name) { + return _this[name + 'Key'] = void 0; + }; + })(this)); + this.models = void 0; + this.firstTime = true; + this.$log.info(this); + this.createChildScopes(); + } + + BasePolysParentModel.prototype.watchModels = function(scope) { + + /* + This was watchCollection but not all model changes were being caught. + TODO: Make the directive flexible in overriding whether we watch models (and depth) via watch or watchColleciton. + */ + return scope.$watch('models', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + if (_this.doINeedToWipe(newValue) || scope.doRebuildAll) { + return _this.rebuildAll(scope, true, true); + } else { + return _this.createChildScopes(false); + } + } + }; + })(this), true); + }; + + BasePolysParentModel.prototype.doINeedToWipe = function(newValue) { + var newValueIsEmpty; + newValueIsEmpty = newValue != null ? newValue.length === 0 : true; + return this.plurals.length > 0 && newValueIsEmpty; + }; + + BasePolysParentModel.prototype.rebuildAll = function(scope, doCreate, doDelete) { + return this.onDestroy(doDelete).then((function(_this) { + return function() { + if (doCreate) { + return _this.createChildScopes(); + } + }; + })(this)); + }; + + BasePolysParentModel.prototype.onDestroy = function() { + BasePolysParentModel.__super__.onDestroy.call(this, this.scope); + return _async.promiseLock(this, uiGmapPromise.promiseTypes["delete"], void 0, void 0, (function(_this) { + return function() { + return _async.each(_this.plurals.values(), function(child) { + return child.destroy(true); + }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() { + var ref; + return (ref = _this.plurals) != null ? ref.removeAll() : void 0; + }); + }; + })(this)); + }; + + BasePolysParentModel.prototype.watchDestroy = function(scope) { + return scope.$on('$destroy', (function(_this) { + return function() { + return _this.rebuildAll(scope, false, true); + }; + })(this)); + }; + + BasePolysParentModel.prototype.createChildScopes = function(isCreatingFromScratch) { + if (isCreatingFromScratch == null) { + isCreatingFromScratch = true; + } + if (angular.isUndefined(this.scope.models)) { + this.$log.error("No models to create " + gObjectName + "s from! I Need direct models!"); + return; + } + if ((this.gMap == null) || (this.scope.models == null)) { + return; + } + this.watchIdKey(this.scope); + if (isCreatingFromScratch) { + return this.createAllNew(this.scope, false); + } else { + return this.pieceMeal(this.scope, false); + } + }; + + BasePolysParentModel.prototype.watchIdKey = function(scope) { + this.setIdKey(scope); + return scope.$watch('idKey', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue && (newValue == null)) { + _this.idKey = newValue; + return _this.rebuildAll(scope, true, true); + } + }; + })(this)); + }; + + BasePolysParentModel.prototype.createAllNew = function(scope, isArray) { + var maybeCanceled; + if (isArray == null) { + isArray = false; + } + this.models = scope.models; + if (this.firstTime) { + this.watchModels(scope); + this.watchDestroy(scope); + } + if (this.didQueueInitPromise(this, scope)) { + return; + } + maybeCanceled = null; + return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return _async.map(scope.models, function(model) { + var child; + child = _this.createChild(model, _this.gMap); + if (maybeCanceled) { + $log.debug('createNew should fall through safely'); + child.isEnabled = false; + } + maybeCanceled; + return child.pathPoints.getArray(); + }, _async.chunkSizeFrom(scope.chunk)).then(function(pathPoints) { + _this.maybeFit(pathPoints); + return _this.firstTime = false; + }); + }; + })(this)); + }; + + BasePolysParentModel.prototype.pieceMeal = function(scope, isArray) { + var maybeCanceled, payload; + if (isArray == null) { + isArray = true; + } + if (scope.$$destroyed) { + return; + } + maybeCanceled = null; + payload = null; + this.models = scope.models; + if ((scope != null) && this.modelsLength() && this.plurals.length) { + return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return uiGmapPromise.promise(function() { + return _this.figureOutState(_this.idKey, scope, _this.plurals, _this.modelKeyComparison); + }).then(function(state) { + payload = state; + if (payload.updates.length) { + _async.each(payload.updates, function(obj) { + _.extend(obj.child.scope, obj.model); + return obj.child.model = obj.model; + }); + } + return _async.each(payload.removals, function(child) { + if (child != null) { + child.destroy(); + _this.plurals.remove(child.model[_this.idKey]); + return maybeCanceled; + } + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + return _async.each(payload.adds, function(modelToAdd) { + if (maybeCanceled) { + $log.debug('pieceMeal should fall through safely'); + } + _this.createChild(modelToAdd, _this.gMap); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)).then(function() { + return _this.maybeFit(); + }); + }); + }; + })(this)); + } else { + this.inProgress = false; + return this.rebuildAll(this.scope, true, true); + } + }; + + BasePolysParentModel.prototype.createChild = function(model, gMap) { + var child, childScope; + childScope = this.scope.$new(false); + this.setChildScope(IPoly.scopeKeys, childScope, model); + childScope.$watch('model', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.setChildScope(IPoly.scopeKeys, childScope, newValue); + } + }; + })(this), true); + childScope["static"] = this.scope["static"]; + child = new PolyChildModel({ + isScopeModel: true, + scope: childScope, + attrs: this.attrs, + gMap: gMap, + defaults: this.defaults, + model: model, + gObjectChangeCb: (function(_this) { + return function() { + return _this.maybeFit(); + }; + })(this) + }); + if (model[this.idKey] == null) { + this.$log.error(gObjectName + " model has no id to assign a child to.\nThis is required for performance. Please assign id,\nor redirect id to a different key."); + return; + } + this.plurals.put(model[this.idKey], child); + return child; + }; + + BasePolysParentModel.prototype.maybeFit = function(pathPoints) { + if (pathPoints == null) { + pathPoints = this.plurals.map(function(p) { + return p.pathPoints; + }); + } + if (this.scope.fit) { + pathPoints = _.flatten(pathPoints); + return FitHelper.fit(pathPoints, this.gMap); + } + }; + + return BasePolysParentModel; + + })(ModelKey); + }; + } + ]); + +}).call(this); +; +/*globals angular, _, google */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapCircleParentModel', [ + 'uiGmapLogger', '$timeout', 'uiGmapGmapUtil', 'uiGmapEventsHelper', 'uiGmapCircleOptionsBuilder', function($log, $timeout, GmapUtil, EventsHelper, Builder) { + var CircleParentModel, _settingFromDirective; + _settingFromDirective = function(scope, fn) { + scope.settingFromDirective = true; + fn(); + return $timeout(function() { + return scope.settingFromDirective = false; + }); + }; + return CircleParentModel = (function(superClass) { + extend(CircleParentModel, superClass); + + CircleParentModel.include(GmapUtil); + + CircleParentModel.include(EventsHelper); + + function CircleParentModel(scope, element, attrs, gMap, DEFAULTS) { + var clean, gObject, lastRadius; + this.attrs = attrs; + this.gMap = gMap; + this.DEFAULTS = DEFAULTS; + this.scope = scope; + lastRadius = null; + clean = (function(_this) { + return function() { + lastRadius = null; + if (_this.listeners != null) { + _this.removeEvents(_this.listeners); + return _this.listeners = void 0; + } + }; + })(this); + gObject = new google.maps.Circle(this.buildOpts(GmapUtil.getCoords(scope.center), scope.radius)); + this.setMyOptions = (function(_this) { + return function(newVals, oldVals) { + if (scope.settingFromDirective) { + return; + } + if (!(_.isEqual(newVals, oldVals) && newVals === oldVals && ((newVals != null) && (oldVals != null) ? newVals.coordinates === oldVals.coordinates : true))) { + return gObject.setOptions(_this.buildOpts(GmapUtil.getCoords(scope.center), scope.radius)); + } + }; + })(this); + this.props = this.props.concat([ + { + prop: 'center', + isColl: true + }, { + prop: 'fill', + isColl: true + }, 'radius', 'zIndex' + ]); + this.watchProps(); + if (this.scope.control != null) { + this.scope.control.getCircle = function() { + return gObject; + }; + } + clean(); + this.listeners = this.setEvents(gObject, scope, scope, ['radius_changed']) || []; + this.listeners.push(google.maps.event.addListener(gObject, 'radius_changed', function() { + + /* + possible google bug, and or because a circle has two radii + radius_changed appears to fire twice (original and new) which is not too helpful + therefore we will check for radius changes manually and bail out if nothing has changed + */ + var newRadius, work; + newRadius = gObject.getRadius(); + if (newRadius === lastRadius) { + return; + } + lastRadius = newRadius; + work = function() { + return _settingFromDirective(scope, function() { + var ref, ref1; + if (newRadius !== scope.radius) { + scope.radius = newRadius; + } + if (((ref = scope.events) != null ? ref.radius_changed : void 0) && _.isFunction((ref1 = scope.events) != null ? ref1.radius_changed : void 0)) { + return scope.events.radius_changed(gObject, 'radius_changed', scope, arguments); + } + }); + }; + if (!angular.mock) { + return scope.$evalAsync(function() { + return work(); + }); + } else { + return work(); + } + })); + this.listeners.push(google.maps.event.addListener(gObject, 'center_changed', function() { + return scope.$evalAsync(function() { + return _settingFromDirective(scope, function() { + if (angular.isDefined(scope.center.type)) { + scope.center.coordinates[1] = gObject.getCenter().lat(); + return scope.center.coordinates[0] = gObject.getCenter().lng(); + } else { + scope.center.latitude = gObject.getCenter().lat(); + return scope.center.longitude = gObject.getCenter().lng(); + } + }); + }); + })); + scope.$on('$destroy', function() { + clean(); + return gObject.setMap(null); + }); + $log.info(this); + } + + return CircleParentModel; + + })(Builder); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapDrawingManagerParentModel', [ + 'uiGmapLogger', '$timeout', 'uiGmapBaseObject', 'uiGmapEventsHelper', function($log, $timeout, BaseObject, EventsHelper) { + var DrawingManagerParentModel; + return DrawingManagerParentModel = (function(superClass) { + extend(DrawingManagerParentModel, superClass); + + DrawingManagerParentModel.include(EventsHelper); + + function DrawingManagerParentModel(scope, element, attrs, map) { + var gObject, listeners; + this.scope = scope; + this.attrs = attrs; + this.map = map; + gObject = new google.maps.drawing.DrawingManager(this.scope.options); + gObject.setMap(this.map); + listeners = void 0; + if (this.scope.control != null) { + this.scope.control.getDrawingManager = function() { + return gObject; + }; + } + if (!this.scope["static"] && this.scope.options) { + this.scope.$watch('options', function(newValue) { + return gObject != null ? gObject.setOptions(newValue) : void 0; + }, true); + } + if (this.scope.events != null) { + listeners = this.setEvents(gObject, this.scope, this.scope); + this.scope.$watch('events', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue)) { + if (listeners != null) { + _this.removeEvents(listeners); + } + return listeners = _this.setEvents(gObject, _this.scope, _this.scope); + } + }; + })(this)); + } + this.scope.$on('$destroy', (function(_this) { + return function() { + if (listeners != null) { + _this.removeEvents(listeners); + } + gObject.setMap(null); + return gObject = null; + }; + })(this)); + } + + return DrawingManagerParentModel; + + })(BaseObject); + } + ]); + +}).call(this); +; +/* + - interface for all markers to derrive from + - to enforce a minimum set of requirements + - attributes + - coords + - icon + - implementation needed on watches + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapIMarkerParentModel", [ + "uiGmapModelKey", "uiGmapLogger", function(ModelKey, Logger) { + var IMarkerParentModel; + IMarkerParentModel = (function(superClass) { + extend(IMarkerParentModel, superClass); + + IMarkerParentModel.prototype.DEFAULTS = {}; + + function IMarkerParentModel(scope1, element, attrs, map) { + this.scope = scope1; + this.element = element; + this.attrs = attrs; + this.map = map; + this.onWatch = bind(this.onWatch, this); + this.watch = bind(this.watch, this); + this.validateScope = bind(this.validateScope, this); + IMarkerParentModel.__super__.constructor.call(this, this.scope); + this.$log = Logger; + if (!this.validateScope(this.scope)) { + throw new String("Unable to construct IMarkerParentModel due to invalid scope"); + } + this.doClick = angular.isDefined(this.attrs.click); + if (this.scope.options != null) { + this.DEFAULTS = this.scope.options; + } + this.watch('coords', this.scope); + this.watch('icon', this.scope); + this.watch('options', this.scope); + this.scope.$on("$destroy", (function(_this) { + return function() { + return _this.onDestroy(_this.scope); + }; + })(this)); + } + + IMarkerParentModel.prototype.validateScope = function(scope) { + var ret; + if (scope == null) { + this.$log.error(this.constructor.name + ": invalid scope used"); + return false; + } + ret = scope.coords != null; + if (!ret) { + this.$log.error(this.constructor.name + ": no valid coords attribute found"); + return false; + } + return ret; + }; + + IMarkerParentModel.prototype.watch = function(propNameToWatch, scope, equalityCheck) { + if (equalityCheck == null) { + equalityCheck = true; + } + return scope.$watch(propNameToWatch, (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue)) { + return _this.onWatch(propNameToWatch, scope, newValue, oldValue); + } + }; + })(this), equalityCheck); + }; + + IMarkerParentModel.prototype.onWatch = function(propNameToWatch, scope, newValue, oldValue) {}; + + return IMarkerParentModel; + + })(ModelKey); + return IMarkerParentModel; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapIWindowParentModel", [ + "uiGmapModelKey", "uiGmapGmapUtil", "uiGmapLogger", function(ModelKey, GmapUtil, Logger) { + var IWindowParentModel; + return IWindowParentModel = (function(superClass) { + extend(IWindowParentModel, superClass); + + IWindowParentModel.include(GmapUtil); + + function IWindowParentModel(scope, element, attrs, ctrls, $timeout, $compile, $http, $templateCache) { + IWindowParentModel.__super__.constructor.call(this, scope); + this.$log = Logger; + this.$timeout = $timeout; + this.$compile = $compile; + this.$http = $http; + this.$templateCache = $templateCache; + this.DEFAULTS = {}; + if (scope.options != null) { + this.DEFAULTS = scope.options; + } + } + + IWindowParentModel.prototype.getItem = function(scope, modelsPropToIterate, index) { + if (modelsPropToIterate === 'models') { + return scope[modelsPropToIterate][index]; + } + return scope[modelsPropToIterate].get(index); + }; + + return IWindowParentModel; + + })(ModelKey); + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapLayerParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', '$timeout', function(BaseObject, Logger, $timeout) { + var LayerParentModel; + LayerParentModel = (function(superClass) { + extend(LayerParentModel, superClass); + + function LayerParentModel(scope, element, attrs, gMap, onLayerCreated, $log) { + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.gMap = gMap; + this.onLayerCreated = onLayerCreated != null ? onLayerCreated : void 0; + this.$log = $log != null ? $log : Logger; + this.createGoogleLayer = bind(this.createGoogleLayer, this); + if (this.attrs.type == null) { + this.$log.info('type attribute for the layer directive is mandatory. Layer creation aborted!!'); + return; + } + this.createGoogleLayer(); + this.doShow = true; + if (angular.isDefined(this.attrs.show)) { + this.doShow = this.scope.show; + } + if (this.doShow && (this.gMap != null)) { + this.gObject.setMap(this.gMap); + } + this.scope.$watch('show', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + _this.doShow = newValue; + if (newValue) { + return _this.gObject.setMap(_this.gMap); + } else { + return _this.gObject.setMap(null); + } + } + }; + })(this), true); + this.scope.$watch('options', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue && _this.doShow) { + return _this.gObject.setOptions(newValue); + } + }; + })(this), true); + this.scope.$on('$destroy', (function(_this) { + return function() { + return _this.gObject.setMap(null); + }; + })(this)); + } + + LayerParentModel.prototype.createGoogleLayer = function() { + var base; + if (this.attrs.options == null) { + this.gObject = this.attrs.namespace === void 0 ? new google.maps[this.attrs.type]() : new google.maps[this.attrs.namespace][this.attrs.type](); + } else { + this.gObject = this.attrs.namespace === void 0 ? new google.maps[this.attrs.type](this.scope.options) : new google.maps[this.attrs.namespace][this.attrs.type](this.scope.options); + } + if ((this.gObject != null) && this.doShow) { + this.gObject.setMap(this.gMap); + } + if ((this.gObject != null) && (this.onLayerCreated != null)) { + return typeof (base = this.onLayerCreated(this.scope, this.gObject)) === "function" ? base(this.gObject) : void 0; + } + }; + + return LayerParentModel; + + })(BaseObject); + return LayerParentModel; + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapMapTypeParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', function(BaseObject, Logger) { + var MapTypeParentModel; + MapTypeParentModel = (function(superClass) { + extend(MapTypeParentModel, superClass); + + function MapTypeParentModel(scope, element, attrs, gMap, $log, childModel, propMap) { + var watchChildModelOptions, watchChildModelShow, watchOptions, watchShow; + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.gMap = gMap; + this.$log = $log != null ? $log : Logger; + this.childModel = childModel; + this.propMap = propMap; + this.refreshShown = bind(this.refreshShown, this); + this.hideOverlay = bind(this.hideOverlay, this); + this.showOverlay = bind(this.showOverlay, this); + this.refreshMapType = bind(this.refreshMapType, this); + this.createMapType = bind(this.createMapType, this); + if (this.scope.options == null) { + this.$log.info('options attribute for the map-type directive is mandatory. Map type creation aborted!!'); + return; + } + this.id = this.gMap.overlayMapTypesCount = this.gMap.overlayMapTypesCount + 1 || 0; + this.doShow = true; + this.createMapType(); + this.refreshShown(); + if (this.doShow && (this.gMap != null)) { + this.showOverlay(); + } + watchChildModelShow = (function(_this) { + return function() { + return _this.childModel[_this.attrs.show]; + }; + })(this); + watchShow = this.childModel ? watchChildModelShow : 'show'; + this.scope.$watch(watchShow, (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + _this.doShow = newValue; + if (newValue) { + return _this.showOverlay(); + } else { + return _this.hideOverlay(); + } + } + }; + })(this)); + watchChildModelOptions = (function(_this) { + return function() { + return _this.childModel[_this.attrs.options]; + }; + })(this); + watchOptions = this.childModel ? watchChildModelOptions : 'options'; + this.scope.$watchCollection(watchOptions, (function(_this) { + return function(newValue, oldValue) { + var different, mapTypeProps; + if (!_.isEqual(newValue, oldValue)) { + mapTypeProps = ['tileSize', 'maxZoom', 'minZoom', 'name', 'alt']; + different = _.some(mapTypeProps, function(prop) { + return !oldValue || !newValue || !_.isEqual(newValue[prop], oldValue[prop]); + }); + if (different) { + return _this.refreshMapType(); + } + } + }; + })(this)); + if (angular.isDefined(this.attrs.refresh)) { + this.scope.$watch('refresh', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue)) { + return _this.refreshMapType(); + } + }; + })(this), true); + } + this.scope.$on('$destroy', (function(_this) { + return function() { + _this.hideOverlay(); + return _this.mapType = null; + }; + })(this)); + } + + MapTypeParentModel.prototype.createMapType = function() { + var id, idAttr, mapType; + mapType = this.childModel ? (this.attrs.options ? this.childModel[this.attrs.options] : this.childModel) : this.scope.options; + if (mapType.getTile != null) { + this.mapType = mapType; + } else if (mapType.getTileUrl != null) { + this.mapType = new google.maps.ImageMapType(mapType); + } else { + this.$log.info('options should provide either getTile or getTileUrl methods. Map type creation aborted!!'); + return; + } + idAttr = this.attrs.id ? (this.childModel ? this.attrs.id : 'id') : void 0; + id = idAttr ? (this.childModel ? this.childModel[idAttr] : this.scope[idAttr]) : void 0; + if (id) { + this.gMap.mapTypes.set(id, this.mapType); + if (!angular.isDefined(this.attrs.show)) { + this.doShow = false; + } + } + this.mapType.layerId = this.id; + if (this.childModel && angular.isDefined(this.scope.index)) { + return this.propMap.put(this.mapType.layerId, this.scope.index); + } + }; + + MapTypeParentModel.prototype.refreshMapType = function() { + this.hideOverlay(); + this.mapType = null; + this.createMapType(); + if (this.doShow && (this.gMap != null)) { + return this.showOverlay(); + } + }; + + MapTypeParentModel.prototype.showOverlay = function() { + var found; + if (angular.isDefined(this.scope.index)) { + found = false; + if (this.gMap.overlayMapTypes.getLength()) { + this.gMap.overlayMapTypes.forEach((function(_this) { + return function(mapType, index) { + var layerIndex; + if (!found) { + layerIndex = _this.propMap.get(mapType.layerId.toString()); + if (layerIndex > _this.scope.index || !angular.isDefined(layerIndex)) { + found = true; + _this.gMap.overlayMapTypes.insertAt(index, _this.mapType); + } + } + }; + })(this)); + if (!found) { + return this.gMap.overlayMapTypes.push(this.mapType); + } + } else { + return this.gMap.overlayMapTypes.push(this.mapType); + } + } else { + return this.gMap.overlayMapTypes.push(this.mapType); + } + }; + + MapTypeParentModel.prototype.hideOverlay = function() { + var found; + found = false; + return this.gMap.overlayMapTypes.forEach((function(_this) { + return function(mapType, index) { + if (!found && mapType.layerId === _this.id) { + found = true; + _this.gMap.overlayMapTypes.removeAt(index); + } + }; + })(this)); + }; + + MapTypeParentModel.prototype.refreshShown = function() { + return this.doShow = angular.isDefined(this.attrs.show) ? (this.childModel ? this.childModel[this.attrs.show] : this.scope.show) : true; + }; + + return MapTypeParentModel; + + })(BaseObject); + return MapTypeParentModel; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapMapTypesParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapMapTypeParentModel', 'uiGmapPropMap', function(BaseObject, Logger, MapTypeParentModel, PropMap) { + var MapTypesParentModel; + MapTypesParentModel = (function(superClass) { + extend(MapTypesParentModel, superClass); + + function MapTypesParentModel(scope, element, attrs, gMap, $log) { + var pMap; + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.gMap = gMap; + this.$log = $log != null ? $log : Logger; + if (this.attrs.mapTypes == null) { + this.$log.info('layers attribute for the map-types directive is mandatory. Map types creation aborted!!'); + return; + } + pMap = new PropMap; + this.scope.mapTypes.forEach((function(_this) { + return function(l, i) { + var childScope, mockAttr; + mockAttr = { + options: _this.scope.options, + show: _this.scope.show, + refresh: _this.scope.refresh + }; + childScope = _this.scope.$new(); + childScope.index = i; + new MapTypeParentModel(childScope, null, mockAttr, _this.gMap, _this.$log, l, pMap); + }; + })(this)); + } + + return MapTypesParentModel; + + })(BaseObject); + return MapTypesParentModel; + } + ]); + +}).call(this); +; +/*global _:true,angular:true, */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapMarkersParentModel", [ + "uiGmapIMarkerParentModel", "uiGmapModelsWatcher", "uiGmapPropMap", "uiGmapMarkerChildModel", "uiGmap_async", "uiGmapClustererMarkerManager", "uiGmapMarkerManager", "$timeout", "uiGmapIMarker", "uiGmapPromise", "uiGmapGmapUtil", "uiGmapLogger", "uiGmapSpiderfierMarkerManager", function(IMarkerParentModel, ModelsWatcher, PropMap, MarkerChildModel, _async, ClustererMarkerManager, MarkerManager, $timeout, IMarker, uiGmapPromise, GmapUtil, $log, SpiderfierMarkerManager) { + var MarkersParentModel, _setPlurals; + _setPlurals = function(val, objToSet) { + objToSet.plurals = new PropMap(); + objToSet.scope.plurals = objToSet.plurals; + return objToSet; + }; + MarkersParentModel = (function(superClass) { + extend(MarkersParentModel, superClass); + + MarkersParentModel.include(GmapUtil); + + MarkersParentModel.include(ModelsWatcher); + + function MarkersParentModel(scope, element, attrs, map) { + this.maybeExecMappedEvent = bind(this.maybeExecMappedEvent, this); + this.onDestroy = bind(this.onDestroy, this); + this.newChildMarker = bind(this.newChildMarker, this); + this.pieceMeal = bind(this.pieceMeal, this); + this.rebuildAll = bind(this.rebuildAll, this); + this.createAllNew = bind(this.createAllNew, this); + this.bindToTypeEvents = bind(this.bindToTypeEvents, this); + this.createChildScopes = bind(this.createChildScopes, this); + this.validateScope = bind(this.validateScope, this); + this.onWatch = bind(this.onWatch, this); + MarkersParentModel.__super__.constructor.call(this, scope, element, attrs, map); + this["interface"] = IMarker; + _setPlurals(new PropMap(), this); + this.scope.pluralsUpdate = { + updateCtr: 0 + }; + this.$log.info(this); + this.doRebuildAll = this.scope.doRebuildAll != null ? this.scope.doRebuildAll : false; + this.setIdKey(this.scope); + this.scope.$watch('doRebuildAll', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.doRebuildAll = newValue; + } + }; + })(this)); + if (!this.modelsLength()) { + this.modelsRendered = false; + } + this.scope.$watch('models', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue) || !_this.modelsRendered) { + if (newValue.length === 0 && oldValue.length === 0) { + return; + } + _this.modelsRendered = true; + return _this.onWatch('models', _this.scope, newValue, oldValue); + } + }; + })(this), !this.isTrue(attrs.modelsbyref)); + this.watch('doCluster', this.scope); + this.watch('type', this.scope); + this.watch('clusterOptions', this.scope); + this.watch('clusterEvents', this.scope); + this.watch('typeOptions', this.scope); + this.watch('typeEvents', this.scope); + this.watch('fit', this.scope); + this.watch('idKey', this.scope); + this.gManager = void 0; + this.createAllNew(this.scope); + } + + MarkersParentModel.prototype.onWatch = function(propNameToWatch, scope, newValue, oldValue) { + if (propNameToWatch === "idKey" && newValue !== oldValue) { + this.idKey = newValue; + } + if (this.doRebuildAll || (propNameToWatch === 'doCluster' || propNameToWatch === 'type')) { + return this.rebuildAll(scope); + } else { + return this.pieceMeal(scope); + } + }; + + MarkersParentModel.prototype.validateScope = function(scope) { + var modelsNotDefined; + modelsNotDefined = angular.isUndefined(scope.models) || scope.models === void 0; + if (modelsNotDefined) { + this.$log.error(this.constructor.name + ": no valid models attribute found"); + } + return MarkersParentModel.__super__.validateScope.call(this, scope) || modelsNotDefined; + }; + + + /* + Not used internally by this parent + created for consistency for external control in the API + */ + + MarkersParentModel.prototype.createChildScopes = function(isCreatingFromScratch) { + if ((this.gMap == null) || (this.scope.models == null)) { + return; + } + if (isCreatingFromScratch) { + return this.createAllNew(this.scope, false); + } else { + return this.pieceMeal(this.scope, false); + } + }; + + MarkersParentModel.prototype.bindToTypeEvents = function(typeEvents, events) { + var internalHandles, self; + if (events == null) { + events = ['click', 'mouseout', 'mouseover']; + } + + /* + You should only be binding to events that produce groups/clusters of somthing. + Otherwise use the orginal event handle. + For Example: Click on a cluster pushes a cluster/group obj through which has getMarkers + However Spiderfy's click is for a single marker so this is not ideal for that. + */ + self = this; + if (!this.origTypeEvents) { + this.origTypeEvents = {}; + _.each(events, (function(_this) { + return function(eventName) { + return _this.origTypeEvents[eventName] = typeEvents != null ? typeEvents[eventName] : void 0; + }; + })(this)); + } else { + angular.extend(typeEvents, this.origTypeEvents); + } + internalHandles = {}; + _.each(events, function(eventName) { + return internalHandles[eventName] = function(group) { + return self.maybeExecMappedEvent(group, eventName); + }; + }); + return angular.extend(typeEvents, internalHandles); + }; + + MarkersParentModel.prototype.createAllNew = function(scope) { + var isSpiderfied, maybeCanceled, typeEvents, typeOptions; + if (this.gManager != null) { + if (this.gManager instanceof SpiderfierMarkerManager) { + isSpiderfied = this.gManager.isSpiderfied(); + } + this.gManager.clear(); + delete this.gManager; + } + typeEvents = scope.typeEvents || scope.clusterEvents; + typeOptions = scope.typeOptions || scope.clusterOptions; + if (scope.doCluster || scope.type === 'cluster') { + if (typeEvents != null) { + this.bindToTypeEvents(typeEvents); + } + this.gManager = new ClustererMarkerManager(this.map, void 0, typeOptions, typeEvents); + } else if (scope.type === 'spider') { + if (typeEvents != null) { + this.bindToTypeEvents(typeEvents, ['spiderfy', 'unspiderfy']); + } + this.gManager = new SpiderfierMarkerManager(this.map, void 0, typeOptions, typeEvents, this.scope); + if (isSpiderfied) { + this.gManager.spiderfy(); + } + } else { + this.gManager = new MarkerManager(this.map); + } + if (this.didQueueInitPromise(this, scope)) { + return; + } + maybeCanceled = null; + return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return _async.each(scope.models, function(model) { + _this.newChildMarker(model, scope); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)).then(function() { + _this.modelsRendered = true; + if (scope.fit) { + _this.gManager.fit(); + } + _this.gManager.draw(); + return _this.scope.pluralsUpdate.updateCtr += 1; + }, _async.chunkSizeFrom(scope.chunk)); + }; + })(this)); + }; + + MarkersParentModel.prototype.rebuildAll = function(scope) { + var ref; + if (!scope.doRebuild && scope.doRebuild !== void 0) { + return; + } + if ((ref = this.scope.plurals) != null ? ref.length : void 0) { + return this.onDestroy(scope).then((function(_this) { + return function() { + return _this.createAllNew(scope); + }; + })(this)); + } else { + return this.createAllNew(scope); + } + }; + + MarkersParentModel.prototype.pieceMeal = function(scope) { + var maybeCanceled, payload; + if (scope.$$destroyed) { + return; + } + maybeCanceled = null; + payload = null; + if (this.modelsLength() && this.scope.plurals.length) { + return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return uiGmapPromise.promise((function() { + return _this.figureOutState(_this.idKey, scope, _this.scope.plurals, _this.modelKeyComparison); + })).then(function(state) { + payload = state; + return _async.each(payload.removals, function(child) { + if (child != null) { + if (child.destroy != null) { + child.destroy(); + } + _this.scope.plurals.remove(child.id); + return maybeCanceled; + } + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + return _async.each(payload.adds, function(modelToAdd) { + _this.newChildMarker(modelToAdd, scope); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + return _async.each(payload.updates, function(update) { + _this.updateChild(update.child, update.model); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + if (payload.adds.length > 0 || payload.removals.length > 0 || payload.updates.length > 0) { + scope.plurals = _this.scope.plurals; + if (scope.fit) { + _this.gManager.fit(); + } + _this.gManager.draw(); + } + return _this.scope.pluralsUpdate.updateCtr += 1; + }); + }; + })(this)); + } else { + this.inProgress = false; + return this.rebuildAll(scope); + } + }; + + MarkersParentModel.prototype.newChildMarker = function(model, scope) { + var child, childScope, keys; + if (!model) { + throw 'model undefined'; + } + if (model[this.idKey] == null) { + this.$log.error("Marker model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."); + return; + } + this.$log.info('child', child, 'markers', this.scope.markerModels); + childScope = scope.$new(false); + childScope.events = scope.events; + keys = {}; + IMarker.scopeKeys.forEach(function(k) { + return keys[k] = scope[k]; + }); + child = new MarkerChildModel({ + scope: childScope, + model: model, + keys: keys, + gMap: this.map, + defaults: this.DEFAULTS, + doClick: this.doClick, + gManager: this.gManager, + doDrawSelf: false, + isScopeModel: true + }); + this.scope.plurals.put(model[this.idKey], child); + return child; + }; + + MarkersParentModel.prototype.onDestroy = function(scope) { + MarkersParentModel.__super__.onDestroy.call(this, scope); + return _async.promiseLock(this, uiGmapPromise.promiseTypes["delete"], void 0, void 0, (function(_this) { + return function() { + return _async.each(_this.scope.plurals.values(), function(model) { + if (model != null) { + return model.destroy(false); + } + }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() { + if (_this.gManager != null) { + _this.gManager.destroy(); + } + _this.plurals.removeAll(); + if (_this.plurals !== _this.scope.plurals) { + console.error('plurals out of sync for MarkersParentModel'); + } + return _this.scope.pluralsUpdate.updateCtr += 1; + }); + }; + })(this)); + }; + + MarkersParentModel.prototype.maybeExecMappedEvent = function(group, fnName) { + var pair, typeEvents; + if (this.scope.$$destroyed) { + return; + } + typeEvents = this.scope.typeEvents || this.scope.clusterEvents; + if (_.isFunction(typeEvents != null ? typeEvents[fnName] : void 0)) { + pair = this.mapTypeToPlurals(group); + if (this.origTypeEvents[fnName]) { + return this.origTypeEvents[fnName](pair.group, pair.mapped); + } + } + }; + + MarkersParentModel.prototype.mapTypeToPlurals = function(group) { + var arrayToMap, mapped, ref; + if (_.isArray(group)) { + arrayToMap = group; + } else if (_.isFunction(group.getMarkers)) { + arrayToMap = group.getMarkers(); + } + if (arrayToMap == null) { + $log.error("Unable to map event as we cannot find the array group to map"); + return; + } + if ((ref = this.scope.plurals.values()) != null ? ref.length : void 0) { + mapped = arrayToMap.map((function(_this) { + return function(g) { + return _this.scope.plurals.get(g.key).model; + }; + })(this)); + } else { + mapped = []; + } + return { + cluster: group, + mapped: mapped, + group: group + }; + }; + + MarkersParentModel.prototype.getItem = function(scope, modelsPropToIterate, index) { + if (modelsPropToIterate === 'models') { + return scope[modelsPropToIterate][index]; + } + return scope[modelsPropToIterate].get(index); + }; + + return MarkersParentModel; + + })(IMarkerParentModel); + return MarkersParentModel; + } + ]); + +}).call(this); +;(function() { + ['Polygon', 'Polyline'].forEach(function(name) { + return angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory("uiGmap" + name + "sParentModel", [ + 'uiGmapBasePolysParentModel', "uiGmap" + name + "ChildModel", "uiGmapI" + name, function(BasePolysParentModel, ChildModel, IPoly) { + return BasePolysParentModel(IPoly, ChildModel, name); + } + ]); + }); + +}).call(this); +; +/*globals angular, _, google */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapRectangleParentModel', [ + 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', 'uiGmapRectangleOptionsBuilder', function($log, GmapUtil, EventsHelper, Builder) { + var RectangleParentModel; + return RectangleParentModel = (function(superClass) { + extend(RectangleParentModel, superClass); + + RectangleParentModel.include(GmapUtil); + + RectangleParentModel.include(EventsHelper); + + function RectangleParentModel(scope, element, attrs, gMap, DEFAULTS) { + var bounds, clear, createBounds, dragging, fit, gObject, init, listeners, myListeners, settingBoundsFromScope, updateBounds; + this.scope = scope; + this.attrs = attrs; + this.gMap = gMap; + this.DEFAULTS = DEFAULTS; + bounds = void 0; + dragging = false; + myListeners = []; + listeners = void 0; + fit = (function(_this) { + return function() { + if (_this.isTrue(_this.attrs.fit)) { + return _this.fitMapBounds(_this.gMap, bounds); + } + }; + })(this); + createBounds = (function(_this) { + return function() { + var ref, ref1, ref2; + if ((_this.scope.bounds != null) && (((ref = _this.scope.bounds) != null ? ref.sw : void 0) != null) && (((ref1 = _this.scope.bounds) != null ? ref1.ne : void 0) != null) && _this.validateBoundPoints(_this.scope.bounds)) { + bounds = _this.convertBoundPoints(_this.scope.bounds); + return $log.info("new new bounds created: " + (JSON.stringify(bounds))); + } else if ((_this.scope.bounds.getNorthEast != null) && (_this.scope.bounds.getSouthWest != null)) { + return bounds = _this.scope.bounds; + } else { + if (_this.scope.bounds != null) { + return $log.error("Invalid bounds for newValue: " + (JSON.stringify((ref2 = _this.scope) != null ? ref2.bounds : void 0))); + } + } + }; + })(this); + createBounds(); + gObject = new google.maps.Rectangle(this.buildOpts(bounds)); + $log.info("gObject (rectangle) created: " + gObject); + settingBoundsFromScope = false; + updateBounds = (function(_this) { + return function() { + var b, ne, sw; + b = gObject.getBounds(); + ne = b.getNorthEast(); + sw = b.getSouthWest(); + if (settingBoundsFromScope) { + return; + } + return _this.scope.$evalAsync(function(s) { + if ((s.bounds != null) && (s.bounds.sw != null) && (s.bounds.ne != null)) { + s.bounds.ne = { + latitude: ne.lat(), + longitude: ne.lng() + }; + s.bounds.sw = { + latitude: sw.lat(), + longitude: sw.lng() + }; + } + if ((s.bounds.getNorthEast != null) && (s.bounds.getSouthWest != null)) { + return s.bounds = b; + } + }); + }; + })(this); + init = (function(_this) { + return function() { + fit(); + _this.removeEvents(myListeners); + myListeners.push(google.maps.event.addListener(gObject, 'dragstart', function() { + return dragging = true; + })); + myListeners.push(google.maps.event.addListener(gObject, 'dragend', function() { + dragging = false; + return updateBounds(); + })); + return myListeners.push(google.maps.event.addListener(gObject, 'bounds_changed', function() { + if (dragging) { + return; + } + return updateBounds(); + })); + }; + })(this); + clear = (function(_this) { + return function() { + _this.removeEvents(myListeners); + if (listeners != null) { + _this.removeEvents(listeners); + } + return gObject.setMap(null); + }; + })(this); + if (bounds != null) { + init(); + } + this.scope.$watch('bounds', (function(newValue, oldValue) { + var isNew; + if (_.isEqual(newValue, oldValue) && (bounds != null) || dragging) { + return; + } + settingBoundsFromScope = true; + if (newValue == null) { + clear(); + return; + } + if (bounds == null) { + isNew = true; + } else { + fit(); + } + createBounds(); + gObject.setBounds(bounds); + settingBoundsFromScope = false; + if (isNew && (bounds != null)) { + return init(); + } + }), true); + this.setMyOptions = (function(_this) { + return function(newVals, oldVals) { + if (!_.isEqual(newVals, oldVals)) { + if ((bounds != null) && (newVals != null)) { + return gObject.setOptions(_this.buildOpts(bounds)); + } + } + }; + })(this); + this.props.push('bounds'); + this.watchProps(this.props); + if (this.attrs.events != null) { + listeners = this.setEvents(gObject, this.scope, this.scope); + this.scope.$watch('events', (function(_this) { + return function(newValue, oldValue) { + if (!_.isEqual(newValue, oldValue)) { + if (listeners != null) { + _this.removeEvents(listeners); + } + return listeners = _this.setEvents(gObject, _this.scope, _this.scope); + } + }; + })(this)); + } + this.scope.$on('$destroy', function() { + return clear(); + }); + $log.info(this); + } + + return RectangleParentModel; + + })(Builder); + } + ]); + +}).call(this); +; +/*global angular:true, google:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapSearchBoxParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapEventsHelper', function(BaseObject, Logger, EventsHelper) { + var SearchBoxParentModel; + SearchBoxParentModel = (function(superClass) { + extend(SearchBoxParentModel, superClass); + + SearchBoxParentModel.include(EventsHelper); + + function SearchBoxParentModel(scope, element, attrs, gMap, ctrlPosition, template, $log) { + var controlDiv; + this.scope = scope; + this.element = element; + this.attrs = attrs; + this.gMap = gMap; + this.ctrlPosition = ctrlPosition; + this.template = template; + this.$log = $log != null ? $log : Logger; + this.setVisibility = bind(this.setVisibility, this); + this.getBounds = bind(this.getBounds, this); + this.setBounds = bind(this.setBounds, this); + this.createSearchBox = bind(this.createSearchBox, this); + this.addToParentDiv = bind(this.addToParentDiv, this); + this.addAsMapControl = bind(this.addAsMapControl, this); + this.init = bind(this.init, this); + if (this.attrs.template == null) { + this.$log.error('template attribute for the search-box directive is mandatory. Places Search Box creation aborted!!'); + return; + } + if (angular.isUndefined(this.scope.options)) { + this.scope.options = {}; + this.scope.options.visible = true; + } + if (angular.isUndefined(this.scope.options.visible)) { + this.scope.options.visible = true; + } + if (angular.isUndefined(this.scope.options.autocomplete)) { + this.scope.options.autocomplete = false; + } + this.visible = this.scope.options.visible; + this.autocomplete = this.scope.options.autocomplete; + controlDiv = angular.element('
'); + controlDiv.append(this.template); + this.input = controlDiv.find('input')[0]; + this.init(); + } + + SearchBoxParentModel.prototype.init = function() { + this.createSearchBox(); + this.scope.$watch('options', (function(_this) { + return function(newValue, oldValue) { + if (angular.isObject(newValue)) { + if (newValue.bounds != null) { + _this.setBounds(newValue.bounds); + } + if (newValue.visible != null) { + if (_this.visible !== newValue.visible) { + return _this.setVisibility(newValue.visible); + } + } + } + }; + })(this), true); + if (this.attrs.parentdiv != null) { + this.addToParentDiv(); + } else { + this.addAsMapControl(); + } + if (!this.visible) { + this.setVisibility(this.visible); + } + if (this.autocomplete) { + this.listener = google.maps.event.addListener(this.gObject, 'place_changed', (function(_this) { + return function() { + return _this.places = _this.gObject.getPlace(); + }; + })(this)); + } else { + this.listener = google.maps.event.addListener(this.gObject, 'places_changed', (function(_this) { + return function() { + return _this.places = _this.gObject.getPlaces(); + }; + })(this)); + } + this.listeners = this.setEvents(this.gObject, this.scope, this.scope); + this.$log.info(this); + this.scope.$on('$stateChangeSuccess', (function(_this) { + return function() { + if (_this.attrs.parentdiv != null) { + return _this.addToParentDiv(); + } + }; + })(this)); + return this.scope.$on('$destroy', (function(_this) { + return function() { + return _this.gObject = null; + }; + })(this)); + }; + + SearchBoxParentModel.prototype.addAsMapControl = function() { + return this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input); + }; + + SearchBoxParentModel.prototype.addToParentDiv = function() { + var ref; + this.parentDiv = angular.element(document.getElementById(this.scope.parentdiv)); + if ((ref = this.parentDiv) != null ? ref.length : void 0) { + return this.parentDiv.append(this.input); + } + }; + + SearchBoxParentModel.prototype.createSearchBox = function() { + if (this.autocomplete) { + return this.gObject = new google.maps.places.Autocomplete(this.input, this.scope.options); + } else { + return this.gObject = new google.maps.places.SearchBox(this.input, this.scope.options); + } + }; + + SearchBoxParentModel.prototype.setBounds = function(bounds) { + if (angular.isUndefined(bounds.isEmpty)) { + this.$log.error('Error: SearchBoxParentModel setBounds. Bounds not an instance of LatLngBounds.'); + } else { + if (bounds.isEmpty() === false) { + if (this.gObject != null) { + return this.gObject.setBounds(bounds); + } + } + } + }; + + SearchBoxParentModel.prototype.getBounds = function() { + return this.gObject.getBounds(); + }; + + SearchBoxParentModel.prototype.setVisibility = function(val) { + if (this.attrs.parentdiv != null) { + if (val === false) { + this.parentDiv.addClass("ng-hide"); + } else { + this.parentDiv.removeClass("ng-hide"); + } + } else { + if (val === false) { + this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].clear(); + } else { + this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input); + } + } + return this.visible = val; + }; + + return SearchBoxParentModel; + + })(BaseObject); + return SearchBoxParentModel; + } + ]); + +}).call(this); +; +/*global _,angular */ + + +/* + WindowsChildModel generator where there are many ChildModels to a parent. + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapWindowsParentModel', [ + 'uiGmapIWindowParentModel', 'uiGmapModelsWatcher', 'uiGmapPropMap', 'uiGmapWindowChildModel', 'uiGmapLinked', 'uiGmap_async', 'uiGmapLogger', '$timeout', '$compile', '$http', '$templateCache', '$interpolate', 'uiGmapPromise', 'uiGmapIWindow', 'uiGmapGmapUtil', function(IWindowParentModel, ModelsWatcher, PropMap, WindowChildModel, Linked, _async, $log, $timeout, $compile, $http, $templateCache, $interpolate, uiGmapPromise, IWindow, GmapUtil) { + var WindowsParentModel; + WindowsParentModel = (function(superClass) { + extend(WindowsParentModel, superClass); + + WindowsParentModel.include(ModelsWatcher); + + function WindowsParentModel(scope, element, attrs, ctrls, gMap1, markersScope) { + this.gMap = gMap1; + this.markersScope = markersScope; + this.modelKeyComparison = bind(this.modelKeyComparison, this); + this.interpolateContent = bind(this.interpolateContent, this); + this.setChildScope = bind(this.setChildScope, this); + this.createWindow = bind(this.createWindow, this); + this.setContentKeys = bind(this.setContentKeys, this); + this.pieceMeal = bind(this.pieceMeal, this); + this.createAllNew = bind(this.createAllNew, this); + this.watchIdKey = bind(this.watchIdKey, this); + this.createChildScopes = bind(this.createChildScopes, this); + this.watchOurScope = bind(this.watchOurScope, this); + this.watchDestroy = bind(this.watchDestroy, this); + this.onDestroy = bind(this.onDestroy, this); + this.rebuildAll = bind(this.rebuildAll, this); + this.doINeedToWipe = bind(this.doINeedToWipe, this); + this.watchModels = bind(this.watchModels, this); + this.go = bind(this.go, this); + WindowsParentModel.__super__.constructor.call(this, scope, element, attrs, ctrls, $timeout, $compile, $http, $templateCache); + this["interface"] = IWindow; + this.plurals = new PropMap(); + _.each(IWindow.scopeKeys, (function(_this) { + return function(name) { + return _this[name + 'Key'] = void 0; + }; + })(this)); + this.linked = new Linked(scope, element, attrs, ctrls); + this.contentKeys = void 0; + this.isIconVisibleOnClick = void 0; + this.firstTime = true; + this.firstWatchModels = true; + this.$log.info(self); + this.parentScope = void 0; + this.go(scope); + } + + WindowsParentModel.prototype.go = function(scope) { + this.watchOurScope(scope); + this.doRebuildAll = this.scope.doRebuildAll != null ? this.scope.doRebuildAll : false; + scope.$watch('doRebuildAll', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.doRebuildAll = newValue; + } + }; + })(this)); + return this.createChildScopes(); + }; + + WindowsParentModel.prototype.watchModels = function(scope) { + var itemToWatch; + itemToWatch = this.markersScope != null ? 'pluralsUpdate' : 'models'; + return scope.$watch(itemToWatch, (function(_this) { + return function(newValue, oldValue) { + var doScratch; + if (!_.isEqual(newValue, oldValue) || _this.firstWatchModels) { + _this.firstWatchModels = false; + if (_this.doRebuildAll || _this.doINeedToWipe(scope.models)) { + return _this.rebuildAll(scope, true, true); + } else { + doScratch = _this.plurals.length === 0; + if (_this.existingPieces != null) { + return _.last(_this.existingPieces._content).then(function() { + return _this.createChildScopes(doScratch); + }); + } else { + return _this.createChildScopes(doScratch); + } + } + } + }; + })(this), true); + }; + + WindowsParentModel.prototype.doINeedToWipe = function(newValue) { + var newValueIsEmpty; + newValueIsEmpty = newValue != null ? newValue.length === 0 : true; + return this.plurals.length > 0 && newValueIsEmpty; + }; + + WindowsParentModel.prototype.rebuildAll = function(scope, doCreate, doDelete) { + return this.onDestroy(doDelete).then((function(_this) { + return function() { + if (doCreate) { + return _this.createChildScopes(); + } + }; + })(this)); + }; + + WindowsParentModel.prototype.onDestroy = function(scope) { + WindowsParentModel.__super__.onDestroy.call(this, this.scope); + return _async.promiseLock(this, uiGmapPromise.promiseTypes["delete"], void 0, void 0, (function(_this) { + return function() { + return _async.each(_this.plurals.values(), function(child) { + return child.destroy(true); + }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() { + var ref; + return (ref = _this.plurals) != null ? ref.removeAll() : void 0; + }); + }; + })(this)); + }; + + WindowsParentModel.prototype.watchDestroy = function(scope) { + return scope.$on('$destroy', (function(_this) { + return function() { + _this.firstWatchModels = true; + _this.firstTime = true; + return _this.rebuildAll(scope, false, true); + }; + })(this)); + }; + + WindowsParentModel.prototype.watchOurScope = function(scope) { + return _.each(IWindow.scopeKeys, (function(_this) { + return function(name) { + var nameKey; + nameKey = name + 'Key'; + return _this[nameKey] = typeof scope[name] === 'function' ? scope[name]() : scope[name]; + }; + })(this)); + }; + + WindowsParentModel.prototype.createChildScopes = function(isCreatingFromScratch) { + var modelsNotDefined, ref, ref1; + if (isCreatingFromScratch == null) { + isCreatingFromScratch = true; + } + + /* + being that we cannot tell the difference in Key String vs. a normal value string (TemplateUrl) + we will assume that all scope values are string expressions either pointing to a key (propName) or using + 'self' to point the model as container/object of interest. + + This may force redundant information into the model, but this appears to be the most flexible approach. + */ + this.isIconVisibleOnClick = true; + if (angular.isDefined(this.linked.attrs.isiconvisibleonclick)) { + this.isIconVisibleOnClick = this.linked.scope.isIconVisibleOnClick; + } + modelsNotDefined = angular.isUndefined(this.linked.scope.models); + if (modelsNotDefined && (this.markersScope === void 0 || (((ref = this.markersScope) != null ? ref.plurals : void 0) === void 0 || ((ref1 = this.markersScope) != null ? ref1.models : void 0) === void 0))) { + this.$log.error('No models to create windows from! Need direct models or models derived from markers!'); + return; + } + if (this.gMap != null) { + if (this.linked.scope.models != null) { + this.watchIdKey(this.linked.scope); + if (isCreatingFromScratch) { + return this.createAllNew(this.linked.scope, false); + } else { + return this.pieceMeal(this.linked.scope, false); + } + } else { + this.parentScope = this.markersScope; + this.watchIdKey(this.parentScope); + if (isCreatingFromScratch) { + return this.createAllNew(this.markersScope, true, 'plurals', false); + } else { + return this.pieceMeal(this.markersScope, true, 'plurals', false); + } + } + } + }; + + WindowsParentModel.prototype.watchIdKey = function(scope) { + this.setIdKey(scope); + return scope.$watch('idKey', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue && (newValue == null)) { + _this.idKey = newValue; + return _this.rebuildAll(scope, true, true); + } + }; + })(this)); + }; + + WindowsParentModel.prototype.createAllNew = function(scope, hasGMarker, modelsPropToIterate, isArray) { + var maybeCanceled; + if (modelsPropToIterate == null) { + modelsPropToIterate = 'models'; + } + if (isArray == null) { + isArray = false; + } + if (this.firstTime) { + this.watchModels(scope); + this.watchDestroy(scope); + } + this.setContentKeys(scope.models); + if (this.didQueueInitPromise(this, scope)) { + return; + } + maybeCanceled = null; + return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return _async.each(scope.models, function(model) { + var gMarker, ref; + gMarker = hasGMarker ? (ref = _this.getItem(scope, modelsPropToIterate, model[_this.idKey])) != null ? ref.gObject : void 0 : void 0; + if (!maybeCanceled) { + if (!gMarker && _this.markersScope) { + $log.error('Unable to get gMarker from markersScope!'); + } + _this.createWindow(model, gMarker, _this.gMap); + } + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)).then(function() { + return _this.firstTime = false; + }); + }; + })(this)); + }; + + WindowsParentModel.prototype.pieceMeal = function(scope, hasGMarker, modelsPropToIterate, isArray) { + var maybeCanceled, payload; + if (modelsPropToIterate == null) { + modelsPropToIterate = 'models'; + } + if (isArray == null) { + isArray = true; + } + if (scope.$$destroyed) { + return; + } + maybeCanceled = null; + payload = null; + if ((scope != null) && this.modelsLength() && this.plurals.length) { + return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) { + return maybeCanceled = canceledMsg; + }), (function(_this) { + return function() { + return uiGmapPromise.promise((function() { + return _this.figureOutState(_this.idKey, scope, _this.plurals, _this.modelKeyComparison); + })).then(function(state) { + payload = state; + return _async.each(payload.removals, function(child) { + if (child != null) { + _this.plurals.remove(child.id); + if (child.destroy != null) { + child.destroy(true); + } + return maybeCanceled; + } + }, _async.chunkSizeFrom(scope.chunk)); + }).then(function() { + return _async.each(payload.adds, function(modelToAdd) { + var gMarker, ref; + gMarker = (ref = _this.getItem(scope, modelsPropToIterate, modelToAdd[_this.idKey])) != null ? ref.gObject : void 0; + if (!gMarker) { + throw 'Gmarker undefined'; + } + _this.createWindow(modelToAdd, gMarker, _this.gMap); + return maybeCanceled; + }); + }).then(function() { + return _async.each(payload.updates, function(update) { + _this.updateChild(update.child, update.model); + return maybeCanceled; + }, _async.chunkSizeFrom(scope.chunk)); + }); + }; + })(this)); + } else { + $log.debug('pieceMeal: rebuildAll'); + return this.rebuildAll(this.scope, true, true); + } + }; + + WindowsParentModel.prototype.setContentKeys = function(models) { + if (this.modelsLength(models)) { + return this.contentKeys = Object.keys(models[0]); + } + }; + + WindowsParentModel.prototype.createWindow = function(model, gMarker, gMap) { + var child, childScope, fakeElement, opts, ref, ref1; + childScope = this.linked.scope.$new(false); + this.setChildScope(childScope, model); + childScope.$watch('model', (function(_this) { + return function(newValue, oldValue) { + if (newValue !== oldValue) { + return _this.setChildScope(childScope, newValue); + } + }; + })(this), true); + fakeElement = { + html: (function(_this) { + return function() { + return _this.interpolateContent(_this.linked.element.html(), model); + }; + })(this) + }; + this.DEFAULTS = this.scopeOrModelVal(this.optionsKey, this.scope, model) || {}; + opts = this.createWindowOptions(gMarker, childScope, fakeElement.html(), this.DEFAULTS); + child = new WindowChildModel({ + model: model, + scope: childScope, + opts: opts, + isIconVisibleOnClick: this.isIconVisibleOnClick, + gMap: gMap, + markerScope: (ref = this.markersScope) != null ? (ref1 = ref.plurals.get(model[this.idKey])) != null ? ref1.scope : void 0 : void 0, + element: fakeElement, + needToManualDestroy: false, + markerIsVisibleAfterWindowClose: true, + isScopeModel: true + }); + if (model[this.idKey] == null) { + this.$log.error('Window model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key.'); + return; + } + this.plurals.put(model[this.idKey], child); + return child; + }; + + WindowsParentModel.prototype.setChildScope = function(childScope, model) { + _.each(IWindow.scopeKeys, (function(_this) { + return function(name) { + var nameKey, newValue; + nameKey = name + 'Key'; + newValue = _this[nameKey] === 'self' ? model : model[_this[nameKey]]; + if (newValue !== childScope[name]) { + return childScope[name] = newValue; + } + }; + })(this)); + return childScope.model = model; + }; + + WindowsParentModel.prototype.interpolateContent = function(content, model) { + var exp, i, interpModel, key, len, ref; + if (this.contentKeys === void 0 || this.contentKeys.length === 0) { + return; + } + exp = $interpolate(content); + interpModel = {}; + ref = this.contentKeys; + for (i = 0, len = ref.length; i < len; i++) { + key = ref[i]; + interpModel[key] = model[key]; + } + return exp(interpModel); + }; + + WindowsParentModel.prototype.modelKeyComparison = function(model1, model2) { + var isEqual, scope; + scope = this.scope.coords != null ? this.scope : this.parentScope; + if (scope == null) { + throw 'No scope or parentScope set!'; + } + isEqual = GmapUtil.equalCoords(this.evalModelHandle(model1, scope.coords), this.evalModelHandle(model2, scope.coords)); + if (!isEqual) { + return isEqual; + } + isEqual = _.every(_.without(this["interface"].scopeKeys, 'coords'), (function(_this) { + return function(k) { + return _this.evalModelHandle(model1, scope[k]) === _this.evalModelHandle(model2, scope[k]); + }; + })(this)); + return isEqual; + }; + + return WindowsParentModel; + + })(IWindowParentModel); + return WindowsParentModel; + } + ]); + +}).call(this); +; +/*global angular, _ */ + +(function() { + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapCircle", [ + "uiGmapICircle", "uiGmapCircleParentModel", function(ICircle, CircleParentModel) { + return _.extend(ICircle, { + link: function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then(function(gMap) { + return new CircleParentModel(scope, element, attrs, gMap); + }); + } + }); + } + ]); + +}).call(this); +;(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapControl", [ + "uiGmapIControl", "$http", "$templateCache", "$compile", "$controller", 'uiGmapGoogleMapApi', function(IControl, $http, $templateCache, $compile, $controller, GoogleMapApi) { + var Control; + return Control = (function(superClass) { + extend(Control, superClass); + + function Control() { + this.link = bind(this.link, this); + Control.__super__.constructor.call(this); + } + + Control.prototype.transclude = true; + + Control.prototype.link = function(scope, element, attrs, ctrl, transclude) { + return GoogleMapApi.then((function(_this) { + return function(maps) { + var hasTranscludedContent, index, position; + hasTranscludedContent = angular.isUndefined(scope.template); + index = angular.isDefined(scope.index && !isNaN(parseInt(scope.index))) ? parseInt(scope.index) : void 0; + position = angular.isDefined(scope.position) ? scope.position.toUpperCase().replace(/-/g, '_') : 'TOP_CENTER'; + if (!maps.ControlPosition[position]) { + _this.$log.error('mapControl: invalid position property'); + return; + } + return IControl.mapPromise(scope, ctrl).then(function(map) { + var control, controlDiv, pushControl; + control = void 0; + controlDiv = angular.element('
'); + pushControl = function(map, control, index) { + if (index) { + control[0].index = index; + } + return map.controls[google.maps.ControlPosition[position]].push(control[0]); + }; + if (hasTranscludedContent) { + return transclude(function(transcludeEl) { + controlDiv.append(transcludeEl); + return pushControl(map, controlDiv.children(), index); + }); + } else { + return $http.get(scope.template, { + cache: $templateCache + }).then(function(arg) { + var data, templateCtrl, templateScope; + data = arg.data; + templateScope = scope.$new(); + controlDiv.append(data); + if (angular.isDefined(scope.controller)) { + templateCtrl = $controller(scope.controller, { + $scope: templateScope + }); + controlDiv.children().data('$ngControllerController', templateCtrl); + } + return control = $compile(controlDiv.children())(templateScope); + })["catch"](function(error) { + return _this.$log.error('mapControl: template could not be found'); + }).then(function() { + return pushControl(map, control, index); + }); + } + }); + }; + })(this)); + }; + + return Control; + + })(IControl); + } + ]); + +}).call(this); +; +/*globals angular, _ */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapDragZoom', [ + 'uiGmapCtrlHandle', 'uiGmapPropertyAction', function(CtrlHandle, PropertyAction) { + return { + restrict: 'EMA', + transclude: true, + template: '', + require: '^' + 'uiGmapGoogleMap', + scope: { + keyboardkey: '=', + options: '=', + spec: '=' + }, + controller: [ + '$scope', '$element', function($scope, $element) { + $scope.ctrlType = 'uiGmapDragZoom'; + return _.extend(this, CtrlHandle.handle($scope, $element)); + } + ], + link: function(scope, element, attrs, ctrl) { + return CtrlHandle.mapPromise(scope, ctrl).then(function(map) { + var enableKeyDragZoom, setKeyAction, setOptionsAction; + enableKeyDragZoom = function(opts) { + return map.enableKeyDragZoom(opts); + }; + setKeyAction = new PropertyAction(function(key, newVal) { + if (newVal) { + return enableKeyDragZoom({ + key: newVal + }); + } else { + return enableKeyDragZoom(); + } + }); + setOptionsAction = new PropertyAction(function(key, newVal) { + if (newVal) { + return enableKeyDragZoom(newVal); + } + }); + scope.$watch('keyboardkey', setKeyAction.sic('keyboardkey')); + setKeyAction.sic(scope.keyboardkey); + scope.$watch('options', setOptionsAction.sic('options')); + return setOptionsAction.sic(scope.options); + }); + } + }; + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapDrawingManager", [ + "uiGmapIDrawingManager", "uiGmapDrawingManagerParentModel", function(IDrawingManager, DrawingManagerParentModel) { + return _.extend(IDrawingManager, { + link: function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then(function(map) { + return new DrawingManagerParentModel(scope, element, attrs, map); + }); + } + }); + } + ]); + +}).call(this); +; +/* + - Link up Polygons to be sent back to a controller + - inject the draw function into a controllers scope so that controller can call the directive to draw on demand + - draw function creates the DrawFreeHandChildModel which manages itself + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapApiFreeDrawPolygons', [ + 'uiGmapLogger', 'uiGmapBaseObject', 'uiGmapCtrlHandle', 'uiGmapDrawFreeHandChildModel', 'uiGmapLodash', function($log, BaseObject, CtrlHandle, DrawFreeHandChildModel, uiGmapLodash) { + var FreeDrawPolygons; + return FreeDrawPolygons = (function(superClass) { + extend(FreeDrawPolygons, superClass); + + function FreeDrawPolygons() { + this.link = bind(this.link, this); + return FreeDrawPolygons.__super__.constructor.apply(this, arguments); + } + + FreeDrawPolygons.include(CtrlHandle); + + FreeDrawPolygons.prototype.restrict = 'EMA'; + + FreeDrawPolygons.prototype.replace = true; + + FreeDrawPolygons.prototype.require = '^' + 'uiGmapGoogleMap'; + + FreeDrawPolygons.prototype.scope = { + polygons: '=', + draw: '=' + }; + + FreeDrawPolygons.prototype.link = function(scope, element, attrs, ctrl) { + return this.mapPromise(scope, ctrl).then((function(_this) { + return function(map) { + var freeHand, listener; + if (!scope.polygons) { + return $log.error('No polygons to bind to!'); + } + if (!_.isArray(scope.polygons)) { + return $log.error('Free Draw Polygons must be of type Array!'); + } + freeHand = new DrawFreeHandChildModel(map, ctrl.getScope()); + listener = void 0; + return scope.draw = function() { + if (typeof listener === "function") { + listener(); + } + return freeHand.engage(scope.polygons).then(function() { + var firstTime; + firstTime = true; + return listener = scope.$watchCollection('polygons', function(newValue, oldValue) { + var removals; + if (firstTime || newValue === oldValue) { + firstTime = false; + return; + } + removals = uiGmapLodash.differenceObjects(oldValue, newValue); + return removals.forEach(function(p) { + return p.setMap(null); + }); + }); + }); + }; + }; + })(this)); + }; + + return FreeDrawPolygons; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + angular.module("uiGmapgoogle-maps.directives.api").service("uiGmapICircle", [ + function() { + return { + restrict: "EA", + replace: true, + require: '^' + 'uiGmapGoogleMap', + scope: { + center: "=center", + radius: "=radius", + stroke: "=stroke", + fill: "=fill", + clickable: "=", + draggable: "=", + editable: "=", + geodesic: "=", + icons: "=icons", + visible: "=", + events: "=", + control: "=", + zIndex: "=zindex" + } + }; + } + ]); + +}).call(this); +; +/* + - interface for all controls to derive from + - to enforce a minimum set of requirements + - attributes + - template + - position + - controller + - index + */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIControl", [ + "uiGmapBaseObject", "uiGmapLogger", "uiGmapCtrlHandle", function(BaseObject, Logger, CtrlHandle) { + var IControl; + return IControl = (function(superClass) { + extend(IControl, superClass); + + IControl.extend(CtrlHandle); + + function IControl() { + this.restrict = 'EA'; + this.replace = true; + this.require = '^' + 'uiGmapGoogleMap'; + this.scope = { + template: '@template', + position: '@position', + controller: '@controller', + index: '@index' + }; + this.$log = Logger; + } + + IControl.prototype.link = function(scope, element, attrs, ctrl) { + throw new Error("Not implemented!!"); + }; + + return IControl; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapIDrawingManager', [ + function() { + return { + restrict: 'EA', + replace: true, + require: '^' + 'uiGmapGoogleMap', + scope: { + "static": '@', + control: '=', + options: '=', + events: '=' + } + }; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIMarker', [ + 'uiGmapBaseObject', 'uiGmapCtrlHandle', function(BaseObject, CtrlHandle) { + var IMarker; + return IMarker = (function(superClass) { + extend(IMarker, superClass); + + IMarker.scope = { + coords: '=coords', + icon: '=icon', + click: '&click', + options: '=options', + events: '=events', + fit: '=fit', + idKey: '=idkey', + control: '=control' + }; + + IMarker.scopeKeys = _.keys(IMarker.scope); + + IMarker.keys = IMarker.scopeKeys; + + IMarker.extend(CtrlHandle); + + function IMarker() { + this.restrict = 'EMA'; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.replace = true; + this.scope = _.extend(this.scope || {}, IMarker.scope); + } + + return IMarker; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIPolygon', [ + 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapCtrlHandle', function(GmapUtil, BaseObject, Logger, CtrlHandle) { + var IPolygon; + return IPolygon = (function(superClass) { + extend(IPolygon, superClass); + + IPolygon.scope = { + path: '=path', + stroke: '=stroke', + clickable: '=', + draggable: '=', + editable: '=', + geodesic: '=', + fill: '=', + icons: '=icons', + visible: '=', + "static": '=', + events: '=', + zIndex: '=zindex', + fit: '=', + control: '=control' + }; + + IPolygon.scopeKeys = _.keys(IPolygon.scope); + + IPolygon.include(GmapUtil); + + IPolygon.extend(CtrlHandle); + + function IPolygon() {} + + IPolygon.prototype.restrict = 'EMA'; + + IPolygon.prototype.replace = true; + + IPolygon.prototype.require = '^' + 'uiGmapGoogleMap'; + + IPolygon.prototype.scope = IPolygon.scope; + + IPolygon.prototype.DEFAULTS = {}; + + IPolygon.prototype.$log = Logger; + + return IPolygon; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIPolyline', [ + 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapCtrlHandle', function(GmapUtil, BaseObject, Logger, CtrlHandle) { + var IPolyline; + return IPolyline = (function(superClass) { + extend(IPolyline, superClass); + + IPolyline.scope = { + path: '=', + stroke: '=', + clickable: '=', + draggable: '=', + editable: '=', + geodesic: '=', + icons: '=', + visible: '=', + "static": '=', + fit: '=', + events: '=', + zIndex: '=zindex' + }; + + IPolyline.scopeKeys = _.keys(IPolyline.scope); + + IPolyline.include(GmapUtil); + + IPolyline.extend(CtrlHandle); + + function IPolyline() {} + + IPolyline.prototype.restrict = 'EMA'; + + IPolyline.prototype.replace = true; + + IPolyline.prototype.require = '^' + 'uiGmapGoogleMap'; + + IPolyline.prototype.scope = IPolyline.scope; + + IPolyline.prototype.DEFAULTS = {}; + + IPolyline.prototype.$log = Logger; + + return IPolyline; + + })(BaseObject); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapIRectangle', [ + function() { + 'use strict'; + return { + restrict: 'EMA', + require: '^' + 'uiGmapGoogleMap', + replace: true, + scope: { + bounds: '=', + stroke: '=', + clickable: '=', + draggable: '=', + editable: '=', + fill: '=', + visible: '=', + events: '=' + } + }; + } + ]); + +}).call(this); +;(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIWindow', [ + 'uiGmapBaseObject', 'uiGmapChildEvents', 'uiGmapCtrlHandle', function(BaseObject, ChildEvents, CtrlHandle) { + var IWindow; + return IWindow = (function(superClass) { + extend(IWindow, superClass); + + IWindow.scope = { + coords: '=coords', + template: '=template', + templateUrl: '=templateurl', + templateParameter: '=templateparameter', + isIconVisibleOnClick: '=isiconvisibleonclick', + closeClick: '&closeclick', + options: '=options', + control: '=control', + show: '=show' + }; + + IWindow.scopeKeys = _.keys(IWindow.scope); + + IWindow.include(ChildEvents); + + IWindow.extend(CtrlHandle); + + function IWindow() { + this.restrict = 'EMA'; + this.template = void 0; + this.transclude = true; + this.priority = -100; + this.require = '^' + 'uiGmapGoogleMap'; + this.replace = true; + this.scope = _.extend(this.scope || {}, IWindow.scope); + } + + return IWindow; + + })(BaseObject); + } + ]); + +}).call(this); +; +/*globals angular,_,google */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapMap', ['$timeout', '$q', '$log', 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapCtrlHandle', 'uiGmapIsReady', 'uiGmapuuid', 'uiGmapExtendGWin', 'uiGmapExtendMarkerClusterer', 'uiGmapGoogleMapsUtilV3', 'uiGmapGoogleMapApi', 'uiGmapEventsHelper', 'uiGmapGoogleMapObjectManager', function($timeout, $q, $log, uiGmapGmapUtil, uiGmapBaseObject, uiGmapCtrlHandle, uiGmapIsReady, uiGmapuuid, uiGmapExtendGWin, uiGmapExtendMarkerClusterer, uiGmapGoogleMapsUtilV3, uiGmapGoogleMapApi, uiGmapEventsHelper, uiGmapGoogleMapObjectManager) { + var DEFAULTS, Map, initializeItems; + DEFAULTS = void 0; + initializeItems = [uiGmapGoogleMapsUtilV3, uiGmapExtendGWin, uiGmapExtendMarkerClusterer]; + return Map = (function(superClass) { + extend(Map, superClass); + + Map.include(uiGmapGmapUtil); + + function Map() { + this.link = bind(this.link, this); + var ctrlFn; + ctrlFn = function($scope) { + var ctrlObj, retCtrl; + retCtrl = void 0; + $scope.$on('$destroy', function() { + return uiGmapIsReady.decrement(); + }); + ctrlObj = uiGmapCtrlHandle.handle($scope); + $scope.ctrlType = 'Map'; + $scope.deferred.promise.then(function() { + return initializeItems.forEach(function(i) { + return i.init(); + }); + }); + ctrlObj.getMap = function() { + return $scope.map; + }; + retCtrl = _.extend(this, ctrlObj); + return retCtrl; + }; + this.controller = ['$scope', ctrlFn]; + } + + Map.prototype.restrict = 'EMA'; + + Map.prototype.transclude = true; + + Map.prototype.replace = false; + + Map.prototype.template = "
\n
"; + + Map.prototype.scope = { + center: '=', + zoom: '=', + dragging: '=', + control: '=', + options: '=', + events: '=', + eventOpts: '=', + styles: '=', + bounds: '=', + update: '=' + }; + + Map.prototype.link = function(scope, element, attrs) { + var listeners; + listeners = []; + scope.$on('$destroy', function() { + uiGmapEventsHelper.removeEvents(listeners); + if (attrs.recycleMapInstance === 'true' && scope.map) { + uiGmapGoogleMapObjectManager.recycleMapInstance(scope.map); + return scope.map = null; + } + }); + scope.idleAndZoomChanged = false; + return uiGmapGoogleMapApi.then((function(_this) { + return function(maps) { + var _gMap, customListeners, disabledEvents, dragging, el, eventName, getEventHandler, mapOptions, maybeHookToEvent, opts, ref, resolveSpawned, settingFromDirective, spawned, type, updateCenter, zoomPromise; + DEFAULTS = { + mapTypeId: maps.MapTypeId.ROADMAP + }; + spawned = uiGmapIsReady.spawn(); + resolveSpawned = function() { + return spawned.deferred.resolve({ + instance: spawned.instance, + map: _gMap + }); + }; + if (!angular.isDefined(scope.center) && !angular.isDefined(scope.bounds)) { + $log.error('angular-google-maps: a center or bounds property is required'); + return; + } + if (!angular.isDefined(scope.center)) { + scope.center = new google.maps.LatLngBounds(_this.getCoords(scope.bounds.southwest), _this.getCoords(scope.bounds.northeast)).getCenter(); + } + if (!angular.isDefined(scope.zoom)) { + scope.zoom = 10; + } + el = angular.element(element); + el.addClass('angular-google-map'); + opts = { + options: {} + }; + if (attrs.options) { + opts.options = scope.options; + } + if (attrs.styles) { + opts.styles = scope.styles; + } + if (attrs.type) { + type = attrs.type.toUpperCase(); + if (google.maps.MapTypeId.hasOwnProperty(type)) { + opts.mapTypeId = google.maps.MapTypeId[attrs.type.toUpperCase()]; + } else { + $log.error("angular-google-maps: invalid map type '" + attrs.type + "'"); + } + } + mapOptions = angular.extend({}, DEFAULTS, opts, { + center: _this.getCoords(scope.center), + zoom: scope.zoom, + bounds: scope.bounds + }); + if (attrs.recycleMapInstance === 'true') { + _gMap = uiGmapGoogleMapObjectManager.createMapInstance(el.find('div')[1], mapOptions); + } else { + _gMap = new google.maps.Map(el.find('div')[1], mapOptions); + } + _gMap['uiGmap_id'] = uiGmapuuid.generate(); + dragging = false; + listeners.push(google.maps.event.addListenerOnce(_gMap, 'idle', function() { + scope.deferred.resolve(_gMap); + return resolveSpawned(); + })); + disabledEvents = attrs.events && (((ref = scope.events) != null ? ref.blacklist : void 0) != null) ? scope.events.blacklist : []; + if (_.isString(disabledEvents)) { + disabledEvents = [disabledEvents]; + } + maybeHookToEvent = function(eventName, fn, prefn) { + if (!_.includes(disabledEvents, eventName)) { + if (prefn) { + prefn(); + } + return listeners.push(google.maps.event.addListener(_gMap, eventName, function() { + var ref1; + if (!((ref1 = scope.update) != null ? ref1.lazy : void 0)) { + return fn(); + } + })); + } + }; + if (!_.includes(disabledEvents, 'all')) { + maybeHookToEvent('dragstart', function() { + dragging = true; + return scope.$evalAsync(function(s) { + if (s.dragging != null) { + return s.dragging = dragging; + } + }); + }); + maybeHookToEvent('dragend', function() { + dragging = false; + return scope.$evalAsync(function(s) { + if (s.dragging != null) { + return s.dragging = dragging; + } + }); + }); + updateCenter = function(c, s) { + var cLat, cLng; + if (c == null) { + c = _gMap.center; + } + if (s == null) { + s = scope; + } + if (!_.includes(disabledEvents, 'center')) { + cLat = c.lat(); + cLng = c.lng(); + if (angular.isDefined(s.center.type)) { + if (s.center.coordinates[1] !== cLat) { + s.center.coordinates[1] = cLat; + } + if (s.center.coordinates[0] !== cLng) { + return s.center.coordinates[0] = cLng; + } + } else { + if (s.center.latitude !== cLat) { + s.center.latitude = cLat; + } + if (s.center.longitude !== cLng) { + return s.center.longitude = cLng; + } + } + } + }; + settingFromDirective = false; + maybeHookToEvent('idle', function() { + var b, ne, sw; + b = _gMap.getBounds(); + ne = b.getNorthEast(); + sw = b.getSouthWest(); + settingFromDirective = true; + return scope.$evalAsync(function(s) { + updateCenter(); + if (!_.isUndefined(s.bounds) && !_.includes(disabledEvents, 'bounds')) { + s.bounds.northeast = { + latitude: ne.lat(), + longitude: ne.lng() + }; + s.bounds.southwest = { + latitude: sw.lat(), + longitude: sw.lng() + }; + } + if (!_.includes(disabledEvents, 'zoom')) { + s.zoom = _gMap.zoom; + scope.idleAndZoomChanged = !scope.idleAndZoomChanged; + } + return settingFromDirective = false; + }); + }); + } + if (angular.isDefined(scope.events) && scope.events !== null && angular.isObject(scope.events)) { + getEventHandler = function(eventName) { + return function() { + return scope.events[eventName].apply(scope, [_gMap, eventName, arguments]); + }; + }; + customListeners = []; + for (eventName in scope.events) { + if (scope.events.hasOwnProperty(eventName) && angular.isFunction(scope.events[eventName])) { + customListeners.push(google.maps.event.addListener(_gMap, eventName, getEventHandler(eventName))); + } + } + listeners.concat(customListeners); + } + _gMap.getOptions = function() { + return mapOptions; + }; + scope.map = _gMap; + if ((attrs.control != null) && (scope.control != null)) { + scope.control.refresh = function(maybeCoords) { + var coords, ref1, ref2; + if (_gMap == null) { + return; + } + if (((typeof google !== "undefined" && google !== null ? (ref1 = google.maps) != null ? (ref2 = ref1.event) != null ? ref2.trigger : void 0 : void 0 : void 0) != null) && (_gMap != null)) { + google.maps.event.trigger(_gMap, 'resize'); + } + if (((maybeCoords != null ? maybeCoords.latitude : void 0) != null) && ((maybeCoords != null ? maybeCoords.longitude : void 0) != null)) { + coords = _this.getCoords(maybeCoords); + if (_this.isTrue(attrs.pan)) { + return _gMap.panTo(coords); + } else { + return _gMap.setCenter(coords); + } + } + }; + scope.control.getGMap = function() { + return _gMap; + }; + scope.control.getMapOptions = function() { + return mapOptions; + }; + scope.control.getCustomEventListeners = function() { + return customListeners; + }; + scope.control.removeEvents = function(yourListeners) { + return uiGmapEventsHelper.removeEvents(yourListeners); + }; + } + scope.$watch('center', function(newValue, oldValue) { + var coords; + if (newValue === oldValue || settingFromDirective) { + return; + } + coords = _this.getCoords(scope.center); + if (coords.lat() === _gMap.center.lat() && coords.lng() === _gMap.center.lng()) { + return; + } + if (!dragging) { + if (!_this.validateCoords(newValue)) { + $log.error("Invalid center for newValue: " + (JSON.stringify(newValue))); + } + if (_this.isTrue(attrs.pan) && scope.zoom === _gMap.zoom) { + return _gMap.panTo(coords); + } else { + return _gMap.setCenter(coords); + } + } + }, true); + zoomPromise = null; + scope.$watch('zoom', function(newValue, oldValue) { + var ref1, ref2; + if (newValue == null) { + return; + } + if (_.isEqual(newValue, oldValue) || (_gMap != null ? _gMap.getZoom() : void 0) === (scope != null ? scope.zoom : void 0) || settingFromDirective) { + return; + } + if (zoomPromise != null) { + $timeout.cancel(zoomPromise); + } + return zoomPromise = $timeout(function() { + return _gMap.setZoom(newValue); + }, ((ref1 = scope.eventOpts) != null ? (ref2 = ref1.debounce) != null ? ref2.zoomMs : void 0 : void 0) + 20, false); + }); + scope.$watch('bounds', function(newValue, oldValue) { + var bounds, ne, ref1, ref2, ref3, ref4, sw; + if (newValue === oldValue) { + return; + } + if (((newValue != null ? (ref1 = newValue.northeast) != null ? ref1.latitude : void 0 : void 0) == null) || ((newValue != null ? (ref2 = newValue.northeast) != null ? ref2.longitude : void 0 : void 0) == null) || ((newValue != null ? (ref3 = newValue.southwest) != null ? ref3.latitude : void 0 : void 0) == null) || ((newValue != null ? (ref4 = newValue.southwest) != null ? ref4.longitude : void 0 : void 0) == null)) { + $log.error("Invalid map bounds for new value: " + (JSON.stringify(newValue))); + return; + } + ne = new google.maps.LatLng(newValue.northeast.latitude, newValue.northeast.longitude); + sw = new google.maps.LatLng(newValue.southwest.latitude, newValue.southwest.longitude); + bounds = new google.maps.LatLngBounds(sw, ne); + return _gMap.fitBounds(bounds); + }); + return ['options', 'styles'].forEach(function(toWatch) { + return scope.$watch(toWatch, function(newValue, oldValue) { + if (_.isEqual(newValue, oldValue)) { + return; + } + if (toWatch === 'options') { + opts.options = newValue; + } else { + opts.options[toWatch] = newValue; + } + if (_gMap != null) { + return _gMap.setOptions(opts); + } + }, true); + }); + }; + })(this)); + }; + + return Map; + + })(uiGmapBaseObject); + }]); + +}).call(this); +; +/*global _:true,angular:true */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMarker", [ + "uiGmapIMarker", "uiGmapMarkerChildModel", "uiGmapMarkerManager", "uiGmapLogger", function(IMarker, MarkerChildModel, MarkerManager, $log) { + var Marker; + return Marker = (function(superClass) { + extend(Marker, superClass); + + function Marker() { + Marker.__super__.constructor.call(this); + this.template = ''; + $log.info(this); + } + + Marker.prototype.controller = [ + '$scope', '$element', function($scope, $element) { + $scope.ctrlType = 'Marker'; + return _.extend(this, IMarker.handle($scope, $element)); + } + ]; + + Marker.prototype.link = function(scope, element, attrs, ctrl) { + var mapPromise; + mapPromise = IMarker.mapPromise(scope, ctrl); + mapPromise.then(function(gMap) { + var gManager, keys, m; + gManager = new MarkerManager(gMap); + keys = _.object(IMarker.keys, IMarker.keys); + m = new MarkerChildModel({ + scope: scope, + model: scope, + keys: keys, + gMap: gMap, + doClick: true, + gManager: gManager, + doDrawSelf: false, + trackModel: false + }); + m.deferred.promise.then(function(gMarker) { + return scope.deferred.resolve(gMarker); + }); + if (scope.control != null) { + return scope.control.getGMarkers = gManager.getGMarkers; + } + }); + return scope.$on('$destroy', function() { + var gManager; + if (typeof gManager !== "undefined" && gManager !== null) { + gManager.clear(); + } + return gManager = null; + }); + }; + + return Marker; + + })(IMarker); + } + ]); + +}).call(this); +; +/*global _:true,angular:true */ + +(function() { + var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMarkers", [ + "uiGmapIMarker", "uiGmapPlural", "uiGmapMarkersParentModel", "uiGmap_sync", "uiGmapLogger", function(IMarker, Plural, MarkersParentModel, _sync, $log) { + var Markers; + return Markers = (function(superClass) { + extend(Markers, superClass); + + function Markers() { + Markers.__super__.constructor.call(this); + this.template = ''; + Plural.extend(this, { + doCluster: '=?docluster', + clusterOptions: '=clusteroptions', + clusterEvents: '=clusterevents', + modelsByRef: '=modelsbyref', + type: '=?type', + typeOptions: '=?typeoptions', + typeEvents: '=?typeevents', + deepComparison: '=?deepcomparison' + }); + $log.info(this); + } + + Markers.prototype.controller = [ + '$scope', '$element', function($scope, $element) { + $scope.ctrlType = 'Markers'; + return _.extend(this, IMarker.handle($scope, $element)); + } + ]; + + Markers.prototype.link = function(scope, element, attrs, ctrl) { + var parentModel, ready; + parentModel = void 0; + ready = function() { + return scope.deferred.resolve(); + }; + return IMarker.mapPromise(scope, ctrl).then(function(map) { + var mapScope; + mapScope = ctrl.getScope(); + mapScope.$watch('idleAndZoomChanged', function() { + return _.defer(parentModel.gManager.draw); + }); + parentModel = new MarkersParentModel(scope, element, attrs, map); + Plural.link(scope, parentModel); + if (scope.control != null) { + scope.control.getGMarkers = function() { + var ref; + return (ref = parentModel.gManager) != null ? ref.getGMarkers() : void 0; + }; + scope.control.getChildMarkers = function() { + return parentModel.plurals; + }; + } + return _.last(parentModel.existingPieces._content).then(function() { + return ready(); + }); + }); + }; + + return Markers; + + })(IMarker); + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapPlural', [ + function() { + var _initControl; + _initControl = function(scope, parent) { + if (scope.control == null) { + return; + } + scope.control.updateModels = function(models) { + scope.models = models; + return parent.createChildScopes(false); + }; + scope.control.newModels = function(models) { + scope.models = models; + return parent.rebuildAll(scope, true, true); + }; + scope.control.clean = function() { + return parent.rebuildAll(scope, false, true); + }; + scope.control.getPlurals = function() { + return parent.plurals; + }; + scope.control.getManager = function() { + return parent.gManager; + }; + scope.control.hasManager = function() { + return (parent.gManager != null) === true; + }; + return scope.control.managerDraw = function() { + var ref; + if (scope.control.hasManager()) { + return (ref = scope.control.getManager()) != null ? ref.draw() : void 0; + } + }; + }; + return { + extend: function(obj, obj2) { + return _.extend(obj.scope || {}, obj2 || {}, { + idKey: '=idkey', + doRebuildAll: '=dorebuildall', + models: '=models', + chunk: '=chunk', + cleanchunk: '=cleanchunk', + control: '=control', + deepComparison: '=deepcomparison' + }); + }, + link: function(scope, parent) { + return _initControl(scope, parent); + } + }; + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygon', [ + 'uiGmapIPolygon', '$timeout', 'uiGmapPolygonChildModel', function(IPolygon, $timeout, PolygonChild) { + var Polygon; + return Polygon = (function(superClass) { + extend(Polygon, superClass); + + function Polygon() { + this.link = bind(this.link, this); + return Polygon.__super__.constructor.apply(this, arguments); + } + + Polygon.prototype.link = function(scope, element, attrs, mapCtrl) { + var children, promise; + children = []; + promise = IPolygon.mapPromise(scope, mapCtrl); + if (scope.control != null) { + scope.control.getInstance = this; + scope.control.polygons = children; + scope.control.promise = promise; + } + return promise.then((function(_this) { + return function(gMap) { + return children.push(new PolygonChild({ + scope: scope, + attrs: attrs, + gMap: gMap, + defaults: _this.DEFAULTS + })); + }; + })(this)); + }; + + return Polygon; + + })(IPolygon); + } + ]); + +}).call(this); +; +/*global angular:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygons', [ + 'uiGmapIPolygon', '$timeout', 'uiGmapPolygonsParentModel', 'uiGmapPlural', function(Interface, $timeout, ParentModel, Plural) { + var Polygons; + return Polygons = (function(superClass) { + extend(Polygons, superClass); + + function Polygons() { + this.link = bind(this.link, this); + Polygons.__super__.constructor.call(this); + Plural.extend(this); + this.$log.info(this); + } + + Polygons.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(map) { + if (angular.isUndefined(scope.path) || scope.path === null) { + _this.$log.warn('polygons: no valid path attribute found'); + } + if (!scope.models) { + _this.$log.warn('polygons: no models found to create from'); + } + return Plural.link(scope, new ParentModel(scope, element, attrs, map, _this.DEFAULTS)); + }; + })(this)); + }; + + return Polygons; + + })(Interface); + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolyline', [ + 'uiGmapIPolyline', '$timeout', 'uiGmapPolylineChildModel', function(IPolyline, $timeout, PolylineChildModel) { + var Polyline; + return Polyline = (function(superClass) { + extend(Polyline, superClass); + + function Polyline() { + this.link = bind(this.link, this); + return Polyline.__super__.constructor.apply(this, arguments); + } + + Polyline.prototype.link = function(scope, element, attrs, mapCtrl) { + return IPolyline.mapPromise(scope, mapCtrl).then((function(_this) { + return function(gMap) { + if (angular.isUndefined(scope.path) || scope.path === null || !_this.validatePath(scope.path)) { + _this.$log.warn('polyline: no valid path attribute found'); + } + return new PolylineChildModel({ + scope: scope, + attrs: attrs, + gMap: gMap, + defaults: _this.DEFAULTS + }); + }; + })(this)); + }; + + return Polyline; + + })(IPolyline); + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolylines', [ + 'uiGmapIPolyline', '$timeout', 'uiGmapPolylinesParentModel', 'uiGmapPlural', function(IPolyline, $timeout, PolylinesParentModel, Plural) { + var Polylines; + return Polylines = (function(superClass) { + extend(Polylines, superClass); + + function Polylines() { + this.link = bind(this.link, this); + Polylines.__super__.constructor.call(this); + Plural.extend(this); + this.$log.info(this); + } + + Polylines.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(gMap) { + if (angular.isUndefined(scope.path) || scope.path === null) { + _this.$log.warn('polylines: no valid path attribute found'); + } + if (!scope.models) { + _this.$log.warn('polylines: no models found to create from'); + } + return Plural.link(scope, new PolylinesParentModel(scope, element, attrs, gMap, _this.DEFAULTS)); + }; + })(this)); + }; + + return Polylines; + + })(IPolyline); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapRectangle', [ + 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapIRectangle', 'uiGmapRectangleParentModel', function($log, GmapUtil, IRectangle, RectangleParentModel) { + return _.extend(IRectangle, { + link: function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then(function(gMap) { + return new RectangleParentModel(scope, element, attrs, gMap); + }); + } + }); + } + ]); + +}).call(this); +; +/*global angular:true */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapWindow', [ + 'uiGmapIWindow', 'uiGmapGmapUtil', 'uiGmapWindowChildModel', 'uiGmapLodash', 'uiGmapLogger', function(IWindow, GmapUtil, WindowChildModel, uiGmapLodash, $log) { + var Window; + return Window = (function(superClass) { + extend(Window, superClass); + + Window.include(GmapUtil); + + function Window() { + this.link = bind(this.link, this); + Window.__super__.constructor.call(this); + this.require = ['^' + 'uiGmapGoogleMap', '^?' + 'uiGmapMarker']; + this.template = ''; + $log.debug(this); + this.childWindows = []; + } + + Window.prototype.link = function(scope, element, attrs, ctrls) { + var markerCtrl, markerScope; + markerCtrl = ctrls.length > 1 && (ctrls[1] != null) ? ctrls[1] : void 0; + markerScope = markerCtrl != null ? markerCtrl.getScope() : void 0; + this.mapPromise = IWindow.mapPromise(scope, ctrls[0]); + return this.mapPromise.then((function(_this) { + return function(gMap) { + var isIconVisibleOnClick; + isIconVisibleOnClick = true; + if (angular.isDefined(attrs.isiconvisibleonclick)) { + isIconVisibleOnClick = scope.isIconVisibleOnClick; + } + if (!markerCtrl) { + _this.init(scope, element, isIconVisibleOnClick, gMap); + return; + } + return markerScope.deferred.promise.then(function(gMarker) { + return _this.init(scope, element, isIconVisibleOnClick, gMap, markerScope); + }); + }; + })(this)); + }; + + Window.prototype.init = function(scope, element, isIconVisibleOnClick, gMap, markerScope) { + var childWindow, defaults, gMarker, hasScopeCoords, opts; + defaults = scope.options != null ? scope.options : {}; + hasScopeCoords = (scope != null) && this.validateCoords(scope.coords); + if ((markerScope != null ? markerScope['getGMarker'] : void 0) != null) { + gMarker = markerScope.getGMarker(); + } + opts = hasScopeCoords ? this.createWindowOptions(gMarker, scope, element.html(), defaults) : defaults; + if (gMap != null) { + childWindow = new WindowChildModel({ + scope: scope, + opts: opts, + isIconVisibleOnClick: isIconVisibleOnClick, + gMap: gMap, + markerScope: markerScope, + element: element + }); + this.childWindows.push(childWindow); + scope.$on('$destroy', (function(_this) { + return function() { + _this.childWindows = uiGmapLodash.withoutObjects(_this.childWindows, [childWindow], function(child1, child2) { + return child1.scope.$id === child2.scope.$id; + }); + return _this.childWindows.length = 0; + }; + })(this)); + } + if (scope.control != null) { + scope.control.getGWindows = (function(_this) { + return function() { + return _this.childWindows.map(function(child) { + return child.gObject; + }); + }; + })(this); + scope.control.getChildWindows = (function(_this) { + return function() { + return _this.childWindows; + }; + })(this); + scope.control.getPlurals = scope.control.getChildWindows; + scope.control.showWindow = (function(_this) { + return function() { + return _this.childWindows.map(function(child) { + return child.showWindow(); + }); + }; + })(this); + scope.control.hideWindow = (function(_this) { + return function() { + return _this.childWindows.map(function(child) { + return child.hideWindow(); + }); + }; + })(this); + } + if ((this.onChildCreation != null) && (childWindow != null)) { + return this.onChildCreation(childWindow); + } + }; + + return Window; + + })(IWindow); + } + ]); + +}).call(this); +; +/*global angular */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapWindows', [ + 'uiGmapIWindow', 'uiGmapPlural', 'uiGmapWindowsParentModel', 'uiGmapPromise', 'uiGmapLogger', function(IWindow, Plural, WindowsParentModel, uiGmapPromise, $log) { + + /* + Windows directive where many windows map to the models property + */ + var Windows; + return Windows = (function(superClass) { + extend(Windows, superClass); + + function Windows() { + this.link = bind(this.link, this); + Windows.__super__.constructor.call(this); + this.require = ['^' + 'uiGmapGoogleMap', '^?' + 'uiGmapMarkers']; + this.template = ''; + Plural.extend(this); + $log.debug(this); + } + + Windows.prototype.link = function(scope, element, attrs, ctrls) { + var mapScope, markerCtrl, markerScope; + mapScope = ctrls[0].getScope(); + markerCtrl = ctrls.length > 1 && (ctrls[1] != null) ? ctrls[1] : void 0; + markerScope = markerCtrl != null ? markerCtrl.getScope() : void 0; + return mapScope.deferred.promise.then((function(_this) { + return function(map) { + var promise, ref; + promise = (markerScope != null ? (ref = markerScope.deferred) != null ? ref.promise : void 0 : void 0) || uiGmapPromise.resolve(); + return promise.then(function() { + var pieces, ref1; + pieces = (ref1 = _this.parentModel) != null ? ref1.existingPieces : void 0; + if (pieces) { + return pieces.then(function() { + return _this.init(scope, element, attrs, ctrls, map, markerScope); + }); + } else { + return _this.init(scope, element, attrs, ctrls, map, markerScope); + } + }); + }; + })(this)); + }; + + Windows.prototype.init = function(scope, element, attrs, ctrls, map, additionalScope) { + var parentModel; + parentModel = new WindowsParentModel(scope, element, attrs, ctrls, map, additionalScope); + Plural.link(scope, parentModel); + if (scope.control != null) { + scope.control.getGWindows = function() { + return parentModel.plurals.map(function(child) { + return child.gObject; + }); + }; + return scope.control.getChildWindows = function() { + return parentModel.plurals; + }; + } + }; + + return Windows; + + })(IWindow); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Nick Baugh - https://github.com/niftylettuce + */ + + +/*globals angular */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapGoogleMap", ['uiGmapMap', function(uiGmapMap) { + return new uiGmapMap(); + }]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map marker directive + +This directive is used to create a marker on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute icon optional} string url to image used for marker icon +{attribute animate optional} if set to false, the marker won't be animated (on by default) + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapMarker', [ + '$timeout', 'uiGmapMarker', function($timeout, Marker) { + return new Marker($timeout); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map marker directive + +This directive is used to create a marker on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute icon optional} string url to image used for marker icon +{attribute animate optional} if set to false, the marker won't be animated (on by default) + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapMarkers', [ + '$timeout', 'uiGmapMarkers', function($timeout, Markers) { + return new Markers($timeout); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Rick Huizinga - https://plus.google.com/+RickHuizinga + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapPolygon', [ + 'uiGmapPolygon', function(Polygon) { + return new Polygon(); + } + ]); + +}).call(this); +; +/* +@authors +Julian Popescu - https://github.com/jpopesculian +Rick Huizinga - https://plus.google.com/+RickHuizinga + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive("uiGmapCircle", [ + "uiGmapCircle", function(Circle) { + return Circle; + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapPolyline", [ + "uiGmapPolyline", function(Polyline) { + return new Polyline(); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapPolylines', [ + 'uiGmapPolylines', function(Polylines) { + return new Polylines(); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Chentsu Lin - https://github.com/ChenTsuLin + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapRectangle", [ + "uiGmapLogger", "uiGmapRectangle", function($log, Rectangle) { + return Rectangle; + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map info window directive + +This directive is used to create an info window on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute show optional} map will show when this expression returns true + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapWindow", [ + "$timeout", "$compile", "$http", "$templateCache", "uiGmapWindow", function($timeout, $compile, $http, $templateCache, Window) { + return new Window($timeout, $compile, $http, $templateCache); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map info window directive + +This directive is used to create an info window on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute show optional} map will show when this expression returns true + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapWindows", [ + "$timeout", "$compile", "$http", "$templateCache", "$interpolate", "uiGmapWindows", function($timeout, $compile, $http, $templateCache, $interpolate, Windows) { + return new Windows($timeout, $compile, $http, $templateCache, $interpolate); + } + ]); + +}).call(this); +; +/* +@authors: +- Nicolas Laplante https://plus.google.com/108189012221374960701 +- Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +Map Layer directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. + +{attribute show optional} true (default) shows the trafficlayer otherwise it is hidden + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps').directive('uiGmapLayer', [ + '$timeout', 'uiGmapLogger', 'uiGmapLayerParentModel', function($timeout, Logger, LayerParentModel) { + var Layer; + Layer = (function() { + function Layer() { + this.link = bind(this.link, this); + this.$log = Logger; + this.restrict = 'EMA'; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.template = ''; + this.replace = true; + this.scope = { + show: '=show', + type: '=type', + namespace: '=namespace', + options: '=options', + onCreated: '&oncreated' + }; + } + + Layer.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(map) { + if (scope.onCreated != null) { + return new LayerParentModel(scope, element, attrs, map, scope.onCreated); + } else { + return new LayerParentModel(scope, element, attrs, map); + } + }; + })(this)); + }; + + return Layer; + + })(); + return new Layer(); + } + ]); + +}).call(this); +; +/* +@authors +Adam Kreitals, kreitals@hotmail.com + */ + + +/* +mapControl directive + +This directive is used to create a custom control element on an existing map. +This directive creates a new scope. + +{attribute template required} string url of the template to be used for the control +{attribute position optional} string position of the control of the form top-left or TOP_LEFT defaults to TOP_CENTER +{attribute controller optional} string controller to be applied to the template +{attribute index optional} number index for controlling the order of similarly positioned mapControl elements + */ + +(function() { + angular.module("uiGmapgoogle-maps").directive("uiGmapMapControl", [ + "uiGmapControl", function(Control) { + return new Control(); + } + ]); + +}).call(this); +; +/* +@authors +Nicholas McCready - https://twitter.com/nmccready + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapDragZoom', [ + 'uiGmapDragZoom', function(DragZoom) { + return DragZoom; + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').directive("uiGmapDrawingManager", [ + "uiGmapDrawingManager", function(DrawingManager) { + return DrawingManager; + } + ]); + +}).call(this); +; +/* +@authors +Nicholas McCready - https://twitter.com/nmccready + * Brunt of the work is in DrawFreeHandChildModel + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapFreeDrawPolygons', [ + 'uiGmapApiFreeDrawPolygons', function(FreeDrawPolygons) { + return new FreeDrawPolygons(); + } + ]); + +}).call(this); +; +/* +Map Layer directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. + +{attribute show optional} true (default) shows the trafficlayer otherwise it is hidden + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module("uiGmapgoogle-maps").directive("uiGmapMapType", [ + "$timeout", "uiGmapLogger", "uiGmapMapTypeParentModel", function($timeout, Logger, MapTypeParentModel) { + var MapType; + MapType = (function() { + function MapType() { + this.link = bind(this.link, this); + this.$log = Logger; + this.restrict = "EMA"; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.template = ''; + this.replace = true; + this.scope = { + show: "=show", + options: '=options', + refresh: '=refresh', + id: '@' + }; + } + + MapType.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(map) { + return new MapTypeParentModel(scope, element, attrs, map); + }; + })(this)); + }; + + return MapType; + + })(); + return new MapType(); + } + ]); + +}).call(this); +; +/* +Map Layers directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps').directive("uiGmapMapTypes", [ + "$timeout", "uiGmapLogger", "uiGmapMapTypesParentModel", function($timeout, Logger, MapTypesParentModel) { + var MapTypes; + MapTypes = (function() { + function MapTypes() { + this.link = bind(this.link, this); + this.$log = Logger; + this.restrict = "EMA"; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.template = ''; + this.scope = { + mapTypes: "=mapTypes", + show: "=show", + options: "=options", + refresh: "=refresh", + id: "=idKey" + }; + } + + MapTypes.prototype.link = function(scope, element, attrs, mapCtrl) { + return mapCtrl.getScope().deferred.promise.then((function(_this) { + return function(map) { + return new MapTypesParentModel(scope, element, attrs, map); + }; + })(this)); + }; + + return MapTypes; + + })(); + return new MapTypes(); + } + ]); + +}).call(this); +; +/* +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Rick Huizinga - https://plus.google.com/+RickHuizinga + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapPolygons', [ + 'uiGmapPolygons', function(Polygons) { + return new Polygons(); + } + ]); + +}).call(this); +; +/* +@authors: +- Nicolas Laplante https://plus.google.com/108189012221374960701 +- Nicholas McCready - https://twitter.com/nmccready +- Carrie Kengle - http://about.me/carrie + */ + + +/* +Places Search Box directive + +This directive is used to create a Places Search Box. +This directive creates a new scope. + +{attribute input required} HTMLInputElement +{attribute options optional} The options that can be set on a SearchBox object (google.maps.places.SearchBoxOptions object specification) + */ + +(function() { + var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + angular.module('uiGmapgoogle-maps').directive('uiGmapSearchBox', [ + 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapSearchBoxParentModel', '$http', '$templateCache', '$compile', function(GoogleMapApi, Logger, SearchBoxParentModel, $http, $templateCache, $compile) { + var SearchBox; + SearchBox = (function() { + SearchBox.prototype.require = 'ngModel'; + + function SearchBox() { + this.link = bind(this.link, this); + this.$log = Logger; + this.restrict = 'EMA'; + this.require = '^' + 'uiGmapGoogleMap'; + this.priority = -1; + this.transclude = true; + this.template = ''; + this.replace = true; + this.scope = { + template: '=template', + events: '=events', + position: '=?position', + options: '=?options', + parentdiv: '=?parentdiv', + ngModel: "=?" + }; + } + + SearchBox.prototype.link = function(scope, element, attrs, mapCtrl) { + return GoogleMapApi.then((function(_this) { + return function(maps) { + if (scope.template == null) { + $templateCache.put('uigmap-searchbox-default.tpl.html', ''); + scope.template = 'uigmap-searchbox-default.tpl.html'; + } + return $http.get(scope.template, { + cache: $templateCache + }).then(function(arg) { + var data; + data = arg.data; + if (angular.isUndefined(scope.events)) { + _this.$log.error('searchBox: the events property is required'); + return; + } + return mapCtrl.getScope().deferred.promise.then(function(map) { + var ctrlPosition; + ctrlPosition = angular.isDefined(scope.position) ? scope.position.toUpperCase().replace(/-/g, '_') : 'TOP_LEFT'; + if (!maps.ControlPosition[ctrlPosition]) { + _this.$log.error('searchBox: invalid position property'); + return; + } + return new SearchBoxParentModel(scope, element, attrs, map, ctrlPosition, $compile(data)(scope)); + }); + }); + }; + })(this)); + }; + + return SearchBox; + + })(); + return new SearchBox(); + } + ]); + +}).call(this); +;(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapShow', [ + '$animate', 'uiGmapLogger', function($animate, $log) { + return { + scope: { + 'uiGmapShow': '=', + 'uiGmapAfterShow': '&', + 'uiGmapAfterHide': '&' + }, + link: function(scope, element) { + var angular_post_1_3_handle, angular_pre_1_3_handle, handle; + angular_post_1_3_handle = function(animateAction, cb) { + return $animate[animateAction](element, 'ng-hide').then(function() { + return cb(); + }); + }; + angular_pre_1_3_handle = function(animateAction, cb) { + return $animate[animateAction](element, 'ng-hide', cb); + }; + handle = function(animateAction, cb) { + if (angular.version.major > 1) { + return $log.error("uiGmapShow is not supported for Angular Major greater than 1.\nYour Major is " + angular.version.major + "\""); + } + if (angular.version.major === 1 && angular.version.minor < 3) { + return angular_pre_1_3_handle(animateAction, cb); + } + return angular_post_1_3_handle(animateAction, cb); + }; + return scope.$watch('uiGmapShow', function(show) { + if (show) { + handle('removeClass', scope.uiGmapAfterShow); + } + if (!show) { + return handle('addClass', scope.uiGmapAfterHide); + } + }); + } + }; + } + ]); + +}).call(this); +; +/* +@authors: +- Nicholas McCready - https://twitter.com/nmccready + */ + + +/* +StreetViewPanorama Directive to care of basic initialization of StreetViewPanorama + */ + +(function() { + angular.module('uiGmapgoogle-maps').directive('uiGmapStreetViewPanorama', [ + 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function(GoogleMapApi, $log, GmapUtil, EventsHelper) { + var name; + name = 'uiGmapStreetViewPanorama'; + return { + restrict: 'EMA', + template: '
', + replace: true, + scope: { + focalcoord: '=', + radius: '=?', + events: '=?', + options: '=?', + control: '=?', + povoptions: '=?', + imagestatus: '=' + }, + link: function(scope, element, attrs) { + return GoogleMapApi.then((function(_this) { + return function(maps) { + var clean, create, didCreateOptionsFromDirective, firstTime, handleSettings, listeners, opts, pano, povOpts, sv; + pano = void 0; + sv = void 0; + didCreateOptionsFromDirective = false; + listeners = void 0; + opts = null; + povOpts = null; + clean = function() { + EventsHelper.removeEvents(listeners); + if (pano != null) { + pano.unbind('position'); + pano.setVisible(false); + } + if (sv != null) { + if ((sv != null ? sv.setVisible : void 0) != null) { + sv.setVisible(false); + } + return sv = void 0; + } + }; + handleSettings = function(perspectivePoint, focalPoint) { + var heading; + heading = google.maps.geometry.spherical.computeHeading(perspectivePoint, focalPoint); + didCreateOptionsFromDirective = true; + scope.radius = scope.radius || 50; + povOpts = angular.extend({ + heading: heading, + zoom: 1, + pitch: 0 + }, scope.povoptions || {}); + opts = opts = angular.extend({ + navigationControl: false, + addressControl: false, + linksControl: false, + position: perspectivePoint, + pov: povOpts, + visible: true + }, scope.options || {}); + return didCreateOptionsFromDirective = false; + }; + create = function() { + var focalPoint; + if (!scope.focalcoord) { + $log.error(name + ": focalCoord needs to be defined"); + return; + } + if (!scope.radius) { + $log.error(name + ": needs a radius to set the camera view from its focal target."); + return; + } + clean(); + if (sv == null) { + sv = new google.maps.StreetViewService(); + } + if (scope.events) { + listeners = EventsHelper.setEvents(sv, scope, scope); + } + focalPoint = GmapUtil.getCoords(scope.focalcoord); + return sv.getPanoramaByLocation(focalPoint, scope.radius, function(streetViewPanoramaData, status) { + var ele, perspectivePoint, ref; + if (scope.imagestatus != null) { + scope.imagestatus = status; + } + if (((ref = scope.events) != null ? ref.image_status_changed : void 0) != null) { + scope.events.image_status_changed(sv, 'image_status_changed', scope, status); + } + if (status === "OK") { + perspectivePoint = streetViewPanoramaData.location.latLng; + handleSettings(perspectivePoint, focalPoint); + ele = element[0]; + return pano = new google.maps.StreetViewPanorama(ele, opts); + } + }); + }; + if (scope.control != null) { + scope.control.getOptions = function() { + return opts; + }; + scope.control.getPovOptions = function() { + return povOpts; + }; + scope.control.getGObject = function() { + return sv; + }; + scope.control.getGPano = function() { + return pano; + }; + } + scope.$watch('options', function(newValue, oldValue) { + if (newValue === oldValue || newValue === opts || didCreateOptionsFromDirective) { + return; + } + return create(); + }); + firstTime = true; + scope.$watch('focalcoord', function(newValue, oldValue) { + if (newValue === oldValue && !firstTime) { + return; + } + if (newValue == null) { + return; + } + firstTime = false; + return create(); + }); + return scope.$on('$destroy', function() { + return clean(); + }); + }; + })(this)); + } + }; + } + ]); + +}).call(this); +;angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapuuid', function() { + //BEGIN REPLACE + /* istanbul ignore next */ + /* + Version: core-1.0 + The MIT License: Copyright (c) 2012 LiosK. +*/ +function UUID(){}UUID.generate=function(){var a=UUID._gri,b=UUID._ha;return b(a(32),8)+"-"+b(a(16),4)+"-"+b(16384|a(12),4)+"-"+b(32768|a(14),4)+"-"+b(a(48),12)};UUID._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)d&1&&(c=e+c);return c}; + + //END REPLACE +return UUID; +}); +;// wrap the utility libraries needed in ./lib +// http://google-maps-utility-library-v3.googlecode.com/svn/ +angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapGoogleMapsUtilV3', function () { + return { + init: _.once(function () { + //BEGIN REPLACE + /* istanbul ignore next */ + +function(){ + function ClusterIcon(cluster,styles){cluster.getMarkerClusterer().extend(ClusterIcon,google.maps.OverlayView),this.cluster_=cluster,this.className_=cluster.getMarkerClusterer().getClusterClass(),this.styles_=styles,this.center_=null,this.div_=null,this.sums_=null,this.visible_=!1,this.setMap(cluster.getMap())}function Cluster(mc){this.markerClusterer_=mc,this.map_=mc.getMap(),this.gridSize_=mc.getGridSize(),this.minClusterSize_=mc.getMinimumClusterSize(),this.averageCenter_=mc.getAverageCenter(),this.hideLabel_=mc.getHideLabel(),this.markers_=[],this.center_=null,this.bounds_=null,this.clusterIcon_=new ClusterIcon(this,mc.getStyles())}function MarkerClusterer(map,opt_markers,opt_options){this.extend(MarkerClusterer,google.maps.OverlayView),opt_markers=opt_markers||[],opt_options=opt_options||{},this.markers_=[],this.clusters_=[],this.listeners_=[],this.activeMap_=null,this.ready_=!1,this.gridSize_=opt_options.gridSize||60,this.minClusterSize_=opt_options.minimumClusterSize||2,this.maxZoom_=opt_options.maxZoom||null,this.styles_=opt_options.styles||[],this.title_=opt_options.title||"",this.zoomOnClick_=!0,void 0!==opt_options.zoomOnClick&&(this.zoomOnClick_=opt_options.zoomOnClick),this.averageCenter_=!1,void 0!==opt_options.averageCenter&&(this.averageCenter_=opt_options.averageCenter),this.ignoreHidden_=!1,void 0!==opt_options.ignoreHidden&&(this.ignoreHidden_=opt_options.ignoreHidden),this.enableRetinaIcons_=!1,void 0!==opt_options.enableRetinaIcons&&(this.enableRetinaIcons_=opt_options.enableRetinaIcons),this.hideLabel_=!1,void 0!==opt_options.hideLabel&&(this.hideLabel_=opt_options.hideLabel),this.imagePath_=opt_options.imagePath||MarkerClusterer.IMAGE_PATH,this.imageExtension_=opt_options.imageExtension||MarkerClusterer.IMAGE_EXTENSION,this.imageSizes_=opt_options.imageSizes||MarkerClusterer.IMAGE_SIZES,this.calculator_=opt_options.calculator||MarkerClusterer.CALCULATOR,this.batchSize_=opt_options.batchSize||MarkerClusterer.BATCH_SIZE,this.batchSizeIE_=opt_options.batchSizeIE||MarkerClusterer.BATCH_SIZE_IE,this.clusterClass_=opt_options.clusterClass||"cluster",-1!==navigator.userAgent.toLowerCase().indexOf("msie")&&(this.batchSize_=this.batchSizeIE_),this.setupStyles_(),this.addMarkers(opt_markers,!0),this.setMap(map)}ClusterIcon.prototype.onAdd=function(){var cMouseDownInCluster,cDraggingMapByCluster,cClusterIcon=this;this.div_=document.createElement("div"),this.div_.className=this.className_,this.visible_&&this.show(),this.getPanes().overlayMouseTarget.appendChild(this.div_),this.boundsChangedListener_=google.maps.event.addListener(this.getMap(),"bounds_changed",function(){cDraggingMapByCluster=cMouseDownInCluster}),google.maps.event.addDomListener(this.div_,"mousedown",function(){cMouseDownInCluster=!0,cDraggingMapByCluster=!1}),google.maps.event.addDomListener(this.div_,"click",function(e){if(cMouseDownInCluster=!1,!cDraggingMapByCluster){var theBounds,mz,mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,"click",cClusterIcon.cluster_),google.maps.event.trigger(mc,"clusterclick",cClusterIcon.cluster_),mc.getZoomOnClick()&&(mz=mc.getMaxZoom(),theBounds=cClusterIcon.cluster_.getBounds(),mc.getMap().fitBounds(theBounds),setTimeout(function(){mc.getMap().fitBounds(theBounds),null!==mz&&mc.getMap().getZoom()>mz&&mc.getMap().setZoom(mz+1)},100)),e.cancelBubble=!0,e.stopPropagation&&e.stopPropagation()}}),google.maps.event.addDomListener(this.div_,"mouseover",function(){var mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,"mouseover",cClusterIcon.cluster_)}),google.maps.event.addDomListener(this.div_,"mouseout",function(){var mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,"mouseout",cClusterIcon.cluster_)})},ClusterIcon.prototype.onRemove=function(){this.div_&&this.div_.parentNode&&(this.hide(),google.maps.event.removeListener(this.boundsChangedListener_),google.maps.event.clearInstanceListeners(this.div_),this.div_.parentNode.removeChild(this.div_),this.div_=null)},ClusterIcon.prototype.draw=function(){if(this.visible_){var pos=this.getPosFromLatLng_(this.center_);this.div_.style.top=pos.y+"px",this.div_.style.left=pos.x+"px"}},ClusterIcon.prototype.hide=function(){this.div_&&(this.div_.style.display="none"),this.visible_=!1},ClusterIcon.prototype.show=function(){if(this.div_){var img="",bp=this.backgroundPosition_.split(" "),spriteH=parseInt(bp[0].trim(),10),spriteV=parseInt(bp[1].trim(),10),pos=this.getPosFromLatLng_(this.center_);this.div_.style.cssText=this.createCss(pos),img="",this.div_.innerHTML=img+"
"+(this.cluster_.hideLabel_?" ":this.sums_.text)+"
",this.div_.title="undefined"==typeof this.sums_.title||""===this.sums_.title?this.cluster_.getMarkerClusterer().getTitle():this.sums_.title,this.div_.style.display=""}this.visible_=!0},ClusterIcon.prototype.useStyle=function(sums){this.sums_=sums;var index=Math.max(0,sums.index-1);index=Math.min(this.styles_.length-1,index);var style=this.styles_[index];this.url_=style.url,this.height_=style.height,this.width_=style.width,this.anchorText_=style.anchorText||[0,0],this.anchorIcon_=style.anchorIcon||[parseInt(this.height_/2,10),parseInt(this.width_/2,10)],this.textColor_=style.textColor||"black",this.textSize_=style.textSize||11,this.textDecoration_=style.textDecoration||"none",this.fontWeight_=style.fontWeight||"bold",this.fontStyle_=style.fontStyle||"normal",this.fontFamily_=style.fontFamily||"Arial,sans-serif",this.backgroundPosition_=style.backgroundPosition||"0 0"},ClusterIcon.prototype.setCenter=function(center){this.center_=center},ClusterIcon.prototype.createCss=function(pos){var style=[];return style.push("cursor: pointer;"),style.push("position: absolute; top: "+pos.y+"px; left: "+pos.x+"px;"),style.push("width: "+this.width_+"px; height: "+this.height_+"px;"),style.join("")},ClusterIcon.prototype.getPosFromLatLng_=function(latlng){var pos=this.getProjection().fromLatLngToDivPixel(latlng);return pos.x-=this.anchorIcon_[1],pos.y-=this.anchorIcon_[0],pos.x=parseInt(pos.x,10),pos.y=parseInt(pos.y,10),pos},Cluster.prototype.getSize=function(){return this.markers_.length},Cluster.prototype.getMarkers=function(){return this.markers_},Cluster.prototype.getCenter=function(){return this.center_},Cluster.prototype.getMap=function(){return this.map_},Cluster.prototype.getMarkerClusterer=function(){return this.markerClusterer_},Cluster.prototype.getBounds=function(){var i,bounds=new google.maps.LatLngBounds(this.center_,this.center_),markers=this.getMarkers();for(i=0;imz)marker.getMap()!==this.map_&&marker.setMap(this.map_);else if(mCounti;i++)this.markers_[i].setMap(null);else marker.setMap(null);return!0},Cluster.prototype.isMarkerInClusterBounds=function(marker){return this.bounds_.contains(marker.getPosition())},Cluster.prototype.calculateBounds_=function(){var bounds=new google.maps.LatLngBounds(this.center_,this.center_);this.bounds_=this.markerClusterer_.getExtendedBounds(bounds)},Cluster.prototype.updateIcon_=function(){var mCount=this.markers_.length,mz=this.markerClusterer_.getMaxZoom();if(null!==mz&&this.map_.getZoom()>mz)return void this.clusterIcon_.hide();if(mCounti;i++)if(marker===this.markers_[i])return!0;return!1},MarkerClusterer.prototype.onAdd=function(){var cMarkerClusterer=this;this.activeMap_=this.getMap(),this.ready_=!0,this.repaint(),this.listeners_=[google.maps.event.addListener(this.getMap(),"zoom_changed",function(){cMarkerClusterer.resetViewport_(!1),(this.getZoom()===(this.get("minZoom")||0)||this.getZoom()===this.get("maxZoom"))&&google.maps.event.trigger(this,"idle")}),google.maps.event.addListener(this.getMap(),"idle",function(){cMarkerClusterer.redraw_()})]},MarkerClusterer.prototype.onRemove=function(){var i;for(i=0;i0))for(i=0;id&&(distance=d,clusterToAddTo=cluster));clusterToAddTo&&clusterToAddTo.isMarkerInClusterBounds(marker)?clusterToAddTo.addMarker(marker):(cluster=new Cluster(this),cluster.addMarker(marker),this.clusters_.push(cluster))},MarkerClusterer.prototype.createClusters_=function(iFirst){var i,marker,mapBounds,cMarkerClusterer=this;if(this.ready_){0===iFirst&&(google.maps.event.trigger(this,"clusteringbegin",this),"undefined"!=typeof this.timerRefStatic&&(clearTimeout(this.timerRefStatic),delete this.timerRefStatic)),mapBounds=this.getMap().getZoom()>3?new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),this.getMap().getBounds().getNorthEast()):new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,-178.48388434375),new google.maps.LatLng(-85.08136444384544,178.00048865625));var bounds=this.getExtendedBounds(mapBounds),iLast=Math.min(iFirst+this.batchSize_,this.markers_.length);for(i=iFirst;iLast>i;i++)marker=this.markers_[i],!marker.isAdded&&this.isMarkerInBounds_(marker,bounds)&&(!this.ignoreHidden_||this.ignoreHidden_&&marker.getVisible())&&this.addToClosestCluster_(marker);if(iLastOverlayView class. + *

+ * An InfoBox behaves like a google.maps.InfoWindow, but it supports several + * additional properties for advanced styling. An InfoBox can also be used as a map label. + *

+ * An InfoBox also fires the same events as a google.maps.InfoWindow. + */ + +/*jslint browser:true */ +/*global google */ + +/** + * @name InfoBoxOptions + * @class This class represents the optional parameter passed to the {@link InfoBox} constructor. + * @property {string|Node} content The content of the InfoBox (plain text or an HTML DOM node). + * @property {boolean} [disableAutoPan=false] Disable auto-pan on open. + * @property {number} maxWidth The maximum width (in pixels) of the InfoBox. Set to 0 if no maximum. + * @property {Size} pixelOffset The offset (in pixels) from the top left corner of the InfoBox + * (or the bottom left corner if the alignBottom property is true) + * to the map pixel corresponding to position. + * @property {LatLng} position The geographic location at which to display the InfoBox. + * @property {number} zIndex The CSS z-index style value for the InfoBox. + * Note: This value overrides a zIndex setting specified in the boxStyle property. + * @property {string} [boxClass="infoBox"] The name of the CSS class defining the styles for the InfoBox container. + * @property {Object} [boxStyle] An object literal whose properties define specific CSS + * style values to be applied to the InfoBox. Style values defined here override those that may + * be defined in the boxClass style sheet. If this property is changed after the + * InfoBox has been created, all previously set styles (except those defined in the style sheet) + * are removed from the InfoBox before the new style values are applied. + * @property {string} closeBoxMargin The CSS margin style value for the close box. + * The default is "2px" (a 2-pixel margin on all sides). + * @property {string} closeBoxURL The URL of the image representing the close box. + * Note: The default is the URL for Google's standard close box. + * Set this property to "" if no close box is required. + * @property {Size} infoBoxClearance Minimum offset (in pixels) from the InfoBox to the + * map edge after an auto-pan. + * @property {boolean} [isHidden=false] Hide the InfoBox on open. + * [Deprecated in favor of the visible property.] + * @property {boolean} [visible=true] Show the InfoBox on open. + * @property {boolean} alignBottom Align the bottom left corner of the InfoBox to the position + * location (default is false which means that the top left corner of the InfoBox is aligned). + * @property {string} pane The pane where the InfoBox is to appear (default is "floatPane"). + * Set the pane to "mapPane" if the InfoBox is being used as a map label. + * Valid pane names are the property names for the google.maps.MapPanes object. + * @property {boolean} enableEventPropagation Propagate mousedown, mousemove, mouseover, mouseout, + * mouseup, click, dblclick, touchstart, touchend, touchmove, and contextmenu events in the InfoBox + * (default is false to mimic the behavior of a google.maps.InfoWindow). Set + * this property to true if the InfoBox is being used as a map label. + */ + +/** + * Creates an InfoBox with the options specified in {@link InfoBoxOptions}. + * Call InfoBox.open to add the box to the map. + * @constructor + * @param {InfoBoxOptions} [opt_opts] + */ +function InfoBox(opt_opts) { + + opt_opts = opt_opts || {}; + + google.maps.OverlayView.apply(this, arguments); + + // Standard options (in common with google.maps.InfoWindow): + // + this.content_ = opt_opts.content || ""; + this.disableAutoPan_ = opt_opts.disableAutoPan || false; + this.maxWidth_ = opt_opts.maxWidth || 0; + this.pixelOffset_ = opt_opts.pixelOffset || new google.maps.Size(0, 0); + this.position_ = opt_opts.position || new google.maps.LatLng(0, 0); + this.zIndex_ = opt_opts.zIndex || null; + + // Additional options (unique to InfoBox): + // + this.boxClass_ = opt_opts.boxClass || "infoBox"; + this.boxStyle_ = opt_opts.boxStyle || {}; + this.closeBoxMargin_ = opt_opts.closeBoxMargin || "2px"; + this.closeBoxURL_ = opt_opts.closeBoxURL || "http://www.google.com/intl/en_us/mapfiles/close.gif"; + if (opt_opts.closeBoxURL === "") { + this.closeBoxURL_ = ""; + } + this.infoBoxClearance_ = opt_opts.infoBoxClearance || new google.maps.Size(1, 1); + + if (typeof opt_opts.visible === "undefined") { + if (typeof opt_opts.isHidden === "undefined") { + opt_opts.visible = true; + } else { + opt_opts.visible = !opt_opts.isHidden; + } + } + this.isHidden_ = !opt_opts.visible; + + this.alignBottom_ = opt_opts.alignBottom || false; + this.pane_ = opt_opts.pane || "floatPane"; + this.enableEventPropagation_ = opt_opts.enableEventPropagation || false; + + this.div_ = null; + this.closeListener_ = null; + this.moveListener_ = null; + this.contextListener_ = null; + this.eventListeners_ = null; + this.fixedWidthSet_ = null; +} + +/* InfoBox extends OverlayView in the Google Maps API v3. + */ +InfoBox.prototype = new google.maps.OverlayView(); + +/** + * Creates the DIV representing the InfoBox. + * @private + */ +InfoBox.prototype.createInfoBoxDiv_ = function () { + + var i; + var events; + var bw; + var me = this; + + // This handler prevents an event in the InfoBox from being passed on to the map. + // + var cancelHandler = function (e) { + e.cancelBubble = true; + if (e.stopPropagation) { + e.stopPropagation(); + } + }; + + // This handler ignores the current event in the InfoBox and conditionally prevents + // the event from being passed on to the map. It is used for the contextmenu event. + // + var ignoreHandler = function (e) { + + e.returnValue = false; + + if (e.preventDefault) { + + e.preventDefault(); + } + + if (!me.enableEventPropagation_) { + + cancelHandler(e); + } + }; + + if (!this.div_) { + + this.div_ = document.createElement("div"); + + this.setBoxStyle_(); + + if (typeof this.content_.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + this.content_; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(this.content_); + } + + // Add the InfoBox DIV to the DOM + this.getPanes()[this.pane_].appendChild(this.div_); + + this.addClickHandler_(); + + if (this.div_.style.width) { + + this.fixedWidthSet_ = true; + + } else { + + if (this.maxWidth_ !== 0 && this.div_.offsetWidth > this.maxWidth_) { + + this.div_.style.width = this.maxWidth_; + this.div_.style.overflow = "auto"; + this.fixedWidthSet_ = true; + + } else { // The following code is needed to overcome problems with MSIE + + bw = this.getBoxWidths_(); + + this.div_.style.width = (this.div_.offsetWidth - bw.left - bw.right) + "px"; + this.fixedWidthSet_ = false; + } + } + + this.panBox_(this.disableAutoPan_); + + if (!this.enableEventPropagation_) { + + this.eventListeners_ = []; + + // Cancel event propagation. + // + // Note: mousemove not included (to resolve Issue 152) + events = ["mousedown", "mouseover", "mouseout", "mouseup", + "click", "dblclick", "touchstart", "touchend", "touchmove"]; + + for (i = 0; i < events.length; i++) { + + this.eventListeners_.push(google.maps.event.addDomListener(this.div_, events[i], cancelHandler)); + } + + // Workaround for Google bug that causes the cursor to change to a pointer + // when the mouse moves over a marker underneath InfoBox. + this.eventListeners_.push(google.maps.event.addDomListener(this.div_, "mouseover", function (e) { + this.style.cursor = "default"; + })); + } + + this.contextListener_ = google.maps.event.addDomListener(this.div_, "contextmenu", ignoreHandler); + + /** + * This event is fired when the DIV containing the InfoBox's content is attached to the DOM. + * @name InfoBox#domready + * @event + */ + google.maps.event.trigger(this, "domready"); + } +}; + +/** + * Returns the HTML tag for the close box. + * @private + */ +InfoBox.prototype.getCloseBoxImg_ = function () { + + var img = ""; + + if (this.closeBoxURL_ !== "") { + + img = " mapWidth) { + xOffset = pixPosition.x + iwWidth + iwOffsetX + padX - mapWidth; + } + if (this.alignBottom_) { + if (pixPosition.y < (-iwOffsetY + padY + iwHeight)) { + yOffset = pixPosition.y + iwOffsetY - padY - iwHeight; + } else if ((pixPosition.y + iwOffsetY + padY) > mapHeight) { + yOffset = pixPosition.y + iwOffsetY + padY - mapHeight; + } + } else { + if (pixPosition.y < (-iwOffsetY + padY)) { + yOffset = pixPosition.y + iwOffsetY - padY; + } else if ((pixPosition.y + iwHeight + iwOffsetY + padY) > mapHeight) { + yOffset = pixPosition.y + iwHeight + iwOffsetY + padY - mapHeight; + } + } + + if (!(xOffset === 0 && yOffset === 0)) { + + // Move the map to the shifted center. + // + var c = map.getCenter(); + map.panBy(xOffset, yOffset); + } + } + } +}; + +/** + * Sets the style of the InfoBox by setting the style sheet and applying + * other specific styles requested. + * @private + */ +InfoBox.prototype.setBoxStyle_ = function () { + + var i, boxStyle; + + if (this.div_) { + + // Apply style values from the style sheet defined in the boxClass parameter: + this.div_.className = this.boxClass_; + + // Clear existing inline style values: + this.div_.style.cssText = ""; + + // Apply style values defined in the boxStyle parameter: + boxStyle = this.boxStyle_; + for (i in boxStyle) { + + if (boxStyle.hasOwnProperty(i)) { + + this.div_.style[i] = boxStyle[i]; + } + } + + // Fix for iOS disappearing InfoBox problem. + // See http://stackoverflow.com/questions/9229535/google-maps-markers-disappear-at-certain-zoom-level-only-on-iphone-ipad + this.div_.style.WebkitTransform = "translateZ(0)"; + + // Fix up opacity style for benefit of MSIE: + // + if (typeof this.div_.style.opacity !== "undefined" && this.div_.style.opacity !== "") { + // See http://www.quirksmode.org/css/opacity.html + this.div_.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(Opacity=" + (this.div_.style.opacity * 100) + ")\""; + this.div_.style.filter = "alpha(opacity=" + (this.div_.style.opacity * 100) + ")"; + } + + // Apply required styles: + // + this.div_.style.position = "absolute"; + this.div_.style.visibility = 'hidden'; + if (this.zIndex_ !== null) { + + this.div_.style.zIndex = this.zIndex_; + } + } +}; + +/** + * Get the widths of the borders of the InfoBox. + * @private + * @return {Object} widths object (top, bottom left, right) + */ +InfoBox.prototype.getBoxWidths_ = function () { + + var computedStyle; + var bw = {top: 0, bottom: 0, left: 0, right: 0}; + var box = this.div_; + + if (document.defaultView && document.defaultView.getComputedStyle) { + + computedStyle = box.ownerDocument.defaultView.getComputedStyle(box, ""); + + if (computedStyle) { + + // The computed styles are always in pixel units (good!) + bw.top = parseInt(computedStyle.borderTopWidth, 10) || 0; + bw.bottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; + bw.left = parseInt(computedStyle.borderLeftWidth, 10) || 0; + bw.right = parseInt(computedStyle.borderRightWidth, 10) || 0; + } + + } else if (document.documentElement.currentStyle) { // MSIE + + if (box.currentStyle) { + + // The current styles may not be in pixel units, but assume they are (bad!) + bw.top = parseInt(box.currentStyle.borderTopWidth, 10) || 0; + bw.bottom = parseInt(box.currentStyle.borderBottomWidth, 10) || 0; + bw.left = parseInt(box.currentStyle.borderLeftWidth, 10) || 0; + bw.right = parseInt(box.currentStyle.borderRightWidth, 10) || 0; + } + } + + return bw; +}; + +/** + * Invoked when close is called. Do not call it directly. + */ +InfoBox.prototype.onRemove = function () { + + if (this.div_) { + + this.div_.parentNode.removeChild(this.div_); + this.div_ = null; + } +}; + +/** + * Draws the InfoBox based on the current map projection and zoom level. + */ +InfoBox.prototype.draw = function () { + + this.createInfoBoxDiv_(); + + var pixPosition = this.getProjection().fromLatLngToDivPixel(this.position_); + + this.div_.style.left = (pixPosition.x + this.pixelOffset_.width) + "px"; + + if (this.alignBottom_) { + this.div_.style.bottom = -(pixPosition.y + this.pixelOffset_.height) + "px"; + } else { + this.div_.style.top = (pixPosition.y + this.pixelOffset_.height) + "px"; + } + + if (this.isHidden_) { + + this.div_.style.visibility = "hidden"; + + } else { + + this.div_.style.visibility = "visible"; + } +}; + +/** + * Sets the options for the InfoBox. Note that changes to the maxWidth, + * closeBoxMargin, closeBoxURL, and enableEventPropagation + * properties have no affect until the current InfoBox is closed and a new one + * is opened. + * @param {InfoBoxOptions} opt_opts + */ +InfoBox.prototype.setOptions = function (opt_opts) { + if (typeof opt_opts.boxClass !== "undefined") { // Must be first + + this.boxClass_ = opt_opts.boxClass; + this.setBoxStyle_(); + } + if (typeof opt_opts.boxStyle !== "undefined") { // Must be second + + this.boxStyle_ = opt_opts.boxStyle; + this.setBoxStyle_(); + } + if (typeof opt_opts.content !== "undefined") { + + this.setContent(opt_opts.content); + } + if (typeof opt_opts.disableAutoPan !== "undefined") { + + this.disableAutoPan_ = opt_opts.disableAutoPan; + } + if (typeof opt_opts.maxWidth !== "undefined") { + + this.maxWidth_ = opt_opts.maxWidth; + } + if (typeof opt_opts.pixelOffset !== "undefined") { + + this.pixelOffset_ = opt_opts.pixelOffset; + } + if (typeof opt_opts.alignBottom !== "undefined") { + + this.alignBottom_ = opt_opts.alignBottom; + } + if (typeof opt_opts.position !== "undefined") { + + this.setPosition(opt_opts.position); + } + if (typeof opt_opts.zIndex !== "undefined") { + + this.setZIndex(opt_opts.zIndex); + } + if (typeof opt_opts.closeBoxMargin !== "undefined") { + + this.closeBoxMargin_ = opt_opts.closeBoxMargin; + } + if (typeof opt_opts.closeBoxURL !== "undefined") { + + this.closeBoxURL_ = opt_opts.closeBoxURL; + } + if (typeof opt_opts.infoBoxClearance !== "undefined") { + + this.infoBoxClearance_ = opt_opts.infoBoxClearance; + } + if (typeof opt_opts.isHidden !== "undefined") { + + this.isHidden_ = opt_opts.isHidden; + } + if (typeof opt_opts.visible !== "undefined") { + + this.isHidden_ = !opt_opts.visible; + } + if (typeof opt_opts.enableEventPropagation !== "undefined") { + + this.enableEventPropagation_ = opt_opts.enableEventPropagation; + } + + if (this.div_) { + + this.draw(); + } +}; + +/** + * Sets the content of the InfoBox. + * The content can be plain text or an HTML DOM node. + * @param {string|Node} content + */ +InfoBox.prototype.setContent = function (content) { + this.content_ = content; + + if (this.div_) { + + if (this.closeListener_) { + + google.maps.event.removeListener(this.closeListener_); + this.closeListener_ = null; + } + + // Odd code required to make things work with MSIE. + // + if (!this.fixedWidthSet_) { + + this.div_.style.width = ""; + } + + if (typeof content.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + content; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(content); + } + + // Perverse code required to make things work with MSIE. + // (Ensures the close box does, in fact, float to the right.) + // + if (!this.fixedWidthSet_) { + this.div_.style.width = this.div_.offsetWidth + "px"; + if (typeof content.nodeType === "undefined") { + this.div_.innerHTML = this.getCloseBoxImg_() + content; + } else { + this.div_.innerHTML = this.getCloseBoxImg_(); + this.div_.appendChild(content); + } + } + + this.addClickHandler_(); + } + + /** + * This event is fired when the content of the InfoBox changes. + * @name InfoBox#content_changed + * @event + */ + google.maps.event.trigger(this, "content_changed"); +}; + +/** + * Sets the geographic location of the InfoBox. + * @param {LatLng} latlng + */ +InfoBox.prototype.setPosition = function (latlng) { + + this.position_ = latlng; + + if (this.div_) { + + this.draw(); + } + + /** + * This event is fired when the position of the InfoBox changes. + * @name InfoBox#position_changed + * @event + */ + google.maps.event.trigger(this, "position_changed"); +}; + +/** + * Sets the zIndex style for the InfoBox. + * @param {number} index + */ +InfoBox.prototype.setZIndex = function (index) { + + this.zIndex_ = index; + + if (this.div_) { + + this.div_.style.zIndex = index; + } + + /** + * This event is fired when the zIndex of the InfoBox changes. + * @name InfoBox#zindex_changed + * @event + */ + google.maps.event.trigger(this, "zindex_changed"); +}; + +/** + * Sets the visibility of the InfoBox. + * @param {boolean} isVisible + */ +InfoBox.prototype.setVisible = function (isVisible) { + + this.isHidden_ = !isVisible; + if (this.div_) { + this.div_.style.visibility = (this.isHidden_ ? "hidden" : "visible"); + } +}; + +/** + * Returns the content of the InfoBox. + * @returns {string} + */ +InfoBox.prototype.getContent = function () { + + return this.content_; +}; + +/** + * Returns the geographic location of the InfoBox. + * @returns {LatLng} + */ +InfoBox.prototype.getPosition = function () { + + return this.position_; +}; + +/** + * Returns the zIndex for the InfoBox. + * @returns {number} + */ +InfoBox.prototype.getZIndex = function () { + + return this.zIndex_; +}; + +/** + * Returns a flag indicating whether the InfoBox is visible. + * @returns {boolean} + */ +InfoBox.prototype.getVisible = function () { + + var isVisible; + + if ((typeof this.getMap() === "undefined") || (this.getMap() === null)) { + isVisible = false; + } else { + isVisible = !this.isHidden_; + } + return isVisible; +}; + +/** + * Shows the InfoBox. [Deprecated; use setVisible instead.] + */ +InfoBox.prototype.show = function () { + + this.isHidden_ = false; + if (this.div_) { + this.div_.style.visibility = "visible"; + } +}; + +/** + * Hides the InfoBox. [Deprecated; use setVisible instead.] + */ +InfoBox.prototype.hide = function () { + + this.isHidden_ = true; + if (this.div_) { + this.div_.style.visibility = "hidden"; + } +}; + +/** + * Adds the InfoBox to the specified map or Street View panorama. If anchor + * (usually a google.maps.Marker) is specified, the position + * of the InfoBox is set to the position of the anchor. If the + * anchor is dragged to a new location, the InfoBox moves as well. + * @param {Map|StreetViewPanorama} map + * @param {MVCObject} [anchor] + */ +InfoBox.prototype.open = function (map, anchor) { + + var me = this; + + if (anchor) { + + this.position_ = anchor.getPosition(); + this.moveListener_ = google.maps.event.addListener(anchor, "position_changed", function () { + me.setPosition(this.getPosition()); + }); + } + + this.setMap(map); + + if (this.div_) { + + this.panBox_(); + } +}; + +/** + * Removes the InfoBox from the map. + */ +InfoBox.prototype.close = function () { + + var i; + + if (this.closeListener_) { + + google.maps.event.removeListener(this.closeListener_); + this.closeListener_ = null; + } + + if (this.eventListeners_) { + + for (i = 0; i < this.eventListeners_.length; i++) { + + google.maps.event.removeListener(this.eventListeners_[i]); + } + this.eventListeners_ = null; + } + + if (this.moveListener_) { + + google.maps.event.removeListener(this.moveListener_); + this.moveListener_ = null; + } + + if (this.contextListener_) { + + google.maps.event.removeListener(this.contextListener_); + this.contextListener_ = null; + } + + this.setMap(null); +}; + +/** + * google-maps-utility-library-v3-keydragzoom + * + * @version: 2.0.9 + * @author: Nianwei Liu [nianwei at gmail dot com] & Gary Little [gary at luxcentral dot com] + * @contributors: undefined + * @date: Fri May 13 2016 13:45:18 GMT-0400 (EDT) + * @license: Apache License 2.0 + */ +/** + * @fileoverview This library adds a drag zoom capability to a V3 Google map. + * When drag zoom is enabled, holding down a designated hot key (shift | ctrl | alt) + * while dragging a box around an area of interest will zoom the map in to that area when + * the mouse button is released. Optionally, a visual control can also be supplied for turning + * a drag zoom operation on and off. + * Only one line of code is needed: google.maps.Map.enableKeyDragZoom(); + *

+ * NOTE: Do not use Ctrl as the hot key with Google Maps JavaScript API V3 since, unlike with V2, + * it causes a context menu to appear when running on the Macintosh. + *

+ * Note that if the map's container has a border around it, the border widths must be specified + * in pixel units (or as thin, medium, or thick). This is required because of an MSIE limitation. + *

NL: 2009-05-28: initial port to core API V3. + *
NL: 2009-11-02: added a temp fix for -moz-transform for FF3.5.x using code from Paul Kulchenko (http://notebook.kulchenko.com/maps/gridmove). + *
NL: 2010-02-02: added a fix for IE flickering on divs onmousemove, caused by scroll value when get mouse position. + *
GL: 2010-06-15: added a visual control option. + */ +(function () { + /*jslint browser:true */ + /*global window,google */ + /* Utility functions use "var funName=function()" syntax to allow use of the */ + /* Dean Edwards Packer compression tool (with Shrink variables, without Base62 encode). */ + + /** + * Converts "thin", "medium", and "thick" to pixel widths + * in an MSIE environment. Not called for other browsers + * because getComputedStyle() returns pixel widths automatically. + * @param {string} widthValue The value of the border width parameter. + */ + var toPixels = function (widthValue) { + var px; + switch (widthValue) { + case "thin": + px = "2px"; + break; + case "medium": + px = "4px"; + break; + case "thick": + px = "6px"; + break; + default: + px = widthValue; + } + return px; + }; + /** + * Get the widths of the borders of an HTML element. + * + * @param {Node} h The HTML element. + * @return {Object} The width object {top, bottom left, right}. + */ + var getBorderWidths = function (h) { + var computedStyle; + var bw = {}; + if (document.defaultView && document.defaultView.getComputedStyle) { + computedStyle = h.ownerDocument.defaultView.getComputedStyle(h, ""); + if (computedStyle) { + // The computed styles are always in pixel units (good!) + bw.top = parseInt(computedStyle.borderTopWidth, 10) || 0; + bw.bottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; + bw.left = parseInt(computedStyle.borderLeftWidth, 10) || 0; + bw.right = parseInt(computedStyle.borderRightWidth, 10) || 0; + return bw; + } + } else if (document.documentElement.currentStyle) { // MSIE + if (h.currentStyle) { + // The current styles may not be in pixel units so try to convert (bad!) + bw.top = parseInt(toPixels(h.currentStyle.borderTopWidth), 10) || 0; + bw.bottom = parseInt(toPixels(h.currentStyle.borderBottomWidth), 10) || 0; + bw.left = parseInt(toPixels(h.currentStyle.borderLeftWidth), 10) || 0; + bw.right = parseInt(toPixels(h.currentStyle.borderRightWidth), 10) || 0; + return bw; + } + } + // Shouldn't get this far for any modern browser + bw.top = parseInt(h.style["border-top-width"], 10) || 0; + bw.bottom = parseInt(h.style["border-bottom-width"], 10) || 0; + bw.left = parseInt(h.style["border-left-width"], 10) || 0; + bw.right = parseInt(h.style["border-right-width"], 10) || 0; + return bw; + }; + + // Page scroll values for use by getMousePosition. To prevent flickering on MSIE + // they are calculated only when the document actually scrolls, not every time the + // mouse moves (as they would be if they were calculated inside getMousePosition). + var scroll = { + x: 0, + y: 0 + }; + var getScrollValue = function (e) { + scroll.x = (typeof document.documentElement.scrollLeft !== "undefined" ? document.documentElement.scrollLeft : document.body.scrollLeft); + scroll.y = (typeof document.documentElement.scrollTop !== "undefined" ? document.documentElement.scrollTop : document.body.scrollTop); + }; + getScrollValue(); + + /** + * Get the position of the mouse relative to the document. + * @param {Event} e The mouse event. + * @return {Object} The position object {left, top}. + */ + var getMousePosition = function (e) { + var posX = 0, posY = 0; + e = e || window.event; + if (typeof e.pageX !== "undefined") { + posX = e.pageX; + posY = e.pageY; + } else if (typeof e.clientX !== "undefined") { // MSIE + posX = e.clientX + scroll.x; + posY = e.clientY + scroll.y; + } + return { + left: posX, + top: posY + }; + }; + /** + * Get the position of an HTML element relative to the document. + * @param {Node} h The HTML element. + * @return {Object} The position object {left, top}. + */ + var getElementPosition = function (h) { + var posX = h.offsetLeft; + var posY = h.offsetTop; + var parent = h.offsetParent; + // Add offsets for all ancestors in the hierarchy + while (parent !== null) { + // Adjust for scrolling elements which may affect the map position. + // + // See http://www.howtocreate.co.uk/tutorials/javascript/browserspecific + // + // "...make sure that every element [on a Web page] with an overflow + // of anything other than visible also has a position style set to + // something other than the default static..." + if (parent !== document.body && parent !== document.documentElement) { + posX -= parent.scrollLeft; + posY -= parent.scrollTop; + } + // See http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/4cb86c0c1037a5e5 + // Example: http://notebook.kulchenko.com/maps/gridmove + var m = parent; + // This is the "normal" way to get offset information: + var moffx = m.offsetLeft; + var moffy = m.offsetTop; + // This covers those cases where a transform is used: + if (!moffx && !moffy && window.getComputedStyle) { + var matrix = document.defaultView.getComputedStyle(m, null).MozTransform || + document.defaultView.getComputedStyle(m, null).WebkitTransform; + if (matrix) { + if (typeof matrix === "string") { + var parms = matrix.split(","); + moffx += parseInt(parms[4], 10) || 0; + moffy += parseInt(parms[5], 10) || 0; + } + } + } + posX += moffx; + posY += moffy; + parent = parent.offsetParent; + } + return { + left: posX, + top: posY + }; + }; + /** + * Set the properties of an object to those from another object. + * @param {Object} obj The target object. + * @param {Object} vals The source object. + */ + var setVals = function (obj, vals) { + if (obj && vals) { + for (var x in vals) { + if (vals.hasOwnProperty(x)) { + obj[x] = vals[x]; + } + } + } + return obj; + }; + /** + * Set the opacity. If op is not passed in, this function just performs an MSIE fix. + * @param {Node} h The HTML element. + * @param {number} op The opacity value (0-1). + */ + var setOpacity = function (h, op) { + if (typeof op !== "undefined") { + h.style.opacity = op; + } + if (typeof h.style.opacity !== "undefined" && h.style.opacity !== "") { + h.style.filter = "alpha(opacity=" + (h.style.opacity * 100) + ")"; + } + }; + /** + * @name KeyDragZoomOptions + * @class This class represents the optional parameter passed into google.maps.Map.enableKeyDragZoom. + * @property {string} [key="shift"] The hot key to hold down to activate a drag zoom, shift | ctrl | alt. + * NOTE: Do not use Ctrl as the hot key with Google Maps JavaScript API V3 since, unlike with V2, + * it causes a context menu to appear when running on the Macintosh. Also note that the + * alt hot key refers to the Option key on a Macintosh. + * @property {Object} [boxStyle={border: "4px solid #736AFF"}] + * An object literal defining the CSS styles of the zoom box. + * Border widths must be specified in pixel units (or as thin, medium, or thick). + * @property {Object} [veilStyle={backgroundColor: "gray", opacity: 0.25, cursor: "crosshair"}] + * An object literal defining the CSS styles of the veil pane which covers the map when a drag + * zoom is activated. The previous name for this property was paneStyle but the use + * of this name is now deprecated. + * @property {boolean} [noZoom=false] A flag indicating whether to disable zooming after an area is + * selected. Set this to true to allow KeyDragZoom to be used as a simple area + * selection tool. + * @property {boolean} [visualEnabled=false] A flag indicating whether a visual control is to be used. + * @property {string} [visualClass=""] The name of the CSS class defining the styles for the visual + * control. To prevent the visual control from being printed, set this property to the name of + * a class, defined inside a @media print rule, which sets the CSS + * display style to none. + * @property {ControlPosition} [visualPosition=google.maps.ControlPosition.LEFT_TOP] + * The position of the visual control. + * @property {Size} [visualPositionOffset=google.maps.Size(35, 0)] The width and height values + * provided by this property are the offsets (in pixels) from the location at which the control + * would normally be drawn to the desired drawing location. + * @property {number} [visualPositionIndex=null] The index of the visual control. + * The index is for controlling the placement of the control relative to other controls at the + * position given by visualPosition; controls with a lower index are placed first. + * Use a negative value to place the control before any default controls. No index is + * generally required. + * @property {String} [visualSprite="http://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png"] + * The URL of the sprite image used for showing the visual control in the on, off, and hot + * (i.e., when the mouse is over the control) states. The three images within the sprite must + * be the same size and arranged in on-hot-off order in a single row with no spaces between images. + * @property {Size} [visualSize=google.maps.Size(20, 20)] The width and height values provided by + * this property are the size (in pixels) of each of the images within visualSprite. + * @property {Object} [visualTips={off: "Turn on drag zoom mode", on: "Turn off drag zoom mode"}] + * An object literal defining the help tips that appear when + * the mouse moves over the visual control. The off property is the tip to be shown + * when the control is off and the on property is the tip to be shown when the + * control is on. + */ + /** + * @name DragZoom + * @class This class represents a drag zoom object for a map. The object is activated by holding down the hot key + * or by turning on the visual control. + * This object is created when google.maps.Map.enableKeyDragZoom is called; it cannot be created directly. + * Use google.maps.Map.getDragZoomObject to gain access to this object in order to attach event listeners. + * @param {Map} map The map to which the DragZoom object is to be attached. + * @param {KeyDragZoomOptions} [opt_zoomOpts] The optional parameters. + */ + function DragZoom(map, opt_zoomOpts) { + var me = this; + var ov = new google.maps.OverlayView(); + ov.onAdd = function () { + me.init_(map, opt_zoomOpts); + }; + ov.draw = function () { + }; + ov.onRemove = function () { + }; + ov.setMap(map); + this.prjov_ = ov; + } + /** + * Initialize the tool. + * @param {Map} map The map to which the DragZoom object is to be attached. + * @param {KeyDragZoomOptions} [opt_zoomOpts] The optional parameters. + */ + DragZoom.prototype.init_ = function (map, opt_zoomOpts) { + var i; + var me = this; + this.map_ = map; + opt_zoomOpts = opt_zoomOpts || {}; + this.key_ = opt_zoomOpts.key || "shift"; + this.key_ = this.key_.toLowerCase(); + this.borderWidths_ = getBorderWidths(this.map_.getDiv()); + this.veilDiv_ = []; + for (i = 0; i < 4; i++) { + this.veilDiv_[i] = document.createElement("div"); + // Prevents selection of other elements on the webpage + // when a drag zoom operation is in progress: + this.veilDiv_[i].onselectstart = function () { + return false; + }; + // Apply default style values for the veil: + setVals(this.veilDiv_[i].style, { + backgroundColor: "gray", + opacity: 0.25, + cursor: "crosshair" + }); + // Apply style values specified in veilStyle parameter: + setVals(this.veilDiv_[i].style, opt_zoomOpts.paneStyle); // Old option name was "paneStyle" + setVals(this.veilDiv_[i].style, opt_zoomOpts.veilStyle); // New name is "veilStyle" + // Apply mandatory style values: + setVals(this.veilDiv_[i].style, { + position: "absolute", + overflow: "hidden", + display: "none" + }); + // Workaround for Firefox Shift-Click problem: + if (this.key_ === "shift") { + this.veilDiv_[i].style.MozUserSelect = "none"; + } + setOpacity(this.veilDiv_[i]); + // An IE fix: If the background is transparent it cannot capture mousedown + // events, so if it is, change the background to white with 0 opacity. + if (this.veilDiv_[i].style.backgroundColor === "transparent") { + this.veilDiv_[i].style.backgroundColor = "white"; + setOpacity(this.veilDiv_[i], 0); + } + this.map_.getDiv().appendChild(this.veilDiv_[i]); + } + + this.noZoom_ = opt_zoomOpts.noZoom || false; + this.visualEnabled_ = opt_zoomOpts.visualEnabled || false; + this.visualClass_ = opt_zoomOpts.visualClass || ""; + this.visualPosition_ = opt_zoomOpts.visualPosition || google.maps.ControlPosition.LEFT_TOP; + this.visualPositionOffset_ = opt_zoomOpts.visualPositionOffset || new google.maps.Size(35, 0); + this.visualPositionIndex_ = opt_zoomOpts.visualPositionIndex || null; + this.visualSprite_ = opt_zoomOpts.visualSprite || "http" + (document.location.protocol === "https:" ? "s" : "") + "://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png"; + this.visualSize_ = opt_zoomOpts.visualSize || new google.maps.Size(20, 20); + this.visualTips_ = opt_zoomOpts.visualTips || {}; + this.visualTips_.off = this.visualTips_.off || "Turn on drag zoom mode"; + this.visualTips_.on = this.visualTips_.on || "Turn off drag zoom mode"; + + this.boxDiv_ = document.createElement("div"); + // Apply default style values for the zoom box: + setVals(this.boxDiv_.style, { + border: "4px solid #736AFF" + }); + // Apply style values specified in boxStyle parameter: + setVals(this.boxDiv_.style, opt_zoomOpts.boxStyle); + // Apply mandatory style values: + setVals(this.boxDiv_.style, { + position: "absolute", + display: "none" + }); + setOpacity(this.boxDiv_); + this.map_.getDiv().appendChild(this.boxDiv_); + this.boxBorderWidths_ = getBorderWidths(this.boxDiv_); + + this.listeners_ = [ + google.maps.event.addDomListener(document, "keydown", function (e) { + me.onKeyDown_(e); + }), + google.maps.event.addDomListener(document, "keyup", function (e) { + me.onKeyUp_(e); + }), + google.maps.event.addDomListener(this.veilDiv_[0], "mousedown", function (e) { + me.onMouseDown_(e); + }), + google.maps.event.addDomListener(this.veilDiv_[1], "mousedown", function (e) { + me.onMouseDown_(e); + }), + google.maps.event.addDomListener(this.veilDiv_[2], "mousedown", function (e) { + me.onMouseDown_(e); + }), + google.maps.event.addDomListener(this.veilDiv_[3], "mousedown", function (e) { + me.onMouseDown_(e); + }), + google.maps.event.addDomListener(document, "mousedown", function (e) { + me.onMouseDownDocument_(e); + }), + google.maps.event.addDomListener(document, "mousemove", function (e) { + me.onMouseMove_(e); + }), + google.maps.event.addDomListener(document, "mouseup", function (e) { + me.onMouseUp_(e); + }), + google.maps.event.addDomListener(window, "scroll", getScrollValue) + ]; + + this.hotKeyDown_ = false; + this.mouseDown_ = false; + this.dragging_ = false; + this.startPt_ = null; + this.endPt_ = null; + this.mapWidth_ = null; + this.mapHeight_ = null; + this.mousePosn_ = null; + this.mapPosn_ = null; + + if (this.visualEnabled_) { + this.buttonDiv_ = this.initControl_(this.visualPositionOffset_); + if (this.visualPositionIndex_ !== null) { + this.buttonDiv_.index = this.visualPositionIndex_; + } + this.map_.controls[this.visualPosition_].push(this.buttonDiv_); + this.controlIndex_ = this.map_.controls[this.visualPosition_].length - 1; + } + }; + /** + * Initializes the visual control and returns its DOM element. + * @param {Size} offset The offset of the control from its normal position. + * @return {Node} The DOM element containing the visual control. + */ + DragZoom.prototype.initControl_ = function (offset) { + var control; + var image; + var me = this; + + control = document.createElement("div"); + control.className = this.visualClass_; + control.style.position = "relative"; + control.style.overflow = "hidden"; + control.style.height = this.visualSize_.height + "px"; + control.style.width = this.visualSize_.width + "px"; + control.title = this.visualTips_.off; + image = document.createElement("img"); + image.src = this.visualSprite_; + image.style.position = "absolute"; + image.style.left = -(this.visualSize_.width * 2) + "px"; + image.style.top = 0 + "px"; + control.appendChild(image); + control.onclick = function (e) { + me.hotKeyDown_ = !me.hotKeyDown_; + if (me.hotKeyDown_) { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 0) + "px"; + me.buttonDiv_.title = me.visualTips_.on; + me.activatedByControl_ = true; + google.maps.event.trigger(me, "activate"); + } else { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 2) + "px"; + me.buttonDiv_.title = me.visualTips_.off; + google.maps.event.trigger(me, "deactivate"); + } + me.onMouseMove_(e); // Updates the veil + }; + control.onmouseover = function () { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 1) + "px"; + }; + control.onmouseout = function () { + if (me.hotKeyDown_) { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 0) + "px"; + me.buttonDiv_.title = me.visualTips_.on; + } else { + me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 2) + "px"; + me.buttonDiv_.title = me.visualTips_.off; + } + }; + control.ondragstart = function () { + return false; + }; + setVals(control.style, { + cursor: "pointer", + marginTop: offset.height + "px", + marginLeft: offset.width + "px" + }); + return control; + }; + /** + * Returns true if the hot key is being pressed when an event occurs. + * @param {Event} e The keyboard event. + * @return {boolean} Flag indicating whether the hot key is down. + */ + DragZoom.prototype.isHotKeyDown_ = function (e) { + var isHot; + e = e || window.event; + isHot = (e.shiftKey && this.key_ === "shift") || (e.altKey && this.key_ === "alt") || (e.ctrlKey && this.key_ === "ctrl"); + if (!isHot) { + // Need to look at keyCode for Opera because it + // doesn't set the shiftKey, altKey, ctrlKey properties + // unless a non-modifier event is being reported. + // + // See http://cross-browser.com/x/examples/shift_mode.php + // Also see http://unixpapa.com/js/key.html + switch (e.keyCode) { + case 16: + if (this.key_ === "shift") { + isHot = true; + } + break; + case 17: + if (this.key_ === "ctrl") { + isHot = true; + } + break; + case 18: + if (this.key_ === "alt") { + isHot = true; + } + break; + } + } + return isHot; + }; + /** + * Returns true if the mouse is on top of the map div. + * The position is captured in onMouseMove_. + * @return {boolean} + */ + DragZoom.prototype.isMouseOnMap_ = function () { + var mousePosn = this.mousePosn_; + if (mousePosn) { + var mapPosn = this.mapPosn_; + var mapDiv = this.map_.getDiv(); + return mousePosn.left > mapPosn.left && mousePosn.left < (mapPosn.left + mapDiv.offsetWidth) && + mousePosn.top > mapPosn.top && mousePosn.top < (mapPosn.top + mapDiv.offsetHeight); + } else { + // if user never moved mouse + return false; + } + }; + /** + * Show the veil if the hot key is down and the mouse is over the map, + * otherwise hide the veil. + */ + DragZoom.prototype.setVeilVisibility_ = function () { + var i; + if (this.map_ && this.hotKeyDown_ && this.isMouseOnMap_()) { + var mapDiv = this.map_.getDiv(); + this.mapWidth_ = mapDiv.offsetWidth - (this.borderWidths_.left + this.borderWidths_.right); + this.mapHeight_ = mapDiv.offsetHeight - (this.borderWidths_.top + this.borderWidths_.bottom); + if (this.activatedByControl_) { // Veil covers entire map (except control) + var left = parseInt(this.buttonDiv_.style.left, 10) + this.visualPositionOffset_.width; + var top = parseInt(this.buttonDiv_.style.top, 10) + this.visualPositionOffset_.height; + var width = this.visualSize_.width; + var height = this.visualSize_.height; + // Left veil rectangle: + this.veilDiv_[0].style.top = "0px"; + this.veilDiv_[0].style.left = "0px"; + this.veilDiv_[0].style.width = left + "px"; + this.veilDiv_[0].style.height = this.mapHeight_ + "px"; + // Right veil rectangle: + this.veilDiv_[1].style.top = "0px"; + this.veilDiv_[1].style.left = (left + width) + "px"; + this.veilDiv_[1].style.width = (this.mapWidth_ - (left + width)) + "px"; + this.veilDiv_[1].style.height = this.mapHeight_ + "px"; + // Top veil rectangle: + this.veilDiv_[2].style.top = "0px"; + this.veilDiv_[2].style.left = left + "px"; + this.veilDiv_[2].style.width = width + "px"; + this.veilDiv_[2].style.height = top + "px"; + // Bottom veil rectangle: + this.veilDiv_[3].style.top = (top + height) + "px"; + this.veilDiv_[3].style.left = left + "px"; + this.veilDiv_[3].style.width = width + "px"; + this.veilDiv_[3].style.height = (this.mapHeight_ - (top + height)) + "px"; + for (i = 0; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.display = "block"; + } + } else { + this.veilDiv_[0].style.left = "0px"; + this.veilDiv_[0].style.top = "0px"; + this.veilDiv_[0].style.width = this.mapWidth_ + "px"; + this.veilDiv_[0].style.height = this.mapHeight_ + "px"; + for (i = 1; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.width = "0px"; + this.veilDiv_[i].style.height = "0px"; + } + for (i = 0; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.display = "block"; + } + } + } else { + for (i = 0; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.display = "none"; + } + } + }; + /** + * Handle key down. Show the veil if the hot key has been pressed. + * @param {Event} e The keyboard event. + */ + DragZoom.prototype.onKeyDown_ = function (e) { + if (this.map_ && !this.hotKeyDown_ && this.isHotKeyDown_(e)) { + this.mapPosn_ = getElementPosition(this.map_.getDiv()); + this.hotKeyDown_ = true; + this.activatedByControl_ = false; + this.setVeilVisibility_(); + /** + * This event is fired when the hot key is pressed. + * @name DragZoom#activate + * @event + */ + google.maps.event.trigger(this, "activate"); + } + }; + /** + * Get the google.maps.Point of the mouse position. + * @param {Event} e The mouse event. + * @return {Point} The mouse position. + */ + DragZoom.prototype.getMousePoint_ = function (e) { + var mousePosn = getMousePosition(e); + var p = new google.maps.Point(); + p.x = mousePosn.left - this.mapPosn_.left - this.borderWidths_.left; + p.y = mousePosn.top - this.mapPosn_.top - this.borderWidths_.top; + p.x = Math.min(p.x, this.mapWidth_); + p.y = Math.min(p.y, this.mapHeight_); + p.x = Math.max(p.x, 0); + p.y = Math.max(p.y, 0); + return p; + }; + /** + * Handle mouse down. + * @param {Event} e The mouse event. + */ + DragZoom.prototype.onMouseDown_ = function (e) { + if (this.map_ && this.hotKeyDown_) { + this.mapPosn_ = getElementPosition(this.map_.getDiv()); + this.dragging_ = true; + this.startPt_ = this.endPt_ = this.getMousePoint_(e); + this.boxDiv_.style.width = this.boxDiv_.style.height = "0px"; + var prj = this.prjov_.getProjection(); + var latlng = prj.fromContainerPixelToLatLng(this.startPt_); + /** + * This event is fired when the drag operation begins. + * The parameter passed is the geographic position of the starting point. + * @name DragZoom#dragstart + * @param {LatLng} latlng The geographic position of the starting point. + * @event + */ + google.maps.event.trigger(this, "dragstart", latlng); + } + }; + /** + * Handle mouse down at the document level. + * @param {Event} e The mouse event. + */ + DragZoom.prototype.onMouseDownDocument_ = function (e) { + this.mouseDown_ = true; + }; + /** + * Handle mouse move. + * @param {Event} e The mouse event. + */ + DragZoom.prototype.onMouseMove_ = function (e) { + this.mousePosn_ = getMousePosition(e); + if (this.dragging_) { + this.endPt_ = this.getMousePoint_(e); + var left = Math.min(this.startPt_.x, this.endPt_.x); + var top = Math.min(this.startPt_.y, this.endPt_.y); + var width = Math.abs(this.startPt_.x - this.endPt_.x); + var height = Math.abs(this.startPt_.y - this.endPt_.y); + // For benefit of MSIE 7/8 ensure following values are not negative: + var boxWidth = Math.max(0, width - (this.boxBorderWidths_.left + this.boxBorderWidths_.right)); + var boxHeight = Math.max(0, height - (this.boxBorderWidths_.top + this.boxBorderWidths_.bottom)); + // Left veil rectangle: + this.veilDiv_[0].style.top = "0px"; + this.veilDiv_[0].style.left = "0px"; + this.veilDiv_[0].style.width = left + "px"; + this.veilDiv_[0].style.height = this.mapHeight_ + "px"; + // Right veil rectangle: + this.veilDiv_[1].style.top = "0px"; + this.veilDiv_[1].style.left = (left + width) + "px"; + this.veilDiv_[1].style.width = (this.mapWidth_ - (left + width)) + "px"; + this.veilDiv_[1].style.height = this.mapHeight_ + "px"; + // Top veil rectangle: + this.veilDiv_[2].style.top = "0px"; + this.veilDiv_[2].style.left = left + "px"; + this.veilDiv_[2].style.width = width + "px"; + this.veilDiv_[2].style.height = top + "px"; + // Bottom veil rectangle: + this.veilDiv_[3].style.top = (top + height) + "px"; + this.veilDiv_[3].style.left = left + "px"; + this.veilDiv_[3].style.width = width + "px"; + this.veilDiv_[3].style.height = (this.mapHeight_ - (top + height)) + "px"; + // Selection rectangle: + this.boxDiv_.style.top = top + "px"; + this.boxDiv_.style.left = left + "px"; + this.boxDiv_.style.width = boxWidth + "px"; + this.boxDiv_.style.height = boxHeight + "px"; + this.boxDiv_.style.display = "block"; + /** + * This event is fired repeatedly while the user drags a box across the area of interest. + * The southwest and northeast point are passed as parameters of type google.maps.Point + * (for performance reasons), relative to the map container. Also passed is the projection object + * so that the event listener, if necessary, can convert the pixel positions to geographic + * coordinates using google.maps.MapCanvasProjection.fromContainerPixelToLatLng. + * @name DragZoom#drag + * @param {Point} southwestPixel The southwest point of the selection area. + * @param {Point} northeastPixel The northeast point of the selection area. + * @param {MapCanvasProjection} prj The projection object. + * @event + */ + google.maps.event.trigger(this, "drag", new google.maps.Point(left, top + height), new google.maps.Point(left + width, top), this.prjov_.getProjection()); + } else if (!this.mouseDown_) { + this.mapPosn_ = getElementPosition(this.map_.getDiv()); + this.setVeilVisibility_(); + } + }; + /** + * Handle mouse up. + * @param {Event} e The mouse event. + */ + DragZoom.prototype.onMouseUp_ = function (e) { + var z; + var me = this; + this.mouseDown_ = false; + if (this.dragging_) { + if ((this.getMousePoint_(e).x === this.startPt_.x) && (this.getMousePoint_(e).y === this.startPt_.y)) { + this.onKeyUp_(e); // Cancel event + return; + } + var left = Math.min(this.startPt_.x, this.endPt_.x); + var top = Math.min(this.startPt_.y, this.endPt_.y); + var width = Math.abs(this.startPt_.x - this.endPt_.x); + var height = Math.abs(this.startPt_.y - this.endPt_.y); + // Google Maps API bug: setCenter() doesn't work as expected if the map has a + // border on the left or top. The code here includes a workaround for this problem. + var kGoogleCenteringBug = true; + if (kGoogleCenteringBug) { + left += this.borderWidths_.left; + top += this.borderWidths_.top; + } + + var prj = this.prjov_.getProjection(); + var sw = prj.fromContainerPixelToLatLng(new google.maps.Point(left, top + height)); + var ne = prj.fromContainerPixelToLatLng(new google.maps.Point(left + width, top)); + var bnds = new google.maps.LatLngBounds(sw, ne); + + if (this.noZoom_) { + this.boxDiv_.style.display = "none"; + } else { + // Sometimes fitBounds causes a zoom OUT, so restore original zoom level if this happens. + z = this.map_.getZoom(); + this.map_.fitBounds(bnds); + if (this.map_.getZoom() < z) { + this.map_.setZoom(z); + } + + // Redraw box after zoom: + var swPt = prj.fromLatLngToContainerPixel(sw); + var nePt = prj.fromLatLngToContainerPixel(ne); + if (kGoogleCenteringBug) { + swPt.x -= this.borderWidths_.left; + swPt.y -= this.borderWidths_.top; + nePt.x -= this.borderWidths_.left; + nePt.y -= this.borderWidths_.top; + } + this.boxDiv_.style.left = swPt.x + "px"; + this.boxDiv_.style.top = nePt.y + "px"; + this.boxDiv_.style.width = (Math.abs(nePt.x - swPt.x) - (this.boxBorderWidths_.left + this.boxBorderWidths_.right)) + "px"; + this.boxDiv_.style.height = (Math.abs(nePt.y - swPt.y) - (this.boxBorderWidths_.top + this.boxBorderWidths_.bottom)) + "px"; + // Hide box asynchronously after 1 second: + setTimeout(function () { + me.boxDiv_.style.display = "none"; + }, 1000); + } + this.dragging_ = false; + this.onMouseMove_(e); // Updates the veil + /** + * This event is fired when the drag operation ends. + * The parameter passed is the geographic bounds of the selected area. + * Note that this event is not fired if the hot key is released before the drag operation ends. + * @name DragZoom#dragend + * @param {LatLngBounds} bnds The geographic bounds of the selected area. + * @event + */ + google.maps.event.trigger(this, "dragend", bnds); + // if the hot key isn't down, the drag zoom must have been activated by turning + // on the visual control. In this case, finish up by simulating a key up event. + if (!this.isHotKeyDown_(e)) { + this.onKeyUp_(e); + } + } + }; + /** + * Handle key up. + * @param {Event} e The keyboard event. + */ + DragZoom.prototype.onKeyUp_ = function (e) { + var i; + var left, top, width, height, prj, sw, ne; + var bnds = null; + if (this.map_ && this.hotKeyDown_) { + this.hotKeyDown_ = false; + if (this.dragging_) { + this.boxDiv_.style.display = "none"; + this.dragging_ = false; + // Calculate the bounds when drag zoom was cancelled + left = Math.min(this.startPt_.x, this.endPt_.x); + top = Math.min(this.startPt_.y, this.endPt_.y); + width = Math.abs(this.startPt_.x - this.endPt_.x); + height = Math.abs(this.startPt_.y - this.endPt_.y); + prj = this.prjov_.getProjection(); + sw = prj.fromContainerPixelToLatLng(new google.maps.Point(left, top + height)); + ne = prj.fromContainerPixelToLatLng(new google.maps.Point(left + width, top)); + bnds = new google.maps.LatLngBounds(sw, ne); + } + for (i = 0; i < this.veilDiv_.length; i++) { + this.veilDiv_[i].style.display = "none"; + } + if (this.visualEnabled_) { + this.buttonDiv_.firstChild.style.left = -(this.visualSize_.width * 2) + "px"; + this.buttonDiv_.title = this.visualTips_.off; + this.buttonDiv_.style.display = ""; + } + /** + * This event is fired when the hot key is released. + * The parameter passed is the geographic bounds of the selected area immediately + * before the hot key was released. + * @name DragZoom#deactivate + * @param {LatLngBounds} bnds The geographic bounds of the selected area immediately + * before the hot key was released. + * @event + */ + google.maps.event.trigger(this, "deactivate", bnds); + } + }; + /** + * @name google.maps.Map + * @class These are new methods added to the Google Maps JavaScript API V3's + * Map + * class. + */ + /** + * Enables drag zoom. The user can zoom to an area of interest by holding down the hot key + * (shift | ctrl | alt ) while dragging a box around the area or by turning + * on the visual control then dragging a box around the area. + * @param {KeyDragZoomOptions} opt_zoomOpts The optional parameters. + */ + google.maps.Map.prototype.enableKeyDragZoom = function (opt_zoomOpts) { + this.dragZoom_ = new DragZoom(this, opt_zoomOpts); + }; + /** + * Disables drag zoom. + */ + google.maps.Map.prototype.disableKeyDragZoom = function () { + var i; + var d = this.dragZoom_; + if (d) { + for (i = 0; i < d.listeners_.length; ++i) { + google.maps.event.removeListener(d.listeners_[i]); + } + this.getDiv().removeChild(d.boxDiv_); + for (i = 0; i < d.veilDiv_.length; i++) { + this.getDiv().removeChild(d.veilDiv_[i]); + } + if (d.visualEnabled_) { + // Remove the custom control: + this.controls[d.visualPosition_].removeAt(d.controlIndex_); + } + d.prjov_.setMap(null); + this.dragZoom_ = null; + } + }; + /** + * Returns true if the drag zoom feature has been enabled. + * @return {boolean} + */ + google.maps.Map.prototype.keyDragZoomEnabled = function () { + return this.dragZoom_ !== null; + }; + /** + * Returns the DragZoom object which is created when google.maps.Map.enableKeyDragZoom is called. + * With this object you can use google.maps.event.addListener to attach event listeners + * for the "activate", "deactivate", "dragstart", "drag", and "dragend" events. + * @return {DragZoom} + */ + google.maps.Map.prototype.getDragZoomObject = function () { + return this.dragZoom_; + }; +})(); + +/** + * google-maps-utility-library-v3-markerwithlabel + * + * @version: 1.1.10 + * @author: Gary Little (inspired by code from Marc Ridey of Google). + * @contributors: Nicholas McCready + * @date: Fri May 13 2016 16:29:58 GMT-0400 (EDT) + * @license: Apache License 2.0 + */ +/** + * MarkerWithLabel allows you to define markers with associated labels. As you would expect, + * if the marker is draggable, so too will be the label. In addition, a marker with a label + * responds to all mouse events in the same manner as a regular marker. It also fires mouse + * events and "property changed" events just as a regular marker would. Version 1.1 adds + * support for the raiseOnDrag feature introduced in API V3.3. + *

+ * If you drag a marker by its label, you can cancel the drag and return the marker to its + * original position by pressing the Esc key. This doesn't work if you drag the marker + * itself because this feature is not (yet) supported in the google.maps.Marker class. + */ + +/*jslint browser:true */ +/*global document,google */ + +/** + * @param {Function} childCtor Child class. + * @param {Function} parentCtor Parent class. + * @private + */ +function inherits(childCtor, parentCtor) { + /* @constructor */ + function tempCtor() {} + tempCtor.prototype = parentCtor.prototype; + childCtor.superClass_ = parentCtor.prototype; + childCtor.prototype = new tempCtor(); + /* @override */ + childCtor.prototype.constructor = childCtor; +} + +/** + * This constructor creates a label and associates it with a marker. + * It is for the private use of the MarkerWithLabel class. + * @constructor + * @param {Marker} marker The marker with which the label is to be associated. + * @param {string} crossURL The URL of the cross image =. + * @param {string} handCursor The URL of the hand cursor. + * @private + */ +function MarkerLabel_(marker, crossURL, handCursorURL) { + this.marker_ = marker; + this.handCursorURL_ = marker.handCursorURL; + + this.labelDiv_ = document.createElement("div"); + this.labelDiv_.style.cssText = "position: absolute; overflow: hidden;"; + + // Set up the DIV for handling mouse events in the label. This DIV forms a transparent veil + // in the "overlayMouseTarget" pane, a veil that covers just the label. This is done so that + // events can be captured even if the label is in the shadow of a google.maps.InfoWindow. + // Code is included here to ensure the veil is always exactly the same size as the label. + this.eventDiv_ = document.createElement("div"); + this.eventDiv_.style.cssText = this.labelDiv_.style.cssText; + + // This is needed for proper behavior on MSIE: + this.eventDiv_.setAttribute("onselectstart", "return false;"); + this.eventDiv_.setAttribute("ondragstart", "return false;"); + + // Get the DIV for the "X" to be displayed when the marker is raised. + this.crossDiv_ = MarkerLabel_.getSharedCross(crossURL); +} + +inherits(MarkerLabel_, google.maps.OverlayView); + +/** + * Returns the DIV for the cross used when dragging a marker when the + * raiseOnDrag parameter set to true. One cross is shared with all markers. + * @param {string} crossURL The URL of the cross image =. + * @private + */ +MarkerLabel_.getSharedCross = function (crossURL) { + var div; + if (typeof MarkerLabel_.getSharedCross.crossDiv === "undefined") { + div = document.createElement("img"); + div.style.cssText = "position: absolute; z-index: 1000002; display: none;"; + // Hopefully Google never changes the standard "X" attributes: + div.style.marginLeft = "-8px"; + div.style.marginTop = "-9px"; + div.src = crossURL; + MarkerLabel_.getSharedCross.crossDiv = div; + } + return MarkerLabel_.getSharedCross.crossDiv; +}; + +/** + * Adds the DIV representing the label to the DOM. This method is called + * automatically when the marker's setMap method is called. + * @private + */ +MarkerLabel_.prototype.onAdd = function () { + var me = this; + var cMouseIsDown = false; + var cDraggingLabel = false; + var cSavedZIndex; + var cLatOffset, cLngOffset; + var cIgnoreClick; + var cRaiseEnabled; + var cStartPosition; + var cStartCenter; + // Constants: + var cRaiseOffset = 20; + var cDraggingCursor = "url("https://github.com/+%20this.handCursorURL_%20+")"; + + // Stops all processing of an event. + // + var cAbortEvent = function (e) { + if (e.preventDefault) { + e.preventDefault(); + } + e.cancelBubble = true; + if (e.stopPropagation) { + e.stopPropagation(); + } + }; + + var cStopBounce = function () { + me.marker_.setAnimation(null); + }; + + this.getPanes().overlayImage.appendChild(this.labelDiv_); + this.getPanes().overlayMouseTarget.appendChild(this.eventDiv_); + // One cross is shared with all markers, so only add it once: + if (typeof MarkerLabel_.getSharedCross.processed === "undefined") { + this.getPanes().overlayImage.appendChild(this.crossDiv_); + MarkerLabel_.getSharedCross.processed = true; + } + + this.listeners_ = [ + google.maps.event.addDomListener(this.eventDiv_, "mouseover", function (e) { + if (me.marker_.getDraggable() || me.marker_.getClickable()) { + this.style.cursor = "pointer"; + google.maps.event.trigger(me.marker_, "mouseover", e); + } + }), + google.maps.event.addDomListener(this.eventDiv_, "mouseout", function (e) { + if ((me.marker_.getDraggable() || me.marker_.getClickable()) && !cDraggingLabel) { + this.style.cursor = me.marker_.getCursor(); + google.maps.event.trigger(me.marker_, "mouseout", e); + } + }), + google.maps.event.addDomListener(this.eventDiv_, "mousedown", function (e) { + cDraggingLabel = false; + if (me.marker_.getDraggable()) { + cMouseIsDown = true; + this.style.cursor = cDraggingCursor; + } + if (me.marker_.getDraggable() || me.marker_.getClickable()) { + google.maps.event.trigger(me.marker_, "mousedown", e); + cAbortEvent(e); // Prevent map pan when starting a drag on a label + } + }), + google.maps.event.addDomListener(document, "mouseup", function (mEvent) { + var position; + if (cMouseIsDown) { + cMouseIsDown = false; + me.eventDiv_.style.cursor = "pointer"; + google.maps.event.trigger(me.marker_, "mouseup", mEvent); + } + if (cDraggingLabel) { + if (cRaiseEnabled) { // Lower the marker & label + position = me.getProjection().fromLatLngToDivPixel(me.marker_.getPosition()); + position.y += cRaiseOffset; + me.marker_.setPosition(me.getProjection().fromDivPixelToLatLng(position)); + // This is not the same bouncing style as when the marker portion is dragged, + // but it will have to do: + try { // Will fail if running Google Maps API earlier than V3.3 + me.marker_.setAnimation(google.maps.Animation.BOUNCE); + setTimeout(cStopBounce, 1406); + } catch (e) {} + } + me.crossDiv_.style.display = "none"; + me.marker_.setZIndex(cSavedZIndex); + cIgnoreClick = true; // Set flag to ignore the click event reported after a label drag + cDraggingLabel = false; + mEvent.latLng = me.marker_.getPosition(); + google.maps.event.trigger(me.marker_, "dragend", mEvent); + } + }), + google.maps.event.addListener(me.marker_.getMap(), "mousemove", function (mEvent) { + var position; + if (cMouseIsDown) { + if (cDraggingLabel) { + // Change the reported location from the mouse position to the marker position: + mEvent.latLng = new google.maps.LatLng(mEvent.latLng.lat() - cLatOffset, mEvent.latLng.lng() - cLngOffset); + position = me.getProjection().fromLatLngToDivPixel(mEvent.latLng); + if (cRaiseEnabled) { + me.crossDiv_.style.left = position.x + "px"; + me.crossDiv_.style.top = position.y + "px"; + me.crossDiv_.style.display = ""; + position.y -= cRaiseOffset; + } + me.marker_.setPosition(me.getProjection().fromDivPixelToLatLng(position)); + if (cRaiseEnabled) { // Don't raise the veil; this hack needed to make MSIE act properly + me.eventDiv_.style.top = (position.y + cRaiseOffset) + "px"; + } + google.maps.event.trigger(me.marker_, "drag", mEvent); + } else { + // Calculate offsets from the click point to the marker position: + cLatOffset = mEvent.latLng.lat() - me.marker_.getPosition().lat(); + cLngOffset = mEvent.latLng.lng() - me.marker_.getPosition().lng(); + cSavedZIndex = me.marker_.getZIndex(); + cStartPosition = me.marker_.getPosition(); + cStartCenter = me.marker_.getMap().getCenter(); + cRaiseEnabled = me.marker_.get("raiseOnDrag"); + cDraggingLabel = true; + me.marker_.setZIndex(1000000); // Moves the marker & label to the foreground during a drag + mEvent.latLng = me.marker_.getPosition(); + google.maps.event.trigger(me.marker_, "dragstart", mEvent); + } + } + }), + google.maps.event.addDomListener(document, "keydown", function (e) { + if (cDraggingLabel) { + if (e.keyCode === 27) { // Esc key + cRaiseEnabled = false; + me.marker_.setPosition(cStartPosition); + me.marker_.getMap().setCenter(cStartCenter); + google.maps.event.trigger(document, "mouseup", e); + } + } + }), + google.maps.event.addDomListener(this.eventDiv_, "click", function (e) { + if (me.marker_.getDraggable() || me.marker_.getClickable()) { + if (cIgnoreClick) { // Ignore the click reported when a label drag ends + cIgnoreClick = false; + } else { + google.maps.event.trigger(me.marker_, "click", e); + cAbortEvent(e); // Prevent click from being passed on to map + } + } + }), + google.maps.event.addDomListener(this.eventDiv_, "dblclick", function (e) { + if (me.marker_.getDraggable() || me.marker_.getClickable()) { + google.maps.event.trigger(me.marker_, "dblclick", e); + cAbortEvent(e); // Prevent map zoom when double-clicking on a label + } + }), + google.maps.event.addListener(this.marker_, "dragstart", function (mEvent) { + if (!cDraggingLabel) { + cRaiseEnabled = this.get("raiseOnDrag"); + } + }), + google.maps.event.addListener(this.marker_, "drag", function (mEvent) { + if (!cDraggingLabel) { + if (cRaiseEnabled) { + me.setPosition(cRaiseOffset); + // During a drag, the marker's z-index is temporarily set to 1000000 to + // ensure it appears above all other markers. Also set the label's z-index + // to 1000000 (plus or minus 1 depending on whether the label is supposed + // to be above or below the marker). + me.labelDiv_.style.zIndex = 1000000 + (this.get("labelInBackground") ? -1 : +1); + } + } + }), + google.maps.event.addListener(this.marker_, "dragend", function (mEvent) { + if (!cDraggingLabel) { + if (cRaiseEnabled) { + me.setPosition(0); // Also restores z-index of label + } + } + }), + google.maps.event.addListener(this.marker_, "position_changed", function () { + me.setPosition(); + }), + google.maps.event.addListener(this.marker_, "zindex_changed", function () { + me.setZIndex(); + }), + google.maps.event.addListener(this.marker_, "visible_changed", function () { + me.setVisible(); + }), + google.maps.event.addListener(this.marker_, "labelvisible_changed", function () { + me.setVisible(); + }), + google.maps.event.addListener(this.marker_, "title_changed", function () { + me.setTitle(); + }), + google.maps.event.addListener(this.marker_, "labelcontent_changed", function () { + me.setContent(); + }), + google.maps.event.addListener(this.marker_, "labelanchor_changed", function () { + me.setAnchor(); + }), + google.maps.event.addListener(this.marker_, "labelclass_changed", function () { + me.setStyles(); + }), + google.maps.event.addListener(this.marker_, "labelstyle_changed", function () { + me.setStyles(); + }) + ]; +}; + +/** + * Removes the DIV for the label from the DOM. It also removes all event handlers. + * This method is called automatically when the marker's setMap(null) + * method is called. + * @private + */ +MarkerLabel_.prototype.onRemove = function () { + var i; + this.labelDiv_.parentNode.removeChild(this.labelDiv_); + this.eventDiv_.parentNode.removeChild(this.eventDiv_); + + // Remove event listeners: + for (i = 0; i < this.listeners_.length; i++) { + google.maps.event.removeListener(this.listeners_[i]); + } +}; + +/** + * Draws the label on the map. + * @private + */ +MarkerLabel_.prototype.draw = function () { + this.setContent(); + this.setTitle(); + this.setStyles(); +}; + +/** + * Sets the content of the label. + * The content can be plain text or an HTML DOM node. + * @private + */ +MarkerLabel_.prototype.setContent = function () { + var content = this.marker_.get("labelContent"); + if (typeof content.nodeType === "undefined") { + this.labelDiv_.innerHTML = content; + this.eventDiv_.innerHTML = this.labelDiv_.innerHTML; + } else { + this.labelDiv_.innerHTML = ""; // Remove current content + this.labelDiv_.appendChild(content); + content = content.cloneNode(true); + this.eventDiv_.innerHTML = ""; // Remove current content + this.eventDiv_.appendChild(content); + } +}; + +/** + * Sets the content of the tool tip for the label. It is + * always set to be the same as for the marker itself. + * @private + */ +MarkerLabel_.prototype.setTitle = function () { + this.eventDiv_.title = this.marker_.getTitle() || ""; +}; + +/** + * Sets the style of the label by setting the style sheet and applying + * other specific styles requested. + * @private + */ +MarkerLabel_.prototype.setStyles = function () { + var i, labelStyle; + + // Apply style values from the style sheet defined in the labelClass parameter: + this.labelDiv_.className = this.marker_.get("labelClass"); + this.eventDiv_.className = this.labelDiv_.className; + + // Clear existing inline style values: + this.labelDiv_.style.cssText = ""; + this.eventDiv_.style.cssText = ""; + // Apply style values defined in the labelStyle parameter: + labelStyle = this.marker_.get("labelStyle"); + for (i in labelStyle) { + if (labelStyle.hasOwnProperty(i)) { + this.labelDiv_.style[i] = labelStyle[i]; + this.eventDiv_.style[i] = labelStyle[i]; + } + } + this.setMandatoryStyles(); +}; + +/** + * Sets the mandatory styles to the DIV representing the label as well as to the + * associated event DIV. This includes setting the DIV position, z-index, and visibility. + * @private + */ +MarkerLabel_.prototype.setMandatoryStyles = function () { + this.labelDiv_.style.position = "absolute"; + this.labelDiv_.style.overflow = "hidden"; + // Make sure the opacity setting causes the desired effect on MSIE: + if (typeof this.labelDiv_.style.opacity !== "undefined" && this.labelDiv_.style.opacity !== "") { + this.labelDiv_.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.labelDiv_.style.opacity * 100) + ")\""; + this.labelDiv_.style.filter = "alpha(opacity=" + (this.labelDiv_.style.opacity * 100) + ")"; + } + + this.eventDiv_.style.position = this.labelDiv_.style.position; + this.eventDiv_.style.overflow = this.labelDiv_.style.overflow; + this.eventDiv_.style.opacity = 0.01; // Don't use 0; DIV won't be clickable on MSIE + this.eventDiv_.style.MsFilter = "\"progid:DXImageTransform.Microsoft.Alpha(opacity=1)\""; + this.eventDiv_.style.filter = "alpha(opacity=1)"; // For MSIE + + this.setAnchor(); + this.setPosition(); // This also updates z-index, if necessary. + this.setVisible(); +}; + +/** + * Sets the anchor point of the label. + * @private + */ +MarkerLabel_.prototype.setAnchor = function () { + var anchor = this.marker_.get("labelAnchor"); + this.labelDiv_.style.marginLeft = -anchor.x + "px"; + this.labelDiv_.style.marginTop = -anchor.y + "px"; + this.eventDiv_.style.marginLeft = -anchor.x + "px"; + this.eventDiv_.style.marginTop = -anchor.y + "px"; +}; + +/** + * Sets the position of the label. The z-index is also updated, if necessary. + * @private + */ +MarkerLabel_.prototype.setPosition = function (yOffset) { + var position = this.getProjection().fromLatLngToDivPixel(this.marker_.getPosition()); + if (typeof yOffset === "undefined") { + yOffset = 0; + } + this.labelDiv_.style.left = Math.round(position.x) + "px"; + this.labelDiv_.style.top = Math.round(position.y - yOffset) + "px"; + this.eventDiv_.style.left = this.labelDiv_.style.left; + this.eventDiv_.style.top = this.labelDiv_.style.top; + + this.setZIndex(); +}; + +/** + * Sets the z-index of the label. If the marker's z-index property has not been defined, the z-index + * of the label is set to the vertical coordinate of the label. This is in keeping with the default + * stacking order for Google Maps: markers to the south are in front of markers to the north. + * @private + */ +MarkerLabel_.prototype.setZIndex = function () { + var zAdjust = (this.marker_.get("labelInBackground") ? -1 : +1); + if (typeof this.marker_.getZIndex() === "undefined") { + this.labelDiv_.style.zIndex = parseInt(this.labelDiv_.style.top, 10) + zAdjust; + this.eventDiv_.style.zIndex = this.labelDiv_.style.zIndex; + } else { + this.labelDiv_.style.zIndex = this.marker_.getZIndex() + zAdjust; + this.eventDiv_.style.zIndex = this.labelDiv_.style.zIndex; + } +}; + +/** + * Sets the visibility of the label. The label is visible only if the marker itself is + * visible (i.e., its visible property is true) and the labelVisible property is true. + * @private + */ +MarkerLabel_.prototype.setVisible = function () { + if (this.marker_.get("labelVisible")) { + this.labelDiv_.style.display = this.marker_.getVisible() ? "block" : "none"; + } else { + this.labelDiv_.style.display = "none"; + } + this.eventDiv_.style.display = this.labelDiv_.style.display; +}; + +/** + * @name MarkerWithLabelOptions + * @class This class represents the optional parameter passed to the {@link MarkerWithLabel} constructor. + * The properties available are the same as for google.maps.Marker with the addition + * of the properties listed below. To change any of these additional properties after the labeled + * marker has been created, call google.maps.Marker.set(propertyName, propertyValue). + *

+ * When any of these properties changes, a property changed event is fired. The names of these + * events are derived from the name of the property and are of the form propertyname_changed. + * For example, if the content of the label changes, a labelcontent_changed event + * is fired. + *

+ * @property {string|Node} [labelContent] The content of the label (plain text or an HTML DOM node). + * @property {Point} [labelAnchor] By default, a label is drawn with its anchor point at (0,0) so + * that its top left corner is positioned at the anchor point of the associated marker. Use this + * property to change the anchor point of the label. For example, to center a 50px-wide label + * beneath a marker, specify a labelAnchor of google.maps.Point(25, 0). + * (Note: x-values increase to the right and y-values increase to the top.) + * @property {string} [labelClass] The name of the CSS class defining the styles for the label. + * Note that style values for position, overflow, top, + * left, zIndex, display, marginLeft, and + * marginTop are ignored; these styles are for internal use only. + * @property {Object} [labelStyle] An object literal whose properties define specific CSS + * style values to be applied to the label. Style values defined here override those that may + * be defined in the labelClass style sheet. If this property is changed after the + * label has been created, all previously set styles (except those defined in the style sheet) + * are removed from the label before the new style values are applied. + * Note that style values for position, overflow, top, + * left, zIndex, display, marginLeft, and + * marginTop are ignored; these styles are for internal use only. + * @property {boolean} [labelInBackground] A flag indicating whether a label that overlaps its + * associated marker should appear in the background (i.e., in a plane below the marker). + * The default is false, which causes the label to appear in the foreground. + * @property {boolean} [labelVisible] A flag indicating whether the label is to be visible. + * The default is true. Note that even if labelVisible is + * true, the label will not be visible unless the associated marker is also + * visible (i.e., unless the marker's visible property is true). + * @property {boolean} [raiseOnDrag] A flag indicating whether the label and marker are to be + * raised when the marker is dragged. The default is true. If a draggable marker is + * being created and a version of Google Maps API earlier than V3.3 is being used, this property + * must be set to false. + * @property {boolean} [optimized] A flag indicating whether rendering is to be optimized for the + * marker. Important: The optimized rendering technique is not supported by MarkerWithLabel, + * so the value of this parameter is always forced to false. + * @property {string} [crossImage="http://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png"] + * The URL of the cross image to be displayed while dragging a marker. + * @property {string} [handCursor="http://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur"] + * The URL of the cursor to be displayed while dragging a marker. + */ +/** + * Creates a MarkerWithLabel with the options specified in {@link MarkerWithLabelOptions}. + * @constructor + * @param {MarkerWithLabelOptions} [opt_options] The optional parameters. + */ +function MarkerWithLabel(opt_options) { + opt_options = opt_options || {}; + opt_options.labelContent = opt_options.labelContent || ""; + opt_options.labelAnchor = opt_options.labelAnchor || new google.maps.Point(0, 0); + opt_options.labelClass = opt_options.labelClass || "markerLabels"; + opt_options.labelStyle = opt_options.labelStyle || {}; + opt_options.labelInBackground = opt_options.labelInBackground || false; + if (typeof opt_options.labelVisible === "undefined") { + opt_options.labelVisible = true; + } + if (typeof opt_options.raiseOnDrag === "undefined") { + opt_options.raiseOnDrag = true; + } + if (typeof opt_options.clickable === "undefined") { + opt_options.clickable = true; + } + if (typeof opt_options.draggable === "undefined") { + opt_options.draggable = false; + } + if (typeof opt_options.optimized === "undefined") { + opt_options.optimized = false; + } + opt_options.crossImage = opt_options.crossImage || "http" + (document.location.protocol === "https:" ? "s" : "") + "://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png"; + opt_options.handCursor = opt_options.handCursor || "http" + (document.location.protocol === "https:" ? "s" : "") + "://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur"; + opt_options.optimized = false; // Optimized rendering is not supported + + this.label = new MarkerLabel_(this, opt_options.crossImage, opt_options.handCursor); // Bind the label to the marker + + // Call the parent constructor. It calls Marker.setValues to initialize, so all + // the new parameters are conveniently saved and can be accessed with get/set. + // Marker.set triggers a property changed event (called "propertyname_changed") + // that the marker label listens for in order to react to state changes. + google.maps.Marker.apply(this, arguments); +} + +inherits(MarkerWithLabel, google.maps.Marker); + +/** + * Overrides the standard Marker setMap function. + * @param {Map} theMap The map to which the marker is to be added. + * @private + */ +MarkerWithLabel.prototype.setMap = function (theMap) { + + // Call the inherited function... + google.maps.Marker.prototype.setMap.apply(this, arguments); + + // ... then deal with the label: + this.label.setMap(theMap); +}; + +// ==ClosureCompiler== +// @compilation_level ADVANCED_OPTIMIZATIONS +// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/maps/google_maps_api_v3.js +// @output_wrapper (function() {%output%})(); +// ==/ClosureCompiler== + +/** + * @license + * Copyright 2013 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A RichMarker that allows any HTML/DOM to be added to a map and be draggable. + * + * @param {Object.=} opt_options Optional properties to set. + * @extends {google.maps.OverlayView} + * @constructor + */ +function RichMarker(opt_options) { + var options = opt_options || {}; + + /** + * @type {boolean} + * @private + */ + this.ready_ = false; + + /** + * @type {boolean} + * @private + */ + this.dragging_ = false; + + if (opt_options['visible'] == undefined) { + opt_options['visible'] = true; + } + + if (opt_options['shadow'] == undefined) { + opt_options['shadow'] = '7px -3px 5px rgba(88,88,88,0.7)'; + } + + if (opt_options['anchor'] == undefined) { + opt_options['anchor'] = RichMarkerPosition['BOTTOM']; + } + + this.setValues(options); +} +RichMarker.prototype = new google.maps.OverlayView(); +window['RichMarker'] = RichMarker; + + +/** + * Returns the current visibility state of the marker. + * + * @return {boolean} The visiblity of the marker. + */ +RichMarker.prototype.getVisible = function() { + return /** @type {boolean} */ (this.get('visible')); +}; +RichMarker.prototype['getVisible'] = RichMarker.prototype.getVisible; + + +/** + * Sets the visiblility state of the marker. + * + * @param {boolean} visible The visiblilty of the marker. + */ +RichMarker.prototype.setVisible = function(visible) { + this.set('visible', visible); +}; +RichMarker.prototype['setVisible'] = RichMarker.prototype.setVisible; + + +/** + * The visible changed event. + */ +RichMarker.prototype.visible_changed = function() { + if (this.ready_) { + this.markerWrapper_.style['display'] = this.getVisible() ? '' : 'none'; + this.draw(); + } +}; +RichMarker.prototype['visible_changed'] = RichMarker.prototype.visible_changed; + + +/** + * Sets the marker to be flat. + * + * @param {boolean} flat If the marker is to be flat or not. + */ +RichMarker.prototype.setFlat = function(flat) { + this.set('flat', !!flat); +}; +RichMarker.prototype['setFlat'] = RichMarker.prototype.setFlat; + + +/** + * If the makrer is flat or not. + * + * @return {boolean} True the marker is flat. + */ +RichMarker.prototype.getFlat = function() { + return /** @type {boolean} */ (this.get('flat')); +}; +RichMarker.prototype['getFlat'] = RichMarker.prototype.getFlat; + + +/** + * Get the width of the marker. + * + * @return {Number} The width of the marker. + */ +RichMarker.prototype.getWidth = function() { + return /** @type {Number} */ (this.get('width')); +}; +RichMarker.prototype['getWidth'] = RichMarker.prototype.getWidth; + + +/** + * Get the height of the marker. + * + * @return {Number} The height of the marker. + */ +RichMarker.prototype.getHeight = function() { + return /** @type {Number} */ (this.get('height')); +}; +RichMarker.prototype['getHeight'] = RichMarker.prototype.getHeight; + + +/** + * Sets the marker's box shadow. + * + * @param {string} shadow The box shadow to set. + */ +RichMarker.prototype.setShadow = function(shadow) { + this.set('shadow', shadow); + this.flat_changed(); +}; +RichMarker.prototype['setShadow'] = RichMarker.prototype.setShadow; + + +/** + * Gets the marker's box shadow. + * + * @return {string} The box shadow. + */ +RichMarker.prototype.getShadow = function() { + return /** @type {string} */ (this.get('shadow')); +}; +RichMarker.prototype['getShadow'] = RichMarker.prototype.getShadow; + + +/** + * Flat changed event. + */ +RichMarker.prototype.flat_changed = function() { + if (!this.ready_) { + return; + } + + this.markerWrapper_.style['boxShadow'] = + this.markerWrapper_.style['webkitBoxShadow'] = + this.markerWrapper_.style['MozBoxShadow'] = + this.getFlat() ? '' : this.getShadow(); +}; +RichMarker.prototype['flat_changed'] = RichMarker.prototype.flat_changed; + + +/** + * Sets the zIndex of the marker. + * + * @param {Number} index The index to set. + */ +RichMarker.prototype.setZIndex = function(index) { + this.set('zIndex', index); +}; +RichMarker.prototype['setZIndex'] = RichMarker.prototype.setZIndex; + + +/** + * Gets the zIndex of the marker. + * + * @return {Number} The zIndex of the marker. + */ +RichMarker.prototype.getZIndex = function() { + return /** @type {Number} */ (this.get('zIndex')); +}; +RichMarker.prototype['getZIndex'] = RichMarker.prototype.getZIndex; + + +/** + * zIndex changed event. + */ +RichMarker.prototype.zIndex_changed = function() { + if (this.getZIndex() && this.ready_) { + this.markerWrapper_.style.zIndex = this.getZIndex(); + } +}; +RichMarker.prototype['zIndex_changed'] = RichMarker.prototype.zIndex_changed; + +/** + * Whether the marker is draggable or not. + * + * @return {boolean} True if the marker is draggable. + */ +RichMarker.prototype.getDraggable = function() { + return /** @type {boolean} */ (this.get('draggable')); +}; +RichMarker.prototype['getDraggable'] = RichMarker.prototype.getDraggable; + + +/** + * Sets the marker to be draggable or not. + * + * @param {boolean} draggable If the marker is draggable or not. + */ +RichMarker.prototype.setDraggable = function(draggable) { + this.set('draggable', !!draggable); +}; +RichMarker.prototype['setDraggable'] = RichMarker.prototype.setDraggable; + + +/** + * Draggable property changed callback. + */ +RichMarker.prototype.draggable_changed = function() { + if (this.ready_) { + if (this.getDraggable()) { + this.addDragging_(this.markerWrapper_); + } else { + this.removeDragListeners_(); + } + } +}; +RichMarker.prototype['draggable_changed'] = + RichMarker.prototype.draggable_changed; + + +/** + * Gets the postiton of the marker. + * + * @return {google.maps.LatLng} The position of the marker. + */ +RichMarker.prototype.getPosition = function() { + return /** @type {google.maps.LatLng} */ (this.get('position')); +}; +RichMarker.prototype['getPosition'] = RichMarker.prototype.getPosition; + + +/** + * Sets the position of the marker. + * + * @param {google.maps.LatLng} position The position to set. + */ +RichMarker.prototype.setPosition = function(position) { + this.set('position', position); +}; +RichMarker.prototype['setPosition'] = RichMarker.prototype.setPosition; + + +/** + * Position changed event. + */ +RichMarker.prototype.position_changed = function() { + this.draw(); +}; +RichMarker.prototype['position_changed'] = + RichMarker.prototype.position_changed; + + +/** + * Gets the anchor. + * + * @return {google.maps.Size} The position of the anchor. + */ +RichMarker.prototype.getAnchor = function() { + return /** @type {google.maps.Size} */ (this.get('anchor')); +}; +RichMarker.prototype['getAnchor'] = RichMarker.prototype.getAnchor; + + +/** + * Sets the anchor. + * + * @param {RichMarkerPosition|google.maps.Size} anchor The anchor to set. + */ +RichMarker.prototype.setAnchor = function(anchor) { + this.set('anchor', anchor); +}; +RichMarker.prototype['setAnchor'] = RichMarker.prototype.setAnchor; + + +/** + * Anchor changed event. + */ +RichMarker.prototype.anchor_changed = function() { + this.draw(); +}; +RichMarker.prototype['anchor_changed'] = RichMarker.prototype.anchor_changed; + + +/** + * Converts a HTML string to a document fragment. + * + * @param {string} htmlString The HTML string to convert. + * @return {Node} A HTML document fragment. + * @private + */ +RichMarker.prototype.htmlToDocumentFragment_ = function(htmlString) { + var tempDiv = document.createElement('DIV'); + tempDiv.innerHTML = htmlString; + if (tempDiv.childNodes.length == 1) { + return /** @type {!Node} */ (tempDiv.removeChild(tempDiv.firstChild)); + } else { + var fragment = document.createDocumentFragment(); + while (tempDiv.firstChild) { + fragment.appendChild(tempDiv.firstChild); + } + return fragment; + } +}; + + +/** + * Removes all children from the node. + * + * @param {Node} node The node to remove all children from. + * @private + */ +RichMarker.prototype.removeChildren_ = function(node) { + if (!node) { + return; + } + + var child; + while (child = node.firstChild) { + node.removeChild(child); + } +}; + + +/** + * Sets the content of the marker. + * + * @param {string|Node} content The content to set. + */ +RichMarker.prototype.setContent = function(content) { + this.set('content', content); +}; +RichMarker.prototype['setContent'] = RichMarker.prototype.setContent; + + +/** + * Get the content of the marker. + * + * @return {string|Node} The marker content. + */ +RichMarker.prototype.getContent = function() { + return /** @type {Node|string} */ (this.get('content')); +}; +RichMarker.prototype['getContent'] = RichMarker.prototype.getContent; + + +/** + * Sets the marker content and adds loading events to images + */ +RichMarker.prototype.content_changed = function() { + if (!this.markerContent_) { + // Marker content area doesnt exist. + return; + } + + this.removeChildren_(this.markerContent_); + var content = this.getContent(); + if (content) { + if (typeof content == 'string') { + content = content.replace(/^\s*([\S\s]*)\b\s*$/, '$1'); + content = this.htmlToDocumentFragment_(content); + } + this.markerContent_.appendChild(content); + + var that = this; + var images = this.markerContent_.getElementsByTagName('IMG'); + for (var i = 0, image; image = images[i]; i++) { + // By default, a browser lets a image be dragged outside of the browser, + // so by calling preventDefault we stop this behaviour and allow the image + // to be dragged around the map and now out of the browser and onto the + // desktop. + google.maps.event.addDomListener(image, 'mousedown', function(e) { + if (that.getDraggable()) { + if (e.preventDefault) { + e.preventDefault(); + } + e.returnValue = false; + } + }); + + // Because we don't know the size of an image till it loads, add a + // listener to the image load so the marker can resize and reposition + // itself to be the correct height. + google.maps.event.addDomListener(image, 'load', function() { + that.draw(); + }); + } + + google.maps.event.trigger(this, 'domready'); + } + + if (this.ready_) { + this.draw(); + } +}; +RichMarker.prototype['content_changed'] = RichMarker.prototype.content_changed; + +/** + * Sets the cursor. + * + * @param {string} whichCursor What cursor to show. + * @private + */ +RichMarker.prototype.setCursor_ = function(whichCursor) { + if (!this.ready_) { + return; + } + + var cursor = ''; + if (navigator.userAgent.indexOf('Gecko/') !== -1) { + // Moz has some nice cursors :) + if (whichCursor == 'dragging') { + cursor = '-moz-grabbing'; + } + + if (whichCursor == 'dragready') { + cursor = '-moz-grab'; + } + + if (whichCursor == 'draggable') { + cursor = 'pointer'; + } + } else { + if (whichCursor == 'dragging' || whichCursor == 'dragready') { + cursor = 'move'; + } + + if (whichCursor == 'draggable') { + cursor = 'pointer'; + } + } + + if (this.markerWrapper_.style.cursor != cursor) { + this.markerWrapper_.style.cursor = cursor; + } +}; + +/** + * Start dragging. + * + * @param {Event} e The event. + */ +RichMarker.prototype.startDrag = function(e) { + if (!this.getDraggable()) { + return; + } + + if (!this.dragging_) { + this.dragging_ = true; + var map = this.getMap(); + this.mapDraggable_ = map.get('draggable'); + map.set('draggable', false); + + // Store the current mouse position + this.mouseX_ = e.clientX; + this.mouseY_ = e.clientY; + + this.setCursor_('dragready'); + + // Stop the text from being selectable while being dragged + this.markerWrapper_.style['MozUserSelect'] = 'none'; + this.markerWrapper_.style['KhtmlUserSelect'] = 'none'; + this.markerWrapper_.style['WebkitUserSelect'] = 'none'; + + this.markerWrapper_['unselectable'] = 'on'; + this.markerWrapper_['onselectstart'] = function() { + return false; + }; + + this.addDraggingListeners_(); + + google.maps.event.trigger(this, 'dragstart'); + } +}; + + +/** + * Stop dragging. + */ +RichMarker.prototype.stopDrag = function() { + if (!this.getDraggable()) { + return; + } + + if (this.dragging_) { + this.dragging_ = false; + this.getMap().set('draggable', this.mapDraggable_); + this.mouseX_ = this.mouseY_ = this.mapDraggable_ = null; + + // Allow the text to be selectable again + this.markerWrapper_.style['MozUserSelect'] = ''; + this.markerWrapper_.style['KhtmlUserSelect'] = ''; + this.markerWrapper_.style['WebkitUserSelect'] = ''; + this.markerWrapper_['unselectable'] = 'off'; + this.markerWrapper_['onselectstart'] = function() {}; + + this.removeDraggingListeners_(); + + this.setCursor_('draggable'); + google.maps.event.trigger(this, 'dragend'); + + this.draw(); + } +}; + + +/** + * Handles the drag event. + * + * @param {Event} e The event. + */ +RichMarker.prototype.drag = function(e) { + if (!this.getDraggable() || !this.dragging_) { + // This object isn't draggable or we have stopped dragging + this.stopDrag(); + return; + } + + var dx = this.mouseX_ - e.clientX; + var dy = this.mouseY_ - e.clientY; + + this.mouseX_ = e.clientX; + this.mouseY_ = e.clientY; + + var left = parseInt(this.markerWrapper_.style['left'], 10) - dx; + var top = parseInt(this.markerWrapper_.style['top'], 10) - dy; + + this.markerWrapper_.style['left'] = left + 'px'; + this.markerWrapper_.style['top'] = top + 'px'; + + var offset = this.getOffset_(); + + // Set the position property and adjust for the anchor offset + var point = new google.maps.Point(left - offset.width, top - offset.height); + var projection = this.getProjection(); + this.setPosition(projection.fromDivPixelToLatLng(point)); + + this.setCursor_('dragging'); + google.maps.event.trigger(this, 'drag'); +}; + + +/** + * Removes the drag listeners associated with the marker. + * + * @private + */ +RichMarker.prototype.removeDragListeners_ = function() { + if (this.draggableListener_) { + google.maps.event.removeListener(this.draggableListener_); + delete this.draggableListener_; + } + this.setCursor_(''); +}; + + +/** + * Add dragability events to the marker. + * + * @param {Node} node The node to apply dragging to. + * @private + */ +RichMarker.prototype.addDragging_ = function(node) { + if (!node) { + return; + } + + var that = this; + this.draggableListener_ = + google.maps.event.addDomListener(node, 'mousedown', function(e) { + that.startDrag(e); + }); + + this.setCursor_('draggable'); +}; + + +/** + * Add dragging listeners. + * + * @private + */ +RichMarker.prototype.addDraggingListeners_ = function() { + var that = this; + if (this.markerWrapper_.setCapture) { + this.markerWrapper_.setCapture(true); + this.draggingListeners_ = [ + google.maps.event.addDomListener(this.markerWrapper_, 'mousemove', function(e) { + that.drag(e); + }, true), + google.maps.event.addDomListener(this.markerWrapper_, 'mouseup', function() { + that.stopDrag(); + that.markerWrapper_.releaseCapture(); + }, true) + ]; + } else { + this.draggingListeners_ = [ + google.maps.event.addDomListener(window, 'mousemove', function(e) { + that.drag(e); + }, true), + google.maps.event.addDomListener(window, 'mouseup', function() { + that.stopDrag(); + }, true) + ]; + } +}; + + +/** + * Remove dragging listeners. + * + * @private + */ +RichMarker.prototype.removeDraggingListeners_ = function() { + if (this.draggingListeners_) { + for (var i = 0, listener; listener = this.draggingListeners_[i]; i++) { + google.maps.event.removeListener(listener); + } + this.draggingListeners_.length = 0; + } +}; + + +/** + * Get the anchor offset. + * + * @return {google.maps.Size} The size offset. + * @private + */ +RichMarker.prototype.getOffset_ = function() { + var anchor = this.getAnchor(); + if (typeof anchor == 'object') { + return /** @type {google.maps.Size} */ (anchor); + } + + var offset = new google.maps.Size(0, 0); + if (!this.markerContent_) { + return offset; + } + + var width = this.markerContent_.offsetWidth; + var height = this.markerContent_.offsetHeight; + + switch (anchor) { + case RichMarkerPosition['TOP_LEFT']: + break; + case RichMarkerPosition['TOP']: + offset.width = -width / 2; + break; + case RichMarkerPosition['TOP_RIGHT']: + offset.width = -width; + break; + case RichMarkerPosition['LEFT']: + offset.height = -height / 2; + break; + case RichMarkerPosition['MIDDLE']: + offset.width = -width / 2; + offset.height = -height / 2; + break; + case RichMarkerPosition['RIGHT']: + offset.width = -width; + offset.height = -height / 2; + break; + case RichMarkerPosition['BOTTOM_LEFT']: + offset.height = -height; + break; + case RichMarkerPosition['BOTTOM']: + offset.width = -width / 2; + offset.height = -height; + break; + case RichMarkerPosition['BOTTOM_RIGHT']: + offset.width = -width; + offset.height = -height; + break; + } + + return offset; +}; + + +/** + * Adding the marker to a map. + * Implementing the interface. + */ +RichMarker.prototype.onAdd = function() { + if (!this.markerWrapper_) { + this.markerWrapper_ = document.createElement('DIV'); + this.markerWrapper_.style['position'] = 'absolute'; + } + + if (this.getZIndex()) { + this.markerWrapper_.style['zIndex'] = this.getZIndex(); + } + + this.markerWrapper_.style['display'] = this.getVisible() ? '' : 'none'; + + if (!this.markerContent_) { + this.markerContent_ = document.createElement('DIV'); + this.markerWrapper_.appendChild(this.markerContent_); + + var that = this; + google.maps.event.addDomListener(this.markerContent_, 'click', function(e) { + google.maps.event.trigger(that, 'click'); + }); + google.maps.event.addDomListener(this.markerContent_, 'mouseover', function(e) { + google.maps.event.trigger(that, 'mouseover'); + }); + google.maps.event.addDomListener(this.markerContent_, 'mouseout', function(e) { + google.maps.event.trigger(that, 'mouseout'); + }); + } + + this.ready_ = true; + this.content_changed(); + this.flat_changed(); + this.draggable_changed(); + + var panes = this.getPanes(); + if (panes) { + panes.overlayMouseTarget.appendChild(this.markerWrapper_); + } + + google.maps.event.trigger(this, 'ready'); +}; +RichMarker.prototype['onAdd'] = RichMarker.prototype.onAdd; + + +/** + * Impelementing the interface. + */ +RichMarker.prototype.draw = function() { + if (!this.ready_ || this.dragging_) { + return; + } + + var projection = this.getProjection(); + + if (!projection) { + // The map projection is not ready yet so do nothing + return; + } + + var latLng = /** @type {google.maps.LatLng} */ (this.get('position')); + var pos = projection.fromLatLngToDivPixel(latLng); + + var offset = this.getOffset_(); + this.markerWrapper_.style['top'] = (pos.y + offset.height) + 'px'; + this.markerWrapper_.style['left'] = (pos.x + offset.width) + 'px'; + + var height = this.markerContent_.offsetHeight; + var width = this.markerContent_.offsetWidth; + + if (width != this.get('width')) { + this.set('width', width); + } + + if (height != this.get('height')) { + this.set('height', height); + } +}; +RichMarker.prototype['draw'] = RichMarker.prototype.draw; + + +/** + * Removing a marker from the map. + * Implementing the interface. + */ +RichMarker.prototype.onRemove = function() { + if (this.markerWrapper_ && this.markerWrapper_.parentNode) { + this.markerWrapper_.parentNode.removeChild(this.markerWrapper_); + } + this.removeDragListeners_(); +}; +RichMarker.prototype['onRemove'] = RichMarker.prototype.onRemove; + + +/** + * RichMarker Anchor positions + * @enum {number} + */ +var RichMarkerPosition = { + 'TOP_LEFT': 1, + 'TOP': 2, + 'TOP_RIGHT': 3, + 'LEFT': 4, + 'MIDDLE': 5, + 'RIGHT': 6, + 'BOTTOM_LEFT': 7, + 'BOTTOM': 8, + 'BOTTOM_RIGHT': 9 +}; +window['RichMarkerPosition'] = RichMarkerPosition; + + + //TODO: export / passthese on in the service instead of window + window.InfoBox = InfoBox; + window.Cluster = Cluster; + window.ClusterIcon = ClusterIcon; + window.MarkerClusterer = MarkerClusterer; + window.MarkerLabel_ = MarkerLabel_; + window.MarkerWithLabel = MarkerWithLabel; + window.RichMarker = RichMarker; + }(); + //END REPLACE + }) + }; +}); +;/******/ (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] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = 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; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + /* istanbul ignore next */ + angular.module('uiGmapgoogle-maps.wrapped') + .service('uiGmapDataStructures', function() { + return { + Graph: __webpack_require__(1).Graph, + Queue: __webpack_require__(1).Queue + }; + }); + + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + (function() { + module.exports = { + Graph: __webpack_require__(2), + Heap: __webpack_require__(3), + LinkedList: __webpack_require__(4), + Map: __webpack_require__(5), + Queue: __webpack_require__(6), + RedBlackTree: __webpack_require__(7), + Trie: __webpack_require__(8) + }; + + }).call(this); + + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + /* + Graph implemented as a modified incidence list. O(1) for every typical + operation except `removeNode()` at O(E) where E is the number of edges. + + ## Overview example: + + ```js + var graph = new Graph; + graph.addNode('A'); // => a node object. For more info, log the output or check + // the documentation for addNode + graph.addNode('B'); + graph.addNode('C'); + graph.addEdge('A', 'C'); // => an edge object + graph.addEdge('A', 'B'); + graph.getEdge('B', 'A'); // => undefined. Directed edge! + graph.getEdge('A', 'B'); // => the edge object previously added + graph.getEdge('A', 'B').weight = 2 // weight is the only built-in handy property + // of an edge object. Feel free to attach + // other properties + graph.getInEdgesOf('B'); // => array of edge objects, in this case only one; + // connecting A to B + graph.getOutEdgesOf('A'); // => array of edge objects, one to B and one to C + graph.getAllEdgesOf('A'); // => all the in and out edges. Edge directed toward + // the node itself are only counted once + forEachNode(function(nodeObject) { + console.log(node); + }); + forEachEdge(function(edgeObject) { + console.log(edgeObject); + }); + graph.removeNode('C'); // => 'C'. The edge between A and C also removed + graph.removeEdge('A', 'B'); // => the edge object removed + ``` + + ## Properties: + + - nodeSize: total number of nodes. + - edgeSize: total number of edges. + */ + + + (function() { + var Graph, + __hasProp = {}.hasOwnProperty; + + Graph = (function() { + function Graph() { + this._nodes = {}; + this.nodeSize = 0; + this.edgeSize = 0; + } + + Graph.prototype.addNode = function(id) { + /* + The `id` is a unique identifier for the node, and should **not** change + after it's added. It will be used for adding, retrieving and deleting + related edges too. + + **Note** that, internally, the ids are kept in an object. JavaScript's + object hashes the id `'2'` and `2` to the same key, so please stick to a + simple id data type such as number or string. + + _Returns:_ the node object. Feel free to attach additional custom properties + on it for graph algorithms' needs. **Undefined if node id already exists**, + as to avoid accidental overrides. + */ + + if (!this._nodes[id]) { + this.nodeSize++; + return this._nodes[id] = { + _outEdges: {}, + _inEdges: {} + }; + } + }; + + Graph.prototype.getNode = function(id) { + /* + _Returns:_ the node object. Feel free to attach additional custom properties + on it for graph algorithms' needs. + */ + + return this._nodes[id]; + }; + + Graph.prototype.removeNode = function(id) { + /* + _Returns:_ the node object removed, or undefined if it didn't exist in the + first place. + */ + + var inEdgeId, nodeToRemove, outEdgeId, _ref, _ref1; + nodeToRemove = this._nodes[id]; + if (!nodeToRemove) { + return; + } else { + _ref = nodeToRemove._outEdges; + for (outEdgeId in _ref) { + if (!__hasProp.call(_ref, outEdgeId)) continue; + this.removeEdge(id, outEdgeId); + } + _ref1 = nodeToRemove._inEdges; + for (inEdgeId in _ref1) { + if (!__hasProp.call(_ref1, inEdgeId)) continue; + this.removeEdge(inEdgeId, id); + } + this.nodeSize--; + delete this._nodes[id]; + } + return nodeToRemove; + }; + + Graph.prototype.addEdge = function(fromId, toId, weight) { + var edgeToAdd, fromNode, toNode; + if (weight == null) { + weight = 1; + } + /* + `fromId` and `toId` are the node id specified when it was created using + `addNode()`. `weight` is optional and defaults to 1. Ignoring it effectively + makes this an unweighted graph. Under the hood, `weight` is just a normal + property of the edge object. + + _Returns:_ the edge object created. Feel free to attach additional custom + properties on it for graph algorithms' needs. **Or undefined** if the nodes + of id `fromId` or `toId` aren't found, or if an edge already exists between + the two nodes. + */ + + if (this.getEdge(fromId, toId)) { + return; + } + fromNode = this._nodes[fromId]; + toNode = this._nodes[toId]; + if (!fromNode || !toNode) { + return; + } + edgeToAdd = { + weight: weight + }; + fromNode._outEdges[toId] = edgeToAdd; + toNode._inEdges[fromId] = edgeToAdd; + this.edgeSize++; + return edgeToAdd; + }; + + Graph.prototype.getEdge = function(fromId, toId) { + /* + _Returns:_ the edge object, or undefined if the nodes of id `fromId` or + `toId` aren't found. + */ + + var fromNode, toNode; + fromNode = this._nodes[fromId]; + toNode = this._nodes[toId]; + if (!fromNode || !toNode) { + + } else { + return fromNode._outEdges[toId]; + } + }; + + Graph.prototype.removeEdge = function(fromId, toId) { + /* + _Returns:_ the edge object removed, or undefined of edge wasn't found. + */ + + var edgeToDelete, fromNode, toNode; + fromNode = this._nodes[fromId]; + toNode = this._nodes[toId]; + edgeToDelete = this.getEdge(fromId, toId); + if (!edgeToDelete) { + return; + } + delete fromNode._outEdges[toId]; + delete toNode._inEdges[fromId]; + this.edgeSize--; + return edgeToDelete; + }; + + Graph.prototype.getInEdgesOf = function(nodeId) { + /* + _Returns:_ an array of edge objects that are directed toward the node, or + empty array if no such edge or node exists. + */ + + var fromId, inEdges, toNode, _ref; + toNode = this._nodes[nodeId]; + inEdges = []; + _ref = toNode != null ? toNode._inEdges : void 0; + for (fromId in _ref) { + if (!__hasProp.call(_ref, fromId)) continue; + inEdges.push(this.getEdge(fromId, nodeId)); + } + return inEdges; + }; + + Graph.prototype.getOutEdgesOf = function(nodeId) { + /* + _Returns:_ an array of edge objects that go out of the node, or empty array + if no such edge or node exists. + */ + + var fromNode, outEdges, toId, _ref; + fromNode = this._nodes[nodeId]; + outEdges = []; + _ref = fromNode != null ? fromNode._outEdges : void 0; + for (toId in _ref) { + if (!__hasProp.call(_ref, toId)) continue; + outEdges.push(this.getEdge(nodeId, toId)); + } + return outEdges; + }; + + Graph.prototype.getAllEdgesOf = function(nodeId) { + /* + **Note:** not the same as concatenating `getInEdgesOf()` and + `getOutEdgesOf()`. Some nodes might have an edge pointing toward itself. + This method solves that duplication. + + _Returns:_ an array of edge objects linked to the node, no matter if they're + outgoing or coming. Duplicate edge created by self-pointing nodes are + removed. Only one copy stays. Empty array if node has no edge. + */ + + var i, inEdges, outEdges, selfEdge, _i, _ref, _ref1; + inEdges = this.getInEdgesOf(nodeId); + outEdges = this.getOutEdgesOf(nodeId); + if (inEdges.length === 0) { + return outEdges; + } + selfEdge = this.getEdge(nodeId, nodeId); + for (i = _i = 0, _ref = inEdges.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + if (inEdges[i] === selfEdge) { + _ref1 = [inEdges[inEdges.length - 1], inEdges[i]], inEdges[i] = _ref1[0], inEdges[inEdges.length - 1] = _ref1[1]; + inEdges.pop(); + break; + } + } + return inEdges.concat(outEdges); + }; + + Graph.prototype.forEachNode = function(operation) { + /* + Traverse through the graph in an arbitrary manner, visiting each node once. + Pass a function of the form `fn(nodeObject, nodeId)`. + + _Returns:_ undefined. + */ + + var nodeId, nodeObject, _ref; + _ref = this._nodes; + for (nodeId in _ref) { + if (!__hasProp.call(_ref, nodeId)) continue; + nodeObject = _ref[nodeId]; + operation(nodeObject, nodeId); + } + }; + + Graph.prototype.forEachEdge = function(operation) { + /* + Traverse through the graph in an arbitrary manner, visiting each edge once. + Pass a function of the form `fn(edgeObject)`. + + _Returns:_ undefined. + */ + + var edgeObject, nodeId, nodeObject, toId, _ref, _ref1; + _ref = this._nodes; + for (nodeId in _ref) { + if (!__hasProp.call(_ref, nodeId)) continue; + nodeObject = _ref[nodeId]; + _ref1 = nodeObject._outEdges; + for (toId in _ref1) { + if (!__hasProp.call(_ref1, toId)) continue; + edgeObject = _ref1[toId]; + operation(edgeObject); + } + } + }; + + return Graph; + + })(); + + module.exports = Graph; + + }).call(this); + + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + /* + Minimum heap, i.e. smallest node at root. + + **Note:** does not accept null or undefined. This is by design. Those values + cause comparison problems and might report false negative during extraction. + + ## Overview example: + + ```js + var heap = new Heap([5, 6, 3, 4]); + heap.add(10); // => 10 + heap.removeMin(); // => 3 + heap.peekMin(); // => 4 + ``` + + ## Properties: + + - size: total number of items. + */ + + + (function() { + var Heap, _leftChild, _parent, _rightChild; + + Heap = (function() { + function Heap(dataToHeapify) { + var i, item, _i, _j, _len, _ref; + if (dataToHeapify == null) { + dataToHeapify = []; + } + /* + Pass an optional array to be heapified. Takes only O(n) time. + */ + + this._data = [void 0]; + for (_i = 0, _len = dataToHeapify.length; _i < _len; _i++) { + item = dataToHeapify[_i]; + if (item != null) { + this._data.push(item); + } + } + if (this._data.length > 1) { + for (i = _j = 2, _ref = this._data.length; 2 <= _ref ? _j < _ref : _j > _ref; i = 2 <= _ref ? ++_j : --_j) { + this._upHeap(i); + } + } + this.size = this._data.length - 1; + } + + Heap.prototype.add = function(value) { + /* + **Remember:** rejects null and undefined for mentioned reasons. + + _Returns:_ the value added. + */ + + if (value == null) { + return; + } + this._data.push(value); + this._upHeap(this._data.length - 1); + this.size++; + return value; + }; + + Heap.prototype.removeMin = function() { + /* + _Returns:_ the smallest item (the root). + */ + + var min; + if (this._data.length === 1) { + return; + } + this.size--; + if (this._data.length === 2) { + return this._data.pop(); + } + min = this._data[1]; + this._data[1] = this._data.pop(); + this._downHeap(); + return min; + }; + + Heap.prototype.peekMin = function() { + /* + Check the smallest item without removing it. + + _Returns:_ the smallest item (the root). + */ + + return this._data[1]; + }; + + Heap.prototype._upHeap = function(index) { + var valueHolder, _ref; + valueHolder = this._data[index]; + while (this._data[index] < this._data[_parent(index)] && index > 1) { + _ref = [this._data[_parent(index)], this._data[index]], this._data[index] = _ref[0], this._data[_parent(index)] = _ref[1]; + index = _parent(index); + } + }; + + Heap.prototype._downHeap = function() { + var currentIndex, smallerChildIndex, _ref; + currentIndex = 1; + while (_leftChild(currentIndex < this._data.length)) { + smallerChildIndex = _leftChild(currentIndex); + if (smallerChildIndex < this._data.length - 1) { + if (this._data[_rightChild(currentIndex)] < this._data[smallerChildIndex]) { + smallerChildIndex = _rightChild(currentIndex); + } + } + if (this._data[smallerChildIndex] < this._data[currentIndex]) { + _ref = [this._data[currentIndex], this._data[smallerChildIndex]], this._data[smallerChildIndex] = _ref[0], this._data[currentIndex] = _ref[1]; + currentIndex = smallerChildIndex; + } else { + break; + } + } + }; + + return Heap; + + })(); + + _parent = function(index) { + return index >> 1; + }; + + _leftChild = function(index) { + return index << 1; + }; + + _rightChild = function(index) { + return (index << 1) + 1; + }; + + module.exports = Heap; + + }).call(this); + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + /* + Doubly Linked. + + ## Overview example: + + ```js + var list = new LinkedList([5, 4, 9]); + list.add(12); // => 12 + list.head.next.value; // => 4 + list.tail.value; // => 12 + list.at(-1); // => 12 + list.removeAt(2); // => 9 + list.remove(4); // => 4 + list.indexOf(5); // => 0 + list.add(5, 1); // => 5. Second 5 at position 1. + list.indexOf(5, 1); // => 1 + ``` + + ## Properties: + + - head: first item. + - tail: last item. + - size: total number of items. + - item.value: value passed to the item when calling `add()`. + - item.prev: previous item. + - item.next: next item. + */ + + + (function() { + var LinkedList; + + LinkedList = (function() { + function LinkedList(valuesToAdd) { + var value, _i, _len; + if (valuesToAdd == null) { + valuesToAdd = []; + } + /* + Can pass an array of elements to link together during `new LinkedList()` + initiation. + */ + + this.head = { + prev: void 0, + value: void 0, + next: void 0 + }; + this.tail = { + prev: void 0, + value: void 0, + next: void 0 + }; + this.size = 0; + for (_i = 0, _len = valuesToAdd.length; _i < _len; _i++) { + value = valuesToAdd[_i]; + this.add(value); + } + } + + LinkedList.prototype.at = function(position) { + /* + Get the item at `position` (optional). Accepts negative index: + + ```js + myList.at(-1); // Returns the last element. + ``` + However, passing a negative index that surpasses the boundary will return + undefined: + + ```js + myList = new LinkedList([2, 6, 8, 3]) + myList.at(-5); // Undefined. + myList.at(-4); // 2. + ``` + _Returns:_ item gotten, or undefined if not found. + */ + + var currentNode, i, _i, _j, _ref; + if (!((-this.size <= position && position < this.size))) { + return; + } + position = this._adjust(position); + if (position * 2 < this.size) { + currentNode = this.head; + for (i = _i = 1; _i <= position; i = _i += 1) { + currentNode = currentNode.next; + } + } else { + currentNode = this.tail; + for (i = _j = 1, _ref = this.size - position - 1; _j <= _ref; i = _j += 1) { + currentNode = currentNode.prev; + } + } + return currentNode; + }; + + LinkedList.prototype.add = function(value, position) { + var currentNode, nodeToAdd, _ref, _ref1, _ref2; + if (position == null) { + position = this.size; + } + /* + Add a new item at `position` (optional). Defaults to adding at the end. + `position`, just like in `at()`, can be negative (within the negative + boundary). Position specifies the place the value's going to be, and the old + node will be pushed higher. `add(-2)` on list of size 7 is the same as + `add(5)`. + + _Returns:_ item added. + */ + + if (!((-this.size <= position && position <= this.size))) { + return; + } + nodeToAdd = { + value: value + }; + position = this._adjust(position); + if (this.size === 0) { + this.head = nodeToAdd; + } else { + if (position === 0) { + _ref = [nodeToAdd, this.head, nodeToAdd], this.head.prev = _ref[0], nodeToAdd.next = _ref[1], this.head = _ref[2]; + } else { + currentNode = this.at(position - 1); + _ref1 = [currentNode.next, nodeToAdd, nodeToAdd, currentNode], nodeToAdd.next = _ref1[0], (_ref2 = currentNode.next) != null ? _ref2.prev = _ref1[1] : void 0, currentNode.next = _ref1[2], nodeToAdd.prev = _ref1[3]; + } + } + if (position === this.size) { + this.tail = nodeToAdd; + } + this.size++; + return value; + }; + + LinkedList.prototype.removeAt = function(position) { + var currentNode, valueToReturn, _ref; + if (position == null) { + position = this.size - 1; + } + /* + Remove an item at index `position` (optional). Defaults to the last item. + Index can be negative (within the boundary). + + _Returns:_ item removed. + */ + + if (!((-this.size <= position && position < this.size))) { + return; + } + if (this.size === 0) { + return; + } + position = this._adjust(position); + if (this.size === 1) { + valueToReturn = this.head.value; + this.head.value = this.tail.value = void 0; + } else { + if (position === 0) { + valueToReturn = this.head.value; + this.head = this.head.next; + this.head.prev = void 0; + } else { + currentNode = this.at(position); + valueToReturn = currentNode.value; + currentNode.prev.next = currentNode.next; + if ((_ref = currentNode.next) != null) { + _ref.prev = currentNode.prev; + } + if (position === this.size - 1) { + this.tail = currentNode.prev; + } + } + } + this.size--; + return valueToReturn; + }; + + LinkedList.prototype.remove = function(value) { + /* + Remove the item using its value instead of position. **Will remove the fist + occurrence of `value`.** + + _Returns:_ the value, or undefined if value's not found. + */ + + var currentNode; + if (value == null) { + return; + } + currentNode = this.head; + while (currentNode && currentNode.value !== value) { + currentNode = currentNode.next; + } + if (!currentNode) { + return; + } + if (this.size === 1) { + this.head.value = this.tail.value = void 0; + } else if (currentNode === this.head) { + this.head = this.head.next; + this.head.prev = void 0; + } else if (currentNode === this.tail) { + this.tail = this.tail.prev; + this.tail.next = void 0; + } else { + currentNode.prev.next = currentNode.next; + currentNode.next.prev = currentNode.prev; + } + this.size--; + return value; + }; + + LinkedList.prototype.indexOf = function(value, startingPosition) { + var currentNode, position; + if (startingPosition == null) { + startingPosition = 0; + } + /* + Find the index of an item, similarly to `array.indexOf()`. Defaults to start + searching from the beginning, by can start at another position by passing + `startingPosition`. This parameter can also be negative; but unlike the + other methods of this class, `startingPosition` (optional) can be as small + as desired; a value of -999 for a list of size 5 will start searching + normally, at the beginning. + + **Note:** searches forwardly, **not** backwardly, i.e: + + ```js + var myList = new LinkedList([2, 3, 1, 4, 3, 5]) + myList.indexOf(3, -3); // Returns 4, not 1 + ``` + _Returns:_ index of item found, or -1 if not found. + */ + + if (((this.head.value == null) && !this.head.next) || startingPosition >= this.size) { + return -1; + } + startingPosition = Math.max(0, this._adjust(startingPosition)); + currentNode = this.at(startingPosition); + position = startingPosition; + while (currentNode) { + if (currentNode.value === value) { + break; + } + currentNode = currentNode.next; + position++; + } + if (position === this.size) { + return -1; + } else { + return position; + } + }; + + LinkedList.prototype._adjust = function(position) { + if (position < 0) { + return this.size + position; + } else { + return position; + } + }; + + return LinkedList; + + })(); + + module.exports = LinkedList; + + }).call(this); + + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + + /* + Kind of a stopgap measure for the upcoming [JavaScript + Map](http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets) + + **Note:** due to JavaScript's limitations, hashing something other than Boolean, + Number, String, Undefined, Null, RegExp, Function requires a hack that inserts a + hidden unique property into the object. This means `set`, `get`, `has` and + `delete` must employ the same object, and not a mere identical copy as in the + case of, say, a string. + + ## Overview example: + + ```js + var map = new Map({'alice': 'wonderland', 20: 'ok'}); + map.set('20', 5); // => 5 + map.get('20'); // => 5 + map.has('alice'); // => true + map.delete(20) // => true + var arr = [1, 2]; + map.add(arr, 'goody'); // => 'goody' + map.has(arr); // => true + map.has([1, 2]); // => false. Needs to compare by reference + map.forEach(function(key, value) { + console.log(key, value); + }); + ``` + + ## Properties: + + - size: The total number of `(key, value)` pairs. + */ + + + (function() { + var Map, SPECIAL_TYPE_KEY_PREFIX, _extractDataType, _isSpecialType, + __hasProp = {}.hasOwnProperty; + + SPECIAL_TYPE_KEY_PREFIX = '_mapId_'; + + Map = (function() { + Map._mapIdTracker = 0; + + Map._newMapId = function() { + return this._mapIdTracker++; + }; + + function Map(objectToMap) { + /* + Pass an optional object whose (key, value) pair will be hashed. **Careful** + not to pass something like {5: 'hi', '5': 'hello'}, since JavaScript's + native object behavior will crush the first 5 property before it gets to + constructor. + */ + + var key, value; + this._content = {}; + this._itemId = 0; + this._id = Map._newMapId(); + this.size = 0; + for (key in objectToMap) { + if (!__hasProp.call(objectToMap, key)) continue; + value = objectToMap[key]; + this.set(key, value); + } + } + + Map.prototype.hash = function(key, makeHash) { + var propertyForMap, type; + if (makeHash == null) { + makeHash = false; + } + /* + The hash function for hashing keys is public. Feel free to replace it with + your own. The `makeHash` parameter is optional and accepts a boolean + (defaults to `false`) indicating whether or not to produce a new hash (for + the first use, naturally). + + _Returns:_ the hash. + */ + + type = _extractDataType(key); + if (_isSpecialType(key)) { + propertyForMap = SPECIAL_TYPE_KEY_PREFIX + this._id; + if (makeHash && !key[propertyForMap]) { + key[propertyForMap] = this._itemId++; + } + return propertyForMap + '_' + key[propertyForMap]; + } else { + return type + '_' + key; + } + }; + + Map.prototype.set = function(key, value) { + /* + _Returns:_ value. + */ + + if (!this.has(key)) { + this.size++; + } + this._content[this.hash(key, true)] = [value, key]; + return value; + }; + + Map.prototype.get = function(key) { + /* + _Returns:_ value corresponding to the key, or undefined if not found. + */ + + var _ref; + return (_ref = this._content[this.hash(key)]) != null ? _ref[0] : void 0; + }; + + Map.prototype.has = function(key) { + /* + Check whether a value exists for the key. + + _Returns:_ true or false. + */ + + return this.hash(key) in this._content; + }; + + Map.prototype["delete"] = function(key) { + /* + Remove the (key, value) pair. + + _Returns:_ **true or false**. Unlike most of this library, this method + doesn't return the deleted value. This is so that it conforms to the future + JavaScript `map.delete()`'s behavior. + */ + + var hashedKey; + hashedKey = this.hash(key); + if (hashedKey in this._content) { + delete this._content[hashedKey]; + if (_isSpecialType(key)) { + delete key[SPECIAL_TYPE_KEY_PREFIX + this._id]; + } + this.size--; + return true; + } + return false; + }; + + Map.prototype.forEach = function(operation) { + /* + Traverse through the map. Pass a function of the form `fn(key, value)`. + + _Returns:_ undefined. + */ + + var key, value, _ref; + _ref = this._content; + for (key in _ref) { + if (!__hasProp.call(_ref, key)) continue; + value = _ref[key]; + operation(value[1], value[0]); + } + }; + + return Map; + + })(); + + _isSpecialType = function(key) { + var simpleHashableTypes, simpleType, type, _i, _len; + simpleHashableTypes = ['Boolean', 'Number', 'String', 'Undefined', 'Null', 'RegExp', 'Function']; + type = _extractDataType(key); + for (_i = 0, _len = simpleHashableTypes.length; _i < _len; _i++) { + simpleType = simpleHashableTypes[_i]; + if (type === simpleType) { + return false; + } + } + return true; + }; + + _extractDataType = function(type) { + return Object.prototype.toString.apply(type).match(/\[object (.+)\]/)[1]; + }; + + module.exports = Map; + + }).call(this); + + +/***/ }, +/* 6 */ +/***/ function(module, exports) { + + /* + Amortized O(1) dequeue! + + ## Overview example: + + ```js + var queue = new Queue([1, 6, 4]); + queue.enqueue(10); // => 10 + queue.dequeue(); // => 1 + queue.dequeue(); // => 6 + queue.dequeue(); // => 4 + queue.peek(); // => 10 + queue.dequeue(); // => 10 + queue.peek(); // => undefined + ``` + + ## Properties: + + - size: The total number of items. + */ + + + (function() { + var Queue; + + Queue = (function() { + function Queue(initialArray) { + if (initialArray == null) { + initialArray = []; + } + /* + Pass an optional array to be transformed into a queue. The item at index 0 + is the first to be dequeued. + */ + + this._content = initialArray; + this._dequeueIndex = 0; + this.size = this._content.length; + } + + Queue.prototype.enqueue = function(item) { + /* + _Returns:_ the item. + */ + + this.size++; + this._content.push(item); + return item; + }; + + Queue.prototype.dequeue = function() { + /* + _Returns:_ the dequeued item. + */ + + var itemToDequeue; + if (this.size === 0) { + return; + } + this.size--; + itemToDequeue = this._content[this._dequeueIndex]; + this._dequeueIndex++; + if (this._dequeueIndex * 2 > this._content.length) { + this._content = this._content.slice(this._dequeueIndex); + this._dequeueIndex = 0; + } + return itemToDequeue; + }; + + Queue.prototype.peek = function() { + /* + Check the next item to be dequeued, without removing it. + + _Returns:_ the item. + */ + + return this._content[this._dequeueIndex]; + }; + + return Queue; + + })(); + + module.exports = Queue; + + }).call(this); + + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + + /* + Credit to Wikipedia's article on [Red-black + tree](http://en.wikipedia.org/wiki/Red–black_tree) + + **Note:** doesn't handle duplicate entries, undefined and null. This is by + design. + + ## Overview example: + + ```js + var rbt = new RedBlackTree([7, 5, 1, 8]); + rbt.add(2); // => 2 + rbt.add(10); // => 10 + rbt.has(5); // => true + rbt.peekMin(); // => 1 + rbt.peekMax(); // => 10 + rbt.removeMin(); // => 1 + rbt.removeMax(); // => 10 + rbt.remove(8); // => 8 + ``` + + ## Properties: + + - size: The total number of items. + */ + + + (function() { + var BLACK, NODE_FOUND, NODE_TOO_BIG, NODE_TOO_SMALL, RED, RedBlackTree, STOP_SEARCHING, _findNode, _grandParentOf, _isLeft, _leftOrRight, _peekMaxNode, _peekMinNode, _siblingOf, _uncleOf; + + NODE_FOUND = 0; + + NODE_TOO_BIG = 1; + + NODE_TOO_SMALL = 2; + + STOP_SEARCHING = 3; + + RED = 1; + + BLACK = 2; + + RedBlackTree = (function() { + function RedBlackTree(valuesToAdd) { + var value, _i, _len; + if (valuesToAdd == null) { + valuesToAdd = []; + } + /* + Pass an optional array to be turned into binary tree. **Note:** does not + accept duplicate, undefined and null. + */ + + this._root; + this.size = 0; + for (_i = 0, _len = valuesToAdd.length; _i < _len; _i++) { + value = valuesToAdd[_i]; + if (value != null) { + this.add(value); + } + } + } + + RedBlackTree.prototype.add = function(value) { + /* + Again, make sure to not pass a value already in the tree, or undefined, or + null. + + _Returns:_ value added. + */ + + var currentNode, foundNode, nodeToInsert, _ref; + if (value == null) { + return; + } + this.size++; + nodeToInsert = { + value: value, + _color: RED + }; + if (!this._root) { + this._root = nodeToInsert; + } else { + foundNode = _findNode(this._root, function(node) { + if (value === node.value) { + return NODE_FOUND; + } else { + if (value < node.value) { + if (node._left) { + return NODE_TOO_BIG; + } else { + nodeToInsert._parent = node; + node._left = nodeToInsert; + return STOP_SEARCHING; + } + } else { + if (node._right) { + return NODE_TOO_SMALL; + } else { + nodeToInsert._parent = node; + node._right = nodeToInsert; + return STOP_SEARCHING; + } + } + } + }); + if (foundNode != null) { + return; + } + } + currentNode = nodeToInsert; + while (true) { + if (currentNode === this._root) { + currentNode._color = BLACK; + break; + } + if (currentNode._parent._color === BLACK) { + break; + } + if (((_ref = _uncleOf(currentNode)) != null ? _ref._color : void 0) === RED) { + currentNode._parent._color = BLACK; + _uncleOf(currentNode)._color = BLACK; + _grandParentOf(currentNode)._color = RED; + currentNode = _grandParentOf(currentNode); + continue; + } + if (!_isLeft(currentNode) && _isLeft(currentNode._parent)) { + this._rotateLeft(currentNode._parent); + currentNode = currentNode._left; + } else if (_isLeft(currentNode) && !_isLeft(currentNode._parent)) { + this._rotateRight(currentNode._parent); + currentNode = currentNode._right; + } + currentNode._parent._color = BLACK; + _grandParentOf(currentNode)._color = RED; + if (_isLeft(currentNode)) { + this._rotateRight(_grandParentOf(currentNode)); + } else { + this._rotateLeft(_grandParentOf(currentNode)); + } + break; + } + return value; + }; + + RedBlackTree.prototype.has = function(value) { + /* + _Returns:_ true or false. + */ + + var foundNode; + foundNode = _findNode(this._root, function(node) { + if (value === node.value) { + return NODE_FOUND; + } else if (value < node.value) { + return NODE_TOO_BIG; + } else { + return NODE_TOO_SMALL; + } + }); + if (foundNode) { + return true; + } else { + return false; + } + }; + + RedBlackTree.prototype.peekMin = function() { + /* + Check the minimum value without removing it. + + _Returns:_ the minimum value. + */ + + var _ref; + return (_ref = _peekMinNode(this._root)) != null ? _ref.value : void 0; + }; + + RedBlackTree.prototype.peekMax = function() { + /* + Check the maximum value without removing it. + + _Returns:_ the maximum value. + */ + + var _ref; + return (_ref = _peekMaxNode(this._root)) != null ? _ref.value : void 0; + }; + + RedBlackTree.prototype.remove = function(value) { + /* + _Returns:_ the value removed, or undefined if the value's not found. + */ + + var foundNode; + foundNode = _findNode(this._root, function(node) { + if (value === node.value) { + return NODE_FOUND; + } else if (value < node.value) { + return NODE_TOO_BIG; + } else { + return NODE_TOO_SMALL; + } + }); + if (!foundNode) { + return; + } + this._removeNode(this._root, foundNode); + this.size--; + return value; + }; + + RedBlackTree.prototype.removeMin = function() { + /* + _Returns:_ smallest item removed, or undefined if tree's empty. + */ + + var nodeToRemove, valueToReturn; + nodeToRemove = _peekMinNode(this._root); + if (!nodeToRemove) { + return; + } + valueToReturn = nodeToRemove.value; + this._removeNode(this._root, nodeToRemove); + return valueToReturn; + }; + + RedBlackTree.prototype.removeMax = function() { + /* + _Returns:_ biggest item removed, or undefined if tree's empty. + */ + + var nodeToRemove, valueToReturn; + nodeToRemove = _peekMaxNode(this._root); + if (!nodeToRemove) { + return; + } + valueToReturn = nodeToRemove.value; + this._removeNode(this._root, nodeToRemove); + return valueToReturn; + }; + + RedBlackTree.prototype._removeNode = function(root, node) { + var sibling, successor, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7; + if (node._left && node._right) { + successor = _peekMinNode(node._right); + node.value = successor.value; + node = successor; + } + successor = node._left || node._right; + if (!successor) { + successor = { + color: BLACK, + _right: void 0, + _left: void 0, + isLeaf: true + }; + } + successor._parent = node._parent; + if ((_ref = node._parent) != null) { + _ref[_leftOrRight(node)] = successor; + } + if (node._color === BLACK) { + if (successor._color === RED) { + successor._color = BLACK; + if (!successor._parent) { + this._root = successor; + } + } else { + while (true) { + if (!successor._parent) { + if (!successor.isLeaf) { + this._root = successor; + } else { + this._root = void 0; + } + break; + } + sibling = _siblingOf(successor); + if ((sibling != null ? sibling._color : void 0) === RED) { + successor._parent._color = RED; + sibling._color = BLACK; + if (_isLeft(successor)) { + this._rotateLeft(successor._parent); + } else { + this._rotateRight(successor._parent); + } + } + sibling = _siblingOf(successor); + if (successor._parent._color === BLACK && (!sibling || (sibling._color === BLACK && (!sibling._left || sibling._left._color === BLACK) && (!sibling._right || sibling._right._color === BLACK)))) { + if (sibling != null) { + sibling._color = RED; + } + if (successor.isLeaf) { + successor._parent[_leftOrRight(successor)] = void 0; + } + successor = successor._parent; + continue; + } + if (successor._parent._color === RED && (!sibling || (sibling._color === BLACK && (!sibling._left || ((_ref1 = sibling._left) != null ? _ref1._color : void 0) === BLACK) && (!sibling._right || ((_ref2 = sibling._right) != null ? _ref2._color : void 0) === BLACK)))) { + if (sibling != null) { + sibling._color = RED; + } + successor._parent._color = BLACK; + break; + } + if ((sibling != null ? sibling._color : void 0) === BLACK) { + if (_isLeft(successor) && (!sibling._right || sibling._right._color === BLACK) && ((_ref3 = sibling._left) != null ? _ref3._color : void 0) === RED) { + sibling._color = RED; + if ((_ref4 = sibling._left) != null) { + _ref4._color = BLACK; + } + this._rotateRight(sibling); + } else if (!_isLeft(successor) && (!sibling._left || sibling._left._color === BLACK) && ((_ref5 = sibling._right) != null ? _ref5._color : void 0) === RED) { + sibling._color = RED; + if ((_ref6 = sibling._right) != null) { + _ref6._color = BLACK; + } + this._rotateLeft(sibling); + } + break; + } + sibling = _siblingOf(successor); + sibling._color = successor._parent._color; + if (_isLeft(successor)) { + sibling._right._color = BLACK; + this._rotateRight(successor._parent); + } else { + sibling._left._color = BLACK; + this._rotateLeft(successor._parent); + } + } + } + } + if (successor.isLeaf) { + return (_ref7 = successor._parent) != null ? _ref7[_leftOrRight(successor)] = void 0 : void 0; + } + }; + + RedBlackTree.prototype._rotateLeft = function(node) { + var _ref, _ref1; + if ((_ref = node._parent) != null) { + _ref[_leftOrRight(node)] = node._right; + } + node._right._parent = node._parent; + node._parent = node._right; + node._right = node._right._left; + node._parent._left = node; + if ((_ref1 = node._right) != null) { + _ref1._parent = node; + } + if (node._parent._parent == null) { + return this._root = node._parent; + } + }; + + RedBlackTree.prototype._rotateRight = function(node) { + var _ref, _ref1; + if ((_ref = node._parent) != null) { + _ref[_leftOrRight(node)] = node._left; + } + node._left._parent = node._parent; + node._parent = node._left; + node._left = node._left._right; + node._parent._right = node; + if ((_ref1 = node._left) != null) { + _ref1._parent = node; + } + if (node._parent._parent == null) { + return this._root = node._parent; + } + }; + + return RedBlackTree; + + })(); + + _isLeft = function(node) { + return node === node._parent._left; + }; + + _leftOrRight = function(node) { + if (_isLeft(node)) { + return '_left'; + } else { + return '_right'; + } + }; + + _findNode = function(startingNode, comparator) { + var comparisonResult, currentNode, foundNode; + currentNode = startingNode; + foundNode = void 0; + while (currentNode) { + comparisonResult = comparator(currentNode); + if (comparisonResult === NODE_FOUND) { + foundNode = currentNode; + break; + } + if (comparisonResult === NODE_TOO_BIG) { + currentNode = currentNode._left; + } else if (comparisonResult === NODE_TOO_SMALL) { + currentNode = currentNode._right; + } else if (comparisonResult === STOP_SEARCHING) { + break; + } + } + return foundNode; + }; + + _peekMinNode = function(startingNode) { + return _findNode(startingNode, function(node) { + if (node._left) { + return NODE_TOO_BIG; + } else { + return NODE_FOUND; + } + }); + }; + + _peekMaxNode = function(startingNode) { + return _findNode(startingNode, function(node) { + if (node._right) { + return NODE_TOO_SMALL; + } else { + return NODE_FOUND; + } + }); + }; + + _grandParentOf = function(node) { + var _ref; + return (_ref = node._parent) != null ? _ref._parent : void 0; + }; + + _uncleOf = function(node) { + if (!_grandParentOf(node)) { + return; + } + if (_isLeft(node._parent)) { + return _grandParentOf(node)._right; + } else { + return _grandParentOf(node)._left; + } + }; + + _siblingOf = function(node) { + if (_isLeft(node)) { + return node._parent._right; + } else { + return node._parent._left; + } + }; + + module.exports = RedBlackTree; + + }).call(this); + + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + /* + Good for fast insertion/removal/lookup of strings. + + ## Overview example: + + ```js + var trie = new Trie(['bear', 'beer']); + trie.add('hello'); // => 'hello' + trie.add('helloha!'); // => 'helloha!' + trie.has('bears'); // => false + trie.longestPrefixOf('beatrice'); // => 'bea' + trie.wordsWithPrefix('hel'); // => ['hello', 'helloha!'] + trie.remove('beers'); // => undefined. 'beer' still exists + trie.remove('Beer') // => undefined. Case-sensitive + trie.remove('beer') // => 'beer'. Removed + ``` + + ## Properties: + + - size: The total number of words. + */ + + + (function() { + var Queue, Trie, WORD_END, _hasAtLeastNChildren, + __hasProp = {}.hasOwnProperty; + + Queue = __webpack_require__(6); + + WORD_END = 'end'; + + Trie = (function() { + function Trie(words) { + var word, _i, _len; + if (words == null) { + words = []; + } + /* + Pass an optional array of strings to be inserted initially. + */ + + this._root = {}; + this.size = 0; + for (_i = 0, _len = words.length; _i < _len; _i++) { + word = words[_i]; + this.add(word); + } + } + + Trie.prototype.add = function(word) { + /* + Add a whole string to the trie. + + _Returns:_ the word added. Will return undefined (without adding the value) + if the word passed is null or undefined. + */ + + var currentNode, letter, _i, _len; + if (word == null) { + return; + } + this.size++; + currentNode = this._root; + for (_i = 0, _len = word.length; _i < _len; _i++) { + letter = word[_i]; + if (currentNode[letter] == null) { + currentNode[letter] = {}; + } + currentNode = currentNode[letter]; + } + currentNode[WORD_END] = true; + return word; + }; + + Trie.prototype.has = function(word) { + /* + __Returns:_ true or false. + */ + + var currentNode, letter, _i, _len; + if (word == null) { + return false; + } + currentNode = this._root; + for (_i = 0, _len = word.length; _i < _len; _i++) { + letter = word[_i]; + if (currentNode[letter] == null) { + return false; + } + currentNode = currentNode[letter]; + } + if (currentNode[WORD_END]) { + return true; + } else { + return false; + } + }; + + Trie.prototype.longestPrefixOf = function(word) { + /* + Find all words containing the prefix. The word itself counts as a prefix. + + ```js + var trie = new Trie; + trie.add('hello'); + trie.longestPrefixOf('he'); // 'he' + trie.longestPrefixOf('hello'); // 'hello' + trie.longestPrefixOf('helloha!'); // 'hello' + ``` + + _Returns:_ the prefix string, or empty string if no prefix found. + */ + + var currentNode, letter, prefix, _i, _len; + if (word == null) { + return ''; + } + currentNode = this._root; + prefix = ''; + for (_i = 0, _len = word.length; _i < _len; _i++) { + letter = word[_i]; + if (currentNode[letter] == null) { + break; + } + prefix += letter; + currentNode = currentNode[letter]; + } + return prefix; + }; + + Trie.prototype.wordsWithPrefix = function(prefix) { + /* + Find all words containing the prefix. The word itself counts as a prefix. + **Watch out for edge cases.** + + ```js + var trie = new Trie; + trie.wordsWithPrefix(''); // []. Check later case below. + trie.add(''); + trie.wordsWithPrefix(''); // [''] + trie.add('he'); + trie.add('hello'); + trie.add('hell'); + trie.add('bear'); + trie.add('z'); + trie.add('zebra'); + trie.wordsWithPrefix('hel'); // ['hell', 'hello'] + ``` + + _Returns:_ an array of strings, or empty array if no word found. + */ + + var accumulatedLetters, currentNode, letter, node, queue, subNode, words, _i, _len, _ref; + if (prefix == null) { + return []; + } + (prefix != null) || (prefix = ''); + words = []; + currentNode = this._root; + for (_i = 0, _len = prefix.length; _i < _len; _i++) { + letter = prefix[_i]; + currentNode = currentNode[letter]; + if (currentNode == null) { + return []; + } + } + queue = new Queue(); + queue.enqueue([currentNode, '']); + while (queue.size !== 0) { + _ref = queue.dequeue(), node = _ref[0], accumulatedLetters = _ref[1]; + if (node[WORD_END]) { + words.push(prefix + accumulatedLetters); + } + for (letter in node) { + if (!__hasProp.call(node, letter)) continue; + subNode = node[letter]; + queue.enqueue([subNode, accumulatedLetters + letter]); + } + } + return words; + }; + + Trie.prototype.remove = function(word) { + /* + _Returns:_ the string removed, or undefined if the word in its whole doesn't + exist. **Note:** this means removing `beers` when only `beer` exists will + return undefined and conserve `beer`. + */ + + var currentNode, i, letter, prefix, _i, _j, _len, _ref; + if (word == null) { + return; + } + currentNode = this._root; + prefix = []; + for (_i = 0, _len = word.length; _i < _len; _i++) { + letter = word[_i]; + if (currentNode[letter] == null) { + return; + } + currentNode = currentNode[letter]; + prefix.push([letter, currentNode]); + } + if (!currentNode[WORD_END]) { + return; + } + this.size--; + delete currentNode[WORD_END]; + if (_hasAtLeastNChildren(currentNode, 1)) { + return word; + } + for (i = _j = _ref = prefix.length - 1; _ref <= 1 ? _j <= 1 : _j >= 1; i = _ref <= 1 ? ++_j : --_j) { + if (!_hasAtLeastNChildren(prefix[i][1], 1)) { + delete prefix[i - 1][1][prefix[i][0]]; + } else { + break; + } + } + if (!_hasAtLeastNChildren(this._root[prefix[0][0]], 1)) { + delete this._root[prefix[0][0]]; + } + return word; + }; + + return Trie; + + })(); + + _hasAtLeastNChildren = function(node, n) { + var child, childCount; + if (n === 0) { + return true; + } + childCount = 0; + for (child in node) { + if (!__hasProp.call(node, child)) continue; + childCount++; + if (childCount >= n) { + return true; + } + } + return false; + }; + + module.exports = Trie; + + }).call(this); + + +/***/ } +/******/ ]);;angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapMarkerSpiderfier', [ 'uiGmapGoogleMapApi', function(GoogleMapApi) { + var self = this; + /* istanbul ignore next */ + +function(){ + +/** @preserve OverlappingMarkerSpiderfier +https://github.com/jawj/OverlappingMarkerSpiderfier +Copyright (c) 2011 - 2013 George MacKerron +Released under the MIT licence: http://opensource.org/licenses/mit-license +Note: The Google Maps API v3 must be included *before* this code + */ +var hasProp = {}.hasOwnProperty, + slice = [].slice; + +this['OverlappingMarkerSpiderfier'] = (function() { + var ge, gm, j, lcH, lcU, len, mt, p, ref, twoPi, x; + + p = _Class.prototype; + + ref = [_Class, p]; + for (j = 0, len = ref.length; j < len; j++) { + x = ref[j]; + x['VERSION'] = '0.3.3'; + } + + gm = void 0; + + ge = void 0; + + mt = void 0; + + twoPi = Math.PI * 2; + + p['keepSpiderfied'] = false; + + p['markersWontHide'] = false; + + p['markersWontMove'] = false; + + p['nearbyDistance'] = 20; + + p['circleSpiralSwitchover'] = 9; + + p['circleFootSeparation'] = 23; + + p['circleStartAngle'] = twoPi / 12; + + p['spiralFootSeparation'] = 26; + + p['spiralLengthStart'] = 11; + + p['spiralLengthFactor'] = 4; + + p['spiderfiedZIndex'] = 1000; + + p['usualLegZIndex'] = 10; + + p['highlightedLegZIndex'] = 20; + + p['event'] = 'click'; + + p['minZoomLevel'] = false; + + p['legWeight'] = 1.5; + + p['legColors'] = { + 'usual': {}, + 'highlighted': {} + }; + + lcU = p['legColors']['usual']; + + lcH = p['legColors']['highlighted']; + + _Class['initializeGoogleMaps'] = function(google) { + gm = google.maps; + ge = gm.event; + mt = gm.MapTypeId; + lcU[mt.HYBRID] = lcU[mt.SATELLITE] = '#fff'; + lcH[mt.HYBRID] = lcH[mt.SATELLITE] = '#f00'; + lcU[mt.TERRAIN] = lcU[mt.ROADMAP] = '#444'; + lcH[mt.TERRAIN] = lcH[mt.ROADMAP] = '#f00'; + this.ProjHelper = function(map) { + return this.setMap(map); + }; + this.ProjHelper.prototype = new gm.OverlayView(); + return this.ProjHelper.prototype['draw'] = function() {}; + }; + + function _Class(map1, opts) { + var e, k, l, len1, ref1, v; + this.map = map1; + if (opts == null) { + opts = {}; + } + for (k in opts) { + if (!hasProp.call(opts, k)) continue; + v = opts[k]; + this[k] = v; + } + this.projHelper = new this.constructor.ProjHelper(this.map); + this.initMarkerArrays(); + this.listeners = {}; + ref1 = ['click', 'zoom_changed', 'maptypeid_changed']; + for (l = 0, len1 = ref1.length; l < len1; l++) { + e = ref1[l]; + ge.addListener(this.map, e, (function(_this) { + return function() { + return _this['unspiderfy'](); + }; + })(this)); + } + } + + p.initMarkerArrays = function() { + this.markers = []; + return this.markerListenerRefs = []; + }; + + p['addMarker'] = function(marker) { + var listenerRefs; + if (marker['_oms'] != null) { + return this; + } + marker['_oms'] = true; + listenerRefs = [ + ge.addListener(marker, this['event'], (function(_this) { + return function(event) { + return _this.spiderListener(marker, event); + }; + })(this)) + ]; + if (!this['markersWontHide']) { + listenerRefs.push(ge.addListener(marker, 'visible_changed', (function(_this) { + return function() { + return _this.markerChangeListener(marker, false); + }; + })(this))); + } + if (!this['markersWontMove']) { + listenerRefs.push(ge.addListener(marker, 'position_changed', (function(_this) { + return function() { + return _this.markerChangeListener(marker, true); + }; + })(this))); + } + this.markerListenerRefs.push(listenerRefs); + this.markers.push(marker); + return this; + }; + + p.markerChangeListener = function(marker, positionChanged) { + if ((marker['_omsData'] != null) && (positionChanged || !marker.getVisible()) && !((this.spiderfying != null) || (this.unspiderfying != null))) { + return this['unspiderfy'](positionChanged ? marker : null); + } + }; + + p['getMarkers'] = function() { + return this.markers.slice(0); + }; + + p['removeMarker'] = function(marker) { + var i, l, len1, listenerRef, listenerRefs; + if (marker['_omsData'] != null) { + this['unspiderfy'](); + } + i = this.arrIndexOf(this.markers, marker); + if (i < 0) { + return this; + } + listenerRefs = this.markerListenerRefs.splice(i, 1)[0]; + for (l = 0, len1 = listenerRefs.length; l < len1; l++) { + listenerRef = listenerRefs[l]; + ge.removeListener(listenerRef); + } + delete marker['_oms']; + this.markers.splice(i, 1); + return this; + }; + + p['clearMarkers'] = function() { + var i, l, len1, len2, listenerRef, listenerRefs, marker, n, ref1; + this['unspiderfy'](); + ref1 = this.markers; + for (i = l = 0, len1 = ref1.length; l < len1; i = ++l) { + marker = ref1[i]; + listenerRefs = this.markerListenerRefs[i]; + for (n = 0, len2 = listenerRefs.length; n < len2; n++) { + listenerRef = listenerRefs[n]; + ge.removeListener(listenerRef); + } + delete marker['_oms']; + } + this.initMarkerArrays(); + return this; + }; + + p['addListener'] = function(event, func) { + var base; + ((base = this.listeners)[event] != null ? base[event] : base[event] = []).push(func); + return this; + }; + + p['removeListener'] = function(event, func) { + var i; + i = this.arrIndexOf(this.listeners[event], func); + if (!(i < 0)) { + this.listeners[event].splice(i, 1); + } + return this; + }; + + p['clearListeners'] = function(event) { + this.listeners[event] = []; + return this; + }; + + p.trigger = function() { + var args, event, func, l, len1, ref1, ref2, results; + event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; + ref2 = (ref1 = this.listeners[event]) != null ? ref1 : []; + results = []; + for (l = 0, len1 = ref2.length; l < len1; l++) { + func = ref2[l]; + results.push(func.apply(null, args)); + } + return results; + }; + + p.generatePtsCircle = function(count, centerPt) { + var angle, angleStep, circumference, i, l, legLength, ref1, results; + circumference = this['circleFootSeparation'] * (2 + count); + legLength = circumference / twoPi; + angleStep = twoPi / count; + results = []; + for (i = l = 0, ref1 = count; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) { + angle = this['circleStartAngle'] + i * angleStep; + results.push(new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))); + } + return results; + }; + + p.generatePtsSpiral = function(count, centerPt) { + var angle, i, l, legLength, pt, ref1, results; + legLength = this['spiralLengthStart']; + angle = 0; + results = []; + for (i = l = 0, ref1 = count; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) { + angle += this['spiralFootSeparation'] / legLength + i * 0.0005; + pt = new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle)); + legLength += twoPi * this['spiralLengthFactor'] / angle; + results.push(pt); + } + return results; + }; + + p.spiderListener = function(marker, event) { + var $this, clear, l, len1, m, mPt, markerPt, markerSpiderfied, nDist, nearbyMarkerData, nonNearbyMarkers, pxSq, ref1; + markerSpiderfied = marker['_omsData'] != null; + if (!(markerSpiderfied && this['keepSpiderfied'])) { + if (this['event'] === 'mouseover') { + $this = this; + clear = function() { + return $this['unspiderfy'](); + }; + window.clearTimeout(p.timeout); + p.timeout = setTimeout(clear, 3000); + } else { + this['unspiderfy'](); + } + } + if (markerSpiderfied || this.map.getStreetView().getVisible() || this.map.getMapTypeId() === 'GoogleEarthAPI') { + return this.trigger('click', marker, event); + } else { + nearbyMarkerData = []; + nonNearbyMarkers = []; + nDist = this['nearbyDistance']; + pxSq = nDist * nDist; + markerPt = this.llToPt(marker.position); + ref1 = this.markers; + for (l = 0, len1 = ref1.length; l < len1; l++) { + m = ref1[l]; + if (!((m.map != null) && m.getVisible())) { + continue; + } + mPt = this.llToPt(m.position); + if (this.ptDistanceSq(mPt, markerPt) < pxSq) { + nearbyMarkerData.push({ + marker: m, + markerPt: mPt + }); + } else { + nonNearbyMarkers.push(m); + } + } + if (nearbyMarkerData.length === 1) { + return this.trigger('click', marker, event); + } else { + return this.spiderfy(nearbyMarkerData, nonNearbyMarkers); + } + } + }; + + p['markersNearMarker'] = function(marker, firstOnly) { + var l, len1, m, mPt, markerPt, markers, nDist, pxSq, ref1, ref2, ref3; + if (firstOnly == null) { + firstOnly = false; + } + if (this.projHelper.getProjection() == null) { + throw "Must wait for 'idle' event on map before calling markersNearMarker"; + } + nDist = this['nearbyDistance']; + pxSq = nDist * nDist; + markerPt = this.llToPt(marker.position); + markers = []; + ref1 = this.markers; + for (l = 0, len1 = ref1.length; l < len1; l++) { + m = ref1[l]; + if (m === marker || (m.map == null) || !m.getVisible()) { + continue; + } + mPt = this.llToPt((ref2 = (ref3 = m['_omsData']) != null ? ref3.usualPosition : void 0) != null ? ref2 : m.position); + if (this.ptDistanceSq(mPt, markerPt) < pxSq) { + markers.push(m); + if (firstOnly) { + break; + } + } + } + return markers; + }; + + p['markersNearAnyOtherMarker'] = function() { + var i, i1, i2, l, len1, len2, len3, m, m1, m1Data, m2, m2Data, mData, n, nDist, pxSq, q, ref1, ref2, ref3, results; + if (this.projHelper.getProjection() == null) { + throw "Must wait for 'idle' event on map before calling markersNearAnyOtherMarker"; + } + nDist = this['nearbyDistance']; + pxSq = nDist * nDist; + mData = (function() { + var l, len1, ref1, ref2, ref3, results; + ref1 = this.markers; + results = []; + for (l = 0, len1 = ref1.length; l < len1; l++) { + m = ref1[l]; + results.push({ + pt: this.llToPt((ref2 = (ref3 = m['_omsData']) != null ? ref3.usualPosition : void 0) != null ? ref2 : m.position), + willSpiderfy: false + }); + } + return results; + }).call(this); + ref1 = this.markers; + for (i1 = l = 0, len1 = ref1.length; l < len1; i1 = ++l) { + m1 = ref1[i1]; + if (!((m1.map != null) && m1.getVisible())) { + continue; + } + m1Data = mData[i1]; + if (m1Data.willSpiderfy) { + continue; + } + ref2 = this.markers; + for (i2 = n = 0, len2 = ref2.length; n < len2; i2 = ++n) { + m2 = ref2[i2]; + if (i2 === i1) { + continue; + } + if (!((m2.map != null) && m2.getVisible())) { + continue; + } + m2Data = mData[i2]; + if (i2 < i1 && !m2Data.willSpiderfy) { + continue; + } + if (this.ptDistanceSq(m1Data.pt, m2Data.pt) < pxSq) { + m1Data.willSpiderfy = m2Data.willSpiderfy = true; + break; + } + } + } + ref3 = this.markers; + results = []; + for (i = q = 0, len3 = ref3.length; q < len3; i = ++q) { + m = ref3[i]; + if (mData[i].willSpiderfy) { + results.push(m); + } + } + return results; + }; + + p.makeHighlightListenerFuncs = function(marker) { + return { + highlight: (function(_this) { + return function() { + return marker['_omsData'].leg.setOptions({ + strokeColor: _this['legColors']['highlighted'][_this.map.mapTypeId], + zIndex: _this['highlightedLegZIndex'] + }); + }; + })(this), + unhighlight: (function(_this) { + return function() { + return marker['_omsData'].leg.setOptions({ + strokeColor: _this['legColors']['usual'][_this.map.mapTypeId], + zIndex: _this['usualLegZIndex'] + }); + }; + })(this) + }; + }; + + p.spiderfy = function(markerData, nonNearbyMarkers) { + var bodyPt, footLl, footPt, footPts, highlightListenerFuncs, leg, marker, md, nearestMarkerDatum, numFeet, spiderfiedMarkers; + if (this['minZoomLevel'] && this.map.getZoom() < this['minZoomLevel']) { + return false; + } + this.spiderfying = true; + numFeet = markerData.length; + bodyPt = this.ptAverage((function() { + var l, len1, results; + results = []; + for (l = 0, len1 = markerData.length; l < len1; l++) { + md = markerData[l]; + results.push(md.markerPt); + } + return results; + })()); + footPts = numFeet >= this['circleSpiralSwitchover'] ? this.generatePtsSpiral(numFeet, bodyPt).reverse() : this.generatePtsCircle(numFeet, bodyPt); + spiderfiedMarkers = (function() { + var l, len1, results; + results = []; + for (l = 0, len1 = footPts.length; l < len1; l++) { + footPt = footPts[l]; + footLl = this.ptToLl(footPt); + nearestMarkerDatum = this.minExtract(markerData, (function(_this) { + return function(md) { + return _this.ptDistanceSq(md.markerPt, footPt); + }; + })(this)); + marker = nearestMarkerDatum.marker; + leg = new gm.Polyline({ + map: this.map, + path: [marker.position, footLl], + strokeColor: this['legColors']['usual'][this.map.mapTypeId], + strokeWeight: this['legWeight'], + zIndex: this['usualLegZIndex'] + }); + marker['_omsData'] = { + usualPosition: marker.position, + leg: leg + }; + if (this['legColors']['highlighted'][this.map.mapTypeId] !== this['legColors']['usual'][this.map.mapTypeId]) { + highlightListenerFuncs = this.makeHighlightListenerFuncs(marker); + marker['_omsData'].hightlightListeners = { + highlight: ge.addListener(marker, 'mouseover', highlightListenerFuncs.highlight), + unhighlight: ge.addListener(marker, 'mouseout', highlightListenerFuncs.unhighlight) + }; + } + marker.setPosition(footLl); + marker.setZIndex(Math.round(this['spiderfiedZIndex'] + footPt.y)); + results.push(marker); + } + return results; + }).call(this); + delete this.spiderfying; + this.spiderfied = true; + return this.trigger('spiderfy', spiderfiedMarkers, nonNearbyMarkers); + }; + + p['unspiderfy'] = function(markerNotToMove) { + var l, len1, listeners, marker, nonNearbyMarkers, ref1, unspiderfiedMarkers; + if (markerNotToMove == null) { + markerNotToMove = null; + } + if (this.spiderfied == null) { + return this; + } + this.unspiderfying = true; + unspiderfiedMarkers = []; + nonNearbyMarkers = []; + ref1 = this.markers; + for (l = 0, len1 = ref1.length; l < len1; l++) { + marker = ref1[l]; + if (marker['_omsData'] != null) { + marker['_omsData'].leg.setMap(null); + if (marker !== markerNotToMove) { + marker.setPosition(marker['_omsData'].usualPosition); + } + marker.setZIndex(null); + listeners = marker['_omsData'].hightlightListeners; + if (listeners != null) { + ge.removeListener(listeners.highlight); + ge.removeListener(listeners.unhighlight); + } + delete marker['_omsData']; + unspiderfiedMarkers.push(marker); + } else { + nonNearbyMarkers.push(marker); + } + } + delete this.unspiderfying; + delete this.spiderfied; + this.trigger('unspiderfy', unspiderfiedMarkers, nonNearbyMarkers); + return this; + }; + + p.ptDistanceSq = function(pt1, pt2) { + var dx, dy; + dx = pt1.x - pt2.x; + dy = pt1.y - pt2.y; + return dx * dx + dy * dy; + }; + + p.ptAverage = function(pts) { + var l, len1, numPts, pt, sumX, sumY; + sumX = sumY = 0; + for (l = 0, len1 = pts.length; l < len1; l++) { + pt = pts[l]; + sumX += pt.x; + sumY += pt.y; + } + numPts = pts.length; + return new gm.Point(sumX / numPts, sumY / numPts); + }; + + p.llToPt = function(ll) { + return this.projHelper.getProjection().fromLatLngToDivPixel(ll); + }; + + p.ptToLl = function(pt) { + return this.projHelper.getProjection().fromDivPixelToLatLng(pt); + }; + + p.minExtract = function(set, func) { + var bestIndex, bestVal, index, item, l, len1, val; + for (index = l = 0, len1 = set.length; l < len1; index = ++l) { + item = set[index]; + val = func(item); + if ((typeof bestIndex === "undefined" || bestIndex === null) || val < bestVal) { + bestVal = val; + bestIndex = index; + } + } + return set.splice(bestIndex, 1)[0]; + }; + + p.arrIndexOf = function(arr, obj) { + var i, l, len1, o; + if (arr.indexOf != null) { + return arr.indexOf(obj); + } + for (i = l = 0, len1 = arr.length; l < len1; i = ++l) { + o = arr[i]; + if (o === obj) { + return i; + } + } + return -1; + }; + + return _Class; + +})(); + + }.apply(self); + + GoogleMapApi.then(function(){ + self.OverlappingMarkerSpiderfier.initializeGoogleMaps(window.google); + }); + return this.OverlappingMarkerSpiderfier; +}]); +;/** + * Performance overrides on MarkerClusterer custom to Angular Google Maps + * + * Created by Petr Bruna ccg1415 and Nick McCready on 7/13/14. + */ +angular.module('uiGmapgoogle-maps.extensions') +.service('uiGmapExtendMarkerClusterer',['uiGmapLodash', 'uiGmapPropMap', function (uiGmapLodash, PropMap) { + return { + init: _.once(function () { + (function () { + var __hasProp = {}.hasOwnProperty, + __extends = function (child, parent) { + for (var key in parent) { + if (__hasProp.call(parent, key)) child[key] = parent[key]; + } + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }; + + window.NgMapCluster = (function (_super) { + __extends(NgMapCluster, _super); + + function NgMapCluster(opts) { + NgMapCluster.__super__.constructor.call(this, opts); + this.markers_ = new PropMap(); + } + + /** + * Adds a marker to the cluster. + * + * @param {google.maps.Marker} marker The marker to be added. + * @return {boolean} True if the marker was added. + * @ignore + */ + NgMapCluster.prototype.addMarker = function (marker) { + var i; + var mCount; + var mz; + + if (this.isMarkerAlreadyAdded_(marker)) { + var oldMarker = this.markers_.get(marker.key); + if (oldMarker.getPosition().lat() == marker.getPosition().lat() && oldMarker.getPosition().lon() == marker.getPosition().lon()) //if nothing has changed + return false; + } + + if (!this.center_) { + this.center_ = marker.getPosition(); + this.calculateBounds_(); + } else { + if (this.averageCenter_) { + var l = this.markers_.length + 1; + var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l; + var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l; + this.center_ = new google.maps.LatLng(lat, lng); + this.calculateBounds_(); + } + } + marker.isAdded = true; + this.markers_.push(marker); + + mCount = this.markers_.length; + mz = this.markerClusterer_.getMaxZoom(); + if (mz !== null && this.map_.getZoom() > mz) { + // Zoomed in past max zoom, so show the marker. + if (marker.getMap() !== this.map_) { + marker.setMap(this.map_); + } + } else if (mCount < this.minClusterSize_) { + // Min cluster size not reached so show the marker. + if (marker.getMap() !== this.map_) { + marker.setMap(this.map_); + } + } else if (mCount === this.minClusterSize_) { + // Hide the markers that were showing. + this.markers_.each(function (m) { + m.setMap(null); + }); + } else { + marker.setMap(null); + } + + //this.updateIcon_(); + return true; + }; + + /** + * Determines if a marker has already been added to the cluster. + * + * @param {google.maps.Marker} marker The marker to check. + * @return {boolean} True if the marker has already been added. + */ + NgMapCluster.prototype.isMarkerAlreadyAdded_ = function (marker) { + return uiGmapLodash.isNullOrUndefined(this.markers_.get(marker.key)); + }; + + + /** + * Returns the bounds of the cluster. + * + * @return {google.maps.LatLngBounds} the cluster bounds. + * @ignore + */ + NgMapCluster.prototype.getBounds = function () { + var i; + var bounds = new google.maps.LatLngBounds(this.center_, this.center_); + this.getMarkers().each(function(m){ + bounds.extend(m.getPosition()); + }); + return bounds; + }; + + + /** + * Removes the cluster from the map. + * + * @ignore + */ + NgMapCluster.prototype.remove = function () { + this.clusterIcon_.setMap(null); + this.markers_ = new PropMap(); + delete this.markers_; + }; + + + return NgMapCluster; + + })(Cluster); + + + window.NgMapMarkerClusterer = (function (_super) { + __extends(NgMapMarkerClusterer, _super); + + function NgMapMarkerClusterer(map, opt_markers, opt_options) { + NgMapMarkerClusterer.__super__.constructor.call(this, map, opt_markers, opt_options); + this.markers_ = new PropMap(); + } + + /** + * Removes all clusters and markers from the map and also removes all markers + * managed by the clusterer. + */ + NgMapMarkerClusterer.prototype.clearMarkers = function () { + this.resetViewport_(true); + this.markers_ = new PropMap(); + }; + /** + * Removes a marker and returns true if removed, false if not. + * + * @param {google.maps.Marker} marker The marker to remove + * @return {boolean} Whether the marker was removed or not + */ + NgMapMarkerClusterer.prototype.removeMarker_ = function (marker) { + if (!this.markers_.get(marker.key)) { + return false; + } + marker.setMap(null); + this.markers_.remove(marker.key); // Remove the marker from the list of managed markers + return true; + }; + + /** + * Creates the clusters. This is done in batches to avoid timeout errors + * in some browsers when there is a huge number of markers. + * + * @param {number} iFirst The index of the first marker in the batch of + * markers to be added to clusters. + */ + NgMapMarkerClusterer.prototype.createClusters_ = function (iFirst) { + var i, marker; + var mapBounds; + var cMarkerClusterer = this; + if (!this.ready_) { + return; + } + + // Cancel previous batch processing if we're working on the first batch: + if (iFirst === 0) { + /** + * This event is fired when the MarkerClusterer begins + * clustering markers. + * @name MarkerClusterer#clusteringbegin + * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered. + * @event + */ + google.maps.event.trigger(this, 'clusteringbegin', this); + + if (typeof this.timerRefStatic !== 'undefined') { + clearTimeout(this.timerRefStatic); + delete this.timerRefStatic; + } + } + + // Get our current map view bounds. + // Create a new bounds object so we don't affect the map. + // + // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug: + if (this.getMap().getZoom() > 3) { + mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(), + this.getMap().getBounds().getNorthEast()); + } else { + mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625)); + } + var bounds = this.getExtendedBounds(mapBounds); + + var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length); + + var _ms = this.markers_.values(); + for (i = iFirst; i < iLast; i++) { + marker = _ms[i]; + if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) { + if (!this.ignoreHidden_ || (this.ignoreHidden_ && marker.getVisible())) { + this.addToClosestCluster_(marker); + } + } + } + + if (iLast < this.markers_.length) { + this.timerRefStatic = setTimeout(function () { + cMarkerClusterer.createClusters_(iLast); + }, 0); + } else { + // custom addition by ui-gmap + // update icon for all clusters + for (i = 0; i < this.clusters_.length; i++) { + this.clusters_[i].updateIcon_(); + } + + delete this.timerRefStatic; + + /** + * This event is fired when the MarkerClusterer stops + * clustering markers. + * @name MarkerClusterer#clusteringend + * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered. + * @event + */ + google.maps.event.trigger(this, 'clusteringend', this); + } + }; + + /** + * Adds a marker to a cluster, or creates a new cluster. + * + * @param {google.maps.Marker} marker The marker to add. + */ + NgMapMarkerClusterer.prototype.addToClosestCluster_ = function (marker) { + var i, d, cluster, center; + var distance = 40000; // Some large number + var clusterToAddTo = null; + for (i = 0; i < this.clusters_.length; i++) { + cluster = this.clusters_[i]; + center = cluster.getCenter(); + if (center) { + d = this.distanceBetweenPoints_(center, marker.getPosition()); + if (d < distance) { + distance = d; + clusterToAddTo = cluster; + } + } + } + + if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) { + clusterToAddTo.addMarker(marker); + } else { + cluster = new NgMapCluster(this); + cluster.addMarker(marker); + this.clusters_.push(cluster); + } + }; + + /** + * Redraws all the clusters. + */ + NgMapMarkerClusterer.prototype.redraw_ = function () { + this.createClusters_(0); + }; + + + /** + * Removes all clusters from the map. The markers are also removed from the map + * if opt_hide is set to true. + * + * @param {boolean} [opt_hide] Set to true to also remove the markers + * from the map. + */ + NgMapMarkerClusterer.prototype.resetViewport_ = function (opt_hide) { + var i, marker; + // Remove all the clusters + for (i = 0; i < this.clusters_.length; i++) { + this.clusters_[i].remove(); + } + this.clusters_ = []; + + // Reset the markers to not be added and to be removed from the map. + this.markers_.each(function (marker) { + marker.isAdded = false; + if (opt_hide) { + marker.setMap(null); + } + }); + }; + + /** + * Extends an object's prototype by another's. + * + * @param {Object} obj1 The object to be extended. + * @param {Object} obj2 The object to extend with. + * @return {Object} The new extended object. + * @ignore + */ + NgMapMarkerClusterer.prototype.extend = function (obj1, obj2) { + return (function (object) { + var property; + for (property in object.prototype) { + if (property !== 'constructor') + this.prototype[property] = object.prototype[property]; + } + return this; + }).apply(obj1, [obj2]); + }; + //////////////////////////////////////////////////////////////////////////////// + /* + Other overrides relevant to MarkerClusterPlus + */ + //////////////////////////////////////////////////////////////////////////////// + /** + * Positions and shows the icon. + */ + ClusterIcon.prototype.show = function () { + if (this.div_) { + var img = ""; + // NOTE: values must be specified in px units + var bp = this.backgroundPosition_.split(" "); + var spriteH = parseInt(bp[0].trim(), 10); + var spriteV = parseInt(bp[1].trim(), 10); + var pos = this.getPosFromLatLng_(this.center_); + this.div_.style.cssText = this.createCss(pos); + img = ""; + this.div_.innerHTML = img + "

" + this.sums_.text + "
"; + if (typeof this.sums_.title === "undefined" || this.sums_.title === "") { + this.div_.title = this.cluster_.getMarkerClusterer().getTitle(); + } else { + this.div_.title = this.sums_.title; + } + this.div_.style.display = ""; + } + this.visible_ = true; + }; + //END OTHER OVERRIDES + //////////////////////////////////////////////////////////////////////////////// + + return NgMapMarkerClusterer; + + })(MarkerClusterer); + }).call(this); + }) + }; +}]); +}( window, angular, _)); +//# sourceMappingURL=angular-google-maps_dev_mapped.js.map \ No newline at end of file diff --git a/dist/angular-google-maps_dev_mapped.js.map b/dist/angular-google-maps_dev_mapped.js.map new file mode 100644 index 000000000..7e1f298c9 --- /dev/null +++ b/dist/angular-google-maps_dev_mapped.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../tmp/src/coffee/module.js","../tmp/src/coffee/providers/map-loader.js","../tmp/src/coffee/extensions/google.js","../tmp/src/coffee/extensions/lodash.js","../tmp/src/coffee/extensions/string.js","../tmp/src/coffee/directives/api/utils/_async.js","../tmp/src/coffee/directives/api/utils/base-object.js","../tmp/src/coffee/directives/api/utils/child-events.js","../tmp/src/coffee/directives/api/utils/ctrl-handle.js","../tmp/src/coffee/directives/api/utils/events-helper.js","../tmp/src/coffee/directives/api/utils/fit-helper.js","../tmp/src/coffee/directives/api/utils/gmap-util.js","../tmp/src/coffee/directives/api/utils/is-ready.js","../tmp/src/coffee/directives/api/utils/linked.js","../tmp/src/coffee/directives/api/utils/logger.js","../tmp/src/coffee/directives/api/utils/model-key.js","../tmp/src/coffee/directives/api/utils/models-watcher.js","../tmp/src/coffee/directives/api/utils/promise.js","../tmp/src/coffee/directives/api/utils/prop-map.js","../tmp/src/coffee/directives/api/utils/property-action.js","../tmp/src/coffee/directives/api/managers/clusterer-marker-manager.js","../tmp/src/coffee/directives/api/managers/google-map-object-manager.js","../tmp/src/coffee/directives/api/managers/marker-manager.js","../tmp/src/coffee/directives/api/managers/spiderfier-marker-manager.js","../tmp/src/coffee/utils/add-events.js","../tmp/src/coffee/utils/array-sync.js","../tmp/src/coffee/utils/chrome-fixes.js","../tmp/src/coffee/utils/object-iterators.js","../tmp/src/coffee/directives/api/options/builders/common-options-builder.js","../tmp/src/coffee/directives/api/options/builders/options-builders.js","../tmp/src/coffee/directives/api/options/marker-options.js","../tmp/src/coffee/directives/api/models/child/base-poly-child-model.js","../tmp/src/coffee/directives/api/models/child/free-draw-polygons-child.js","../tmp/src/coffee/directives/api/models/child/marker-child-model.js","../tmp/src/coffee/directives/api/models/child/polygon-child-model.js","../tmp/src/coffee/directives/api/models/child/polyline-child-model.js","../tmp/src/coffee/directives/api/models/child/window-child-model.js","../tmp/src/coffee/directives/api/models/parent/base-polys-parent-model.js","../tmp/src/coffee/directives/api/models/parent/circle-parent-model.js","../tmp/src/coffee/directives/api/models/parent/drawing-manager-parent-model.js","../tmp/src/coffee/directives/api/models/parent/i-marker-parent-model.js","../tmp/src/coffee/directives/api/models/parent/i-window-parent-model.js","../tmp/src/coffee/directives/api/models/parent/layer-parent-model.js","../tmp/src/coffee/directives/api/models/parent/map-type-parent-model.js","../tmp/src/coffee/directives/api/models/parent/map-types-parent-model.js","../tmp/src/coffee/directives/api/models/parent/markers-parent-model.js","../tmp/src/coffee/directives/api/models/parent/poly-parent-models.js","../tmp/src/coffee/directives/api/models/parent/rectangle-parent-model.js","../tmp/src/coffee/directives/api/models/parent/search-box-parent-model.js","../tmp/src/coffee/directives/api/models/parent/windows-parent-model.js","../tmp/src/coffee/directives/api/circle.js","../tmp/src/coffee/directives/api/control.js","../tmp/src/coffee/directives/api/drag-zoom.js","../tmp/src/coffee/directives/api/drawing-manager.js","../tmp/src/coffee/directives/api/free-draw-polygons.js","../tmp/src/coffee/directives/api/i-circle.js","../tmp/src/coffee/directives/api/i-control.js","../tmp/src/coffee/directives/api/i-drawing-manager.js","../tmp/src/coffee/directives/api/i-marker.js","../tmp/src/coffee/directives/api/i-polygon.js","../tmp/src/coffee/directives/api/i-polyline.js","../tmp/src/coffee/directives/api/i-rectangle.js","../tmp/src/coffee/directives/api/i-window.js","../tmp/src/coffee/directives/api/map.js","../tmp/src/coffee/directives/api/marker.js","../tmp/src/coffee/directives/api/markers.js","../tmp/src/coffee/directives/api/plural.js","../tmp/src/coffee/directives/api/polygon.js","../tmp/src/coffee/directives/api/polygons.js","../tmp/src/coffee/directives/api/polyline.js","../tmp/src/coffee/directives/api/polylines.js","../tmp/src/coffee/directives/api/rectangle.js","../tmp/src/coffee/directives/api/window.js","../tmp/src/coffee/directives/api/windows.js","../tmp/src/coffee/directives/map.js","../tmp/src/coffee/directives/marker.js","../tmp/src/coffee/directives/markers.js","../tmp/src/coffee/directives/polygon.js","../tmp/src/coffee/directives/circle.js","../tmp/src/coffee/directives/polyline.js","../tmp/src/coffee/directives/polylines.js","../tmp/src/coffee/directives/rectangle.js","../tmp/src/coffee/directives/window.js","../tmp/src/coffee/directives/windows.js","../tmp/src/coffee/directives/layer.js","../tmp/src/coffee/directives/control.js","../tmp/src/coffee/directives/drag-zoom.js","../tmp/src/coffee/directives/drawing-manager.js","../tmp/src/coffee/directives/free-draw-polygons.js","../tmp/src/coffee/directives/map-type.js","../tmp/src/coffee/directives/map-types.js","../tmp/src/coffee/directives/polygons.js","../tmp/src/coffee/directives/search-box.js","../tmp/src/coffee/directives/show.js","../tmp/src/coffee/directives/street-view-panorama.js","../tmp/wrapped_uuid.js","../tmp/wrapped_gmaps_sdk_util_v3.js","../tmp/webpack.dataStructures.js","../tmp/wrapped_marker_spiderfier.js","../src/js/extensions/markerclusterer.js"],"names":[],"mappings":"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","file":"angular-google-maps_dev_mapped.js","sourcesContent":["\n/*\n!\nThe MIT License\n\nCopyright (c) 2010-2013 Google, Inc. http://angularjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the 'Software'), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\nangular-google-maps\nhttps://github.com/angular-ui/angular-google-maps\n\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps.providers', ['nemLogging']);\n\n angular.module('uiGmapgoogle-maps.wrapped', []);\n\n angular.module('uiGmapgoogle-maps.extensions', ['uiGmapgoogle-maps.wrapped', 'uiGmapgoogle-maps.providers']);\n\n angular.module('uiGmapgoogle-maps.directives.api.utils', ['uiGmapgoogle-maps.extensions']);\n\n angular.module('uiGmapgoogle-maps.directives.api.managers', []);\n\n angular.module('uiGmapgoogle-maps.directives.api.options', ['uiGmapgoogle-maps.directives.api.utils']);\n\n angular.module('uiGmapgoogle-maps.directives.api.options.builders', []);\n\n angular.module('uiGmapgoogle-maps.directives.api.models.child', ['uiGmapgoogle-maps.directives.api.utils', 'uiGmapgoogle-maps.directives.api.options', 'uiGmapgoogle-maps.directives.api.options.builders']);\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent', ['uiGmapgoogle-maps.directives.api.managers', 'uiGmapgoogle-maps.directives.api.models.child', 'uiGmapgoogle-maps.providers']);\n\n angular.module('uiGmapgoogle-maps.directives.api', ['uiGmapgoogle-maps.directives.api.models.parent']);\n\n angular.module('uiGmapgoogle-maps', ['uiGmapgoogle-maps.directives.api', 'uiGmapgoogle-maps.providers']);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.providers').factory('uiGmapMapScriptLoader', [\n '$q', 'uiGmapuuid', function($q, uuid) {\n var getScriptUrl, includeScript, isGoogleMapsLoaded, scriptId, usedConfiguration;\n scriptId = void 0;\n usedConfiguration = void 0;\n getScriptUrl = function(options) {\n if (options.china) {\n return 'http://maps.google.cn/maps/api/js?';\n } else {\n if (options.transport === 'auto') {\n return '//maps.googleapis.com/maps/api/js?';\n } else {\n return options.transport + '://maps.googleapis.com/maps/api/js?';\n }\n }\n };\n includeScript = function(options) {\n var omitOptions, query, script, scriptElem;\n omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad'];\n if (options.isGoogleMapsForWork) {\n omitOptions.push('key');\n }\n query = _.map(_.omit(options, omitOptions), function(v, k) {\n return k + '=' + v;\n });\n if (scriptId) {\n scriptElem = document.getElementById(scriptId);\n scriptElem.parentNode.removeChild(scriptElem);\n }\n query = query.join('&');\n script = document.createElement('script');\n script.id = scriptId = \"ui_gmap_map_load_\" + (uuid.generate());\n script.type = 'text/javascript';\n script.src = getScriptUrl(options) + query;\n return document.head.appendChild(script);\n };\n isGoogleMapsLoaded = function() {\n return angular.isDefined(window.google) && angular.isDefined(window.google.maps);\n };\n return {\n load: function(options) {\n var deferred, randomizedFunctionName;\n deferred = $q.defer();\n if (isGoogleMapsLoaded()) {\n deferred.resolve(window.google.maps);\n return deferred.promise;\n }\n randomizedFunctionName = options.callback = 'onGoogleMapsReady' + Math.round(Math.random() * 1000);\n window[randomizedFunctionName] = function() {\n window[randomizedFunctionName] = null;\n deferred.resolve(window.google.maps);\n };\n if (window.navigator.connection && window.Connection && window.navigator.connection.type === window.Connection.NONE && !options.preventLoad) {\n document.addEventListener('online', function() {\n if (!isGoogleMapsLoaded()) {\n return includeScript(options);\n }\n });\n } else if (!options.preventLoad) {\n includeScript(options);\n }\n usedConfiguration = options;\n usedConfiguration.randomizedFunctionName = randomizedFunctionName;\n return deferred.promise;\n },\n manualLoad: function() {\n var config;\n config = usedConfiguration;\n if (!isGoogleMapsLoaded()) {\n return includeScript(config);\n } else {\n if (window[config.randomizedFunctionName]) {\n return window[config.randomizedFunctionName]();\n }\n }\n }\n };\n }\n ]).provider('uiGmapGoogleMapApi', function() {\n this.options = {\n transport: 'https',\n isGoogleMapsForWork: false,\n china: false,\n v: '3',\n libraries: '',\n language: 'en',\n preventLoad: false\n };\n this.configure = function(options) {\n angular.extend(this.options, options);\n };\n this.$get = [\n 'uiGmapMapScriptLoader', (function(_this) {\n return function(loader) {\n return loader.load(_this.options);\n };\n })(this)\n ];\n return this;\n }).service('uiGmapGoogleMapApiManualLoader', [\n 'uiGmapMapScriptLoader', function(loader) {\n return {\n load: function() {\n loader.manualLoad();\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.extensions').service('uiGmapExtendGWin', function() {\n return {\n init: _.once(function() {\n var uiGmapInfoBox;\n if (!(google || (typeof google !== \"undefined\" && google !== null ? google.maps : void 0) || (google.maps.InfoWindow != null))) {\n return;\n }\n google.maps.InfoWindow.prototype._open = google.maps.InfoWindow.prototype.open;\n google.maps.InfoWindow.prototype._close = google.maps.InfoWindow.prototype.close;\n google.maps.InfoWindow.prototype._isOpen = false;\n google.maps.InfoWindow.prototype.open = function(map, anchor, recurse) {\n if (recurse != null) {\n return;\n }\n this._isOpen = true;\n this._open(map, anchor, true);\n };\n google.maps.InfoWindow.prototype.close = function(recurse) {\n if (recurse != null) {\n return;\n }\n this._isOpen = false;\n this._close(true);\n };\n google.maps.InfoWindow.prototype.isOpen = function(val) {\n if (val == null) {\n val = void 0;\n }\n if (val == null) {\n return this._isOpen;\n } else {\n return this._isOpen = val;\n }\n };\n\n /*\n Do the same for InfoBox\n TODO: Clean this up so the logic is defined once, wait until develop becomes master as this will be easier\n */\n if (window.InfoBox) {\n window.InfoBox.prototype._open = window.InfoBox.prototype.open;\n window.InfoBox.prototype._close = window.InfoBox.prototype.close;\n window.InfoBox.prototype._isOpen = false;\n window.InfoBox.prototype.open = function(map, anchor) {\n this._isOpen = true;\n this._open(map, anchor);\n };\n window.InfoBox.prototype.close = function() {\n this._isOpen = false;\n this._close();\n };\n window.InfoBox.prototype.isOpen = function(val) {\n if (val == null) {\n val = void 0;\n }\n if (val == null) {\n return this._isOpen;\n } else {\n return this._isOpen = val;\n }\n };\n uiGmapInfoBox = (function(superClass) {\n extend(uiGmapInfoBox, superClass);\n\n function uiGmapInfoBox(opts) {\n this.getOrigCloseBoxImg_ = bind(this.getOrigCloseBoxImg_, this);\n this.getCloseBoxDiv_ = bind(this.getCloseBoxDiv_, this);\n var box;\n box = new window.InfoBox(opts);\n _.extend(this, box);\n if (opts.closeBoxDiv != null) {\n this.closeBoxDiv_ = opts.closeBoxDiv;\n }\n }\n\n uiGmapInfoBox.prototype.getCloseBoxDiv_ = function() {\n return this.closeBoxDiv_;\n };\n\n uiGmapInfoBox.prototype.getCloseBoxImg_ = function() {\n var div, img;\n div = this.getCloseBoxDiv_();\n img = this.getOrigCloseBoxImg_();\n return div || img;\n };\n\n uiGmapInfoBox.prototype.getOrigCloseBoxImg_ = function() {\n var img;\n img = \"\";\n if (this.closeBoxURL_ !== \"\") {\n img = \"\";\n }\n return img;\n };\n\n return uiGmapInfoBox;\n\n })(window.InfoBox);\n window.uiGmapInfoBox = uiGmapInfoBox;\n }\n if (window.MarkerLabel_) {\n return window.MarkerLabel_.prototype.setContent = function() {\n var content;\n content = this.marker_.get('labelContent');\n if (!content || _.isEqual(this.oldContent, content)) {\n return;\n }\n if (typeof (content != null ? content.nodeType : void 0) === 'undefined') {\n this.labelDiv_.innerHTML = content;\n this.eventDiv_.innerHTML = this.labelDiv_.innerHTML;\n this.oldContent = content;\n } else {\n this.labelDiv_.innerHTML = '';\n this.labelDiv_.appendChild(content);\n content = content.cloneNode(true);\n this.labelDiv_.innerHTML = '';\n this.eventDiv_.appendChild(content);\n this.oldContent = content;\n }\n };\n }\n })\n };\n });\n\n}).call(this);\n","\n/*global _:true, angular:true */\n\n(function() {\n angular.module('uiGmapgoogle-maps.extensions').service('uiGmapLodash', function() {\n var baseGet, baseToString, fixLodash, get, reEscapeChar, rePropName, toObject, toPath;\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n reEscapeChar = /\\\\(\\\\)?/g;\n\n /*\n For Lodash 4 compatibility (some aliases are removed)\n */\n fixLodash = function(arg) {\n var isProto, missingName, swapName;\n missingName = arg.missingName, swapName = arg.swapName, isProto = arg.isProto;\n if (_[missingName] == null) {\n _[missingName] = _[swapName];\n if (isProto) {\n return _.prototype[missingName] = _[swapName];\n }\n }\n };\n [\n {\n missingName: 'contains',\n swapName: 'includes',\n isProto: true\n }, {\n missingName: 'includes',\n swapName: 'contains',\n isProto: true\n }, {\n missingName: 'object',\n swapName: 'zipObject'\n }, {\n missingName: 'zipObject',\n swapName: 'object'\n }, {\n missingName: 'all',\n swapName: 'every'\n }, {\n missingName: 'every',\n swapName: 'all'\n }, {\n missingName: 'any',\n swapName: 'some'\n }, {\n missingName: 'some',\n swapName: 'any'\n }, {\n missingName: 'first',\n swapName: 'head'\n }, {\n missingName: 'head',\n swapName: 'first'\n }\n ].forEach(function(toMonkeyPatch) {\n return fixLodash(toMonkeyPatch);\n });\n if (_.get == null) {\n\n /**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\n toObject = function(value) {\n if (_.isObject(value)) {\n return value;\n } else {\n return Object(value);\n }\n };\n\n /**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n baseToString = function(value) {\n if (value === null) {\n return '';\n } else {\n return value + '';\n }\n };\n\n /**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\n toPath = function(value) {\n var result;\n if (_.isArray(value)) {\n return value;\n }\n result = [];\n baseToString(value).replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : number || match);\n });\n return result;\n };\n\n /**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\n baseGet = function(object, path, pathKey) {\n var index, length;\n if (object === null) {\n return;\n }\n if (pathKey !== void 0 && pathKey in toObject(object)) {\n path = [pathKey];\n }\n index = 0;\n length = path.length;\n while (!_.isUndefined(object) && index < length) {\n object = object[path[index++]];\n }\n if (index && index === length) {\n return object;\n } else {\n return void 0;\n }\n };\n\n /**\n * Gets the property value at `path` of `object`. If the resolved value is\n * `undefined` the `defaultValue` is used in its place.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n get = function(object, path, defaultValue) {\n var result;\n result = object === null ? void 0 : baseGet(object, toPath(path), path + '');\n if (result === void 0) {\n return defaultValue;\n } else {\n return result;\n }\n };\n _.get = get;\n }\n\n /*\n Author Nick McCready\n Intersection of Objects if the arrays have something in common each intersecting object will be returned\n in an new array.\n */\n this.intersectionObjects = function(array1, array2, comparison) {\n var res;\n if (comparison == null) {\n comparison = void 0;\n }\n res = _.map(array1, function(obj1) {\n return _.find(array2, function(obj2) {\n if (comparison != null) {\n return comparison(obj1, obj2);\n } else {\n return _.isEqual(obj1, obj2);\n }\n });\n });\n return _.filter(res, function(o) {\n return o != null;\n });\n };\n this.containsObject = _.includeObject = function(obj, target, comparison) {\n if (comparison == null) {\n comparison = void 0;\n }\n if (obj === null) {\n return false;\n }\n return _.some(obj, function(value) {\n if (comparison != null) {\n return comparison(value, target);\n } else {\n return _.isEqual(value, target);\n }\n });\n };\n this.differenceObjects = function(array1, array2, comparison) {\n if (comparison == null) {\n comparison = void 0;\n }\n return _.filter(array1, (function(_this) {\n return function(value) {\n return !_this.containsObject(array2, value, comparison);\n };\n })(this));\n };\n this.withoutObjects = this.differenceObjects;\n this.indexOfObject = function(array, item, comparison, isSorted) {\n var i, length;\n if (array == null) {\n return -1;\n }\n i = 0;\n length = array.length;\n if (isSorted) {\n if (typeof isSorted === \"number\") {\n i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);\n } else {\n i = _.sortedIndex(array, item);\n return (array[i] === item ? i : -1);\n }\n }\n while (i < length) {\n if (comparison != null) {\n if (comparison(array[i], item)) {\n return i;\n }\n } else {\n if (_.isEqual(array[i], item)) {\n return i;\n }\n }\n i++;\n }\n return -1;\n };\n this.isNullOrUndefined = function(thing) {\n return _.isNull(thing || _.isUndefined(thing));\n };\n return this;\n });\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.extensions').factory('uiGmapString', function() {\n return function(str) {\n this.contains = function(value, fromIndex) {\n return str.indexOf(value, fromIndex) !== -1;\n };\n return this;\n };\n });\n\n}).call(this);\n","\n/*global _:true,angular:true, */\n\n(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmap_sync', [\n function() {\n return {\n fakePromise: function() {\n var _cb;\n _cb = void 0;\n return {\n then: function(cb) {\n return _cb = cb;\n },\n resolve: function() {\n return _cb.apply(void 0, arguments);\n }\n };\n }\n };\n }\n ]).service('uiGmap_async', [\n '$timeout', 'uiGmapPromise', 'uiGmapLogger', '$q', 'uiGmapDataStructures', 'uiGmapGmapUtil', function($timeout, uiGmapPromise, $log, $q, uiGmapDataStructures, uiGmapGmapUtil) {\n var ExposedPromise, PromiseQueueManager, SniffedPromise, _getIterateeValue, _ignoreFields, defaultChunkSize, doChunk, doSkippPromise, each, errorObject, getArrayAndKeys, isInProgress, kickPromise, logTryCatch, managePromiseQueue, map, maybeCancelPromises, promiseStatus, promiseTypes, tryCatch;\n promiseTypes = uiGmapPromise.promiseTypes;\n isInProgress = uiGmapPromise.isInProgress;\n promiseStatus = uiGmapPromise.promiseStatus;\n ExposedPromise = uiGmapPromise.ExposedPromise;\n SniffedPromise = uiGmapPromise.SniffedPromise;\n kickPromise = function(sniffedPromise, cancelCb) {\n var promise;\n promise = sniffedPromise.promise();\n promise.promiseType = sniffedPromise.promiseType;\n if (promise.$$state) {\n $log.debug(\"promiseType: \" + promise.promiseType + \", state: \" + (promiseStatus(promise.$$state.status)));\n }\n promise.cancelCb = cancelCb;\n return promise;\n };\n doSkippPromise = function(sniffedPromise, lastPromise) {\n if (sniffedPromise.promiseType === promiseTypes.create && lastPromise.promiseType !== promiseTypes[\"delete\"] && lastPromise.promiseType !== promiseTypes.init) {\n $log.debug(\"lastPromise.promiseType \" + lastPromise.promiseType + \", newPromiseType: \" + sniffedPromise.promiseType + \", SKIPPED MUST COME AFTER DELETE ONLY\");\n return true;\n }\n return false;\n };\n maybeCancelPromises = function(queue, sniffedPromise, lastPromise) {\n var first;\n if (sniffedPromise.promiseType === promiseTypes[\"delete\"] && lastPromise.promiseType !== promiseTypes[\"delete\"]) {\n if ((lastPromise.cancelCb != null) && _.isFunction(lastPromise.cancelCb) && isInProgress(lastPromise)) {\n $log.debug(\"promiseType: \" + sniffedPromise.promiseType + \", CANCELING LAST PROMISE type: \" + lastPromise.promiseType);\n lastPromise.cancelCb('cancel safe');\n first = queue.peek();\n if ((first != null) && isInProgress(first)) {\n if (first.hasOwnProperty(\"cancelCb\") && _.isFunction(first.cancelCb)) {\n $log.debug(\"promiseType: \" + first.promiseType + \", CANCELING FIRST PROMISE type: \" + first.promiseType);\n return first.cancelCb('cancel safe');\n } else {\n return $log.warn('first promise was not cancelable');\n }\n }\n }\n }\n };\n\n /*\n From a High Level:\n This is a SniffedPromiseQueueManager (looking to rename) where the queue is existingPiecesObj.existingPieces.\n This is a function and should not be considered a class.\n So it is run to manage the state (cancel, skip, link) as needed.\n Purpose:\n The whole point is to check if there is existing async work going on. If so we wait on it.\n \n arguments:\n - existingPiecesObj = Queue\n - sniffedPromise = object wrapper holding a function to a pending (function) promise (promise: fnPromise)\n with its intended type.\n - cancelCb = callback which accepts a string, this string is intended to be returned at the end of _async.each iterator\n \n Where the cancelCb passed msg is 'cancel safe' _async.each will drop out and fall through. Thus canceling the promise\n gracefully without messing up state.\n \n Synopsis:\n \n - Promises have been broken down to 4 states create, update,delete (3 main) and init. (Helps boil down problems in ordering)\n where (init) is special to indicate that it is one of the first or to allow a create promise to work beyond being after a delete\n \n - Every Promise that comes in is enqueued and linked to the last promise in the queue.\n \n - A promise can be skipped or canceled to save cycles.\n \n Saved Cycles:\n - Skipped - This will only happen if async work comes in out of order. Where a pending create promise (un-executed) comes in\n after a delete promise.\n - Canceled - Where an incoming promise (un-executed promise) is of type delete and the any lastPromise is not a delete type.\n \n \n NOTE:\n - You should not muck with existingPieces as its state is dependent on this functional loop.\n - PromiseQueueManager should not be thought of as a class that has a life expectancy (it has none). It's sole\n purpose is to link, skip, and kill promises. It also manages the promise queue existingPieces.\n */\n PromiseQueueManager = function(existingPiecesObj, sniffedPromise, cancelCb) {\n var lastPromise, newPromise;\n if (!existingPiecesObj.existingPieces) {\n existingPiecesObj.existingPieces = new uiGmapDataStructures.Queue();\n return existingPiecesObj.existingPieces.enqueue(kickPromise(sniffedPromise, cancelCb));\n } else {\n lastPromise = _.last(existingPiecesObj.existingPieces._content);\n if (doSkippPromise(sniffedPromise, lastPromise)) {\n return;\n }\n maybeCancelPromises(existingPiecesObj.existingPieces, sniffedPromise, lastPromise);\n newPromise = ExposedPromise(lastPromise[\"finally\"](function() {\n return kickPromise(sniffedPromise, cancelCb);\n }));\n newPromise.cancelCb = cancelCb;\n newPromise.promiseType = sniffedPromise.promiseType;\n existingPiecesObj.existingPieces.enqueue(newPromise);\n return lastPromise[\"finally\"](function() {\n return existingPiecesObj.existingPieces.dequeue();\n });\n }\n };\n managePromiseQueue = function(objectToLock, promiseType, msg, cancelCb, fnPromise) {\n var cancelLogger;\n if (msg == null) {\n msg = '';\n }\n cancelLogger = function(msg) {\n $log.debug(msg + \": \" + msg);\n if ((cancelCb != null) && _.isFunction(cancelCb)) {\n return cancelCb(msg);\n }\n };\n return PromiseQueueManager(objectToLock, SniffedPromise(fnPromise, promiseType), cancelLogger);\n };\n defaultChunkSize = 80;\n errorObject = {\n value: null\n };\n tryCatch = function(fn, ctx, args) {\n var e, error1;\n try {\n return fn.apply(ctx, args);\n } catch (error1) {\n e = error1;\n errorObject.value = e;\n return errorObject;\n }\n };\n logTryCatch = function(fn, ctx, deferred, args) {\n var msg, result;\n result = tryCatch(fn, ctx, args);\n if (result === errorObject) {\n msg = \"error within chunking iterator: \" + errorObject.value;\n $log.error(msg);\n deferred.reject(msg);\n }\n if (result === 'cancel safe') {\n return false;\n }\n return true;\n };\n _getIterateeValue = function(collection, array, index) {\n var _isArray, valOrKey;\n _isArray = collection === array;\n valOrKey = array[index];\n if (_isArray) {\n return valOrKey;\n }\n return collection[valOrKey];\n };\n _ignoreFields = ['length', 'forEach', 'map'];\n getArrayAndKeys = function(collection, keys, bailOutCb, cb) {\n var array, propName, val;\n if (angular.isArray(collection)) {\n array = collection;\n } else {\n if (keys) {\n array = keys;\n } else {\n array = [];\n for (propName in collection) {\n val = collection[propName];\n if (collection.hasOwnProperty(propName) && !_.includes(_ignoreFields, propName)) {\n array.push(propName);\n }\n }\n }\n }\n if (cb == null) {\n cb = bailOutCb;\n }\n if (angular.isArray(array) && !(array != null ? array.length : void 0)) {\n if (cb !== bailOutCb) {\n return bailOutCb();\n }\n }\n return cb(array, keys);\n };\n\n /*\n Author: Nicholas McCready & jfriend00\n _async handles things asynchronous-like :), to allow the UI to be free'd to do other things\n Code taken from http://stackoverflow.com/questions/10344498/best-way-to-iterate-over-an-array-without-blocking-the-ui\n \n The design of any functionality of _async is to be like lodash/underscore and replicate it but call things\n asynchronously underneath. Each should be sufficient for most things to be derived from.\n \n Optional Asynchronous Chunking via promises.\n */\n doChunk = function(collection, chunkSizeOrDontChunk, pauseMilli, chunkCb, pauseCb, overallD, index, _keys) {\n return getArrayAndKeys(collection, _keys, function(array, keys) {\n var cnt, i, keepGoing, val;\n if (chunkSizeOrDontChunk && chunkSizeOrDontChunk < array.length) {\n cnt = chunkSizeOrDontChunk;\n } else {\n cnt = array.length;\n }\n i = index;\n keepGoing = true;\n while (keepGoing && cnt-- && i < (array ? array.length : i + 1)) {\n val = _getIterateeValue(collection, array, i);\n keepGoing = angular.isFunction(val) ? true : logTryCatch(chunkCb, void 0, overallD, [val, i]);\n ++i;\n }\n if (array) {\n if (keepGoing && i < array.length) {\n index = i;\n if (chunkSizeOrDontChunk) {\n if ((pauseCb != null) && _.isFunction(pauseCb)) {\n logTryCatch(pauseCb, void 0, overallD, []);\n }\n return $timeout(function() {\n return doChunk(collection, chunkSizeOrDontChunk, pauseMilli, chunkCb, pauseCb, overallD, index, keys);\n }, pauseMilli, false);\n }\n } else {\n return overallD.resolve();\n }\n }\n });\n };\n each = function(collection, chunk, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, _keys) {\n var error, overallD, ret;\n if (chunkSizeOrDontChunk == null) {\n chunkSizeOrDontChunk = defaultChunkSize;\n }\n if (index == null) {\n index = 0;\n }\n if (pauseMilli == null) {\n pauseMilli = 1;\n }\n ret = void 0;\n overallD = uiGmapPromise.defer();\n ret = overallD.promise;\n if (!pauseMilli) {\n error = 'pause (delay) must be set from _async!';\n $log.error(error);\n overallD.reject(error);\n return ret;\n }\n return getArrayAndKeys(collection, _keys, function() {\n overallD.resolve();\n return ret;\n }, function(array, keys) {\n doChunk(collection, chunkSizeOrDontChunk, pauseMilli, chunk, pauseCb, overallD, index, keys);\n return ret;\n });\n };\n map = function(collection, iterator, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, _keys) {\n var results;\n results = [];\n return getArrayAndKeys(collection, _keys, function() {\n return uiGmapPromise.resolve(results);\n }, function(array, keys) {\n return each(collection, function(o) {\n return results.push(iterator(o));\n }, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, keys).then(function() {\n return results;\n });\n });\n };\n return {\n each: each,\n map: map,\n managePromiseQueue: managePromiseQueue,\n promiseLock: managePromiseQueue,\n defaultChunkSize: defaultChunkSize,\n getArrayAndKeys: getArrayAndKeys,\n chunkSizeFrom: function(fromSize, ret) {\n if (ret == null) {\n ret = void 0;\n }\n if (_.isNumber(fromSize)) {\n ret = fromSize;\n }\n if (uiGmapGmapUtil.isFalse(fromSize) || fromSize === false) {\n ret = false;\n }\n return ret;\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapBaseObject', function() {\n var BaseObject, baseObjectKeywords;\n baseObjectKeywords = ['extended', 'included'];\n BaseObject = (function() {\n function BaseObject() {}\n\n BaseObject.extend = function(obj) {\n var key, ref, value;\n for (key in obj) {\n value = obj[key];\n if (indexOf.call(baseObjectKeywords, key) < 0) {\n this[key] = value;\n }\n }\n if ((ref = obj.extended) != null) {\n ref.apply(this);\n }\n return this;\n };\n\n BaseObject.include = function(obj) {\n var key, ref, value;\n for (key in obj) {\n value = obj[key];\n if (indexOf.call(baseObjectKeywords, key) < 0) {\n this.prototype[key] = value;\n }\n }\n if ((ref = obj.included) != null) {\n ref.apply(this);\n }\n return this;\n };\n\n return BaseObject;\n\n })();\n return BaseObject;\n });\n\n}).call(this);\n","\n/*\n Useful function callbacks that should be defined at later time.\n Mainly to be used for specs to verify creation / linking.\n\n This is to lead a common design in notifying child stuff.\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapChildEvents', function() {\n return {\n onChildCreation: function(child) {}\n };\n });\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapCtrlHandle', [\n '$q', function($q) {\n var CtrlHandle;\n return CtrlHandle = {\n handle: function($scope, $element) {\n $scope.$on('$destroy', function() {\n return CtrlHandle.handle($scope);\n });\n $scope.deferred = $q.defer();\n return {\n getScope: function() {\n return $scope;\n }\n };\n },\n mapPromise: function(scope, ctrl) {\n var mapScope;\n mapScope = ctrl.getScope();\n mapScope.deferred.promise.then(function(map) {\n return scope.map = map;\n });\n return mapScope.deferred.promise;\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module(\"uiGmapgoogle-maps.directives.api.utils\").service(\"uiGmapEventsHelper\", [\n \"uiGmapLogger\", function($log) {\n var _getEventsObj, _hasEvents;\n _hasEvents = function(obj) {\n return angular.isDefined(obj.events) && (obj.events != null) && angular.isObject(obj.events);\n };\n _getEventsObj = function(scope, model) {\n if (_hasEvents(scope)) {\n return scope;\n }\n if (_hasEvents(model)) {\n return model;\n }\n };\n return {\n setEvents: function(gObject, scope, model, ignores) {\n var eventObj;\n eventObj = _getEventsObj(scope, model);\n if (eventObj != null) {\n return _.compact(_.map(eventObj.events, function(eventHandler, eventName) {\n var doIgnore;\n if (ignores) {\n doIgnore = _(ignores).includes(eventName);\n }\n if (eventObj.events.hasOwnProperty(eventName) && angular.isFunction(eventObj.events[eventName]) && !doIgnore) {\n return google.maps.event.addListener(gObject, eventName, function() {\n if (!scope.$evalAsync) {\n scope.$evalAsync = function() {};\n }\n return scope.$evalAsync(eventHandler.apply(scope, [gObject, eventName, model, arguments]));\n });\n }\n }));\n }\n },\n removeEvents: function(listeners) {\n var key, l;\n if (!listeners) {\n return;\n }\n for (key in listeners) {\n l = listeners[key];\n if (l && listeners.hasOwnProperty(key)) {\n google.maps.event.removeListener(l);\n }\n }\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapFitHelper', [\n 'uiGmapLogger', '$timeout', function($log, $timeout) {\n return {\n fit: function(markersOrPoints, gMap) {\n var bounds, everSet, key, markerOrPoint, point;\n if (gMap && (markersOrPoints != null ? markersOrPoints.length : void 0)) {\n bounds = new google.maps.LatLngBounds();\n everSet = false;\n for (key in markersOrPoints) {\n markerOrPoint = markersOrPoints[key];\n if (markerOrPoint) {\n if (!everSet) {\n everSet = true;\n }\n point = _.isFunction(markerOrPoint.getPosition) ? markerOrPoint.getPosition() : markerOrPoint;\n }\n bounds.extend(point);\n }\n if (everSet) {\n return $timeout(function() {\n return gMap.fitBounds(bounds);\n });\n }\n }\n }\n };\n }\n ]);\n\n}).call(this);\n","\n/*global _:true, angular:true, google:true */\n\n(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapGmapUtil', [\n 'uiGmapLogger', '$compile', function(Logger, $compile) {\n var _isFalse, _isTruthy, getCoords, getLatitude, getLongitude, validateCoords;\n _isTruthy = function(value, bool, optionsArray) {\n return value === bool || optionsArray.indexOf(value) !== -1;\n };\n _isFalse = function(value) {\n return _isTruthy(value, false, ['false', 'FALSE', 0, 'n', 'N', 'no', 'NO']);\n };\n getLatitude = function(value) {\n if (Array.isArray(value) && value.length === 2) {\n return value[1];\n } else if (angular.isDefined(value.type) && value.type === 'Point') {\n return value.coordinates[1];\n } else {\n return value.latitude;\n }\n };\n getLongitude = function(value) {\n if (Array.isArray(value) && value.length === 2) {\n return value[0];\n } else if (angular.isDefined(value.type) && value.type === 'Point') {\n return value.coordinates[0];\n } else {\n return value.longitude;\n }\n };\n getCoords = function(value) {\n if (!value) {\n return;\n }\n if (value instanceof google.maps.LatLng) {\n return value;\n } else if (Array.isArray(value) && value.length === 2) {\n return new google.maps.LatLng(value[1], value[0]);\n } else if (angular.isDefined(value.type) && value.type === 'Point') {\n return new google.maps.LatLng(value.coordinates[1], value.coordinates[0]);\n } else {\n return new google.maps.LatLng(value.latitude, value.longitude);\n }\n };\n validateCoords = function(coords) {\n if (angular.isUndefined(coords)) {\n return false;\n }\n if (_.isArray(coords)) {\n if (coords.length === 2) {\n return true;\n }\n } else if ((coords != null) && (coords != null ? coords.type : void 0)) {\n if (coords.type === 'Point' && _.isArray(coords.coordinates) && coords.coordinates.length === 2) {\n return true;\n }\n }\n if (coords && angular.isDefined((coords != null ? coords.latitude : void 0) && angular.isDefined(coords != null ? coords.longitude : void 0))) {\n return true;\n }\n return false;\n };\n return {\n setCoordsFromEvent: function(prevValue, newLatLon) {\n if (!prevValue) {\n return;\n }\n if (Array.isArray(prevValue) && prevValue.length === 2) {\n prevValue[1] = newLatLon.lat();\n prevValue[0] = newLatLon.lng();\n } else if (angular.isDefined(prevValue.type) && prevValue.type === 'Point') {\n prevValue.coordinates[1] = newLatLon.lat();\n prevValue.coordinates[0] = newLatLon.lng();\n } else {\n prevValue.latitude = newLatLon.lat();\n prevValue.longitude = newLatLon.lng();\n }\n return prevValue;\n },\n getLabelPositionPoint: function(anchor) {\n var xPos, yPos;\n if (anchor === void 0) {\n return void 0;\n }\n anchor = /^([-\\d\\.]+)\\s([-\\d\\.]+)$/.exec(anchor);\n xPos = parseFloat(anchor[1]);\n yPos = parseFloat(anchor[2]);\n if ((xPos != null) && (yPos != null)) {\n return new google.maps.Point(xPos, yPos);\n }\n },\n createWindowOptions: function(gMarker, scope, content, defaults) {\n var options;\n if ((content != null) && (defaults != null) && ($compile != null)) {\n options = angular.extend({}, defaults, {\n content: this.buildContent(scope, defaults, content),\n position: defaults.position != null ? defaults.position : angular.isObject(gMarker) ? gMarker.getPosition() : getCoords(scope.coords)\n });\n if ((gMarker != null) && ((options != null ? options.pixelOffset : void 0) == null)) {\n if (options.boxClass == null) {\n\n } else {\n options.pixelOffset = {\n height: 0,\n width: -2\n };\n }\n }\n return options;\n } else {\n if (!defaults) {\n Logger.error('infoWindow defaults not defined');\n if (!content) {\n return Logger.error('infoWindow content not defined');\n }\n } else {\n return defaults;\n }\n }\n },\n buildContent: function(scope, defaults, content) {\n var parsed, ret;\n if (defaults.content != null) {\n ret = defaults.content;\n } else {\n if ($compile != null) {\n content = content.replace(/^\\s+|\\s+$/g, '');\n parsed = content === '' ? '' : $compile(content)(scope);\n if (parsed.length > 0) {\n ret = parsed[0];\n }\n } else {\n ret = content;\n }\n }\n return ret;\n },\n defaultDelay: 50,\n isTrue: function(value) {\n return _isTruthy(value, true, ['true', 'TRUE', 1, 'y', 'Y', 'yes', 'YES']);\n },\n isFalse: _isFalse,\n isFalsy: function(value) {\n return _isTruthy(value, false, [void 0, null]) || _isFalse(value);\n },\n getCoords: getCoords,\n validateCoords: validateCoords,\n equalCoords: function(coord1, coord2) {\n return getLatitude(coord1) === getLatitude(coord2) && getLongitude(coord1) === getLongitude(coord2);\n },\n validatePath: function(path) {\n var array, i, polygon, trackMaxVertices;\n i = 0;\n if (angular.isUndefined(path.type)) {\n if (!Array.isArray(path) || path.length < 2) {\n return false;\n }\n while (i < path.length) {\n if (!((angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) || (typeof path[i].lat === 'function' && typeof path[i].lng === 'function'))) {\n return false;\n }\n i++;\n }\n return true;\n } else {\n if (angular.isUndefined(path.coordinates)) {\n return false;\n }\n if (path.type === 'Polygon') {\n if (path.coordinates[0].length < 4) {\n return false;\n }\n array = path.coordinates[0];\n } else if (path.type === 'MultiPolygon') {\n trackMaxVertices = {\n max: 0,\n index: 0\n };\n _.forEach(path.coordinates, function(polygon, index) {\n if (polygon[0].length > this.max) {\n this.max = polygon[0].length;\n return this.index = index;\n }\n }, trackMaxVertices);\n polygon = path.coordinates[trackMaxVertices.index];\n array = polygon[0];\n if (array.length < 4) {\n return false;\n }\n } else if (path.type === 'LineString') {\n if (path.coordinates.length < 2) {\n return false;\n }\n array = path.coordinates;\n } else {\n return false;\n }\n while (i < array.length) {\n if (array[i].length !== 2) {\n return false;\n }\n i++;\n }\n return true;\n }\n },\n convertPathPoints: function(path) {\n var array, i, latlng, result, trackMaxVertices;\n i = 0;\n result = new google.maps.MVCArray();\n if (angular.isUndefined(path.type)) {\n while (i < path.length) {\n latlng;\n if (angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) {\n latlng = new google.maps.LatLng(path[i].latitude, path[i].longitude);\n } else if (typeof path[i].lat === 'function' && typeof path[i].lng === 'function') {\n latlng = path[i];\n }\n result.push(latlng);\n i++;\n }\n } else {\n array;\n if (path.type === 'Polygon') {\n array = path.coordinates[0];\n } else if (path.type === 'MultiPolygon') {\n trackMaxVertices = {\n max: 0,\n index: 0\n };\n _.forEach(path.coordinates, function(polygon, index) {\n if (polygon[0].length > this.max) {\n this.max = polygon[0].length;\n return this.index = index;\n }\n }, trackMaxVertices);\n array = path.coordinates[trackMaxVertices.index][0];\n } else if (path.type === 'LineString') {\n array = path.coordinates;\n }\n while (i < array.length) {\n result.push(new google.maps.LatLng(array[i][1], array[i][0]));\n i++;\n }\n }\n return result;\n },\n getPath: function(object, key) {\n var obj;\n if ((key == null) || !_.isString(key)) {\n return key;\n }\n obj = object;\n _.each(key.split('.'), function(value) {\n if (obj) {\n return obj = obj[value];\n }\n });\n return obj;\n },\n validateBoundPoints: function(bounds) {\n if (angular.isUndefined(bounds.sw.latitude) || angular.isUndefined(bounds.sw.longitude) || angular.isUndefined(bounds.ne.latitude) || angular.isUndefined(bounds.ne.longitude)) {\n return false;\n }\n return true;\n },\n convertBoundPoints: function(bounds) {\n var result;\n result = new google.maps.LatLngBounds(new google.maps.LatLng(bounds.sw.latitude, bounds.sw.longitude), new google.maps.LatLng(bounds.ne.latitude, bounds.ne.longitude));\n return result;\n },\n fitMapBounds: function(map, bounds) {\n return map.fitBounds(bounds);\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapIsReady', [\n '$q', '$timeout', function($q, $timeout) {\n var _checkIfReady, _ctr, _promises, _proms;\n _ctr = 0;\n _proms = [];\n _promises = function() {\n return $q.all(_proms);\n };\n _checkIfReady = function(deferred, expectedInstances, retriesLeft) {\n return $timeout(function() {\n if (retriesLeft <= 0) {\n deferred.reject('Your maps are not found we have checked the maximum amount of times. :)');\n return;\n }\n if (_ctr !== expectedInstances) {\n _checkIfReady(deferred, expectedInstances, retriesLeft - 1);\n } else {\n deferred.resolve(_promises());\n }\n }, 100);\n };\n return {\n spawn: function() {\n var d;\n d = $q.defer();\n _proms.push(d.promise);\n _ctr += 1;\n return {\n instance: _ctr,\n deferred: d\n };\n },\n promises: _promises,\n instances: function() {\n return _ctr;\n },\n promise: function(expectedInstances, numRetries) {\n var d;\n if (expectedInstances == null) {\n expectedInstances = 1;\n }\n if (numRetries == null) {\n numRetries = 50;\n }\n d = $q.defer();\n _checkIfReady(d, expectedInstances, numRetries);\n return d.promise;\n },\n reset: function() {\n _ctr = 0;\n _proms.length = 0;\n },\n decrement: function() {\n if (_ctr > 0) {\n _ctr -= 1;\n }\n if (_proms.length) {\n _proms.length -= 1;\n }\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module(\"uiGmapgoogle-maps.directives.api.utils\").factory(\"uiGmapLinked\", [\n \"uiGmapBaseObject\", function(BaseObject) {\n var Linked;\n Linked = (function(superClass) {\n extend(Linked, superClass);\n\n function Linked(scope, element, attrs, ctrls) {\n this.scope = scope;\n this.element = element;\n this.attrs = attrs;\n this.ctrls = ctrls;\n }\n\n return Linked;\n\n })(BaseObject);\n return Linked;\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapLogger', [\n 'nemSimpleLogger', function(nemSimpleLogger) {\n return nemSimpleLogger.spawn();\n }\n ]);\n\n}).call(this);\n","\n/*global _:true, angular:true */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapModelKey', [\n 'uiGmapBaseObject', 'uiGmapGmapUtil', function(BaseObject, GmapUtil) {\n return (function(superClass) {\n extend(_Class, superClass);\n\n function _Class(scope1, _interface) {\n this.scope = scope1;\n this[\"interface\"] = _interface != null ? _interface : {\n scopeKeys: []\n };\n this.modelsLength = bind(this.modelsLength, this);\n this.updateChild = bind(this.updateChild, this);\n this.destroy = bind(this.destroy, this);\n this.setChildScope = bind(this.setChildScope, this);\n this.getChanges = bind(this.getChanges, this);\n this.getProp = bind(this.getProp, this);\n this.setIdKey = bind(this.setIdKey, this);\n this.modelKeyComparison = bind(this.modelKeyComparison, this);\n _Class.__super__.constructor.call(this);\n this.defaultIdKey = 'id';\n this.idKey = void 0;\n }\n\n _Class.prototype.evalModelHandle = function(model, modelKey) {\n if ((model == null) || (modelKey == null)) {\n return;\n }\n if (modelKey === 'self') {\n return model;\n } else {\n if (_.isFunction(modelKey)) {\n modelKey = modelKey();\n }\n return GmapUtil.getPath(model, modelKey);\n }\n };\n\n _Class.prototype.modelKeyComparison = function(model1, model2) {\n var coord1, coord2, hasCoords, isEqual, scope, without;\n hasCoords = this[\"interface\"].scopeKeys.indexOf('coords') >= 0;\n if (hasCoords && (this.scope.coords != null) || !hasCoords) {\n scope = this.scope;\n }\n if (scope == null) {\n throw 'No scope set!';\n }\n if (hasCoords) {\n coord1 = this.scopeOrModelVal('coords', scope, model1);\n coord2 = this.scopeOrModelVal('coords', scope, model2);\n isEqual = GmapUtil.equalCoords(coord1, coord2);\n if (!isEqual) {\n return isEqual;\n }\n }\n without = _.without(this[\"interface\"].scopeKeys, 'coords');\n isEqual = _.every(without, (function(_this) {\n return function(k) {\n var m1, m2;\n m1 = _this.scopeOrModelVal(scope[k], scope, model1);\n m2 = _this.scopeOrModelVal(scope[k], scope, model2);\n if (scope.deepComparison) {\n return _.isEqual(m1, m2);\n } else {\n return m1 === m2;\n }\n };\n })(this));\n return isEqual;\n };\n\n _Class.prototype.setIdKey = function(scope) {\n return this.idKey = scope.idKey != null ? scope.idKey : this.defaultIdKey;\n };\n\n _Class.prototype.setVal = function(model, key, newValue) {\n this.modelOrKey(model, key = newValue);\n return model;\n };\n\n _Class.prototype.modelOrKey = function(model, key) {\n if (key == null) {\n return;\n }\n if (key !== 'self') {\n return GmapUtil.getPath(model, key);\n }\n return model;\n };\n\n _Class.prototype.getProp = function(propName, scope, model) {\n return this.scopeOrModelVal(propName, scope, model);\n };\n\n\n /*\n For the cases were watching a large object we only want to know the list of props\n that actually changed.\n Also we want to limit the amount of props we analyze to whitelisted props that are\n actually tracked by scope. (should make things faster with whitelisted)\n */\n\n _Class.prototype.getChanges = function(now, prev, whitelistedProps) {\n var c, changes, prop;\n if (whitelistedProps) {\n prev = _.pick(prev, whitelistedProps);\n now = _.pick(now, whitelistedProps);\n }\n changes = {};\n prop = {};\n c = {};\n for (prop in now) {\n if (!prev || prev[prop] !== now[prop]) {\n if (_.isArray(now[prop])) {\n changes[prop] = now[prop];\n } else if (_.isObject(now[prop])) {\n c = this.getChanges(now[prop], (prev ? prev[prop] : null));\n if (!_.isEmpty(c)) {\n changes[prop] = c;\n }\n } else {\n changes[prop] = now[prop];\n }\n }\n }\n return changes;\n };\n\n _Class.prototype.scopeOrModelVal = function(key, scope, model, doWrap) {\n var maybeWrap, modelKey, modelProp, scopeProp;\n if (doWrap == null) {\n doWrap = false;\n }\n maybeWrap = function(isScope, ret, doWrap) {\n if (doWrap == null) {\n doWrap = false;\n }\n if (doWrap) {\n return {\n isScope: isScope,\n value: ret\n };\n }\n return ret;\n };\n scopeProp = _.get(scope, key);\n if (_.isFunction(scopeProp)) {\n return maybeWrap(true, scopeProp(model), doWrap);\n }\n if (_.isObject(scopeProp)) {\n return maybeWrap(true, scopeProp, doWrap);\n }\n if (!_.isString(scopeProp)) {\n return maybeWrap(true, scopeProp, doWrap);\n }\n modelKey = scopeProp;\n if (!modelKey) {\n modelProp = _.get(model, key);\n } else {\n modelProp = modelKey === 'self' ? model : _.get(model, modelKey);\n }\n if (_.isFunction(modelProp)) {\n return maybeWrap(false, modelProp(), doWrap);\n }\n return maybeWrap(false, modelProp, doWrap);\n };\n\n _Class.prototype.setChildScope = function(keys, childScope, model) {\n var isScopeObj, key, name, newValue;\n for (key in keys) {\n name = keys[key];\n isScopeObj = this.scopeOrModelVal(name, childScope, model, true);\n if ((isScopeObj != null ? isScopeObj.value : void 0) != null) {\n newValue = isScopeObj.value;\n if (newValue !== childScope[name]) {\n childScope[name] = newValue;\n }\n }\n }\n return childScope.model = model;\n };\n\n _Class.prototype.onDestroy = function(scope) {};\n\n _Class.prototype.destroy = function(manualOverride) {\n var ref;\n if (manualOverride == null) {\n manualOverride = false;\n }\n if ((this.scope != null) && !((ref = this.scope) != null ? ref.$$destroyed : void 0) && (this.needToManualDestroy || manualOverride)) {\n return this.scope.$destroy();\n } else {\n return this.clean();\n }\n };\n\n _Class.prototype.updateChild = function(child, model) {\n if (model[this.idKey] == null) {\n this.$log.error(\"Model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key.\");\n return;\n }\n return child.updateModel(model);\n };\n\n _Class.prototype.modelsLength = function(arrayOrObjModels) {\n var len, toCheck;\n if (arrayOrObjModels == null) {\n arrayOrObjModels = void 0;\n }\n len = 0;\n toCheck = arrayOrObjModels ? arrayOrObjModels : this.scope.models;\n if (toCheck == null) {\n return len;\n }\n if (angular.isArray(toCheck) || (toCheck.length != null)) {\n len = toCheck.length;\n } else {\n len = Object.keys(toCheck).length;\n }\n return len;\n };\n\n return _Class;\n\n })(BaseObject);\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').factory('uiGmapModelsWatcher', [\n 'uiGmapLogger', 'uiGmap_async', '$q', 'uiGmapPromise', function(Logger, _async, $q, uiGmapPromise) {\n return {\n didQueueInitPromise: function(existingPiecesObj, scope) {\n if (scope.models.length === 0) {\n _async.promiseLock(existingPiecesObj, uiGmapPromise.promiseTypes.init, null, null, (function() {\n return uiGmapPromise.resolve();\n }));\n return true;\n }\n return false;\n },\n figureOutState: function(idKey, scope, childObjects, comparison, callBack) {\n var adds, children, mappedScopeModelIds, removals, updates;\n adds = [];\n mappedScopeModelIds = {};\n removals = [];\n updates = [];\n scope.models.forEach(function(m) {\n var child;\n if (m[idKey] != null) {\n mappedScopeModelIds[m[idKey]] = {};\n if (childObjects.get(m[idKey]) == null) {\n return adds.push(m);\n } else {\n child = childObjects.get(m[idKey]);\n if (!comparison(m, child.clonedModel, scope)) {\n return updates.push({\n model: m,\n child: child\n });\n }\n }\n } else {\n return Logger.error(' id missing for model #{m.toString()},\\ncan not use do comparison/insertion');\n }\n });\n children = childObjects.values();\n children.forEach(function(c) {\n var id;\n if (c == null) {\n Logger.error('child undefined in ModelsWatcher.');\n return;\n }\n if (c.model == null) {\n Logger.error('child.model undefined in ModelsWatcher.');\n return;\n }\n id = c.model[idKey];\n if (mappedScopeModelIds[id] == null) {\n return removals.push(c);\n }\n });\n return {\n adds: adds,\n removals: removals,\n updates: updates\n };\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapPromise', [\n '$q', '$timeout', 'uiGmapLogger', function($q, $timeout, $log) {\n var ExposedPromise, SniffedPromise, defer, isInProgress, isResolved, promise, promiseStatus, promiseStatuses, promiseTypes, resolve, strPromiseStatuses;\n promiseTypes = {\n create: 'create',\n update: 'update',\n \"delete\": 'delete',\n init: 'init'\n };\n promiseStatuses = {\n IN_PROGRESS: 0,\n RESOLVED: 1,\n REJECTED: 2\n };\n strPromiseStatuses = (function() {\n var obj;\n obj = {};\n obj[\"\" + promiseStatuses.IN_PROGRESS] = 'in-progress';\n obj[\"\" + promiseStatuses.RESOLVED] = 'resolved';\n obj[\"\" + promiseStatuses.REJECTED] = 'rejected';\n return obj;\n })();\n isInProgress = function(promise) {\n if (promise.$$state) {\n return promise.$$state.status === promiseStatuses.IN_PROGRESS;\n }\n if (!promise.hasOwnProperty(\"$$v\")) {\n return true;\n }\n };\n isResolved = function(promise) {\n if (promise.$$state) {\n return promise.$$state.status === promiseStatuses.RESOLVED;\n }\n if (promise.hasOwnProperty(\"$$v\")) {\n return true;\n }\n };\n promiseStatus = function(status) {\n return strPromiseStatuses[status] || 'done w error';\n };\n ExposedPromise = function(promise) {\n var cancelDeferred, combined, wrapped;\n cancelDeferred = $q.defer();\n combined = $q.all([promise, cancelDeferred.promise]);\n wrapped = $q.defer();\n promise.then(cancelDeferred.resolve, (function() {}), function(notify) {\n cancelDeferred.notify(notify);\n return wrapped.notify(notify);\n });\n combined.then(function(successes) {\n return wrapped.resolve(successes[0] || successes[1]);\n }, function(error) {\n return wrapped.reject(error);\n });\n wrapped.promise.cancel = function(reason) {\n if (reason == null) {\n reason = 'canceled';\n }\n return cancelDeferred.reject(reason);\n };\n wrapped.promise.notify = function(msg) {\n if (msg == null) {\n msg = 'cancel safe';\n }\n wrapped.notify(msg);\n if (promise.hasOwnProperty('notify')) {\n return promise.notify(msg);\n }\n };\n if (promise.promiseType != null) {\n wrapped.promise.promiseType = promise.promiseType;\n }\n return wrapped.promise;\n };\n SniffedPromise = function(fnPromise, promiseType) {\n return {\n promise: fnPromise,\n promiseType: promiseType\n };\n };\n defer = function() {\n return $q.defer();\n };\n resolve = function() {\n var d;\n d = $q.defer();\n d.resolve.apply(void 0, arguments);\n return d.promise;\n };\n promise = function(fnToWrap) {\n var d;\n if (!_.isFunction(fnToWrap)) {\n $log.error(\"uiGmapPromise.promise() only accepts functions\");\n return;\n }\n d = $q.defer();\n $timeout(function() {\n var result;\n result = fnToWrap();\n return d.resolve(result);\n });\n return d.promise;\n };\n return {\n defer: defer,\n promise: promise,\n resolve: resolve,\n promiseTypes: promiseTypes,\n isInProgress: isInProgress,\n isResolved: isResolved,\n promiseStatus: promiseStatus,\n ExposedPromise: ExposedPromise,\n SniffedPromise: SniffedPromise\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n angular.module(\"uiGmapgoogle-maps.directives.api.utils\").factory(\"uiGmapPropMap\", function() {\n\n /*\n Simple Object Map with a length property to make it easy to track length/size\n */\n var PropMap;\n return PropMap = (function() {\n function PropMap() {\n this.removeAll = bind(this.removeAll, this);\n this.slice = bind(this.slice, this);\n this.push = bind(this.push, this);\n this.keys = bind(this.keys, this);\n this.values = bind(this.values, this);\n this.remove = bind(this.remove, this);\n this.put = bind(this.put, this);\n this.stateChanged = bind(this.stateChanged, this);\n this.get = bind(this.get, this);\n this.length = 0;\n this.dict = {};\n this.didValsStateChange = false;\n this.didKeysStateChange = false;\n this.allVals = [];\n this.allKeys = [];\n }\n\n PropMap.prototype.get = function(key) {\n return this.dict[key];\n };\n\n PropMap.prototype.stateChanged = function() {\n this.didValsStateChange = true;\n return this.didKeysStateChange = true;\n };\n\n PropMap.prototype.put = function(key, value) {\n if (this.get(key) == null) {\n this.length++;\n }\n this.stateChanged();\n return this.dict[key] = value;\n };\n\n PropMap.prototype.remove = function(key, isSafe) {\n var value;\n if (isSafe == null) {\n isSafe = false;\n }\n if (isSafe && !this.get(key)) {\n return void 0;\n }\n value = this.dict[key];\n delete this.dict[key];\n this.length--;\n this.stateChanged();\n return value;\n };\n\n PropMap.prototype.valuesOrKeys = function(str) {\n var keys, vals;\n if (str == null) {\n str = 'Keys';\n }\n if (!this[\"did\" + str + \"StateChange\"]) {\n return this['all' + str];\n }\n vals = [];\n keys = [];\n _.each(this.dict, function(v, k) {\n vals.push(v);\n return keys.push(k);\n });\n this.didKeysStateChange = false;\n this.didValsStateChange = false;\n this.allVals = vals;\n this.allKeys = keys;\n return this['all' + str];\n };\n\n PropMap.prototype.values = function() {\n return this.valuesOrKeys('Vals');\n };\n\n PropMap.prototype.keys = function() {\n return this.valuesOrKeys();\n };\n\n PropMap.prototype.push = function(obj, key) {\n if (key == null) {\n key = \"key\";\n }\n return this.put(obj[key], obj);\n };\n\n PropMap.prototype.slice = function() {\n return this.keys().map((function(_this) {\n return function(k) {\n return _this.remove(k);\n };\n })(this));\n };\n\n PropMap.prototype.removeAll = function() {\n return this.slice();\n };\n\n PropMap.prototype.each = function(cb) {\n return _.each(this.dict, function(v, k) {\n return cb(v);\n });\n };\n\n PropMap.prototype.map = function(cb) {\n return _.map(this.dict, function(v, k) {\n return cb(v);\n });\n };\n\n return PropMap;\n\n })();\n });\n\n}).call(this);\n","\n/*globals angular,_ */\n\n(function() {\n angular.module(\"uiGmapgoogle-maps.directives.api.utils\").factory(\"uiGmapPropertyAction\", [\n \"uiGmapLogger\", function(Logger) {\n var PropertyAction;\n PropertyAction = function(setterFn) {\n this.setIfChange = function(callingKey) {\n return function(newVal, oldVal) {\n if (!_.isEqual(oldVal, newVal)) {\n return setterFn(callingKey, newVal);\n }\n };\n };\n this.sic = this.setIfChange;\n return this;\n };\n return PropertyAction;\n }\n ]);\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n angular.module('uiGmapgoogle-maps.directives.api.managers').factory('uiGmapClustererMarkerManager', [\n 'uiGmapLogger', 'uiGmapFitHelper', 'uiGmapPropMap', 'uiGmapEventsHelper', function($log, FitHelper, PropMap, EventsHelper) {\n var ClustererMarkerManager;\n ClustererMarkerManager = (function() {\n ClustererMarkerManager.type = 'ClustererMarkerManager';\n\n function ClustererMarkerManager(gMap, opt_markers, opt_options, opt_events) {\n if (opt_markers == null) {\n opt_markers = {};\n }\n this.opt_options = opt_options != null ? opt_options : {};\n this.opt_events = opt_events;\n this.getGMarkers = bind(this.getGMarkers, this);\n this.fit = bind(this.fit, this);\n this.destroy = bind(this.destroy, this);\n this.attachEvents = bind(this.attachEvents, this);\n this.clear = bind(this.clear, this);\n this.draw = bind(this.draw, this);\n this.removeMany = bind(this.removeMany, this);\n this.remove = bind(this.remove, this);\n this.addMany = bind(this.addMany, this);\n this.update = bind(this.update, this);\n this.add = bind(this.add, this);\n this.type = ClustererMarkerManager.type;\n this.clusterer = new NgMapMarkerClusterer(gMap, opt_markers, this.opt_options);\n this.propMapGMarkers = new PropMap();\n this.attachEvents(this.opt_events, 'opt_events');\n this.clusterer.setIgnoreHidden(true);\n this.noDrawOnSingleAddRemoves = true;\n $log.info(this);\n }\n\n ClustererMarkerManager.prototype.checkKey = function(gMarker) {\n var msg;\n if (gMarker.key == null) {\n msg = 'gMarker.key undefined and it is REQUIRED!!';\n return $log.error(msg);\n }\n };\n\n ClustererMarkerManager.prototype.add = function(gMarker) {\n this.checkKey(gMarker);\n this.clusterer.addMarker(gMarker, this.noDrawOnSingleAddRemoves);\n this.propMapGMarkers.put(gMarker.key, gMarker);\n return this.checkSync();\n };\n\n ClustererMarkerManager.prototype.update = function(gMarker) {\n this.remove(gMarker);\n return this.add(gMarker);\n };\n\n ClustererMarkerManager.prototype.addMany = function(gMarkers) {\n return gMarkers.forEach((function(_this) {\n return function(gMarker) {\n return _this.add(gMarker);\n };\n })(this));\n };\n\n ClustererMarkerManager.prototype.remove = function(gMarker) {\n var exists;\n this.checkKey(gMarker);\n exists = this.propMapGMarkers.get(gMarker.key);\n if (exists) {\n this.clusterer.removeMarker(gMarker, this.noDrawOnSingleAddRemoves);\n this.propMapGMarkers.remove(gMarker.key);\n }\n return this.checkSync();\n };\n\n ClustererMarkerManager.prototype.removeMany = function(gMarkers) {\n return gMarkers.forEach((function(_this) {\n return function(gMarker) {\n return _this.remove(gMarker);\n };\n })(this));\n };\n\n ClustererMarkerManager.prototype.draw = function() {\n return this.clusterer.repaint();\n };\n\n ClustererMarkerManager.prototype.clear = function() {\n this.removeMany(this.getGMarkers());\n return this.clusterer.repaint();\n };\n\n ClustererMarkerManager.prototype.attachEvents = function(options, optionsName) {\n var eventHandler, eventName, results;\n this.listeners = [];\n if (angular.isDefined(options) && (options != null) && angular.isObject(options)) {\n results = [];\n for (eventName in options) {\n eventHandler = options[eventName];\n if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) {\n $log.info(optionsName + \": Attaching event: \" + eventName + \" to clusterer\");\n results.push(this.listeners.push(google.maps.event.addListener(this.clusterer, eventName, options[eventName])));\n } else {\n results.push(void 0);\n }\n }\n return results;\n }\n };\n\n ClustererMarkerManager.prototype.clearEvents = function() {\n EventsHelper.removeEvents(this.listeners);\n return this.listeners = [];\n };\n\n ClustererMarkerManager.prototype.destroy = function() {\n this.clearEvents();\n return this.clear();\n };\n\n ClustererMarkerManager.prototype.fit = function() {\n return FitHelper.fit(this.getGMarkers(), this.clusterer.getMap());\n };\n\n ClustererMarkerManager.prototype.getGMarkers = function() {\n return this.clusterer.getMarkers().values();\n };\n\n ClustererMarkerManager.prototype.checkSync = function() {};\n\n return ClustererMarkerManager;\n\n })();\n return ClustererMarkerManager;\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.managers').service('uiGmapGoogleMapObjectManager', [\n function() {\n var _availableInstances, _usedInstances;\n _availableInstances = [];\n _usedInstances = [];\n return {\n createMapInstance: function(parentElement, options) {\n var instance;\n instance = null;\n if (_availableInstances.length === 0) {\n instance = new google.maps.Map(parentElement, options);\n _usedInstances.push(instance);\n } else {\n instance = _availableInstances.pop();\n angular.element(parentElement).append(instance.getDiv());\n instance.setOptions(options);\n _usedInstances.push(instance);\n }\n return instance;\n },\n recycleMapInstance: function(instance) {\n var index;\n index = _usedInstances.indexOf(instance);\n if (index < 0) {\n throw new Error('Expected map instance to be a previously used instance');\n }\n _usedInstances.splice(index, 1);\n return _availableInstances.push(instance);\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n angular.module(\"uiGmapgoogle-maps.directives.api.managers\").factory(\"uiGmapMarkerManager\", [\n \"uiGmapLogger\", \"uiGmapFitHelper\", \"uiGmapPropMap\", function(Logger, FitHelper, PropMap) {\n var MarkerManager;\n MarkerManager = (function() {\n MarkerManager.type = 'MarkerManager';\n\n function MarkerManager(gMap, opt_markers, opt_options) {\n this.getGMarkers = bind(this.getGMarkers, this);\n this.fit = bind(this.fit, this);\n this.handleOptDraw = bind(this.handleOptDraw, this);\n this.clear = bind(this.clear, this);\n this.destroy = bind(this.destroy, this);\n this.draw = bind(this.draw, this);\n this.removeMany = bind(this.removeMany, this);\n this.remove = bind(this.remove, this);\n this.addMany = bind(this.addMany, this);\n this.update = bind(this.update, this);\n this.add = bind(this.add, this);\n this.type = MarkerManager.type;\n this.gMap = gMap;\n this.gMarkers = new PropMap();\n this.$log = Logger;\n this.$log.info(this);\n }\n\n MarkerManager.prototype.add = function(gMarker, optDraw) {\n var exists, msg;\n if (optDraw == null) {\n optDraw = true;\n }\n if (gMarker.key == null) {\n msg = \"gMarker.key undefined and it is REQUIRED!!\";\n Logger.error(msg);\n throw msg;\n }\n exists = this.gMarkers.get(gMarker.key);\n if (!exists) {\n this.handleOptDraw(gMarker, optDraw, true);\n return this.gMarkers.put(gMarker.key, gMarker);\n }\n };\n\n MarkerManager.prototype.update = function(gMarker, optDraw) {\n if (optDraw == null) {\n optDraw = true;\n }\n this.remove(gMarker, optDraw);\n return this.add(gMarker, optDraw);\n };\n\n MarkerManager.prototype.addMany = function(gMarkers) {\n return gMarkers.forEach((function(_this) {\n return function(gMarker) {\n return _this.add(gMarker);\n };\n })(this));\n };\n\n MarkerManager.prototype.remove = function(gMarker, optDraw) {\n if (optDraw == null) {\n optDraw = true;\n }\n this.handleOptDraw(gMarker, optDraw, false);\n if (this.gMarkers.get(gMarker.key)) {\n return this.gMarkers.remove(gMarker.key);\n }\n };\n\n MarkerManager.prototype.removeMany = function(gMarkers) {\n return gMarkers.forEach((function(_this) {\n return function(marker) {\n return _this.remove(marker);\n };\n })(this));\n };\n\n MarkerManager.prototype.draw = function() {\n var deletes;\n deletes = [];\n this.gMarkers.each((function(_this) {\n return function(gMarker) {\n if (!gMarker.isDrawn) {\n if (gMarker.doAdd) {\n gMarker.setMap(_this.gMap);\n return gMarker.isDrawn = true;\n } else {\n return deletes.push(gMarker);\n }\n }\n };\n })(this));\n return deletes.forEach((function(_this) {\n return function(gMarker) {\n gMarker.isDrawn = false;\n return _this.remove(gMarker, true);\n };\n })(this));\n };\n\n MarkerManager.prototype.destroy = function() {\n return this.clear();\n };\n\n MarkerManager.prototype.clear = function() {\n this.gMarkers.each(function(gMarker) {\n return gMarker.setMap(null);\n });\n delete this.gMarkers;\n return this.gMarkers = new PropMap();\n };\n\n MarkerManager.prototype.handleOptDraw = function(gMarker, optDraw, doAdd) {\n if (optDraw === true) {\n if (doAdd) {\n gMarker.setMap(this.gMap);\n } else {\n gMarker.setMap(null);\n }\n return gMarker.isDrawn = true;\n } else {\n gMarker.isDrawn = false;\n return gMarker.doAdd = doAdd;\n }\n };\n\n MarkerManager.prototype.fit = function() {\n return FitHelper.fit(this.getGMarkers(), this.gMap);\n };\n\n MarkerManager.prototype.getGMarkers = function() {\n return this.gMarkers.values();\n };\n\n return MarkerManager;\n\n })();\n return MarkerManager;\n }\n ]);\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n angular.module('uiGmapgoogle-maps.directives.api.managers').factory('uiGmapSpiderfierMarkerManager', [\n 'uiGmapLogger', 'uiGmapFitHelper', 'uiGmapPropMap', 'uiGmapMarkerSpiderfier', function($log, FitHelper, PropMap, MarkerSpiderfier) {\n var SpiderfierMarkerManager;\n return SpiderfierMarkerManager = (function() {\n SpiderfierMarkerManager.type = 'SpiderfierMarkerManager';\n\n function SpiderfierMarkerManager(gMap, opt_markers, opt_options, opt_events, scope) {\n if (opt_markers == null) {\n opt_markers = {};\n }\n this.opt_options = opt_options != null ? opt_options : {};\n this.opt_events = opt_events;\n this.scope = scope;\n this.isSpiderfied = bind(this.isSpiderfied, this);\n this.getGMarkers = bind(this.getGMarkers, this);\n this.fit = bind(this.fit, this);\n this.destroy = bind(this.destroy, this);\n this.attachEvents = bind(this.attachEvents, this);\n this.clear = bind(this.clear, this);\n this.removeMany = bind(this.removeMany, this);\n this.remove = bind(this.remove, this);\n this.addMany = bind(this.addMany, this);\n this.update = bind(this.update, this);\n this.add = bind(this.add, this);\n this.type = SpiderfierMarkerManager.type;\n this.markerSpiderfier = new MarkerSpiderfier(gMap, this.opt_options);\n this.propMapGMarkers = new PropMap();\n this.attachEvents(this.opt_events, 'opt_events');\n this.noDrawOnSingleAddRemoves = true;\n $log.info(this);\n }\n\n SpiderfierMarkerManager.prototype.checkKey = function(gMarker) {\n var msg;\n if (gMarker.key == null) {\n msg = 'gMarker.key undefined and it is REQUIRED!!';\n return $log.error(msg);\n }\n };\n\n SpiderfierMarkerManager.prototype.add = function(gMarker) {\n gMarker.setMap(this.markerSpiderfier.map);\n this.checkKey(gMarker);\n this.markerSpiderfier.addMarker(gMarker, this.noDrawOnSingleAddRemoves);\n this.propMapGMarkers.put(gMarker.key, gMarker);\n return this.checkSync();\n };\n\n SpiderfierMarkerManager.prototype.update = function(gMarker) {\n this.remove(gMarker);\n return this.add(gMarker);\n };\n\n SpiderfierMarkerManager.prototype.addMany = function(gMarkers) {\n return gMarkers.forEach((function(_this) {\n return function(gMarker) {\n return _this.add(gMarker);\n };\n })(this));\n };\n\n SpiderfierMarkerManager.prototype.remove = function(gMarker) {\n var exists;\n this.checkKey(gMarker);\n exists = this.propMapGMarkers.get(gMarker.key);\n if (exists) {\n gMarker.setMap(null);\n this.markerSpiderfier.removeMarker(gMarker, this.noDrawOnSingleAddRemoves);\n this.propMapGMarkers.remove(gMarker.key);\n }\n return this.checkSync();\n };\n\n SpiderfierMarkerManager.prototype.removeMany = function(gMarkers) {\n return gMarkers.forEach((function(_this) {\n return function(gMarker) {\n return _this.remove(gMarker);\n };\n })(this));\n };\n\n SpiderfierMarkerManager.prototype.draw = function() {};\n\n SpiderfierMarkerManager.prototype.clear = function() {\n return this.removeMany(this.getGMarkers());\n };\n\n SpiderfierMarkerManager.prototype.attachEvents = function(options, optionsName) {\n if (angular.isDefined(options) && (options != null) && angular.isObject(options)) {\n return _.each(options, (function(_this) {\n return function(eventHandler, eventName) {\n if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) {\n $log.info(optionsName + \": Attaching event: \" + eventName + \" to markerSpiderfier\");\n return _this.markerSpiderfier.addListener(eventName, function() {\n if (eventName === 'spiderfy' || eventName === 'unspiderfy') {\n return _this.scope.$evalAsync(options[eventName].apply(options, arguments));\n } else {\n return _this.scope.$evalAsync(options[eventName].apply(options, [arguments[0], eventName, arguments[0].model, arguments]));\n }\n });\n }\n };\n })(this));\n }\n };\n\n SpiderfierMarkerManager.prototype.clearEvents = function(options, optionsName) {\n var eventHandler, eventName;\n if (angular.isDefined(options) && (options != null) && angular.isObject(options)) {\n for (eventName in options) {\n eventHandler = options[eventName];\n if (options.hasOwnProperty(eventName) && angular.isFunction(options[eventName])) {\n $log.info(optionsName + \": Clearing event: \" + eventName + \" to markerSpiderfier\");\n this.markerSpiderfier.clearListeners(eventName);\n }\n }\n }\n };\n\n SpiderfierMarkerManager.prototype.destroy = function() {\n this.clearEvents(this.opt_events, 'opt_events');\n return this.clear();\n };\n\n SpiderfierMarkerManager.prototype.fit = function() {\n return FitHelper.fit(this.getGMarkers(), this.markerSpiderfier.map);\n };\n\n SpiderfierMarkerManager.prototype.getGMarkers = function() {\n return this.markerSpiderfier.getMarkers();\n };\n\n SpiderfierMarkerManager.prototype.isSpiderfied = function() {\n return _.find(this.getGMarkers(), function(gMarker) {\n return (gMarker != null ? gMarker._omsData : void 0) != null;\n });\n };\n\n SpiderfierMarkerManager.prototype.checkSync = function() {};\n\n return SpiderfierMarkerManager;\n\n })();\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps').factory('uiGmapadd-events', [\n '$timeout', function($timeout) {\n var addEvent, addEvents;\n addEvent = function(target, eventName, handler) {\n return google.maps.event.addListener(target, eventName, function() {\n handler.apply(this, arguments);\n return $timeout((function() {}), true);\n });\n };\n addEvents = function(target, eventName, handler) {\n var remove;\n if (handler) {\n return addEvent(target, eventName, handler);\n }\n remove = [];\n angular.forEach(eventName, function(_handler, key) {\n return remove.push(addEvent(target, key, _handler));\n });\n return function() {\n angular.forEach(remove, function(listener) {\n return google.maps.event.removeListener(listener);\n });\n return remove = null;\n };\n };\n return addEvents;\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps').factory('uiGmaparray-sync', [\n 'uiGmapadd-events', function(mapEvents) {\n return function(mapArray, scope, pathEval, pathChangedFn) {\n var geojsonArray, geojsonHandlers, geojsonWatcher, isSetFromScope, legacyHandlers, legacyWatcher, mapArrayListener, scopePath, watchListener;\n isSetFromScope = false;\n scopePath = scope.$eval(pathEval);\n if (!scope[\"static\"]) {\n legacyHandlers = {\n set_at: function(index) {\n var value;\n if (isSetFromScope) {\n return;\n }\n value = mapArray.getAt(index);\n if (!value) {\n return;\n }\n if (!value.lng || !value.lat) {\n return scopePath[index] = value;\n } else {\n scopePath[index].latitude = value.lat();\n return scopePath[index].longitude = value.lng();\n }\n },\n insert_at: function(index) {\n var value;\n if (isSetFromScope) {\n return;\n }\n value = mapArray.getAt(index);\n if (!value) {\n return;\n }\n if (!value.lng || !value.lat) {\n return scopePath.splice(index, 0, value);\n } else {\n return scopePath.splice(index, 0, {\n latitude: value.lat(),\n longitude: value.lng()\n });\n }\n },\n remove_at: function(index) {\n if (isSetFromScope) {\n return;\n }\n return scopePath.splice(index, 1);\n }\n };\n geojsonArray;\n if (scopePath.type === 'Polygon') {\n geojsonArray = scopePath.coordinates[0];\n } else if (scopePath.type === 'LineString') {\n geojsonArray = scopePath.coordinates;\n }\n geojsonHandlers = {\n set_at: function(index) {\n var value;\n if (isSetFromScope) {\n return;\n }\n value = mapArray.getAt(index);\n if (!(value && value.lng && value.lat)) {\n return;\n }\n geojsonArray[index][1] = value.lat();\n return geojsonArray[index][0] = value.lng();\n },\n insert_at: function(index) {\n var value;\n if (isSetFromScope) {\n return;\n }\n value = mapArray.getAt(index);\n if (!value) {\n return;\n }\n if (!value.lng || !value.lat) {\n return;\n }\n return geojsonArray.splice(index, 0, [value.lng(), value.lat()]);\n },\n remove_at: function(index) {\n if (isSetFromScope) {\n return;\n }\n return geojsonArray.splice(index, 1);\n }\n };\n mapArrayListener = mapEvents(mapArray, angular.isUndefined(scopePath.type) ? legacyHandlers : geojsonHandlers);\n }\n legacyWatcher = function(newPath) {\n var changed, i, l, newLength, newValue, oldArray, oldLength, oldValue;\n isSetFromScope = true;\n oldArray = mapArray;\n changed = false;\n if (newPath) {\n i = 0;\n oldLength = oldArray.getLength();\n newLength = newPath.length;\n l = Math.min(oldLength, newLength);\n newValue = void 0;\n while (i < l) {\n oldValue = oldArray.getAt(i);\n newValue = newPath[i];\n if (typeof newValue.equals === 'function') {\n if (!newValue.equals(oldValue)) {\n oldArray.setAt(i, newValue);\n changed = true;\n }\n } else {\n if ((oldValue.lat() !== newValue.latitude) || (oldValue.lng() !== newValue.longitude)) {\n oldArray.setAt(i, new google.maps.LatLng(newValue.latitude, newValue.longitude));\n changed = true;\n }\n }\n i++;\n }\n while (i < newLength) {\n newValue = newPath[i];\n if (typeof newValue.lat === 'function' && typeof newValue.lng === 'function') {\n oldArray.push(newValue);\n } else {\n oldArray.push(new google.maps.LatLng(newValue.latitude, newValue.longitude));\n }\n changed = true;\n i++;\n }\n while (i < oldLength) {\n oldArray.pop();\n changed = true;\n i++;\n }\n }\n isSetFromScope = false;\n if (changed) {\n return pathChangedFn(oldArray);\n }\n };\n geojsonWatcher = function(newPath) {\n var array, changed, i, l, newLength, newValue, oldArray, oldLength, oldValue;\n isSetFromScope = true;\n oldArray = mapArray;\n changed = false;\n if (newPath) {\n array;\n if (scopePath.type === 'Polygon') {\n array = newPath.coordinates[0];\n } else if (scopePath.type === 'LineString') {\n array = newPath.coordinates;\n }\n i = 0;\n oldLength = oldArray.getLength();\n newLength = array.length;\n l = Math.min(oldLength, newLength);\n newValue = void 0;\n while (i < l) {\n oldValue = oldArray.getAt(i);\n newValue = array[i];\n if ((oldValue.lat() !== newValue[1]) || (oldValue.lng() !== newValue[0])) {\n oldArray.setAt(i, new google.maps.LatLng(newValue[1], newValue[0]));\n changed = true;\n }\n i++;\n }\n while (i < newLength) {\n newValue = array[i];\n oldArray.push(new google.maps.LatLng(newValue[1], newValue[0]));\n changed = true;\n i++;\n }\n while (i < oldLength) {\n oldArray.pop();\n changed = true;\n i++;\n }\n }\n isSetFromScope = false;\n if (changed) {\n return pathChangedFn(oldArray);\n }\n };\n watchListener;\n if (!scope[\"static\"]) {\n if (angular.isUndefined(scopePath.type)) {\n watchListener = scope.$watchCollection(pathEval, legacyWatcher);\n } else {\n watchListener = scope.$watch(pathEval, geojsonWatcher, true);\n }\n }\n return function() {\n if (mapArrayListener) {\n mapArrayListener();\n mapArrayListener = null;\n }\n if (watchListener) {\n watchListener();\n return watchListener = null;\n }\n };\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module(\"uiGmapgoogle-maps.directives.api.utils\").factory(\"uiGmapChromeFixes\", [\n '$timeout', function($timeout) {\n return {\n maybeRepaint: function(el) {\n if (el) {\n el.style.opacity = 0.9;\n return $timeout(function() {\n return el.style.opacity = 1;\n });\n }\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps').service('uiGmapObjectIterators', function() {\n var _ignores, _iterators, _slapForEach, _slapMap;\n _ignores = ['length', 'forEach', 'map'];\n _iterators = [];\n _slapForEach = function(object) {\n object.forEach = function(cb) {\n return _.each(_.omit(object, _ignores), function(val) {\n if (!_.isFunction(val)) {\n return cb(val);\n }\n });\n };\n return object;\n };\n _iterators.push(_slapForEach);\n _slapMap = function(object) {\n object.map = function(cb) {\n return _.map(_.omit(object, _ignores), function(val) {\n if (!_.isFunction(val)) {\n return cb(val);\n }\n });\n };\n return object;\n };\n _iterators.push(_slapMap);\n return {\n slapMap: _slapMap,\n slapForEach: _slapForEach,\n slapAll: function(object) {\n _iterators.forEach(function(it) {\n return it(object);\n });\n return object;\n }\n };\n });\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.options.builders').service('uiGmapCommonOptionsBuilder', [\n 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapModelKey', function(BaseObject, $log, ModelKey) {\n var CommonOptionsBuilder;\n return CommonOptionsBuilder = (function(superClass) {\n extend(CommonOptionsBuilder, superClass);\n\n function CommonOptionsBuilder() {\n this.watchProps = bind(this.watchProps, this);\n this.buildOpts = bind(this.buildOpts, this);\n return CommonOptionsBuilder.__super__.constructor.apply(this, arguments);\n }\n\n CommonOptionsBuilder.prototype.props = [\n 'clickable', 'draggable', 'editable', 'visible', {\n prop: 'stroke',\n isColl: true\n }\n ];\n\n CommonOptionsBuilder.prototype.getCorrectModel = function(scope) {\n if (angular.isDefined(scope != null ? scope.model : void 0)) {\n return scope.model;\n } else {\n return scope;\n }\n };\n\n CommonOptionsBuilder.prototype.buildOpts = function(customOpts, cachedEval, forEachOpts) {\n var model, opts, stroke;\n if (customOpts == null) {\n customOpts = {};\n }\n if (forEachOpts == null) {\n forEachOpts = {};\n }\n if (!this.scope) {\n $log.error('this.scope not defined in CommonOptionsBuilder can not buildOpts');\n return;\n }\n if (!this.gMap) {\n $log.error('this.map not defined in CommonOptionsBuilder can not buildOpts');\n return;\n }\n model = this.getCorrectModel(this.scope);\n stroke = this.scopeOrModelVal('stroke', this.scope, model);\n opts = angular.extend(customOpts, this.DEFAULTS, {\n map: this.gMap,\n strokeColor: stroke != null ? stroke.color : void 0,\n strokeOpacity: stroke != null ? stroke.opacity : void 0,\n strokeWeight: stroke != null ? stroke.weight : void 0\n });\n angular.forEach(angular.extend(forEachOpts, {\n clickable: true,\n draggable: false,\n editable: false,\n \"static\": false,\n fit: false,\n visible: true,\n zIndex: 0,\n icons: []\n }), (function(_this) {\n return function(defaultValue, key) {\n var val;\n val = cachedEval ? cachedEval[key] : _this.scopeOrModelVal(key, _this.scope, model);\n if (angular.isUndefined(val)) {\n return opts[key] = defaultValue;\n } else {\n return opts[key] = model[key];\n }\n };\n })(this));\n if (opts[\"static\"]) {\n opts.editable = false;\n }\n return opts;\n };\n\n CommonOptionsBuilder.prototype.watchProps = function(props) {\n if (props == null) {\n props = this.props;\n }\n return props.forEach((function(_this) {\n return function(prop) {\n if ((_this.attrs[prop] != null) || (_this.attrs[prop != null ? prop.prop : void 0] != null)) {\n if (prop != null ? prop.isColl : void 0) {\n return _this.scope.$watchCollection(prop.prop, _this.setMyOptions);\n } else {\n return _this.scope.$watch(prop, _this.setMyOptions);\n }\n }\n };\n })(this));\n };\n\n return CommonOptionsBuilder;\n\n })(ModelKey);\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.options.builders').factory('uiGmapPolylineOptionsBuilder', [\n 'uiGmapCommonOptionsBuilder', function(CommonOptionsBuilder) {\n var PolylineOptionsBuilder;\n return PolylineOptionsBuilder = (function(superClass) {\n extend(PolylineOptionsBuilder, superClass);\n\n function PolylineOptionsBuilder() {\n return PolylineOptionsBuilder.__super__.constructor.apply(this, arguments);\n }\n\n PolylineOptionsBuilder.prototype.buildOpts = function(pathPoints, cachedEval) {\n return PolylineOptionsBuilder.__super__.buildOpts.call(this, {\n path: pathPoints\n }, cachedEval, {\n geodesic: false\n });\n };\n\n return PolylineOptionsBuilder;\n\n })(CommonOptionsBuilder);\n }\n ]).factory('uiGmapShapeOptionsBuilder', [\n 'uiGmapCommonOptionsBuilder', function(CommonOptionsBuilder) {\n var ShapeOptionsBuilder;\n return ShapeOptionsBuilder = (function(superClass) {\n extend(ShapeOptionsBuilder, superClass);\n\n function ShapeOptionsBuilder() {\n return ShapeOptionsBuilder.__super__.constructor.apply(this, arguments);\n }\n\n ShapeOptionsBuilder.prototype.buildOpts = function(customOpts, cachedEval, forEachOpts) {\n var fill, model;\n model = this.getCorrectModel(this.scope);\n fill = cachedEval ? cachedEval['fill'] : this.scopeOrModelVal('fill', this.scope, model);\n customOpts = angular.extend(customOpts, {\n fillColor: fill != null ? fill.color : void 0,\n fillOpacity: fill != null ? fill.opacity : void 0\n });\n return ShapeOptionsBuilder.__super__.buildOpts.call(this, customOpts, cachedEval, forEachOpts);\n };\n\n return ShapeOptionsBuilder;\n\n })(CommonOptionsBuilder);\n }\n ]).factory('uiGmapPolygonOptionsBuilder', [\n 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) {\n var PolygonOptionsBuilder;\n return PolygonOptionsBuilder = (function(superClass) {\n extend(PolygonOptionsBuilder, superClass);\n\n function PolygonOptionsBuilder() {\n return PolygonOptionsBuilder.__super__.constructor.apply(this, arguments);\n }\n\n PolygonOptionsBuilder.prototype.buildOpts = function(pathPoints, cachedEval) {\n return PolygonOptionsBuilder.__super__.buildOpts.call(this, {\n path: pathPoints\n }, cachedEval, {\n geodesic: false\n });\n };\n\n return PolygonOptionsBuilder;\n\n })(ShapeOptionsBuilder);\n }\n ]).factory('uiGmapRectangleOptionsBuilder', [\n 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) {\n var RectangleOptionsBuilder;\n return RectangleOptionsBuilder = (function(superClass) {\n extend(RectangleOptionsBuilder, superClass);\n\n function RectangleOptionsBuilder() {\n return RectangleOptionsBuilder.__super__.constructor.apply(this, arguments);\n }\n\n RectangleOptionsBuilder.prototype.buildOpts = function(bounds, cachedEval) {\n return RectangleOptionsBuilder.__super__.buildOpts.call(this, {\n bounds: bounds\n }, cachedEval);\n };\n\n return RectangleOptionsBuilder;\n\n })(ShapeOptionsBuilder);\n }\n ]).factory('uiGmapCircleOptionsBuilder', [\n 'uiGmapShapeOptionsBuilder', function(ShapeOptionsBuilder) {\n var CircleOptionsBuilder;\n return CircleOptionsBuilder = (function(superClass) {\n extend(CircleOptionsBuilder, superClass);\n\n function CircleOptionsBuilder() {\n return CircleOptionsBuilder.__super__.constructor.apply(this, arguments);\n }\n\n CircleOptionsBuilder.prototype.buildOpts = function(center, radius, cachedEval) {\n return CircleOptionsBuilder.__super__.buildOpts.call(this, {\n center: center,\n radius: radius\n }, cachedEval);\n };\n\n return CircleOptionsBuilder;\n\n })(ShapeOptionsBuilder);\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api.options').service('uiGmapMarkerOptions', [\n 'uiGmapLogger', 'uiGmapGmapUtil', function($log, GmapUtil) {\n return _.extend(GmapUtil, {\n createOptions: function(coords, icon, defaults, map) {\n var opts;\n if (defaults == null) {\n defaults = {};\n }\n opts = angular.extend({}, defaults, {\n position: defaults.position != null ? defaults.position : GmapUtil.getCoords(coords),\n visible: defaults.visible != null ? defaults.visible : GmapUtil.validateCoords(coords)\n });\n if ((defaults.icon != null) || (icon != null)) {\n opts = angular.extend(opts, {\n icon: defaults.icon != null ? defaults.icon : icon\n });\n }\n if (map != null) {\n opts.map = map;\n }\n return opts;\n },\n isLabel: function(options) {\n if (options == null) {\n return false;\n }\n return (options.labelContent != null) || (options.labelAnchor != null) || (options.labelClass != null) || (options.labelStyle != null) || (options.labelVisible != null);\n }\n });\n }\n ]);\n\n}).call(this);\n","\n/*global _,angular */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapBasePolyChildModel', [\n 'uiGmapLogger', '$timeout', 'uiGmaparray-sync', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function($log, $timeout, arraySync, GmapUtil, EventsHelper) {\n return function(Builder, gFactory) {\n var BasePolyChildModel;\n return BasePolyChildModel = (function(superClass) {\n extend(BasePolyChildModel, superClass);\n\n BasePolyChildModel.include(GmapUtil);\n\n function BasePolyChildModel(arg) {\n var create, gObjectChangeCb, ref;\n this.scope = arg.scope, this.attrs = arg.attrs, this.gMap = arg.gMap, this.defaults = arg.defaults, this.model = arg.model, gObjectChangeCb = arg.gObjectChangeCb, this.isScopeModel = (ref = arg.isScopeModel) != null ? ref : false;\n this.clean = bind(this.clean, this);\n if (this.isScopeModel) {\n this.clonedModel = _.clone(this.model, true);\n }\n this.isDragging = false;\n this.internalEvents = {\n dragend: (function(_this) {\n return function() {\n return _.defer(function() {\n return _this.isDragging = false;\n });\n };\n })(this),\n dragstart: (function(_this) {\n return function() {\n return _this.isDragging = true;\n };\n })(this)\n };\n create = (function(_this) {\n return function() {\n var maybeCachedEval;\n if (_this.isDragging) {\n return;\n }\n _this.pathPoints = _this.convertPathPoints(_this.scope.path);\n if (_this.gObject != null) {\n _this.clean();\n }\n if (_this.scope.model != null) {\n maybeCachedEval = _this.scope;\n }\n if (_this.pathPoints.length > 0) {\n _this.gObject = gFactory(_this.buildOpts(_this.pathPoints, maybeCachedEval));\n }\n if (_this.gObject) {\n arraySync(_this.gObject.getPath(), _this.scope, 'path', function(pathPoints) {\n _this.pathPoints = pathPoints;\n if (gObjectChangeCb != null) {\n return gObjectChangeCb();\n }\n });\n if (angular.isDefined(_this.scope.events) && angular.isObject(_this.scope.events)) {\n _this.listeners = _this.model ? EventsHelper.setEvents(_this.gObject, _this.scope, _this.model) : EventsHelper.setEvents(_this.gObject, _this.scope, _this.scope);\n }\n return _this.internalListeners = _this.model ? EventsHelper.setEvents(_this.gObject, {\n events: _this.internalEvents\n }, _this.model) : EventsHelper.setEvents(_this.gObject, {\n events: _this.internalEvents\n }, _this.scope);\n }\n };\n })(this);\n create();\n this.scope.$watch('path', (function(_this) {\n return function(newValue, oldValue) {\n if (!_.isEqual(newValue, oldValue) || !_this.gObject) {\n return create();\n }\n };\n })(this), true);\n if (!this.scope[\"static\"] && angular.isDefined(this.scope.editable)) {\n this.scope.$watch('editable', (function(_this) {\n return function(newValue, oldValue) {\n var ref1;\n if (newValue !== oldValue) {\n newValue = !_this.isFalse(newValue);\n return (ref1 = _this.gObject) != null ? ref1.setEditable(newValue) : void 0;\n }\n };\n })(this), true);\n }\n if (angular.isDefined(this.scope.draggable)) {\n this.scope.$watch('draggable', (function(_this) {\n return function(newValue, oldValue) {\n var ref1;\n if (newValue !== oldValue) {\n newValue = !_this.isFalse(newValue);\n return (ref1 = _this.gObject) != null ? ref1.setDraggable(newValue) : void 0;\n }\n };\n })(this), true);\n }\n if (angular.isDefined(this.scope.visible)) {\n this.scope.$watch('visible', (function(_this) {\n return function(newValue, oldValue) {\n var ref1;\n if (newValue !== oldValue) {\n newValue = !_this.isFalse(newValue);\n }\n return (ref1 = _this.gObject) != null ? ref1.setVisible(newValue) : void 0;\n };\n })(this), true);\n }\n if (angular.isDefined(this.scope.geodesic)) {\n this.scope.$watch('geodesic', (function(_this) {\n return function(newValue, oldValue) {\n var ref1;\n if (newValue !== oldValue) {\n newValue = !_this.isFalse(newValue);\n return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0;\n }\n };\n })(this), true);\n }\n if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.weight)) {\n this.scope.$watch('stroke.weight', (function(_this) {\n return function(newValue, oldValue) {\n var ref1;\n if (newValue !== oldValue) {\n return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0;\n }\n };\n })(this), true);\n }\n if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.color)) {\n this.scope.$watch('stroke.color', (function(_this) {\n return function(newValue, oldValue) {\n var ref1;\n if (newValue !== oldValue) {\n return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0;\n }\n };\n })(this), true);\n }\n if (angular.isDefined(this.scope.stroke) && angular.isDefined(this.scope.stroke.opacity)) {\n this.scope.$watch('stroke.opacity', (function(_this) {\n return function(newValue, oldValue) {\n var ref1;\n if (newValue !== oldValue) {\n return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0;\n }\n };\n })(this), true);\n }\n if (angular.isDefined(this.scope.icons)) {\n this.scope.$watch('icons', (function(_this) {\n return function(newValue, oldValue) {\n var ref1;\n if (newValue !== oldValue) {\n return (ref1 = _this.gObject) != null ? ref1.setOptions(_this.buildOpts(_this.gObject.getPath())) : void 0;\n }\n };\n })(this), true);\n }\n this.scope.$on('$destroy', (function(_this) {\n return function() {\n _this.clean();\n return _this.scope = null;\n };\n })(this));\n if (angular.isDefined(this.scope.fill) && angular.isDefined(this.scope.fill.color)) {\n this.scope.$watch('fill.color', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath()));\n }\n };\n })(this));\n }\n if (angular.isDefined(this.scope.fill) && angular.isDefined(this.scope.fill.opacity)) {\n this.scope.$watch('fill.opacity', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath()));\n }\n };\n })(this));\n }\n if (angular.isDefined(this.scope.zIndex)) {\n this.scope.$watch('zIndex', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n return _this.gObject.setOptions(_this.buildOpts(_this.gObject.getPath()));\n }\n };\n })(this));\n }\n }\n\n BasePolyChildModel.prototype.clean = function() {\n var ref;\n EventsHelper.removeEvents(this.listeners);\n EventsHelper.removeEvents(this.internalListeners);\n if ((ref = this.gObject) != null) {\n ref.setMap(null);\n }\n return this.gObject = null;\n };\n\n return BasePolyChildModel;\n\n })(Builder);\n };\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicholas McCready - https://twitter.com/nmccready\nOriginal idea from: http://stackoverflow.com/questions/22758950/google-map-drawing-freehand , &\n http://jsfiddle.net/YsQdh/88/\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapDrawFreeHandChildModel', [\n 'uiGmapLogger', '$q', function($log, $q) {\n var drawFreeHand, freeHandMgr;\n drawFreeHand = function(map, polys, done) {\n var move, poly;\n poly = new google.maps.Polyline({\n map: map,\n clickable: false\n });\n move = google.maps.event.addListener(map, 'mousemove', function(e) {\n return poly.getPath().push(e.latLng);\n });\n google.maps.event.addListenerOnce(map, 'mouseup', function(e) {\n var path;\n google.maps.event.removeListener(move);\n path = poly.getPath();\n poly.setMap(null);\n polys.push(new google.maps.Polygon({\n map: map,\n path: path\n }));\n poly = null;\n google.maps.event.clearListeners(map.getDiv(), 'mousedown');\n return done();\n });\n return void 0;\n };\n freeHandMgr = function(map1, scope) {\n var disableMap, enableMap;\n this.map = map1;\n disableMap = (function(_this) {\n return function() {\n var mapOptions;\n mapOptions = {\n draggable: false,\n disableDefaultUI: true,\n scrollwheel: false,\n disableDoubleClickZoom: false\n };\n $log.info('disabling map move');\n return _this.map.setOptions(mapOptions);\n };\n })(this);\n enableMap = (function(_this) {\n return function() {\n var mapOptions, ref;\n mapOptions = {\n draggable: true,\n disableDefaultUI: false,\n scrollwheel: true,\n disableDoubleClickZoom: true\n };\n if ((ref = _this.deferred) != null) {\n ref.resolve();\n }\n return _.defer(function() {\n return _this.map.setOptions(_.extend(mapOptions, scope.options));\n });\n };\n })(this);\n this.engage = (function(_this) {\n return function(polys1) {\n _this.polys = polys1;\n _this.deferred = $q.defer();\n disableMap();\n $log.info('DrawFreeHandChildModel is engaged (drawing).');\n google.maps.event.addDomListener(_this.map.getDiv(), 'mousedown', function(e) {\n return drawFreeHand(_this.map, _this.polys, enableMap);\n });\n return _this.deferred.promise;\n };\n })(this);\n return this;\n };\n return freeHandMgr;\n }\n ]);\n\n}).call(this);\n","\n/*global _:true,angular:true,google:true, RichMarker:true */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapMarkerChildModel', [\n 'uiGmapModelKey', 'uiGmapGmapUtil', 'uiGmapLogger', 'uiGmapEventsHelper', 'uiGmapPropertyAction', 'uiGmapMarkerOptions', 'uiGmapIMarker', 'uiGmapMarkerManager', 'uiGmapPromise', function(ModelKey, GmapUtil, $log, EventsHelper, PropertyAction, MarkerOptions, IMarker, MarkerManager, uiGmapPromise) {\n var MarkerChildModel;\n MarkerChildModel = (function(superClass) {\n var destroy;\n\n extend(MarkerChildModel, superClass);\n\n MarkerChildModel.include(GmapUtil);\n\n MarkerChildModel.include(EventsHelper);\n\n MarkerChildModel.include(MarkerOptions);\n\n destroy = function(child) {\n if ((child != null ? child.gObject : void 0) != null) {\n child.removeEvents(child.externalListeners);\n child.removeEvents(child.internalListeners);\n if (child != null ? child.gObject : void 0) {\n if (child.removeFromManager) {\n child.gManager.remove(child.gObject);\n }\n child.gObject.setMap(null);\n return child.gObject = null;\n }\n }\n };\n\n function MarkerChildModel(opts) {\n this.internalEvents = bind(this.internalEvents, this);\n this.setLabelOptions = bind(this.setLabelOptions, this);\n this.setOptions = bind(this.setOptions, this);\n this.setIcon = bind(this.setIcon, this);\n this.setCoords = bind(this.setCoords, this);\n this.isNotValid = bind(this.isNotValid, this);\n this.maybeSetScopeValue = bind(this.maybeSetScopeValue, this);\n this.createMarker = bind(this.createMarker, this);\n this.setMyScope = bind(this.setMyScope, this);\n this.updateModel = bind(this.updateModel, this);\n this.handleModelChanges = bind(this.handleModelChanges, this);\n this.destroy = bind(this.destroy, this);\n var action, ref, ref1, ref2, ref3, ref4, scope;\n scope = opts.scope, this.model = opts.model, this.keys = opts.keys, this.gMap = opts.gMap, this.defaults = (ref = opts.defaults) != null ? ref : {}, this.doClick = opts.doClick, this.gManager = opts.gManager, this.doDrawSelf = (ref1 = opts.doDrawSelf) != null ? ref1 : true, this.trackModel = (ref2 = opts.trackModel) != null ? ref2 : true, this.needRedraw = (ref3 = opts.needRedraw) != null ? ref3 : false, this.isScopeModel = (ref4 = opts.isScopeModel) != null ? ref4 : false;\n if (this.isScopeModel) {\n this.clonedModel = _.clone(this.model, true);\n }\n this.deferred = uiGmapPromise.defer();\n _.each(this.keys, (function(_this) {\n return function(v, k) {\n var keyValue;\n keyValue = _this.keys[k];\n if ((keyValue != null) && !_.isFunction(keyValue) && _.isString(keyValue)) {\n return _this[k + 'Key'] = keyValue;\n }\n };\n })(this));\n this.idKey = this.idKeyKey || 'id';\n if (this.model[this.idKey] != null) {\n this.id = this.model[this.idKey];\n }\n MarkerChildModel.__super__.constructor.call(this, scope);\n this.scope.getGMarker = (function(_this) {\n return function() {\n return _this.gObject;\n };\n })(this);\n this.firstTime = true;\n if (this.trackModel) {\n this.scope.model = this.model;\n this.scope.$watch('model', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n return _this.handleModelChanges(newValue, oldValue);\n }\n };\n })(this), true);\n } else {\n action = new PropertyAction((function(_this) {\n return function(calledKey) {\n if (_.isFunction(calledKey)) {\n calledKey = 'all';\n }\n if (!_this.firstTime) {\n return _this.setMyScope(calledKey, scope);\n }\n };\n })(this), false);\n _.each(this.keys, function(v, k) {\n return scope.$watch(k, action.sic(k), true);\n });\n }\n this.scope.$on('$destroy', (function(_this) {\n return function() {\n return destroy(_this);\n };\n })(this));\n this.createMarker(this.model);\n $log.info(this);\n }\n\n MarkerChildModel.prototype.destroy = function(removeFromManager) {\n if (removeFromManager == null) {\n removeFromManager = true;\n }\n this.removeFromManager = removeFromManager;\n return this.scope.$destroy();\n };\n\n MarkerChildModel.prototype.handleModelChanges = function(newValue, oldValue) {\n var changes, ctr, len;\n changes = this.getChanges(newValue, oldValue, IMarker.keys);\n if (!this.firstTime) {\n ctr = 0;\n len = _.keys(changes).length;\n return _.each(changes, (function(_this) {\n return function(v, k) {\n var doDraw;\n ctr += 1;\n doDraw = len === ctr;\n _this.setMyScope(k, newValue, oldValue, false, true, doDraw);\n return _this.needRedraw = true;\n };\n })(this));\n }\n };\n\n MarkerChildModel.prototype.updateModel = function(model) {\n if (this.isScopeModel) {\n this.clonedModel = _.clone(model, true);\n }\n return this.setMyScope('all', model, this.model);\n };\n\n MarkerChildModel.prototype.renderGMarker = function(doDraw, validCb) {\n var coords, isSpiderfied, ref;\n if (doDraw == null) {\n doDraw = true;\n }\n coords = this.getProp('coords', this.scope, this.model);\n if (((ref = this.gManager) != null ? ref.isSpiderfied : void 0) != null) {\n isSpiderfied = this.gManager.isSpiderfied();\n }\n if (coords != null) {\n if (!this.validateCoords(coords)) {\n $log.debug('MarkerChild does not have coords yet. They may be defined later.');\n return;\n }\n if (validCb != null) {\n validCb();\n }\n if (doDraw && this.gObject) {\n this.gManager.add(this.gObject);\n }\n if (isSpiderfied) {\n return this.gManager.markerSpiderfier.spiderListener(this.gObject, window.event);\n }\n } else {\n if (doDraw && this.gObject) {\n return this.gManager.remove(this.gObject);\n }\n }\n };\n\n MarkerChildModel.prototype.setMyScope = function(thingThatChanged, model, oldModel, isInit, doDraw) {\n var justCreated;\n if (oldModel == null) {\n oldModel = void 0;\n }\n if (isInit == null) {\n isInit = false;\n }\n if (doDraw == null) {\n doDraw = true;\n }\n if (model == null) {\n model = this.model;\n } else {\n this.model = model;\n }\n if (!this.gObject) {\n this.setOptions(this.scope, doDraw);\n justCreated = true;\n }\n switch (thingThatChanged) {\n case 'all':\n return _.each(this.keys, (function(_this) {\n return function(v, k) {\n return _this.setMyScope(k, model, oldModel, isInit, doDraw);\n };\n })(this));\n case 'icon':\n return this.maybeSetScopeValue({\n gSetter: this.setIcon,\n doDraw: doDraw\n });\n case 'coords':\n return this.maybeSetScopeValue({\n gSetter: this.setCoords,\n doDraw: doDraw\n });\n case 'options':\n if (!justCreated) {\n return this.createMarker(model, oldModel, isInit, doDraw);\n }\n }\n };\n\n MarkerChildModel.prototype.createMarker = function(model, oldModel, isInit, doDraw) {\n if (oldModel == null) {\n oldModel = void 0;\n }\n if (isInit == null) {\n isInit = false;\n }\n if (doDraw == null) {\n doDraw = true;\n }\n this.maybeSetScopeValue({\n gSetter: this.setOptions,\n doDraw: doDraw\n });\n return this.firstTime = false;\n };\n\n MarkerChildModel.prototype.maybeSetScopeValue = function(arg) {\n var doDraw, gSetter, ref;\n gSetter = arg.gSetter, doDraw = (ref = arg.doDraw) != null ? ref : true;\n if (gSetter != null) {\n gSetter(this.scope, doDraw);\n }\n if (this.doDrawSelf && doDraw) {\n return this.gManager.draw();\n }\n };\n\n MarkerChildModel.prototype.isNotValid = function(scope, doCheckGmarker) {\n var hasIdenticalScopes, hasNoGmarker;\n if (doCheckGmarker == null) {\n doCheckGmarker = true;\n }\n hasNoGmarker = !doCheckGmarker ? false : this.gObject === void 0;\n hasIdenticalScopes = !this.trackModel ? scope.$id !== this.scope.$id : false;\n return hasIdenticalScopes || hasNoGmarker;\n };\n\n MarkerChildModel.prototype.setCoords = function(scope, doDraw) {\n if (doDraw == null) {\n doDraw = true;\n }\n if (this.isNotValid(scope) || (this.gObject == null)) {\n return;\n }\n return this.renderGMarker(doDraw, (function(_this) {\n return function() {\n var newGValue, newModelVal, oldGValue;\n newModelVal = _this.getProp('coords', scope, _this.model);\n newGValue = _this.getCoords(newModelVal);\n oldGValue = _this.gObject.getPosition();\n if ((oldGValue != null) && (newGValue != null)) {\n if (newGValue.lng() === oldGValue.lng() && newGValue.lat() === oldGValue.lat()) {\n return;\n }\n }\n _this.gObject.setPosition(newGValue);\n return _this.gObject.setVisible(_this.validateCoords(newModelVal));\n };\n })(this));\n };\n\n MarkerChildModel.prototype.setIcon = function(scope, doDraw) {\n if (doDraw == null) {\n doDraw = true;\n }\n if (this.isNotValid(scope) || (this.gObject == null)) {\n return;\n }\n return this.renderGMarker(doDraw, (function(_this) {\n return function() {\n var coords, newValue, oldValue;\n oldValue = _this.gObject.getIcon();\n newValue = _this.getProp('icon', scope, _this.model);\n if (oldValue === newValue) {\n return;\n }\n _this.gObject.setIcon(newValue);\n coords = _this.getProp('coords', scope, _this.model);\n _this.gObject.setPosition(_this.getCoords(coords));\n return _this.gObject.setVisible(_this.validateCoords(coords));\n };\n })(this));\n };\n\n MarkerChildModel.prototype.setOptions = function(scope, doDraw) {\n var ref;\n if (doDraw == null) {\n doDraw = true;\n }\n if (this.isNotValid(scope, false)) {\n return;\n }\n this.renderGMarker(doDraw, (function(_this) {\n return function() {\n var _options, coords, icon;\n coords = _this.getProp('coords', scope, _this.model);\n icon = _this.getProp('icon', scope, _this.model);\n _options = _this.getProp('options', scope, _this.model);\n _this.opts = _this.createOptions(coords, icon, _options);\n if (_this.isLabel(_this.gObject) !== _this.isLabel(_this.opts) && (_this.gObject != null)) {\n _this.gManager.remove(_this.gObject);\n _this.gObject = void 0;\n }\n if (_this.gObject != null) {\n _this.gObject.setOptions(_this.setLabelOptions(_this.opts));\n }\n if (!_this.gObject) {\n if (_this.isLabel(_this.opts)) {\n _this.gObject = new MarkerWithLabel(_this.setLabelOptions(_this.opts));\n } else if (_this.opts.content) {\n _this.gObject = new RichMarker(_this.opts);\n _this.gObject.getIcon = _this.gObject.getContent;\n _this.gObject.setIcon = _this.gObject.setContent;\n } else {\n _this.gObject = new google.maps.Marker(_this.opts);\n }\n _.extend(_this.gObject, {\n model: _this.model\n });\n }\n if (_this.externalListeners) {\n _this.removeEvents(_this.externalListeners);\n }\n if (_this.internalListeners) {\n _this.removeEvents(_this.internalListeners);\n }\n _this.externalListeners = _this.setEvents(_this.gObject, _this.scope, _this.model, ['dragend']);\n _this.internalListeners = _this.setEvents(_this.gObject, {\n events: _this.internalEvents(),\n $evalAsync: function() {}\n }, _this.model);\n if (_this.id != null) {\n return _this.gObject.key = _this.id;\n }\n };\n })(this));\n if (this.gObject && (this.gObject.getMap() || this.gManager.type !== MarkerManager.type)) {\n this.deferred.resolve(this.gObject);\n } else {\n if (!this.gObject) {\n return this.deferred.reject('gObject is null');\n }\n if (!(((ref = this.gObject) != null ? ref.getMap() : void 0) && this.gManager.type === MarkerManager.type)) {\n $log.debug('gObject has no map yet');\n this.deferred.resolve(this.gObject);\n }\n }\n if (this.model[this.fitKey]) {\n return this.gManager.fit();\n }\n };\n\n MarkerChildModel.prototype.setLabelOptions = function(opts) {\n if (opts.labelAnchor) {\n opts.labelAnchor = this.getLabelPositionPoint(opts.labelAnchor);\n }\n return opts;\n };\n\n MarkerChildModel.prototype.internalEvents = function() {\n return {\n dragend: (function(_this) {\n return function(marker, eventName, model, mousearg) {\n var events, modelToSet, newCoords;\n modelToSet = _this.trackModel ? _this.scope.model : _this.model;\n newCoords = _this.setCoordsFromEvent(_this.modelOrKey(modelToSet, _this.coordsKey), _this.gObject.getPosition());\n modelToSet = _this.setVal(model, _this.coordsKey, newCoords);\n events = _this.scope.events;\n if ((events != null ? events.dragend : void 0) != null) {\n events.dragend(marker, eventName, modelToSet, mousearg);\n }\n return _this.scope.$apply();\n };\n })(this),\n click: (function(_this) {\n return function(marker, eventName, model, mousearg) {\n var click;\n click = _this.getProp('click', _this.scope, _this.model);\n if (_this.doClick && angular.isFunction(click)) {\n return _this.scope.$evalAsync(click(marker, eventName, _this.model, mousearg));\n }\n };\n })(this)\n };\n };\n\n return MarkerChildModel;\n\n })(ModelKey);\n return MarkerChildModel;\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygonChildModel', [\n 'uiGmapBasePolyChildModel', 'uiGmapPolygonOptionsBuilder', function(BaseGen, Builder) {\n var PolygonChildModel, base, gFactory;\n gFactory = function(opts) {\n return new google.maps.Polygon(opts);\n };\n base = new BaseGen(Builder, gFactory);\n return PolygonChildModel = (function(superClass) {\n extend(PolygonChildModel, superClass);\n\n function PolygonChildModel() {\n return PolygonChildModel.__super__.constructor.apply(this, arguments);\n }\n\n return PolygonChildModel;\n\n })(base);\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolylineChildModel', [\n 'uiGmapBasePolyChildModel', 'uiGmapPolylineOptionsBuilder', function(BaseGen, Builder) {\n var PolylineChildModel, base, gFactory;\n gFactory = function(opts) {\n return new google.maps.Polyline(opts);\n };\n base = BaseGen(Builder, gFactory);\n return PolylineChildModel = (function(superClass) {\n extend(PolylineChildModel, superClass);\n\n function PolylineChildModel() {\n return PolylineChildModel.__super__.constructor.apply(this, arguments);\n }\n\n return PolylineChildModel;\n\n })(base);\n }\n ]);\n\n}).call(this);\n","\n/*global _:true,angular:true,google:true */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.child').factory('uiGmapWindowChildModel', [\n 'uiGmapBaseObject', 'uiGmapGmapUtil', 'uiGmapLogger', '$compile', '$http', '$templateCache', 'uiGmapChromeFixes', 'uiGmapEventsHelper', function(BaseObject, GmapUtil, $log, $compile, $http, $templateCache, ChromeFixes, EventsHelper) {\n var WindowChildModel;\n WindowChildModel = (function(superClass) {\n extend(WindowChildModel, superClass);\n\n WindowChildModel.include(GmapUtil);\n\n WindowChildModel.include(EventsHelper);\n\n function WindowChildModel(opts) {\n this.updateModel = bind(this.updateModel, this);\n this.destroy = bind(this.destroy, this);\n this.remove = bind(this.remove, this);\n this.getLatestPosition = bind(this.getLatestPosition, this);\n this.hideWindow = bind(this.hideWindow, this);\n this.showWindow = bind(this.showWindow, this);\n this.handleClick = bind(this.handleClick, this);\n this.watchOptions = bind(this.watchOptions, this);\n this.watchCoords = bind(this.watchCoords, this);\n this.createGWin = bind(this.createGWin, this);\n this.watchElement = bind(this.watchElement, this);\n this.watchAndDoShow = bind(this.watchAndDoShow, this);\n this.doShow = bind(this.doShow, this);\n var maybeMarker, ref, ref1, ref2, ref3;\n this.model = (ref = opts.model) != null ? ref : {}, this.scope = opts.scope, this.opts = opts.opts, this.isIconVisibleOnClick = opts.isIconVisibleOnClick, this.gMap = opts.gMap, this.markerScope = opts.markerScope, this.element = opts.element, this.needToManualDestroy = (ref1 = opts.needToManualDestroy) != null ? ref1 : false, this.markerIsVisibleAfterWindowClose = (ref2 = opts.markerIsVisibleAfterWindowClose) != null ? ref2 : true, this.isScopeModel = (ref3 = opts.isScopeModel) != null ? ref3 : false;\n if (this.isScopeModel) {\n this.clonedModel = _.clone(this.model, true);\n }\n this.getGmarker = function() {\n var ref4, ref5;\n if (((ref4 = this.markerScope) != null ? ref4['getGMarker'] : void 0) != null) {\n return (ref5 = this.markerScope) != null ? ref5.getGMarker() : void 0;\n }\n };\n this.listeners = [];\n this.createGWin();\n maybeMarker = this.getGmarker();\n if (maybeMarker != null) {\n maybeMarker.setClickable(true);\n }\n this.watchElement();\n this.watchOptions();\n this.watchCoords();\n this.watchAndDoShow();\n this.scope.$on('$destroy', (function(_this) {\n return function() {\n return _this.destroy();\n };\n })(this));\n $log.info(this);\n }\n\n WindowChildModel.prototype.doShow = function(wasOpen) {\n if (this.scope.show === true || wasOpen) {\n return this.showWindow();\n } else {\n return this.hideWindow();\n }\n };\n\n WindowChildModel.prototype.watchAndDoShow = function() {\n if (this.model.show != null) {\n this.scope.show = this.model.show;\n }\n this.scope.$watch('show', this.doShow, true);\n return this.doShow();\n };\n\n WindowChildModel.prototype.watchElement = function() {\n return this.scope.$watch((function(_this) {\n return function() {\n var ref, wasOpen;\n if (!(_this.element || _this.html)) {\n return;\n }\n if (_this.html !== _this.element.html() && _this.gObject) {\n if ((ref = _this.opts) != null) {\n ref.content = void 0;\n }\n wasOpen = _this.gObject.isOpen();\n _this.remove();\n return _this.createGWin(wasOpen);\n }\n };\n })(this));\n };\n\n WindowChildModel.prototype.createGWin = function(isOpen) {\n var _opts, defaults, maybeMarker, ref, ref1;\n if (isOpen == null) {\n isOpen = false;\n }\n maybeMarker = this.getGmarker();\n defaults = {};\n if (this.opts != null) {\n if (this.scope.coords) {\n this.opts.position = this.getCoords(this.scope.coords);\n }\n defaults = this.opts;\n }\n if (this.element) {\n this.html = _.isObject(this.element) ? this.element.html() : this.element;\n }\n _opts = this.scope.options ? this.scope.options : defaults;\n this.opts = this.createWindowOptions(maybeMarker, this.markerScope || this.scope, this.html, _opts);\n if (this.opts != null) {\n if (!this.gObject) {\n if (this.opts.boxClass && (window.InfoBox && typeof window.InfoBox === 'function')) {\n this.gObject = new window.InfoBox(this.opts);\n } else {\n this.gObject = new google.maps.InfoWindow(this.opts);\n }\n this.listeners.push(google.maps.event.addListener(this.gObject, 'domready', function() {\n return ChromeFixes.maybeRepaint(this.content);\n }));\n this.listeners.push(google.maps.event.addListener(this.gObject, 'closeclick', (function(_this) {\n return function() {\n if (maybeMarker) {\n maybeMarker.setAnimation(_this.oldMarkerAnimation);\n if (_this.markerIsVisibleAfterWindowClose) {\n _.delay(function() {\n maybeMarker.setVisible(false);\n return maybeMarker.setVisible(_this.markerIsVisibleAfterWindowClose);\n }, 250);\n }\n }\n _this.gObject.close();\n _this.model.show = false;\n if (_this.scope.closeClick != null) {\n return _this.scope.$evalAsync(_this.scope.closeClick());\n } else {\n return _this.scope.$evalAsync();\n }\n };\n })(this)));\n }\n this.gObject.setContent(this.opts.content);\n this.handleClick(((ref = this.scope) != null ? (ref1 = ref.options) != null ? ref1.forceClick : void 0 : void 0) || isOpen);\n return this.doShow(this.gObject.isOpen());\n }\n };\n\n WindowChildModel.prototype.watchCoords = function() {\n var scope;\n scope = this.markerScope != null ? this.markerScope : this.scope;\n return scope.$watch('coords', (function(_this) {\n return function(newValue, oldValue) {\n var pos;\n if (newValue !== oldValue) {\n if (newValue == null) {\n _this.hideWindow();\n } else if (!_this.validateCoords(newValue)) {\n $log.error(\"WindowChildMarker cannot render marker as scope.coords as no position on marker: \" + (JSON.stringify(_this.model)));\n return;\n }\n pos = _this.getCoords(newValue);\n _this.doShow();\n _this.gObject.setPosition(pos);\n if (_this.opts) {\n return _this.opts.position = pos;\n }\n }\n };\n })(this), true);\n };\n\n WindowChildModel.prototype.watchOptions = function() {\n return this.scope.$watch('options', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n _this.opts = newValue;\n if (_this.gObject != null) {\n _this.gObject.setOptions(_this.opts);\n if ((_this.opts.visible != null) && _this.opts.visible) {\n return _this.showWindow();\n } else if (_this.opts.visible != null) {\n return _this.hideWindow();\n }\n }\n }\n };\n })(this), true);\n };\n\n WindowChildModel.prototype.handleClick = function(forceClick) {\n var click, maybeMarker;\n if (this.gObject == null) {\n return;\n }\n maybeMarker = this.getGmarker();\n click = (function(_this) {\n return function() {\n if (_this.gObject == null) {\n _this.createGWin();\n }\n _this.showWindow();\n if (maybeMarker != null) {\n _this.initialMarkerVisibility = maybeMarker.getVisible();\n _this.oldMarkerAnimation = maybeMarker.getAnimation();\n return maybeMarker.setVisible(_this.isIconVisibleOnClick);\n }\n };\n })(this);\n if (forceClick) {\n click();\n }\n if (maybeMarker) {\n return this.listeners = this.listeners.concat(this.setEvents(maybeMarker, {\n events: {\n click: click\n }\n }, this.model));\n }\n };\n\n WindowChildModel.prototype.showWindow = function() {\n var compiled, show, templateScope;\n if (this.gObject == null) {\n return;\n }\n templateScope = null;\n show = (function(_this) {\n return function() {\n var isOpen, maybeMarker, pos;\n if (!_this.gObject.isOpen()) {\n maybeMarker = _this.getGmarker();\n if ((_this.gObject != null) && (_this.gObject.getPosition != null)) {\n pos = _this.gObject.getPosition();\n }\n if (maybeMarker) {\n pos = maybeMarker.getPosition();\n }\n if (!pos) {\n return;\n }\n _this.gObject.open(_this.gMap, maybeMarker);\n isOpen = _this.gObject.isOpen();\n if (_this.model.show !== isOpen) {\n return _this.model.show = isOpen;\n }\n }\n };\n })(this);\n if (this.scope.templateUrl) {\n $http.get(this.scope.templateUrl, {\n cache: $templateCache\n }).then((function(_this) {\n return function(content) {\n var compiled;\n templateScope = _this.scope.$new();\n if (angular.isDefined(_this.scope.templateParameter)) {\n templateScope.parameter = _this.scope.templateParameter;\n }\n compiled = $compile(content.data)(templateScope);\n _this.gObject.setContent(compiled[0]);\n return show();\n };\n })(this));\n } else if (this.scope.template) {\n templateScope = this.scope.$new();\n if (angular.isDefined(this.scope.templateParameter)) {\n templateScope.parameter = this.scope.templateParameter;\n }\n compiled = $compile(this.scope.template)(templateScope);\n this.gObject.setContent(compiled[0]);\n show();\n } else {\n show();\n }\n return this.scope.$on('destroy', function() {\n return templateScope.$destroy();\n });\n };\n\n WindowChildModel.prototype.hideWindow = function() {\n if ((this.gObject != null) && this.gObject.isOpen()) {\n return this.gObject.close();\n }\n };\n\n WindowChildModel.prototype.getLatestPosition = function(overridePos) {\n var maybeMarker;\n maybeMarker = this.getGmarker();\n if ((this.gObject != null) && (maybeMarker != null) && !overridePos) {\n return this.gObject.setPosition(maybeMarker.getPosition());\n } else {\n if (overridePos) {\n return this.gObject.setPosition(overridePos);\n }\n }\n };\n\n WindowChildModel.prototype.remove = function() {\n this.hideWindow();\n this.removeEvents(this.listeners);\n this.listeners.length = 0;\n delete this.gObject;\n return delete this.opts;\n };\n\n WindowChildModel.prototype.destroy = function(manualOverride) {\n var ref;\n if (manualOverride == null) {\n manualOverride = false;\n }\n this.remove();\n if (((this.scope != null) && !((ref = this.scope) != null ? ref.$$destroyed : void 0)) && (this.needToManualDestroy || manualOverride)) {\n return this.scope.$destroy();\n }\n };\n\n WindowChildModel.prototype.updateModel = function(model) {\n if (this.isScopeModel) {\n this.clonedModel = _.clone(model, true);\n }\n return _.extend(this.model, this.clonedModel || model);\n };\n\n return WindowChildModel;\n\n })(BaseObject);\n return WindowChildModel;\n }\n ]);\n\n}).call(this);\n","\n/*global _, angular */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapBasePolysParentModel', [\n '$timeout', 'uiGmapLogger', 'uiGmapModelKey', 'uiGmapModelsWatcher', 'uiGmapPropMap', 'uiGmap_async', 'uiGmapPromise', 'uiGmapFitHelper', function($timeout, $log, ModelKey, ModelsWatcher, PropMap, _async, uiGmapPromise, FitHelper) {\n return function(IPoly, PolyChildModel, gObjectName) {\n var BasePolysParentModel;\n return BasePolysParentModel = (function(superClass) {\n extend(BasePolysParentModel, superClass);\n\n BasePolysParentModel.include(ModelsWatcher);\n\n function BasePolysParentModel(scope, element, attrs, gMap1, defaults) {\n this.element = element;\n this.attrs = attrs;\n this.gMap = gMap1;\n this.defaults = defaults;\n this.maybeFit = bind(this.maybeFit, this);\n this.createChild = bind(this.createChild, this);\n this.pieceMeal = bind(this.pieceMeal, this);\n this.createAllNew = bind(this.createAllNew, this);\n this.watchIdKey = bind(this.watchIdKey, this);\n this.createChildScopes = bind(this.createChildScopes, this);\n this.watchDestroy = bind(this.watchDestroy, this);\n this.onDestroy = bind(this.onDestroy, this);\n this.rebuildAll = bind(this.rebuildAll, this);\n this.doINeedToWipe = bind(this.doINeedToWipe, this);\n this.watchModels = bind(this.watchModels, this);\n BasePolysParentModel.__super__.constructor.call(this, scope);\n this[\"interface\"] = IPoly;\n this.$log = $log;\n this.plurals = new PropMap();\n _.each(IPoly.scopeKeys, (function(_this) {\n return function(name) {\n return _this[name + 'Key'] = void 0;\n };\n })(this));\n this.models = void 0;\n this.firstTime = true;\n this.$log.info(this);\n this.createChildScopes();\n }\n\n BasePolysParentModel.prototype.watchModels = function(scope) {\n\n /*\n This was watchCollection but not all model changes were being caught.\n TODO: Make the directive flexible in overriding whether we watch models (and depth) via watch or watchColleciton.\n */\n return scope.$watch('models', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n if (_this.doINeedToWipe(newValue) || scope.doRebuildAll) {\n return _this.rebuildAll(scope, true, true);\n } else {\n return _this.createChildScopes(false);\n }\n }\n };\n })(this), true);\n };\n\n BasePolysParentModel.prototype.doINeedToWipe = function(newValue) {\n var newValueIsEmpty;\n newValueIsEmpty = newValue != null ? newValue.length === 0 : true;\n return this.plurals.length > 0 && newValueIsEmpty;\n };\n\n BasePolysParentModel.prototype.rebuildAll = function(scope, doCreate, doDelete) {\n return this.onDestroy(doDelete).then((function(_this) {\n return function() {\n if (doCreate) {\n return _this.createChildScopes();\n }\n };\n })(this));\n };\n\n BasePolysParentModel.prototype.onDestroy = function() {\n BasePolysParentModel.__super__.onDestroy.call(this, this.scope);\n return _async.promiseLock(this, uiGmapPromise.promiseTypes[\"delete\"], void 0, void 0, (function(_this) {\n return function() {\n return _async.each(_this.plurals.values(), function(child) {\n return child.destroy(true);\n }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() {\n var ref;\n return (ref = _this.plurals) != null ? ref.removeAll() : void 0;\n });\n };\n })(this));\n };\n\n BasePolysParentModel.prototype.watchDestroy = function(scope) {\n return scope.$on('$destroy', (function(_this) {\n return function() {\n return _this.rebuildAll(scope, false, true);\n };\n })(this));\n };\n\n BasePolysParentModel.prototype.createChildScopes = function(isCreatingFromScratch) {\n if (isCreatingFromScratch == null) {\n isCreatingFromScratch = true;\n }\n if (angular.isUndefined(this.scope.models)) {\n this.$log.error(\"No models to create \" + gObjectName + \"s from! I Need direct models!\");\n return;\n }\n if ((this.gMap == null) || (this.scope.models == null)) {\n return;\n }\n this.watchIdKey(this.scope);\n if (isCreatingFromScratch) {\n return this.createAllNew(this.scope, false);\n } else {\n return this.pieceMeal(this.scope, false);\n }\n };\n\n BasePolysParentModel.prototype.watchIdKey = function(scope) {\n this.setIdKey(scope);\n return scope.$watch('idKey', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue && (newValue == null)) {\n _this.idKey = newValue;\n return _this.rebuildAll(scope, true, true);\n }\n };\n })(this));\n };\n\n BasePolysParentModel.prototype.createAllNew = function(scope, isArray) {\n var maybeCanceled;\n if (isArray == null) {\n isArray = false;\n }\n this.models = scope.models;\n if (this.firstTime) {\n this.watchModels(scope);\n this.watchDestroy(scope);\n }\n if (this.didQueueInitPromise(this, scope)) {\n return;\n }\n maybeCanceled = null;\n return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) {\n return maybeCanceled = canceledMsg;\n }), (function(_this) {\n return function() {\n return _async.map(scope.models, function(model) {\n var child;\n child = _this.createChild(model, _this.gMap);\n if (maybeCanceled) {\n $log.debug('createNew should fall through safely');\n child.isEnabled = false;\n }\n maybeCanceled;\n return child.pathPoints.getArray();\n }, _async.chunkSizeFrom(scope.chunk)).then(function(pathPoints) {\n _this.maybeFit(pathPoints);\n return _this.firstTime = false;\n });\n };\n })(this));\n };\n\n BasePolysParentModel.prototype.pieceMeal = function(scope, isArray) {\n var maybeCanceled, payload;\n if (isArray == null) {\n isArray = true;\n }\n if (scope.$$destroyed) {\n return;\n }\n maybeCanceled = null;\n payload = null;\n this.models = scope.models;\n if ((scope != null) && this.modelsLength() && this.plurals.length) {\n return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) {\n return maybeCanceled = canceledMsg;\n }), (function(_this) {\n return function() {\n return uiGmapPromise.promise(function() {\n return _this.figureOutState(_this.idKey, scope, _this.plurals, _this.modelKeyComparison);\n }).then(function(state) {\n payload = state;\n if (payload.updates.length) {\n _async.each(payload.updates, function(obj) {\n _.extend(obj.child.scope, obj.model);\n return obj.child.model = obj.model;\n });\n }\n return _async.each(payload.removals, function(child) {\n if (child != null) {\n child.destroy();\n _this.plurals.remove(child.model[_this.idKey]);\n return maybeCanceled;\n }\n }, _async.chunkSizeFrom(scope.chunk));\n }).then(function() {\n return _async.each(payload.adds, function(modelToAdd) {\n if (maybeCanceled) {\n $log.debug('pieceMeal should fall through safely');\n }\n _this.createChild(modelToAdd, _this.gMap);\n return maybeCanceled;\n }, _async.chunkSizeFrom(scope.chunk)).then(function() {\n return _this.maybeFit();\n });\n });\n };\n })(this));\n } else {\n this.inProgress = false;\n return this.rebuildAll(this.scope, true, true);\n }\n };\n\n BasePolysParentModel.prototype.createChild = function(model, gMap) {\n var child, childScope;\n childScope = this.scope.$new(false);\n this.setChildScope(IPoly.scopeKeys, childScope, model);\n childScope.$watch('model', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n return _this.setChildScope(IPoly.scopeKeys, childScope, newValue);\n }\n };\n })(this), true);\n childScope[\"static\"] = this.scope[\"static\"];\n child = new PolyChildModel({\n isScopeModel: true,\n scope: childScope,\n attrs: this.attrs,\n gMap: gMap,\n defaults: this.defaults,\n model: model,\n gObjectChangeCb: (function(_this) {\n return function() {\n return _this.maybeFit();\n };\n })(this)\n });\n if (model[this.idKey] == null) {\n this.$log.error(gObjectName + \" model has no id to assign a child to.\\nThis is required for performance. Please assign id,\\nor redirect id to a different key.\");\n return;\n }\n this.plurals.put(model[this.idKey], child);\n return child;\n };\n\n BasePolysParentModel.prototype.maybeFit = function(pathPoints) {\n if (pathPoints == null) {\n pathPoints = this.plurals.map(function(p) {\n return p.pathPoints;\n });\n }\n if (this.scope.fit) {\n pathPoints = _.flatten(pathPoints);\n return FitHelper.fit(pathPoints, this.gMap);\n }\n };\n\n return BasePolysParentModel;\n\n })(ModelKey);\n };\n }\n ]);\n\n}).call(this);\n","\n/*globals angular, _, google */\n\n(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapCircleParentModel', [\n 'uiGmapLogger', '$timeout', 'uiGmapGmapUtil', 'uiGmapEventsHelper', 'uiGmapCircleOptionsBuilder', function($log, $timeout, GmapUtil, EventsHelper, Builder) {\n var CircleParentModel, _settingFromDirective;\n _settingFromDirective = function(scope, fn) {\n scope.settingFromDirective = true;\n fn();\n return $timeout(function() {\n return scope.settingFromDirective = false;\n });\n };\n return CircleParentModel = (function(superClass) {\n extend(CircleParentModel, superClass);\n\n CircleParentModel.include(GmapUtil);\n\n CircleParentModel.include(EventsHelper);\n\n function CircleParentModel(scope, element, attrs, gMap, DEFAULTS) {\n var clean, gObject, lastRadius;\n this.attrs = attrs;\n this.gMap = gMap;\n this.DEFAULTS = DEFAULTS;\n this.scope = scope;\n lastRadius = null;\n clean = (function(_this) {\n return function() {\n lastRadius = null;\n if (_this.listeners != null) {\n _this.removeEvents(_this.listeners);\n return _this.listeners = void 0;\n }\n };\n })(this);\n gObject = new google.maps.Circle(this.buildOpts(GmapUtil.getCoords(scope.center), scope.radius));\n this.setMyOptions = (function(_this) {\n return function(newVals, oldVals) {\n if (scope.settingFromDirective) {\n return;\n }\n if (!(_.isEqual(newVals, oldVals) && newVals === oldVals && ((newVals != null) && (oldVals != null) ? newVals.coordinates === oldVals.coordinates : true))) {\n return gObject.setOptions(_this.buildOpts(GmapUtil.getCoords(scope.center), scope.radius));\n }\n };\n })(this);\n this.props = this.props.concat([\n {\n prop: 'center',\n isColl: true\n }, {\n prop: 'fill',\n isColl: true\n }, 'radius', 'zIndex'\n ]);\n this.watchProps();\n if (this.scope.control != null) {\n this.scope.control.getCircle = function() {\n return gObject;\n };\n }\n clean();\n this.listeners = this.setEvents(gObject, scope, scope, ['radius_changed']) || [];\n this.listeners.push(google.maps.event.addListener(gObject, 'radius_changed', function() {\n\n /*\n possible google bug, and or because a circle has two radii\n radius_changed appears to fire twice (original and new) which is not too helpful\n therefore we will check for radius changes manually and bail out if nothing has changed\n */\n var newRadius, work;\n newRadius = gObject.getRadius();\n if (newRadius === lastRadius) {\n return;\n }\n lastRadius = newRadius;\n work = function() {\n return _settingFromDirective(scope, function() {\n var ref, ref1;\n if (newRadius !== scope.radius) {\n scope.radius = newRadius;\n }\n if (((ref = scope.events) != null ? ref.radius_changed : void 0) && _.isFunction((ref1 = scope.events) != null ? ref1.radius_changed : void 0)) {\n return scope.events.radius_changed(gObject, 'radius_changed', scope, arguments);\n }\n });\n };\n if (!angular.mock) {\n return scope.$evalAsync(function() {\n return work();\n });\n } else {\n return work();\n }\n }));\n this.listeners.push(google.maps.event.addListener(gObject, 'center_changed', function() {\n return scope.$evalAsync(function() {\n return _settingFromDirective(scope, function() {\n if (angular.isDefined(scope.center.type)) {\n scope.center.coordinates[1] = gObject.getCenter().lat();\n return scope.center.coordinates[0] = gObject.getCenter().lng();\n } else {\n scope.center.latitude = gObject.getCenter().lat();\n return scope.center.longitude = gObject.getCenter().lng();\n }\n });\n });\n }));\n scope.$on('$destroy', function() {\n clean();\n return gObject.setMap(null);\n });\n $log.info(this);\n }\n\n return CircleParentModel;\n\n })(Builder);\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapDrawingManagerParentModel', [\n 'uiGmapLogger', '$timeout', 'uiGmapBaseObject', 'uiGmapEventsHelper', function($log, $timeout, BaseObject, EventsHelper) {\n var DrawingManagerParentModel;\n return DrawingManagerParentModel = (function(superClass) {\n extend(DrawingManagerParentModel, superClass);\n\n DrawingManagerParentModel.include(EventsHelper);\n\n function DrawingManagerParentModel(scope, element, attrs, map) {\n var gObject, listeners;\n this.scope = scope;\n this.attrs = attrs;\n this.map = map;\n gObject = new google.maps.drawing.DrawingManager(this.scope.options);\n gObject.setMap(this.map);\n listeners = void 0;\n if (this.scope.control != null) {\n this.scope.control.getDrawingManager = function() {\n return gObject;\n };\n }\n if (!this.scope[\"static\"] && this.scope.options) {\n this.scope.$watch('options', function(newValue) {\n return gObject != null ? gObject.setOptions(newValue) : void 0;\n }, true);\n }\n if (this.scope.events != null) {\n listeners = this.setEvents(gObject, this.scope, this.scope);\n this.scope.$watch('events', (function(_this) {\n return function(newValue, oldValue) {\n if (!_.isEqual(newValue, oldValue)) {\n if (listeners != null) {\n _this.removeEvents(listeners);\n }\n return listeners = _this.setEvents(gObject, _this.scope, _this.scope);\n }\n };\n })(this));\n }\n this.scope.$on('$destroy', (function(_this) {\n return function() {\n if (listeners != null) {\n _this.removeEvents(listeners);\n }\n gObject.setMap(null);\n return gObject = null;\n };\n })(this));\n }\n\n return DrawingManagerParentModel;\n\n })(BaseObject);\n }\n ]);\n\n}).call(this);\n","\n/*\n\t- interface for all markers to derrive from\n \t- to enforce a minimum set of requirements\n \t\t- attributes\n \t\t\t- coords\n \t\t\t- icon\n\t\t- implementation needed on watches\n */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module(\"uiGmapgoogle-maps.directives.api.models.parent\").factory(\"uiGmapIMarkerParentModel\", [\n \"uiGmapModelKey\", \"uiGmapLogger\", function(ModelKey, Logger) {\n var IMarkerParentModel;\n IMarkerParentModel = (function(superClass) {\n extend(IMarkerParentModel, superClass);\n\n IMarkerParentModel.prototype.DEFAULTS = {};\n\n function IMarkerParentModel(scope1, element, attrs, map) {\n this.scope = scope1;\n this.element = element;\n this.attrs = attrs;\n this.map = map;\n this.onWatch = bind(this.onWatch, this);\n this.watch = bind(this.watch, this);\n this.validateScope = bind(this.validateScope, this);\n IMarkerParentModel.__super__.constructor.call(this, this.scope);\n this.$log = Logger;\n if (!this.validateScope(this.scope)) {\n throw new String(\"Unable to construct IMarkerParentModel due to invalid scope\");\n }\n this.doClick = angular.isDefined(this.attrs.click);\n if (this.scope.options != null) {\n this.DEFAULTS = this.scope.options;\n }\n this.watch('coords', this.scope);\n this.watch('icon', this.scope);\n this.watch('options', this.scope);\n this.scope.$on(\"$destroy\", (function(_this) {\n return function() {\n return _this.onDestroy(_this.scope);\n };\n })(this));\n }\n\n IMarkerParentModel.prototype.validateScope = function(scope) {\n var ret;\n if (scope == null) {\n this.$log.error(this.constructor.name + \": invalid scope used\");\n return false;\n }\n ret = scope.coords != null;\n if (!ret) {\n this.$log.error(this.constructor.name + \": no valid coords attribute found\");\n return false;\n }\n return ret;\n };\n\n IMarkerParentModel.prototype.watch = function(propNameToWatch, scope, equalityCheck) {\n if (equalityCheck == null) {\n equalityCheck = true;\n }\n return scope.$watch(propNameToWatch, (function(_this) {\n return function(newValue, oldValue) {\n if (!_.isEqual(newValue, oldValue)) {\n return _this.onWatch(propNameToWatch, scope, newValue, oldValue);\n }\n };\n })(this), equalityCheck);\n };\n\n IMarkerParentModel.prototype.onWatch = function(propNameToWatch, scope, newValue, oldValue) {};\n\n return IMarkerParentModel;\n\n })(ModelKey);\n return IMarkerParentModel;\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module(\"uiGmapgoogle-maps.directives.api.models.parent\").factory(\"uiGmapIWindowParentModel\", [\n \"uiGmapModelKey\", \"uiGmapGmapUtil\", \"uiGmapLogger\", function(ModelKey, GmapUtil, Logger) {\n var IWindowParentModel;\n return IWindowParentModel = (function(superClass) {\n extend(IWindowParentModel, superClass);\n\n IWindowParentModel.include(GmapUtil);\n\n function IWindowParentModel(scope, element, attrs, ctrls, $timeout, $compile, $http, $templateCache) {\n IWindowParentModel.__super__.constructor.call(this, scope);\n this.$log = Logger;\n this.$timeout = $timeout;\n this.$compile = $compile;\n this.$http = $http;\n this.$templateCache = $templateCache;\n this.DEFAULTS = {};\n if (scope.options != null) {\n this.DEFAULTS = scope.options;\n }\n }\n\n IWindowParentModel.prototype.getItem = function(scope, modelsPropToIterate, index) {\n if (modelsPropToIterate === 'models') {\n return scope[modelsPropToIterate][index];\n }\n return scope[modelsPropToIterate].get(index);\n };\n\n return IWindowParentModel;\n\n })(ModelKey);\n }\n ]);\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapLayerParentModel', [\n 'uiGmapBaseObject', 'uiGmapLogger', '$timeout', function(BaseObject, Logger, $timeout) {\n var LayerParentModel;\n LayerParentModel = (function(superClass) {\n extend(LayerParentModel, superClass);\n\n function LayerParentModel(scope, element, attrs, gMap, onLayerCreated, $log) {\n this.scope = scope;\n this.element = element;\n this.attrs = attrs;\n this.gMap = gMap;\n this.onLayerCreated = onLayerCreated != null ? onLayerCreated : void 0;\n this.$log = $log != null ? $log : Logger;\n this.createGoogleLayer = bind(this.createGoogleLayer, this);\n if (this.attrs.type == null) {\n this.$log.info('type attribute for the layer directive is mandatory. Layer creation aborted!!');\n return;\n }\n this.createGoogleLayer();\n this.doShow = true;\n if (angular.isDefined(this.attrs.show)) {\n this.doShow = this.scope.show;\n }\n if (this.doShow && (this.gMap != null)) {\n this.gObject.setMap(this.gMap);\n }\n this.scope.$watch('show', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n _this.doShow = newValue;\n if (newValue) {\n return _this.gObject.setMap(_this.gMap);\n } else {\n return _this.gObject.setMap(null);\n }\n }\n };\n })(this), true);\n this.scope.$watch('options', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue && _this.doShow) {\n return _this.gObject.setOptions(newValue);\n }\n };\n })(this), true);\n this.scope.$on('$destroy', (function(_this) {\n return function() {\n return _this.gObject.setMap(null);\n };\n })(this));\n }\n\n LayerParentModel.prototype.createGoogleLayer = function() {\n var base;\n if (this.attrs.options == null) {\n this.gObject = this.attrs.namespace === void 0 ? new google.maps[this.attrs.type]() : new google.maps[this.attrs.namespace][this.attrs.type]();\n } else {\n this.gObject = this.attrs.namespace === void 0 ? new google.maps[this.attrs.type](this.scope.options) : new google.maps[this.attrs.namespace][this.attrs.type](this.scope.options);\n }\n if ((this.gObject != null) && this.doShow) {\n this.gObject.setMap(this.gMap);\n }\n if ((this.gObject != null) && (this.onLayerCreated != null)) {\n return typeof (base = this.onLayerCreated(this.scope, this.gObject)) === \"function\" ? base(this.gObject) : void 0;\n }\n };\n\n return LayerParentModel;\n\n })(BaseObject);\n return LayerParentModel;\n }\n ]);\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapMapTypeParentModel', [\n 'uiGmapBaseObject', 'uiGmapLogger', function(BaseObject, Logger) {\n var MapTypeParentModel;\n MapTypeParentModel = (function(superClass) {\n extend(MapTypeParentModel, superClass);\n\n function MapTypeParentModel(scope, element, attrs, gMap, $log, childModel, propMap) {\n var watchChildModelOptions, watchChildModelShow, watchOptions, watchShow;\n this.scope = scope;\n this.element = element;\n this.attrs = attrs;\n this.gMap = gMap;\n this.$log = $log != null ? $log : Logger;\n this.childModel = childModel;\n this.propMap = propMap;\n this.refreshShown = bind(this.refreshShown, this);\n this.hideOverlay = bind(this.hideOverlay, this);\n this.showOverlay = bind(this.showOverlay, this);\n this.refreshMapType = bind(this.refreshMapType, this);\n this.createMapType = bind(this.createMapType, this);\n if (this.scope.options == null) {\n this.$log.info('options attribute for the map-type directive is mandatory. Map type creation aborted!!');\n return;\n }\n this.id = this.gMap.overlayMapTypesCount = this.gMap.overlayMapTypesCount + 1 || 0;\n this.doShow = true;\n this.createMapType();\n this.refreshShown();\n if (this.doShow && (this.gMap != null)) {\n this.showOverlay();\n }\n watchChildModelShow = (function(_this) {\n return function() {\n return _this.childModel[_this.attrs.show];\n };\n })(this);\n watchShow = this.childModel ? watchChildModelShow : 'show';\n this.scope.$watch(watchShow, (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n _this.doShow = newValue;\n if (newValue) {\n return _this.showOverlay();\n } else {\n return _this.hideOverlay();\n }\n }\n };\n })(this));\n watchChildModelOptions = (function(_this) {\n return function() {\n return _this.childModel[_this.attrs.options];\n };\n })(this);\n watchOptions = this.childModel ? watchChildModelOptions : 'options';\n this.scope.$watchCollection(watchOptions, (function(_this) {\n return function(newValue, oldValue) {\n var different, mapTypeProps;\n if (!_.isEqual(newValue, oldValue)) {\n mapTypeProps = ['tileSize', 'maxZoom', 'minZoom', 'name', 'alt'];\n different = _.some(mapTypeProps, function(prop) {\n return !oldValue || !newValue || !_.isEqual(newValue[prop], oldValue[prop]);\n });\n if (different) {\n return _this.refreshMapType();\n }\n }\n };\n })(this));\n if (angular.isDefined(this.attrs.refresh)) {\n this.scope.$watch('refresh', (function(_this) {\n return function(newValue, oldValue) {\n if (!_.isEqual(newValue, oldValue)) {\n return _this.refreshMapType();\n }\n };\n })(this), true);\n }\n this.scope.$on('$destroy', (function(_this) {\n return function() {\n _this.hideOverlay();\n return _this.mapType = null;\n };\n })(this));\n }\n\n MapTypeParentModel.prototype.createMapType = function() {\n var id, idAttr, mapType;\n mapType = this.childModel ? (this.attrs.options ? this.childModel[this.attrs.options] : this.childModel) : this.scope.options;\n if (mapType.getTile != null) {\n this.mapType = mapType;\n } else if (mapType.getTileUrl != null) {\n this.mapType = new google.maps.ImageMapType(mapType);\n } else {\n this.$log.info('options should provide either getTile or getTileUrl methods. Map type creation aborted!!');\n return;\n }\n idAttr = this.attrs.id ? (this.childModel ? this.attrs.id : 'id') : void 0;\n id = idAttr ? (this.childModel ? this.childModel[idAttr] : this.scope[idAttr]) : void 0;\n if (id) {\n this.gMap.mapTypes.set(id, this.mapType);\n if (!angular.isDefined(this.attrs.show)) {\n this.doShow = false;\n }\n }\n this.mapType.layerId = this.id;\n if (this.childModel && angular.isDefined(this.scope.index)) {\n return this.propMap.put(this.mapType.layerId, this.scope.index);\n }\n };\n\n MapTypeParentModel.prototype.refreshMapType = function() {\n this.hideOverlay();\n this.mapType = null;\n this.createMapType();\n if (this.doShow && (this.gMap != null)) {\n return this.showOverlay();\n }\n };\n\n MapTypeParentModel.prototype.showOverlay = function() {\n var found;\n if (angular.isDefined(this.scope.index)) {\n found = false;\n if (this.gMap.overlayMapTypes.getLength()) {\n this.gMap.overlayMapTypes.forEach((function(_this) {\n return function(mapType, index) {\n var layerIndex;\n if (!found) {\n layerIndex = _this.propMap.get(mapType.layerId.toString());\n if (layerIndex > _this.scope.index || !angular.isDefined(layerIndex)) {\n found = true;\n _this.gMap.overlayMapTypes.insertAt(index, _this.mapType);\n }\n }\n };\n })(this));\n if (!found) {\n return this.gMap.overlayMapTypes.push(this.mapType);\n }\n } else {\n return this.gMap.overlayMapTypes.push(this.mapType);\n }\n } else {\n return this.gMap.overlayMapTypes.push(this.mapType);\n }\n };\n\n MapTypeParentModel.prototype.hideOverlay = function() {\n var found;\n found = false;\n return this.gMap.overlayMapTypes.forEach((function(_this) {\n return function(mapType, index) {\n if (!found && mapType.layerId === _this.id) {\n found = true;\n _this.gMap.overlayMapTypes.removeAt(index);\n }\n };\n })(this));\n };\n\n MapTypeParentModel.prototype.refreshShown = function() {\n return this.doShow = angular.isDefined(this.attrs.show) ? (this.childModel ? this.childModel[this.attrs.show] : this.scope.show) : true;\n };\n\n return MapTypeParentModel;\n\n })(BaseObject);\n return MapTypeParentModel;\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapMapTypesParentModel', [\n 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapMapTypeParentModel', 'uiGmapPropMap', function(BaseObject, Logger, MapTypeParentModel, PropMap) {\n var MapTypesParentModel;\n MapTypesParentModel = (function(superClass) {\n extend(MapTypesParentModel, superClass);\n\n function MapTypesParentModel(scope, element, attrs, gMap, $log) {\n var pMap;\n this.scope = scope;\n this.element = element;\n this.attrs = attrs;\n this.gMap = gMap;\n this.$log = $log != null ? $log : Logger;\n if (this.attrs.mapTypes == null) {\n this.$log.info('layers attribute for the map-types directive is mandatory. Map types creation aborted!!');\n return;\n }\n pMap = new PropMap;\n this.scope.mapTypes.forEach((function(_this) {\n return function(l, i) {\n var childScope, mockAttr;\n mockAttr = {\n options: _this.scope.options,\n show: _this.scope.show,\n refresh: _this.scope.refresh\n };\n childScope = _this.scope.$new();\n childScope.index = i;\n new MapTypeParentModel(childScope, null, mockAttr, _this.gMap, _this.$log, l, pMap);\n };\n })(this));\n }\n\n return MapTypesParentModel;\n\n })(BaseObject);\n return MapTypesParentModel;\n }\n ]);\n\n}).call(this);\n","\n/*global _:true,angular:true, */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module(\"uiGmapgoogle-maps.directives.api.models.parent\").factory(\"uiGmapMarkersParentModel\", [\n \"uiGmapIMarkerParentModel\", \"uiGmapModelsWatcher\", \"uiGmapPropMap\", \"uiGmapMarkerChildModel\", \"uiGmap_async\", \"uiGmapClustererMarkerManager\", \"uiGmapMarkerManager\", \"$timeout\", \"uiGmapIMarker\", \"uiGmapPromise\", \"uiGmapGmapUtil\", \"uiGmapLogger\", \"uiGmapSpiderfierMarkerManager\", function(IMarkerParentModel, ModelsWatcher, PropMap, MarkerChildModel, _async, ClustererMarkerManager, MarkerManager, $timeout, IMarker, uiGmapPromise, GmapUtil, $log, SpiderfierMarkerManager) {\n var MarkersParentModel, _setPlurals;\n _setPlurals = function(val, objToSet) {\n objToSet.plurals = new PropMap();\n objToSet.scope.plurals = objToSet.plurals;\n return objToSet;\n };\n MarkersParentModel = (function(superClass) {\n extend(MarkersParentModel, superClass);\n\n MarkersParentModel.include(GmapUtil);\n\n MarkersParentModel.include(ModelsWatcher);\n\n function MarkersParentModel(scope, element, attrs, map) {\n this.maybeExecMappedEvent = bind(this.maybeExecMappedEvent, this);\n this.onDestroy = bind(this.onDestroy, this);\n this.newChildMarker = bind(this.newChildMarker, this);\n this.pieceMeal = bind(this.pieceMeal, this);\n this.rebuildAll = bind(this.rebuildAll, this);\n this.createAllNew = bind(this.createAllNew, this);\n this.bindToTypeEvents = bind(this.bindToTypeEvents, this);\n this.createChildScopes = bind(this.createChildScopes, this);\n this.validateScope = bind(this.validateScope, this);\n this.onWatch = bind(this.onWatch, this);\n MarkersParentModel.__super__.constructor.call(this, scope, element, attrs, map);\n this[\"interface\"] = IMarker;\n _setPlurals(new PropMap(), this);\n this.scope.pluralsUpdate = {\n updateCtr: 0\n };\n this.$log.info(this);\n this.doRebuildAll = this.scope.doRebuildAll != null ? this.scope.doRebuildAll : false;\n this.setIdKey(this.scope);\n this.scope.$watch('doRebuildAll', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n return _this.doRebuildAll = newValue;\n }\n };\n })(this));\n if (!this.modelsLength()) {\n this.modelsRendered = false;\n }\n this.scope.$watch('models', (function(_this) {\n return function(newValue, oldValue) {\n if (!_.isEqual(newValue, oldValue) || !_this.modelsRendered) {\n if (newValue.length === 0 && oldValue.length === 0) {\n return;\n }\n _this.modelsRendered = true;\n return _this.onWatch('models', _this.scope, newValue, oldValue);\n }\n };\n })(this), !this.isTrue(attrs.modelsbyref));\n this.watch('doCluster', this.scope);\n this.watch('type', this.scope);\n this.watch('clusterOptions', this.scope);\n this.watch('clusterEvents', this.scope);\n this.watch('typeOptions', this.scope);\n this.watch('typeEvents', this.scope);\n this.watch('fit', this.scope);\n this.watch('idKey', this.scope);\n this.gManager = void 0;\n this.createAllNew(this.scope);\n }\n\n MarkersParentModel.prototype.onWatch = function(propNameToWatch, scope, newValue, oldValue) {\n if (propNameToWatch === \"idKey\" && newValue !== oldValue) {\n this.idKey = newValue;\n }\n if (this.doRebuildAll || (propNameToWatch === 'doCluster' || propNameToWatch === 'type')) {\n return this.rebuildAll(scope);\n } else {\n return this.pieceMeal(scope);\n }\n };\n\n MarkersParentModel.prototype.validateScope = function(scope) {\n var modelsNotDefined;\n modelsNotDefined = angular.isUndefined(scope.models) || scope.models === void 0;\n if (modelsNotDefined) {\n this.$log.error(this.constructor.name + \": no valid models attribute found\");\n }\n return MarkersParentModel.__super__.validateScope.call(this, scope) || modelsNotDefined;\n };\n\n\n /*\n Not used internally by this parent\n created for consistency for external control in the API\n */\n\n MarkersParentModel.prototype.createChildScopes = function(isCreatingFromScratch) {\n if ((this.gMap == null) || (this.scope.models == null)) {\n return;\n }\n if (isCreatingFromScratch) {\n return this.createAllNew(this.scope, false);\n } else {\n return this.pieceMeal(this.scope, false);\n }\n };\n\n MarkersParentModel.prototype.bindToTypeEvents = function(typeEvents, events) {\n var internalHandles, self;\n if (events == null) {\n events = ['click', 'mouseout', 'mouseover'];\n }\n\n /*\n You should only be binding to events that produce groups/clusters of somthing.\n Otherwise use the orginal event handle.\n For Example: Click on a cluster pushes a cluster/group obj through which has getMarkers\n However Spiderfy's click is for a single marker so this is not ideal for that.\n */\n self = this;\n if (!this.origTypeEvents) {\n this.origTypeEvents = {};\n _.each(events, (function(_this) {\n return function(eventName) {\n return _this.origTypeEvents[eventName] = typeEvents != null ? typeEvents[eventName] : void 0;\n };\n })(this));\n } else {\n angular.extend(typeEvents, this.origTypeEvents);\n }\n internalHandles = {};\n _.each(events, function(eventName) {\n return internalHandles[eventName] = function(group) {\n return self.maybeExecMappedEvent(group, eventName);\n };\n });\n return angular.extend(typeEvents, internalHandles);\n };\n\n MarkersParentModel.prototype.createAllNew = function(scope) {\n var isSpiderfied, maybeCanceled, typeEvents, typeOptions;\n if (this.gManager != null) {\n if (this.gManager instanceof SpiderfierMarkerManager) {\n isSpiderfied = this.gManager.isSpiderfied();\n }\n this.gManager.clear();\n delete this.gManager;\n }\n typeEvents = scope.typeEvents || scope.clusterEvents;\n typeOptions = scope.typeOptions || scope.clusterOptions;\n if (scope.doCluster || scope.type === 'cluster') {\n if (typeEvents != null) {\n this.bindToTypeEvents(typeEvents);\n }\n this.gManager = new ClustererMarkerManager(this.map, void 0, typeOptions, typeEvents);\n } else if (scope.type === 'spider') {\n if (typeEvents != null) {\n this.bindToTypeEvents(typeEvents, ['spiderfy', 'unspiderfy']);\n }\n this.gManager = new SpiderfierMarkerManager(this.map, void 0, typeOptions, typeEvents, this.scope);\n if (isSpiderfied) {\n this.gManager.spiderfy();\n }\n } else {\n this.gManager = new MarkerManager(this.map);\n }\n if (this.didQueueInitPromise(this, scope)) {\n return;\n }\n maybeCanceled = null;\n return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) {\n return maybeCanceled = canceledMsg;\n }), (function(_this) {\n return function() {\n return _async.each(scope.models, function(model) {\n _this.newChildMarker(model, scope);\n return maybeCanceled;\n }, _async.chunkSizeFrom(scope.chunk)).then(function() {\n _this.modelsRendered = true;\n if (scope.fit) {\n _this.gManager.fit();\n }\n _this.gManager.draw();\n return _this.scope.pluralsUpdate.updateCtr += 1;\n }, _async.chunkSizeFrom(scope.chunk));\n };\n })(this));\n };\n\n MarkersParentModel.prototype.rebuildAll = function(scope) {\n var ref;\n if (!scope.doRebuild && scope.doRebuild !== void 0) {\n return;\n }\n if ((ref = this.scope.plurals) != null ? ref.length : void 0) {\n return this.onDestroy(scope).then((function(_this) {\n return function() {\n return _this.createAllNew(scope);\n };\n })(this));\n } else {\n return this.createAllNew(scope);\n }\n };\n\n MarkersParentModel.prototype.pieceMeal = function(scope) {\n var maybeCanceled, payload;\n if (scope.$$destroyed) {\n return;\n }\n maybeCanceled = null;\n payload = null;\n if (this.modelsLength() && this.scope.plurals.length) {\n return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) {\n return maybeCanceled = canceledMsg;\n }), (function(_this) {\n return function() {\n return uiGmapPromise.promise((function() {\n return _this.figureOutState(_this.idKey, scope, _this.scope.plurals, _this.modelKeyComparison);\n })).then(function(state) {\n payload = state;\n return _async.each(payload.removals, function(child) {\n if (child != null) {\n if (child.destroy != null) {\n child.destroy();\n }\n _this.scope.plurals.remove(child.id);\n return maybeCanceled;\n }\n }, _async.chunkSizeFrom(scope.chunk));\n }).then(function() {\n return _async.each(payload.adds, function(modelToAdd) {\n _this.newChildMarker(modelToAdd, scope);\n return maybeCanceled;\n }, _async.chunkSizeFrom(scope.chunk));\n }).then(function() {\n return _async.each(payload.updates, function(update) {\n _this.updateChild(update.child, update.model);\n return maybeCanceled;\n }, _async.chunkSizeFrom(scope.chunk));\n }).then(function() {\n if (payload.adds.length > 0 || payload.removals.length > 0 || payload.updates.length > 0) {\n scope.plurals = _this.scope.plurals;\n if (scope.fit) {\n _this.gManager.fit();\n }\n _this.gManager.draw();\n }\n return _this.scope.pluralsUpdate.updateCtr += 1;\n });\n };\n })(this));\n } else {\n this.inProgress = false;\n return this.rebuildAll(scope);\n }\n };\n\n MarkersParentModel.prototype.newChildMarker = function(model, scope) {\n var child, childScope, keys;\n if (!model) {\n throw 'model undefined';\n }\n if (model[this.idKey] == null) {\n this.$log.error(\"Marker model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key.\");\n return;\n }\n this.$log.info('child', child, 'markers', this.scope.markerModels);\n childScope = scope.$new(false);\n childScope.events = scope.events;\n keys = {};\n IMarker.scopeKeys.forEach(function(k) {\n return keys[k] = scope[k];\n });\n child = new MarkerChildModel({\n scope: childScope,\n model: model,\n keys: keys,\n gMap: this.map,\n defaults: this.DEFAULTS,\n doClick: this.doClick,\n gManager: this.gManager,\n doDrawSelf: false,\n isScopeModel: true\n });\n this.scope.plurals.put(model[this.idKey], child);\n return child;\n };\n\n MarkersParentModel.prototype.onDestroy = function(scope) {\n MarkersParentModel.__super__.onDestroy.call(this, scope);\n return _async.promiseLock(this, uiGmapPromise.promiseTypes[\"delete\"], void 0, void 0, (function(_this) {\n return function() {\n return _async.each(_this.scope.plurals.values(), function(model) {\n if (model != null) {\n return model.destroy(false);\n }\n }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() {\n if (_this.gManager != null) {\n _this.gManager.destroy();\n }\n _this.plurals.removeAll();\n if (_this.plurals !== _this.scope.plurals) {\n console.error('plurals out of sync for MarkersParentModel');\n }\n return _this.scope.pluralsUpdate.updateCtr += 1;\n });\n };\n })(this));\n };\n\n MarkersParentModel.prototype.maybeExecMappedEvent = function(group, fnName) {\n var pair, typeEvents;\n if (this.scope.$$destroyed) {\n return;\n }\n typeEvents = this.scope.typeEvents || this.scope.clusterEvents;\n if (_.isFunction(typeEvents != null ? typeEvents[fnName] : void 0)) {\n pair = this.mapTypeToPlurals(group);\n if (this.origTypeEvents[fnName]) {\n return this.origTypeEvents[fnName](pair.group, pair.mapped);\n }\n }\n };\n\n MarkersParentModel.prototype.mapTypeToPlurals = function(group) {\n var arrayToMap, mapped, ref;\n if (_.isArray(group)) {\n arrayToMap = group;\n } else if (_.isFunction(group.getMarkers)) {\n arrayToMap = group.getMarkers();\n }\n if (arrayToMap == null) {\n $log.error(\"Unable to map event as we cannot find the array group to map\");\n return;\n }\n if ((ref = this.scope.plurals.values()) != null ? ref.length : void 0) {\n mapped = arrayToMap.map((function(_this) {\n return function(g) {\n return _this.scope.plurals.get(g.key).model;\n };\n })(this));\n } else {\n mapped = [];\n }\n return {\n cluster: group,\n mapped: mapped,\n group: group\n };\n };\n\n MarkersParentModel.prototype.getItem = function(scope, modelsPropToIterate, index) {\n if (modelsPropToIterate === 'models') {\n return scope[modelsPropToIterate][index];\n }\n return scope[modelsPropToIterate].get(index);\n };\n\n return MarkersParentModel;\n\n })(IMarkerParentModel);\n return MarkersParentModel;\n }\n ]);\n\n}).call(this);\n","(function() {\n ['Polygon', 'Polyline'].forEach(function(name) {\n return angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory(\"uiGmap\" + name + \"sParentModel\", [\n 'uiGmapBasePolysParentModel', \"uiGmap\" + name + \"ChildModel\", \"uiGmapI\" + name, function(BasePolysParentModel, ChildModel, IPoly) {\n return BasePolysParentModel(IPoly, ChildModel, name);\n }\n ]);\n });\n\n}).call(this);\n","\n/*globals angular, _, google */\n\n(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapRectangleParentModel', [\n 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', 'uiGmapRectangleOptionsBuilder', function($log, GmapUtil, EventsHelper, Builder) {\n var RectangleParentModel;\n return RectangleParentModel = (function(superClass) {\n extend(RectangleParentModel, superClass);\n\n RectangleParentModel.include(GmapUtil);\n\n RectangleParentModel.include(EventsHelper);\n\n function RectangleParentModel(scope, element, attrs, gMap, DEFAULTS) {\n var bounds, clear, createBounds, dragging, fit, gObject, init, listeners, myListeners, settingBoundsFromScope, updateBounds;\n this.scope = scope;\n this.attrs = attrs;\n this.gMap = gMap;\n this.DEFAULTS = DEFAULTS;\n bounds = void 0;\n dragging = false;\n myListeners = [];\n listeners = void 0;\n fit = (function(_this) {\n return function() {\n if (_this.isTrue(_this.attrs.fit)) {\n return _this.fitMapBounds(_this.gMap, bounds);\n }\n };\n })(this);\n createBounds = (function(_this) {\n return function() {\n var ref, ref1, ref2;\n if ((_this.scope.bounds != null) && (((ref = _this.scope.bounds) != null ? ref.sw : void 0) != null) && (((ref1 = _this.scope.bounds) != null ? ref1.ne : void 0) != null) && _this.validateBoundPoints(_this.scope.bounds)) {\n bounds = _this.convertBoundPoints(_this.scope.bounds);\n return $log.info(\"new new bounds created: \" + (JSON.stringify(bounds)));\n } else if ((_this.scope.bounds.getNorthEast != null) && (_this.scope.bounds.getSouthWest != null)) {\n return bounds = _this.scope.bounds;\n } else {\n if (_this.scope.bounds != null) {\n return $log.error(\"Invalid bounds for newValue: \" + (JSON.stringify((ref2 = _this.scope) != null ? ref2.bounds : void 0)));\n }\n }\n };\n })(this);\n createBounds();\n gObject = new google.maps.Rectangle(this.buildOpts(bounds));\n $log.info(\"gObject (rectangle) created: \" + gObject);\n settingBoundsFromScope = false;\n updateBounds = (function(_this) {\n return function() {\n var b, ne, sw;\n b = gObject.getBounds();\n ne = b.getNorthEast();\n sw = b.getSouthWest();\n if (settingBoundsFromScope) {\n return;\n }\n return _this.scope.$evalAsync(function(s) {\n if ((s.bounds != null) && (s.bounds.sw != null) && (s.bounds.ne != null)) {\n s.bounds.ne = {\n latitude: ne.lat(),\n longitude: ne.lng()\n };\n s.bounds.sw = {\n latitude: sw.lat(),\n longitude: sw.lng()\n };\n }\n if ((s.bounds.getNorthEast != null) && (s.bounds.getSouthWest != null)) {\n return s.bounds = b;\n }\n });\n };\n })(this);\n init = (function(_this) {\n return function() {\n fit();\n _this.removeEvents(myListeners);\n myListeners.push(google.maps.event.addListener(gObject, 'dragstart', function() {\n return dragging = true;\n }));\n myListeners.push(google.maps.event.addListener(gObject, 'dragend', function() {\n dragging = false;\n return updateBounds();\n }));\n return myListeners.push(google.maps.event.addListener(gObject, 'bounds_changed', function() {\n if (dragging) {\n return;\n }\n return updateBounds();\n }));\n };\n })(this);\n clear = (function(_this) {\n return function() {\n _this.removeEvents(myListeners);\n if (listeners != null) {\n _this.removeEvents(listeners);\n }\n return gObject.setMap(null);\n };\n })(this);\n if (bounds != null) {\n init();\n }\n this.scope.$watch('bounds', (function(newValue, oldValue) {\n var isNew;\n if (_.isEqual(newValue, oldValue) && (bounds != null) || dragging) {\n return;\n }\n settingBoundsFromScope = true;\n if (newValue == null) {\n clear();\n return;\n }\n if (bounds == null) {\n isNew = true;\n } else {\n fit();\n }\n createBounds();\n gObject.setBounds(bounds);\n settingBoundsFromScope = false;\n if (isNew && (bounds != null)) {\n return init();\n }\n }), true);\n this.setMyOptions = (function(_this) {\n return function(newVals, oldVals) {\n if (!_.isEqual(newVals, oldVals)) {\n if ((bounds != null) && (newVals != null)) {\n return gObject.setOptions(_this.buildOpts(bounds));\n }\n }\n };\n })(this);\n this.props.push('bounds');\n this.watchProps(this.props);\n if (this.attrs.events != null) {\n listeners = this.setEvents(gObject, this.scope, this.scope);\n this.scope.$watch('events', (function(_this) {\n return function(newValue, oldValue) {\n if (!_.isEqual(newValue, oldValue)) {\n if (listeners != null) {\n _this.removeEvents(listeners);\n }\n return listeners = _this.setEvents(gObject, _this.scope, _this.scope);\n }\n };\n })(this));\n }\n this.scope.$on('$destroy', function() {\n return clear();\n });\n $log.info(this);\n }\n\n return RectangleParentModel;\n\n })(Builder);\n }\n ]);\n\n}).call(this);\n","\n/*global angular:true, google:true */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapSearchBoxParentModel', [\n 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapEventsHelper', function(BaseObject, Logger, EventsHelper) {\n var SearchBoxParentModel;\n SearchBoxParentModel = (function(superClass) {\n extend(SearchBoxParentModel, superClass);\n\n SearchBoxParentModel.include(EventsHelper);\n\n function SearchBoxParentModel(scope, element, attrs, gMap, ctrlPosition, template, $log) {\n var controlDiv;\n this.scope = scope;\n this.element = element;\n this.attrs = attrs;\n this.gMap = gMap;\n this.ctrlPosition = ctrlPosition;\n this.template = template;\n this.$log = $log != null ? $log : Logger;\n this.setVisibility = bind(this.setVisibility, this);\n this.getBounds = bind(this.getBounds, this);\n this.setBounds = bind(this.setBounds, this);\n this.createSearchBox = bind(this.createSearchBox, this);\n this.addToParentDiv = bind(this.addToParentDiv, this);\n this.addAsMapControl = bind(this.addAsMapControl, this);\n this.init = bind(this.init, this);\n if (this.attrs.template == null) {\n this.$log.error('template attribute for the search-box directive is mandatory. Places Search Box creation aborted!!');\n return;\n }\n if (angular.isUndefined(this.scope.options)) {\n this.scope.options = {};\n this.scope.options.visible = true;\n }\n if (angular.isUndefined(this.scope.options.visible)) {\n this.scope.options.visible = true;\n }\n if (angular.isUndefined(this.scope.options.autocomplete)) {\n this.scope.options.autocomplete = false;\n }\n this.visible = this.scope.options.visible;\n this.autocomplete = this.scope.options.autocomplete;\n controlDiv = angular.element('
');\n controlDiv.append(this.template);\n this.input = controlDiv.find('input')[0];\n this.init();\n }\n\n SearchBoxParentModel.prototype.init = function() {\n this.createSearchBox();\n this.scope.$watch('options', (function(_this) {\n return function(newValue, oldValue) {\n if (angular.isObject(newValue)) {\n if (newValue.bounds != null) {\n _this.setBounds(newValue.bounds);\n }\n if (newValue.visible != null) {\n if (_this.visible !== newValue.visible) {\n return _this.setVisibility(newValue.visible);\n }\n }\n }\n };\n })(this), true);\n if (this.attrs.parentdiv != null) {\n this.addToParentDiv();\n } else {\n this.addAsMapControl();\n }\n if (!this.visible) {\n this.setVisibility(this.visible);\n }\n if (this.autocomplete) {\n this.listener = google.maps.event.addListener(this.gObject, 'place_changed', (function(_this) {\n return function() {\n return _this.places = _this.gObject.getPlace();\n };\n })(this));\n } else {\n this.listener = google.maps.event.addListener(this.gObject, 'places_changed', (function(_this) {\n return function() {\n return _this.places = _this.gObject.getPlaces();\n };\n })(this));\n }\n this.listeners = this.setEvents(this.gObject, this.scope, this.scope);\n this.$log.info(this);\n this.scope.$on('$stateChangeSuccess', (function(_this) {\n return function() {\n if (_this.attrs.parentdiv != null) {\n return _this.addToParentDiv();\n }\n };\n })(this));\n return this.scope.$on('$destroy', (function(_this) {\n return function() {\n return _this.gObject = null;\n };\n })(this));\n };\n\n SearchBoxParentModel.prototype.addAsMapControl = function() {\n return this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input);\n };\n\n SearchBoxParentModel.prototype.addToParentDiv = function() {\n var ref;\n this.parentDiv = angular.element(document.getElementById(this.scope.parentdiv));\n if ((ref = this.parentDiv) != null ? ref.length : void 0) {\n return this.parentDiv.append(this.input);\n }\n };\n\n SearchBoxParentModel.prototype.createSearchBox = function() {\n if (this.autocomplete) {\n return this.gObject = new google.maps.places.Autocomplete(this.input, this.scope.options);\n } else {\n return this.gObject = new google.maps.places.SearchBox(this.input, this.scope.options);\n }\n };\n\n SearchBoxParentModel.prototype.setBounds = function(bounds) {\n if (angular.isUndefined(bounds.isEmpty)) {\n this.$log.error('Error: SearchBoxParentModel setBounds. Bounds not an instance of LatLngBounds.');\n } else {\n if (bounds.isEmpty() === false) {\n if (this.gObject != null) {\n return this.gObject.setBounds(bounds);\n }\n }\n }\n };\n\n SearchBoxParentModel.prototype.getBounds = function() {\n return this.gObject.getBounds();\n };\n\n SearchBoxParentModel.prototype.setVisibility = function(val) {\n if (this.attrs.parentdiv != null) {\n if (val === false) {\n this.parentDiv.addClass(\"ng-hide\");\n } else {\n this.parentDiv.removeClass(\"ng-hide\");\n }\n } else {\n if (val === false) {\n this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].clear();\n } else {\n this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input);\n }\n }\n return this.visible = val;\n };\n\n return SearchBoxParentModel;\n\n })(BaseObject);\n return SearchBoxParentModel;\n }\n ]);\n\n}).call(this);\n","\n/*global _,angular */\n\n\n/*\n\tWindowsChildModel generator where there are many ChildModels to a parent.\n */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api.models.parent').factory('uiGmapWindowsParentModel', [\n 'uiGmapIWindowParentModel', 'uiGmapModelsWatcher', 'uiGmapPropMap', 'uiGmapWindowChildModel', 'uiGmapLinked', 'uiGmap_async', 'uiGmapLogger', '$timeout', '$compile', '$http', '$templateCache', '$interpolate', 'uiGmapPromise', 'uiGmapIWindow', 'uiGmapGmapUtil', function(IWindowParentModel, ModelsWatcher, PropMap, WindowChildModel, Linked, _async, $log, $timeout, $compile, $http, $templateCache, $interpolate, uiGmapPromise, IWindow, GmapUtil) {\n var WindowsParentModel;\n WindowsParentModel = (function(superClass) {\n extend(WindowsParentModel, superClass);\n\n WindowsParentModel.include(ModelsWatcher);\n\n function WindowsParentModel(scope, element, attrs, ctrls, gMap1, markersScope) {\n this.gMap = gMap1;\n this.markersScope = markersScope;\n this.modelKeyComparison = bind(this.modelKeyComparison, this);\n this.interpolateContent = bind(this.interpolateContent, this);\n this.setChildScope = bind(this.setChildScope, this);\n this.createWindow = bind(this.createWindow, this);\n this.setContentKeys = bind(this.setContentKeys, this);\n this.pieceMeal = bind(this.pieceMeal, this);\n this.createAllNew = bind(this.createAllNew, this);\n this.watchIdKey = bind(this.watchIdKey, this);\n this.createChildScopes = bind(this.createChildScopes, this);\n this.watchOurScope = bind(this.watchOurScope, this);\n this.watchDestroy = bind(this.watchDestroy, this);\n this.onDestroy = bind(this.onDestroy, this);\n this.rebuildAll = bind(this.rebuildAll, this);\n this.doINeedToWipe = bind(this.doINeedToWipe, this);\n this.watchModels = bind(this.watchModels, this);\n this.go = bind(this.go, this);\n WindowsParentModel.__super__.constructor.call(this, scope, element, attrs, ctrls, $timeout, $compile, $http, $templateCache);\n this[\"interface\"] = IWindow;\n this.plurals = new PropMap();\n _.each(IWindow.scopeKeys, (function(_this) {\n return function(name) {\n return _this[name + 'Key'] = void 0;\n };\n })(this));\n this.linked = new Linked(scope, element, attrs, ctrls);\n this.contentKeys = void 0;\n this.isIconVisibleOnClick = void 0;\n this.firstTime = true;\n this.firstWatchModels = true;\n this.$log.info(self);\n this.parentScope = void 0;\n this.go(scope);\n }\n\n WindowsParentModel.prototype.go = function(scope) {\n this.watchOurScope(scope);\n this.doRebuildAll = this.scope.doRebuildAll != null ? this.scope.doRebuildAll : false;\n scope.$watch('doRebuildAll', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n return _this.doRebuildAll = newValue;\n }\n };\n })(this));\n return this.createChildScopes();\n };\n\n WindowsParentModel.prototype.watchModels = function(scope) {\n var itemToWatch;\n itemToWatch = this.markersScope != null ? 'pluralsUpdate' : 'models';\n return scope.$watch(itemToWatch, (function(_this) {\n return function(newValue, oldValue) {\n var doScratch;\n if (!_.isEqual(newValue, oldValue) || _this.firstWatchModels) {\n _this.firstWatchModels = false;\n if (_this.doRebuildAll || _this.doINeedToWipe(scope.models)) {\n return _this.rebuildAll(scope, true, true);\n } else {\n doScratch = _this.plurals.length === 0;\n if (_this.existingPieces != null) {\n return _.last(_this.existingPieces._content).then(function() {\n return _this.createChildScopes(doScratch);\n });\n } else {\n return _this.createChildScopes(doScratch);\n }\n }\n }\n };\n })(this), true);\n };\n\n WindowsParentModel.prototype.doINeedToWipe = function(newValue) {\n var newValueIsEmpty;\n newValueIsEmpty = newValue != null ? newValue.length === 0 : true;\n return this.plurals.length > 0 && newValueIsEmpty;\n };\n\n WindowsParentModel.prototype.rebuildAll = function(scope, doCreate, doDelete) {\n return this.onDestroy(doDelete).then((function(_this) {\n return function() {\n if (doCreate) {\n return _this.createChildScopes();\n }\n };\n })(this));\n };\n\n WindowsParentModel.prototype.onDestroy = function(scope) {\n WindowsParentModel.__super__.onDestroy.call(this, this.scope);\n return _async.promiseLock(this, uiGmapPromise.promiseTypes[\"delete\"], void 0, void 0, (function(_this) {\n return function() {\n return _async.each(_this.plurals.values(), function(child) {\n return child.destroy(true);\n }, _async.chunkSizeFrom(_this.scope.cleanchunk, false)).then(function() {\n var ref;\n return (ref = _this.plurals) != null ? ref.removeAll() : void 0;\n });\n };\n })(this));\n };\n\n WindowsParentModel.prototype.watchDestroy = function(scope) {\n return scope.$on('$destroy', (function(_this) {\n return function() {\n _this.firstWatchModels = true;\n _this.firstTime = true;\n return _this.rebuildAll(scope, false, true);\n };\n })(this));\n };\n\n WindowsParentModel.prototype.watchOurScope = function(scope) {\n return _.each(IWindow.scopeKeys, (function(_this) {\n return function(name) {\n var nameKey;\n nameKey = name + 'Key';\n return _this[nameKey] = typeof scope[name] === 'function' ? scope[name]() : scope[name];\n };\n })(this));\n };\n\n WindowsParentModel.prototype.createChildScopes = function(isCreatingFromScratch) {\n var modelsNotDefined, ref, ref1;\n if (isCreatingFromScratch == null) {\n isCreatingFromScratch = true;\n }\n\n /*\n being that we cannot tell the difference in Key String vs. a normal value string (TemplateUrl)\n we will assume that all scope values are string expressions either pointing to a key (propName) or using\n 'self' to point the model as container/object of interest.\n \n This may force redundant information into the model, but this appears to be the most flexible approach.\n */\n this.isIconVisibleOnClick = true;\n if (angular.isDefined(this.linked.attrs.isiconvisibleonclick)) {\n this.isIconVisibleOnClick = this.linked.scope.isIconVisibleOnClick;\n }\n modelsNotDefined = angular.isUndefined(this.linked.scope.models);\n if (modelsNotDefined && (this.markersScope === void 0 || (((ref = this.markersScope) != null ? ref.plurals : void 0) === void 0 || ((ref1 = this.markersScope) != null ? ref1.models : void 0) === void 0))) {\n this.$log.error('No models to create windows from! Need direct models or models derived from markers!');\n return;\n }\n if (this.gMap != null) {\n if (this.linked.scope.models != null) {\n this.watchIdKey(this.linked.scope);\n if (isCreatingFromScratch) {\n return this.createAllNew(this.linked.scope, false);\n } else {\n return this.pieceMeal(this.linked.scope, false);\n }\n } else {\n this.parentScope = this.markersScope;\n this.watchIdKey(this.parentScope);\n if (isCreatingFromScratch) {\n return this.createAllNew(this.markersScope, true, 'plurals', false);\n } else {\n return this.pieceMeal(this.markersScope, true, 'plurals', false);\n }\n }\n }\n };\n\n WindowsParentModel.prototype.watchIdKey = function(scope) {\n this.setIdKey(scope);\n return scope.$watch('idKey', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue && (newValue == null)) {\n _this.idKey = newValue;\n return _this.rebuildAll(scope, true, true);\n }\n };\n })(this));\n };\n\n WindowsParentModel.prototype.createAllNew = function(scope, hasGMarker, modelsPropToIterate, isArray) {\n var maybeCanceled;\n if (modelsPropToIterate == null) {\n modelsPropToIterate = 'models';\n }\n if (isArray == null) {\n isArray = false;\n }\n if (this.firstTime) {\n this.watchModels(scope);\n this.watchDestroy(scope);\n }\n this.setContentKeys(scope.models);\n if (this.didQueueInitPromise(this, scope)) {\n return;\n }\n maybeCanceled = null;\n return _async.promiseLock(this, uiGmapPromise.promiseTypes.create, 'createAllNew', (function(canceledMsg) {\n return maybeCanceled = canceledMsg;\n }), (function(_this) {\n return function() {\n return _async.each(scope.models, function(model) {\n var gMarker, ref;\n gMarker = hasGMarker ? (ref = _this.getItem(scope, modelsPropToIterate, model[_this.idKey])) != null ? ref.gObject : void 0 : void 0;\n if (!maybeCanceled) {\n if (!gMarker && _this.markersScope) {\n $log.error('Unable to get gMarker from markersScope!');\n }\n _this.createWindow(model, gMarker, _this.gMap);\n }\n return maybeCanceled;\n }, _async.chunkSizeFrom(scope.chunk)).then(function() {\n return _this.firstTime = false;\n });\n };\n })(this));\n };\n\n WindowsParentModel.prototype.pieceMeal = function(scope, hasGMarker, modelsPropToIterate, isArray) {\n var maybeCanceled, payload;\n if (modelsPropToIterate == null) {\n modelsPropToIterate = 'models';\n }\n if (isArray == null) {\n isArray = true;\n }\n if (scope.$$destroyed) {\n return;\n }\n maybeCanceled = null;\n payload = null;\n if ((scope != null) && this.modelsLength() && this.plurals.length) {\n return _async.promiseLock(this, uiGmapPromise.promiseTypes.update, 'pieceMeal', (function(canceledMsg) {\n return maybeCanceled = canceledMsg;\n }), (function(_this) {\n return function() {\n return uiGmapPromise.promise((function() {\n return _this.figureOutState(_this.idKey, scope, _this.plurals, _this.modelKeyComparison);\n })).then(function(state) {\n payload = state;\n return _async.each(payload.removals, function(child) {\n if (child != null) {\n _this.plurals.remove(child.id);\n if (child.destroy != null) {\n child.destroy(true);\n }\n return maybeCanceled;\n }\n }, _async.chunkSizeFrom(scope.chunk));\n }).then(function() {\n return _async.each(payload.adds, function(modelToAdd) {\n var gMarker, ref;\n gMarker = (ref = _this.getItem(scope, modelsPropToIterate, modelToAdd[_this.idKey])) != null ? ref.gObject : void 0;\n if (!gMarker) {\n throw 'Gmarker undefined';\n }\n _this.createWindow(modelToAdd, gMarker, _this.gMap);\n return maybeCanceled;\n });\n }).then(function() {\n return _async.each(payload.updates, function(update) {\n _this.updateChild(update.child, update.model);\n return maybeCanceled;\n }, _async.chunkSizeFrom(scope.chunk));\n });\n };\n })(this));\n } else {\n $log.debug('pieceMeal: rebuildAll');\n return this.rebuildAll(this.scope, true, true);\n }\n };\n\n WindowsParentModel.prototype.setContentKeys = function(models) {\n if (this.modelsLength(models)) {\n return this.contentKeys = Object.keys(models[0]);\n }\n };\n\n WindowsParentModel.prototype.createWindow = function(model, gMarker, gMap) {\n var child, childScope, fakeElement, opts, ref, ref1;\n childScope = this.linked.scope.$new(false);\n this.setChildScope(childScope, model);\n childScope.$watch('model', (function(_this) {\n return function(newValue, oldValue) {\n if (newValue !== oldValue) {\n return _this.setChildScope(childScope, newValue);\n }\n };\n })(this), true);\n fakeElement = {\n html: (function(_this) {\n return function() {\n return _this.interpolateContent(_this.linked.element.html(), model);\n };\n })(this)\n };\n this.DEFAULTS = this.scopeOrModelVal(this.optionsKey, this.scope, model) || {};\n opts = this.createWindowOptions(gMarker, childScope, fakeElement.html(), this.DEFAULTS);\n child = new WindowChildModel({\n model: model,\n scope: childScope,\n opts: opts,\n isIconVisibleOnClick: this.isIconVisibleOnClick,\n gMap: gMap,\n markerScope: (ref = this.markersScope) != null ? (ref1 = ref.plurals.get(model[this.idKey])) != null ? ref1.scope : void 0 : void 0,\n element: fakeElement,\n needToManualDestroy: false,\n markerIsVisibleAfterWindowClose: true,\n isScopeModel: true\n });\n if (model[this.idKey] == null) {\n this.$log.error('Window model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key.');\n return;\n }\n this.plurals.put(model[this.idKey], child);\n return child;\n };\n\n WindowsParentModel.prototype.setChildScope = function(childScope, model) {\n _.each(IWindow.scopeKeys, (function(_this) {\n return function(name) {\n var nameKey, newValue;\n nameKey = name + 'Key';\n newValue = _this[nameKey] === 'self' ? model : model[_this[nameKey]];\n if (newValue !== childScope[name]) {\n return childScope[name] = newValue;\n }\n };\n })(this));\n return childScope.model = model;\n };\n\n WindowsParentModel.prototype.interpolateContent = function(content, model) {\n var exp, i, interpModel, key, len, ref;\n if (this.contentKeys === void 0 || this.contentKeys.length === 0) {\n return;\n }\n exp = $interpolate(content);\n interpModel = {};\n ref = this.contentKeys;\n for (i = 0, len = ref.length; i < len; i++) {\n key = ref[i];\n interpModel[key] = model[key];\n }\n return exp(interpModel);\n };\n\n WindowsParentModel.prototype.modelKeyComparison = function(model1, model2) {\n var isEqual, scope;\n scope = this.scope.coords != null ? this.scope : this.parentScope;\n if (scope == null) {\n throw 'No scope or parentScope set!';\n }\n isEqual = GmapUtil.equalCoords(this.evalModelHandle(model1, scope.coords), this.evalModelHandle(model2, scope.coords));\n if (!isEqual) {\n return isEqual;\n }\n isEqual = _.every(_.without(this[\"interface\"].scopeKeys, 'coords'), (function(_this) {\n return function(k) {\n return _this.evalModelHandle(model1, scope[k]) === _this.evalModelHandle(model2, scope[k]);\n };\n })(this));\n return isEqual;\n };\n\n return WindowsParentModel;\n\n })(IWindowParentModel);\n return WindowsParentModel;\n }\n ]);\n\n}).call(this);\n","\n/*global angular, _ */\n\n(function() {\n angular.module(\"uiGmapgoogle-maps.directives.api\").factory(\"uiGmapCircle\", [\n \"uiGmapICircle\", \"uiGmapCircleParentModel\", function(ICircle, CircleParentModel) {\n return _.extend(ICircle, {\n link: function(scope, element, attrs, mapCtrl) {\n return mapCtrl.getScope().deferred.promise.then(function(gMap) {\n return new CircleParentModel(scope, element, attrs, gMap);\n });\n }\n });\n }\n ]);\n\n}).call(this);\n","(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module(\"uiGmapgoogle-maps.directives.api\").factory(\"uiGmapControl\", [\n \"uiGmapIControl\", \"$http\", \"$templateCache\", \"$compile\", \"$controller\", 'uiGmapGoogleMapApi', function(IControl, $http, $templateCache, $compile, $controller, GoogleMapApi) {\n var Control;\n return Control = (function(superClass) {\n extend(Control, superClass);\n\n function Control() {\n this.link = bind(this.link, this);\n Control.__super__.constructor.call(this);\n }\n\n Control.prototype.transclude = true;\n\n Control.prototype.link = function(scope, element, attrs, ctrl, transclude) {\n return GoogleMapApi.then((function(_this) {\n return function(maps) {\n var hasTranscludedContent, index, position;\n hasTranscludedContent = angular.isUndefined(scope.template);\n index = angular.isDefined(scope.index && !isNaN(parseInt(scope.index))) ? parseInt(scope.index) : void 0;\n position = angular.isDefined(scope.position) ? scope.position.toUpperCase().replace(/-/g, '_') : 'TOP_CENTER';\n if (!maps.ControlPosition[position]) {\n _this.$log.error('mapControl: invalid position property');\n return;\n }\n return IControl.mapPromise(scope, ctrl).then(function(map) {\n var control, controlDiv, pushControl;\n control = void 0;\n controlDiv = angular.element('
');\n pushControl = function(map, control, index) {\n if (index) {\n control[0].index = index;\n }\n return map.controls[google.maps.ControlPosition[position]].push(control[0]);\n };\n if (hasTranscludedContent) {\n return transclude(function(transcludeEl) {\n controlDiv.append(transcludeEl);\n return pushControl(map, controlDiv.children(), index);\n });\n } else {\n return $http.get(scope.template, {\n cache: $templateCache\n }).then(function(arg) {\n var data, templateCtrl, templateScope;\n data = arg.data;\n templateScope = scope.$new();\n controlDiv.append(data);\n if (angular.isDefined(scope.controller)) {\n templateCtrl = $controller(scope.controller, {\n $scope: templateScope\n });\n controlDiv.children().data('$ngControllerController', templateCtrl);\n }\n return control = $compile(controlDiv.children())(templateScope);\n })[\"catch\"](function(error) {\n return _this.$log.error('mapControl: template could not be found');\n }).then(function() {\n return pushControl(map, control, index);\n });\n }\n });\n };\n })(this));\n };\n\n return Control;\n\n })(IControl);\n }\n ]);\n\n}).call(this);\n","\n/*globals angular, _ */\n\n(function() {\n angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapDragZoom', [\n 'uiGmapCtrlHandle', 'uiGmapPropertyAction', function(CtrlHandle, PropertyAction) {\n return {\n restrict: 'EMA',\n transclude: true,\n template: '
',\n require: '^' + 'uiGmapGoogleMap',\n scope: {\n keyboardkey: '=',\n options: '=',\n spec: '='\n },\n controller: [\n '$scope', '$element', function($scope, $element) {\n $scope.ctrlType = 'uiGmapDragZoom';\n return _.extend(this, CtrlHandle.handle($scope, $element));\n }\n ],\n link: function(scope, element, attrs, ctrl) {\n return CtrlHandle.mapPromise(scope, ctrl).then(function(map) {\n var enableKeyDragZoom, setKeyAction, setOptionsAction;\n enableKeyDragZoom = function(opts) {\n return map.enableKeyDragZoom(opts);\n };\n setKeyAction = new PropertyAction(function(key, newVal) {\n if (newVal) {\n return enableKeyDragZoom({\n key: newVal\n });\n } else {\n return enableKeyDragZoom();\n }\n });\n setOptionsAction = new PropertyAction(function(key, newVal) {\n if (newVal) {\n return enableKeyDragZoom(newVal);\n }\n });\n scope.$watch('keyboardkey', setKeyAction.sic('keyboardkey'));\n setKeyAction.sic(scope.keyboardkey);\n scope.$watch('options', setOptionsAction.sic('options'));\n return setOptionsAction.sic(scope.options);\n });\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module(\"uiGmapgoogle-maps.directives.api\").factory(\"uiGmapDrawingManager\", [\n \"uiGmapIDrawingManager\", \"uiGmapDrawingManagerParentModel\", function(IDrawingManager, DrawingManagerParentModel) {\n return _.extend(IDrawingManager, {\n link: function(scope, element, attrs, mapCtrl) {\n return mapCtrl.getScope().deferred.promise.then(function(map) {\n return new DrawingManagerParentModel(scope, element, attrs, map);\n });\n }\n });\n }\n ]);\n\n}).call(this);\n","\n/*\n - Link up Polygons to be sent back to a controller\n - inject the draw function into a controllers scope so that controller can call the directive to draw on demand\n - draw function creates the DrawFreeHandChildModel which manages itself\n */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapApiFreeDrawPolygons', [\n 'uiGmapLogger', 'uiGmapBaseObject', 'uiGmapCtrlHandle', 'uiGmapDrawFreeHandChildModel', 'uiGmapLodash', function($log, BaseObject, CtrlHandle, DrawFreeHandChildModel, uiGmapLodash) {\n var FreeDrawPolygons;\n return FreeDrawPolygons = (function(superClass) {\n extend(FreeDrawPolygons, superClass);\n\n function FreeDrawPolygons() {\n this.link = bind(this.link, this);\n return FreeDrawPolygons.__super__.constructor.apply(this, arguments);\n }\n\n FreeDrawPolygons.include(CtrlHandle);\n\n FreeDrawPolygons.prototype.restrict = 'EMA';\n\n FreeDrawPolygons.prototype.replace = true;\n\n FreeDrawPolygons.prototype.require = '^' + 'uiGmapGoogleMap';\n\n FreeDrawPolygons.prototype.scope = {\n polygons: '=',\n draw: '='\n };\n\n FreeDrawPolygons.prototype.link = function(scope, element, attrs, ctrl) {\n return this.mapPromise(scope, ctrl).then((function(_this) {\n return function(map) {\n var freeHand, listener;\n if (!scope.polygons) {\n return $log.error('No polygons to bind to!');\n }\n if (!_.isArray(scope.polygons)) {\n return $log.error('Free Draw Polygons must be of type Array!');\n }\n freeHand = new DrawFreeHandChildModel(map, ctrl.getScope());\n listener = void 0;\n return scope.draw = function() {\n if (typeof listener === \"function\") {\n listener();\n }\n return freeHand.engage(scope.polygons).then(function() {\n var firstTime;\n firstTime = true;\n return listener = scope.$watchCollection('polygons', function(newValue, oldValue) {\n var removals;\n if (firstTime || newValue === oldValue) {\n firstTime = false;\n return;\n }\n removals = uiGmapLodash.differenceObjects(oldValue, newValue);\n return removals.forEach(function(p) {\n return p.setMap(null);\n });\n });\n });\n };\n };\n })(this));\n };\n\n return FreeDrawPolygons;\n\n })(BaseObject);\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module(\"uiGmapgoogle-maps.directives.api\").service(\"uiGmapICircle\", [\n function() {\n return {\n restrict: \"EA\",\n replace: true,\n require: '^' + 'uiGmapGoogleMap',\n scope: {\n center: \"=center\",\n radius: \"=radius\",\n stroke: \"=stroke\",\n fill: \"=fill\",\n clickable: \"=\",\n draggable: \"=\",\n editable: \"=\",\n geodesic: \"=\",\n icons: \"=icons\",\n visible: \"=\",\n events: \"=\",\n control: \"=\",\n zIndex: \"=zindex\"\n }\n };\n }\n ]);\n\n}).call(this);\n","\n/*\n - interface for all controls to derive from\n - to enforce a minimum set of requirements\n\t- attributes\n\t\t- template\n\t\t- position\n\t\t- controller\n\t\t- index\n */\n\n(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module(\"uiGmapgoogle-maps.directives.api\").factory(\"uiGmapIControl\", [\n \"uiGmapBaseObject\", \"uiGmapLogger\", \"uiGmapCtrlHandle\", function(BaseObject, Logger, CtrlHandle) {\n var IControl;\n return IControl = (function(superClass) {\n extend(IControl, superClass);\n\n IControl.extend(CtrlHandle);\n\n function IControl() {\n this.restrict = 'EA';\n this.replace = true;\n this.require = '^' + 'uiGmapGoogleMap';\n this.scope = {\n template: '@template',\n position: '@position',\n controller: '@controller',\n index: '@index'\n };\n this.$log = Logger;\n }\n\n IControl.prototype.link = function(scope, element, attrs, ctrl) {\n throw new Error(\"Not implemented!!\");\n };\n\n return IControl;\n\n })(BaseObject);\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapIDrawingManager', [\n function() {\n return {\n restrict: 'EA',\n replace: true,\n require: '^' + 'uiGmapGoogleMap',\n scope: {\n \"static\": '@',\n control: '=',\n options: '=',\n events: '='\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIMarker', [\n 'uiGmapBaseObject', 'uiGmapCtrlHandle', function(BaseObject, CtrlHandle) {\n var IMarker;\n return IMarker = (function(superClass) {\n extend(IMarker, superClass);\n\n IMarker.scope = {\n coords: '=coords',\n icon: '=icon',\n click: '&click',\n options: '=options',\n events: '=events',\n fit: '=fit',\n idKey: '=idkey',\n control: '=control'\n };\n\n IMarker.scopeKeys = _.keys(IMarker.scope);\n\n IMarker.keys = IMarker.scopeKeys;\n\n IMarker.extend(CtrlHandle);\n\n function IMarker() {\n this.restrict = 'EMA';\n this.require = '^' + 'uiGmapGoogleMap';\n this.priority = -1;\n this.transclude = true;\n this.replace = true;\n this.scope = _.extend(this.scope || {}, IMarker.scope);\n }\n\n return IMarker;\n\n })(BaseObject);\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIPolygon', [\n 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapCtrlHandle', function(GmapUtil, BaseObject, Logger, CtrlHandle) {\n var IPolygon;\n return IPolygon = (function(superClass) {\n extend(IPolygon, superClass);\n\n IPolygon.scope = {\n path: '=path',\n stroke: '=stroke',\n clickable: '=',\n draggable: '=',\n editable: '=',\n geodesic: '=',\n fill: '=',\n icons: '=icons',\n visible: '=',\n \"static\": '=',\n events: '=',\n zIndex: '=zindex',\n fit: '=',\n control: '=control'\n };\n\n IPolygon.scopeKeys = _.keys(IPolygon.scope);\n\n IPolygon.include(GmapUtil);\n\n IPolygon.extend(CtrlHandle);\n\n function IPolygon() {}\n\n IPolygon.prototype.restrict = 'EMA';\n\n IPolygon.prototype.replace = true;\n\n IPolygon.prototype.require = '^' + 'uiGmapGoogleMap';\n\n IPolygon.prototype.scope = IPolygon.scope;\n\n IPolygon.prototype.DEFAULTS = {};\n\n IPolygon.prototype.$log = Logger;\n\n return IPolygon;\n\n })(BaseObject);\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIPolyline', [\n 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapCtrlHandle', function(GmapUtil, BaseObject, Logger, CtrlHandle) {\n var IPolyline;\n return IPolyline = (function(superClass) {\n extend(IPolyline, superClass);\n\n IPolyline.scope = {\n path: '=',\n stroke: '=',\n clickable: '=',\n draggable: '=',\n editable: '=',\n geodesic: '=',\n icons: '=',\n visible: '=',\n \"static\": '=',\n fit: '=',\n events: '=',\n zIndex: '=zindex'\n };\n\n IPolyline.scopeKeys = _.keys(IPolyline.scope);\n\n IPolyline.include(GmapUtil);\n\n IPolyline.extend(CtrlHandle);\n\n function IPolyline() {}\n\n IPolyline.prototype.restrict = 'EMA';\n\n IPolyline.prototype.replace = true;\n\n IPolyline.prototype.require = '^' + 'uiGmapGoogleMap';\n\n IPolyline.prototype.scope = IPolyline.scope;\n\n IPolyline.prototype.DEFAULTS = {};\n\n IPolyline.prototype.$log = Logger;\n\n return IPolyline;\n\n })(BaseObject);\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapIRectangle', [\n function() {\n 'use strict';\n return {\n restrict: 'EMA',\n require: '^' + 'uiGmapGoogleMap',\n replace: true,\n scope: {\n bounds: '=',\n stroke: '=',\n clickable: '=',\n draggable: '=',\n editable: '=',\n fill: '=',\n visible: '=',\n events: '='\n }\n };\n }\n ]);\n\n}).call(this);\n","(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapIWindow', [\n 'uiGmapBaseObject', 'uiGmapChildEvents', 'uiGmapCtrlHandle', function(BaseObject, ChildEvents, CtrlHandle) {\n var IWindow;\n return IWindow = (function(superClass) {\n extend(IWindow, superClass);\n\n IWindow.scope = {\n coords: '=coords',\n template: '=template',\n templateUrl: '=templateurl',\n templateParameter: '=templateparameter',\n isIconVisibleOnClick: '=isiconvisibleonclick',\n closeClick: '&closeclick',\n options: '=options',\n control: '=control',\n show: '=show'\n };\n\n IWindow.scopeKeys = _.keys(IWindow.scope);\n\n IWindow.include(ChildEvents);\n\n IWindow.extend(CtrlHandle);\n\n function IWindow() {\n this.restrict = 'EMA';\n this.template = void 0;\n this.transclude = true;\n this.priority = -100;\n this.require = '^' + 'uiGmapGoogleMap';\n this.replace = true;\n this.scope = _.extend(this.scope || {}, IWindow.scope);\n }\n\n return IWindow;\n\n })(BaseObject);\n }\n ]);\n\n}).call(this);\n","\n/*globals angular,_,google */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapMap', ['$timeout', '$q', '$log', 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapCtrlHandle', 'uiGmapIsReady', 'uiGmapuuid', 'uiGmapExtendGWin', 'uiGmapExtendMarkerClusterer', 'uiGmapGoogleMapsUtilV3', 'uiGmapGoogleMapApi', 'uiGmapEventsHelper', 'uiGmapGoogleMapObjectManager', function($timeout, $q, $log, uiGmapGmapUtil, uiGmapBaseObject, uiGmapCtrlHandle, uiGmapIsReady, uiGmapuuid, uiGmapExtendGWin, uiGmapExtendMarkerClusterer, uiGmapGoogleMapsUtilV3, uiGmapGoogleMapApi, uiGmapEventsHelper, uiGmapGoogleMapObjectManager) {\n var DEFAULTS, Map, initializeItems;\n DEFAULTS = void 0;\n initializeItems = [uiGmapGoogleMapsUtilV3, uiGmapExtendGWin, uiGmapExtendMarkerClusterer];\n return Map = (function(superClass) {\n extend(Map, superClass);\n\n Map.include(uiGmapGmapUtil);\n\n function Map() {\n this.link = bind(this.link, this);\n var ctrlFn;\n ctrlFn = function($scope) {\n var ctrlObj, retCtrl;\n retCtrl = void 0;\n $scope.$on('$destroy', function() {\n return uiGmapIsReady.decrement();\n });\n ctrlObj = uiGmapCtrlHandle.handle($scope);\n $scope.ctrlType = 'Map';\n $scope.deferred.promise.then(function() {\n return initializeItems.forEach(function(i) {\n return i.init();\n });\n });\n ctrlObj.getMap = function() {\n return $scope.map;\n };\n retCtrl = _.extend(this, ctrlObj);\n return retCtrl;\n };\n this.controller = ['$scope', ctrlFn];\n }\n\n Map.prototype.restrict = 'EMA';\n\n Map.prototype.transclude = true;\n\n Map.prototype.replace = false;\n\n Map.prototype.template = \"
\\n
\";\n\n Map.prototype.scope = {\n center: '=',\n zoom: '=',\n dragging: '=',\n control: '=',\n options: '=',\n events: '=',\n eventOpts: '=',\n styles: '=',\n bounds: '=',\n update: '='\n };\n\n Map.prototype.link = function(scope, element, attrs) {\n var listeners;\n listeners = [];\n scope.$on('$destroy', function() {\n uiGmapEventsHelper.removeEvents(listeners);\n if (attrs.recycleMapInstance === 'true' && scope.map) {\n uiGmapGoogleMapObjectManager.recycleMapInstance(scope.map);\n return scope.map = null;\n }\n });\n scope.idleAndZoomChanged = false;\n return uiGmapGoogleMapApi.then((function(_this) {\n return function(maps) {\n var _gMap, customListeners, disabledEvents, dragging, el, eventName, getEventHandler, mapOptions, maybeHookToEvent, opts, ref, resolveSpawned, settingFromDirective, spawned, type, updateCenter, zoomPromise;\n DEFAULTS = {\n mapTypeId: maps.MapTypeId.ROADMAP\n };\n spawned = uiGmapIsReady.spawn();\n resolveSpawned = function() {\n return spawned.deferred.resolve({\n instance: spawned.instance,\n map: _gMap\n });\n };\n if (!angular.isDefined(scope.center) && !angular.isDefined(scope.bounds)) {\n $log.error('angular-google-maps: a center or bounds property is required');\n return;\n }\n if (!angular.isDefined(scope.center)) {\n scope.center = new google.maps.LatLngBounds(_this.getCoords(scope.bounds.southwest), _this.getCoords(scope.bounds.northeast)).getCenter();\n }\n if (!angular.isDefined(scope.zoom)) {\n scope.zoom = 10;\n }\n el = angular.element(element);\n el.addClass('angular-google-map');\n opts = {\n options: {}\n };\n if (attrs.options) {\n opts.options = scope.options;\n }\n if (attrs.styles) {\n opts.styles = scope.styles;\n }\n if (attrs.type) {\n type = attrs.type.toUpperCase();\n if (google.maps.MapTypeId.hasOwnProperty(type)) {\n opts.mapTypeId = google.maps.MapTypeId[attrs.type.toUpperCase()];\n } else {\n $log.error(\"angular-google-maps: invalid map type '\" + attrs.type + \"'\");\n }\n }\n mapOptions = angular.extend({}, DEFAULTS, opts, {\n center: _this.getCoords(scope.center),\n zoom: scope.zoom,\n bounds: scope.bounds\n });\n if (attrs.recycleMapInstance === 'true') {\n _gMap = uiGmapGoogleMapObjectManager.createMapInstance(el.find('div')[1], mapOptions);\n } else {\n _gMap = new google.maps.Map(el.find('div')[1], mapOptions);\n }\n _gMap['uiGmap_id'] = uiGmapuuid.generate();\n dragging = false;\n listeners.push(google.maps.event.addListenerOnce(_gMap, 'idle', function() {\n scope.deferred.resolve(_gMap);\n return resolveSpawned();\n }));\n disabledEvents = attrs.events && (((ref = scope.events) != null ? ref.blacklist : void 0) != null) ? scope.events.blacklist : [];\n if (_.isString(disabledEvents)) {\n disabledEvents = [disabledEvents];\n }\n maybeHookToEvent = function(eventName, fn, prefn) {\n if (!_.includes(disabledEvents, eventName)) {\n if (prefn) {\n prefn();\n }\n return listeners.push(google.maps.event.addListener(_gMap, eventName, function() {\n var ref1;\n if (!((ref1 = scope.update) != null ? ref1.lazy : void 0)) {\n return fn();\n }\n }));\n }\n };\n if (!_.includes(disabledEvents, 'all')) {\n maybeHookToEvent('dragstart', function() {\n dragging = true;\n return scope.$evalAsync(function(s) {\n if (s.dragging != null) {\n return s.dragging = dragging;\n }\n });\n });\n maybeHookToEvent('dragend', function() {\n dragging = false;\n return scope.$evalAsync(function(s) {\n if (s.dragging != null) {\n return s.dragging = dragging;\n }\n });\n });\n updateCenter = function(c, s) {\n var cLat, cLng;\n if (c == null) {\n c = _gMap.center;\n }\n if (s == null) {\n s = scope;\n }\n if (!_.includes(disabledEvents, 'center')) {\n cLat = c.lat();\n cLng = c.lng();\n if (angular.isDefined(s.center.type)) {\n if (s.center.coordinates[1] !== cLat) {\n s.center.coordinates[1] = cLat;\n }\n if (s.center.coordinates[0] !== cLng) {\n return s.center.coordinates[0] = cLng;\n }\n } else {\n if (s.center.latitude !== cLat) {\n s.center.latitude = cLat;\n }\n if (s.center.longitude !== cLng) {\n return s.center.longitude = cLng;\n }\n }\n }\n };\n settingFromDirective = false;\n maybeHookToEvent('idle', function() {\n var b, ne, sw;\n b = _gMap.getBounds();\n ne = b.getNorthEast();\n sw = b.getSouthWest();\n settingFromDirective = true;\n return scope.$evalAsync(function(s) {\n updateCenter();\n if (!_.isUndefined(s.bounds) && !_.includes(disabledEvents, 'bounds')) {\n s.bounds.northeast = {\n latitude: ne.lat(),\n longitude: ne.lng()\n };\n s.bounds.southwest = {\n latitude: sw.lat(),\n longitude: sw.lng()\n };\n }\n if (!_.includes(disabledEvents, 'zoom')) {\n s.zoom = _gMap.zoom;\n scope.idleAndZoomChanged = !scope.idleAndZoomChanged;\n }\n return settingFromDirective = false;\n });\n });\n }\n if (angular.isDefined(scope.events) && scope.events !== null && angular.isObject(scope.events)) {\n getEventHandler = function(eventName) {\n return function() {\n return scope.events[eventName].apply(scope, [_gMap, eventName, arguments]);\n };\n };\n customListeners = [];\n for (eventName in scope.events) {\n if (scope.events.hasOwnProperty(eventName) && angular.isFunction(scope.events[eventName])) {\n customListeners.push(google.maps.event.addListener(_gMap, eventName, getEventHandler(eventName)));\n }\n }\n listeners.concat(customListeners);\n }\n _gMap.getOptions = function() {\n return mapOptions;\n };\n scope.map = _gMap;\n if ((attrs.control != null) && (scope.control != null)) {\n scope.control.refresh = function(maybeCoords) {\n var coords, ref1, ref2;\n if (_gMap == null) {\n return;\n }\n if (((typeof google !== \"undefined\" && google !== null ? (ref1 = google.maps) != null ? (ref2 = ref1.event) != null ? ref2.trigger : void 0 : void 0 : void 0) != null) && (_gMap != null)) {\n google.maps.event.trigger(_gMap, 'resize');\n }\n if (((maybeCoords != null ? maybeCoords.latitude : void 0) != null) && ((maybeCoords != null ? maybeCoords.longitude : void 0) != null)) {\n coords = _this.getCoords(maybeCoords);\n if (_this.isTrue(attrs.pan)) {\n return _gMap.panTo(coords);\n } else {\n return _gMap.setCenter(coords);\n }\n }\n };\n scope.control.getGMap = function() {\n return _gMap;\n };\n scope.control.getMapOptions = function() {\n return mapOptions;\n };\n scope.control.getCustomEventListeners = function() {\n return customListeners;\n };\n scope.control.removeEvents = function(yourListeners) {\n return uiGmapEventsHelper.removeEvents(yourListeners);\n };\n }\n scope.$watch('center', function(newValue, oldValue) {\n var coords;\n if (newValue === oldValue || settingFromDirective) {\n return;\n }\n coords = _this.getCoords(scope.center);\n if (coords.lat() === _gMap.center.lat() && coords.lng() === _gMap.center.lng()) {\n return;\n }\n if (!dragging) {\n if (!_this.validateCoords(newValue)) {\n $log.error(\"Invalid center for newValue: \" + (JSON.stringify(newValue)));\n }\n if (_this.isTrue(attrs.pan) && scope.zoom === _gMap.zoom) {\n return _gMap.panTo(coords);\n } else {\n return _gMap.setCenter(coords);\n }\n }\n }, true);\n zoomPromise = null;\n scope.$watch('zoom', function(newValue, oldValue) {\n var ref1, ref2;\n if (newValue == null) {\n return;\n }\n if (_.isEqual(newValue, oldValue) || (_gMap != null ? _gMap.getZoom() : void 0) === (scope != null ? scope.zoom : void 0) || settingFromDirective) {\n return;\n }\n if (zoomPromise != null) {\n $timeout.cancel(zoomPromise);\n }\n return zoomPromise = $timeout(function() {\n return _gMap.setZoom(newValue);\n }, ((ref1 = scope.eventOpts) != null ? (ref2 = ref1.debounce) != null ? ref2.zoomMs : void 0 : void 0) + 20, false);\n });\n scope.$watch('bounds', function(newValue, oldValue) {\n var bounds, ne, ref1, ref2, ref3, ref4, sw;\n if (newValue === oldValue) {\n return;\n }\n if (((newValue != null ? (ref1 = newValue.northeast) != null ? ref1.latitude : void 0 : void 0) == null) || ((newValue != null ? (ref2 = newValue.northeast) != null ? ref2.longitude : void 0 : void 0) == null) || ((newValue != null ? (ref3 = newValue.southwest) != null ? ref3.latitude : void 0 : void 0) == null) || ((newValue != null ? (ref4 = newValue.southwest) != null ? ref4.longitude : void 0 : void 0) == null)) {\n $log.error(\"Invalid map bounds for new value: \" + (JSON.stringify(newValue)));\n return;\n }\n ne = new google.maps.LatLng(newValue.northeast.latitude, newValue.northeast.longitude);\n sw = new google.maps.LatLng(newValue.southwest.latitude, newValue.southwest.longitude);\n bounds = new google.maps.LatLngBounds(sw, ne);\n return _gMap.fitBounds(bounds);\n });\n return ['options', 'styles'].forEach(function(toWatch) {\n return scope.$watch(toWatch, function(newValue, oldValue) {\n if (_.isEqual(newValue, oldValue)) {\n return;\n }\n if (toWatch === 'options') {\n opts.options = newValue;\n } else {\n opts.options[toWatch] = newValue;\n }\n if (_gMap != null) {\n return _gMap.setOptions(opts);\n }\n }, true);\n });\n };\n })(this));\n };\n\n return Map;\n\n })(uiGmapBaseObject);\n }]);\n\n}).call(this);\n","\n/*global _:true,angular:true */\n\n(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module(\"uiGmapgoogle-maps.directives.api\").factory(\"uiGmapMarker\", [\n \"uiGmapIMarker\", \"uiGmapMarkerChildModel\", \"uiGmapMarkerManager\", \"uiGmapLogger\", function(IMarker, MarkerChildModel, MarkerManager, $log) {\n var Marker;\n return Marker = (function(superClass) {\n extend(Marker, superClass);\n\n function Marker() {\n Marker.__super__.constructor.call(this);\n this.template = '';\n $log.info(this);\n }\n\n Marker.prototype.controller = [\n '$scope', '$element', function($scope, $element) {\n $scope.ctrlType = 'Marker';\n return _.extend(this, IMarker.handle($scope, $element));\n }\n ];\n\n Marker.prototype.link = function(scope, element, attrs, ctrl) {\n var mapPromise;\n mapPromise = IMarker.mapPromise(scope, ctrl);\n mapPromise.then(function(gMap) {\n var gManager, keys, m;\n gManager = new MarkerManager(gMap);\n keys = _.object(IMarker.keys, IMarker.keys);\n m = new MarkerChildModel({\n scope: scope,\n model: scope,\n keys: keys,\n gMap: gMap,\n doClick: true,\n gManager: gManager,\n doDrawSelf: false,\n trackModel: false\n });\n m.deferred.promise.then(function(gMarker) {\n return scope.deferred.resolve(gMarker);\n });\n if (scope.control != null) {\n return scope.control.getGMarkers = gManager.getGMarkers;\n }\n });\n return scope.$on('$destroy', function() {\n var gManager;\n if (typeof gManager !== \"undefined\" && gManager !== null) {\n gManager.clear();\n }\n return gManager = null;\n });\n };\n\n return Marker;\n\n })(IMarker);\n }\n ]);\n\n}).call(this);\n","\n/*global _:true,angular:true */\n\n(function() {\n var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module(\"uiGmapgoogle-maps.directives.api\").factory(\"uiGmapMarkers\", [\n \"uiGmapIMarker\", \"uiGmapPlural\", \"uiGmapMarkersParentModel\", \"uiGmap_sync\", \"uiGmapLogger\", function(IMarker, Plural, MarkersParentModel, _sync, $log) {\n var Markers;\n return Markers = (function(superClass) {\n extend(Markers, superClass);\n\n function Markers() {\n Markers.__super__.constructor.call(this);\n this.template = '';\n Plural.extend(this, {\n doCluster: '=?docluster',\n clusterOptions: '=clusteroptions',\n clusterEvents: '=clusterevents',\n modelsByRef: '=modelsbyref',\n type: '=?type',\n typeOptions: '=?typeoptions',\n typeEvents: '=?typeevents',\n deepComparison: '=?deepcomparison'\n });\n $log.info(this);\n }\n\n Markers.prototype.controller = [\n '$scope', '$element', function($scope, $element) {\n $scope.ctrlType = 'Markers';\n return _.extend(this, IMarker.handle($scope, $element));\n }\n ];\n\n Markers.prototype.link = function(scope, element, attrs, ctrl) {\n var parentModel, ready;\n parentModel = void 0;\n ready = function() {\n return scope.deferred.resolve();\n };\n return IMarker.mapPromise(scope, ctrl).then(function(map) {\n var mapScope;\n mapScope = ctrl.getScope();\n mapScope.$watch('idleAndZoomChanged', function() {\n return _.defer(parentModel.gManager.draw);\n });\n parentModel = new MarkersParentModel(scope, element, attrs, map);\n Plural.link(scope, parentModel);\n if (scope.control != null) {\n scope.control.getGMarkers = function() {\n var ref;\n return (ref = parentModel.gManager) != null ? ref.getGMarkers() : void 0;\n };\n scope.control.getChildMarkers = function() {\n return parentModel.plurals;\n };\n }\n return _.last(parentModel.existingPieces._content).then(function() {\n return ready();\n });\n });\n };\n\n return Markers;\n\n })(IMarker);\n }\n ]);\n\n}).call(this);\n","\n/*global angular */\n\n(function() {\n angular.module('uiGmapgoogle-maps.directives.api').service('uiGmapPlural', [\n function() {\n var _initControl;\n _initControl = function(scope, parent) {\n if (scope.control == null) {\n return;\n }\n scope.control.updateModels = function(models) {\n scope.models = models;\n return parent.createChildScopes(false);\n };\n scope.control.newModels = function(models) {\n scope.models = models;\n return parent.rebuildAll(scope, true, true);\n };\n scope.control.clean = function() {\n return parent.rebuildAll(scope, false, true);\n };\n scope.control.getPlurals = function() {\n return parent.plurals;\n };\n scope.control.getManager = function() {\n return parent.gManager;\n };\n scope.control.hasManager = function() {\n return (parent.gManager != null) === true;\n };\n return scope.control.managerDraw = function() {\n var ref;\n if (scope.control.hasManager()) {\n return (ref = scope.control.getManager()) != null ? ref.draw() : void 0;\n }\n };\n };\n return {\n extend: function(obj, obj2) {\n return _.extend(obj.scope || {}, obj2 || {}, {\n idKey: '=idkey',\n doRebuildAll: '=dorebuildall',\n models: '=models',\n chunk: '=chunk',\n cleanchunk: '=cleanchunk',\n control: '=control',\n deepComparison: '=deepcomparison'\n });\n },\n link: function(scope, parent) {\n return _initControl(scope, parent);\n }\n };\n }\n ]);\n\n}).call(this);\n","\n/*global angular */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygon', [\n 'uiGmapIPolygon', '$timeout', 'uiGmapPolygonChildModel', function(IPolygon, $timeout, PolygonChild) {\n var Polygon;\n return Polygon = (function(superClass) {\n extend(Polygon, superClass);\n\n function Polygon() {\n this.link = bind(this.link, this);\n return Polygon.__super__.constructor.apply(this, arguments);\n }\n\n Polygon.prototype.link = function(scope, element, attrs, mapCtrl) {\n var children, promise;\n children = [];\n promise = IPolygon.mapPromise(scope, mapCtrl);\n if (scope.control != null) {\n scope.control.getInstance = this;\n scope.control.polygons = children;\n scope.control.promise = promise;\n }\n return promise.then((function(_this) {\n return function(gMap) {\n return children.push(new PolygonChild({\n scope: scope,\n attrs: attrs,\n gMap: gMap,\n defaults: _this.DEFAULTS\n }));\n };\n })(this));\n };\n\n return Polygon;\n\n })(IPolygon);\n }\n ]);\n\n}).call(this);\n","\n/*global angular:true */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolygons', [\n 'uiGmapIPolygon', '$timeout', 'uiGmapPolygonsParentModel', 'uiGmapPlural', function(Interface, $timeout, ParentModel, Plural) {\n var Polygons;\n return Polygons = (function(superClass) {\n extend(Polygons, superClass);\n\n function Polygons() {\n this.link = bind(this.link, this);\n Polygons.__super__.constructor.call(this);\n Plural.extend(this);\n this.$log.info(this);\n }\n\n Polygons.prototype.link = function(scope, element, attrs, mapCtrl) {\n return mapCtrl.getScope().deferred.promise.then((function(_this) {\n return function(map) {\n if (angular.isUndefined(scope.path) || scope.path === null) {\n _this.$log.warn('polygons: no valid path attribute found');\n }\n if (!scope.models) {\n _this.$log.warn('polygons: no models found to create from');\n }\n return Plural.link(scope, new ParentModel(scope, element, attrs, map, _this.DEFAULTS));\n };\n })(this));\n };\n\n return Polygons;\n\n })(Interface);\n }\n ]);\n\n}).call(this);\n","\n/*global angular */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolyline', [\n 'uiGmapIPolyline', '$timeout', 'uiGmapPolylineChildModel', function(IPolyline, $timeout, PolylineChildModel) {\n var Polyline;\n return Polyline = (function(superClass) {\n extend(Polyline, superClass);\n\n function Polyline() {\n this.link = bind(this.link, this);\n return Polyline.__super__.constructor.apply(this, arguments);\n }\n\n Polyline.prototype.link = function(scope, element, attrs, mapCtrl) {\n return IPolyline.mapPromise(scope, mapCtrl).then((function(_this) {\n return function(gMap) {\n if (angular.isUndefined(scope.path) || scope.path === null || !_this.validatePath(scope.path)) {\n _this.$log.warn('polyline: no valid path attribute found');\n }\n return new PolylineChildModel({\n scope: scope,\n attrs: attrs,\n gMap: gMap,\n defaults: _this.DEFAULTS\n });\n };\n })(this));\n };\n\n return Polyline;\n\n })(IPolyline);\n }\n ]);\n\n}).call(this);\n","\n/*global angular */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapPolylines', [\n 'uiGmapIPolyline', '$timeout', 'uiGmapPolylinesParentModel', 'uiGmapPlural', function(IPolyline, $timeout, PolylinesParentModel, Plural) {\n var Polylines;\n return Polylines = (function(superClass) {\n extend(Polylines, superClass);\n\n function Polylines() {\n this.link = bind(this.link, this);\n Polylines.__super__.constructor.call(this);\n Plural.extend(this);\n this.$log.info(this);\n }\n\n Polylines.prototype.link = function(scope, element, attrs, mapCtrl) {\n return mapCtrl.getScope().deferred.promise.then((function(_this) {\n return function(gMap) {\n if (angular.isUndefined(scope.path) || scope.path === null) {\n _this.$log.warn('polylines: no valid path attribute found');\n }\n if (!scope.models) {\n _this.$log.warn('polylines: no models found to create from');\n }\n return Plural.link(scope, new PolylinesParentModel(scope, element, attrs, gMap, _this.DEFAULTS));\n };\n })(this));\n };\n\n return Polylines;\n\n })(IPolyline);\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapRectangle', [\n 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapIRectangle', 'uiGmapRectangleParentModel', function($log, GmapUtil, IRectangle, RectangleParentModel) {\n return _.extend(IRectangle, {\n link: function(scope, element, attrs, mapCtrl) {\n return mapCtrl.getScope().deferred.promise.then(function(gMap) {\n return new RectangleParentModel(scope, element, attrs, gMap);\n });\n }\n });\n }\n ]);\n\n}).call(this);\n","\n/*global angular:true */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapWindow', [\n 'uiGmapIWindow', 'uiGmapGmapUtil', 'uiGmapWindowChildModel', 'uiGmapLodash', 'uiGmapLogger', function(IWindow, GmapUtil, WindowChildModel, uiGmapLodash, $log) {\n var Window;\n return Window = (function(superClass) {\n extend(Window, superClass);\n\n Window.include(GmapUtil);\n\n function Window() {\n this.link = bind(this.link, this);\n Window.__super__.constructor.call(this);\n this.require = ['^' + 'uiGmapGoogleMap', '^?' + 'uiGmapMarker'];\n this.template = '';\n $log.debug(this);\n this.childWindows = [];\n }\n\n Window.prototype.link = function(scope, element, attrs, ctrls) {\n var markerCtrl, markerScope;\n markerCtrl = ctrls.length > 1 && (ctrls[1] != null) ? ctrls[1] : void 0;\n markerScope = markerCtrl != null ? markerCtrl.getScope() : void 0;\n this.mapPromise = IWindow.mapPromise(scope, ctrls[0]);\n return this.mapPromise.then((function(_this) {\n return function(gMap) {\n var isIconVisibleOnClick;\n isIconVisibleOnClick = true;\n if (angular.isDefined(attrs.isiconvisibleonclick)) {\n isIconVisibleOnClick = scope.isIconVisibleOnClick;\n }\n if (!markerCtrl) {\n _this.init(scope, element, isIconVisibleOnClick, gMap);\n return;\n }\n return markerScope.deferred.promise.then(function(gMarker) {\n return _this.init(scope, element, isIconVisibleOnClick, gMap, markerScope);\n });\n };\n })(this));\n };\n\n Window.prototype.init = function(scope, element, isIconVisibleOnClick, gMap, markerScope) {\n var childWindow, defaults, gMarker, hasScopeCoords, opts;\n defaults = scope.options != null ? scope.options : {};\n hasScopeCoords = (scope != null) && this.validateCoords(scope.coords);\n if ((markerScope != null ? markerScope['getGMarker'] : void 0) != null) {\n gMarker = markerScope.getGMarker();\n }\n opts = hasScopeCoords ? this.createWindowOptions(gMarker, scope, element.html(), defaults) : defaults;\n if (gMap != null) {\n childWindow = new WindowChildModel({\n scope: scope,\n opts: opts,\n isIconVisibleOnClick: isIconVisibleOnClick,\n gMap: gMap,\n markerScope: markerScope,\n element: element\n });\n this.childWindows.push(childWindow);\n scope.$on('$destroy', (function(_this) {\n return function() {\n _this.childWindows = uiGmapLodash.withoutObjects(_this.childWindows, [childWindow], function(child1, child2) {\n return child1.scope.$id === child2.scope.$id;\n });\n return _this.childWindows.length = 0;\n };\n })(this));\n }\n if (scope.control != null) {\n scope.control.getGWindows = (function(_this) {\n return function() {\n return _this.childWindows.map(function(child) {\n return child.gObject;\n });\n };\n })(this);\n scope.control.getChildWindows = (function(_this) {\n return function() {\n return _this.childWindows;\n };\n })(this);\n scope.control.getPlurals = scope.control.getChildWindows;\n scope.control.showWindow = (function(_this) {\n return function() {\n return _this.childWindows.map(function(child) {\n return child.showWindow();\n });\n };\n })(this);\n scope.control.hideWindow = (function(_this) {\n return function() {\n return _this.childWindows.map(function(child) {\n return child.hideWindow();\n });\n };\n })(this);\n }\n if ((this.onChildCreation != null) && (childWindow != null)) {\n return this.onChildCreation(childWindow);\n }\n };\n\n return Window;\n\n })(IWindow);\n }\n ]);\n\n}).call(this);\n","\n/*global angular */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n angular.module('uiGmapgoogle-maps.directives.api').factory('uiGmapWindows', [\n 'uiGmapIWindow', 'uiGmapPlural', 'uiGmapWindowsParentModel', 'uiGmapPromise', 'uiGmapLogger', function(IWindow, Plural, WindowsParentModel, uiGmapPromise, $log) {\n\n /*\n Windows directive where many windows map to the models property\n */\n var Windows;\n return Windows = (function(superClass) {\n extend(Windows, superClass);\n\n function Windows() {\n this.link = bind(this.link, this);\n Windows.__super__.constructor.call(this);\n this.require = ['^' + 'uiGmapGoogleMap', '^?' + 'uiGmapMarkers'];\n this.template = '';\n Plural.extend(this);\n $log.debug(this);\n }\n\n Windows.prototype.link = function(scope, element, attrs, ctrls) {\n var mapScope, markerCtrl, markerScope;\n mapScope = ctrls[0].getScope();\n markerCtrl = ctrls.length > 1 && (ctrls[1] != null) ? ctrls[1] : void 0;\n markerScope = markerCtrl != null ? markerCtrl.getScope() : void 0;\n return mapScope.deferred.promise.then((function(_this) {\n return function(map) {\n var promise, ref;\n promise = (markerScope != null ? (ref = markerScope.deferred) != null ? ref.promise : void 0 : void 0) || uiGmapPromise.resolve();\n return promise.then(function() {\n var pieces, ref1;\n pieces = (ref1 = _this.parentModel) != null ? ref1.existingPieces : void 0;\n if (pieces) {\n return pieces.then(function() {\n return _this.init(scope, element, attrs, ctrls, map, markerScope);\n });\n } else {\n return _this.init(scope, element, attrs, ctrls, map, markerScope);\n }\n });\n };\n })(this));\n };\n\n Windows.prototype.init = function(scope, element, attrs, ctrls, map, additionalScope) {\n var parentModel;\n parentModel = new WindowsParentModel(scope, element, attrs, ctrls, map, additionalScope);\n Plural.link(scope, parentModel);\n if (scope.control != null) {\n scope.control.getGWindows = function() {\n return parentModel.plurals.map(function(child) {\n return child.gObject;\n });\n };\n return scope.control.getChildWindows = function() {\n return parentModel.plurals;\n };\n }\n };\n\n return Windows;\n\n })(IWindow);\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\nNick Baugh - https://github.com/niftylettuce\n */\n\n\n/*globals angular */\n\n(function() {\n angular.module(\"uiGmapgoogle-maps\").directive(\"uiGmapGoogleMap\", ['uiGmapMap', function(uiGmapMap) {\n return new uiGmapMap();\n }]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\n */\n\n\n/*\nMap marker directive\n\nThis directive is used to create a marker on an existing map.\nThis directive creates a new scope.\n\n{attribute coords required} object containing latitude and longitude properties\n{attribute icon optional} string url to image used for marker icon\n{attribute animate optional} if set to false, the marker won't be animated (on by default)\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapMarker', [\n '$timeout', 'uiGmapMarker', function($timeout, Marker) {\n return new Marker($timeout);\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\n */\n\n\n/*\nMap marker directive\n\nThis directive is used to create a marker on an existing map.\nThis directive creates a new scope.\n\n{attribute coords required} object containing latitude and longitude properties\n{attribute icon optional} string url to image used for marker icon\n{attribute animate optional} if set to false, the marker won't be animated (on by default)\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapMarkers', [\n '$timeout', 'uiGmapMarkers', function($timeout, Markers) {\n return new Markers($timeout);\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\nRick Huizinga - https://plus.google.com/+RickHuizinga\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapPolygon', [\n 'uiGmapPolygon', function(Polygon) {\n return new Polygon();\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nJulian Popescu - https://github.com/jpopesculian\nRick Huizinga - https://plus.google.com/+RickHuizinga\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive(\"uiGmapCircle\", [\n \"uiGmapCircle\", function(Circle) {\n return Circle;\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\n */\n\n(function() {\n angular.module(\"uiGmapgoogle-maps\").directive(\"uiGmapPolyline\", [\n \"uiGmapPolyline\", function(Polyline) {\n return new Polyline();\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapPolylines', [\n 'uiGmapPolylines', function(Polylines) {\n return new Polylines();\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\nChentsu Lin - https://github.com/ChenTsuLin\n */\n\n(function() {\n angular.module(\"uiGmapgoogle-maps\").directive(\"uiGmapRectangle\", [\n \"uiGmapLogger\", \"uiGmapRectangle\", function($log, Rectangle) {\n return Rectangle;\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\n */\n\n\n/*\nMap info window directive\n\nThis directive is used to create an info window on an existing map.\nThis directive creates a new scope.\n\n{attribute coords required} object containing latitude and longitude properties\n{attribute show optional} map will show when this expression returns true\n */\n\n(function() {\n angular.module(\"uiGmapgoogle-maps\").directive(\"uiGmapWindow\", [\n \"$timeout\", \"$compile\", \"$http\", \"$templateCache\", \"uiGmapWindow\", function($timeout, $compile, $http, $templateCache, Window) {\n return new Window($timeout, $compile, $http, $templateCache);\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\n */\n\n\n/*\nMap info window directive\n\nThis directive is used to create an info window on an existing map.\nThis directive creates a new scope.\n\n{attribute coords required} object containing latitude and longitude properties\n{attribute show optional} map will show when this expression returns true\n */\n\n(function() {\n angular.module(\"uiGmapgoogle-maps\").directive(\"uiGmapWindows\", [\n \"$timeout\", \"$compile\", \"$http\", \"$templateCache\", \"$interpolate\", \"uiGmapWindows\", function($timeout, $compile, $http, $templateCache, $interpolate, Windows) {\n return new Windows($timeout, $compile, $http, $templateCache, $interpolate);\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors:\n- Nicolas Laplante https://plus.google.com/108189012221374960701\n- Nicholas McCready - https://twitter.com/nmccready\n */\n\n\n/*\nMap Layer directive\n\nThis directive is used to create any type of Layer from the google maps sdk.\nThis directive creates a new scope.\n\n{attribute show optional} true (default) shows the trafficlayer otherwise it is hidden\n */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n angular.module('uiGmapgoogle-maps').directive('uiGmapLayer', [\n '$timeout', 'uiGmapLogger', 'uiGmapLayerParentModel', function($timeout, Logger, LayerParentModel) {\n var Layer;\n Layer = (function() {\n function Layer() {\n this.link = bind(this.link, this);\n this.$log = Logger;\n this.restrict = 'EMA';\n this.require = '^' + 'uiGmapGoogleMap';\n this.priority = -1;\n this.transclude = true;\n this.template = '';\n this.replace = true;\n this.scope = {\n show: '=show',\n type: '=type',\n namespace: '=namespace',\n options: '=options',\n onCreated: '&oncreated'\n };\n }\n\n Layer.prototype.link = function(scope, element, attrs, mapCtrl) {\n return mapCtrl.getScope().deferred.promise.then((function(_this) {\n return function(map) {\n if (scope.onCreated != null) {\n return new LayerParentModel(scope, element, attrs, map, scope.onCreated);\n } else {\n return new LayerParentModel(scope, element, attrs, map);\n }\n };\n })(this));\n };\n\n return Layer;\n\n })();\n return new Layer();\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nAdam Kreitals, kreitals@hotmail.com\n */\n\n\n/*\nmapControl directive\n\nThis directive is used to create a custom control element on an existing map.\nThis directive creates a new scope.\n\n{attribute template required} \tstring url of the template to be used for the control\n{attribute position optional} \tstring position of the control of the form top-left or TOP_LEFT defaults to TOP_CENTER\n{attribute controller optional}\tstring controller to be applied to the template\n{attribute index optional}\t\tnumber index for controlling the order of similarly positioned mapControl elements\n */\n\n(function() {\n angular.module(\"uiGmapgoogle-maps\").directive(\"uiGmapMapControl\", [\n \"uiGmapControl\", function(Control) {\n return new Control();\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicholas McCready - https://twitter.com/nmccready\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapDragZoom', [\n 'uiGmapDragZoom', function(DragZoom) {\n return DragZoom;\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps').directive(\"uiGmapDrawingManager\", [\n \"uiGmapDrawingManager\", function(DrawingManager) {\n return DrawingManager;\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicholas McCready - https://twitter.com/nmccready\n * Brunt of the work is in DrawFreeHandChildModel\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapFreeDrawPolygons', [\n 'uiGmapApiFreeDrawPolygons', function(FreeDrawPolygons) {\n return new FreeDrawPolygons();\n }\n ]);\n\n}).call(this);\n","\n/*\nMap Layer directive\n\nThis directive is used to create any type of Layer from the google maps sdk.\nThis directive creates a new scope.\n\n{attribute show optional} true (default) shows the trafficlayer otherwise it is hidden\n */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n angular.module(\"uiGmapgoogle-maps\").directive(\"uiGmapMapType\", [\n \"$timeout\", \"uiGmapLogger\", \"uiGmapMapTypeParentModel\", function($timeout, Logger, MapTypeParentModel) {\n var MapType;\n MapType = (function() {\n function MapType() {\n this.link = bind(this.link, this);\n this.$log = Logger;\n this.restrict = \"EMA\";\n this.require = '^' + 'uiGmapGoogleMap';\n this.priority = -1;\n this.transclude = true;\n this.template = '';\n this.replace = true;\n this.scope = {\n show: \"=show\",\n options: '=options',\n refresh: '=refresh',\n id: '@'\n };\n }\n\n MapType.prototype.link = function(scope, element, attrs, mapCtrl) {\n return mapCtrl.getScope().deferred.promise.then((function(_this) {\n return function(map) {\n return new MapTypeParentModel(scope, element, attrs, map);\n };\n })(this));\n };\n\n return MapType;\n\n })();\n return new MapType();\n }\n ]);\n\n}).call(this);\n","\n/*\nMap Layers directive\n\nThis directive is used to create any type of Layer from the google maps sdk.\nThis directive creates a new scope.\n */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n angular.module('uiGmapgoogle-maps').directive(\"uiGmapMapTypes\", [\n \"$timeout\", \"uiGmapLogger\", \"uiGmapMapTypesParentModel\", function($timeout, Logger, MapTypesParentModel) {\n var MapTypes;\n MapTypes = (function() {\n function MapTypes() {\n this.link = bind(this.link, this);\n this.$log = Logger;\n this.restrict = \"EMA\";\n this.require = '^' + 'uiGmapGoogleMap';\n this.priority = -1;\n this.transclude = true;\n this.template = '';\n this.scope = {\n mapTypes: \"=mapTypes\",\n show: \"=show\",\n options: \"=options\",\n refresh: \"=refresh\",\n id: \"=idKey\"\n };\n }\n\n MapTypes.prototype.link = function(scope, element, attrs, mapCtrl) {\n return mapCtrl.getScope().deferred.promise.then((function(_this) {\n return function(map) {\n return new MapTypesParentModel(scope, element, attrs, map);\n };\n })(this));\n };\n\n return MapTypes;\n\n })();\n return new MapTypes();\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors\nNicolas Laplante - https://plus.google.com/108189012221374960701\nNicholas McCready - https://twitter.com/nmccready\nRick Huizinga - https://plus.google.com/+RickHuizinga\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapPolygons', [\n 'uiGmapPolygons', function(Polygons) {\n return new Polygons();\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors:\n- Nicolas Laplante https://plus.google.com/108189012221374960701\n- Nicholas McCready - https://twitter.com/nmccready\n- Carrie Kengle - http://about.me/carrie\n */\n\n\n/*\nPlaces Search Box directive\n\nThis directive is used to create a Places Search Box.\nThis directive creates a new scope.\n\n{attribute input required} HTMLInputElement\n{attribute options optional} The options that can be set on a SearchBox object (google.maps.places.SearchBoxOptions object specification)\n */\n\n(function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n angular.module('uiGmapgoogle-maps').directive('uiGmapSearchBox', [\n 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapSearchBoxParentModel', '$http', '$templateCache', '$compile', function(GoogleMapApi, Logger, SearchBoxParentModel, $http, $templateCache, $compile) {\n var SearchBox;\n SearchBox = (function() {\n SearchBox.prototype.require = 'ngModel';\n\n function SearchBox() {\n this.link = bind(this.link, this);\n this.$log = Logger;\n this.restrict = 'EMA';\n this.require = '^' + 'uiGmapGoogleMap';\n this.priority = -1;\n this.transclude = true;\n this.template = '';\n this.replace = true;\n this.scope = {\n template: '=template',\n events: '=events',\n position: '=?position',\n options: '=?options',\n parentdiv: '=?parentdiv',\n ngModel: \"=?\"\n };\n }\n\n SearchBox.prototype.link = function(scope, element, attrs, mapCtrl) {\n return GoogleMapApi.then((function(_this) {\n return function(maps) {\n if (scope.template == null) {\n $templateCache.put('uigmap-searchbox-default.tpl.html', '');\n scope.template = 'uigmap-searchbox-default.tpl.html';\n }\n return $http.get(scope.template, {\n cache: $templateCache\n }).then(function(arg) {\n var data;\n data = arg.data;\n if (angular.isUndefined(scope.events)) {\n _this.$log.error('searchBox: the events property is required');\n return;\n }\n return mapCtrl.getScope().deferred.promise.then(function(map) {\n var ctrlPosition;\n ctrlPosition = angular.isDefined(scope.position) ? scope.position.toUpperCase().replace(/-/g, '_') : 'TOP_LEFT';\n if (!maps.ControlPosition[ctrlPosition]) {\n _this.$log.error('searchBox: invalid position property');\n return;\n }\n return new SearchBoxParentModel(scope, element, attrs, map, ctrlPosition, $compile(data)(scope));\n });\n });\n };\n })(this));\n };\n\n return SearchBox;\n\n })();\n return new SearchBox();\n }\n ]);\n\n}).call(this);\n","(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapShow', [\n '$animate', 'uiGmapLogger', function($animate, $log) {\n return {\n scope: {\n 'uiGmapShow': '=',\n 'uiGmapAfterShow': '&',\n 'uiGmapAfterHide': '&'\n },\n link: function(scope, element) {\n var angular_post_1_3_handle, angular_pre_1_3_handle, handle;\n angular_post_1_3_handle = function(animateAction, cb) {\n return $animate[animateAction](element, 'ng-hide').then(function() {\n return cb();\n });\n };\n angular_pre_1_3_handle = function(animateAction, cb) {\n return $animate[animateAction](element, 'ng-hide', cb);\n };\n handle = function(animateAction, cb) {\n if (angular.version.major > 1) {\n return $log.error(\"uiGmapShow is not supported for Angular Major greater than 1.\\nYour Major is \" + angular.version.major + \"\\\"\");\n }\n if (angular.version.major === 1 && angular.version.minor < 3) {\n return angular_pre_1_3_handle(animateAction, cb);\n }\n return angular_post_1_3_handle(animateAction, cb);\n };\n return scope.$watch('uiGmapShow', function(show) {\n if (show) {\n handle('removeClass', scope.uiGmapAfterShow);\n }\n if (!show) {\n return handle('addClass', scope.uiGmapAfterHide);\n }\n });\n }\n };\n }\n ]);\n\n}).call(this);\n","\n/*\n@authors:\n- Nicholas McCready - https://twitter.com/nmccready\n */\n\n\n/*\nStreetViewPanorama Directive to care of basic initialization of StreetViewPanorama\n */\n\n(function() {\n angular.module('uiGmapgoogle-maps').directive('uiGmapStreetViewPanorama', [\n 'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function(GoogleMapApi, $log, GmapUtil, EventsHelper) {\n var name;\n name = 'uiGmapStreetViewPanorama';\n return {\n restrict: 'EMA',\n template: '
',\n replace: true,\n scope: {\n focalcoord: '=',\n radius: '=?',\n events: '=?',\n options: '=?',\n control: '=?',\n povoptions: '=?',\n imagestatus: '='\n },\n link: function(scope, element, attrs) {\n return GoogleMapApi.then((function(_this) {\n return function(maps) {\n var clean, create, didCreateOptionsFromDirective, firstTime, handleSettings, listeners, opts, pano, povOpts, sv;\n pano = void 0;\n sv = void 0;\n didCreateOptionsFromDirective = false;\n listeners = void 0;\n opts = null;\n povOpts = null;\n clean = function() {\n EventsHelper.removeEvents(listeners);\n if (pano != null) {\n pano.unbind('position');\n pano.setVisible(false);\n }\n if (sv != null) {\n if ((sv != null ? sv.setVisible : void 0) != null) {\n sv.setVisible(false);\n }\n return sv = void 0;\n }\n };\n handleSettings = function(perspectivePoint, focalPoint) {\n var heading;\n heading = google.maps.geometry.spherical.computeHeading(perspectivePoint, focalPoint);\n didCreateOptionsFromDirective = true;\n scope.radius = scope.radius || 50;\n povOpts = angular.extend({\n heading: heading,\n zoom: 1,\n pitch: 0\n }, scope.povoptions || {});\n opts = opts = angular.extend({\n navigationControl: false,\n addressControl: false,\n linksControl: false,\n position: perspectivePoint,\n pov: povOpts,\n visible: true\n }, scope.options || {});\n return didCreateOptionsFromDirective = false;\n };\n create = function() {\n var focalPoint;\n if (!scope.focalcoord) {\n $log.error(name + \": focalCoord needs to be defined\");\n return;\n }\n if (!scope.radius) {\n $log.error(name + \": needs a radius to set the camera view from its focal target.\");\n return;\n }\n clean();\n if (sv == null) {\n sv = new google.maps.StreetViewService();\n }\n if (scope.events) {\n listeners = EventsHelper.setEvents(sv, scope, scope);\n }\n focalPoint = GmapUtil.getCoords(scope.focalcoord);\n return sv.getPanoramaByLocation(focalPoint, scope.radius, function(streetViewPanoramaData, status) {\n var ele, perspectivePoint, ref;\n if (scope.imagestatus != null) {\n scope.imagestatus = status;\n }\n if (((ref = scope.events) != null ? ref.image_status_changed : void 0) != null) {\n scope.events.image_status_changed(sv, 'image_status_changed', scope, status);\n }\n if (status === \"OK\") {\n perspectivePoint = streetViewPanoramaData.location.latLng;\n handleSettings(perspectivePoint, focalPoint);\n ele = element[0];\n return pano = new google.maps.StreetViewPanorama(ele, opts);\n }\n });\n };\n if (scope.control != null) {\n scope.control.getOptions = function() {\n return opts;\n };\n scope.control.getPovOptions = function() {\n return povOpts;\n };\n scope.control.getGObject = function() {\n return sv;\n };\n scope.control.getGPano = function() {\n return pano;\n };\n }\n scope.$watch('options', function(newValue, oldValue) {\n if (newValue === oldValue || newValue === opts || didCreateOptionsFromDirective) {\n return;\n }\n return create();\n });\n firstTime = true;\n scope.$watch('focalcoord', function(newValue, oldValue) {\n if (newValue === oldValue && !firstTime) {\n return;\n }\n if (newValue == null) {\n return;\n }\n firstTime = false;\n return create();\n });\n return scope.$on('$destroy', function() {\n return clean();\n });\n };\n })(this));\n }\n };\n }\n ]);\n\n}).call(this);\n","angular.module('uiGmapgoogle-maps.wrapped')\n.service('uiGmapuuid', function() {\n //BEGIN REPLACE\n /* istanbul ignore next */\n /*\n Version: core-1.0\n The MIT License: Copyright (c) 2012 LiosK.\n*/\nfunction UUID(){}UUID.generate=function(){var a=UUID._gri,b=UUID._ha;return b(a(32),8)+\"-\"+b(a(16),4)+\"-\"+b(16384|a(12),4)+\"-\"+b(32768|a(14),4)+\"-\"+b(a(48),12)};UUID._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)d&1&&(c=e+c);return c};\n\n //END REPLACE\nreturn UUID;\n});\n","// wrap the utility libraries needed in ./lib\n// http://google-maps-utility-library-v3.googlecode.com/svn/\nangular.module('uiGmapgoogle-maps.wrapped')\n.service('uiGmapGoogleMapsUtilV3', function () {\n return {\n init: _.once(function () {\n //BEGIN REPLACE\n /* istanbul ignore next */\n +function(){\n function ClusterIcon(cluster,styles){cluster.getMarkerClusterer().extend(ClusterIcon,google.maps.OverlayView),this.cluster_=cluster,this.className_=cluster.getMarkerClusterer().getClusterClass(),this.styles_=styles,this.center_=null,this.div_=null,this.sums_=null,this.visible_=!1,this.setMap(cluster.getMap())}function Cluster(mc){this.markerClusterer_=mc,this.map_=mc.getMap(),this.gridSize_=mc.getGridSize(),this.minClusterSize_=mc.getMinimumClusterSize(),this.averageCenter_=mc.getAverageCenter(),this.hideLabel_=mc.getHideLabel(),this.markers_=[],this.center_=null,this.bounds_=null,this.clusterIcon_=new ClusterIcon(this,mc.getStyles())}function MarkerClusterer(map,opt_markers,opt_options){this.extend(MarkerClusterer,google.maps.OverlayView),opt_markers=opt_markers||[],opt_options=opt_options||{},this.markers_=[],this.clusters_=[],this.listeners_=[],this.activeMap_=null,this.ready_=!1,this.gridSize_=opt_options.gridSize||60,this.minClusterSize_=opt_options.minimumClusterSize||2,this.maxZoom_=opt_options.maxZoom||null,this.styles_=opt_options.styles||[],this.title_=opt_options.title||\"\",this.zoomOnClick_=!0,void 0!==opt_options.zoomOnClick&&(this.zoomOnClick_=opt_options.zoomOnClick),this.averageCenter_=!1,void 0!==opt_options.averageCenter&&(this.averageCenter_=opt_options.averageCenter),this.ignoreHidden_=!1,void 0!==opt_options.ignoreHidden&&(this.ignoreHidden_=opt_options.ignoreHidden),this.enableRetinaIcons_=!1,void 0!==opt_options.enableRetinaIcons&&(this.enableRetinaIcons_=opt_options.enableRetinaIcons),this.hideLabel_=!1,void 0!==opt_options.hideLabel&&(this.hideLabel_=opt_options.hideLabel),this.imagePath_=opt_options.imagePath||MarkerClusterer.IMAGE_PATH,this.imageExtension_=opt_options.imageExtension||MarkerClusterer.IMAGE_EXTENSION,this.imageSizes_=opt_options.imageSizes||MarkerClusterer.IMAGE_SIZES,this.calculator_=opt_options.calculator||MarkerClusterer.CALCULATOR,this.batchSize_=opt_options.batchSize||MarkerClusterer.BATCH_SIZE,this.batchSizeIE_=opt_options.batchSizeIE||MarkerClusterer.BATCH_SIZE_IE,this.clusterClass_=opt_options.clusterClass||\"cluster\",-1!==navigator.userAgent.toLowerCase().indexOf(\"msie\")&&(this.batchSize_=this.batchSizeIE_),this.setupStyles_(),this.addMarkers(opt_markers,!0),this.setMap(map)}ClusterIcon.prototype.onAdd=function(){var cMouseDownInCluster,cDraggingMapByCluster,cClusterIcon=this;this.div_=document.createElement(\"div\"),this.div_.className=this.className_,this.visible_&&this.show(),this.getPanes().overlayMouseTarget.appendChild(this.div_),this.boundsChangedListener_=google.maps.event.addListener(this.getMap(),\"bounds_changed\",function(){cDraggingMapByCluster=cMouseDownInCluster}),google.maps.event.addDomListener(this.div_,\"mousedown\",function(){cMouseDownInCluster=!0,cDraggingMapByCluster=!1}),google.maps.event.addDomListener(this.div_,\"click\",function(e){if(cMouseDownInCluster=!1,!cDraggingMapByCluster){var theBounds,mz,mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,\"click\",cClusterIcon.cluster_),google.maps.event.trigger(mc,\"clusterclick\",cClusterIcon.cluster_),mc.getZoomOnClick()&&(mz=mc.getMaxZoom(),theBounds=cClusterIcon.cluster_.getBounds(),mc.getMap().fitBounds(theBounds),setTimeout(function(){mc.getMap().fitBounds(theBounds),null!==mz&&mc.getMap().getZoom()>mz&&mc.getMap().setZoom(mz+1)},100)),e.cancelBubble=!0,e.stopPropagation&&e.stopPropagation()}}),google.maps.event.addDomListener(this.div_,\"mouseover\",function(){var mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,\"mouseover\",cClusterIcon.cluster_)}),google.maps.event.addDomListener(this.div_,\"mouseout\",function(){var mc=cClusterIcon.cluster_.getMarkerClusterer();google.maps.event.trigger(mc,\"mouseout\",cClusterIcon.cluster_)})},ClusterIcon.prototype.onRemove=function(){this.div_&&this.div_.parentNode&&(this.hide(),google.maps.event.removeListener(this.boundsChangedListener_),google.maps.event.clearInstanceListeners(this.div_),this.div_.parentNode.removeChild(this.div_),this.div_=null)},ClusterIcon.prototype.draw=function(){if(this.visible_){var pos=this.getPosFromLatLng_(this.center_);this.div_.style.top=pos.y+\"px\",this.div_.style.left=pos.x+\"px\"}},ClusterIcon.prototype.hide=function(){this.div_&&(this.div_.style.display=\"none\"),this.visible_=!1},ClusterIcon.prototype.show=function(){if(this.div_){var img=\"\",bp=this.backgroundPosition_.split(\" \"),spriteH=parseInt(bp[0].trim(),10),spriteV=parseInt(bp[1].trim(),10),pos=this.getPosFromLatLng_(this.center_);this.div_.style.cssText=this.createCss(pos),img=\"\",this.div_.innerHTML=img+\"
\"+(this.cluster_.hideLabel_?\" \":this.sums_.text)+\"
\",this.div_.title=\"undefined\"==typeof this.sums_.title||\"\"===this.sums_.title?this.cluster_.getMarkerClusterer().getTitle():this.sums_.title,this.div_.style.display=\"\"}this.visible_=!0},ClusterIcon.prototype.useStyle=function(sums){this.sums_=sums;var index=Math.max(0,sums.index-1);index=Math.min(this.styles_.length-1,index);var style=this.styles_[index];this.url_=style.url,this.height_=style.height,this.width_=style.width,this.anchorText_=style.anchorText||[0,0],this.anchorIcon_=style.anchorIcon||[parseInt(this.height_/2,10),parseInt(this.width_/2,10)],this.textColor_=style.textColor||\"black\",this.textSize_=style.textSize||11,this.textDecoration_=style.textDecoration||\"none\",this.fontWeight_=style.fontWeight||\"bold\",this.fontStyle_=style.fontStyle||\"normal\",this.fontFamily_=style.fontFamily||\"Arial,sans-serif\",this.backgroundPosition_=style.backgroundPosition||\"0 0\"},ClusterIcon.prototype.setCenter=function(center){this.center_=center},ClusterIcon.prototype.createCss=function(pos){var style=[];return style.push(\"cursor: pointer;\"),style.push(\"position: absolute; top: \"+pos.y+\"px; left: \"+pos.x+\"px;\"),style.push(\"width: \"+this.width_+\"px; height: \"+this.height_+\"px;\"),style.join(\"\")},ClusterIcon.prototype.getPosFromLatLng_=function(latlng){var pos=this.getProjection().fromLatLngToDivPixel(latlng);return pos.x-=this.anchorIcon_[1],pos.y-=this.anchorIcon_[0],pos.x=parseInt(pos.x,10),pos.y=parseInt(pos.y,10),pos},Cluster.prototype.getSize=function(){return this.markers_.length},Cluster.prototype.getMarkers=function(){return this.markers_},Cluster.prototype.getCenter=function(){return this.center_},Cluster.prototype.getMap=function(){return this.map_},Cluster.prototype.getMarkerClusterer=function(){return this.markerClusterer_},Cluster.prototype.getBounds=function(){var i,bounds=new google.maps.LatLngBounds(this.center_,this.center_),markers=this.getMarkers();for(i=0;imz)marker.getMap()!==this.map_&&marker.setMap(this.map_);else if(mCounti;i++)this.markers_[i].setMap(null);else marker.setMap(null);return!0},Cluster.prototype.isMarkerInClusterBounds=function(marker){return this.bounds_.contains(marker.getPosition())},Cluster.prototype.calculateBounds_=function(){var bounds=new google.maps.LatLngBounds(this.center_,this.center_);this.bounds_=this.markerClusterer_.getExtendedBounds(bounds)},Cluster.prototype.updateIcon_=function(){var mCount=this.markers_.length,mz=this.markerClusterer_.getMaxZoom();if(null!==mz&&this.map_.getZoom()>mz)return void this.clusterIcon_.hide();if(mCounti;i++)if(marker===this.markers_[i])return!0;return!1},MarkerClusterer.prototype.onAdd=function(){var cMarkerClusterer=this;this.activeMap_=this.getMap(),this.ready_=!0,this.repaint(),this.listeners_=[google.maps.event.addListener(this.getMap(),\"zoom_changed\",function(){cMarkerClusterer.resetViewport_(!1),(this.getZoom()===(this.get(\"minZoom\")||0)||this.getZoom()===this.get(\"maxZoom\"))&&google.maps.event.trigger(this,\"idle\")}),google.maps.event.addListener(this.getMap(),\"idle\",function(){cMarkerClusterer.redraw_()})]},MarkerClusterer.prototype.onRemove=function(){var i;for(i=0;i0))for(i=0;id&&(distance=d,clusterToAddTo=cluster));clusterToAddTo&&clusterToAddTo.isMarkerInClusterBounds(marker)?clusterToAddTo.addMarker(marker):(cluster=new Cluster(this),cluster.addMarker(marker),this.clusters_.push(cluster))},MarkerClusterer.prototype.createClusters_=function(iFirst){var i,marker,mapBounds,cMarkerClusterer=this;if(this.ready_){0===iFirst&&(google.maps.event.trigger(this,\"clusteringbegin\",this),\"undefined\"!=typeof this.timerRefStatic&&(clearTimeout(this.timerRefStatic),delete this.timerRefStatic)),mapBounds=this.getMap().getZoom()>3?new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),this.getMap().getBounds().getNorthEast()):new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,-178.48388434375),new google.maps.LatLng(-85.08136444384544,178.00048865625));var bounds=this.getExtendedBounds(mapBounds),iLast=Math.min(iFirst+this.batchSize_,this.markers_.length);for(i=iFirst;iLast>i;i++)marker=this.markers_[i],!marker.isAdded&&this.isMarkerInBounds_(marker,bounds)&&(!this.ignoreHidden_||this.ignoreHidden_&&marker.getVisible())&&this.addToClosestCluster_(marker);if(iLastOverlayView class.\n *

\n * An InfoBox behaves like a google.maps.InfoWindow, but it supports several\n * additional properties for advanced styling. An InfoBox can also be used as a map label.\n *

\n * An InfoBox also fires the same events as a google.maps.InfoWindow.\n */\n\n/*jslint browser:true */\n/*global google */\n\n/**\n * @name InfoBoxOptions\n * @class This class represents the optional parameter passed to the {@link InfoBox} constructor.\n * @property {string|Node} content The content of the InfoBox (plain text or an HTML DOM node).\n * @property {boolean} [disableAutoPan=false] Disable auto-pan on open.\n * @property {number} maxWidth The maximum width (in pixels) of the InfoBox. Set to 0 if no maximum.\n * @property {Size} pixelOffset The offset (in pixels) from the top left corner of the InfoBox\n * (or the bottom left corner if the alignBottom property is true)\n * to the map pixel corresponding to position.\n * @property {LatLng} position The geographic location at which to display the InfoBox.\n * @property {number} zIndex The CSS z-index style value for the InfoBox.\n * Note: This value overrides a zIndex setting specified in the boxStyle property.\n * @property {string} [boxClass=\"infoBox\"] The name of the CSS class defining the styles for the InfoBox container.\n * @property {Object} [boxStyle] An object literal whose properties define specific CSS\n * style values to be applied to the InfoBox. Style values defined here override those that may\n * be defined in the boxClass style sheet. If this property is changed after the\n * InfoBox has been created, all previously set styles (except those defined in the style sheet)\n * are removed from the InfoBox before the new style values are applied.\n * @property {string} closeBoxMargin The CSS margin style value for the close box.\n * The default is \"2px\" (a 2-pixel margin on all sides).\n * @property {string} closeBoxURL The URL of the image representing the close box.\n * Note: The default is the URL for Google's standard close box.\n * Set this property to \"\" if no close box is required.\n * @property {Size} infoBoxClearance Minimum offset (in pixels) from the InfoBox to the\n * map edge after an auto-pan.\n * @property {boolean} [isHidden=false] Hide the InfoBox on open.\n * [Deprecated in favor of the visible property.]\n * @property {boolean} [visible=true] Show the InfoBox on open.\n * @property {boolean} alignBottom Align the bottom left corner of the InfoBox to the position\n * location (default is false which means that the top left corner of the InfoBox is aligned).\n * @property {string} pane The pane where the InfoBox is to appear (default is \"floatPane\").\n * Set the pane to \"mapPane\" if the InfoBox is being used as a map label.\n * Valid pane names are the property names for the google.maps.MapPanes object.\n * @property {boolean} enableEventPropagation Propagate mousedown, mousemove, mouseover, mouseout,\n * mouseup, click, dblclick, touchstart, touchend, touchmove, and contextmenu events in the InfoBox\n * (default is false to mimic the behavior of a google.maps.InfoWindow). Set\n * this property to true if the InfoBox is being used as a map label.\n */\n\n/**\n * Creates an InfoBox with the options specified in {@link InfoBoxOptions}.\n * Call InfoBox.open to add the box to the map.\n * @constructor\n * @param {InfoBoxOptions} [opt_opts]\n */\nfunction InfoBox(opt_opts) {\n\n opt_opts = opt_opts || {};\n\n google.maps.OverlayView.apply(this, arguments);\n\n // Standard options (in common with google.maps.InfoWindow):\n //\n this.content_ = opt_opts.content || \"\";\n this.disableAutoPan_ = opt_opts.disableAutoPan || false;\n this.maxWidth_ = opt_opts.maxWidth || 0;\n this.pixelOffset_ = opt_opts.pixelOffset || new google.maps.Size(0, 0);\n this.position_ = opt_opts.position || new google.maps.LatLng(0, 0);\n this.zIndex_ = opt_opts.zIndex || null;\n\n // Additional options (unique to InfoBox):\n //\n this.boxClass_ = opt_opts.boxClass || \"infoBox\";\n this.boxStyle_ = opt_opts.boxStyle || {};\n this.closeBoxMargin_ = opt_opts.closeBoxMargin || \"2px\";\n this.closeBoxURL_ = opt_opts.closeBoxURL || \"http://www.google.com/intl/en_us/mapfiles/close.gif/";\n if (opt_opts.closeBoxURL === \"\") {\n this.closeBoxURL_ = \"\";\n }\n this.infoBoxClearance_ = opt_opts.infoBoxClearance || new google.maps.Size(1, 1);\n\n if (typeof opt_opts.visible === \"undefined\") {\n if (typeof opt_opts.isHidden === \"undefined\") {\n opt_opts.visible = true;\n } else {\n opt_opts.visible = !opt_opts.isHidden;\n }\n }\n this.isHidden_ = !opt_opts.visible;\n\n this.alignBottom_ = opt_opts.alignBottom || false;\n this.pane_ = opt_opts.pane || \"floatPane\";\n this.enableEventPropagation_ = opt_opts.enableEventPropagation || false;\n\n this.div_ = null;\n this.closeListener_ = null;\n this.moveListener_ = null;\n this.contextListener_ = null;\n this.eventListeners_ = null;\n this.fixedWidthSet_ = null;\n}\n\n/* InfoBox extends OverlayView in the Google Maps API v3.\n */\nInfoBox.prototype = new google.maps.OverlayView();\n\n/**\n * Creates the DIV representing the InfoBox.\n * @private\n */\nInfoBox.prototype.createInfoBoxDiv_ = function () {\n\n var i;\n var events;\n var bw;\n var me = this;\n\n // This handler prevents an event in the InfoBox from being passed on to the map.\n //\n var cancelHandler = function (e) {\n e.cancelBubble = true;\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n };\n\n // This handler ignores the current event in the InfoBox and conditionally prevents\n // the event from being passed on to the map. It is used for the contextmenu event.\n //\n var ignoreHandler = function (e) {\n\n e.returnValue = false;\n\n if (e.preventDefault) {\n\n e.preventDefault();\n }\n\n if (!me.enableEventPropagation_) {\n\n cancelHandler(e);\n }\n };\n\n if (!this.div_) {\n\n this.div_ = document.createElement(\"div\");\n\n this.setBoxStyle_();\n\n if (typeof this.content_.nodeType === \"undefined\") {\n this.div_.innerHTML = this.getCloseBoxImg_() + this.content_;\n } else {\n this.div_.innerHTML = this.getCloseBoxImg_();\n this.div_.appendChild(this.content_);\n }\n\n // Add the InfoBox DIV to the DOM\n this.getPanes()[this.pane_].appendChild(this.div_);\n\n this.addClickHandler_();\n\n if (this.div_.style.width) {\n\n this.fixedWidthSet_ = true;\n\n } else {\n\n if (this.maxWidth_ !== 0 && this.div_.offsetWidth > this.maxWidth_) {\n\n this.div_.style.width = this.maxWidth_;\n this.div_.style.overflow = \"auto\";\n this.fixedWidthSet_ = true;\n\n } else { // The following code is needed to overcome problems with MSIE\n\n bw = this.getBoxWidths_();\n\n this.div_.style.width = (this.div_.offsetWidth - bw.left - bw.right) + \"px\";\n this.fixedWidthSet_ = false;\n }\n }\n\n this.panBox_(this.disableAutoPan_);\n\n if (!this.enableEventPropagation_) {\n\n this.eventListeners_ = [];\n\n // Cancel event propagation.\n //\n // Note: mousemove not included (to resolve Issue 152)\n events = [\"mousedown\", \"mouseover\", \"mouseout\", \"mouseup\",\n \"click\", \"dblclick\", \"touchstart\", \"touchend\", \"touchmove\"];\n\n for (i = 0; i < events.length; i++) {\n\n this.eventListeners_.push(google.maps.event.addDomListener(this.div_, events[i], cancelHandler));\n }\n\n // Workaround for Google bug that causes the cursor to change to a pointer\n // when the mouse moves over a marker underneath InfoBox.\n this.eventListeners_.push(google.maps.event.addDomListener(this.div_, \"mouseover\", function (e) {\n this.style.cursor = \"default\";\n }));\n }\n\n this.contextListener_ = google.maps.event.addDomListener(this.div_, \"contextmenu\", ignoreHandler);\n\n /**\n * This event is fired when the DIV containing the InfoBox's content is attached to the DOM.\n * @name InfoBox#domready\n * @event\n */\n google.maps.event.trigger(this, \"domready\");\n }\n};\n\n/**\n * Returns the HTML tag for the close box.\n * @private\n */\nInfoBox.prototype.getCloseBoxImg_ = function () {\n\n var img = \"\";\n\n if (this.closeBoxURL_ !== \"\") {\n\n img = \"\";\n }\n\n return img;\n};\n\n/**\n * Adds the click handler to the InfoBox close box.\n * @private\n */\nInfoBox.prototype.addClickHandler_ = function () {\n\n var closeBox;\n\n if (this.closeBoxURL_ !== \"\") {\n\n closeBox = this.div_.firstChild;\n this.closeListener_ = google.maps.event.addDomListener(closeBox, \"click\", this.getCloseClickHandler_());\n\n } else {\n\n this.closeListener_ = null;\n }\n};\n\n/**\n * Returns the function to call when the user clicks the close box of an InfoBox.\n * @private\n */\nInfoBox.prototype.getCloseClickHandler_ = function () {\n\n var me = this;\n\n return function (e) {\n\n // 1.0.3 fix: Always prevent propagation of a close box click to the map:\n e.cancelBubble = true;\n\n if (e.stopPropagation) {\n\n e.stopPropagation();\n }\n\n /**\n * This event is fired when the InfoBox's close box is clicked.\n * @name InfoBox#closeclick\n * @event\n */\n google.maps.event.trigger(me, \"closeclick\");\n\n me.close();\n };\n};\n\n/**\n * Pans the map so that the InfoBox appears entirely within the map's visible area.\n * @private\n */\nInfoBox.prototype.panBox_ = function (disablePan) {\n\n var map;\n var bounds;\n var xOffset = 0, yOffset = 0;\n\n if (!disablePan) {\n\n map = this.getMap();\n\n if (map instanceof google.maps.Map) { // Only pan if attached to map, not panorama\n\n if (!map.getBounds().contains(this.position_)) {\n // Marker not in visible area of map, so set center\n // of map to the marker position first.\n map.setCenter(this.position_);\n }\n\n bounds = map.getBounds();\n\n var mapDiv = map.getDiv();\n var mapWidth = mapDiv.offsetWidth;\n var mapHeight = mapDiv.offsetHeight;\n var iwOffsetX = this.pixelOffset_.width;\n var iwOffsetY = this.pixelOffset_.height;\n var iwWidth = this.div_.offsetWidth;\n var iwHeight = this.div_.offsetHeight;\n var padX = this.infoBoxClearance_.width;\n var padY = this.infoBoxClearance_.height;\n var pixPosition = this.getProjection().fromLatLngToContainerPixel(this.position_);\n\n if (pixPosition.x < (-iwOffsetX + padX)) {\n xOffset = pixPosition.x + iwOffsetX - padX;\n } else if ((pixPosition.x + iwWidth + iwOffsetX + padX) > mapWidth) {\n xOffset = pixPosition.x + iwWidth + iwOffsetX + padX - mapWidth;\n }\n if (this.alignBottom_) {\n if (pixPosition.y < (-iwOffsetY + padY + iwHeight)) {\n yOffset = pixPosition.y + iwOffsetY - padY - iwHeight;\n } else if ((pixPosition.y + iwOffsetY + padY) > mapHeight) {\n yOffset = pixPosition.y + iwOffsetY + padY - mapHeight;\n }\n } else {\n if (pixPosition.y < (-iwOffsetY + padY)) {\n yOffset = pixPosition.y + iwOffsetY - padY;\n } else if ((pixPosition.y + iwHeight + iwOffsetY + padY) > mapHeight) {\n yOffset = pixPosition.y + iwHeight + iwOffsetY + padY - mapHeight;\n }\n }\n\n if (!(xOffset === 0 && yOffset === 0)) {\n\n // Move the map to the shifted center.\n //\n var c = map.getCenter();\n map.panBy(xOffset, yOffset);\n }\n }\n }\n};\n\n/**\n * Sets the style of the InfoBox by setting the style sheet and applying\n * other specific styles requested.\n * @private\n */\nInfoBox.prototype.setBoxStyle_ = function () {\n\n var i, boxStyle;\n\n if (this.div_) {\n\n // Apply style values from the style sheet defined in the boxClass parameter:\n this.div_.className = this.boxClass_;\n\n // Clear existing inline style values:\n this.div_.style.cssText = \"\";\n\n // Apply style values defined in the boxStyle parameter:\n boxStyle = this.boxStyle_;\n for (i in boxStyle) {\n\n if (boxStyle.hasOwnProperty(i)) {\n\n this.div_.style[i] = boxStyle[i];\n }\n }\n\n // Fix for iOS disappearing InfoBox problem.\n // See http://stackoverflow.com/questions/9229535/google-maps-markers-disappear-at-certain-zoom-level-only-on-iphone-ipad\n this.div_.style.WebkitTransform = \"translateZ(0)\";\n\n // Fix up opacity style for benefit of MSIE:\n //\n if (typeof this.div_.style.opacity !== \"undefined\" && this.div_.style.opacity !== \"\") {\n // See http://www.quirksmode.org/css/opacity.html\n this.div_.style.MsFilter = \"\\\"progid:DXImageTransform.Microsoft.Alpha(Opacity=\" + (this.div_.style.opacity * 100) + \")\\\"\";\n this.div_.style.filter = \"alpha(opacity=\" + (this.div_.style.opacity * 100) + \")\";\n }\n\n // Apply required styles:\n //\n this.div_.style.position = \"absolute\";\n this.div_.style.visibility = 'hidden';\n if (this.zIndex_ !== null) {\n\n this.div_.style.zIndex = this.zIndex_;\n }\n }\n};\n\n/**\n * Get the widths of the borders of the InfoBox.\n * @private\n * @return {Object} widths object (top, bottom left, right)\n */\nInfoBox.prototype.getBoxWidths_ = function () {\n\n var computedStyle;\n var bw = {top: 0, bottom: 0, left: 0, right: 0};\n var box = this.div_;\n\n if (document.defaultView && document.defaultView.getComputedStyle) {\n\n computedStyle = box.ownerDocument.defaultView.getComputedStyle(box, \"\");\n\n if (computedStyle) {\n\n // The computed styles are always in pixel units (good!)\n bw.top = parseInt(computedStyle.borderTopWidth, 10) || 0;\n bw.bottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;\n bw.left = parseInt(computedStyle.borderLeftWidth, 10) || 0;\n bw.right = parseInt(computedStyle.borderRightWidth, 10) || 0;\n }\n\n } else if (document.documentElement.currentStyle) { // MSIE\n\n if (box.currentStyle) {\n\n // The current styles may not be in pixel units, but assume they are (bad!)\n bw.top = parseInt(box.currentStyle.borderTopWidth, 10) || 0;\n bw.bottom = parseInt(box.currentStyle.borderBottomWidth, 10) || 0;\n bw.left = parseInt(box.currentStyle.borderLeftWidth, 10) || 0;\n bw.right = parseInt(box.currentStyle.borderRightWidth, 10) || 0;\n }\n }\n\n return bw;\n};\n\n/**\n * Invoked when close is called. Do not call it directly.\n */\nInfoBox.prototype.onRemove = function () {\n\n if (this.div_) {\n\n this.div_.parentNode.removeChild(this.div_);\n this.div_ = null;\n }\n};\n\n/**\n * Draws the InfoBox based on the current map projection and zoom level.\n */\nInfoBox.prototype.draw = function () {\n\n this.createInfoBoxDiv_();\n\n var pixPosition = this.getProjection().fromLatLngToDivPixel(this.position_);\n\n this.div_.style.left = (pixPosition.x + this.pixelOffset_.width) + \"px\";\n\n if (this.alignBottom_) {\n this.div_.style.bottom = -(pixPosition.y + this.pixelOffset_.height) + \"px\";\n } else {\n this.div_.style.top = (pixPosition.y + this.pixelOffset_.height) + \"px\";\n }\n\n if (this.isHidden_) {\n\n this.div_.style.visibility = \"hidden\";\n\n } else {\n\n this.div_.style.visibility = \"visible\";\n }\n};\n\n/**\n * Sets the options for the InfoBox. Note that changes to the maxWidth,\n * closeBoxMargin, closeBoxURL, and enableEventPropagation\n * properties have no affect until the current InfoBox is closed and a new one\n * is opened.\n * @param {InfoBoxOptions} opt_opts\n */\nInfoBox.prototype.setOptions = function (opt_opts) {\n if (typeof opt_opts.boxClass !== \"undefined\") { // Must be first\n\n this.boxClass_ = opt_opts.boxClass;\n this.setBoxStyle_();\n }\n if (typeof opt_opts.boxStyle !== \"undefined\") { // Must be second\n\n this.boxStyle_ = opt_opts.boxStyle;\n this.setBoxStyle_();\n }\n if (typeof opt_opts.content !== \"undefined\") {\n\n this.setContent(opt_opts.content);\n }\n if (typeof opt_opts.disableAutoPan !== \"undefined\") {\n\n this.disableAutoPan_ = opt_opts.disableAutoPan;\n }\n if (typeof opt_opts.maxWidth !== \"undefined\") {\n\n this.maxWidth_ = opt_opts.maxWidth;\n }\n if (typeof opt_opts.pixelOffset !== \"undefined\") {\n\n this.pixelOffset_ = opt_opts.pixelOffset;\n }\n if (typeof opt_opts.alignBottom !== \"undefined\") {\n\n this.alignBottom_ = opt_opts.alignBottom;\n }\n if (typeof opt_opts.position !== \"undefined\") {\n\n this.setPosition(opt_opts.position);\n }\n if (typeof opt_opts.zIndex !== \"undefined\") {\n\n this.setZIndex(opt_opts.zIndex);\n }\n if (typeof opt_opts.closeBoxMargin !== \"undefined\") {\n\n this.closeBoxMargin_ = opt_opts.closeBoxMargin;\n }\n if (typeof opt_opts.closeBoxURL !== \"undefined\") {\n\n this.closeBoxURL_ = opt_opts.closeBoxURL;\n }\n if (typeof opt_opts.infoBoxClearance !== \"undefined\") {\n\n this.infoBoxClearance_ = opt_opts.infoBoxClearance;\n }\n if (typeof opt_opts.isHidden !== \"undefined\") {\n\n this.isHidden_ = opt_opts.isHidden;\n }\n if (typeof opt_opts.visible !== \"undefined\") {\n\n this.isHidden_ = !opt_opts.visible;\n }\n if (typeof opt_opts.enableEventPropagation !== \"undefined\") {\n\n this.enableEventPropagation_ = opt_opts.enableEventPropagation;\n }\n\n if (this.div_) {\n\n this.draw();\n }\n};\n\n/**\n * Sets the content of the InfoBox.\n * The content can be plain text or an HTML DOM node.\n * @param {string|Node} content\n */\nInfoBox.prototype.setContent = function (content) {\n this.content_ = content;\n\n if (this.div_) {\n\n if (this.closeListener_) {\n\n google.maps.event.removeListener(this.closeListener_);\n this.closeListener_ = null;\n }\n\n // Odd code required to make things work with MSIE.\n //\n if (!this.fixedWidthSet_) {\n\n this.div_.style.width = \"\";\n }\n\n if (typeof content.nodeType === \"undefined\") {\n this.div_.innerHTML = this.getCloseBoxImg_() + content;\n } else {\n this.div_.innerHTML = this.getCloseBoxImg_();\n this.div_.appendChild(content);\n }\n\n // Perverse code required to make things work with MSIE.\n // (Ensures the close box does, in fact, float to the right.)\n //\n if (!this.fixedWidthSet_) {\n this.div_.style.width = this.div_.offsetWidth + \"px\";\n if (typeof content.nodeType === \"undefined\") {\n this.div_.innerHTML = this.getCloseBoxImg_() + content;\n } else {\n this.div_.innerHTML = this.getCloseBoxImg_();\n this.div_.appendChild(content);\n }\n }\n\n this.addClickHandler_();\n }\n\n /**\n * This event is fired when the content of the InfoBox changes.\n * @name InfoBox#content_changed\n * @event\n */\n google.maps.event.trigger(this, \"content_changed\");\n};\n\n/**\n * Sets the geographic location of the InfoBox.\n * @param {LatLng} latlng\n */\nInfoBox.prototype.setPosition = function (latlng) {\n\n this.position_ = latlng;\n\n if (this.div_) {\n\n this.draw();\n }\n\n /**\n * This event is fired when the position of the InfoBox changes.\n * @name InfoBox#position_changed\n * @event\n */\n google.maps.event.trigger(this, \"position_changed\");\n};\n\n/**\n * Sets the zIndex style for the InfoBox.\n * @param {number} index\n */\nInfoBox.prototype.setZIndex = function (index) {\n\n this.zIndex_ = index;\n\n if (this.div_) {\n\n this.div_.style.zIndex = index;\n }\n\n /**\n * This event is fired when the zIndex of the InfoBox changes.\n * @name InfoBox#zindex_changed\n * @event\n */\n google.maps.event.trigger(this, \"zindex_changed\");\n};\n\n/**\n * Sets the visibility of the InfoBox.\n * @param {boolean} isVisible\n */\nInfoBox.prototype.setVisible = function (isVisible) {\n\n this.isHidden_ = !isVisible;\n if (this.div_) {\n this.div_.style.visibility = (this.isHidden_ ? \"hidden\" : \"visible\");\n }\n};\n\n/**\n * Returns the content of the InfoBox.\n * @returns {string}\n */\nInfoBox.prototype.getContent = function () {\n\n return this.content_;\n};\n\n/**\n * Returns the geographic location of the InfoBox.\n * @returns {LatLng}\n */\nInfoBox.prototype.getPosition = function () {\n\n return this.position_;\n};\n\n/**\n * Returns the zIndex for the InfoBox.\n * @returns {number}\n */\nInfoBox.prototype.getZIndex = function () {\n\n return this.zIndex_;\n};\n\n/**\n * Returns a flag indicating whether the InfoBox is visible.\n * @returns {boolean}\n */\nInfoBox.prototype.getVisible = function () {\n\n var isVisible;\n\n if ((typeof this.getMap() === \"undefined\") || (this.getMap() === null)) {\n isVisible = false;\n } else {\n isVisible = !this.isHidden_;\n }\n return isVisible;\n};\n\n/**\n * Shows the InfoBox. [Deprecated; use setVisible instead.]\n */\nInfoBox.prototype.show = function () {\n\n this.isHidden_ = false;\n if (this.div_) {\n this.div_.style.visibility = \"visible\";\n }\n};\n\n/**\n * Hides the InfoBox. [Deprecated; use setVisible instead.]\n */\nInfoBox.prototype.hide = function () {\n\n this.isHidden_ = true;\n if (this.div_) {\n this.div_.style.visibility = \"hidden\";\n }\n};\n\n/**\n * Adds the InfoBox to the specified map or Street View panorama. If anchor\n * (usually a google.maps.Marker) is specified, the position\n * of the InfoBox is set to the position of the anchor. If the\n * anchor is dragged to a new location, the InfoBox moves as well.\n * @param {Map|StreetViewPanorama} map\n * @param {MVCObject} [anchor]\n */\nInfoBox.prototype.open = function (map, anchor) {\n\n var me = this;\n\n if (anchor) {\n\n this.position_ = anchor.getPosition();\n this.moveListener_ = google.maps.event.addListener(anchor, \"position_changed\", function () {\n me.setPosition(this.getPosition());\n });\n }\n\n this.setMap(map);\n\n if (this.div_) {\n\n this.panBox_();\n }\n};\n\n/**\n * Removes the InfoBox from the map.\n */\nInfoBox.prototype.close = function () {\n\n var i;\n\n if (this.closeListener_) {\n\n google.maps.event.removeListener(this.closeListener_);\n this.closeListener_ = null;\n }\n\n if (this.eventListeners_) {\n\n for (i = 0; i < this.eventListeners_.length; i++) {\n\n google.maps.event.removeListener(this.eventListeners_[i]);\n }\n this.eventListeners_ = null;\n }\n\n if (this.moveListener_) {\n\n google.maps.event.removeListener(this.moveListener_);\n this.moveListener_ = null;\n }\n\n if (this.contextListener_) {\n\n google.maps.event.removeListener(this.contextListener_);\n this.contextListener_ = null;\n }\n\n this.setMap(null);\n};\n\n/**\n * google-maps-utility-library-v3-keydragzoom\n *\n * @version: 2.0.9\n * @author: Nianwei Liu [nianwei at gmail dot com] & Gary Little [gary at luxcentral dot com]\n * @contributors: undefined\n * @date: Fri May 13 2016 13:45:18 GMT-0400 (EDT)\n * @license: Apache License 2.0\n */\n/**\n * @fileoverview This library adds a drag zoom capability to a V3 Google map.\n * When drag zoom is enabled, holding down a designated hot key (shift | ctrl | alt)\n * while dragging a box around an area of interest will zoom the map in to that area when\n * the mouse button is released. Optionally, a visual control can also be supplied for turning\n * a drag zoom operation on and off.\n * Only one line of code is needed: google.maps.Map.enableKeyDragZoom();\n *

\n * NOTE: Do not use Ctrl as the hot key with Google Maps JavaScript API V3 since, unlike with V2,\n * it causes a context menu to appear when running on the Macintosh.\n *

\n * Note that if the map's container has a border around it, the border widths must be specified\n * in pixel units (or as thin, medium, or thick). This is required because of an MSIE limitation.\n *

NL: 2009-05-28: initial port to core API V3.\n *
NL: 2009-11-02: added a temp fix for -moz-transform for FF3.5.x using code from Paul Kulchenko (http://notebook.kulchenko.com/maps/gridmove).\n *
NL: 2010-02-02: added a fix for IE flickering on divs onmousemove, caused by scroll value when get mouse position.\n *
GL: 2010-06-15: added a visual control option.\n */\n(function () {\n /*jslint browser:true */\n /*global window,google */\n /* Utility functions use \"var funName=function()\" syntax to allow use of the */\n /* Dean Edwards Packer compression tool (with Shrink variables, without Base62 encode). */\n\n /**\n * Converts \"thin\", \"medium\", and \"thick\" to pixel widths\n * in an MSIE environment. Not called for other browsers\n * because getComputedStyle() returns pixel widths automatically.\n * @param {string} widthValue The value of the border width parameter.\n */\n var toPixels = function (widthValue) {\n var px;\n switch (widthValue) {\n case \"thin\":\n px = \"2px\";\n break;\n case \"medium\":\n px = \"4px\";\n break;\n case \"thick\":\n px = \"6px\";\n break;\n default:\n px = widthValue;\n }\n return px;\n };\n /**\n * Get the widths of the borders of an HTML element.\n *\n * @param {Node} h The HTML element.\n * @return {Object} The width object {top, bottom left, right}.\n */\n var getBorderWidths = function (h) {\n var computedStyle;\n var bw = {};\n if (document.defaultView && document.defaultView.getComputedStyle) {\n computedStyle = h.ownerDocument.defaultView.getComputedStyle(h, \"\");\n if (computedStyle) {\n // The computed styles are always in pixel units (good!)\n bw.top = parseInt(computedStyle.borderTopWidth, 10) || 0;\n bw.bottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;\n bw.left = parseInt(computedStyle.borderLeftWidth, 10) || 0;\n bw.right = parseInt(computedStyle.borderRightWidth, 10) || 0;\n return bw;\n }\n } else if (document.documentElement.currentStyle) { // MSIE\n if (h.currentStyle) {\n // The current styles may not be in pixel units so try to convert (bad!)\n bw.top = parseInt(toPixels(h.currentStyle.borderTopWidth), 10) || 0;\n bw.bottom = parseInt(toPixels(h.currentStyle.borderBottomWidth), 10) || 0;\n bw.left = parseInt(toPixels(h.currentStyle.borderLeftWidth), 10) || 0;\n bw.right = parseInt(toPixels(h.currentStyle.borderRightWidth), 10) || 0;\n return bw;\n }\n }\n // Shouldn't get this far for any modern browser\n bw.top = parseInt(h.style[\"border-top-width\"], 10) || 0;\n bw.bottom = parseInt(h.style[\"border-bottom-width\"], 10) || 0;\n bw.left = parseInt(h.style[\"border-left-width\"], 10) || 0;\n bw.right = parseInt(h.style[\"border-right-width\"], 10) || 0;\n return bw;\n };\n\n // Page scroll values for use by getMousePosition. To prevent flickering on MSIE\n // they are calculated only when the document actually scrolls, not every time the\n // mouse moves (as they would be if they were calculated inside getMousePosition).\n var scroll = {\n x: 0,\n y: 0\n };\n var getScrollValue = function (e) {\n scroll.x = (typeof document.documentElement.scrollLeft !== \"undefined\" ? document.documentElement.scrollLeft : document.body.scrollLeft);\n scroll.y = (typeof document.documentElement.scrollTop !== \"undefined\" ? document.documentElement.scrollTop : document.body.scrollTop);\n };\n getScrollValue();\n\n /**\n * Get the position of the mouse relative to the document.\n * @param {Event} e The mouse event.\n * @return {Object} The position object {left, top}.\n */\n var getMousePosition = function (e) {\n var posX = 0, posY = 0;\n e = e || window.event;\n if (typeof e.pageX !== \"undefined\") {\n posX = e.pageX;\n posY = e.pageY;\n } else if (typeof e.clientX !== \"undefined\") { // MSIE\n posX = e.clientX + scroll.x;\n posY = e.clientY + scroll.y;\n }\n return {\n left: posX,\n top: posY\n };\n };\n /**\n * Get the position of an HTML element relative to the document.\n * @param {Node} h The HTML element.\n * @return {Object} The position object {left, top}.\n */\n var getElementPosition = function (h) {\n var posX = h.offsetLeft;\n var posY = h.offsetTop;\n var parent = h.offsetParent;\n // Add offsets for all ancestors in the hierarchy\n while (parent !== null) {\n // Adjust for scrolling elements which may affect the map position.\n //\n // See http://www.howtocreate.co.uk/tutorials/javascript/browserspecific\n //\n // \"...make sure that every element [on a Web page] with an overflow\n // of anything other than visible also has a position style set to\n // something other than the default static...\"\n if (parent !== document.body && parent !== document.documentElement) {\n posX -= parent.scrollLeft;\n posY -= parent.scrollTop;\n }\n // See http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/4cb86c0c1037a5e5\n // Example: http://notebook.kulchenko.com/maps/gridmove\n var m = parent;\n // This is the \"normal\" way to get offset information:\n var moffx = m.offsetLeft;\n var moffy = m.offsetTop;\n // This covers those cases where a transform is used:\n if (!moffx && !moffy && window.getComputedStyle) {\n var matrix = document.defaultView.getComputedStyle(m, null).MozTransform ||\n document.defaultView.getComputedStyle(m, null).WebkitTransform;\n if (matrix) {\n if (typeof matrix === \"string\") {\n var parms = matrix.split(\",\");\n moffx += parseInt(parms[4], 10) || 0;\n moffy += parseInt(parms[5], 10) || 0;\n }\n }\n }\n posX += moffx;\n posY += moffy;\n parent = parent.offsetParent;\n }\n return {\n left: posX,\n top: posY\n };\n };\n /**\n * Set the properties of an object to those from another object.\n * @param {Object} obj The target object.\n * @param {Object} vals The source object.\n */\n var setVals = function (obj, vals) {\n if (obj && vals) {\n for (var x in vals) {\n if (vals.hasOwnProperty(x)) {\n obj[x] = vals[x];\n }\n }\n }\n return obj;\n };\n /**\n * Set the opacity. If op is not passed in, this function just performs an MSIE fix.\n * @param {Node} h The HTML element.\n * @param {number} op The opacity value (0-1).\n */\n var setOpacity = function (h, op) {\n if (typeof op !== \"undefined\") {\n h.style.opacity = op;\n }\n if (typeof h.style.opacity !== \"undefined\" && h.style.opacity !== \"\") {\n h.style.filter = \"alpha(opacity=\" + (h.style.opacity * 100) + \")\";\n }\n };\n /**\n * @name KeyDragZoomOptions\n * @class This class represents the optional parameter passed into google.maps.Map.enableKeyDragZoom.\n * @property {string} [key=\"shift\"] The hot key to hold down to activate a drag zoom, shift | ctrl | alt.\n * NOTE: Do not use Ctrl as the hot key with Google Maps JavaScript API V3 since, unlike with V2,\n * it causes a context menu to appear when running on the Macintosh. Also note that the\n * alt hot key refers to the Option key on a Macintosh.\n * @property {Object} [boxStyle={border: \"4px solid #736AFF\"}]\n * An object literal defining the CSS styles of the zoom box.\n * Border widths must be specified in pixel units (or as thin, medium, or thick).\n * @property {Object} [veilStyle={backgroundColor: \"gray\", opacity: 0.25, cursor: \"crosshair\"}]\n * An object literal defining the CSS styles of the veil pane which covers the map when a drag\n * zoom is activated. The previous name for this property was paneStyle but the use\n * of this name is now deprecated.\n * @property {boolean} [noZoom=false] A flag indicating whether to disable zooming after an area is\n * selected. Set this to true to allow KeyDragZoom to be used as a simple area\n * selection tool.\n * @property {boolean} [visualEnabled=false] A flag indicating whether a visual control is to be used.\n * @property {string} [visualClass=\"\"] The name of the CSS class defining the styles for the visual\n * control. To prevent the visual control from being printed, set this property to the name of\n * a class, defined inside a @media print rule, which sets the CSS\n * display style to none.\n * @property {ControlPosition} [visualPosition=google.maps.ControlPosition.LEFT_TOP]\n * The position of the visual control.\n * @property {Size} [visualPositionOffset=google.maps.Size(35, 0)] The width and height values\n * provided by this property are the offsets (in pixels) from the location at which the control\n * would normally be drawn to the desired drawing location.\n * @property {number} [visualPositionIndex=null] The index of the visual control.\n * The index is for controlling the placement of the control relative to other controls at the\n * position given by visualPosition; controls with a lower index are placed first.\n * Use a negative value to place the control before any default controls. No index is\n * generally required.\n * @property {String} [visualSprite=\"http://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png/"]\n * The URL of the sprite image used for showing the visual control in the on, off, and hot\n * (i.e., when the mouse is over the control) states. The three images within the sprite must\n * be the same size and arranged in on-hot-off order in a single row with no spaces between images.\n * @property {Size} [visualSize=google.maps.Size(20, 20)] The width and height values provided by\n * this property are the size (in pixels) of each of the images within visualSprite.\n * @property {Object} [visualTips={off: \"Turn on drag zoom mode\", on: \"Turn off drag zoom mode\"}]\n * An object literal defining the help tips that appear when\n * the mouse moves over the visual control. The off property is the tip to be shown\n * when the control is off and the on property is the tip to be shown when the\n * control is on.\n */\n /**\n * @name DragZoom\n * @class This class represents a drag zoom object for a map. The object is activated by holding down the hot key\n * or by turning on the visual control.\n * This object is created when google.maps.Map.enableKeyDragZoom is called; it cannot be created directly.\n * Use google.maps.Map.getDragZoomObject to gain access to this object in order to attach event listeners.\n * @param {Map} map The map to which the DragZoom object is to be attached.\n * @param {KeyDragZoomOptions} [opt_zoomOpts] The optional parameters.\n */\n function DragZoom(map, opt_zoomOpts) {\n var me = this;\n var ov = new google.maps.OverlayView();\n ov.onAdd = function () {\n me.init_(map, opt_zoomOpts);\n };\n ov.draw = function () {\n };\n ov.onRemove = function () {\n };\n ov.setMap(map);\n this.prjov_ = ov;\n }\n /**\n * Initialize the tool.\n * @param {Map} map The map to which the DragZoom object is to be attached.\n * @param {KeyDragZoomOptions} [opt_zoomOpts] The optional parameters.\n */\n DragZoom.prototype.init_ = function (map, opt_zoomOpts) {\n var i;\n var me = this;\n this.map_ = map;\n opt_zoomOpts = opt_zoomOpts || {};\n this.key_ = opt_zoomOpts.key || \"shift\";\n this.key_ = this.key_.toLowerCase();\n this.borderWidths_ = getBorderWidths(this.map_.getDiv());\n this.veilDiv_ = [];\n for (i = 0; i < 4; i++) {\n this.veilDiv_[i] = document.createElement(\"div\");\n // Prevents selection of other elements on the webpage\n // when a drag zoom operation is in progress:\n this.veilDiv_[i].onselectstart = function () {\n return false;\n };\n // Apply default style values for the veil:\n setVals(this.veilDiv_[i].style, {\n backgroundColor: \"gray\",\n opacity: 0.25,\n cursor: \"crosshair\"\n });\n // Apply style values specified in veilStyle parameter:\n setVals(this.veilDiv_[i].style, opt_zoomOpts.paneStyle); // Old option name was \"paneStyle\"\n setVals(this.veilDiv_[i].style, opt_zoomOpts.veilStyle); // New name is \"veilStyle\"\n // Apply mandatory style values:\n setVals(this.veilDiv_[i].style, {\n position: \"absolute\",\n overflow: \"hidden\",\n display: \"none\"\n });\n // Workaround for Firefox Shift-Click problem:\n if (this.key_ === \"shift\") {\n this.veilDiv_[i].style.MozUserSelect = \"none\";\n }\n setOpacity(this.veilDiv_[i]);\n // An IE fix: If the background is transparent it cannot capture mousedown\n // events, so if it is, change the background to white with 0 opacity.\n if (this.veilDiv_[i].style.backgroundColor === \"transparent\") {\n this.veilDiv_[i].style.backgroundColor = \"white\";\n setOpacity(this.veilDiv_[i], 0);\n }\n this.map_.getDiv().appendChild(this.veilDiv_[i]);\n }\n\n this.noZoom_ = opt_zoomOpts.noZoom || false;\n this.visualEnabled_ = opt_zoomOpts.visualEnabled || false;\n this.visualClass_ = opt_zoomOpts.visualClass || \"\";\n this.visualPosition_ = opt_zoomOpts.visualPosition || google.maps.ControlPosition.LEFT_TOP;\n this.visualPositionOffset_ = opt_zoomOpts.visualPositionOffset || new google.maps.Size(35, 0);\n this.visualPositionIndex_ = opt_zoomOpts.visualPositionIndex || null;\n this.visualSprite_ = opt_zoomOpts.visualSprite || \"http\" + (document.location.protocol === \"https:\" ? \"s\" : \"\") + \"://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png\";\n this.visualSize_ = opt_zoomOpts.visualSize || new google.maps.Size(20, 20);\n this.visualTips_ = opt_zoomOpts.visualTips || {};\n this.visualTips_.off = this.visualTips_.off || \"Turn on drag zoom mode\";\n this.visualTips_.on = this.visualTips_.on || \"Turn off drag zoom mode\";\n\n this.boxDiv_ = document.createElement(\"div\");\n // Apply default style values for the zoom box:\n setVals(this.boxDiv_.style, {\n border: \"4px solid #736AFF\"\n });\n // Apply style values specified in boxStyle parameter:\n setVals(this.boxDiv_.style, opt_zoomOpts.boxStyle);\n // Apply mandatory style values:\n setVals(this.boxDiv_.style, {\n position: \"absolute\",\n display: \"none\"\n });\n setOpacity(this.boxDiv_);\n this.map_.getDiv().appendChild(this.boxDiv_);\n this.boxBorderWidths_ = getBorderWidths(this.boxDiv_);\n\n this.listeners_ = [\n google.maps.event.addDomListener(document, \"keydown\", function (e) {\n me.onKeyDown_(e);\n }),\n google.maps.event.addDomListener(document, \"keyup\", function (e) {\n me.onKeyUp_(e);\n }),\n google.maps.event.addDomListener(this.veilDiv_[0], \"mousedown\", function (e) {\n me.onMouseDown_(e);\n }),\n google.maps.event.addDomListener(this.veilDiv_[1], \"mousedown\", function (e) {\n me.onMouseDown_(e);\n }),\n google.maps.event.addDomListener(this.veilDiv_[2], \"mousedown\", function (e) {\n me.onMouseDown_(e);\n }),\n google.maps.event.addDomListener(this.veilDiv_[3], \"mousedown\", function (e) {\n me.onMouseDown_(e);\n }),\n google.maps.event.addDomListener(document, \"mousedown\", function (e) {\n me.onMouseDownDocument_(e);\n }),\n google.maps.event.addDomListener(document, \"mousemove\", function (e) {\n me.onMouseMove_(e);\n }),\n google.maps.event.addDomListener(document, \"mouseup\", function (e) {\n me.onMouseUp_(e);\n }),\n google.maps.event.addDomListener(window, \"scroll\", getScrollValue)\n ];\n\n this.hotKeyDown_ = false;\n this.mouseDown_ = false;\n this.dragging_ = false;\n this.startPt_ = null;\n this.endPt_ = null;\n this.mapWidth_ = null;\n this.mapHeight_ = null;\n this.mousePosn_ = null;\n this.mapPosn_ = null;\n\n if (this.visualEnabled_) {\n this.buttonDiv_ = this.initControl_(this.visualPositionOffset_);\n if (this.visualPositionIndex_ !== null) {\n this.buttonDiv_.index = this.visualPositionIndex_;\n }\n this.map_.controls[this.visualPosition_].push(this.buttonDiv_);\n this.controlIndex_ = this.map_.controls[this.visualPosition_].length - 1;\n }\n };\n /**\n * Initializes the visual control and returns its DOM element.\n * @param {Size} offset The offset of the control from its normal position.\n * @return {Node} The DOM element containing the visual control.\n */\n DragZoom.prototype.initControl_ = function (offset) {\n var control;\n var image;\n var me = this;\n\n control = document.createElement(\"div\");\n control.className = this.visualClass_;\n control.style.position = \"relative\";\n control.style.overflow = \"hidden\";\n control.style.height = this.visualSize_.height + \"px\";\n control.style.width = this.visualSize_.width + \"px\";\n control.title = this.visualTips_.off;\n image = document.createElement(\"img\");\n image.src = this.visualSprite_;\n image.style.position = \"absolute\";\n image.style.left = -(this.visualSize_.width * 2) + \"px\";\n image.style.top = 0 + \"px\";\n control.appendChild(image);\n control.onclick = function (e) {\n me.hotKeyDown_ = !me.hotKeyDown_;\n if (me.hotKeyDown_) {\n me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 0) + \"px\";\n me.buttonDiv_.title = me.visualTips_.on;\n me.activatedByControl_ = true;\n google.maps.event.trigger(me, \"activate\");\n } else {\n me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 2) + \"px\";\n me.buttonDiv_.title = me.visualTips_.off;\n google.maps.event.trigger(me, \"deactivate\");\n }\n me.onMouseMove_(e); // Updates the veil\n };\n control.onmouseover = function () {\n me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 1) + \"px\";\n };\n control.onmouseout = function () {\n if (me.hotKeyDown_) {\n me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 0) + \"px\";\n me.buttonDiv_.title = me.visualTips_.on;\n } else {\n me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 2) + \"px\";\n me.buttonDiv_.title = me.visualTips_.off;\n }\n };\n control.ondragstart = function () {\n return false;\n };\n setVals(control.style, {\n cursor: \"pointer\",\n marginTop: offset.height + \"px\",\n marginLeft: offset.width + \"px\"\n });\n return control;\n };\n /**\n * Returns true if the hot key is being pressed when an event occurs.\n * @param {Event} e The keyboard event.\n * @return {boolean} Flag indicating whether the hot key is down.\n */\n DragZoom.prototype.isHotKeyDown_ = function (e) {\n var isHot;\n e = e || window.event;\n isHot = (e.shiftKey && this.key_ === \"shift\") || (e.altKey && this.key_ === \"alt\") || (e.ctrlKey && this.key_ === \"ctrl\");\n if (!isHot) {\n // Need to look at keyCode for Opera because it\n // doesn't set the shiftKey, altKey, ctrlKey properties\n // unless a non-modifier event is being reported.\n //\n // See http://cross-browser.com/x/examples/shift_mode.php\n // Also see http://unixpapa.com/js/key.html\n switch (e.keyCode) {\n case 16:\n if (this.key_ === \"shift\") {\n isHot = true;\n }\n break;\n case 17:\n if (this.key_ === \"ctrl\") {\n isHot = true;\n }\n break;\n case 18:\n if (this.key_ === \"alt\") {\n isHot = true;\n }\n break;\n }\n }\n return isHot;\n };\n /**\n * Returns true if the mouse is on top of the map div.\n * The position is captured in onMouseMove_.\n * @return {boolean}\n */\n DragZoom.prototype.isMouseOnMap_ = function () {\n var mousePosn = this.mousePosn_;\n if (mousePosn) {\n var mapPosn = this.mapPosn_;\n var mapDiv = this.map_.getDiv();\n return mousePosn.left > mapPosn.left && mousePosn.left < (mapPosn.left + mapDiv.offsetWidth) &&\n mousePosn.top > mapPosn.top && mousePosn.top < (mapPosn.top + mapDiv.offsetHeight);\n } else {\n // if user never moved mouse\n return false;\n }\n };\n /**\n * Show the veil if the hot key is down and the mouse is over the map,\n * otherwise hide the veil.\n */\n DragZoom.prototype.setVeilVisibility_ = function () {\n var i;\n if (this.map_ && this.hotKeyDown_ && this.isMouseOnMap_()) {\n var mapDiv = this.map_.getDiv();\n this.mapWidth_ = mapDiv.offsetWidth - (this.borderWidths_.left + this.borderWidths_.right);\n this.mapHeight_ = mapDiv.offsetHeight - (this.borderWidths_.top + this.borderWidths_.bottom);\n if (this.activatedByControl_) { // Veil covers entire map (except control)\n var left = parseInt(this.buttonDiv_.style.left, 10) + this.visualPositionOffset_.width;\n var top = parseInt(this.buttonDiv_.style.top, 10) + this.visualPositionOffset_.height;\n var width = this.visualSize_.width;\n var height = this.visualSize_.height;\n // Left veil rectangle:\n this.veilDiv_[0].style.top = \"0px\";\n this.veilDiv_[0].style.left = \"0px\";\n this.veilDiv_[0].style.width = left + \"px\";\n this.veilDiv_[0].style.height = this.mapHeight_ + \"px\";\n // Right veil rectangle:\n this.veilDiv_[1].style.top = \"0px\";\n this.veilDiv_[1].style.left = (left + width) + \"px\";\n this.veilDiv_[1].style.width = (this.mapWidth_ - (left + width)) + \"px\";\n this.veilDiv_[1].style.height = this.mapHeight_ + \"px\";\n // Top veil rectangle:\n this.veilDiv_[2].style.top = \"0px\";\n this.veilDiv_[2].style.left = left + \"px\";\n this.veilDiv_[2].style.width = width + \"px\";\n this.veilDiv_[2].style.height = top + \"px\";\n // Bottom veil rectangle:\n this.veilDiv_[3].style.top = (top + height) + \"px\";\n this.veilDiv_[3].style.left = left + \"px\";\n this.veilDiv_[3].style.width = width + \"px\";\n this.veilDiv_[3].style.height = (this.mapHeight_ - (top + height)) + \"px\";\n for (i = 0; i < this.veilDiv_.length; i++) {\n this.veilDiv_[i].style.display = \"block\";\n }\n } else {\n this.veilDiv_[0].style.left = \"0px\";\n this.veilDiv_[0].style.top = \"0px\";\n this.veilDiv_[0].style.width = this.mapWidth_ + \"px\";\n this.veilDiv_[0].style.height = this.mapHeight_ + \"px\";\n for (i = 1; i < this.veilDiv_.length; i++) {\n this.veilDiv_[i].style.width = \"0px\";\n this.veilDiv_[i].style.height = \"0px\";\n }\n for (i = 0; i < this.veilDiv_.length; i++) {\n this.veilDiv_[i].style.display = \"block\";\n }\n }\n } else {\n for (i = 0; i < this.veilDiv_.length; i++) {\n this.veilDiv_[i].style.display = \"none\";\n }\n }\n };\n /**\n * Handle key down. Show the veil if the hot key has been pressed.\n * @param {Event} e The keyboard event.\n */\n DragZoom.prototype.onKeyDown_ = function (e) {\n if (this.map_ && !this.hotKeyDown_ && this.isHotKeyDown_(e)) {\n this.mapPosn_ = getElementPosition(this.map_.getDiv());\n this.hotKeyDown_ = true;\n this.activatedByControl_ = false;\n this.setVeilVisibility_();\n /**\n * This event is fired when the hot key is pressed.\n * @name DragZoom#activate\n * @event\n */\n google.maps.event.trigger(this, \"activate\");\n }\n };\n /**\n * Get the google.maps.Point of the mouse position.\n * @param {Event} e The mouse event.\n * @return {Point} The mouse position.\n */\n DragZoom.prototype.getMousePoint_ = function (e) {\n var mousePosn = getMousePosition(e);\n var p = new google.maps.Point();\n p.x = mousePosn.left - this.mapPosn_.left - this.borderWidths_.left;\n p.y = mousePosn.top - this.mapPosn_.top - this.borderWidths_.top;\n p.x = Math.min(p.x, this.mapWidth_);\n p.y = Math.min(p.y, this.mapHeight_);\n p.x = Math.max(p.x, 0);\n p.y = Math.max(p.y, 0);\n return p;\n };\n /**\n * Handle mouse down.\n * @param {Event} e The mouse event.\n */\n DragZoom.prototype.onMouseDown_ = function (e) {\n if (this.map_ && this.hotKeyDown_) {\n this.mapPosn_ = getElementPosition(this.map_.getDiv());\n this.dragging_ = true;\n this.startPt_ = this.endPt_ = this.getMousePoint_(e);\n this.boxDiv_.style.width = this.boxDiv_.style.height = \"0px\";\n var prj = this.prjov_.getProjection();\n var latlng = prj.fromContainerPixelToLatLng(this.startPt_);\n /**\n * This event is fired when the drag operation begins.\n * The parameter passed is the geographic position of the starting point.\n * @name DragZoom#dragstart\n * @param {LatLng} latlng The geographic position of the starting point.\n * @event\n */\n google.maps.event.trigger(this, \"dragstart\", latlng);\n }\n };\n /**\n * Handle mouse down at the document level.\n * @param {Event} e The mouse event.\n */\n DragZoom.prototype.onMouseDownDocument_ = function (e) {\n this.mouseDown_ = true;\n };\n /**\n * Handle mouse move.\n * @param {Event} e The mouse event.\n */\n DragZoom.prototype.onMouseMove_ = function (e) {\n this.mousePosn_ = getMousePosition(e);\n if (this.dragging_) {\n this.endPt_ = this.getMousePoint_(e);\n var left = Math.min(this.startPt_.x, this.endPt_.x);\n var top = Math.min(this.startPt_.y, this.endPt_.y);\n var width = Math.abs(this.startPt_.x - this.endPt_.x);\n var height = Math.abs(this.startPt_.y - this.endPt_.y);\n // For benefit of MSIE 7/8 ensure following values are not negative:\n var boxWidth = Math.max(0, width - (this.boxBorderWidths_.left + this.boxBorderWidths_.right));\n var boxHeight = Math.max(0, height - (this.boxBorderWidths_.top + this.boxBorderWidths_.bottom));\n // Left veil rectangle:\n this.veilDiv_[0].style.top = \"0px\";\n this.veilDiv_[0].style.left = \"0px\";\n this.veilDiv_[0].style.width = left + \"px\";\n this.veilDiv_[0].style.height = this.mapHeight_ + \"px\";\n // Right veil rectangle:\n this.veilDiv_[1].style.top = \"0px\";\n this.veilDiv_[1].style.left = (left + width) + \"px\";\n this.veilDiv_[1].style.width = (this.mapWidth_ - (left + width)) + \"px\";\n this.veilDiv_[1].style.height = this.mapHeight_ + \"px\";\n // Top veil rectangle:\n this.veilDiv_[2].style.top = \"0px\";\n this.veilDiv_[2].style.left = left + \"px\";\n this.veilDiv_[2].style.width = width + \"px\";\n this.veilDiv_[2].style.height = top + \"px\";\n // Bottom veil rectangle:\n this.veilDiv_[3].style.top = (top + height) + \"px\";\n this.veilDiv_[3].style.left = left + \"px\";\n this.veilDiv_[3].style.width = width + \"px\";\n this.veilDiv_[3].style.height = (this.mapHeight_ - (top + height)) + \"px\";\n // Selection rectangle:\n this.boxDiv_.style.top = top + \"px\";\n this.boxDiv_.style.left = left + \"px\";\n this.boxDiv_.style.width = boxWidth + \"px\";\n this.boxDiv_.style.height = boxHeight + \"px\";\n this.boxDiv_.style.display = \"block\";\n /**\n * This event is fired repeatedly while the user drags a box across the area of interest.\n * The southwest and northeast point are passed as parameters of type google.maps.Point\n * (for performance reasons), relative to the map container. Also passed is the projection object\n * so that the event listener, if necessary, can convert the pixel positions to geographic\n * coordinates using google.maps.MapCanvasProjection.fromContainerPixelToLatLng.\n * @name DragZoom#drag\n * @param {Point} southwestPixel The southwest point of the selection area.\n * @param {Point} northeastPixel The northeast point of the selection area.\n * @param {MapCanvasProjection} prj The projection object.\n * @event\n */\n google.maps.event.trigger(this, \"drag\", new google.maps.Point(left, top + height), new google.maps.Point(left + width, top), this.prjov_.getProjection());\n } else if (!this.mouseDown_) {\n this.mapPosn_ = getElementPosition(this.map_.getDiv());\n this.setVeilVisibility_();\n }\n };\n /**\n * Handle mouse up.\n * @param {Event} e The mouse event.\n */\n DragZoom.prototype.onMouseUp_ = function (e) {\n var z;\n var me = this;\n this.mouseDown_ = false;\n if (this.dragging_) {\n if ((this.getMousePoint_(e).x === this.startPt_.x) && (this.getMousePoint_(e).y === this.startPt_.y)) {\n this.onKeyUp_(e); // Cancel event\n return;\n }\n var left = Math.min(this.startPt_.x, this.endPt_.x);\n var top = Math.min(this.startPt_.y, this.endPt_.y);\n var width = Math.abs(this.startPt_.x - this.endPt_.x);\n var height = Math.abs(this.startPt_.y - this.endPt_.y);\n // Google Maps API bug: setCenter() doesn't work as expected if the map has a\n // border on the left or top. The code here includes a workaround for this problem.\n var kGoogleCenteringBug = true;\n if (kGoogleCenteringBug) {\n left += this.borderWidths_.left;\n top += this.borderWidths_.top;\n }\n\n var prj = this.prjov_.getProjection();\n var sw = prj.fromContainerPixelToLatLng(new google.maps.Point(left, top + height));\n var ne = prj.fromContainerPixelToLatLng(new google.maps.Point(left + width, top));\n var bnds = new google.maps.LatLngBounds(sw, ne);\n\n if (this.noZoom_) {\n this.boxDiv_.style.display = \"none\";\n } else {\n // Sometimes fitBounds causes a zoom OUT, so restore original zoom level if this happens.\n z = this.map_.getZoom();\n this.map_.fitBounds(bnds);\n if (this.map_.getZoom() < z) {\n this.map_.setZoom(z);\n }\n\n // Redraw box after zoom:\n var swPt = prj.fromLatLngToContainerPixel(sw);\n var nePt = prj.fromLatLngToContainerPixel(ne);\n if (kGoogleCenteringBug) {\n swPt.x -= this.borderWidths_.left;\n swPt.y -= this.borderWidths_.top;\n nePt.x -= this.borderWidths_.left;\n nePt.y -= this.borderWidths_.top;\n }\n this.boxDiv_.style.left = swPt.x + \"px\";\n this.boxDiv_.style.top = nePt.y + \"px\";\n this.boxDiv_.style.width = (Math.abs(nePt.x - swPt.x) - (this.boxBorderWidths_.left + this.boxBorderWidths_.right)) + \"px\";\n this.boxDiv_.style.height = (Math.abs(nePt.y - swPt.y) - (this.boxBorderWidths_.top + this.boxBorderWidths_.bottom)) + \"px\";\n // Hide box asynchronously after 1 second:\n setTimeout(function () {\n me.boxDiv_.style.display = \"none\";\n }, 1000);\n }\n this.dragging_ = false;\n this.onMouseMove_(e); // Updates the veil\n /**\n * This event is fired when the drag operation ends.\n * The parameter passed is the geographic bounds of the selected area.\n * Note that this event is not fired if the hot key is released before the drag operation ends.\n * @name DragZoom#dragend\n * @param {LatLngBounds} bnds The geographic bounds of the selected area.\n * @event\n */\n google.maps.event.trigger(this, \"dragend\", bnds);\n // if the hot key isn't down, the drag zoom must have been activated by turning\n // on the visual control. In this case, finish up by simulating a key up event.\n if (!this.isHotKeyDown_(e)) {\n this.onKeyUp_(e);\n }\n }\n };\n /**\n * Handle key up.\n * @param {Event} e The keyboard event.\n */\n DragZoom.prototype.onKeyUp_ = function (e) {\n var i;\n var left, top, width, height, prj, sw, ne;\n var bnds = null;\n if (this.map_ && this.hotKeyDown_) {\n this.hotKeyDown_ = false;\n if (this.dragging_) {\n this.boxDiv_.style.display = \"none\";\n this.dragging_ = false;\n // Calculate the bounds when drag zoom was cancelled\n left = Math.min(this.startPt_.x, this.endPt_.x);\n top = Math.min(this.startPt_.y, this.endPt_.y);\n width = Math.abs(this.startPt_.x - this.endPt_.x);\n height = Math.abs(this.startPt_.y - this.endPt_.y);\n prj = this.prjov_.getProjection();\n sw = prj.fromContainerPixelToLatLng(new google.maps.Point(left, top + height));\n ne = prj.fromContainerPixelToLatLng(new google.maps.Point(left + width, top));\n bnds = new google.maps.LatLngBounds(sw, ne);\n }\n for (i = 0; i < this.veilDiv_.length; i++) {\n this.veilDiv_[i].style.display = \"none\";\n }\n if (this.visualEnabled_) {\n this.buttonDiv_.firstChild.style.left = -(this.visualSize_.width * 2) + \"px\";\n this.buttonDiv_.title = this.visualTips_.off;\n this.buttonDiv_.style.display = \"\";\n }\n /**\n * This event is fired when the hot key is released.\n * The parameter passed is the geographic bounds of the selected area immediately\n * before the hot key was released.\n * @name DragZoom#deactivate\n * @param {LatLngBounds} bnds The geographic bounds of the selected area immediately\n * before the hot key was released.\n * @event\n */\n google.maps.event.trigger(this, \"deactivate\", bnds);\n }\n };\n /**\n * @name google.maps.Map\n * @class These are new methods added to the Google Maps JavaScript API V3's\n * Map\n * class.\n */\n /**\n * Enables drag zoom. The user can zoom to an area of interest by holding down the hot key\n * (shift | ctrl | alt ) while dragging a box around the area or by turning\n * on the visual control then dragging a box around the area.\n * @param {KeyDragZoomOptions} opt_zoomOpts The optional parameters.\n */\n google.maps.Map.prototype.enableKeyDragZoom = function (opt_zoomOpts) {\n this.dragZoom_ = new DragZoom(this, opt_zoomOpts);\n };\n /**\n * Disables drag zoom.\n */\n google.maps.Map.prototype.disableKeyDragZoom = function () {\n var i;\n var d = this.dragZoom_;\n if (d) {\n for (i = 0; i < d.listeners_.length; ++i) {\n google.maps.event.removeListener(d.listeners_[i]);\n }\n this.getDiv().removeChild(d.boxDiv_);\n for (i = 0; i < d.veilDiv_.length; i++) {\n this.getDiv().removeChild(d.veilDiv_[i]);\n }\n if (d.visualEnabled_) {\n // Remove the custom control:\n this.controls[d.visualPosition_].removeAt(d.controlIndex_);\n }\n d.prjov_.setMap(null);\n this.dragZoom_ = null;\n }\n };\n /**\n * Returns true if the drag zoom feature has been enabled.\n * @return {boolean}\n */\n google.maps.Map.prototype.keyDragZoomEnabled = function () {\n return this.dragZoom_ !== null;\n };\n /**\n * Returns the DragZoom object which is created when google.maps.Map.enableKeyDragZoom is called.\n * With this object you can use google.maps.event.addListener to attach event listeners\n * for the \"activate\", \"deactivate\", \"dragstart\", \"drag\", and \"dragend\" events.\n * @return {DragZoom}\n */\n google.maps.Map.prototype.getDragZoomObject = function () {\n return this.dragZoom_;\n };\n})();\n\n/**\n * google-maps-utility-library-v3-markerwithlabel\n *\n * @version: 1.1.10\n * @author: Gary Little (inspired by code from Marc Ridey of Google).\n * @contributors: Nicholas McCready\n * @date: Fri May 13 2016 16:29:58 GMT-0400 (EDT)\n * @license: Apache License 2.0\n */\n/**\n * MarkerWithLabel allows you to define markers with associated labels. As you would expect,\n * if the marker is draggable, so too will be the label. In addition, a marker with a label\n * responds to all mouse events in the same manner as a regular marker. It also fires mouse\n * events and \"property changed\" events just as a regular marker would. Version 1.1 adds\n * support for the raiseOnDrag feature introduced in API V3.3.\n *

\n * If you drag a marker by its label, you can cancel the drag and return the marker to its\n * original position by pressing the Esc key. This doesn't work if you drag the marker\n * itself because this feature is not (yet) supported in the google.maps.Marker class.\n */\n\n/*jslint browser:true */\n/*global document,google */\n\n/**\n * @param {Function} childCtor Child class.\n * @param {Function} parentCtor Parent class.\n * @private\n */\nfunction inherits(childCtor, parentCtor) {\n /* @constructor */\n function tempCtor() {}\n tempCtor.prototype = parentCtor.prototype;\n childCtor.superClass_ = parentCtor.prototype;\n childCtor.prototype = new tempCtor();\n /* @override */\n childCtor.prototype.constructor = childCtor;\n}\n\n/**\n * This constructor creates a label and associates it with a marker.\n * It is for the private use of the MarkerWithLabel class.\n * @constructor\n * @param {Marker} marker The marker with which the label is to be associated.\n * @param {string} crossURL The URL of the cross image =.\n * @param {string} handCursor The URL of the hand cursor.\n * @private\n */\nfunction MarkerLabel_(marker, crossURL, handCursorURL) {\n this.marker_ = marker;\n this.handCursorURL_ = marker.handCursorURL;\n\n this.labelDiv_ = document.createElement(\"div\");\n this.labelDiv_.style.cssText = \"position: absolute; overflow: hidden;\";\n\n // Set up the DIV for handling mouse events in the label. This DIV forms a transparent veil\n // in the \"overlayMouseTarget\" pane, a veil that covers just the label. This is done so that\n // events can be captured even if the label is in the shadow of a google.maps.InfoWindow.\n // Code is included here to ensure the veil is always exactly the same size as the label.\n this.eventDiv_ = document.createElement(\"div\");\n this.eventDiv_.style.cssText = this.labelDiv_.style.cssText;\n\n // This is needed for proper behavior on MSIE:\n this.eventDiv_.setAttribute(\"onselectstart\", \"return false;\");\n this.eventDiv_.setAttribute(\"ondragstart\", \"return false;\");\n\n // Get the DIV for the \"X\" to be displayed when the marker is raised.\n this.crossDiv_ = MarkerLabel_.getSharedCross(crossURL);\n}\n\ninherits(MarkerLabel_, google.maps.OverlayView);\n\n/**\n * Returns the DIV for the cross used when dragging a marker when the\n * raiseOnDrag parameter set to true. One cross is shared with all markers.\n * @param {string} crossURL The URL of the cross image =.\n * @private\n */\nMarkerLabel_.getSharedCross = function (crossURL) {\n var div;\n if (typeof MarkerLabel_.getSharedCross.crossDiv === \"undefined\") {\n div = document.createElement(\"img\");\n div.style.cssText = \"position: absolute; z-index: 1000002; display: none;\";\n // Hopefully Google never changes the standard \"X\" attributes:\n div.style.marginLeft = \"-8px\";\n div.style.marginTop = \"-9px\";\n div.src = crossURL;\n MarkerLabel_.getSharedCross.crossDiv = div;\n }\n return MarkerLabel_.getSharedCross.crossDiv;\n};\n\n/**\n * Adds the DIV representing the label to the DOM. This method is called\n * automatically when the marker's setMap method is called.\n * @private\n */\nMarkerLabel_.prototype.onAdd = function () {\n var me = this;\n var cMouseIsDown = false;\n var cDraggingLabel = false;\n var cSavedZIndex;\n var cLatOffset, cLngOffset;\n var cIgnoreClick;\n var cRaiseEnabled;\n var cStartPosition;\n var cStartCenter;\n // Constants:\n var cRaiseOffset = 20;\n var cDraggingCursor = \"url(https://github.com/%22%20+%20this.handCursorURL_%20+%20/")\";\n\n // Stops all processing of an event.\n //\n var cAbortEvent = function (e) {\n if (e.preventDefault) {\n e.preventDefault();\n }\n e.cancelBubble = true;\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n };\n\n var cStopBounce = function () {\n me.marker_.setAnimation(null);\n };\n\n this.getPanes().overlayImage.appendChild(this.labelDiv_);\n this.getPanes().overlayMouseTarget.appendChild(this.eventDiv_);\n // One cross is shared with all markers, so only add it once:\n if (typeof MarkerLabel_.getSharedCross.processed === \"undefined\") {\n this.getPanes().overlayImage.appendChild(this.crossDiv_);\n MarkerLabel_.getSharedCross.processed = true;\n }\n\n this.listeners_ = [\n google.maps.event.addDomListener(this.eventDiv_, \"mouseover\", function (e) {\n if (me.marker_.getDraggable() || me.marker_.getClickable()) {\n this.style.cursor = \"pointer\";\n google.maps.event.trigger(me.marker_, \"mouseover\", e);\n }\n }),\n google.maps.event.addDomListener(this.eventDiv_, \"mouseout\", function (e) {\n if ((me.marker_.getDraggable() || me.marker_.getClickable()) && !cDraggingLabel) {\n this.style.cursor = me.marker_.getCursor();\n google.maps.event.trigger(me.marker_, \"mouseout\", e);\n }\n }),\n google.maps.event.addDomListener(this.eventDiv_, \"mousedown\", function (e) {\n cDraggingLabel = false;\n if (me.marker_.getDraggable()) {\n cMouseIsDown = true;\n this.style.cursor = cDraggingCursor;\n }\n if (me.marker_.getDraggable() || me.marker_.getClickable()) {\n google.maps.event.trigger(me.marker_, \"mousedown\", e);\n cAbortEvent(e); // Prevent map pan when starting a drag on a label\n }\n }),\n google.maps.event.addDomListener(document, \"mouseup\", function (mEvent) {\n var position;\n if (cMouseIsDown) {\n cMouseIsDown = false;\n me.eventDiv_.style.cursor = \"pointer\";\n google.maps.event.trigger(me.marker_, \"mouseup\", mEvent);\n }\n if (cDraggingLabel) {\n if (cRaiseEnabled) { // Lower the marker & label\n position = me.getProjection().fromLatLngToDivPixel(me.marker_.getPosition());\n position.y += cRaiseOffset;\n me.marker_.setPosition(me.getProjection().fromDivPixelToLatLng(position));\n // This is not the same bouncing style as when the marker portion is dragged,\n // but it will have to do:\n try { // Will fail if running Google Maps API earlier than V3.3\n me.marker_.setAnimation(google.maps.Animation.BOUNCE);\n setTimeout(cStopBounce, 1406);\n } catch (e) {}\n }\n me.crossDiv_.style.display = \"none\";\n me.marker_.setZIndex(cSavedZIndex);\n cIgnoreClick = true; // Set flag to ignore the click event reported after a label drag\n cDraggingLabel = false;\n mEvent.latLng = me.marker_.getPosition();\n google.maps.event.trigger(me.marker_, \"dragend\", mEvent);\n }\n }),\n google.maps.event.addListener(me.marker_.getMap(), \"mousemove\", function (mEvent) {\n var position;\n if (cMouseIsDown) {\n if (cDraggingLabel) {\n // Change the reported location from the mouse position to the marker position:\n mEvent.latLng = new google.maps.LatLng(mEvent.latLng.lat() - cLatOffset, mEvent.latLng.lng() - cLngOffset);\n position = me.getProjection().fromLatLngToDivPixel(mEvent.latLng);\n if (cRaiseEnabled) {\n me.crossDiv_.style.left = position.x + \"px\";\n me.crossDiv_.style.top = position.y + \"px\";\n me.crossDiv_.style.display = \"\";\n position.y -= cRaiseOffset;\n }\n me.marker_.setPosition(me.getProjection().fromDivPixelToLatLng(position));\n if (cRaiseEnabled) { // Don't raise the veil; this hack needed to make MSIE act properly\n me.eventDiv_.style.top = (position.y + cRaiseOffset) + \"px\";\n }\n google.maps.event.trigger(me.marker_, \"drag\", mEvent);\n } else {\n // Calculate offsets from the click point to the marker position:\n cLatOffset = mEvent.latLng.lat() - me.marker_.getPosition().lat();\n cLngOffset = mEvent.latLng.lng() - me.marker_.getPosition().lng();\n cSavedZIndex = me.marker_.getZIndex();\n cStartPosition = me.marker_.getPosition();\n cStartCenter = me.marker_.getMap().getCenter();\n cRaiseEnabled = me.marker_.get(\"raiseOnDrag\");\n cDraggingLabel = true;\n me.marker_.setZIndex(1000000); // Moves the marker & label to the foreground during a drag\n mEvent.latLng = me.marker_.getPosition();\n google.maps.event.trigger(me.marker_, \"dragstart\", mEvent);\n }\n }\n }),\n google.maps.event.addDomListener(document, \"keydown\", function (e) {\n if (cDraggingLabel) {\n if (e.keyCode === 27) { // Esc key\n cRaiseEnabled = false;\n me.marker_.setPosition(cStartPosition);\n me.marker_.getMap().setCenter(cStartCenter);\n google.maps.event.trigger(document, \"mouseup\", e);\n }\n }\n }),\n google.maps.event.addDomListener(this.eventDiv_, \"click\", function (e) {\n if (me.marker_.getDraggable() || me.marker_.getClickable()) {\n if (cIgnoreClick) { // Ignore the click reported when a label drag ends\n cIgnoreClick = false;\n } else {\n google.maps.event.trigger(me.marker_, \"click\", e);\n cAbortEvent(e); // Prevent click from being passed on to map\n }\n }\n }),\n google.maps.event.addDomListener(this.eventDiv_, \"dblclick\", function (e) {\n if (me.marker_.getDraggable() || me.marker_.getClickable()) {\n google.maps.event.trigger(me.marker_, \"dblclick\", e);\n cAbortEvent(e); // Prevent map zoom when double-clicking on a label\n }\n }),\n google.maps.event.addListener(this.marker_, \"dragstart\", function (mEvent) {\n if (!cDraggingLabel) {\n cRaiseEnabled = this.get(\"raiseOnDrag\");\n }\n }),\n google.maps.event.addListener(this.marker_, \"drag\", function (mEvent) {\n if (!cDraggingLabel) {\n if (cRaiseEnabled) {\n me.setPosition(cRaiseOffset);\n // During a drag, the marker's z-index is temporarily set to 1000000 to\n // ensure it appears above all other markers. Also set the label's z-index\n // to 1000000 (plus or minus 1 depending on whether the label is supposed\n // to be above or below the marker).\n me.labelDiv_.style.zIndex = 1000000 + (this.get(\"labelInBackground\") ? -1 : +1);\n }\n }\n }),\n google.maps.event.addListener(this.marker_, \"dragend\", function (mEvent) {\n if (!cDraggingLabel) {\n if (cRaiseEnabled) {\n me.setPosition(0); // Also restores z-index of label\n }\n }\n }),\n google.maps.event.addListener(this.marker_, \"position_changed\", function () {\n me.setPosition();\n }),\n google.maps.event.addListener(this.marker_, \"zindex_changed\", function () {\n me.setZIndex();\n }),\n google.maps.event.addListener(this.marker_, \"visible_changed\", function () {\n me.setVisible();\n }),\n google.maps.event.addListener(this.marker_, \"labelvisible_changed\", function () {\n me.setVisible();\n }),\n google.maps.event.addListener(this.marker_, \"title_changed\", function () {\n me.setTitle();\n }),\n google.maps.event.addListener(this.marker_, \"labelcontent_changed\", function () {\n me.setContent();\n }),\n google.maps.event.addListener(this.marker_, \"labelanchor_changed\", function () {\n me.setAnchor();\n }),\n google.maps.event.addListener(this.marker_, \"labelclass_changed\", function () {\n me.setStyles();\n }),\n google.maps.event.addListener(this.marker_, \"labelstyle_changed\", function () {\n me.setStyles();\n })\n ];\n};\n\n/**\n * Removes the DIV for the label from the DOM. It also removes all event handlers.\n * This method is called automatically when the marker's setMap(null)\n * method is called.\n * @private\n */\nMarkerLabel_.prototype.onRemove = function () {\n var i;\n this.labelDiv_.parentNode.removeChild(this.labelDiv_);\n this.eventDiv_.parentNode.removeChild(this.eventDiv_);\n\n // Remove event listeners:\n for (i = 0; i < this.listeners_.length; i++) {\n google.maps.event.removeListener(this.listeners_[i]);\n }\n};\n\n/**\n * Draws the label on the map.\n * @private\n */\nMarkerLabel_.prototype.draw = function () {\n this.setContent();\n this.setTitle();\n this.setStyles();\n};\n\n/**\n * Sets the content of the label.\n * The content can be plain text or an HTML DOM node.\n * @private\n */\nMarkerLabel_.prototype.setContent = function () {\n var content = this.marker_.get(\"labelContent\");\n if (typeof content.nodeType === \"undefined\") {\n this.labelDiv_.innerHTML = content;\n this.eventDiv_.innerHTML = this.labelDiv_.innerHTML;\n } else {\n this.labelDiv_.innerHTML = \"\"; // Remove current content\n this.labelDiv_.appendChild(content);\n content = content.cloneNode(true);\n this.eventDiv_.innerHTML = \"\"; // Remove current content\n this.eventDiv_.appendChild(content);\n }\n};\n\n/**\n * Sets the content of the tool tip for the label. It is\n * always set to be the same as for the marker itself.\n * @private\n */\nMarkerLabel_.prototype.setTitle = function () {\n this.eventDiv_.title = this.marker_.getTitle() || \"\";\n};\n\n/**\n * Sets the style of the label by setting the style sheet and applying\n * other specific styles requested.\n * @private\n */\nMarkerLabel_.prototype.setStyles = function () {\n var i, labelStyle;\n\n // Apply style values from the style sheet defined in the labelClass parameter:\n this.labelDiv_.className = this.marker_.get(\"labelClass\");\n this.eventDiv_.className = this.labelDiv_.className;\n\n // Clear existing inline style values:\n this.labelDiv_.style.cssText = \"\";\n this.eventDiv_.style.cssText = \"\";\n // Apply style values defined in the labelStyle parameter:\n labelStyle = this.marker_.get(\"labelStyle\");\n for (i in labelStyle) {\n if (labelStyle.hasOwnProperty(i)) {\n this.labelDiv_.style[i] = labelStyle[i];\n this.eventDiv_.style[i] = labelStyle[i];\n }\n }\n this.setMandatoryStyles();\n};\n\n/**\n * Sets the mandatory styles to the DIV representing the label as well as to the\n * associated event DIV. This includes setting the DIV position, z-index, and visibility.\n * @private\n */\nMarkerLabel_.prototype.setMandatoryStyles = function () {\n this.labelDiv_.style.position = \"absolute\";\n this.labelDiv_.style.overflow = \"hidden\";\n // Make sure the opacity setting causes the desired effect on MSIE:\n if (typeof this.labelDiv_.style.opacity !== \"undefined\" && this.labelDiv_.style.opacity !== \"\") {\n this.labelDiv_.style.MsFilter = \"\\\"progid:DXImageTransform.Microsoft.Alpha(opacity=\" + (this.labelDiv_.style.opacity * 100) + \")\\\"\";\n this.labelDiv_.style.filter = \"alpha(opacity=\" + (this.labelDiv_.style.opacity * 100) + \")\";\n }\n\n this.eventDiv_.style.position = this.labelDiv_.style.position;\n this.eventDiv_.style.overflow = this.labelDiv_.style.overflow;\n this.eventDiv_.style.opacity = 0.01; // Don't use 0; DIV won't be clickable on MSIE\n this.eventDiv_.style.MsFilter = \"\\\"progid:DXImageTransform.Microsoft.Alpha(opacity=1)\\\"\";\n this.eventDiv_.style.filter = \"alpha(opacity=1)\"; // For MSIE\n\n this.setAnchor();\n this.setPosition(); // This also updates z-index, if necessary.\n this.setVisible();\n};\n\n/**\n * Sets the anchor point of the label.\n * @private\n */\nMarkerLabel_.prototype.setAnchor = function () {\n var anchor = this.marker_.get(\"labelAnchor\");\n this.labelDiv_.style.marginLeft = -anchor.x + \"px\";\n this.labelDiv_.style.marginTop = -anchor.y + \"px\";\n this.eventDiv_.style.marginLeft = -anchor.x + \"px\";\n this.eventDiv_.style.marginTop = -anchor.y + \"px\";\n};\n\n/**\n * Sets the position of the label. The z-index is also updated, if necessary.\n * @private\n */\nMarkerLabel_.prototype.setPosition = function (yOffset) {\n var position = this.getProjection().fromLatLngToDivPixel(this.marker_.getPosition());\n if (typeof yOffset === \"undefined\") {\n yOffset = 0;\n }\n this.labelDiv_.style.left = Math.round(position.x) + \"px\";\n this.labelDiv_.style.top = Math.round(position.y - yOffset) + \"px\";\n this.eventDiv_.style.left = this.labelDiv_.style.left;\n this.eventDiv_.style.top = this.labelDiv_.style.top;\n\n this.setZIndex();\n};\n\n/**\n * Sets the z-index of the label. If the marker's z-index property has not been defined, the z-index\n * of the label is set to the vertical coordinate of the label. This is in keeping with the default\n * stacking order for Google Maps: markers to the south are in front of markers to the north.\n * @private\n */\nMarkerLabel_.prototype.setZIndex = function () {\n var zAdjust = (this.marker_.get(\"labelInBackground\") ? -1 : +1);\n if (typeof this.marker_.getZIndex() === \"undefined\") {\n this.labelDiv_.style.zIndex = parseInt(this.labelDiv_.style.top, 10) + zAdjust;\n this.eventDiv_.style.zIndex = this.labelDiv_.style.zIndex;\n } else {\n this.labelDiv_.style.zIndex = this.marker_.getZIndex() + zAdjust;\n this.eventDiv_.style.zIndex = this.labelDiv_.style.zIndex;\n }\n};\n\n/**\n * Sets the visibility of the label. The label is visible only if the marker itself is\n * visible (i.e., its visible property is true) and the labelVisible property is true.\n * @private\n */\nMarkerLabel_.prototype.setVisible = function () {\n if (this.marker_.get(\"labelVisible\")) {\n this.labelDiv_.style.display = this.marker_.getVisible() ? \"block\" : \"none\";\n } else {\n this.labelDiv_.style.display = \"none\";\n }\n this.eventDiv_.style.display = this.labelDiv_.style.display;\n};\n\n/**\n * @name MarkerWithLabelOptions\n * @class This class represents the optional parameter passed to the {@link MarkerWithLabel} constructor.\n * The properties available are the same as for google.maps.Marker with the addition\n * of the properties listed below. To change any of these additional properties after the labeled\n * marker has been created, call google.maps.Marker.set(propertyName, propertyValue).\n *

\n * When any of these properties changes, a property changed event is fired. The names of these\n * events are derived from the name of the property and are of the form propertyname_changed.\n * For example, if the content of the label changes, a labelcontent_changed event\n * is fired.\n *

\n * @property {string|Node} [labelContent] The content of the label (plain text or an HTML DOM node).\n * @property {Point} [labelAnchor] By default, a label is drawn with its anchor point at (0,0) so\n * that its top left corner is positioned at the anchor point of the associated marker. Use this\n * property to change the anchor point of the label. For example, to center a 50px-wide label\n * beneath a marker, specify a labelAnchor of google.maps.Point(25, 0).\n * (Note: x-values increase to the right and y-values increase to the top.)\n * @property {string} [labelClass] The name of the CSS class defining the styles for the label.\n * Note that style values for position, overflow, top,\n * left, zIndex, display, marginLeft, and\n * marginTop are ignored; these styles are for internal use only.\n * @property {Object} [labelStyle] An object literal whose properties define specific CSS\n * style values to be applied to the label. Style values defined here override those that may\n * be defined in the labelClass style sheet. If this property is changed after the\n * label has been created, all previously set styles (except those defined in the style sheet)\n * are removed from the label before the new style values are applied.\n * Note that style values for position, overflow, top,\n * left, zIndex, display, marginLeft, and\n * marginTop are ignored; these styles are for internal use only.\n * @property {boolean} [labelInBackground] A flag indicating whether a label that overlaps its\n * associated marker should appear in the background (i.e., in a plane below the marker).\n * The default is false, which causes the label to appear in the foreground.\n * @property {boolean} [labelVisible] A flag indicating whether the label is to be visible.\n * The default is true. Note that even if labelVisible is\n * true, the label will not be visible unless the associated marker is also\n * visible (i.e., unless the marker's visible property is true).\n * @property {boolean} [raiseOnDrag] A flag indicating whether the label and marker are to be\n * raised when the marker is dragged. The default is true. If a draggable marker is\n * being created and a version of Google Maps API earlier than V3.3 is being used, this property\n * must be set to false.\n * @property {boolean} [optimized] A flag indicating whether rendering is to be optimized for the\n * marker. Important: The optimized rendering technique is not supported by MarkerWithLabel,\n * so the value of this parameter is always forced to false.\n * @property {string} [crossImage=\"http://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png/"]\n * The URL of the cross image to be displayed while dragging a marker.\n * @property {string} [handCursor=\"http://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur/"]\n * The URL of the cursor to be displayed while dragging a marker.\n */\n/**\n * Creates a MarkerWithLabel with the options specified in {@link MarkerWithLabelOptions}.\n * @constructor\n * @param {MarkerWithLabelOptions} [opt_options] The optional parameters.\n */\nfunction MarkerWithLabel(opt_options) {\n opt_options = opt_options || {};\n opt_options.labelContent = opt_options.labelContent || \"\";\n opt_options.labelAnchor = opt_options.labelAnchor || new google.maps.Point(0, 0);\n opt_options.labelClass = opt_options.labelClass || \"markerLabels\";\n opt_options.labelStyle = opt_options.labelStyle || {};\n opt_options.labelInBackground = opt_options.labelInBackground || false;\n if (typeof opt_options.labelVisible === \"undefined\") {\n opt_options.labelVisible = true;\n }\n if (typeof opt_options.raiseOnDrag === \"undefined\") {\n opt_options.raiseOnDrag = true;\n }\n if (typeof opt_options.clickable === \"undefined\") {\n opt_options.clickable = true;\n }\n if (typeof opt_options.draggable === \"undefined\") {\n opt_options.draggable = false;\n }\n if (typeof opt_options.optimized === \"undefined\") {\n opt_options.optimized = false;\n }\n opt_options.crossImage = opt_options.crossImage || \"http\" + (document.location.protocol === \"https:\" ? \"s\" : \"\") + \"://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png\";\n opt_options.handCursor = opt_options.handCursor || \"http\" + (document.location.protocol === \"https:\" ? \"s\" : \"\") + \"://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur\";\n opt_options.optimized = false; // Optimized rendering is not supported\n\n this.label = new MarkerLabel_(this, opt_options.crossImage, opt_options.handCursor); // Bind the label to the marker\n\n // Call the parent constructor. It calls Marker.setValues to initialize, so all\n // the new parameters are conveniently saved and can be accessed with get/set.\n // Marker.set triggers a property changed event (called \"propertyname_changed\")\n // that the marker label listens for in order to react to state changes.\n google.maps.Marker.apply(this, arguments);\n}\n\ninherits(MarkerWithLabel, google.maps.Marker);\n\n/**\n * Overrides the standard Marker setMap function.\n * @param {Map} theMap The map to which the marker is to be added.\n * @private\n */\nMarkerWithLabel.prototype.setMap = function (theMap) {\n\n // Call the inherited function...\n google.maps.Marker.prototype.setMap.apply(this, arguments);\n\n // ... then deal with the label:\n this.label.setMap(theMap);\n};\n\n// ==ClosureCompiler==\n// @compilation_level ADVANCED_OPTIMIZATIONS\n// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/maps/google_maps_api_v3.js\n// @output_wrapper (function() {%output%})();\n// ==/ClosureCompiler==\n\n/**\n * @license\n * Copyright 2013 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * A RichMarker that allows any HTML/DOM to be added to a map and be draggable.\n *\n * @param {Object.=} opt_options Optional properties to set.\n * @extends {google.maps.OverlayView}\n * @constructor\n */\nfunction RichMarker(opt_options) {\n var options = opt_options || {};\n\n /**\n * @type {boolean}\n * @private\n */\n this.ready_ = false;\n\n /**\n * @type {boolean}\n * @private\n */\n this.dragging_ = false;\n\n if (opt_options['visible'] == undefined) {\n opt_options['visible'] = true;\n }\n\n if (opt_options['shadow'] == undefined) {\n opt_options['shadow'] = '7px -3px 5px rgba(88,88,88,0.7)';\n }\n\n if (opt_options['anchor'] == undefined) {\n opt_options['anchor'] = RichMarkerPosition['BOTTOM'];\n }\n\n this.setValues(options);\n}\nRichMarker.prototype = new google.maps.OverlayView();\nwindow['RichMarker'] = RichMarker;\n\n\n/**\n * Returns the current visibility state of the marker.\n *\n * @return {boolean} The visiblity of the marker.\n */\nRichMarker.prototype.getVisible = function() {\n return /** @type {boolean} */ (this.get('visible'));\n};\nRichMarker.prototype['getVisible'] = RichMarker.prototype.getVisible;\n\n\n/**\n * Sets the visiblility state of the marker.\n *\n * @param {boolean} visible The visiblilty of the marker.\n */\nRichMarker.prototype.setVisible = function(visible) {\n this.set('visible', visible);\n};\nRichMarker.prototype['setVisible'] = RichMarker.prototype.setVisible;\n\n\n/**\n * The visible changed event.\n */\nRichMarker.prototype.visible_changed = function() {\n if (this.ready_) {\n this.markerWrapper_.style['display'] = this.getVisible() ? '' : 'none';\n this.draw();\n }\n};\nRichMarker.prototype['visible_changed'] = RichMarker.prototype.visible_changed;\n\n\n/**\n * Sets the marker to be flat.\n *\n * @param {boolean} flat If the marker is to be flat or not.\n */\nRichMarker.prototype.setFlat = function(flat) {\n this.set('flat', !!flat);\n};\nRichMarker.prototype['setFlat'] = RichMarker.prototype.setFlat;\n\n\n/**\n * If the makrer is flat or not.\n *\n * @return {boolean} True the marker is flat.\n */\nRichMarker.prototype.getFlat = function() {\n return /** @type {boolean} */ (this.get('flat'));\n};\nRichMarker.prototype['getFlat'] = RichMarker.prototype.getFlat;\n\n\n/**\n * Get the width of the marker.\n *\n * @return {Number} The width of the marker.\n */\nRichMarker.prototype.getWidth = function() {\n return /** @type {Number} */ (this.get('width'));\n};\nRichMarker.prototype['getWidth'] = RichMarker.prototype.getWidth;\n\n\n/**\n * Get the height of the marker.\n *\n * @return {Number} The height of the marker.\n */\nRichMarker.prototype.getHeight = function() {\n return /** @type {Number} */ (this.get('height'));\n};\nRichMarker.prototype['getHeight'] = RichMarker.prototype.getHeight;\n\n\n/**\n * Sets the marker's box shadow.\n *\n * @param {string} shadow The box shadow to set.\n */\nRichMarker.prototype.setShadow = function(shadow) {\n this.set('shadow', shadow);\n this.flat_changed();\n};\nRichMarker.prototype['setShadow'] = RichMarker.prototype.setShadow;\n\n\n/**\n * Gets the marker's box shadow.\n *\n * @return {string} The box shadow.\n */\nRichMarker.prototype.getShadow = function() {\n return /** @type {string} */ (this.get('shadow'));\n};\nRichMarker.prototype['getShadow'] = RichMarker.prototype.getShadow;\n\n\n/**\n * Flat changed event.\n */\nRichMarker.prototype.flat_changed = function() {\n if (!this.ready_) {\n return;\n }\n\n this.markerWrapper_.style['boxShadow'] =\n this.markerWrapper_.style['webkitBoxShadow'] =\n this.markerWrapper_.style['MozBoxShadow'] =\n this.getFlat() ? '' : this.getShadow();\n};\nRichMarker.prototype['flat_changed'] = RichMarker.prototype.flat_changed;\n\n\n/**\n * Sets the zIndex of the marker.\n *\n * @param {Number} index The index to set.\n */\nRichMarker.prototype.setZIndex = function(index) {\n this.set('zIndex', index);\n};\nRichMarker.prototype['setZIndex'] = RichMarker.prototype.setZIndex;\n\n\n/**\n * Gets the zIndex of the marker.\n *\n * @return {Number} The zIndex of the marker.\n */\nRichMarker.prototype.getZIndex = function() {\n return /** @type {Number} */ (this.get('zIndex'));\n};\nRichMarker.prototype['getZIndex'] = RichMarker.prototype.getZIndex;\n\n\n/**\n * zIndex changed event.\n */\nRichMarker.prototype.zIndex_changed = function() {\n if (this.getZIndex() && this.ready_) {\n this.markerWrapper_.style.zIndex = this.getZIndex();\n }\n};\nRichMarker.prototype['zIndex_changed'] = RichMarker.prototype.zIndex_changed;\n\n/**\n * Whether the marker is draggable or not.\n *\n * @return {boolean} True if the marker is draggable.\n */\nRichMarker.prototype.getDraggable = function() {\n return /** @type {boolean} */ (this.get('draggable'));\n};\nRichMarker.prototype['getDraggable'] = RichMarker.prototype.getDraggable;\n\n\n/**\n * Sets the marker to be draggable or not.\n *\n * @param {boolean} draggable If the marker is draggable or not.\n */\nRichMarker.prototype.setDraggable = function(draggable) {\n this.set('draggable', !!draggable);\n};\nRichMarker.prototype['setDraggable'] = RichMarker.prototype.setDraggable;\n\n\n/**\n * Draggable property changed callback.\n */\nRichMarker.prototype.draggable_changed = function() {\n if (this.ready_) {\n if (this.getDraggable()) {\n this.addDragging_(this.markerWrapper_);\n } else {\n this.removeDragListeners_();\n }\n }\n};\nRichMarker.prototype['draggable_changed'] =\n RichMarker.prototype.draggable_changed;\n\n\n/**\n * Gets the postiton of the marker.\n *\n * @return {google.maps.LatLng} The position of the marker.\n */\nRichMarker.prototype.getPosition = function() {\n return /** @type {google.maps.LatLng} */ (this.get('position'));\n};\nRichMarker.prototype['getPosition'] = RichMarker.prototype.getPosition;\n\n\n/**\n * Sets the position of the marker.\n *\n * @param {google.maps.LatLng} position The position to set.\n */\nRichMarker.prototype.setPosition = function(position) {\n this.set('position', position);\n};\nRichMarker.prototype['setPosition'] = RichMarker.prototype.setPosition;\n\n\n/**\n * Position changed event.\n */\nRichMarker.prototype.position_changed = function() {\n this.draw();\n};\nRichMarker.prototype['position_changed'] =\n RichMarker.prototype.position_changed;\n\n\n/**\n * Gets the anchor.\n *\n * @return {google.maps.Size} The position of the anchor.\n */\nRichMarker.prototype.getAnchor = function() {\n return /** @type {google.maps.Size} */ (this.get('anchor'));\n};\nRichMarker.prototype['getAnchor'] = RichMarker.prototype.getAnchor;\n\n\n/**\n * Sets the anchor.\n *\n * @param {RichMarkerPosition|google.maps.Size} anchor The anchor to set.\n */\nRichMarker.prototype.setAnchor = function(anchor) {\n this.set('anchor', anchor);\n};\nRichMarker.prototype['setAnchor'] = RichMarker.prototype.setAnchor;\n\n\n/**\n * Anchor changed event.\n */\nRichMarker.prototype.anchor_changed = function() {\n this.draw();\n};\nRichMarker.prototype['anchor_changed'] = RichMarker.prototype.anchor_changed;\n\n\n/**\n * Converts a HTML string to a document fragment.\n *\n * @param {string} htmlString The HTML string to convert.\n * @return {Node} A HTML document fragment.\n * @private\n */\nRichMarker.prototype.htmlToDocumentFragment_ = function(htmlString) {\n var tempDiv = document.createElement('DIV');\n tempDiv.innerHTML = htmlString;\n if (tempDiv.childNodes.length == 1) {\n return /** @type {!Node} */ (tempDiv.removeChild(tempDiv.firstChild));\n } else {\n var fragment = document.createDocumentFragment();\n while (tempDiv.firstChild) {\n fragment.appendChild(tempDiv.firstChild);\n }\n return fragment;\n }\n};\n\n\n/**\n * Removes all children from the node.\n *\n * @param {Node} node The node to remove all children from.\n * @private\n */\nRichMarker.prototype.removeChildren_ = function(node) {\n if (!node) {\n return;\n }\n\n var child;\n while (child = node.firstChild) {\n node.removeChild(child);\n }\n};\n\n\n/**\n * Sets the content of the marker.\n *\n * @param {string|Node} content The content to set.\n */\nRichMarker.prototype.setContent = function(content) {\n this.set('content', content);\n};\nRichMarker.prototype['setContent'] = RichMarker.prototype.setContent;\n\n\n/**\n * Get the content of the marker.\n *\n * @return {string|Node} The marker content.\n */\nRichMarker.prototype.getContent = function() {\n return /** @type {Node|string} */ (this.get('content'));\n};\nRichMarker.prototype['getContent'] = RichMarker.prototype.getContent;\n\n\n/**\n * Sets the marker content and adds loading events to images\n */\nRichMarker.prototype.content_changed = function() {\n if (!this.markerContent_) {\n // Marker content area doesnt exist.\n return;\n }\n\n this.removeChildren_(this.markerContent_);\n var content = this.getContent();\n if (content) {\n if (typeof content == 'string') {\n content = content.replace(/^\\s*([\\S\\s]*)\\b\\s*$/, '$1');\n content = this.htmlToDocumentFragment_(content);\n }\n this.markerContent_.appendChild(content);\n\n var that = this;\n var images = this.markerContent_.getElementsByTagName('IMG');\n for (var i = 0, image; image = images[i]; i++) {\n // By default, a browser lets a image be dragged outside of the browser,\n // so by calling preventDefault we stop this behaviour and allow the image\n // to be dragged around the map and now out of the browser and onto the\n // desktop.\n google.maps.event.addDomListener(image, 'mousedown', function(e) {\n if (that.getDraggable()) {\n if (e.preventDefault) {\n e.preventDefault();\n }\n e.returnValue = false;\n }\n });\n\n // Because we don't know the size of an image till it loads, add a\n // listener to the image load so the marker can resize and reposition\n // itself to be the correct height.\n google.maps.event.addDomListener(image, 'load', function() {\n that.draw();\n });\n }\n\n google.maps.event.trigger(this, 'domready');\n }\n\n if (this.ready_) {\n this.draw();\n }\n};\nRichMarker.prototype['content_changed'] = RichMarker.prototype.content_changed;\n\n/**\n * Sets the cursor.\n *\n * @param {string} whichCursor What cursor to show.\n * @private\n */\nRichMarker.prototype.setCursor_ = function(whichCursor) {\n if (!this.ready_) {\n return;\n }\n\n var cursor = '';\n if (navigator.userAgent.indexOf('Gecko/') !== -1) {\n // Moz has some nice cursors :)\n if (whichCursor == 'dragging') {\n cursor = '-moz-grabbing';\n }\n\n if (whichCursor == 'dragready') {\n cursor = '-moz-grab';\n }\n\n if (whichCursor == 'draggable') {\n cursor = 'pointer';\n }\n } else {\n if (whichCursor == 'dragging' || whichCursor == 'dragready') {\n cursor = 'move';\n }\n\n if (whichCursor == 'draggable') {\n cursor = 'pointer';\n }\n }\n\n if (this.markerWrapper_.style.cursor != cursor) {\n this.markerWrapper_.style.cursor = cursor;\n }\n};\n\n/**\n * Start dragging.\n *\n * @param {Event} e The event.\n */\nRichMarker.prototype.startDrag = function(e) {\n if (!this.getDraggable()) {\n return;\n }\n\n if (!this.dragging_) {\n this.dragging_ = true;\n var map = this.getMap();\n this.mapDraggable_ = map.get('draggable');\n map.set('draggable', false);\n\n // Store the current mouse position\n this.mouseX_ = e.clientX;\n this.mouseY_ = e.clientY;\n\n this.setCursor_('dragready');\n\n // Stop the text from being selectable while being dragged\n this.markerWrapper_.style['MozUserSelect'] = 'none';\n this.markerWrapper_.style['KhtmlUserSelect'] = 'none';\n this.markerWrapper_.style['WebkitUserSelect'] = 'none';\n\n this.markerWrapper_['unselectable'] = 'on';\n this.markerWrapper_['onselectstart'] = function() {\n return false;\n };\n\n this.addDraggingListeners_();\n\n google.maps.event.trigger(this, 'dragstart');\n }\n};\n\n\n/**\n * Stop dragging.\n */\nRichMarker.prototype.stopDrag = function() {\n if (!this.getDraggable()) {\n return;\n }\n\n if (this.dragging_) {\n this.dragging_ = false;\n this.getMap().set('draggable', this.mapDraggable_);\n this.mouseX_ = this.mouseY_ = this.mapDraggable_ = null;\n\n // Allow the text to be selectable again\n this.markerWrapper_.style['MozUserSelect'] = '';\n this.markerWrapper_.style['KhtmlUserSelect'] = '';\n this.markerWrapper_.style['WebkitUserSelect'] = '';\n this.markerWrapper_['unselectable'] = 'off';\n this.markerWrapper_['onselectstart'] = function() {};\n\n this.removeDraggingListeners_();\n\n this.setCursor_('draggable');\n google.maps.event.trigger(this, 'dragend');\n\n this.draw();\n }\n};\n\n\n/**\n * Handles the drag event.\n *\n * @param {Event} e The event.\n */\nRichMarker.prototype.drag = function(e) {\n if (!this.getDraggable() || !this.dragging_) {\n // This object isn't draggable or we have stopped dragging\n this.stopDrag();\n return;\n }\n\n var dx = this.mouseX_ - e.clientX;\n var dy = this.mouseY_ - e.clientY;\n\n this.mouseX_ = e.clientX;\n this.mouseY_ = e.clientY;\n\n var left = parseInt(this.markerWrapper_.style['left'], 10) - dx;\n var top = parseInt(this.markerWrapper_.style['top'], 10) - dy;\n\n this.markerWrapper_.style['left'] = left + 'px';\n this.markerWrapper_.style['top'] = top + 'px';\n\n var offset = this.getOffset_();\n\n // Set the position property and adjust for the anchor offset\n var point = new google.maps.Point(left - offset.width, top - offset.height);\n var projection = this.getProjection();\n this.setPosition(projection.fromDivPixelToLatLng(point));\n\n this.setCursor_('dragging');\n google.maps.event.trigger(this, 'drag');\n};\n\n\n/**\n * Removes the drag listeners associated with the marker.\n *\n * @private\n */\nRichMarker.prototype.removeDragListeners_ = function() {\n if (this.draggableListener_) {\n google.maps.event.removeListener(this.draggableListener_);\n delete this.draggableListener_;\n }\n this.setCursor_('');\n};\n\n\n/**\n * Add dragability events to the marker.\n *\n * @param {Node} node The node to apply dragging to.\n * @private\n */\nRichMarker.prototype.addDragging_ = function(node) {\n if (!node) {\n return;\n }\n\n var that = this;\n this.draggableListener_ =\n google.maps.event.addDomListener(node, 'mousedown', function(e) {\n that.startDrag(e);\n });\n\n this.setCursor_('draggable');\n};\n\n\n/**\n * Add dragging listeners.\n *\n * @private\n */\nRichMarker.prototype.addDraggingListeners_ = function() {\n var that = this;\n if (this.markerWrapper_.setCapture) {\n this.markerWrapper_.setCapture(true);\n this.draggingListeners_ = [\n google.maps.event.addDomListener(this.markerWrapper_, 'mousemove', function(e) {\n that.drag(e);\n }, true),\n google.maps.event.addDomListener(this.markerWrapper_, 'mouseup', function() {\n that.stopDrag();\n that.markerWrapper_.releaseCapture();\n }, true)\n ];\n } else {\n this.draggingListeners_ = [\n google.maps.event.addDomListener(window, 'mousemove', function(e) {\n that.drag(e);\n }, true),\n google.maps.event.addDomListener(window, 'mouseup', function() {\n that.stopDrag();\n }, true)\n ];\n }\n};\n\n\n/**\n * Remove dragging listeners.\n *\n * @private\n */\nRichMarker.prototype.removeDraggingListeners_ = function() {\n if (this.draggingListeners_) {\n for (var i = 0, listener; listener = this.draggingListeners_[i]; i++) {\n google.maps.event.removeListener(listener);\n }\n this.draggingListeners_.length = 0;\n }\n};\n\n\n/**\n * Get the anchor offset.\n *\n * @return {google.maps.Size} The size offset.\n * @private\n */\nRichMarker.prototype.getOffset_ = function() {\n var anchor = this.getAnchor();\n if (typeof anchor == 'object') {\n return /** @type {google.maps.Size} */ (anchor);\n }\n\n var offset = new google.maps.Size(0, 0);\n if (!this.markerContent_) {\n return offset;\n }\n\n var width = this.markerContent_.offsetWidth;\n var height = this.markerContent_.offsetHeight;\n\n switch (anchor) {\n case RichMarkerPosition['TOP_LEFT']:\n break;\n case RichMarkerPosition['TOP']:\n offset.width = -width / 2;\n break;\n case RichMarkerPosition['TOP_RIGHT']:\n offset.width = -width;\n break;\n case RichMarkerPosition['LEFT']:\n offset.height = -height / 2;\n break;\n case RichMarkerPosition['MIDDLE']:\n offset.width = -width / 2;\n offset.height = -height / 2;\n break;\n case RichMarkerPosition['RIGHT']:\n offset.width = -width;\n offset.height = -height / 2;\n break;\n case RichMarkerPosition['BOTTOM_LEFT']:\n offset.height = -height;\n break;\n case RichMarkerPosition['BOTTOM']:\n offset.width = -width / 2;\n offset.height = -height;\n break;\n case RichMarkerPosition['BOTTOM_RIGHT']:\n offset.width = -width;\n offset.height = -height;\n break;\n }\n\n return offset;\n};\n\n\n/**\n * Adding the marker to a map.\n * Implementing the interface.\n */\nRichMarker.prototype.onAdd = function() {\n if (!this.markerWrapper_) {\n this.markerWrapper_ = document.createElement('DIV');\n this.markerWrapper_.style['position'] = 'absolute';\n }\n\n if (this.getZIndex()) {\n this.markerWrapper_.style['zIndex'] = this.getZIndex();\n }\n\n this.markerWrapper_.style['display'] = this.getVisible() ? '' : 'none';\n\n if (!this.markerContent_) {\n this.markerContent_ = document.createElement('DIV');\n this.markerWrapper_.appendChild(this.markerContent_);\n\n var that = this;\n google.maps.event.addDomListener(this.markerContent_, 'click', function(e) {\n google.maps.event.trigger(that, 'click');\n });\n google.maps.event.addDomListener(this.markerContent_, 'mouseover', function(e) {\n google.maps.event.trigger(that, 'mouseover');\n });\n google.maps.event.addDomListener(this.markerContent_, 'mouseout', function(e) {\n google.maps.event.trigger(that, 'mouseout');\n });\n }\n\n this.ready_ = true;\n this.content_changed();\n this.flat_changed();\n this.draggable_changed();\n\n var panes = this.getPanes();\n if (panes) {\n panes.overlayMouseTarget.appendChild(this.markerWrapper_);\n }\n\n google.maps.event.trigger(this, 'ready');\n};\nRichMarker.prototype['onAdd'] = RichMarker.prototype.onAdd;\n\n\n/**\n * Impelementing the interface.\n */\nRichMarker.prototype.draw = function() {\n if (!this.ready_ || this.dragging_) {\n return;\n }\n\n var projection = this.getProjection();\n\n if (!projection) {\n // The map projection is not ready yet so do nothing\n return;\n }\n\n var latLng = /** @type {google.maps.LatLng} */ (this.get('position'));\n var pos = projection.fromLatLngToDivPixel(latLng);\n\n var offset = this.getOffset_();\n this.markerWrapper_.style['top'] = (pos.y + offset.height) + 'px';\n this.markerWrapper_.style['left'] = (pos.x + offset.width) + 'px';\n\n var height = this.markerContent_.offsetHeight;\n var width = this.markerContent_.offsetWidth;\n\n if (width != this.get('width')) {\n this.set('width', width);\n }\n\n if (height != this.get('height')) {\n this.set('height', height);\n }\n};\nRichMarker.prototype['draw'] = RichMarker.prototype.draw;\n\n\n/**\n * Removing a marker from the map.\n * Implementing the interface.\n */\nRichMarker.prototype.onRemove = function() {\n if (this.markerWrapper_ && this.markerWrapper_.parentNode) {\n this.markerWrapper_.parentNode.removeChild(this.markerWrapper_);\n }\n this.removeDragListeners_();\n};\nRichMarker.prototype['onRemove'] = RichMarker.prototype.onRemove;\n\n\n/**\n * RichMarker Anchor positions\n * @enum {number}\n */\nvar RichMarkerPosition = {\n 'TOP_LEFT': 1,\n 'TOP': 2,\n 'TOP_RIGHT': 3,\n 'LEFT': 4,\n 'MIDDLE': 5,\n 'RIGHT': 6,\n 'BOTTOM_LEFT': 7,\n 'BOTTOM': 8,\n 'BOTTOM_RIGHT': 9\n};\nwindow['RichMarkerPosition'] = RichMarkerPosition;\n\n\n //TODO: export / passthese on in the service instead of window\n window.InfoBox = InfoBox;\n window.Cluster = Cluster;\n window.ClusterIcon = ClusterIcon;\n window.MarkerClusterer = MarkerClusterer;\n window.MarkerLabel_ = MarkerLabel_;\n window.MarkerWithLabel = MarkerWithLabel;\n window.RichMarker = RichMarker;\n }();\n //END REPLACE\n })\n };\n});\n","/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* istanbul ignore next */\n\tangular.module('uiGmapgoogle-maps.wrapped')\n\t.service('uiGmapDataStructures', function() {\n\treturn {\n\t Graph: __webpack_require__(1).Graph,\n\t Queue: __webpack_require__(1).Queue\n\t};\n\t});\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t(function() {\n\t module.exports = {\n\t Graph: __webpack_require__(2),\n\t Heap: __webpack_require__(3),\n\t LinkedList: __webpack_require__(4),\n\t Map: __webpack_require__(5),\n\t Queue: __webpack_require__(6),\n\t RedBlackTree: __webpack_require__(7),\n\t Trie: __webpack_require__(8)\n\t };\n\n\t}).call(this);\n\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t/*\n\tGraph implemented as a modified incidence list. O(1) for every typical\n\toperation except `removeNode()` at O(E) where E is the number of edges.\n\n\t## Overview example:\n\n\t```js\n\tvar graph = new Graph;\n\tgraph.addNode('A'); // => a node object. For more info, log the output or check\n\t // the documentation for addNode\n\tgraph.addNode('B');\n\tgraph.addNode('C');\n\tgraph.addEdge('A', 'C'); // => an edge object\n\tgraph.addEdge('A', 'B');\n\tgraph.getEdge('B', 'A'); // => undefined. Directed edge!\n\tgraph.getEdge('A', 'B'); // => the edge object previously added\n\tgraph.getEdge('A', 'B').weight = 2 // weight is the only built-in handy property\n\t // of an edge object. Feel free to attach\n\t // other properties\n\tgraph.getInEdgesOf('B'); // => array of edge objects, in this case only one;\n\t // connecting A to B\n\tgraph.getOutEdgesOf('A'); // => array of edge objects, one to B and one to C\n\tgraph.getAllEdgesOf('A'); // => all the in and out edges. Edge directed toward\n\t // the node itself are only counted once\n\tforEachNode(function(nodeObject) {\n\t console.log(node);\n\t});\n\tforEachEdge(function(edgeObject) {\n\t console.log(edgeObject);\n\t});\n\tgraph.removeNode('C'); // => 'C'. The edge between A and C also removed\n\tgraph.removeEdge('A', 'B'); // => the edge object removed\n\t```\n\n\t## Properties:\n\n\t- nodeSize: total number of nodes.\n\t- edgeSize: total number of edges.\n\t*/\n\n\n\t(function() {\n\t var Graph,\n\t __hasProp = {}.hasOwnProperty;\n\n\t Graph = (function() {\n\t function Graph() {\n\t this._nodes = {};\n\t this.nodeSize = 0;\n\t this.edgeSize = 0;\n\t }\n\n\t Graph.prototype.addNode = function(id) {\n\t /*\n\t The `id` is a unique identifier for the node, and should **not** change\n\t after it's added. It will be used for adding, retrieving and deleting\n\t related edges too.\n\t \n\t **Note** that, internally, the ids are kept in an object. JavaScript's\n\t object hashes the id `'2'` and `2` to the same key, so please stick to a\n\t simple id data type such as number or string.\n\t \n\t _Returns:_ the node object. Feel free to attach additional custom properties\n\t on it for graph algorithms' needs. **Undefined if node id already exists**,\n\t as to avoid accidental overrides.\n\t */\n\n\t if (!this._nodes[id]) {\n\t this.nodeSize++;\n\t return this._nodes[id] = {\n\t _outEdges: {},\n\t _inEdges: {}\n\t };\n\t }\n\t };\n\n\t Graph.prototype.getNode = function(id) {\n\t /*\n\t _Returns:_ the node object. Feel free to attach additional custom properties\n\t on it for graph algorithms' needs.\n\t */\n\n\t return this._nodes[id];\n\t };\n\n\t Graph.prototype.removeNode = function(id) {\n\t /*\n\t _Returns:_ the node object removed, or undefined if it didn't exist in the\n\t first place.\n\t */\n\n\t var inEdgeId, nodeToRemove, outEdgeId, _ref, _ref1;\n\t nodeToRemove = this._nodes[id];\n\t if (!nodeToRemove) {\n\t return;\n\t } else {\n\t _ref = nodeToRemove._outEdges;\n\t for (outEdgeId in _ref) {\n\t if (!__hasProp.call(_ref, outEdgeId)) continue;\n\t this.removeEdge(id, outEdgeId);\n\t }\n\t _ref1 = nodeToRemove._inEdges;\n\t for (inEdgeId in _ref1) {\n\t if (!__hasProp.call(_ref1, inEdgeId)) continue;\n\t this.removeEdge(inEdgeId, id);\n\t }\n\t this.nodeSize--;\n\t delete this._nodes[id];\n\t }\n\t return nodeToRemove;\n\t };\n\n\t Graph.prototype.addEdge = function(fromId, toId, weight) {\n\t var edgeToAdd, fromNode, toNode;\n\t if (weight == null) {\n\t weight = 1;\n\t }\n\t /*\n\t `fromId` and `toId` are the node id specified when it was created using\n\t `addNode()`. `weight` is optional and defaults to 1. Ignoring it effectively\n\t makes this an unweighted graph. Under the hood, `weight` is just a normal\n\t property of the edge object.\n\t \n\t _Returns:_ the edge object created. Feel free to attach additional custom\n\t properties on it for graph algorithms' needs. **Or undefined** if the nodes\n\t of id `fromId` or `toId` aren't found, or if an edge already exists between\n\t the two nodes.\n\t */\n\n\t if (this.getEdge(fromId, toId)) {\n\t return;\n\t }\n\t fromNode = this._nodes[fromId];\n\t toNode = this._nodes[toId];\n\t if (!fromNode || !toNode) {\n\t return;\n\t }\n\t edgeToAdd = {\n\t weight: weight\n\t };\n\t fromNode._outEdges[toId] = edgeToAdd;\n\t toNode._inEdges[fromId] = edgeToAdd;\n\t this.edgeSize++;\n\t return edgeToAdd;\n\t };\n\n\t Graph.prototype.getEdge = function(fromId, toId) {\n\t /*\n\t _Returns:_ the edge object, or undefined if the nodes of id `fromId` or\n\t `toId` aren't found.\n\t */\n\n\t var fromNode, toNode;\n\t fromNode = this._nodes[fromId];\n\t toNode = this._nodes[toId];\n\t if (!fromNode || !toNode) {\n\n\t } else {\n\t return fromNode._outEdges[toId];\n\t }\n\t };\n\n\t Graph.prototype.removeEdge = function(fromId, toId) {\n\t /*\n\t _Returns:_ the edge object removed, or undefined of edge wasn't found.\n\t */\n\n\t var edgeToDelete, fromNode, toNode;\n\t fromNode = this._nodes[fromId];\n\t toNode = this._nodes[toId];\n\t edgeToDelete = this.getEdge(fromId, toId);\n\t if (!edgeToDelete) {\n\t return;\n\t }\n\t delete fromNode._outEdges[toId];\n\t delete toNode._inEdges[fromId];\n\t this.edgeSize--;\n\t return edgeToDelete;\n\t };\n\n\t Graph.prototype.getInEdgesOf = function(nodeId) {\n\t /*\n\t _Returns:_ an array of edge objects that are directed toward the node, or\n\t empty array if no such edge or node exists.\n\t */\n\n\t var fromId, inEdges, toNode, _ref;\n\t toNode = this._nodes[nodeId];\n\t inEdges = [];\n\t _ref = toNode != null ? toNode._inEdges : void 0;\n\t for (fromId in _ref) {\n\t if (!__hasProp.call(_ref, fromId)) continue;\n\t inEdges.push(this.getEdge(fromId, nodeId));\n\t }\n\t return inEdges;\n\t };\n\n\t Graph.prototype.getOutEdgesOf = function(nodeId) {\n\t /*\n\t _Returns:_ an array of edge objects that go out of the node, or empty array\n\t if no such edge or node exists.\n\t */\n\n\t var fromNode, outEdges, toId, _ref;\n\t fromNode = this._nodes[nodeId];\n\t outEdges = [];\n\t _ref = fromNode != null ? fromNode._outEdges : void 0;\n\t for (toId in _ref) {\n\t if (!__hasProp.call(_ref, toId)) continue;\n\t outEdges.push(this.getEdge(nodeId, toId));\n\t }\n\t return outEdges;\n\t };\n\n\t Graph.prototype.getAllEdgesOf = function(nodeId) {\n\t /*\n\t **Note:** not the same as concatenating `getInEdgesOf()` and\n\t `getOutEdgesOf()`. Some nodes might have an edge pointing toward itself.\n\t This method solves that duplication.\n\t \n\t _Returns:_ an array of edge objects linked to the node, no matter if they're\n\t outgoing or coming. Duplicate edge created by self-pointing nodes are\n\t removed. Only one copy stays. Empty array if node has no edge.\n\t */\n\n\t var i, inEdges, outEdges, selfEdge, _i, _ref, _ref1;\n\t inEdges = this.getInEdgesOf(nodeId);\n\t outEdges = this.getOutEdgesOf(nodeId);\n\t if (inEdges.length === 0) {\n\t return outEdges;\n\t }\n\t selfEdge = this.getEdge(nodeId, nodeId);\n\t for (i = _i = 0, _ref = inEdges.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {\n\t if (inEdges[i] === selfEdge) {\n\t _ref1 = [inEdges[inEdges.length - 1], inEdges[i]], inEdges[i] = _ref1[0], inEdges[inEdges.length - 1] = _ref1[1];\n\t inEdges.pop();\n\t break;\n\t }\n\t }\n\t return inEdges.concat(outEdges);\n\t };\n\n\t Graph.prototype.forEachNode = function(operation) {\n\t /*\n\t Traverse through the graph in an arbitrary manner, visiting each node once.\n\t Pass a function of the form `fn(nodeObject, nodeId)`.\n\t \n\t _Returns:_ undefined.\n\t */\n\n\t var nodeId, nodeObject, _ref;\n\t _ref = this._nodes;\n\t for (nodeId in _ref) {\n\t if (!__hasProp.call(_ref, nodeId)) continue;\n\t nodeObject = _ref[nodeId];\n\t operation(nodeObject, nodeId);\n\t }\n\t };\n\n\t Graph.prototype.forEachEdge = function(operation) {\n\t /*\n\t Traverse through the graph in an arbitrary manner, visiting each edge once.\n\t Pass a function of the form `fn(edgeObject)`.\n\t \n\t _Returns:_ undefined.\n\t */\n\n\t var edgeObject, nodeId, nodeObject, toId, _ref, _ref1;\n\t _ref = this._nodes;\n\t for (nodeId in _ref) {\n\t if (!__hasProp.call(_ref, nodeId)) continue;\n\t nodeObject = _ref[nodeId];\n\t _ref1 = nodeObject._outEdges;\n\t for (toId in _ref1) {\n\t if (!__hasProp.call(_ref1, toId)) continue;\n\t edgeObject = _ref1[toId];\n\t operation(edgeObject);\n\t }\n\t }\n\t };\n\n\t return Graph;\n\n\t })();\n\n\t module.exports = Graph;\n\n\t}).call(this);\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t/*\n\tMinimum heap, i.e. smallest node at root.\n\n\t**Note:** does not accept null or undefined. This is by design. Those values\n\tcause comparison problems and might report false negative during extraction.\n\n\t## Overview example:\n\n\t```js\n\tvar heap = new Heap([5, 6, 3, 4]);\n\theap.add(10); // => 10\n\theap.removeMin(); // => 3\n\theap.peekMin(); // => 4\n\t```\n\n\t## Properties:\n\n\t- size: total number of items.\n\t*/\n\n\n\t(function() {\n\t var Heap, _leftChild, _parent, _rightChild;\n\n\t Heap = (function() {\n\t function Heap(dataToHeapify) {\n\t var i, item, _i, _j, _len, _ref;\n\t if (dataToHeapify == null) {\n\t dataToHeapify = [];\n\t }\n\t /*\n\t Pass an optional array to be heapified. Takes only O(n) time.\n\t */\n\n\t this._data = [void 0];\n\t for (_i = 0, _len = dataToHeapify.length; _i < _len; _i++) {\n\t item = dataToHeapify[_i];\n\t if (item != null) {\n\t this._data.push(item);\n\t }\n\t }\n\t if (this._data.length > 1) {\n\t for (i = _j = 2, _ref = this._data.length; 2 <= _ref ? _j < _ref : _j > _ref; i = 2 <= _ref ? ++_j : --_j) {\n\t this._upHeap(i);\n\t }\n\t }\n\t this.size = this._data.length - 1;\n\t }\n\n\t Heap.prototype.add = function(value) {\n\t /*\n\t **Remember:** rejects null and undefined for mentioned reasons.\n\t \n\t _Returns:_ the value added.\n\t */\n\n\t if (value == null) {\n\t return;\n\t }\n\t this._data.push(value);\n\t this._upHeap(this._data.length - 1);\n\t this.size++;\n\t return value;\n\t };\n\n\t Heap.prototype.removeMin = function() {\n\t /*\n\t _Returns:_ the smallest item (the root).\n\t */\n\n\t var min;\n\t if (this._data.length === 1) {\n\t return;\n\t }\n\t this.size--;\n\t if (this._data.length === 2) {\n\t return this._data.pop();\n\t }\n\t min = this._data[1];\n\t this._data[1] = this._data.pop();\n\t this._downHeap();\n\t return min;\n\t };\n\n\t Heap.prototype.peekMin = function() {\n\t /*\n\t Check the smallest item without removing it.\n\t \n\t _Returns:_ the smallest item (the root).\n\t */\n\n\t return this._data[1];\n\t };\n\n\t Heap.prototype._upHeap = function(index) {\n\t var valueHolder, _ref;\n\t valueHolder = this._data[index];\n\t while (this._data[index] < this._data[_parent(index)] && index > 1) {\n\t _ref = [this._data[_parent(index)], this._data[index]], this._data[index] = _ref[0], this._data[_parent(index)] = _ref[1];\n\t index = _parent(index);\n\t }\n\t };\n\n\t Heap.prototype._downHeap = function() {\n\t var currentIndex, smallerChildIndex, _ref;\n\t currentIndex = 1;\n\t while (_leftChild(currentIndex < this._data.length)) {\n\t smallerChildIndex = _leftChild(currentIndex);\n\t if (smallerChildIndex < this._data.length - 1) {\n\t if (this._data[_rightChild(currentIndex)] < this._data[smallerChildIndex]) {\n\t smallerChildIndex = _rightChild(currentIndex);\n\t }\n\t }\n\t if (this._data[smallerChildIndex] < this._data[currentIndex]) {\n\t _ref = [this._data[currentIndex], this._data[smallerChildIndex]], this._data[smallerChildIndex] = _ref[0], this._data[currentIndex] = _ref[1];\n\t currentIndex = smallerChildIndex;\n\t } else {\n\t break;\n\t }\n\t }\n\t };\n\n\t return Heap;\n\n\t })();\n\n\t _parent = function(index) {\n\t return index >> 1;\n\t };\n\n\t _leftChild = function(index) {\n\t return index << 1;\n\t };\n\n\t _rightChild = function(index) {\n\t return (index << 1) + 1;\n\t };\n\n\t module.exports = Heap;\n\n\t}).call(this);\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/*\n\tDoubly Linked.\n\n\t## Overview example:\n\n\t```js\n\tvar list = new LinkedList([5, 4, 9]);\n\tlist.add(12); // => 12\n\tlist.head.next.value; // => 4\n\tlist.tail.value; // => 12\n\tlist.at(-1); // => 12\n\tlist.removeAt(2); // => 9\n\tlist.remove(4); // => 4\n\tlist.indexOf(5); // => 0\n\tlist.add(5, 1); // => 5. Second 5 at position 1.\n\tlist.indexOf(5, 1); // => 1\n\t```\n\n\t## Properties:\n\n\t- head: first item.\n\t- tail: last item.\n\t- size: total number of items.\n\t- item.value: value passed to the item when calling `add()`.\n\t- item.prev: previous item.\n\t- item.next: next item.\n\t*/\n\n\n\t(function() {\n\t var LinkedList;\n\n\t LinkedList = (function() {\n\t function LinkedList(valuesToAdd) {\n\t var value, _i, _len;\n\t if (valuesToAdd == null) {\n\t valuesToAdd = [];\n\t }\n\t /*\n\t Can pass an array of elements to link together during `new LinkedList()`\n\t initiation.\n\t */\n\n\t this.head = {\n\t prev: void 0,\n\t value: void 0,\n\t next: void 0\n\t };\n\t this.tail = {\n\t prev: void 0,\n\t value: void 0,\n\t next: void 0\n\t };\n\t this.size = 0;\n\t for (_i = 0, _len = valuesToAdd.length; _i < _len; _i++) {\n\t value = valuesToAdd[_i];\n\t this.add(value);\n\t }\n\t }\n\n\t LinkedList.prototype.at = function(position) {\n\t /*\n\t Get the item at `position` (optional). Accepts negative index:\n\t \n\t ```js\n\t myList.at(-1); // Returns the last element.\n\t ```\n\t However, passing a negative index that surpasses the boundary will return\n\t undefined:\n\t \n\t ```js\n\t myList = new LinkedList([2, 6, 8, 3])\n\t myList.at(-5); // Undefined.\n\t myList.at(-4); // 2.\n\t ```\n\t _Returns:_ item gotten, or undefined if not found.\n\t */\n\n\t var currentNode, i, _i, _j, _ref;\n\t if (!((-this.size <= position && position < this.size))) {\n\t return;\n\t }\n\t position = this._adjust(position);\n\t if (position * 2 < this.size) {\n\t currentNode = this.head;\n\t for (i = _i = 1; _i <= position; i = _i += 1) {\n\t currentNode = currentNode.next;\n\t }\n\t } else {\n\t currentNode = this.tail;\n\t for (i = _j = 1, _ref = this.size - position - 1; _j <= _ref; i = _j += 1) {\n\t currentNode = currentNode.prev;\n\t }\n\t }\n\t return currentNode;\n\t };\n\n\t LinkedList.prototype.add = function(value, position) {\n\t var currentNode, nodeToAdd, _ref, _ref1, _ref2;\n\t if (position == null) {\n\t position = this.size;\n\t }\n\t /*\n\t Add a new item at `position` (optional). Defaults to adding at the end.\n\t `position`, just like in `at()`, can be negative (within the negative\n\t boundary). Position specifies the place the value's going to be, and the old\n\t node will be pushed higher. `add(-2)` on list of size 7 is the same as\n\t `add(5)`.\n\t \n\t _Returns:_ item added.\n\t */\n\n\t if (!((-this.size <= position && position <= this.size))) {\n\t return;\n\t }\n\t nodeToAdd = {\n\t value: value\n\t };\n\t position = this._adjust(position);\n\t if (this.size === 0) {\n\t this.head = nodeToAdd;\n\t } else {\n\t if (position === 0) {\n\t _ref = [nodeToAdd, this.head, nodeToAdd], this.head.prev = _ref[0], nodeToAdd.next = _ref[1], this.head = _ref[2];\n\t } else {\n\t currentNode = this.at(position - 1);\n\t _ref1 = [currentNode.next, nodeToAdd, nodeToAdd, currentNode], nodeToAdd.next = _ref1[0], (_ref2 = currentNode.next) != null ? _ref2.prev = _ref1[1] : void 0, currentNode.next = _ref1[2], nodeToAdd.prev = _ref1[3];\n\t }\n\t }\n\t if (position === this.size) {\n\t this.tail = nodeToAdd;\n\t }\n\t this.size++;\n\t return value;\n\t };\n\n\t LinkedList.prototype.removeAt = function(position) {\n\t var currentNode, valueToReturn, _ref;\n\t if (position == null) {\n\t position = this.size - 1;\n\t }\n\t /*\n\t Remove an item at index `position` (optional). Defaults to the last item.\n\t Index can be negative (within the boundary).\n\t \n\t _Returns:_ item removed.\n\t */\n\n\t if (!((-this.size <= position && position < this.size))) {\n\t return;\n\t }\n\t if (this.size === 0) {\n\t return;\n\t }\n\t position = this._adjust(position);\n\t if (this.size === 1) {\n\t valueToReturn = this.head.value;\n\t this.head.value = this.tail.value = void 0;\n\t } else {\n\t if (position === 0) {\n\t valueToReturn = this.head.value;\n\t this.head = this.head.next;\n\t this.head.prev = void 0;\n\t } else {\n\t currentNode = this.at(position);\n\t valueToReturn = currentNode.value;\n\t currentNode.prev.next = currentNode.next;\n\t if ((_ref = currentNode.next) != null) {\n\t _ref.prev = currentNode.prev;\n\t }\n\t if (position === this.size - 1) {\n\t this.tail = currentNode.prev;\n\t }\n\t }\n\t }\n\t this.size--;\n\t return valueToReturn;\n\t };\n\n\t LinkedList.prototype.remove = function(value) {\n\t /*\n\t Remove the item using its value instead of position. **Will remove the fist\n\t occurrence of `value`.**\n\t \n\t _Returns:_ the value, or undefined if value's not found.\n\t */\n\n\t var currentNode;\n\t if (value == null) {\n\t return;\n\t }\n\t currentNode = this.head;\n\t while (currentNode && currentNode.value !== value) {\n\t currentNode = currentNode.next;\n\t }\n\t if (!currentNode) {\n\t return;\n\t }\n\t if (this.size === 1) {\n\t this.head.value = this.tail.value = void 0;\n\t } else if (currentNode === this.head) {\n\t this.head = this.head.next;\n\t this.head.prev = void 0;\n\t } else if (currentNode === this.tail) {\n\t this.tail = this.tail.prev;\n\t this.tail.next = void 0;\n\t } else {\n\t currentNode.prev.next = currentNode.next;\n\t currentNode.next.prev = currentNode.prev;\n\t }\n\t this.size--;\n\t return value;\n\t };\n\n\t LinkedList.prototype.indexOf = function(value, startingPosition) {\n\t var currentNode, position;\n\t if (startingPosition == null) {\n\t startingPosition = 0;\n\t }\n\t /*\n\t Find the index of an item, similarly to `array.indexOf()`. Defaults to start\n\t searching from the beginning, by can start at another position by passing\n\t `startingPosition`. This parameter can also be negative; but unlike the\n\t other methods of this class, `startingPosition` (optional) can be as small\n\t as desired; a value of -999 for a list of size 5 will start searching\n\t normally, at the beginning.\n\t \n\t **Note:** searches forwardly, **not** backwardly, i.e:\n\t \n\t ```js\n\t var myList = new LinkedList([2, 3, 1, 4, 3, 5])\n\t myList.indexOf(3, -3); // Returns 4, not 1\n\t ```\n\t _Returns:_ index of item found, or -1 if not found.\n\t */\n\n\t if (((this.head.value == null) && !this.head.next) || startingPosition >= this.size) {\n\t return -1;\n\t }\n\t startingPosition = Math.max(0, this._adjust(startingPosition));\n\t currentNode = this.at(startingPosition);\n\t position = startingPosition;\n\t while (currentNode) {\n\t if (currentNode.value === value) {\n\t break;\n\t }\n\t currentNode = currentNode.next;\n\t position++;\n\t }\n\t if (position === this.size) {\n\t return -1;\n\t } else {\n\t return position;\n\t }\n\t };\n\n\t LinkedList.prototype._adjust = function(position) {\n\t if (position < 0) {\n\t return this.size + position;\n\t } else {\n\t return position;\n\t }\n\t };\n\n\t return LinkedList;\n\n\t })();\n\n\t module.exports = LinkedList;\n\n\t}).call(this);\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t/*\n\tKind of a stopgap measure for the upcoming [JavaScript\n\tMap](http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets)\n\n\t**Note:** due to JavaScript's limitations, hashing something other than Boolean,\n\tNumber, String, Undefined, Null, RegExp, Function requires a hack that inserts a\n\thidden unique property into the object. This means `set`, `get`, `has` and\n\t`delete` must employ the same object, and not a mere identical copy as in the\n\tcase of, say, a string.\n\n\t## Overview example:\n\n\t```js\n\tvar map = new Map({'alice': 'wonderland', 20: 'ok'});\n\tmap.set('20', 5); // => 5\n\tmap.get('20'); // => 5\n\tmap.has('alice'); // => true\n\tmap.delete(20) // => true\n\tvar arr = [1, 2];\n\tmap.add(arr, 'goody'); // => 'goody'\n\tmap.has(arr); // => true\n\tmap.has([1, 2]); // => false. Needs to compare by reference\n\tmap.forEach(function(key, value) {\n\t console.log(key, value);\n\t});\n\t```\n\n\t## Properties:\n\n\t- size: The total number of `(key, value)` pairs.\n\t*/\n\n\n\t(function() {\n\t var Map, SPECIAL_TYPE_KEY_PREFIX, _extractDataType, _isSpecialType,\n\t __hasProp = {}.hasOwnProperty;\n\n\t SPECIAL_TYPE_KEY_PREFIX = '_mapId_';\n\n\t Map = (function() {\n\t Map._mapIdTracker = 0;\n\n\t Map._newMapId = function() {\n\t return this._mapIdTracker++;\n\t };\n\n\t function Map(objectToMap) {\n\t /*\n\t Pass an optional object whose (key, value) pair will be hashed. **Careful**\n\t not to pass something like {5: 'hi', '5': 'hello'}, since JavaScript's\n\t native object behavior will crush the first 5 property before it gets to\n\t constructor.\n\t */\n\n\t var key, value;\n\t this._content = {};\n\t this._itemId = 0;\n\t this._id = Map._newMapId();\n\t this.size = 0;\n\t for (key in objectToMap) {\n\t if (!__hasProp.call(objectToMap, key)) continue;\n\t value = objectToMap[key];\n\t this.set(key, value);\n\t }\n\t }\n\n\t Map.prototype.hash = function(key, makeHash) {\n\t var propertyForMap, type;\n\t if (makeHash == null) {\n\t makeHash = false;\n\t }\n\t /*\n\t The hash function for hashing keys is public. Feel free to replace it with\n\t your own. The `makeHash` parameter is optional and accepts a boolean\n\t (defaults to `false`) indicating whether or not to produce a new hash (for\n\t the first use, naturally).\n\t \n\t _Returns:_ the hash.\n\t */\n\n\t type = _extractDataType(key);\n\t if (_isSpecialType(key)) {\n\t propertyForMap = SPECIAL_TYPE_KEY_PREFIX + this._id;\n\t if (makeHash && !key[propertyForMap]) {\n\t key[propertyForMap] = this._itemId++;\n\t }\n\t return propertyForMap + '_' + key[propertyForMap];\n\t } else {\n\t return type + '_' + key;\n\t }\n\t };\n\n\t Map.prototype.set = function(key, value) {\n\t /*\n\t _Returns:_ value.\n\t */\n\n\t if (!this.has(key)) {\n\t this.size++;\n\t }\n\t this._content[this.hash(key, true)] = [value, key];\n\t return value;\n\t };\n\n\t Map.prototype.get = function(key) {\n\t /*\n\t _Returns:_ value corresponding to the key, or undefined if not found.\n\t */\n\n\t var _ref;\n\t return (_ref = this._content[this.hash(key)]) != null ? _ref[0] : void 0;\n\t };\n\n\t Map.prototype.has = function(key) {\n\t /*\n\t Check whether a value exists for the key.\n\t \n\t _Returns:_ true or false.\n\t */\n\n\t return this.hash(key) in this._content;\n\t };\n\n\t Map.prototype[\"delete\"] = function(key) {\n\t /*\n\t Remove the (key, value) pair.\n\t \n\t _Returns:_ **true or false**. Unlike most of this library, this method\n\t doesn't return the deleted value. This is so that it conforms to the future\n\t JavaScript `map.delete()`'s behavior.\n\t */\n\n\t var hashedKey;\n\t hashedKey = this.hash(key);\n\t if (hashedKey in this._content) {\n\t delete this._content[hashedKey];\n\t if (_isSpecialType(key)) {\n\t delete key[SPECIAL_TYPE_KEY_PREFIX + this._id];\n\t }\n\t this.size--;\n\t return true;\n\t }\n\t return false;\n\t };\n\n\t Map.prototype.forEach = function(operation) {\n\t /*\n\t Traverse through the map. Pass a function of the form `fn(key, value)`.\n\t \n\t _Returns:_ undefined.\n\t */\n\n\t var key, value, _ref;\n\t _ref = this._content;\n\t for (key in _ref) {\n\t if (!__hasProp.call(_ref, key)) continue;\n\t value = _ref[key];\n\t operation(value[1], value[0]);\n\t }\n\t };\n\n\t return Map;\n\n\t })();\n\n\t _isSpecialType = function(key) {\n\t var simpleHashableTypes, simpleType, type, _i, _len;\n\t simpleHashableTypes = ['Boolean', 'Number', 'String', 'Undefined', 'Null', 'RegExp', 'Function'];\n\t type = _extractDataType(key);\n\t for (_i = 0, _len = simpleHashableTypes.length; _i < _len; _i++) {\n\t simpleType = simpleHashableTypes[_i];\n\t if (type === simpleType) {\n\t return false;\n\t }\n\t }\n\t return true;\n\t };\n\n\t _extractDataType = function(type) {\n\t return Object.prototype.toString.apply(type).match(/\\[object (.+)\\]/)[1];\n\t };\n\n\t module.exports = Map;\n\n\t}).call(this);\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t/*\n\tAmortized O(1) dequeue!\n\n\t## Overview example:\n\n\t```js\n\tvar queue = new Queue([1, 6, 4]);\n\tqueue.enqueue(10); // => 10\n\tqueue.dequeue(); // => 1\n\tqueue.dequeue(); // => 6\n\tqueue.dequeue(); // => 4\n\tqueue.peek(); // => 10\n\tqueue.dequeue(); // => 10\n\tqueue.peek(); // => undefined\n\t```\n\n\t## Properties:\n\n\t- size: The total number of items.\n\t*/\n\n\n\t(function() {\n\t var Queue;\n\n\t Queue = (function() {\n\t function Queue(initialArray) {\n\t if (initialArray == null) {\n\t initialArray = [];\n\t }\n\t /*\n\t Pass an optional array to be transformed into a queue. The item at index 0\n\t is the first to be dequeued.\n\t */\n\n\t this._content = initialArray;\n\t this._dequeueIndex = 0;\n\t this.size = this._content.length;\n\t }\n\n\t Queue.prototype.enqueue = function(item) {\n\t /*\n\t _Returns:_ the item.\n\t */\n\n\t this.size++;\n\t this._content.push(item);\n\t return item;\n\t };\n\n\t Queue.prototype.dequeue = function() {\n\t /*\n\t _Returns:_ the dequeued item.\n\t */\n\n\t var itemToDequeue;\n\t if (this.size === 0) {\n\t return;\n\t }\n\t this.size--;\n\t itemToDequeue = this._content[this._dequeueIndex];\n\t this._dequeueIndex++;\n\t if (this._dequeueIndex * 2 > this._content.length) {\n\t this._content = this._content.slice(this._dequeueIndex);\n\t this._dequeueIndex = 0;\n\t }\n\t return itemToDequeue;\n\t };\n\n\t Queue.prototype.peek = function() {\n\t /*\n\t Check the next item to be dequeued, without removing it.\n\t \n\t _Returns:_ the item.\n\t */\n\n\t return this._content[this._dequeueIndex];\n\t };\n\n\t return Queue;\n\n\t })();\n\n\t module.exports = Queue;\n\n\t}).call(this);\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t/*\n\tCredit to Wikipedia's article on [Red-black\n\ttree](http://en.wikipedia.org/wiki/Red–black_tree)\n\n\t**Note:** doesn't handle duplicate entries, undefined and null. This is by\n\tdesign.\n\n\t## Overview example:\n\n\t```js\n\tvar rbt = new RedBlackTree([7, 5, 1, 8]);\n\trbt.add(2); // => 2\n\trbt.add(10); // => 10\n\trbt.has(5); // => true\n\trbt.peekMin(); // => 1\n\trbt.peekMax(); // => 10\n\trbt.removeMin(); // => 1\n\trbt.removeMax(); // => 10\n\trbt.remove(8); // => 8\n\t```\n\n\t## Properties:\n\n\t- size: The total number of items.\n\t*/\n\n\n\t(function() {\n\t var BLACK, NODE_FOUND, NODE_TOO_BIG, NODE_TOO_SMALL, RED, RedBlackTree, STOP_SEARCHING, _findNode, _grandParentOf, _isLeft, _leftOrRight, _peekMaxNode, _peekMinNode, _siblingOf, _uncleOf;\n\n\t NODE_FOUND = 0;\n\n\t NODE_TOO_BIG = 1;\n\n\t NODE_TOO_SMALL = 2;\n\n\t STOP_SEARCHING = 3;\n\n\t RED = 1;\n\n\t BLACK = 2;\n\n\t RedBlackTree = (function() {\n\t function RedBlackTree(valuesToAdd) {\n\t var value, _i, _len;\n\t if (valuesToAdd == null) {\n\t valuesToAdd = [];\n\t }\n\t /*\n\t Pass an optional array to be turned into binary tree. **Note:** does not\n\t accept duplicate, undefined and null.\n\t */\n\n\t this._root;\n\t this.size = 0;\n\t for (_i = 0, _len = valuesToAdd.length; _i < _len; _i++) {\n\t value = valuesToAdd[_i];\n\t if (value != null) {\n\t this.add(value);\n\t }\n\t }\n\t }\n\n\t RedBlackTree.prototype.add = function(value) {\n\t /*\n\t Again, make sure to not pass a value already in the tree, or undefined, or\n\t null.\n\t \n\t _Returns:_ value added.\n\t */\n\n\t var currentNode, foundNode, nodeToInsert, _ref;\n\t if (value == null) {\n\t return;\n\t }\n\t this.size++;\n\t nodeToInsert = {\n\t value: value,\n\t _color: RED\n\t };\n\t if (!this._root) {\n\t this._root = nodeToInsert;\n\t } else {\n\t foundNode = _findNode(this._root, function(node) {\n\t if (value === node.value) {\n\t return NODE_FOUND;\n\t } else {\n\t if (value < node.value) {\n\t if (node._left) {\n\t return NODE_TOO_BIG;\n\t } else {\n\t nodeToInsert._parent = node;\n\t node._left = nodeToInsert;\n\t return STOP_SEARCHING;\n\t }\n\t } else {\n\t if (node._right) {\n\t return NODE_TOO_SMALL;\n\t } else {\n\t nodeToInsert._parent = node;\n\t node._right = nodeToInsert;\n\t return STOP_SEARCHING;\n\t }\n\t }\n\t }\n\t });\n\t if (foundNode != null) {\n\t return;\n\t }\n\t }\n\t currentNode = nodeToInsert;\n\t while (true) {\n\t if (currentNode === this._root) {\n\t currentNode._color = BLACK;\n\t break;\n\t }\n\t if (currentNode._parent._color === BLACK) {\n\t break;\n\t }\n\t if (((_ref = _uncleOf(currentNode)) != null ? _ref._color : void 0) === RED) {\n\t currentNode._parent._color = BLACK;\n\t _uncleOf(currentNode)._color = BLACK;\n\t _grandParentOf(currentNode)._color = RED;\n\t currentNode = _grandParentOf(currentNode);\n\t continue;\n\t }\n\t if (!_isLeft(currentNode) && _isLeft(currentNode._parent)) {\n\t this._rotateLeft(currentNode._parent);\n\t currentNode = currentNode._left;\n\t } else if (_isLeft(currentNode) && !_isLeft(currentNode._parent)) {\n\t this._rotateRight(currentNode._parent);\n\t currentNode = currentNode._right;\n\t }\n\t currentNode._parent._color = BLACK;\n\t _grandParentOf(currentNode)._color = RED;\n\t if (_isLeft(currentNode)) {\n\t this._rotateRight(_grandParentOf(currentNode));\n\t } else {\n\t this._rotateLeft(_grandParentOf(currentNode));\n\t }\n\t break;\n\t }\n\t return value;\n\t };\n\n\t RedBlackTree.prototype.has = function(value) {\n\t /*\n\t _Returns:_ true or false.\n\t */\n\n\t var foundNode;\n\t foundNode = _findNode(this._root, function(node) {\n\t if (value === node.value) {\n\t return NODE_FOUND;\n\t } else if (value < node.value) {\n\t return NODE_TOO_BIG;\n\t } else {\n\t return NODE_TOO_SMALL;\n\t }\n\t });\n\t if (foundNode) {\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t };\n\n\t RedBlackTree.prototype.peekMin = function() {\n\t /*\n\t Check the minimum value without removing it.\n\t \n\t _Returns:_ the minimum value.\n\t */\n\n\t var _ref;\n\t return (_ref = _peekMinNode(this._root)) != null ? _ref.value : void 0;\n\t };\n\n\t RedBlackTree.prototype.peekMax = function() {\n\t /*\n\t Check the maximum value without removing it.\n\t \n\t _Returns:_ the maximum value.\n\t */\n\n\t var _ref;\n\t return (_ref = _peekMaxNode(this._root)) != null ? _ref.value : void 0;\n\t };\n\n\t RedBlackTree.prototype.remove = function(value) {\n\t /*\n\t _Returns:_ the value removed, or undefined if the value's not found.\n\t */\n\n\t var foundNode;\n\t foundNode = _findNode(this._root, function(node) {\n\t if (value === node.value) {\n\t return NODE_FOUND;\n\t } else if (value < node.value) {\n\t return NODE_TOO_BIG;\n\t } else {\n\t return NODE_TOO_SMALL;\n\t }\n\t });\n\t if (!foundNode) {\n\t return;\n\t }\n\t this._removeNode(this._root, foundNode);\n\t this.size--;\n\t return value;\n\t };\n\n\t RedBlackTree.prototype.removeMin = function() {\n\t /*\n\t _Returns:_ smallest item removed, or undefined if tree's empty.\n\t */\n\n\t var nodeToRemove, valueToReturn;\n\t nodeToRemove = _peekMinNode(this._root);\n\t if (!nodeToRemove) {\n\t return;\n\t }\n\t valueToReturn = nodeToRemove.value;\n\t this._removeNode(this._root, nodeToRemove);\n\t return valueToReturn;\n\t };\n\n\t RedBlackTree.prototype.removeMax = function() {\n\t /*\n\t _Returns:_ biggest item removed, or undefined if tree's empty.\n\t */\n\n\t var nodeToRemove, valueToReturn;\n\t nodeToRemove = _peekMaxNode(this._root);\n\t if (!nodeToRemove) {\n\t return;\n\t }\n\t valueToReturn = nodeToRemove.value;\n\t this._removeNode(this._root, nodeToRemove);\n\t return valueToReturn;\n\t };\n\n\t RedBlackTree.prototype._removeNode = function(root, node) {\n\t var sibling, successor, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;\n\t if (node._left && node._right) {\n\t successor = _peekMinNode(node._right);\n\t node.value = successor.value;\n\t node = successor;\n\t }\n\t successor = node._left || node._right;\n\t if (!successor) {\n\t successor = {\n\t color: BLACK,\n\t _right: void 0,\n\t _left: void 0,\n\t isLeaf: true\n\t };\n\t }\n\t successor._parent = node._parent;\n\t if ((_ref = node._parent) != null) {\n\t _ref[_leftOrRight(node)] = successor;\n\t }\n\t if (node._color === BLACK) {\n\t if (successor._color === RED) {\n\t successor._color = BLACK;\n\t if (!successor._parent) {\n\t this._root = successor;\n\t }\n\t } else {\n\t while (true) {\n\t if (!successor._parent) {\n\t if (!successor.isLeaf) {\n\t this._root = successor;\n\t } else {\n\t this._root = void 0;\n\t }\n\t break;\n\t }\n\t sibling = _siblingOf(successor);\n\t if ((sibling != null ? sibling._color : void 0) === RED) {\n\t successor._parent._color = RED;\n\t sibling._color = BLACK;\n\t if (_isLeft(successor)) {\n\t this._rotateLeft(successor._parent);\n\t } else {\n\t this._rotateRight(successor._parent);\n\t }\n\t }\n\t sibling = _siblingOf(successor);\n\t if (successor._parent._color === BLACK && (!sibling || (sibling._color === BLACK && (!sibling._left || sibling._left._color === BLACK) && (!sibling._right || sibling._right._color === BLACK)))) {\n\t if (sibling != null) {\n\t sibling._color = RED;\n\t }\n\t if (successor.isLeaf) {\n\t successor._parent[_leftOrRight(successor)] = void 0;\n\t }\n\t successor = successor._parent;\n\t continue;\n\t }\n\t if (successor._parent._color === RED && (!sibling || (sibling._color === BLACK && (!sibling._left || ((_ref1 = sibling._left) != null ? _ref1._color : void 0) === BLACK) && (!sibling._right || ((_ref2 = sibling._right) != null ? _ref2._color : void 0) === BLACK)))) {\n\t if (sibling != null) {\n\t sibling._color = RED;\n\t }\n\t successor._parent._color = BLACK;\n\t break;\n\t }\n\t if ((sibling != null ? sibling._color : void 0) === BLACK) {\n\t if (_isLeft(successor) && (!sibling._right || sibling._right._color === BLACK) && ((_ref3 = sibling._left) != null ? _ref3._color : void 0) === RED) {\n\t sibling._color = RED;\n\t if ((_ref4 = sibling._left) != null) {\n\t _ref4._color = BLACK;\n\t }\n\t this._rotateRight(sibling);\n\t } else if (!_isLeft(successor) && (!sibling._left || sibling._left._color === BLACK) && ((_ref5 = sibling._right) != null ? _ref5._color : void 0) === RED) {\n\t sibling._color = RED;\n\t if ((_ref6 = sibling._right) != null) {\n\t _ref6._color = BLACK;\n\t }\n\t this._rotateLeft(sibling);\n\t }\n\t break;\n\t }\n\t sibling = _siblingOf(successor);\n\t sibling._color = successor._parent._color;\n\t if (_isLeft(successor)) {\n\t sibling._right._color = BLACK;\n\t this._rotateRight(successor._parent);\n\t } else {\n\t sibling._left._color = BLACK;\n\t this._rotateLeft(successor._parent);\n\t }\n\t }\n\t }\n\t }\n\t if (successor.isLeaf) {\n\t return (_ref7 = successor._parent) != null ? _ref7[_leftOrRight(successor)] = void 0 : void 0;\n\t }\n\t };\n\n\t RedBlackTree.prototype._rotateLeft = function(node) {\n\t var _ref, _ref1;\n\t if ((_ref = node._parent) != null) {\n\t _ref[_leftOrRight(node)] = node._right;\n\t }\n\t node._right._parent = node._parent;\n\t node._parent = node._right;\n\t node._right = node._right._left;\n\t node._parent._left = node;\n\t if ((_ref1 = node._right) != null) {\n\t _ref1._parent = node;\n\t }\n\t if (node._parent._parent == null) {\n\t return this._root = node._parent;\n\t }\n\t };\n\n\t RedBlackTree.prototype._rotateRight = function(node) {\n\t var _ref, _ref1;\n\t if ((_ref = node._parent) != null) {\n\t _ref[_leftOrRight(node)] = node._left;\n\t }\n\t node._left._parent = node._parent;\n\t node._parent = node._left;\n\t node._left = node._left._right;\n\t node._parent._right = node;\n\t if ((_ref1 = node._left) != null) {\n\t _ref1._parent = node;\n\t }\n\t if (node._parent._parent == null) {\n\t return this._root = node._parent;\n\t }\n\t };\n\n\t return RedBlackTree;\n\n\t })();\n\n\t _isLeft = function(node) {\n\t return node === node._parent._left;\n\t };\n\n\t _leftOrRight = function(node) {\n\t if (_isLeft(node)) {\n\t return '_left';\n\t } else {\n\t return '_right';\n\t }\n\t };\n\n\t _findNode = function(startingNode, comparator) {\n\t var comparisonResult, currentNode, foundNode;\n\t currentNode = startingNode;\n\t foundNode = void 0;\n\t while (currentNode) {\n\t comparisonResult = comparator(currentNode);\n\t if (comparisonResult === NODE_FOUND) {\n\t foundNode = currentNode;\n\t break;\n\t }\n\t if (comparisonResult === NODE_TOO_BIG) {\n\t currentNode = currentNode._left;\n\t } else if (comparisonResult === NODE_TOO_SMALL) {\n\t currentNode = currentNode._right;\n\t } else if (comparisonResult === STOP_SEARCHING) {\n\t break;\n\t }\n\t }\n\t return foundNode;\n\t };\n\n\t _peekMinNode = function(startingNode) {\n\t return _findNode(startingNode, function(node) {\n\t if (node._left) {\n\t return NODE_TOO_BIG;\n\t } else {\n\t return NODE_FOUND;\n\t }\n\t });\n\t };\n\n\t _peekMaxNode = function(startingNode) {\n\t return _findNode(startingNode, function(node) {\n\t if (node._right) {\n\t return NODE_TOO_SMALL;\n\t } else {\n\t return NODE_FOUND;\n\t }\n\t });\n\t };\n\n\t _grandParentOf = function(node) {\n\t var _ref;\n\t return (_ref = node._parent) != null ? _ref._parent : void 0;\n\t };\n\n\t _uncleOf = function(node) {\n\t if (!_grandParentOf(node)) {\n\t return;\n\t }\n\t if (_isLeft(node._parent)) {\n\t return _grandParentOf(node)._right;\n\t } else {\n\t return _grandParentOf(node)._left;\n\t }\n\t };\n\n\t _siblingOf = function(node) {\n\t if (_isLeft(node)) {\n\t return node._parent._right;\n\t } else {\n\t return node._parent._left;\n\t }\n\t };\n\n\t module.exports = RedBlackTree;\n\n\t}).call(this);\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*\n\tGood for fast insertion/removal/lookup of strings.\n\n\t## Overview example:\n\n\t```js\n\tvar trie = new Trie(['bear', 'beer']);\n\ttrie.add('hello'); // => 'hello'\n\ttrie.add('helloha!'); // => 'helloha!'\n\ttrie.has('bears'); // => false\n\ttrie.longestPrefixOf('beatrice'); // => 'bea'\n\ttrie.wordsWithPrefix('hel'); // => ['hello', 'helloha!']\n\ttrie.remove('beers'); // => undefined. 'beer' still exists\n\ttrie.remove('Beer') // => undefined. Case-sensitive\n\ttrie.remove('beer') // => 'beer'. Removed\n\t```\n\n\t## Properties:\n\n\t- size: The total number of words.\n\t*/\n\n\n\t(function() {\n\t var Queue, Trie, WORD_END, _hasAtLeastNChildren,\n\t __hasProp = {}.hasOwnProperty;\n\n\t Queue = __webpack_require__(6);\n\n\t WORD_END = 'end';\n\n\t Trie = (function() {\n\t function Trie(words) {\n\t var word, _i, _len;\n\t if (words == null) {\n\t words = [];\n\t }\n\t /*\n\t Pass an optional array of strings to be inserted initially.\n\t */\n\n\t this._root = {};\n\t this.size = 0;\n\t for (_i = 0, _len = words.length; _i < _len; _i++) {\n\t word = words[_i];\n\t this.add(word);\n\t }\n\t }\n\n\t Trie.prototype.add = function(word) {\n\t /*\n\t Add a whole string to the trie.\n\t \n\t _Returns:_ the word added. Will return undefined (without adding the value)\n\t if the word passed is null or undefined.\n\t */\n\n\t var currentNode, letter, _i, _len;\n\t if (word == null) {\n\t return;\n\t }\n\t this.size++;\n\t currentNode = this._root;\n\t for (_i = 0, _len = word.length; _i < _len; _i++) {\n\t letter = word[_i];\n\t if (currentNode[letter] == null) {\n\t currentNode[letter] = {};\n\t }\n\t currentNode = currentNode[letter];\n\t }\n\t currentNode[WORD_END] = true;\n\t return word;\n\t };\n\n\t Trie.prototype.has = function(word) {\n\t /*\n\t __Returns:_ true or false.\n\t */\n\n\t var currentNode, letter, _i, _len;\n\t if (word == null) {\n\t return false;\n\t }\n\t currentNode = this._root;\n\t for (_i = 0, _len = word.length; _i < _len; _i++) {\n\t letter = word[_i];\n\t if (currentNode[letter] == null) {\n\t return false;\n\t }\n\t currentNode = currentNode[letter];\n\t }\n\t if (currentNode[WORD_END]) {\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t };\n\n\t Trie.prototype.longestPrefixOf = function(word) {\n\t /*\n\t Find all words containing the prefix. The word itself counts as a prefix.\n\t \n\t ```js\n\t var trie = new Trie;\n\t trie.add('hello');\n\t trie.longestPrefixOf('he'); // 'he'\n\t trie.longestPrefixOf('hello'); // 'hello'\n\t trie.longestPrefixOf('helloha!'); // 'hello'\n\t ```\n\t \n\t _Returns:_ the prefix string, or empty string if no prefix found.\n\t */\n\n\t var currentNode, letter, prefix, _i, _len;\n\t if (word == null) {\n\t return '';\n\t }\n\t currentNode = this._root;\n\t prefix = '';\n\t for (_i = 0, _len = word.length; _i < _len; _i++) {\n\t letter = word[_i];\n\t if (currentNode[letter] == null) {\n\t break;\n\t }\n\t prefix += letter;\n\t currentNode = currentNode[letter];\n\t }\n\t return prefix;\n\t };\n\n\t Trie.prototype.wordsWithPrefix = function(prefix) {\n\t /*\n\t Find all words containing the prefix. The word itself counts as a prefix.\n\t **Watch out for edge cases.**\n\t \n\t ```js\n\t var trie = new Trie;\n\t trie.wordsWithPrefix(''); // []. Check later case below.\n\t trie.add('');\n\t trie.wordsWithPrefix(''); // ['']\n\t trie.add('he');\n\t trie.add('hello');\n\t trie.add('hell');\n\t trie.add('bear');\n\t trie.add('z');\n\t trie.add('zebra');\n\t trie.wordsWithPrefix('hel'); // ['hell', 'hello']\n\t ```\n\t \n\t _Returns:_ an array of strings, or empty array if no word found.\n\t */\n\n\t var accumulatedLetters, currentNode, letter, node, queue, subNode, words, _i, _len, _ref;\n\t if (prefix == null) {\n\t return [];\n\t }\n\t (prefix != null) || (prefix = '');\n\t words = [];\n\t currentNode = this._root;\n\t for (_i = 0, _len = prefix.length; _i < _len; _i++) {\n\t letter = prefix[_i];\n\t currentNode = currentNode[letter];\n\t if (currentNode == null) {\n\t return [];\n\t }\n\t }\n\t queue = new Queue();\n\t queue.enqueue([currentNode, '']);\n\t while (queue.size !== 0) {\n\t _ref = queue.dequeue(), node = _ref[0], accumulatedLetters = _ref[1];\n\t if (node[WORD_END]) {\n\t words.push(prefix + accumulatedLetters);\n\t }\n\t for (letter in node) {\n\t if (!__hasProp.call(node, letter)) continue;\n\t subNode = node[letter];\n\t queue.enqueue([subNode, accumulatedLetters + letter]);\n\t }\n\t }\n\t return words;\n\t };\n\n\t Trie.prototype.remove = function(word) {\n\t /*\n\t _Returns:_ the string removed, or undefined if the word in its whole doesn't\n\t exist. **Note:** this means removing `beers` when only `beer` exists will\n\t return undefined and conserve `beer`.\n\t */\n\n\t var currentNode, i, letter, prefix, _i, _j, _len, _ref;\n\t if (word == null) {\n\t return;\n\t }\n\t currentNode = this._root;\n\t prefix = [];\n\t for (_i = 0, _len = word.length; _i < _len; _i++) {\n\t letter = word[_i];\n\t if (currentNode[letter] == null) {\n\t return;\n\t }\n\t currentNode = currentNode[letter];\n\t prefix.push([letter, currentNode]);\n\t }\n\t if (!currentNode[WORD_END]) {\n\t return;\n\t }\n\t this.size--;\n\t delete currentNode[WORD_END];\n\t if (_hasAtLeastNChildren(currentNode, 1)) {\n\t return word;\n\t }\n\t for (i = _j = _ref = prefix.length - 1; _ref <= 1 ? _j <= 1 : _j >= 1; i = _ref <= 1 ? ++_j : --_j) {\n\t if (!_hasAtLeastNChildren(prefix[i][1], 1)) {\n\t delete prefix[i - 1][1][prefix[i][0]];\n\t } else {\n\t break;\n\t }\n\t }\n\t if (!_hasAtLeastNChildren(this._root[prefix[0][0]], 1)) {\n\t delete this._root[prefix[0][0]];\n\t }\n\t return word;\n\t };\n\n\t return Trie;\n\n\t })();\n\n\t _hasAtLeastNChildren = function(node, n) {\n\t var child, childCount;\n\t if (n === 0) {\n\t return true;\n\t }\n\t childCount = 0;\n\t for (child in node) {\n\t if (!__hasProp.call(node, child)) continue;\n\t childCount++;\n\t if (childCount >= n) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t };\n\n\t module.exports = Trie;\n\n\t}).call(this);\n\n\n/***/ }\n/******/ ]);","angular.module('uiGmapgoogle-maps.wrapped')\n.service('uiGmapMarkerSpiderfier', [ 'uiGmapGoogleMapApi', function(GoogleMapApi) {\n var self = this;\n /* istanbul ignore next */\n +function(){\n \n/** @preserve OverlappingMarkerSpiderfier\nhttps://github.com/jawj/OverlappingMarkerSpiderfier\nCopyright (c) 2011 - 2013 George MacKerron\nReleased under the MIT licence: http://opensource.org/licenses/mit-license\nNote: The Google Maps API v3 must be included *before* this code\n */\nvar hasProp = {}.hasOwnProperty,\n slice = [].slice;\n\nthis['OverlappingMarkerSpiderfier'] = (function() {\n var ge, gm, j, lcH, lcU, len, mt, p, ref, twoPi, x;\n\n p = _Class.prototype;\n\n ref = [_Class, p];\n for (j = 0, len = ref.length; j < len; j++) {\n x = ref[j];\n x['VERSION'] = '0.3.3';\n }\n\n gm = void 0;\n\n ge = void 0;\n\n mt = void 0;\n\n twoPi = Math.PI * 2;\n\n p['keepSpiderfied'] = false;\n\n p['markersWontHide'] = false;\n\n p['markersWontMove'] = false;\n\n p['nearbyDistance'] = 20;\n\n p['circleSpiralSwitchover'] = 9;\n\n p['circleFootSeparation'] = 23;\n\n p['circleStartAngle'] = twoPi / 12;\n\n p['spiralFootSeparation'] = 26;\n\n p['spiralLengthStart'] = 11;\n\n p['spiralLengthFactor'] = 4;\n\n p['spiderfiedZIndex'] = 1000;\n\n p['usualLegZIndex'] = 10;\n\n p['highlightedLegZIndex'] = 20;\n\n p['event'] = 'click';\n\n p['minZoomLevel'] = false;\n\n p['legWeight'] = 1.5;\n\n p['legColors'] = {\n 'usual': {},\n 'highlighted': {}\n };\n\n lcU = p['legColors']['usual'];\n\n lcH = p['legColors']['highlighted'];\n\n _Class['initializeGoogleMaps'] = function(google) {\n gm = google.maps;\n ge = gm.event;\n mt = gm.MapTypeId;\n lcU[mt.HYBRID] = lcU[mt.SATELLITE] = '#fff';\n lcH[mt.HYBRID] = lcH[mt.SATELLITE] = '#f00';\n lcU[mt.TERRAIN] = lcU[mt.ROADMAP] = '#444';\n lcH[mt.TERRAIN] = lcH[mt.ROADMAP] = '#f00';\n this.ProjHelper = function(map) {\n return this.setMap(map);\n };\n this.ProjHelper.prototype = new gm.OverlayView();\n return this.ProjHelper.prototype['draw'] = function() {};\n };\n\n function _Class(map1, opts) {\n var e, k, l, len1, ref1, v;\n this.map = map1;\n if (opts == null) {\n opts = {};\n }\n for (k in opts) {\n if (!hasProp.call(opts, k)) continue;\n v = opts[k];\n this[k] = v;\n }\n this.projHelper = new this.constructor.ProjHelper(this.map);\n this.initMarkerArrays();\n this.listeners = {};\n ref1 = ['click', 'zoom_changed', 'maptypeid_changed'];\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n e = ref1[l];\n ge.addListener(this.map, e, (function(_this) {\n return function() {\n return _this['unspiderfy']();\n };\n })(this));\n }\n }\n\n p.initMarkerArrays = function() {\n this.markers = [];\n return this.markerListenerRefs = [];\n };\n\n p['addMarker'] = function(marker) {\n var listenerRefs;\n if (marker['_oms'] != null) {\n return this;\n }\n marker['_oms'] = true;\n listenerRefs = [\n ge.addListener(marker, this['event'], (function(_this) {\n return function(event) {\n return _this.spiderListener(marker, event);\n };\n })(this))\n ];\n if (!this['markersWontHide']) {\n listenerRefs.push(ge.addListener(marker, 'visible_changed', (function(_this) {\n return function() {\n return _this.markerChangeListener(marker, false);\n };\n })(this)));\n }\n if (!this['markersWontMove']) {\n listenerRefs.push(ge.addListener(marker, 'position_changed', (function(_this) {\n return function() {\n return _this.markerChangeListener(marker, true);\n };\n })(this)));\n }\n this.markerListenerRefs.push(listenerRefs);\n this.markers.push(marker);\n return this;\n };\n\n p.markerChangeListener = function(marker, positionChanged) {\n if ((marker['_omsData'] != null) && (positionChanged || !marker.getVisible()) && !((this.spiderfying != null) || (this.unspiderfying != null))) {\n return this['unspiderfy'](positionChanged ? marker : null);\n }\n };\n\n p['getMarkers'] = function() {\n return this.markers.slice(0);\n };\n\n p['removeMarker'] = function(marker) {\n var i, l, len1, listenerRef, listenerRefs;\n if (marker['_omsData'] != null) {\n this['unspiderfy']();\n }\n i = this.arrIndexOf(this.markers, marker);\n if (i < 0) {\n return this;\n }\n listenerRefs = this.markerListenerRefs.splice(i, 1)[0];\n for (l = 0, len1 = listenerRefs.length; l < len1; l++) {\n listenerRef = listenerRefs[l];\n ge.removeListener(listenerRef);\n }\n delete marker['_oms'];\n this.markers.splice(i, 1);\n return this;\n };\n\n p['clearMarkers'] = function() {\n var i, l, len1, len2, listenerRef, listenerRefs, marker, n, ref1;\n this['unspiderfy']();\n ref1 = this.markers;\n for (i = l = 0, len1 = ref1.length; l < len1; i = ++l) {\n marker = ref1[i];\n listenerRefs = this.markerListenerRefs[i];\n for (n = 0, len2 = listenerRefs.length; n < len2; n++) {\n listenerRef = listenerRefs[n];\n ge.removeListener(listenerRef);\n }\n delete marker['_oms'];\n }\n this.initMarkerArrays();\n return this;\n };\n\n p['addListener'] = function(event, func) {\n var base;\n ((base = this.listeners)[event] != null ? base[event] : base[event] = []).push(func);\n return this;\n };\n\n p['removeListener'] = function(event, func) {\n var i;\n i = this.arrIndexOf(this.listeners[event], func);\n if (!(i < 0)) {\n this.listeners[event].splice(i, 1);\n }\n return this;\n };\n\n p['clearListeners'] = function(event) {\n this.listeners[event] = [];\n return this;\n };\n\n p.trigger = function() {\n var args, event, func, l, len1, ref1, ref2, results;\n event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n ref2 = (ref1 = this.listeners[event]) != null ? ref1 : [];\n results = [];\n for (l = 0, len1 = ref2.length; l < len1; l++) {\n func = ref2[l];\n results.push(func.apply(null, args));\n }\n return results;\n };\n\n p.generatePtsCircle = function(count, centerPt) {\n var angle, angleStep, circumference, i, l, legLength, ref1, results;\n circumference = this['circleFootSeparation'] * (2 + count);\n legLength = circumference / twoPi;\n angleStep = twoPi / count;\n results = [];\n for (i = l = 0, ref1 = count; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) {\n angle = this['circleStartAngle'] + i * angleStep;\n results.push(new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle)));\n }\n return results;\n };\n\n p.generatePtsSpiral = function(count, centerPt) {\n var angle, i, l, legLength, pt, ref1, results;\n legLength = this['spiralLengthStart'];\n angle = 0;\n results = [];\n for (i = l = 0, ref1 = count; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) {\n angle += this['spiralFootSeparation'] / legLength + i * 0.0005;\n pt = new gm.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle));\n legLength += twoPi * this['spiralLengthFactor'] / angle;\n results.push(pt);\n }\n return results;\n };\n\n p.spiderListener = function(marker, event) {\n var $this, clear, l, len1, m, mPt, markerPt, markerSpiderfied, nDist, nearbyMarkerData, nonNearbyMarkers, pxSq, ref1;\n markerSpiderfied = marker['_omsData'] != null;\n if (!(markerSpiderfied && this['keepSpiderfied'])) {\n if (this['event'] === 'mouseover') {\n $this = this;\n clear = function() {\n return $this['unspiderfy']();\n };\n window.clearTimeout(p.timeout);\n p.timeout = setTimeout(clear, 3000);\n } else {\n this['unspiderfy']();\n }\n }\n if (markerSpiderfied || this.map.getStreetView().getVisible() || this.map.getMapTypeId() === 'GoogleEarthAPI') {\n return this.trigger('click', marker, event);\n } else {\n nearbyMarkerData = [];\n nonNearbyMarkers = [];\n nDist = this['nearbyDistance'];\n pxSq = nDist * nDist;\n markerPt = this.llToPt(marker.position);\n ref1 = this.markers;\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n m = ref1[l];\n if (!((m.map != null) && m.getVisible())) {\n continue;\n }\n mPt = this.llToPt(m.position);\n if (this.ptDistanceSq(mPt, markerPt) < pxSq) {\n nearbyMarkerData.push({\n marker: m,\n markerPt: mPt\n });\n } else {\n nonNearbyMarkers.push(m);\n }\n }\n if (nearbyMarkerData.length === 1) {\n return this.trigger('click', marker, event);\n } else {\n return this.spiderfy(nearbyMarkerData, nonNearbyMarkers);\n }\n }\n };\n\n p['markersNearMarker'] = function(marker, firstOnly) {\n var l, len1, m, mPt, markerPt, markers, nDist, pxSq, ref1, ref2, ref3;\n if (firstOnly == null) {\n firstOnly = false;\n }\n if (this.projHelper.getProjection() == null) {\n throw \"Must wait for 'idle' event on map before calling markersNearMarker\";\n }\n nDist = this['nearbyDistance'];\n pxSq = nDist * nDist;\n markerPt = this.llToPt(marker.position);\n markers = [];\n ref1 = this.markers;\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n m = ref1[l];\n if (m === marker || (m.map == null) || !m.getVisible()) {\n continue;\n }\n mPt = this.llToPt((ref2 = (ref3 = m['_omsData']) != null ? ref3.usualPosition : void 0) != null ? ref2 : m.position);\n if (this.ptDistanceSq(mPt, markerPt) < pxSq) {\n markers.push(m);\n if (firstOnly) {\n break;\n }\n }\n }\n return markers;\n };\n\n p['markersNearAnyOtherMarker'] = function() {\n var i, i1, i2, l, len1, len2, len3, m, m1, m1Data, m2, m2Data, mData, n, nDist, pxSq, q, ref1, ref2, ref3, results;\n if (this.projHelper.getProjection() == null) {\n throw \"Must wait for 'idle' event on map before calling markersNearAnyOtherMarker\";\n }\n nDist = this['nearbyDistance'];\n pxSq = nDist * nDist;\n mData = (function() {\n var l, len1, ref1, ref2, ref3, results;\n ref1 = this.markers;\n results = [];\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n m = ref1[l];\n results.push({\n pt: this.llToPt((ref2 = (ref3 = m['_omsData']) != null ? ref3.usualPosition : void 0) != null ? ref2 : m.position),\n willSpiderfy: false\n });\n }\n return results;\n }).call(this);\n ref1 = this.markers;\n for (i1 = l = 0, len1 = ref1.length; l < len1; i1 = ++l) {\n m1 = ref1[i1];\n if (!((m1.map != null) && m1.getVisible())) {\n continue;\n }\n m1Data = mData[i1];\n if (m1Data.willSpiderfy) {\n continue;\n }\n ref2 = this.markers;\n for (i2 = n = 0, len2 = ref2.length; n < len2; i2 = ++n) {\n m2 = ref2[i2];\n if (i2 === i1) {\n continue;\n }\n if (!((m2.map != null) && m2.getVisible())) {\n continue;\n }\n m2Data = mData[i2];\n if (i2 < i1 && !m2Data.willSpiderfy) {\n continue;\n }\n if (this.ptDistanceSq(m1Data.pt, m2Data.pt) < pxSq) {\n m1Data.willSpiderfy = m2Data.willSpiderfy = true;\n break;\n }\n }\n }\n ref3 = this.markers;\n results = [];\n for (i = q = 0, len3 = ref3.length; q < len3; i = ++q) {\n m = ref3[i];\n if (mData[i].willSpiderfy) {\n results.push(m);\n }\n }\n return results;\n };\n\n p.makeHighlightListenerFuncs = function(marker) {\n return {\n highlight: (function(_this) {\n return function() {\n return marker['_omsData'].leg.setOptions({\n strokeColor: _this['legColors']['highlighted'][_this.map.mapTypeId],\n zIndex: _this['highlightedLegZIndex']\n });\n };\n })(this),\n unhighlight: (function(_this) {\n return function() {\n return marker['_omsData'].leg.setOptions({\n strokeColor: _this['legColors']['usual'][_this.map.mapTypeId],\n zIndex: _this['usualLegZIndex']\n });\n };\n })(this)\n };\n };\n\n p.spiderfy = function(markerData, nonNearbyMarkers) {\n var bodyPt, footLl, footPt, footPts, highlightListenerFuncs, leg, marker, md, nearestMarkerDatum, numFeet, spiderfiedMarkers;\n if (this['minZoomLevel'] && this.map.getZoom() < this['minZoomLevel']) {\n return false;\n }\n this.spiderfying = true;\n numFeet = markerData.length;\n bodyPt = this.ptAverage((function() {\n var l, len1, results;\n results = [];\n for (l = 0, len1 = markerData.length; l < len1; l++) {\n md = markerData[l];\n results.push(md.markerPt);\n }\n return results;\n })());\n footPts = numFeet >= this['circleSpiralSwitchover'] ? this.generatePtsSpiral(numFeet, bodyPt).reverse() : this.generatePtsCircle(numFeet, bodyPt);\n spiderfiedMarkers = (function() {\n var l, len1, results;\n results = [];\n for (l = 0, len1 = footPts.length; l < len1; l++) {\n footPt = footPts[l];\n footLl = this.ptToLl(footPt);\n nearestMarkerDatum = this.minExtract(markerData, (function(_this) {\n return function(md) {\n return _this.ptDistanceSq(md.markerPt, footPt);\n };\n })(this));\n marker = nearestMarkerDatum.marker;\n leg = new gm.Polyline({\n map: this.map,\n path: [marker.position, footLl],\n strokeColor: this['legColors']['usual'][this.map.mapTypeId],\n strokeWeight: this['legWeight'],\n zIndex: this['usualLegZIndex']\n });\n marker['_omsData'] = {\n usualPosition: marker.position,\n leg: leg\n };\n if (this['legColors']['highlighted'][this.map.mapTypeId] !== this['legColors']['usual'][this.map.mapTypeId]) {\n highlightListenerFuncs = this.makeHighlightListenerFuncs(marker);\n marker['_omsData'].hightlightListeners = {\n highlight: ge.addListener(marker, 'mouseover', highlightListenerFuncs.highlight),\n unhighlight: ge.addListener(marker, 'mouseout', highlightListenerFuncs.unhighlight)\n };\n }\n marker.setPosition(footLl);\n marker.setZIndex(Math.round(this['spiderfiedZIndex'] + footPt.y));\n results.push(marker);\n }\n return results;\n }).call(this);\n delete this.spiderfying;\n this.spiderfied = true;\n return this.trigger('spiderfy', spiderfiedMarkers, nonNearbyMarkers);\n };\n\n p['unspiderfy'] = function(markerNotToMove) {\n var l, len1, listeners, marker, nonNearbyMarkers, ref1, unspiderfiedMarkers;\n if (markerNotToMove == null) {\n markerNotToMove = null;\n }\n if (this.spiderfied == null) {\n return this;\n }\n this.unspiderfying = true;\n unspiderfiedMarkers = [];\n nonNearbyMarkers = [];\n ref1 = this.markers;\n for (l = 0, len1 = ref1.length; l < len1; l++) {\n marker = ref1[l];\n if (marker['_omsData'] != null) {\n marker['_omsData'].leg.setMap(null);\n if (marker !== markerNotToMove) {\n marker.setPosition(marker['_omsData'].usualPosition);\n }\n marker.setZIndex(null);\n listeners = marker['_omsData'].hightlightListeners;\n if (listeners != null) {\n ge.removeListener(listeners.highlight);\n ge.removeListener(listeners.unhighlight);\n }\n delete marker['_omsData'];\n unspiderfiedMarkers.push(marker);\n } else {\n nonNearbyMarkers.push(marker);\n }\n }\n delete this.unspiderfying;\n delete this.spiderfied;\n this.trigger('unspiderfy', unspiderfiedMarkers, nonNearbyMarkers);\n return this;\n };\n\n p.ptDistanceSq = function(pt1, pt2) {\n var dx, dy;\n dx = pt1.x - pt2.x;\n dy = pt1.y - pt2.y;\n return dx * dx + dy * dy;\n };\n\n p.ptAverage = function(pts) {\n var l, len1, numPts, pt, sumX, sumY;\n sumX = sumY = 0;\n for (l = 0, len1 = pts.length; l < len1; l++) {\n pt = pts[l];\n sumX += pt.x;\n sumY += pt.y;\n }\n numPts = pts.length;\n return new gm.Point(sumX / numPts, sumY / numPts);\n };\n\n p.llToPt = function(ll) {\n return this.projHelper.getProjection().fromLatLngToDivPixel(ll);\n };\n\n p.ptToLl = function(pt) {\n return this.projHelper.getProjection().fromDivPixelToLatLng(pt);\n };\n\n p.minExtract = function(set, func) {\n var bestIndex, bestVal, index, item, l, len1, val;\n for (index = l = 0, len1 = set.length; l < len1; index = ++l) {\n item = set[index];\n val = func(item);\n if ((typeof bestIndex === \"undefined\" || bestIndex === null) || val < bestVal) {\n bestVal = val;\n bestIndex = index;\n }\n }\n return set.splice(bestIndex, 1)[0];\n };\n\n p.arrIndexOf = function(arr, obj) {\n var i, l, len1, o;\n if (arr.indexOf != null) {\n return arr.indexOf(obj);\n }\n for (i = l = 0, len1 = arr.length; l < len1; i = ++l) {\n o = arr[i];\n if (o === obj) {\n return i;\n }\n }\n return -1;\n };\n\n return _Class;\n\n})();\n\n }.apply(self);\n\n GoogleMapApi.then(function(){\n self.OverlappingMarkerSpiderfier.initializeGoogleMaps(window.google);\n });\n return this.OverlappingMarkerSpiderfier;\n}]);\n","/**\n * Performance overrides on MarkerClusterer custom to Angular Google Maps\n *\n * Created by Petr Bruna ccg1415 and Nick McCready on 7/13/14.\n */\nangular.module('uiGmapgoogle-maps.extensions')\n.service('uiGmapExtendMarkerClusterer',['uiGmapLodash', 'uiGmapPropMap', function (uiGmapLodash, PropMap) {\n return {\n init: _.once(function () {\n (function () {\n var __hasProp = {}.hasOwnProperty,\n __extends = function (child, parent) {\n for (var key in parent) {\n if (__hasProp.call(parent, key)) child[key] = parent[key];\n }\n function ctor() {\n this.constructor = child;\n }\n\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n child.__super__ = parent.prototype;\n return child;\n };\n\n window.NgMapCluster = (function (_super) {\n __extends(NgMapCluster, _super);\n\n function NgMapCluster(opts) {\n NgMapCluster.__super__.constructor.call(this, opts);\n this.markers_ = new PropMap();\n }\n\n /**\n * Adds a marker to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to be added.\n * @return {boolean} True if the marker was added.\n * @ignore\n */\n NgMapCluster.prototype.addMarker = function (marker) {\n var i;\n var mCount;\n var mz;\n\n if (this.isMarkerAlreadyAdded_(marker)) {\n var oldMarker = this.markers_.get(marker.key);\n if (oldMarker.getPosition().lat() == marker.getPosition().lat() && oldMarker.getPosition().lon() == marker.getPosition().lon()) //if nothing has changed\n return false;\n }\n\n if (!this.center_) {\n this.center_ = marker.getPosition();\n this.calculateBounds_();\n } else {\n if (this.averageCenter_) {\n var l = this.markers_.length + 1;\n var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\n var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\n this.center_ = new google.maps.LatLng(lat, lng);\n this.calculateBounds_();\n }\n }\n marker.isAdded = true;\n this.markers_.push(marker);\n\n mCount = this.markers_.length;\n mz = this.markerClusterer_.getMaxZoom();\n if (mz !== null && this.map_.getZoom() > mz) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map_) {\n marker.setMap(this.map_);\n }\n } else if (mCount < this.minClusterSize_) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map_) {\n marker.setMap(this.map_);\n }\n } else if (mCount === this.minClusterSize_) {\n // Hide the markers that were showing.\n this.markers_.each(function (m) {\n m.setMap(null);\n });\n } else {\n marker.setMap(null);\n }\n\n //this.updateIcon_();\n return true;\n };\n\n /**\n * Determines if a marker has already been added to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker has already been added.\n */\n NgMapCluster.prototype.isMarkerAlreadyAdded_ = function (marker) {\n return uiGmapLodash.isNullOrUndefined(this.markers_.get(marker.key));\n };\n\n\n /**\n * Returns the bounds of the cluster.\n *\n * @return {google.maps.LatLngBounds} the cluster bounds.\n * @ignore\n */\n NgMapCluster.prototype.getBounds = function () {\n var i;\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n this.getMarkers().each(function(m){\n bounds.extend(m.getPosition());\n });\n return bounds;\n };\n\n\n /**\n * Removes the cluster from the map.\n *\n * @ignore\n */\n NgMapCluster.prototype.remove = function () {\n this.clusterIcon_.setMap(null);\n this.markers_ = new PropMap();\n delete this.markers_;\n };\n\n\n return NgMapCluster;\n\n })(Cluster);\n\n\n window.NgMapMarkerClusterer = (function (_super) {\n __extends(NgMapMarkerClusterer, _super);\n\n function NgMapMarkerClusterer(map, opt_markers, opt_options) {\n NgMapMarkerClusterer.__super__.constructor.call(this, map, opt_markers, opt_options);\n this.markers_ = new PropMap();\n }\n\n /**\n * Removes all clusters and markers from the map and also removes all markers\n * managed by the clusterer.\n */\n NgMapMarkerClusterer.prototype.clearMarkers = function () {\n this.resetViewport_(true);\n this.markers_ = new PropMap();\n };\n /**\n * Removes a marker and returns true if removed, false if not.\n *\n * @param {google.maps.Marker} marker The marker to remove\n * @return {boolean} Whether the marker was removed or not\n */\n NgMapMarkerClusterer.prototype.removeMarker_ = function (marker) {\n if (!this.markers_.get(marker.key)) {\n return false;\n }\n marker.setMap(null);\n this.markers_.remove(marker.key); // Remove the marker from the list of managed markers\n return true;\n };\n\n /**\n * Creates the clusters. This is done in batches to avoid timeout errors\n * in some browsers when there is a huge number of markers.\n *\n * @param {number} iFirst The index of the first marker in the batch of\n * markers to be added to clusters.\n */\n NgMapMarkerClusterer.prototype.createClusters_ = function (iFirst) {\n var i, marker;\n var mapBounds;\n var cMarkerClusterer = this;\n if (!this.ready_) {\n return;\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the MarkerClusterer begins\n * clustering markers.\n * @name MarkerClusterer#clusteringbegin\n * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this);\n\n if (typeof this.timerRefStatic !== 'undefined') {\n clearTimeout(this.timerRefStatic);\n delete this.timerRefStatic;\n }\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n if (this.getMap().getZoom() > 3) {\n mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),\n this.getMap().getBounds().getNorthEast());\n } else {\n mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625));\n }\n var bounds = this.getExtendedBounds(mapBounds);\n\n var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length);\n\n var _ms = this.markers_.values();\n for (i = iFirst; i < iLast; i++) {\n marker = _ms[i];\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\n if (!this.ignoreHidden_ || (this.ignoreHidden_ && marker.getVisible())) {\n this.addToClosestCluster_(marker);\n }\n }\n }\n\n if (iLast < this.markers_.length) {\n this.timerRefStatic = setTimeout(function () {\n cMarkerClusterer.createClusters_(iLast);\n }, 0);\n } else {\n // custom addition by ui-gmap\n // update icon for all clusters\n for (i = 0; i < this.clusters_.length; i++) {\n this.clusters_[i].updateIcon_();\n }\n\n delete this.timerRefStatic;\n\n /**\n * This event is fired when the MarkerClusterer stops\n * clustering markers.\n * @name MarkerClusterer#clusteringend\n * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this);\n }\n };\n\n /**\n * Adds a marker to a cluster, or creates a new cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n */\n NgMapMarkerClusterer.prototype.addToClosestCluster_ = function (marker) {\n var i, d, cluster, center;\n var distance = 40000; // Some large number\n var clusterToAddTo = null;\n for (i = 0; i < this.clusters_.length; i++) {\n cluster = this.clusters_[i];\n center = cluster.getCenter();\n if (center) {\n d = this.distanceBetweenPoints_(center, marker.getPosition());\n if (d < distance) {\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker);\n } else {\n cluster = new NgMapCluster(this);\n cluster.addMarker(marker);\n this.clusters_.push(cluster);\n }\n };\n\n /**\n * Redraws all the clusters.\n */\n NgMapMarkerClusterer.prototype.redraw_ = function () {\n this.createClusters_(0);\n };\n\n\n /**\n * Removes all clusters from the map. The markers are also removed from the map\n * if opt_hide is set to true.\n *\n * @param {boolean} [opt_hide] Set to true to also remove the markers\n * from the map.\n */\n NgMapMarkerClusterer.prototype.resetViewport_ = function (opt_hide) {\n var i, marker;\n // Remove all the clusters\n for (i = 0; i < this.clusters_.length; i++) {\n this.clusters_[i].remove();\n }\n this.clusters_ = [];\n\n // Reset the markers to not be added and to be removed from the map.\n this.markers_.each(function (marker) {\n marker.isAdded = false;\n if (opt_hide) {\n marker.setMap(null);\n }\n });\n };\n\n /**\n * Extends an object's prototype by another's.\n *\n * @param {Object} obj1 The object to be extended.\n * @param {Object} obj2 The object to extend with.\n * @return {Object} The new extended object.\n * @ignore\n */\n NgMapMarkerClusterer.prototype.extend = function (obj1, obj2) {\n return (function (object) {\n var property;\n for (property in object.prototype) {\n if (property !== 'constructor')\n this.prototype[property] = object.prototype[property];\n }\n return this;\n }).apply(obj1, [obj2]);\n };\n ////////////////////////////////////////////////////////////////////////////////\n /*\n Other overrides relevant to MarkerClusterPlus\n */\n ////////////////////////////////////////////////////////////////////////////////\n /**\n * Positions and shows the icon.\n */\n ClusterIcon.prototype.show = function () {\n if (this.div_) {\n var img = \"\";\n // NOTE: values must be specified in px units\n var bp = this.backgroundPosition_.split(\" \");\n var spriteH = parseInt(bp[0].trim(), 10);\n var spriteV = parseInt(bp[1].trim(), 10);\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n img = \"\";\n this.div_.innerHTML = img + \"

\" + this.sums_.text + \"
\";\n if (typeof this.sums_.title === \"undefined\" || this.sums_.title === \"\") {\n this.div_.title = this.cluster_.getMarkerClusterer().getTitle();\n } else {\n this.div_.title = this.sums_.title;\n }\n this.div_.style.display = \"\";\n }\n this.visible_ = true;\n };\n //END OTHER OVERRIDES\n ////////////////////////////////////////////////////////////////////////////////\n\n return NgMapMarkerClusterer;\n\n })(MarkerClusterer);\n }).call(this);\n })\n };\n}]);\n"]} \ No newline at end of file diff --git a/dist/angular-google-maps_dev_mapped.min.js b/dist/angular-google-maps_dev_mapped.min.js new file mode 100644 index 000000000..80e73fada --- /dev/null +++ b/dist/angular-google-maps_dev_mapped.min.js @@ -0,0 +1,13 @@ +/*! angular-google-maps 2.4.1 2017-01-05 + * AngularJS directives for Google Maps + * git: https://github.com/angular-ui/angular-google-maps.git + */ + +!function(a,b,c,d){"use strict";(function(){b.module("uiGmapgoogle-maps.providers",["nemLogging"]),b.module("uiGmapgoogle-maps.wrapped",[]),b.module("uiGmapgoogle-maps.extensions",["uiGmapgoogle-maps.wrapped","uiGmapgoogle-maps.providers"]),b.module("uiGmapgoogle-maps.directives.api.utils",["uiGmapgoogle-maps.extensions"]),b.module("uiGmapgoogle-maps.directives.api.managers",[]),b.module("uiGmapgoogle-maps.directives.api.options",["uiGmapgoogle-maps.directives.api.utils"]),b.module("uiGmapgoogle-maps.directives.api.options.builders",[]),b.module("uiGmapgoogle-maps.directives.api.models.child",["uiGmapgoogle-maps.directives.api.utils","uiGmapgoogle-maps.directives.api.options","uiGmapgoogle-maps.directives.api.options.builders"]),b.module("uiGmapgoogle-maps.directives.api.models.parent",["uiGmapgoogle-maps.directives.api.managers","uiGmapgoogle-maps.directives.api.models.child","uiGmapgoogle-maps.providers"]),b.module("uiGmapgoogle-maps.directives.api",["uiGmapgoogle-maps.directives.api.models.parent"]),b.module("uiGmapgoogle-maps",["uiGmapgoogle-maps.directives.api","uiGmapgoogle-maps.providers"])}).call(this),function(){b.module("uiGmapgoogle-maps.providers").factory("uiGmapMapScriptLoader",["$q","uiGmapuuid",function(d,e){var f,g,h,i,j;return i=void 0,j=void 0,f=function(a){return a.china?"http://maps.google.cn/maps/api/js?":"auto"===a.transport?"//maps.googleapis.com/maps/api/js?":a.transport+"://maps.googleapis.com/maps/api/js?"},g=function(a){var b,d,g,h;return b=["transport","isGoogleMapsForWork","china","preventLoad"],a.isGoogleMapsForWork&&b.push("key"),d=c.map(c.omit(a,b),function(a,b){return b+"="+a}),i&&(h=document.getElementById(i),h.parentNode.removeChild(h)),d=d.join("&"),g=document.createElement("script"),g.id=i="ui_gmap_map_load_"+e.generate(),g.type="text/javascript",g.src=f(a)+d,document.head.appendChild(g)},h=function(){return b.isDefined(a.google)&&b.isDefined(a.google.maps)},{load:function(b){var c,e;return c=d.defer(),h()?(c.resolve(a.google.maps),c.promise):(e=b.callback="onGoogleMapsReady"+Math.round(1e3*Math.random()),a[e]=function(){a[e]=null,c.resolve(a.google.maps)},a.navigator.connection&&a.Connection&&a.navigator.connection.type===a.Connection.NONE&&!b.preventLoad?document.addEventListener("online",function(){if(!h())return g(b)}):b.preventLoad||g(b),j=b,j.randomizedFunctionName=e,c.promise)},manualLoad:function(){var b;return b=j,h()?a[b.randomizedFunctionName]?a[b.randomizedFunctionName]():void 0:g(b)}}}]).provider("uiGmapGoogleMapApi",function(){return this.options={transport:"https",isGoogleMapsForWork:!1,china:!1,v:"3",libraries:"",language:"en",preventLoad:!1},this.configure=function(a){b.extend(this.options,a)},this.$get=["uiGmapMapScriptLoader",function(a){return function(b){return b.load(a.options)}}(this)],this}).service("uiGmapGoogleMapApiManualLoader",["uiGmapMapScriptLoader",function(a){return{load:function(){a.manualLoad()}}}])}.call(this),function(){var d=function(a,b){return function(){return a.apply(b,arguments)}},e=function(a,b){function c(){this.constructor=a}for(var d in b)f.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},f={}.hasOwnProperty;b.module("uiGmapgoogle-maps.extensions").service("uiGmapExtendGWin",function(){return{init:c.once(function(){var b;if(google||("undefined"!=typeof google&&null!==google?google.maps:void 0)||null!=google.maps.InfoWindow)return google.maps.InfoWindow.prototype._open=google.maps.InfoWindow.prototype.open,google.maps.InfoWindow.prototype._close=google.maps.InfoWindow.prototype.close,google.maps.InfoWindow.prototype._isOpen=!1,google.maps.InfoWindow.prototype.open=function(a,b,c){null==c&&(this._isOpen=!0,this._open(a,b,!0))},google.maps.InfoWindow.prototype.close=function(a){null==a&&(this._isOpen=!1,this._close(!0))},google.maps.InfoWindow.prototype.isOpen=function(a){return null==a&&(a=void 0),null==a?this._isOpen:this._isOpen=a},a.InfoBox&&(a.InfoBox.prototype._open=a.InfoBox.prototype.open,a.InfoBox.prototype._close=a.InfoBox.prototype.close,a.InfoBox.prototype._isOpen=!1,a.InfoBox.prototype.open=function(a,b){this._isOpen=!0,this._open(a,b)},a.InfoBox.prototype.close=function(){this._isOpen=!1,this._close()},a.InfoBox.prototype.isOpen=function(a){return null==a&&(a=void 0),null==a?this._isOpen:this._isOpen=a},b=function(b){function f(b){this.getOrigCloseBoxImg_=d(this.getOrigCloseBoxImg_,this),this.getCloseBoxDiv_=d(this.getCloseBoxDiv_,this);var e;e=new a.InfoBox(b),c.extend(this,e),null!=b.closeBoxDiv&&(this.closeBoxDiv_=b.closeBoxDiv)}return e(f,b),f.prototype.getCloseBoxDiv_=function(){return this.closeBoxDiv_},f.prototype.getCloseBoxImg_=function(){var a,b;return a=this.getCloseBoxDiv_(),b=this.getOrigCloseBoxImg_(),a||b},f.prototype.getOrigCloseBoxImg_=function(){var a;return a="",""!==this.closeBoxURL_&&(a="0&&(f=e[0])):f=c,f},defaultDelay:50,isTrue:function(a){return f(a,!0,["true","TRUE",1,"y","Y","yes","YES"])},isFalse:e,isFalsy:function(a){return f(a,!1,[void 0,null])||e(a)},getCoords:g,validateCoords:j,equalCoords:function(a,b){return h(a)===h(b)&&i(a)===i(b)},validatePath:function(a){var d,e,f,g;if(e=0,b.isUndefined(a.type)){if(!Array.isArray(a)||a.length<2)return!1;for(;ethis.max)return this.max=a[0].length,this.index=b},g),f=a.coordinates[g.index],d=f[0],d.length<4)return!1}else{if("LineString"!==a.type)return!1;if(a.coordinates.length<2)return!1;d=a.coordinates}for(;ethis.max)return this.max=a[0].length,this.index=b},h),d=a.coordinates[h.index][0]):"LineString"===a.type&&(d=a.coordinates);e0&&(d-=1),f.length&&(f.length-=1)}}}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapLinked",["uiGmapBaseObject",function(b){var c;return c=function(b){function c(a,b,c,d){this.scope=a,this.element=b,this.attrs=c,this.ctrls=d}return a(c,b),c}(b)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapLogger",["nemSimpleLogger",function(a){return a.spawn()}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapModelKey",["uiGmapBaseObject","uiGmapGmapUtil",function(e,f){return function(e){function g(b,c){this.scope=b,this.interface=null!=c?c:{scopeKeys:[]},this.modelsLength=a(this.modelsLength,this),this.updateChild=a(this.updateChild,this),this.destroy=a(this.destroy,this),this.setChildScope=a(this.setChildScope,this),this.getChanges=a(this.getChanges,this),this.getProp=a(this.getProp,this),this.setIdKey=a(this.setIdKey,this),this.modelKeyComparison=a(this.modelKeyComparison,this),g.__super__.constructor.call(this),this.defaultIdKey="id",this.idKey=void 0}return d(g,e),g.prototype.evalModelHandle=function(a,b){if(null!=a&&null!=b)return"self"===b?a:(c.isFunction(b)&&(b=b()),f.getPath(a,b))},g.prototype.modelKeyComparison=function(a,b){var d,e,g,h,i,j;if(g=this.interface.scopeKeys.indexOf("coords")>=0,(g&&null!=this.scope.coords||!g)&&(i=this.scope),null==i)throw"No scope set!";return g&&(d=this.scopeOrModelVal("coords",i,a),e=this.scopeOrModelVal("coords",i,b),h=f.equalCoords(d,e),!h)?h:(j=c.without(this.interface.scopeKeys,"coords"),h=c.every(j,function(d){return function(e){var f,g;return f=d.scopeOrModelVal(i[e],i,a),g=d.scopeOrModelVal(i[e],i,b),i.deepComparison?c.isEqual(f,g):f===g}}(this)))},g.prototype.setIdKey=function(a){return this.idKey=null!=a.idKey?a.idKey:this.defaultIdKey},g.prototype.setVal=function(a,b,c){return this.modelOrKey(a,b=c),a},g.prototype.modelOrKey=function(a,b){if(null!=b)return"self"!==b?f.getPath(a,b):a},g.prototype.getProp=function(a,b,c){return this.scopeOrModelVal(a,b,c)},g.prototype.getChanges=function(a,b,d){var e,f,g;d&&(b=c.pick(b,d),a=c.pick(a,d)),f={},g={},e={};for(g in a)b&&b[g]===a[g]||(c.isArray(a[g])?f[g]=a[g]:c.isObject(a[g])?(e=this.getChanges(a[g],b?b[g]:null),c.isEmpty(e)||(f[g]=e)):f[g]=a[g]);return f},g.prototype.scopeOrModelVal=function(a,b,d,e){var f,g,h,i;return null==e&&(e=!1),f=function(a,b,c){return null==c&&(c=!1),c?{isScope:a,value:b}:b},i=c.get(b,a),c.isFunction(i)?f(!0,i(d),e):c.isObject(i)?f(!0,i,e):c.isString(i)?(g=i,h=g?"self"===g?d:c.get(d,g):c.get(d,a),c.isFunction(h)?f(!1,h(),e):f(!1,h,e)):f(!0,i,e)},g.prototype.setChildScope=function(a,b,c){var d,e,f,g;for(e in a)f=a[e],d=this.scopeOrModelVal(f,b,c,!0),null!=(null!=d?d.value:void 0)&&(g=d.value,g!==b[f]&&(b[f]=g));return b.model=c},g.prototype.onDestroy=function(a){},g.prototype.destroy=function(a){var b;return null==a&&(a=!1),null==this.scope||(null!=(b=this.scope)?b.$$destroyed:void 0)||!this.needToManualDestroy&&!a?this.clean():this.scope.$destroy()},g.prototype.updateChild=function(a,b){return null==b[this.idKey]?void this.$log.error("Model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."):a.updateModel(b)},g.prototype.modelsLength=function(a){var c,d;return null==a&&(a=void 0),c=0,d=a?a:this.scope.models,null==d?c:c=b.isArray(d)||null!=d.length?d.length:Object.keys(d).length},g}(e)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapModelsWatcher",["uiGmapLogger","uiGmap_async","$q","uiGmapPromise",function(a,b,c,d){return{didQueueInitPromise:function(a,c){return 0===c.models.length&&(b.promiseLock(a,d.promiseTypes.init,null,null,function(){return d.resolve()}),!0)},figureOutState:function(b,c,d,e,f){var g,h,i,j,k;return g=[],i={},j=[],k=[],c.models.forEach(function(f){var h;return null==f[b]?a.error(" id missing for model #{m.toString()},\ncan not use do comparison/insertion"):(i[f[b]]={},null==d.get(f[b])?g.push(f):(h=d.get(f[b]),e(f,h.clonedModel,c)?void 0:k.push({model:f,child:h})))}),h=d.values(),h.forEach(function(c){var d;return null==c?void a.error("child undefined in ModelsWatcher."):null==c.model?void a.error("child.model undefined in ModelsWatcher."):(d=c.model[b],null==i[d]?j.push(c):void 0)}),{adds:g,removals:j,updates:k}}}}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapPromise",["$q","$timeout","uiGmapLogger",function(a,b,d){var e,f,g,h,i,j,k,l,m,n,o;return m={create:"create",update:"update",delete:"delete",init:"init"},l={IN_PROGRESS:0,RESOLVED:1,REJECTED:2},o=function(){var a;return a={},a[""+l.IN_PROGRESS]="in-progress",a[""+l.RESOLVED]="resolved",a[""+l.REJECTED]="rejected",a}(),h=function(a){return a.$$state?a.$$state.status===l.IN_PROGRESS:!a.hasOwnProperty("$$v")||void 0},i=function(a){return a.$$state?a.$$state.status===l.RESOLVED:!!a.hasOwnProperty("$$v")||void 0},k=function(a){return o[a]||"done w error"},e=function(b){var c,d,e;return c=a.defer(),d=a.all([b,c.promise]),e=a.defer(),b.then(c.resolve,function(){},function(a){return c.notify(a),e.notify(a)}),d.then(function(a){return e.resolve(a[0]||a[1])},function(a){return e.reject(a)}),e.promise.cancel=function(a){return null==a&&(a="canceled"),c.reject(a)},e.promise.notify=function(a){if(null==a&&(a="cancel safe"),e.notify(a),b.hasOwnProperty("notify"))return b.notify(a)},null!=b.promiseType&&(e.promise.promiseType=b.promiseType),e.promise},f=function(a,b){return{promise:a,promiseType:b}},g=function(){return a.defer()},n=function(){var b;return b=a.defer(),b.resolve.apply(void 0,arguments),b.promise},j=function(e){var f;return c.isFunction(e)?(f=a.defer(),b(function(){var a;return a=e(),f.resolve(a)}),f.promise):void d.error("uiGmapPromise.promise() only accepts functions")},{defer:g,promise:j,resolve:n,promiseTypes:m,isInProgress:h,isResolved:i,promiseStatus:k,ExposedPromise:e,SniffedPromise:f}}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapPropMap",function(){var b;return b=function(){function b(){this.removeAll=a(this.removeAll,this),this.slice=a(this.slice,this),this.push=a(this.push,this),this.keys=a(this.keys,this),this.values=a(this.values,this),this.remove=a(this.remove,this),this.put=a(this.put,this),this.stateChanged=a(this.stateChanged,this),this.get=a(this.get,this),this.length=0,this.dict={},this.didValsStateChange=!1,this.didKeysStateChange=!1,this.allVals=[],this.allKeys=[]}return b.prototype.get=function(a){return this.dict[a]},b.prototype.stateChanged=function(){return this.didValsStateChange=!0,this.didKeysStateChange=!0},b.prototype.put=function(a,b){return null==this.get(a)&&this.length++,this.stateChanged(),this.dict[a]=b},b.prototype.remove=function(a,b){var c;if(null==b&&(b=!1),!b||this.get(a))return c=this.dict[a],delete this.dict[a],this.length--,this.stateChanged(),c},b.prototype.valuesOrKeys=function(a){var b,d;return null==a&&(a="Keys"),this["did"+a+"StateChange"]?(d=[],b=[],c.each(this.dict,function(a,c){return d.push(a),b.push(c)}),this.didKeysStateChange=!1,this.didValsStateChange=!1,this.allVals=d,this.allKeys=b,this["all"+a]):this["all"+a]},b.prototype.values=function(){return this.valuesOrKeys("Vals")},b.prototype.keys=function(){return this.valuesOrKeys()},b.prototype.push=function(a,b){return null==b&&(b="key"),this.put(a[b],a)},b.prototype.slice=function(){return this.keys().map(function(a){return function(b){return a.remove(b)}}(this))},b.prototype.removeAll=function(){return this.slice()},b.prototype.each=function(a){return c.each(this.dict,function(b,c){return a(b)})},b.prototype.map=function(a){return c.map(this.dict,function(b,c){return a(b)})},b}()})}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.utils").factory("uiGmapPropertyAction",["uiGmapLogger",function(a){var b;return b=function(a){return this.setIfChange=function(b){return function(d,e){if(!c.isEqual(e,d))return a(b,d)}},this.sic=this.setIfChange,this}}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps.directives.api.managers").factory("uiGmapClustererMarkerManager",["uiGmapLogger","uiGmapFitHelper","uiGmapPropMap","uiGmapEventsHelper",function(c,d,e,f){var g;return g=function(){function g(b,d,f,h){null==d&&(d={}),this.opt_options=null!=f?f:{},this.opt_events=h,this.getGMarkers=a(this.getGMarkers,this),this.fit=a(this.fit,this),this.destroy=a(this.destroy,this),this.attachEvents=a(this.attachEvents,this),this.clear=a(this.clear,this),this.draw=a(this.draw,this),this.removeMany=a(this.removeMany,this),this.remove=a(this.remove,this),this.addMany=a(this.addMany,this),this.update=a(this.update,this),this.add=a(this.add,this),this.type=g.type,this.clusterer=new NgMapMarkerClusterer(b,d,this.opt_options),this.propMapGMarkers=new e,this.attachEvents(this.opt_events,"opt_events"),this.clusterer.setIgnoreHidden(!0),this.noDrawOnSingleAddRemoves=!0,c.info(this)}return g.type="ClustererMarkerManager",g.prototype.checkKey=function(a){var b;if(null==a.key)return b="gMarker.key undefined and it is REQUIRED!!",c.error(b)},g.prototype.add=function(a){return this.checkKey(a),this.clusterer.addMarker(a,this.noDrawOnSingleAddRemoves),this.propMapGMarkers.put(a.key,a),this.checkSync()},g.prototype.update=function(a){return this.remove(a),this.add(a)},g.prototype.addMany=function(a){return a.forEach(function(a){return function(b){return a.add(b)}}(this))},g.prototype.remove=function(a){var b;return this.checkKey(a),b=this.propMapGMarkers.get(a.key),b&&(this.clusterer.removeMarker(a,this.noDrawOnSingleAddRemoves),this.propMapGMarkers.remove(a.key)),this.checkSync()},g.prototype.removeMany=function(a){return a.forEach(function(a){return function(b){return a.remove(b)}}(this))},g.prototype.draw=function(){return this.clusterer.repaint()},g.prototype.clear=function(){return this.removeMany(this.getGMarkers()),this.clusterer.repaint()},g.prototype.attachEvents=function(a,d){var e,f,g;if(this.listeners=[],b.isDefined(a)&&null!=a&&b.isObject(a)){g=[];for(f in a)e=a[f],a.hasOwnProperty(f)&&b.isFunction(a[f])?(c.info(d+": Attaching event: "+f+" to clusterer"),g.push(this.listeners.push(google.maps.event.addListener(this.clusterer,f,a[f])))):g.push(void 0);return g}},g.prototype.clearEvents=function(){return f.removeEvents(this.listeners),this.listeners=[]},g.prototype.destroy=function(){return this.clearEvents(),this.clear()},g.prototype.fit=function(){return d.fit(this.getGMarkers(),this.clusterer.getMap())},g.prototype.getGMarkers=function(){return this.clusterer.getMarkers().values()},g.prototype.checkSync=function(){},g}()}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.managers").service("uiGmapGoogleMapObjectManager",[function(){var a,c;return a=[],c=[],{createMapInstance:function(d,e){var f;return f=null,0===a.length?(f=new google.maps.Map(d,e),c.push(f)):(f=a.pop(),b.element(d).append(f.getDiv()),f.setOptions(e),c.push(f)),f},recycleMapInstance:function(b){var d;if(d=c.indexOf(b),d<0)throw new Error("Expected map instance to be a previously used instance");return c.splice(d,1),a.push(b)}}}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps.directives.api.managers").factory("uiGmapMarkerManager",["uiGmapLogger","uiGmapFitHelper","uiGmapPropMap",function(b,c,d){var e;return e=function(){function e(c,f,g){this.getGMarkers=a(this.getGMarkers,this),this.fit=a(this.fit,this),this.handleOptDraw=a(this.handleOptDraw,this),this.clear=a(this.clear,this),this.destroy=a(this.destroy,this),this.draw=a(this.draw,this),this.removeMany=a(this.removeMany,this),this.remove=a(this.remove,this),this.addMany=a(this.addMany,this),this.update=a(this.update,this),this.add=a(this.add,this),this.type=e.type,this.gMap=c,this.gMarkers=new d,this.$log=b,this.$log.info(this)}return e.type="MarkerManager",e.prototype.add=function(a,c){var d,e;if(null==c&&(c=!0),null==a.key)throw e="gMarker.key undefined and it is REQUIRED!!",b.error(e),e;if(d=this.gMarkers.get(a.key),!d)return this.handleOptDraw(a,c,!0),this.gMarkers.put(a.key,a)},e.prototype.update=function(a,b){return null==b&&(b=!0),this.remove(a,b),this.add(a,b)},e.prototype.addMany=function(a){return a.forEach(function(a){return function(b){return a.add(b)}}(this))},e.prototype.remove=function(a,b){if(null==b&&(b=!0),this.handleOptDraw(a,b,!1),this.gMarkers.get(a.key))return this.gMarkers.remove(a.key)},e.prototype.removeMany=function(a){return a.forEach(function(a){return function(b){return a.remove(b)}}(this))},e.prototype.draw=function(){var a;return a=[],this.gMarkers.each(function(b){return function(c){if(!c.isDrawn)return c.doAdd?(c.setMap(b.gMap),c.isDrawn=!0):a.push(c)}}(this)),a.forEach(function(a){return function(b){return b.isDrawn=!1,a.remove(b,!0)}}(this))},e.prototype.destroy=function(){return this.clear()},e.prototype.clear=function(){return this.gMarkers.each(function(a){ +return a.setMap(null)}),delete this.gMarkers,this.gMarkers=new d},e.prototype.handleOptDraw=function(a,b,c){return b===!0?(c?a.setMap(this.gMap):a.setMap(null),a.isDrawn=!0):(a.isDrawn=!1,a.doAdd=c)},e.prototype.fit=function(){return c.fit(this.getGMarkers(),this.gMap)},e.prototype.getGMarkers=function(){return this.gMarkers.values()},e}()}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps.directives.api.managers").factory("uiGmapSpiderfierMarkerManager",["uiGmapLogger","uiGmapFitHelper","uiGmapPropMap","uiGmapMarkerSpiderfier",function(d,e,f,g){var h;return h=function(){function h(b,c,e,i,j){null==c&&(c={}),this.opt_options=null!=e?e:{},this.opt_events=i,this.scope=j,this.isSpiderfied=a(this.isSpiderfied,this),this.getGMarkers=a(this.getGMarkers,this),this.fit=a(this.fit,this),this.destroy=a(this.destroy,this),this.attachEvents=a(this.attachEvents,this),this.clear=a(this.clear,this),this.removeMany=a(this.removeMany,this),this.remove=a(this.remove,this),this.addMany=a(this.addMany,this),this.update=a(this.update,this),this.add=a(this.add,this),this.type=h.type,this.markerSpiderfier=new g(b,this.opt_options),this.propMapGMarkers=new f,this.attachEvents(this.opt_events,"opt_events"),this.noDrawOnSingleAddRemoves=!0,d.info(this)}return h.type="SpiderfierMarkerManager",h.prototype.checkKey=function(a){var b;if(null==a.key)return b="gMarker.key undefined and it is REQUIRED!!",d.error(b)},h.prototype.add=function(a){return a.setMap(this.markerSpiderfier.map),this.checkKey(a),this.markerSpiderfier.addMarker(a,this.noDrawOnSingleAddRemoves),this.propMapGMarkers.put(a.key,a),this.checkSync()},h.prototype.update=function(a){return this.remove(a),this.add(a)},h.prototype.addMany=function(a){return a.forEach(function(a){return function(b){return a.add(b)}}(this))},h.prototype.remove=function(a){var b;return this.checkKey(a),b=this.propMapGMarkers.get(a.key),b&&(a.setMap(null),this.markerSpiderfier.removeMarker(a,this.noDrawOnSingleAddRemoves),this.propMapGMarkers.remove(a.key)),this.checkSync()},h.prototype.removeMany=function(a){return a.forEach(function(a){return function(b){return a.remove(b)}}(this))},h.prototype.draw=function(){},h.prototype.clear=function(){return this.removeMany(this.getGMarkers())},h.prototype.attachEvents=function(a,e){if(b.isDefined(a)&&null!=a&&b.isObject(a))return c.each(a,function(c){return function(f,g){if(a.hasOwnProperty(g)&&b.isFunction(a[g]))return d.info(e+": Attaching event: "+g+" to markerSpiderfier"),c.markerSpiderfier.addListener(g,function(){return"spiderfy"===g||"unspiderfy"===g?c.scope.$evalAsync(a[g].apply(a,arguments)):c.scope.$evalAsync(a[g].apply(a,[arguments[0],g,arguments[0].model,arguments]))})}}(this))},h.prototype.clearEvents=function(a,c){var e,f;if(b.isDefined(a)&&null!=a&&b.isObject(a))for(f in a)e=a[f],a.hasOwnProperty(f)&&b.isFunction(a[f])&&(d.info(c+": Clearing event: "+f+" to markerSpiderfier"),this.markerSpiderfier.clearListeners(f))},h.prototype.destroy=function(){return this.clearEvents(this.opt_events,"opt_events"),this.clear()},h.prototype.fit=function(){return e.fit(this.getGMarkers(),this.markerSpiderfier.map)},h.prototype.getGMarkers=function(){return this.markerSpiderfier.getMarkers()},h.prototype.isSpiderfied=function(){return c.find(this.getGMarkers(),function(a){return null!=(null!=a?a._omsData:void 0)})},h.prototype.checkSync=function(){},h}()}])}.call(this),function(){b.module("uiGmapgoogle-maps").factory("uiGmapadd-events",["$timeout",function(a){var c,d;return c=function(b,c,d){return google.maps.event.addListener(b,c,function(){return d.apply(this,arguments),a(function(){},!0)})},d=function(a,d,e){var f;return e?c(a,d,e):(f=[],b.forEach(d,function(b,d){return f.push(c(a,d,b))}),function(){return b.forEach(f,function(a){return google.maps.event.removeListener(a)}),f=null})}}])}.call(this),function(){b.module("uiGmapgoogle-maps").factory("uiGmaparray-sync",["uiGmapadd-events",function(a){return function(c,d,e,f){var g,h,i,j,k,l,m,n,o;return j=!1,n=d.$eval(e),d.static||(k={set_at:function(a){var b;if(!j&&(b=c.getAt(a)))return b.lng&&b.lat?(n[a].latitude=b.lat(),n[a].longitude=b.lng()):n[a]=b},insert_at:function(a){var b;if(!j&&(b=c.getAt(a)))return b.lng&&b.lat?n.splice(a,0,{latitude:b.lat(),longitude:b.lng()}):n.splice(a,0,b)},remove_at:function(a){if(!j)return n.splice(a,1)}},"Polygon"===n.type?g=n.coordinates[0]:"LineString"===n.type&&(g=n.coordinates),h={set_at:function(a){var b;if(!j&&(b=c.getAt(a),b&&b.lng&&b.lat))return g[a][1]=b.lat(),g[a][0]=b.lng()},insert_at:function(a){var b;if(!j&&(b=c.getAt(a),b&&b.lng&&b.lat))return g.splice(a,0,[b.lng(),b.lat()])},remove_at:function(a){if(!j)return g.splice(a,1)}},m=a(c,b.isUndefined(n.type)?k:h)),l=function(a){var b,d,e,g,h,i,k,l;if(j=!0,i=c,b=!1,a){for(d=0,k=i.getLength(),g=a.length,e=Math.min(k,g),h=void 0;d0&&(a.gObject=f(a.buildOpts(a.pathPoints,c))),a.gObject?(g(a.gObject.getPath(),a.scope,"path",function(b){if(a.pathPoints=b,null!=h)return h()}),b.isDefined(a.scope.events)&&b.isObject(a.scope.events)&&(a.listeners=a.model?i.setEvents(a.gObject,a.scope,a.model):i.setEvents(a.gObject,a.scope,a.scope)),a.internalListeners=a.model?i.setEvents(a.gObject,{events:a.internalEvents},a.model):i.setEvents(a.gObject,{events:a.internalEvents},a.scope)):void 0}}(this),e(),this.scope.$watch("path",function(a){return function(b,d){if(!c.isEqual(b,d)||!a.gObject)return e()}}(this),!0),!this.scope.static&&b.isDefined(this.scope.editable)&&this.scope.$watch("editable",function(a){return function(b,c){var d;if(b!==c)return b=!a.isFalse(b),null!=(d=a.gObject)?d.setEditable(b):void 0}}(this),!0),b.isDefined(this.scope.draggable)&&this.scope.$watch("draggable",function(a){return function(b,c){var d;if(b!==c)return b=!a.isFalse(b),null!=(d=a.gObject)?d.setDraggable(b):void 0}}(this),!0),b.isDefined(this.scope.visible)&&this.scope.$watch("visible",function(a){return function(b,c){var d;return b!==c&&(b=!a.isFalse(b)),null!=(d=a.gObject)?d.setVisible(b):void 0}}(this),!0),b.isDefined(this.scope.geodesic)&&this.scope.$watch("geodesic",function(a){return function(b,c){var d;if(b!==c)return b=!a.isFalse(b),null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),b.isDefined(this.scope.stroke)&&b.isDefined(this.scope.stroke.weight)&&this.scope.$watch("stroke.weight",function(a){return function(b,c){var d;if(b!==c)return null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),b.isDefined(this.scope.stroke)&&b.isDefined(this.scope.stroke.color)&&this.scope.$watch("stroke.color",function(a){return function(b,c){var d;if(b!==c)return null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),b.isDefined(this.scope.stroke)&&b.isDefined(this.scope.stroke.opacity)&&this.scope.$watch("stroke.opacity",function(a){return function(b,c){var d;if(b!==c)return null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),b.isDefined(this.scope.icons)&&this.scope.$watch("icons",function(a){return function(b,c){var d;if(b!==c)return null!=(d=a.gObject)?d.setOptions(a.buildOpts(a.gObject.getPath())):void 0}}(this),!0),this.scope.$on("$destroy",function(a){return function(){return a.clean(),a.scope=null}}(this)),b.isDefined(this.scope.fill)&&b.isDefined(this.scope.fill.color)&&this.scope.$watch("fill.color",function(a){return function(b,c){if(b!==c)return a.gObject.setOptions(a.buildOpts(a.gObject.getPath()))}}(this)),b.isDefined(this.scope.fill)&&b.isDefined(this.scope.fill.opacity)&&this.scope.$watch("fill.opacity",function(a){return function(b,c){if(b!==c)return a.gObject.setOptions(a.buildOpts(a.gObject.getPath()))}}(this)),b.isDefined(this.scope.zIndex)&&this.scope.$watch("zIndex",function(a){return function(b,c){if(b!==c)return a.gObject.setOptions(a.buildOpts(a.gObject.getPath()))}}(this))}return d(j,e),j.include(h),j.prototype.clean=function(){var a;return i.removeEvents(this.listeners),i.removeEvents(this.internalListeners),null!=(a=this.gObject)&&a.setMap(null),this.gObject=null},j}(e)}}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api.models.child").factory("uiGmapDrawFreeHandChildModel",["uiGmapLogger","$q",function(a,b){var d,e;return d=function(a,b,c){var d,e;e=new google.maps.Polyline({map:a,clickable:!1}),d=google.maps.event.addListener(a,"mousemove",function(a){return e.getPath().push(a.latLng)}),google.maps.event.addListenerOnce(a,"mouseup",function(f){var g;return google.maps.event.removeListener(d),g=e.getPath(),e.setMap(null),b.push(new google.maps.Polygon({map:a,path:g})),e=null,google.maps.event.clearListeners(a.getDiv(),"mousedown"),c()})},e=function(e,f){var g,h;return this.map=e,g=function(b){return function(){var c;return c={draggable:!1,disableDefaultUI:!0,scrollwheel:!1,disableDoubleClickZoom:!1},a.info("disabling map move"),b.map.setOptions(c)}}(this),h=function(a){return function(){var b,d;return b={draggable:!0,disableDefaultUI:!1,scrollwheel:!0,disableDoubleClickZoom:!0},null!=(d=a.deferred)&&d.resolve(),c.defer(function(){return a.map.setOptions(c.extend(b,f.options))})}}(this),this.engage=function(c){return function(e){return c.polys=e,c.deferred=b.defer(),g(),a.info("DrawFreeHandChildModel is engaged (drawing)."),google.maps.event.addDomListener(c.map.getDiv(),"mousedown",function(a){return d(c.map,c.polys,h)}),c.deferred.promise}}(this),this}}])}.call(this),function(){var d=function(a,b){return function(){return a.apply(b,arguments)}},e=function(a,b){function c(){this.constructor=a}for(var d in b)f.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},f={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.child").factory("uiGmapMarkerChildModel",["uiGmapModelKey","uiGmapGmapUtil","uiGmapLogger","uiGmapEventsHelper","uiGmapPropertyAction","uiGmapMarkerOptions","uiGmapIMarker","uiGmapMarkerManager","uiGmapPromise",function(f,g,h,i,j,k,l,m,n){var o;return o=function(f){function o(a){this.internalEvents=d(this.internalEvents,this),this.setLabelOptions=d(this.setLabelOptions,this),this.setOptions=d(this.setOptions,this),this.setIcon=d(this.setIcon,this),this.setCoords=d(this.setCoords,this),this.isNotValid=d(this.isNotValid,this),this.maybeSetScopeValue=d(this.maybeSetScopeValue,this),this.createMarker=d(this.createMarker,this),this.setMyScope=d(this.setMyScope,this),this.updateModel=d(this.updateModel,this),this.handleModelChanges=d(this.handleModelChanges,this),this.destroy=d(this.destroy,this);var b,e,f,g,i,k,l;l=a.scope,this.model=a.model,this.keys=a.keys,this.gMap=a.gMap,this.defaults=null!=(e=a.defaults)?e:{},this.doClick=a.doClick,this.gManager=a.gManager,this.doDrawSelf=null==(f=a.doDrawSelf)||f,this.trackModel=null==(g=a.trackModel)||g,this.needRedraw=null!=(i=a.needRedraw)&&i,this.isScopeModel=null!=(k=a.isScopeModel)&&k,this.isScopeModel&&(this.clonedModel=c.clone(this.model,!0)),this.deferred=n.defer(),c.each(this.keys,function(a){return function(b,d){var e;if(e=a.keys[d],null!=e&&!c.isFunction(e)&&c.isString(e))return a[d+"Key"]=e}}(this)),this.idKey=this.idKeyKey||"id",null!=this.model[this.idKey]&&(this.id=this.model[this.idKey]),o.__super__.constructor.call(this,l),this.scope.getGMarker=function(a){return function(){return a.gObject}}(this),this.firstTime=!0,this.trackModel?(this.scope.model=this.model,this.scope.$watch("model",function(a){return function(b,c){if(b!==c)return a.handleModelChanges(b,c)}}(this),!0)):(b=new j(function(a){return function(b){if(c.isFunction(b)&&(b="all"),!a.firstTime)return a.setMyScope(b,l)}}(this),!1),c.each(this.keys,function(a,c){return l.$watch(c,b.sic(c),!0)})),this.scope.$on("$destroy",function(a){return function(){return p(a)}}(this)),this.createMarker(this.model),h.info(this)}var p;return e(o,f),o.include(g),o.include(i),o.include(k),p=function(a){if(null!=(null!=a?a.gObject:void 0)&&(a.removeEvents(a.externalListeners),a.removeEvents(a.internalListeners),null!=a?a.gObject:void 0))return a.removeFromManager&&a.gManager.remove(a.gObject),a.gObject.setMap(null),a.gObject=null},o.prototype.destroy=function(a){return null==a&&(a=!0),this.removeFromManager=a,this.scope.$destroy()},o.prototype.handleModelChanges=function(a,b){var d,e,f;if(d=this.getChanges(a,b,l.keys),!this.firstTime)return e=0,f=c.keys(d).length,c.each(d,function(c){return function(d,g){var h;return e+=1,h=f===e,c.setMyScope(g,a,b,!1,!0,h),c.needRedraw=!0}}(this))},o.prototype.updateModel=function(a){return this.isScopeModel&&(this.clonedModel=c.clone(a,!0)),this.setMyScope("all",a,this.model)},o.prototype.renderGMarker=function(b,c){var d,e,f;if(null==b&&(b=!0),d=this.getProp("coords",this.scope,this.model),null!=(null!=(f=this.gManager)?f.isSpiderfied:void 0)&&(e=this.gManager.isSpiderfied()),null!=d){if(!this.validateCoords(d))return void h.debug("MarkerChild does not have coords yet. They may be defined later.");if(null!=c&&c(),b&&this.gObject&&this.gManager.add(this.gObject),e)return this.gManager.markerSpiderfier.spiderListener(this.gObject,a.event)}else if(b&&this.gObject)return this.gManager.remove(this.gObject)},o.prototype.setMyScope=function(a,b,d,e,f){var g;switch(null==d&&(d=void 0),null==e&&(e=!1),null==f&&(f=!0),null==b?b=this.model:this.model=b,this.gObject||(this.setOptions(this.scope,f),g=!0),a){case"all":return c.each(this.keys,function(a){return function(c,g){return a.setMyScope(g,b,d,e,f)}}(this));case"icon":return this.maybeSetScopeValue({gSetter:this.setIcon,doDraw:f});case"coords":return this.maybeSetScopeValue({gSetter:this.setCoords,doDraw:f});case"options":if(!g)return this.createMarker(b,d,e,f)}},o.prototype.createMarker=function(a,b,c,d){return null==b&&(b=void 0),null==c&&(c=!1),null==d&&(d=!0),this.maybeSetScopeValue({gSetter:this.setOptions,doDraw:d}),this.firstTime=!1},o.prototype.maybeSetScopeValue=function(a){var b,c,d;if(c=a.gSetter,b=null==(d=a.doDraw)||d,null!=c&&c(this.scope,b),this.doDrawSelf&&b)return this.gManager.draw()},o.prototype.isNotValid=function(a,b){var c,d;return null==b&&(b=!0),d=!!b&&void 0===this.gObject,c=!this.trackModel&&a.$id!==this.scope.$id,c||d},o.prototype.setCoords=function(a,b){if(null==b&&(b=!0),!this.isNotValid(a)&&null!=this.gObject)return this.renderGMarker(b,function(b){return function(){var c,d,e;if(d=b.getProp("coords",a,b.model),c=b.getCoords(d),e=b.gObject.getPosition(),null==e||null==c||c.lng()!==e.lng()||c.lat()!==e.lat())return b.gObject.setPosition(c),b.gObject.setVisible(b.validateCoords(d))}}(this))},o.prototype.setIcon=function(a,b){if(null==b&&(b=!0),!this.isNotValid(a)&&null!=this.gObject)return this.renderGMarker(b,function(b){return function(){var c,d,e;if(e=b.gObject.getIcon(),d=b.getProp("icon",a,b.model),e!==d)return b.gObject.setIcon(d),c=b.getProp("coords",a,b.model),b.gObject.setPosition(b.getCoords(c)),b.gObject.setVisible(b.validateCoords(c))}}(this))},o.prototype.setOptions=function(a,b){var d;if(null==b&&(b=!0),!this.isNotValid(a,!1)){if(this.renderGMarker(b,function(b){return function(){var d,e,f;if(e=b.getProp("coords",a,b.model),f=b.getProp("icon",a,b.model),d=b.getProp("options",a,b.model),b.opts=b.createOptions(e,f,d),b.isLabel(b.gObject)!==b.isLabel(b.opts)&&null!=b.gObject&&(b.gManager.remove(b.gObject),b.gObject=void 0),null!=b.gObject&&b.gObject.setOptions(b.setLabelOptions(b.opts)),b.gObject||(b.isLabel(b.opts)?b.gObject=new MarkerWithLabel(b.setLabelOptions(b.opts)):b.opts.content?(b.gObject=new RichMarker(b.opts),b.gObject.getIcon=b.gObject.getContent,b.gObject.setIcon=b.gObject.setContent):b.gObject=new google.maps.Marker(b.opts),c.extend(b.gObject,{model:b.model})),b.externalListeners&&b.removeEvents(b.externalListeners),b.internalListeners&&b.removeEvents(b.internalListeners),b.externalListeners=b.setEvents(b.gObject,b.scope,b.model,["dragend"]),b.internalListeners=b.setEvents(b.gObject,{events:b.internalEvents(),$evalAsync:function(){}},b.model),null!=b.id)return b.gObject.key=b.id}}(this)),this.gObject&&(this.gObject.getMap()||this.gManager.type!==m.type))this.deferred.resolve(this.gObject);else{if(!this.gObject)return this.deferred.reject("gObject is null");null!=(d=this.gObject)&&d.getMap()&&this.gManager.type===m.type||(h.debug("gObject has no map yet"),this.deferred.resolve(this.gObject))}return this.model[this.fitKey]?this.gManager.fit():void 0}},o.prototype.setLabelOptions=function(a){return a.labelAnchor&&(a.labelAnchor=this.getLabelPositionPoint(a.labelAnchor)),a},o.prototype.internalEvents=function(){return{dragend:function(a){return function(b,c,d,e){var f,g,h;return g=a.trackModel?a.scope.model:a.model,h=a.setCoordsFromEvent(a.modelOrKey(g,a.coordsKey),a.gObject.getPosition()),g=a.setVal(d,a.coordsKey,h),f=a.scope.events,null!=(null!=f?f.dragend:void 0)&&f.dragend(b,c,g,e),a.scope.$apply()}}(this),click:function(a){return function(c,d,e,f){var g;if(g=a.getProp("click",a.scope,a.model),a.doClick&&b.isFunction(g))return a.scope.$evalAsync(g(c,d,a.model,f))}}(this)}},o}(f)}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolygonChildModel",["uiGmapBasePolyChildModel","uiGmapPolygonOptionsBuilder",function(b,c){var d,e,f;return f=function(a){return new google.maps.Polygon(a)},e=new b(c,f),d=function(b){function c(){return c.__super__.constructor.apply(this,arguments)}return a(c,b),c}(e)}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolylineChildModel",["uiGmapBasePolyChildModel","uiGmapPolylineOptionsBuilder",function(b,c){var d,e,f;return f=function(a){return new google.maps.Polyline(a)},e=b(c,f),d=function(b){function c(){return c.__super__.constructor.apply(this,arguments)}return a(c,b),c}(e)}])}.call(this),function(){var d=function(a,b){return function(){return a.apply(b,arguments)}},e=function(a,b){function c(){this.constructor=a}for(var d in b)f.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},f={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.child").factory("uiGmapWindowChildModel",["uiGmapBaseObject","uiGmapGmapUtil","uiGmapLogger","$compile","$http","$templateCache","uiGmapChromeFixes","uiGmapEventsHelper",function(f,g,h,i,j,k,l,m){var n;return n=function(f){function n(a){this.updateModel=d(this.updateModel,this),this.destroy=d(this.destroy,this),this.remove=d(this.remove,this),this.getLatestPosition=d(this.getLatestPosition,this),this.hideWindow=d(this.hideWindow,this),this.showWindow=d(this.showWindow,this),this.handleClick=d(this.handleClick,this),this.watchOptions=d(this.watchOptions,this),this.watchCoords=d(this.watchCoords,this),this.createGWin=d(this.createGWin,this),this.watchElement=d(this.watchElement,this),this.watchAndDoShow=d(this.watchAndDoShow,this),this.doShow=d(this.doShow,this);var b,e,f,g,i;this.model=null!=(e=a.model)?e:{},this.scope=a.scope,this.opts=a.opts,this.isIconVisibleOnClick=a.isIconVisibleOnClick,this.gMap=a.gMap,this.markerScope=a.markerScope,this.element=a.element,this.needToManualDestroy=null!=(f=a.needToManualDestroy)&&f,this.markerIsVisibleAfterWindowClose=null==(g=a.markerIsVisibleAfterWindowClose)||g,this.isScopeModel=null!=(i=a.isScopeModel)&&i,this.isScopeModel&&(this.clonedModel=c.clone(this.model,!0)),this.getGmarker=function(){var a,b;if(null!=(null!=(a=this.markerScope)?a.getGMarker:void 0))return null!=(b=this.markerScope)?b.getGMarker():void 0},this.listeners=[],this.createGWin(),b=this.getGmarker(),null!=b&&b.setClickable(!0),this.watchElement(),this.watchOptions(),this.watchCoords(),this.watchAndDoShow(),this.scope.$on("$destroy",function(a){return function(){return a.destroy()}}(this)),h.info(this)}return e(n,f),n.include(g),n.include(m),n.prototype.doShow=function(a){return this.scope.show===!0||a?this.showWindow():this.hideWindow()},n.prototype.watchAndDoShow=function(){return null!=this.model.show&&(this.scope.show=this.model.show),this.scope.$watch("show",this.doShow,!0),this.doShow()},n.prototype.watchElement=function(){return this.scope.$watch(function(a){return function(){var b,c;if(a.element||a.html)return a.html!==a.element.html()&&a.gObject?(null!=(b=a.opts)&&(b.content=void 0),c=a.gObject.isOpen(),a.remove(),a.createGWin(c)):void 0}}(this))},n.prototype.createGWin=function(b){var d,e,f,g,h;if(null==b&&(b=!1),f=this.getGmarker(),e={},null!=this.opts&&(this.scope.coords&&(this.opts.position=this.getCoords(this.scope.coords)),e=this.opts),this.element&&(this.html=c.isObject(this.element)?this.element.html():this.element),d=this.scope.options?this.scope.options:e,this.opts=this.createWindowOptions(f,this.markerScope||this.scope,this.html,d),null!=this.opts)return this.gObject||(this.opts.boxClass&&a.InfoBox&&"function"==typeof a.InfoBox?this.gObject=new a.InfoBox(this.opts):this.gObject=new google.maps.InfoWindow(this.opts),this.listeners.push(google.maps.event.addListener(this.gObject,"domready",function(){return l.maybeRepaint(this.content)})),this.listeners.push(google.maps.event.addListener(this.gObject,"closeclick",function(a){return function(){return f&&(f.setAnimation(a.oldMarkerAnimation),a.markerIsVisibleAfterWindowClose&&c.delay(function(){return f.setVisible(!1),f.setVisible(a.markerIsVisibleAfterWindowClose)},250)),a.gObject.close(),a.model.show=!1,null!=a.scope.closeClick?a.scope.$evalAsync(a.scope.closeClick()):a.scope.$evalAsync()}}(this)))),this.gObject.setContent(this.opts.content),this.handleClick((null!=(g=this.scope)&&null!=(h=g.options)?h.forceClick:void 0)||b),this.doShow(this.gObject.isOpen())},n.prototype.watchCoords=function(){var a;return a=null!=this.markerScope?this.markerScope:this.scope,a.$watch("coords",function(a){return function(b,c){var d;if(b!==c){if(null==b)a.hideWindow();else if(!a.validateCoords(b))return void h.error("WindowChildMarker cannot render marker as scope.coords as no position on marker: "+JSON.stringify(a.model));if(d=a.getCoords(b),a.doShow(),a.gObject.setPosition(d),a.opts)return a.opts.position=d}}}(this),!0)},n.prototype.watchOptions=function(){return this.scope.$watch("options",function(a){return function(b,c){if(b!==c&&(a.opts=b,null!=a.gObject)){if(a.gObject.setOptions(a.opts),null!=a.opts.visible&&a.opts.visible)return a.showWindow();if(null!=a.opts.visible)return a.hideWindow()}}}(this),!0)},n.prototype.handleClick=function(a){var b,c;if(null!=this.gObject)return c=this.getGmarker(),b=function(a){return function(){if(null==a.gObject&&a.createGWin(),a.showWindow(),null!=c)return a.initialMarkerVisibility=c.getVisible(),a.oldMarkerAnimation=c.getAnimation(),c.setVisible(a.isIconVisibleOnClick)}}(this),a&&b(),c?this.listeners=this.listeners.concat(this.setEvents(c,{events:{click:b}},this.model)):void 0},n.prototype.showWindow=function(){var a,c,d;if(null!=this.gObject)return d=null,c=function(a){return function(){var b,c,d;if(!a.gObject.isOpen()){if(c=a.getGmarker(),null!=a.gObject&&null!=a.gObject.getPosition&&(d=a.gObject.getPosition()),c&&(d=c.getPosition()),!d)return;if(a.gObject.open(a.gMap,c),b=a.gObject.isOpen(),a.model.show!==b)return a.model.show=b}}}(this),this.scope.templateUrl?j.get(this.scope.templateUrl,{cache:k}).then(function(a){return function(e){var f;return d=a.scope.$new(),b.isDefined(a.scope.templateParameter)&&(d.parameter=a.scope.templateParameter),f=i(e.data)(d),a.gObject.setContent(f[0]),c()}}(this)):this.scope.template?(d=this.scope.$new(),b.isDefined(this.scope.templateParameter)&&(d.parameter=this.scope.templateParameter),a=i(this.scope.template)(d),this.gObject.setContent(a[0]),c()):c(),this.scope.$on("destroy",function(){return d.$destroy()})},n.prototype.hideWindow=function(){if(null!=this.gObject&&this.gObject.isOpen())return this.gObject.close()},n.prototype.getLatestPosition=function(a){var b;return b=this.getGmarker(),null==this.gObject||null==b||a?a?this.gObject.setPosition(a):void 0:this.gObject.setPosition(b.getPosition())},n.prototype.remove=function(){return this.hideWindow(),this.removeEvents(this.listeners),this.listeners.length=0,delete this.gObject,delete this.opts},n.prototype.destroy=function(a){var b;if(null==a&&(a=!1),this.remove(),null!=this.scope&&!(null!=(b=this.scope)?b.$$destroyed:void 0)&&(this.needToManualDestroy||a))return this.scope.$destroy()},n.prototype.updateModel=function(a){return this.isScopeModel&&(this.clonedModel=c.clone(a,!0)),c.extend(this.model,this.clonedModel||a)},n}(f)}])}.call(this), +function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapBasePolysParentModel",["$timeout","uiGmapLogger","uiGmapModelKey","uiGmapModelsWatcher","uiGmapPropMap","uiGmap_async","uiGmapPromise","uiGmapFitHelper",function(e,f,g,h,i,j,k,l){return function(e,m,n){var o;return o=function(g){function o(b,d,g,h,j){this.element=d,this.attrs=g,this.gMap=h,this.defaults=j,this.maybeFit=a(this.maybeFit,this),this.createChild=a(this.createChild,this),this.pieceMeal=a(this.pieceMeal,this),this.createAllNew=a(this.createAllNew,this),this.watchIdKey=a(this.watchIdKey,this),this.createChildScopes=a(this.createChildScopes,this),this.watchDestroy=a(this.watchDestroy,this),this.onDestroy=a(this.onDestroy,this),this.rebuildAll=a(this.rebuildAll,this),this.doINeedToWipe=a(this.doINeedToWipe,this),this.watchModels=a(this.watchModels,this),o.__super__.constructor.call(this,b),this.interface=e,this.$log=f,this.plurals=new i,c.each(e.scopeKeys,function(a){return function(b){return a[b+"Key"]=void 0}}(this)),this.models=void 0,this.firstTime=!0,this.$log.info(this),this.createChildScopes()}return d(o,g),o.include(h),o.prototype.watchModels=function(a){return a.$watch("models",function(b){return function(c,d){if(c!==d)return b.doINeedToWipe(c)||a.doRebuildAll?b.rebuildAll(a,!0,!0):b.createChildScopes(!1)}}(this),!0)},o.prototype.doINeedToWipe=function(a){var b;return b=null==a||0===a.length,this.plurals.length>0&&b},o.prototype.rebuildAll=function(a,b,c){return this.onDestroy(c).then(function(a){return function(){if(b)return a.createChildScopes()}}(this))},o.prototype.onDestroy=function(){return o.__super__.onDestroy.call(this,this.scope),j.promiseLock(this,k.promiseTypes.delete,void 0,void 0,function(a){return function(){return j.each(a.plurals.values(),function(a){return a.destroy(!0)},j.chunkSizeFrom(a.scope.cleanchunk,!1)).then(function(){var b;return null!=(b=a.plurals)?b.removeAll():void 0})}}(this))},o.prototype.watchDestroy=function(a){return a.$on("$destroy",function(b){return function(){return b.rebuildAll(a,!1,!0)}}(this))},o.prototype.createChildScopes=function(a){return null==a&&(a=!0),b.isUndefined(this.scope.models)?void this.$log.error("No models to create "+n+"s from! I Need direct models!"):null!=this.gMap&&null!=this.scope.models?(this.watchIdKey(this.scope),a?this.createAllNew(this.scope,!1):this.pieceMeal(this.scope,!1)):void 0},o.prototype.watchIdKey=function(a){return this.setIdKey(a),a.$watch("idKey",function(b){return function(c,d){if(c!==d&&null==c)return b.idKey=c,b.rebuildAll(a,!0,!0)}}(this))},o.prototype.createAllNew=function(a,b){var c;if(null==b&&(b=!1),this.models=a.models,this.firstTime&&(this.watchModels(a),this.watchDestroy(a)),!this.didQueueInitPromise(this,a))return c=null,j.promiseLock(this,k.promiseTypes.create,"createAllNew",function(a){return c=a},function(b){return function(){return j.map(a.models,function(a){var d;return d=b.createChild(a,b.gMap),c&&(f.debug("createNew should fall through safely"),d.isEnabled=!1),d.pathPoints.getArray()},j.chunkSizeFrom(a.chunk)).then(function(a){return b.maybeFit(a),b.firstTime=!1})}}(this))},o.prototype.pieceMeal=function(a,b){var d,e;if(null==b&&(b=!0),!a.$$destroyed)return d=null,e=null,this.models=a.models,null!=a&&this.modelsLength()&&this.plurals.length?j.promiseLock(this,k.promiseTypes.update,"pieceMeal",function(a){return d=a},function(b){return function(){return k.promise(function(){return b.figureOutState(b.idKey,a,b.plurals,b.modelKeyComparison)}).then(function(f){return e=f,e.updates.length&&j.each(e.updates,function(a){return c.extend(a.child.scope,a.model),a.child.model=a.model}),j.each(e.removals,function(a){if(null!=a)return a.destroy(),b.plurals.remove(a.model[b.idKey]),d},j.chunkSizeFrom(a.chunk))}).then(function(){return j.each(e.adds,function(a){return d&&f.debug("pieceMeal should fall through safely"),b.createChild(a,b.gMap),d},j.chunkSizeFrom(a.chunk)).then(function(){return b.maybeFit()})})}}(this)):(this.inProgress=!1,this.rebuildAll(this.scope,!0,!0))},o.prototype.createChild=function(a,b){var c,d;return d=this.scope.$new(!1),this.setChildScope(e.scopeKeys,d,a),d.$watch("model",function(a){return function(b,c){if(b!==c)return a.setChildScope(e.scopeKeys,d,b)}}(this),!0),d.static=this.scope.static,c=new m({isScopeModel:!0,scope:d,attrs:this.attrs,gMap:b,defaults:this.defaults,model:a,gObjectChangeCb:function(a){return function(){return a.maybeFit()}}(this)}),null==a[this.idKey]?void this.$log.error(n+" model has no id to assign a child to.\nThis is required for performance. Please assign id,\nor redirect id to a different key."):(this.plurals.put(a[this.idKey],c),c)},o.prototype.maybeFit=function(a){if(null==a&&(a=this.plurals.map(function(a){return a.pathPoints})),this.scope.fit)return a=c.flatten(a),l.fit(a,this.gMap)},o}(g)}}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapCircleParentModel",["uiGmapLogger","$timeout","uiGmapGmapUtil","uiGmapEventsHelper","uiGmapCircleOptionsBuilder",function(d,e,f,g,h){var i,j;return j=function(a,b){return a.settingFromDirective=!0,b(),e(function(){return a.settingFromDirective=!1})},i=function(e){function h(a,e,g,h,i){var k,l,m;this.attrs=g,this.gMap=h,this.DEFAULTS=i,this.scope=a,m=null,k=function(a){return function(){if(m=null,null!=a.listeners)return a.removeEvents(a.listeners),a.listeners=void 0}}(this),l=new google.maps.Circle(this.buildOpts(f.getCoords(a.center),a.radius)),this.setMyOptions=function(b){return function(d,e){if(!a.settingFromDirective)return!c.isEqual(d,e)||d!==e||null!=d&&null!=e&&d.coordinates!==e.coordinates?l.setOptions(b.buildOpts(f.getCoords(a.center),a.radius)):void 0}}(this),this.props=this.props.concat([{prop:"center",isColl:!0},{prop:"fill",isColl:!0},"radius","zIndex"]),this.watchProps(),null!=this.scope.control&&(this.scope.control.getCircle=function(){return l}),k(),this.listeners=this.setEvents(l,a,a,["radius_changed"])||[],this.listeners.push(google.maps.event.addListener(l,"radius_changed",function(){var d,e;if(d=l.getRadius(),d!==m)return m=d,e=function(){return j(a,function(){var b,e;if(d!==a.radius&&(a.radius=d),(null!=(b=a.events)?b.radius_changed:void 0)&&c.isFunction(null!=(e=a.events)?e.radius_changed:void 0))return a.events.radius_changed(l,"radius_changed",a,arguments)})},b.mock?e():a.$evalAsync(function(){return e()})})),this.listeners.push(google.maps.event.addListener(l,"center_changed",function(){return a.$evalAsync(function(){return j(a,function(){return b.isDefined(a.center.type)?(a.center.coordinates[1]=l.getCenter().lat(),a.center.coordinates[0]=l.getCenter().lng()):(a.center.latitude=l.getCenter().lat(),a.center.longitude=l.getCenter().lng())})})})),a.$on("$destroy",function(){return k(),l.setMap(null)}),d.info(this)}return a(h,e),h.include(f),h.include(g),h}(h)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapDrawingManagerParentModel",["uiGmapLogger","$timeout","uiGmapBaseObject","uiGmapEventsHelper",function(b,d,e,f){var g;return g=function(b){function d(a,b,d,e){var f,g;this.scope=a,this.attrs=d,this.map=e,f=new google.maps.drawing.DrawingManager(this.scope.options),f.setMap(this.map),g=void 0,null!=this.scope.control&&(this.scope.control.getDrawingManager=function(){return f}),!this.scope.static&&this.scope.options&&this.scope.$watch("options",function(a){return null!=f?f.setOptions(a):void 0},!0),null!=this.scope.events&&(g=this.setEvents(f,this.scope,this.scope),this.scope.$watch("events",function(a){return function(b,d){if(!c.isEqual(b,d))return null!=g&&a.removeEvents(g),g=a.setEvents(f,a.scope,a.scope)}}(this))),this.scope.$on("$destroy",function(a){return function(){return null!=g&&a.removeEvents(g),f.setMap(null),f=null}}(this))}return a(d,b),d.include(f),d}(e)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapIMarkerParentModel",["uiGmapModelKey","uiGmapLogger",function(e,f){var g;return g=function(e){function g(c,d,e,h){if(this.scope=c,this.element=d,this.attrs=e,this.map=h,this.onWatch=a(this.onWatch,this),this.watch=a(this.watch,this),this.validateScope=a(this.validateScope,this),g.__super__.constructor.call(this,this.scope),this.$log=f,!this.validateScope(this.scope))throw new String("Unable to construct IMarkerParentModel due to invalid scope");this.doClick=b.isDefined(this.attrs.click),null!=this.scope.options&&(this.DEFAULTS=this.scope.options),this.watch("coords",this.scope),this.watch("icon",this.scope),this.watch("options",this.scope),this.scope.$on("$destroy",function(a){return function(){return a.onDestroy(a.scope)}}(this))}return d(g,e),g.prototype.DEFAULTS={},g.prototype.validateScope=function(a){var b;return null==a?(this.$log.error(this.constructor.name+": invalid scope used"),!1):(b=null!=a.coords,b?b:(this.$log.error(this.constructor.name+": no valid coords attribute found"),!1))},g.prototype.watch=function(a,b,d){return null==d&&(d=!0),b.$watch(a,function(d){return function(e,f){if(!c.isEqual(e,f))return d.onWatch(a,b,e,f)}}(this),d)},g.prototype.onWatch=function(a,b,c,d){},g}(e)}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapIWindowParentModel",["uiGmapModelKey","uiGmapGmapUtil","uiGmapLogger",function(b,c,d){var e;return e=function(b){function e(a,b,c,f,g,h,i,j){e.__super__.constructor.call(this,a),this.$log=d,this.$timeout=g,this.$compile=h,this.$http=i,this.$templateCache=j,this.DEFAULTS={},null!=a.options&&(this.DEFAULTS=a.options)}return a(e,b),e.include(c),e.prototype.getItem=function(a,b,c){return"models"===b?a[b][c]:a[b].get(c)},e}(b)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapLayerParentModel",["uiGmapBaseObject","uiGmapLogger","$timeout",function(d,e,f){var g;return g=function(d){function f(c,d,f,g,h,i){return this.scope=c,this.element=d,this.attrs=f,this.gMap=g,this.onLayerCreated=null!=h?h:void 0,this.$log=null!=i?i:e,this.createGoogleLayer=a(this.createGoogleLayer,this),null==this.attrs.type?void this.$log.info("type attribute for the layer directive is mandatory. Layer creation aborted!!"):(this.createGoogleLayer(),this.doShow=!0,b.isDefined(this.attrs.show)&&(this.doShow=this.scope.show),this.doShow&&null!=this.gMap&&this.gObject.setMap(this.gMap),this.scope.$watch("show",function(a){return function(b,c){if(b!==c)return a.doShow=b,b?a.gObject.setMap(a.gMap):a.gObject.setMap(null)}}(this),!0),this.scope.$watch("options",function(a){return function(b,c){if(b!==c&&a.doShow)return a.gObject.setOptions(b)}}(this),!0),void this.scope.$on("$destroy",function(a){return function(){return a.gObject.setMap(null)}}(this)))}return c(f,d),f.prototype.createGoogleLayer=function(){var a;if(null==this.attrs.options?this.gObject=void 0===this.attrs.namespace?new google.maps[this.attrs.type]:new google.maps[this.attrs.namespace][this.attrs.type]:this.gObject=void 0===this.attrs.namespace?new google.maps[this.attrs.type](this.scope.options):new google.maps[this.attrs.namespace][this.attrs.type](this.scope.options),null!=this.gObject&&this.doShow&&this.gObject.setMap(this.gMap),null!=this.gObject&&null!=this.onLayerCreated)return"function"==typeof(a=this.onLayerCreated(this.scope,this.gObject))?a(this.gObject):void 0},f}(d)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapMapTypeParentModel",["uiGmapBaseObject","uiGmapLogger",function(e,f){var g;return g=function(e){function g(d,e,g,h,i,j,k){var l,m,n,o;return this.scope=d,this.element=e,this.attrs=g,this.gMap=h,this.$log=null!=i?i:f,this.childModel=j,this.propMap=k,this.refreshShown=a(this.refreshShown,this),this.hideOverlay=a(this.hideOverlay,this),this.showOverlay=a(this.showOverlay,this),this.refreshMapType=a(this.refreshMapType,this),this.createMapType=a(this.createMapType,this),null==this.scope.options?void this.$log.info("options attribute for the map-type directive is mandatory. Map type creation aborted!!"):(this.id=this.gMap.overlayMapTypesCount=this.gMap.overlayMapTypesCount+1||0,this.doShow=!0,this.createMapType(),this.refreshShown(),this.doShow&&null!=this.gMap&&this.showOverlay(),m=function(a){return function(){return a.childModel[a.attrs.show]}}(this),o=this.childModel?m:"show",this.scope.$watch(o,function(a){return function(b,c){if(b!==c)return a.doShow=b,b?a.showOverlay():a.hideOverlay()}}(this)),l=function(a){return function(){return a.childModel[a.attrs.options]}}(this),n=this.childModel?l:"options",this.scope.$watchCollection(n,function(a){return function(b,d){var e,f;if(!c.isEqual(b,d)&&(f=["tileSize","maxZoom","minZoom","name","alt"],e=c.some(f,function(a){return!d||!b||!c.isEqual(b[a],d[a])})))return a.refreshMapType()}}(this)),b.isDefined(this.attrs.refresh)&&this.scope.$watch("refresh",function(a){return function(b,d){if(!c.isEqual(b,d))return a.refreshMapType()}}(this),!0),void this.scope.$on("$destroy",function(a){return function(){return a.hideOverlay(),a.mapType=null}}(this)))}return d(g,e),g.prototype.createMapType=function(){var a,c,d;if(d=this.childModel?this.attrs.options?this.childModel[this.attrs.options]:this.childModel:this.scope.options,null!=d.getTile)this.mapType=d;else{if(null==d.getTileUrl)return void this.$log.info("options should provide either getTile or getTileUrl methods. Map type creation aborted!!");this.mapType=new google.maps.ImageMapType(d)}if(c=this.attrs.id?this.childModel?this.attrs.id:"id":void 0,a=c?this.childModel?this.childModel[c]:this.scope[c]:void 0,a&&(this.gMap.mapTypes.set(a,this.mapType),b.isDefined(this.attrs.show)||(this.doShow=!1)),this.mapType.layerId=this.id,this.childModel&&b.isDefined(this.scope.index))return this.propMap.put(this.mapType.layerId,this.scope.index)},g.prototype.refreshMapType=function(){if(this.hideOverlay(),this.mapType=null,this.createMapType(),this.doShow&&null!=this.gMap)return this.showOverlay()},g.prototype.showOverlay=function(){var a;return b.isDefined(this.scope.index)?(a=!1,this.gMap.overlayMapTypes.getLength()?(this.gMap.overlayMapTypes.forEach(function(c){return function(d,e){var f;a||(f=c.propMap.get(d.layerId.toString()),(f>c.scope.index||!b.isDefined(f))&&(a=!0,c.gMap.overlayMapTypes.insertAt(e,c.mapType)))}}(this)),a?void 0:this.gMap.overlayMapTypes.push(this.mapType)):this.gMap.overlayMapTypes.push(this.mapType)):this.gMap.overlayMapTypes.push(this.mapType)},g.prototype.hideOverlay=function(){var a;return a=!1,this.gMap.overlayMapTypes.forEach(function(b){return function(c,d){a||c.layerId!==b.id||(a=!0,b.gMap.overlayMapTypes.removeAt(d))}}(this))},g.prototype.refreshShown=function(){return this.doShow=!b.isDefined(this.attrs.show)||(this.childModel?this.childModel[this.attrs.show]:this.scope.show)},g}(e)}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapMapTypesParentModel",["uiGmapBaseObject","uiGmapLogger","uiGmapMapTypeParentModel","uiGmapPropMap",function(b,c,d,e){var f;return f=function(b){function f(a,b,f,g,h){var i;return this.scope=a,this.element=b,this.attrs=f,this.gMap=g,this.$log=null!=h?h:c,null==this.attrs.mapTypes?void this.$log.info("layers attribute for the map-types directive is mandatory. Map types creation aborted!!"):(i=new e,void this.scope.mapTypes.forEach(function(a){return function(b,c){var e,f;f={options:a.scope.options,show:a.scope.show,refresh:a.scope.refresh},e=a.scope.$new(),e.index=c,new d(e,null,f,a.gMap,a.$log,b,i)}}(this)))}return a(f,b),f}(b)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapMarkersParentModel",["uiGmapIMarkerParentModel","uiGmapModelsWatcher","uiGmapPropMap","uiGmapMarkerChildModel","uiGmap_async","uiGmapClustererMarkerManager","uiGmapMarkerManager","$timeout","uiGmapIMarker","uiGmapPromise","uiGmapGmapUtil","uiGmapLogger","uiGmapSpiderfierMarkerManager",function(e,f,g,h,i,j,k,l,m,n,o,p,q){var r,s;return s=function(a,b){return b.plurals=new g,b.scope.plurals=b.plurals,b},r=function(e){function l(b,d,e,f){this.maybeExecMappedEvent=a(this.maybeExecMappedEvent,this),this.onDestroy=a(this.onDestroy,this),this.newChildMarker=a(this.newChildMarker,this),this.pieceMeal=a(this.pieceMeal,this),this.rebuildAll=a(this.rebuildAll,this),this.createAllNew=a(this.createAllNew,this),this.bindToTypeEvents=a(this.bindToTypeEvents,this),this.createChildScopes=a(this.createChildScopes,this),this.validateScope=a(this.validateScope,this),this.onWatch=a(this.onWatch,this),l.__super__.constructor.call(this,b,d,e,f),this.interface=m,s(new g,this),this.scope.pluralsUpdate={updateCtr:0},this.$log.info(this),this.doRebuildAll=null!=this.scope.doRebuildAll&&this.scope.doRebuildAll,this.setIdKey(this.scope),this.scope.$watch("doRebuildAll",function(a){return function(b,c){if(b!==c)return a.doRebuildAll=b}}(this)),this.modelsLength()||(this.modelsRendered=!1),this.scope.$watch("models",function(a){return function(b,d){if(!c.isEqual(b,d)||!a.modelsRendered){if(0===b.length&&0===d.length)return;return a.modelsRendered=!0,a.onWatch("models",a.scope,b,d)}}}(this),!this.isTrue(e.modelsbyref)),this.watch("doCluster",this.scope),this.watch("type",this.scope),this.watch("clusterOptions",this.scope),this.watch("clusterEvents",this.scope),this.watch("typeOptions",this.scope),this.watch("typeEvents",this.scope),this.watch("fit",this.scope),this.watch("idKey",this.scope),this.gManager=void 0,this.createAllNew(this.scope)}return d(l,e),l.include(o),l.include(f),l.prototype.onWatch=function(a,b,c,d){return"idKey"===a&&c!==d&&(this.idKey=c),this.doRebuildAll||"doCluster"===a||"type"===a?this.rebuildAll(b):this.pieceMeal(b)},l.prototype.validateScope=function(a){var c;return c=b.isUndefined(a.models)||void 0===a.models,c&&this.$log.error(this.constructor.name+": no valid models attribute found"),l.__super__.validateScope.call(this,a)||c},l.prototype.createChildScopes=function(a){if(null!=this.gMap&&null!=this.scope.models)return a?this.createAllNew(this.scope,!1):this.pieceMeal(this.scope,!1)},l.prototype.bindToTypeEvents=function(a,d){var e,f;return null==d&&(d=["click","mouseout","mouseover"]),f=this,this.origTypeEvents?b.extend(a,this.origTypeEvents):(this.origTypeEvents={},c.each(d,function(b){return function(c){return b.origTypeEvents[c]=null!=a?a[c]:void 0}}(this))),e={},c.each(d,function(a){return e[a]=function(b){return f.maybeExecMappedEvent(b,a)}}),b.extend(a,e)},l.prototype.createAllNew=function(a){var b,c,d,e;if(null!=this.gManager&&(this.gManager instanceof q&&(b=this.gManager.isSpiderfied()),this.gManager.clear(),delete this.gManager),d=a.typeEvents||a.clusterEvents,e=a.typeOptions||a.clusterOptions,a.doCluster||"cluster"===a.type?(null!=d&&this.bindToTypeEvents(d),this.gManager=new j(this.map,void 0,e,d)):"spider"===a.type?(null!=d&&this.bindToTypeEvents(d,["spiderfy","unspiderfy"]),this.gManager=new q(this.map,void 0,e,d,this.scope),b&&this.gManager.spiderfy()):this.gManager=new k(this.map),!this.didQueueInitPromise(this,a))return c=null,i.promiseLock(this,n.promiseTypes.create,"createAllNew",function(a){return c=a},function(b){return function(){return i.each(a.models,function(d){return b.newChildMarker(d,a),c},i.chunkSizeFrom(a.chunk)).then(function(){return b.modelsRendered=!0,a.fit&&b.gManager.fit(),b.gManager.draw(),b.scope.pluralsUpdate.updateCtr+=1},i.chunkSizeFrom(a.chunk))}}(this))},l.prototype.rebuildAll=function(a){var b;if(a.doRebuild||void 0===a.doRebuild)return(null!=(b=this.scope.plurals)?b.length:void 0)?this.onDestroy(a).then(function(b){return function(){return b.createAllNew(a)}}(this)):this.createAllNew(a)},l.prototype.pieceMeal=function(a){var b,c;if(!a.$$destroyed)return b=null,c=null,this.modelsLength()&&this.scope.plurals.length?i.promiseLock(this,n.promiseTypes.update,"pieceMeal",function(a){return b=a},function(d){return function(){return n.promise(function(){return d.figureOutState(d.idKey,a,d.scope.plurals,d.modelKeyComparison)}).then(function(e){return c=e,i.each(c.removals,function(a){if(null!=a)return null!=a.destroy&&a.destroy(),d.scope.plurals.remove(a.id),b},i.chunkSizeFrom(a.chunk))}).then(function(){return i.each(c.adds,function(c){return d.newChildMarker(c,a),b},i.chunkSizeFrom(a.chunk))}).then(function(){return i.each(c.updates,function(a){return d.updateChild(a.child,a.model),b},i.chunkSizeFrom(a.chunk))}).then(function(){return(c.adds.length>0||c.removals.length>0||c.updates.length>0)&&(a.plurals=d.scope.plurals,a.fit&&d.gManager.fit(),d.gManager.draw()),d.scope.pluralsUpdate.updateCtr+=1})}}(this)):(this.inProgress=!1,this.rebuildAll(a))},l.prototype.newChildMarker=function(a,b){var c,d,e;if(!a)throw"model undefined";return null==a[this.idKey]?void this.$log.error("Marker model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."):(this.$log.info("child",c,"markers",this.scope.markerModels),d=b.$new(!1),d.events=b.events,e={},m.scopeKeys.forEach(function(a){return e[a]=b[a]}),c=new h({scope:d,model:a,keys:e,gMap:this.map,defaults:this.DEFAULTS,doClick:this.doClick,gManager:this.gManager,doDrawSelf:!1,isScopeModel:!0}),this.scope.plurals.put(a[this.idKey],c),c)},l.prototype.onDestroy=function(a){return l.__super__.onDestroy.call(this,a),i.promiseLock(this,n.promiseTypes.delete,void 0,void 0,function(a){return function(){return i.each(a.scope.plurals.values(),function(a){if(null!=a)return a.destroy(!1)},i.chunkSizeFrom(a.scope.cleanchunk,!1)).then(function(){return null!=a.gManager&&a.gManager.destroy(),a.plurals.removeAll(),a.plurals!==a.scope.plurals&&console.error("plurals out of sync for MarkersParentModel"),a.scope.pluralsUpdate.updateCtr+=1})}}(this))},l.prototype.maybeExecMappedEvent=function(a,b){var d,e;if(!this.scope.$$destroyed)return e=this.scope.typeEvents||this.scope.clusterEvents,c.isFunction(null!=e?e[b]:void 0)&&(d=this.mapTypeToPlurals(a),this.origTypeEvents[b])?this.origTypeEvents[b](d.group,d.mapped):void 0},l.prototype.mapTypeToPlurals=function(a){var b,d,e;return c.isArray(a)?b=a:c.isFunction(a.getMarkers)&&(b=a.getMarkers()),null==b?void p.error("Unable to map event as we cannot find the array group to map"):(d=(null!=(e=this.scope.plurals.values())?e.length:void 0)?b.map(function(a){return function(b){return a.scope.plurals.get(b.key).model}}(this)):[],{cluster:a,mapped:d,group:a})},l.prototype.getItem=function(a,b,c){return"models"===b?a[b][c]:a[b].get(c)},l}(e)}])}.call(this),function(){["Polygon","Polyline"].forEach(function(a){return b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmap"+a+"sParentModel",["uiGmapBasePolysParentModel","uiGmap"+a+"ChildModel","uiGmapI"+a,function(b,c,d){return b(d,c,a)}])})}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapRectangleParentModel",["uiGmapLogger","uiGmapGmapUtil","uiGmapEventsHelper","uiGmapRectangleOptionsBuilder",function(b,d,e,f){var g;return g=function(f){function g(a,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;this.scope=a,this.attrs=e,this.gMap=f,this.DEFAULTS=g,h=void 0,k=!1,p=[],o=void 0,l=function(a){return function(){if(a.isTrue(a.attrs.fit))return a.fitMapBounds(a.gMap,h)}}(this),j=function(a){return function(){var c,d,e;return null!=a.scope.bounds&&null!=(null!=(c=a.scope.bounds)?c.sw:void 0)&&null!=(null!=(d=a.scope.bounds)?d.ne:void 0)&&a.validateBoundPoints(a.scope.bounds)?(h=a.convertBoundPoints(a.scope.bounds),b.info("new new bounds created: "+JSON.stringify(h))):null!=a.scope.bounds.getNorthEast&&null!=a.scope.bounds.getSouthWest?h=a.scope.bounds:null!=a.scope.bounds?b.error("Invalid bounds for newValue: "+JSON.stringify(null!=(e=a.scope)?e.bounds:void 0)):void 0}}(this),j(),m=new google.maps.Rectangle(this.buildOpts(h)),b.info("gObject (rectangle) created: "+m),q=!1,r=function(a){return function(){var b,c,d;if(b=m.getBounds(),c=b.getNorthEast(),d=b.getSouthWest(),!q)return a.scope.$evalAsync(function(a){if(null!=a.bounds&&null!=a.bounds.sw&&null!=a.bounds.ne&&(a.bounds.ne={latitude:c.lat(),longitude:c.lng()},a.bounds.sw={latitude:d.lat(),longitude:d.lng()}),null!=a.bounds.getNorthEast&&null!=a.bounds.getSouthWest)return a.bounds=b})}}(this),n=function(a){return function(){return l(),a.removeEvents(p),p.push(google.maps.event.addListener(m,"dragstart",function(){return k=!0})),p.push(google.maps.event.addListener(m,"dragend",function(){return k=!1,r()})),p.push(google.maps.event.addListener(m,"bounds_changed",function(){if(!k)return r()}))}}(this),i=function(a){return function(){return a.removeEvents(p),null!=o&&a.removeEvents(o),m.setMap(null)}}(this),null!=h&&n(),this.scope.$watch("bounds",function(a,b){var d;if(!(c.isEqual(a,b)&&null!=h||k))return q=!0,null==a?void i():(null==h?d=!0:l(),j(),m.setBounds(h),q=!1,d&&null!=h?n():void 0)},!0),this.setMyOptions=function(a){return function(b,d){if(!c.isEqual(b,d)&&null!=h&&null!=b)return m.setOptions(a.buildOpts(h))}}(this),this.props.push("bounds"),this.watchProps(this.props),null!=this.attrs.events&&(o=this.setEvents(m,this.scope,this.scope),this.scope.$watch("events",function(a){return function(b,d){if(!c.isEqual(b,d))return null!=o&&a.removeEvents(o),o=a.setEvents(m,a.scope,a.scope)}}(this))),this.scope.$on("$destroy",function(){return i()}),b.info(this)}return a(g,f),g.include(d),g.include(e),g}(f)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapSearchBoxParentModel",["uiGmapBaseObject","uiGmapLogger","uiGmapEventsHelper",function(d,e,f){var g;return g=function(d){function g(c,d,f,g,h,i,j){var k;return this.scope=c,this.element=d,this.attrs=f,this.gMap=g,this.ctrlPosition=h,this.template=i,this.$log=null!=j?j:e,this.setVisibility=a(this.setVisibility,this),this.getBounds=a(this.getBounds,this),this.setBounds=a(this.setBounds,this),this.createSearchBox=a(this.createSearchBox,this),this.addToParentDiv=a(this.addToParentDiv,this),this.addAsMapControl=a(this.addAsMapControl,this),this.init=a(this.init,this),null==this.attrs.template?void this.$log.error("template attribute for the search-box directive is mandatory. Places Search Box creation aborted!!"):(b.isUndefined(this.scope.options)&&(this.scope.options={},this.scope.options.visible=!0),b.isUndefined(this.scope.options.visible)&&(this.scope.options.visible=!0),b.isUndefined(this.scope.options.autocomplete)&&(this.scope.options.autocomplete=!1),this.visible=this.scope.options.visible,this.autocomplete=this.scope.options.autocomplete,k=b.element("
"),k.append(this.template),this.input=k.find("input")[0],void this.init())}return c(g,d),g.include(f),g.prototype.init=function(){return this.createSearchBox(),this.scope.$watch("options",function(a){return function(c,d){if(b.isObject(c)&&(null!=c.bounds&&a.setBounds(c.bounds),null!=c.visible&&a.visible!==c.visible))return a.setVisibility(c.visible)}}(this),!0),null!=this.attrs.parentdiv?this.addToParentDiv():this.addAsMapControl(),this.visible||this.setVisibility(this.visible),this.autocomplete?this.listener=google.maps.event.addListener(this.gObject,"place_changed",function(a){return function(){return a.places=a.gObject.getPlace()}}(this)):this.listener=google.maps.event.addListener(this.gObject,"places_changed",function(a){return function(){return a.places=a.gObject.getPlaces()}}(this)),this.listeners=this.setEvents(this.gObject,this.scope,this.scope),this.$log.info(this),this.scope.$on("$stateChangeSuccess",function(a){return function(){if(null!=a.attrs.parentdiv)return a.addToParentDiv()}}(this)),this.scope.$on("$destroy",function(a){return function(){return a.gObject=null}}(this))},g.prototype.addAsMapControl=function(){return this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input)},g.prototype.addToParentDiv=function(){var a;if(this.parentDiv=b.element(document.getElementById(this.scope.parentdiv)),null!=(a=this.parentDiv)?a.length:void 0)return this.parentDiv.append(this.input)},g.prototype.createSearchBox=function(){return this.autocomplete?this.gObject=new google.maps.places.Autocomplete(this.input,this.scope.options):this.gObject=new google.maps.places.SearchBox(this.input,this.scope.options)},g.prototype.setBounds=function(a){if(b.isUndefined(a.isEmpty))this.$log.error("Error: SearchBoxParentModel setBounds. Bounds not an instance of LatLngBounds.");else if(a.isEmpty()===!1&&null!=this.gObject)return this.gObject.setBounds(a)},g.prototype.getBounds=function(){return this.gObject.getBounds()},g.prototype.setVisibility=function(a){return null!=this.attrs.parentdiv?a===!1?this.parentDiv.addClass("ng-hide"):this.parentDiv.removeClass("ng-hide"):a===!1?this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].clear():this.gMap.controls[google.maps.ControlPosition[this.ctrlPosition]].push(this.input),this.visible=a},g}(d)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api.models.parent").factory("uiGmapWindowsParentModel",["uiGmapIWindowParentModel","uiGmapModelsWatcher","uiGmapPropMap","uiGmapWindowChildModel","uiGmapLinked","uiGmap_async","uiGmapLogger","$timeout","$compile","$http","$templateCache","$interpolate","uiGmapPromise","uiGmapIWindow","uiGmapGmapUtil",function(e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){var t;return t=function(e){function t(b,d,e,f,h,j){this.gMap=h,this.markersScope=j,this.modelKeyComparison=a(this.modelKeyComparison,this), +this.interpolateContent=a(this.interpolateContent,this),this.setChildScope=a(this.setChildScope,this),this.createWindow=a(this.createWindow,this),this.setContentKeys=a(this.setContentKeys,this),this.pieceMeal=a(this.pieceMeal,this),this.createAllNew=a(this.createAllNew,this),this.watchIdKey=a(this.watchIdKey,this),this.createChildScopes=a(this.createChildScopes,this),this.watchOurScope=a(this.watchOurScope,this),this.watchDestroy=a(this.watchDestroy,this),this.onDestroy=a(this.onDestroy,this),this.rebuildAll=a(this.rebuildAll,this),this.doINeedToWipe=a(this.doINeedToWipe,this),this.watchModels=a(this.watchModels,this),this.go=a(this.go,this),t.__super__.constructor.call(this,b,d,e,f,l,m,n,o),this.interface=r,this.plurals=new g,c.each(r.scopeKeys,function(a){return function(b){return a[b+"Key"]=void 0}}(this)),this.linked=new i(b,d,e,f),this.contentKeys=void 0,this.isIconVisibleOnClick=void 0,this.firstTime=!0,this.firstWatchModels=!0,this.$log.info(self),this.parentScope=void 0,this.go(b)}return d(t,e),t.include(f),t.prototype.go=function(a){return this.watchOurScope(a),this.doRebuildAll=null!=this.scope.doRebuildAll&&this.scope.doRebuildAll,a.$watch("doRebuildAll",function(a){return function(b,c){if(b!==c)return a.doRebuildAll=b}}(this)),this.createChildScopes()},t.prototype.watchModels=function(a){var b;return b=null!=this.markersScope?"pluralsUpdate":"models",a.$watch(b,function(b){return function(d,e){var f;if(!c.isEqual(d,e)||b.firstWatchModels)return b.firstWatchModels=!1,b.doRebuildAll||b.doINeedToWipe(a.models)?b.rebuildAll(a,!0,!0):(f=0===b.plurals.length,null!=b.existingPieces?c.last(b.existingPieces._content).then(function(){return b.createChildScopes(f)}):b.createChildScopes(f))}}(this),!0)},t.prototype.doINeedToWipe=function(a){var b;return b=null==a||0===a.length,this.plurals.length>0&&b},t.prototype.rebuildAll=function(a,b,c){return this.onDestroy(c).then(function(a){return function(){if(b)return a.createChildScopes()}}(this))},t.prototype.onDestroy=function(a){return t.__super__.onDestroy.call(this,this.scope),j.promiseLock(this,q.promiseTypes.delete,void 0,void 0,function(a){return function(){return j.each(a.plurals.values(),function(a){return a.destroy(!0)},j.chunkSizeFrom(a.scope.cleanchunk,!1)).then(function(){var b;return null!=(b=a.plurals)?b.removeAll():void 0})}}(this))},t.prototype.watchDestroy=function(a){return a.$on("$destroy",function(b){return function(){return b.firstWatchModels=!0,b.firstTime=!0,b.rebuildAll(a,!1,!0)}}(this))},t.prototype.watchOurScope=function(a){return c.each(r.scopeKeys,function(b){return function(c){var d;return d=c+"Key",b[d]="function"==typeof a[c]?a[c]():a[c]}}(this))},t.prototype.createChildScopes=function(a){var c,d,e;return null==a&&(a=!0),this.isIconVisibleOnClick=!0,b.isDefined(this.linked.attrs.isiconvisibleonclick)&&(this.isIconVisibleOnClick=this.linked.scope.isIconVisibleOnClick),c=b.isUndefined(this.linked.scope.models),!c||void 0!==this.markersScope&&void 0!==(null!=(d=this.markersScope)?d.plurals:void 0)&&void 0!==(null!=(e=this.markersScope)?e.models:void 0)?null!=this.gMap?null!=this.linked.scope.models?(this.watchIdKey(this.linked.scope),a?this.createAllNew(this.linked.scope,!1):this.pieceMeal(this.linked.scope,!1)):(this.parentScope=this.markersScope,this.watchIdKey(this.parentScope),a?this.createAllNew(this.markersScope,!0,"plurals",!1):this.pieceMeal(this.markersScope,!0,"plurals",!1)):void 0:void this.$log.error("No models to create windows from! Need direct models or models derived from markers!")},t.prototype.watchIdKey=function(a){return this.setIdKey(a),a.$watch("idKey",function(b){return function(c,d){if(c!==d&&null==c)return b.idKey=c,b.rebuildAll(a,!0,!0)}}(this))},t.prototype.createAllNew=function(a,b,c,d){var e;if(null==c&&(c="models"),null==d&&(d=!1),this.firstTime&&(this.watchModels(a),this.watchDestroy(a)),this.setContentKeys(a.models),!this.didQueueInitPromise(this,a))return e=null,j.promiseLock(this,q.promiseTypes.create,"createAllNew",function(a){return e=a},function(d){return function(){return j.each(a.models,function(f){var g,h;return g=b&&null!=(h=d.getItem(a,c,f[d.idKey]))?h.gObject:void 0,e||(!g&&d.markersScope&&k.error("Unable to get gMarker from markersScope!"),d.createWindow(f,g,d.gMap)),e},j.chunkSizeFrom(a.chunk)).then(function(){return d.firstTime=!1})}}(this))},t.prototype.pieceMeal=function(a,b,c,d){var e,f;if(null==c&&(c="models"),null==d&&(d=!0),!a.$$destroyed)return e=null,f=null,null!=a&&this.modelsLength()&&this.plurals.length?j.promiseLock(this,q.promiseTypes.update,"pieceMeal",function(a){return e=a},function(b){return function(){return q.promise(function(){return b.figureOutState(b.idKey,a,b.plurals,b.modelKeyComparison)}).then(function(c){return f=c,j.each(f.removals,function(a){if(null!=a)return b.plurals.remove(a.id),null!=a.destroy&&a.destroy(!0),e},j.chunkSizeFrom(a.chunk))}).then(function(){return j.each(f.adds,function(d){var f,g;if(f=null!=(g=b.getItem(a,c,d[b.idKey]))?g.gObject:void 0,!f)throw"Gmarker undefined";return b.createWindow(d,f,b.gMap),e})}).then(function(){return j.each(f.updates,function(a){return b.updateChild(a.child,a.model),e},j.chunkSizeFrom(a.chunk))})}}(this)):(k.debug("pieceMeal: rebuildAll"),this.rebuildAll(this.scope,!0,!0))},t.prototype.setContentKeys=function(a){if(this.modelsLength(a))return this.contentKeys=Object.keys(a[0])},t.prototype.createWindow=function(a,b,c){var d,e,f,g,i,j;return e=this.linked.scope.$new(!1),this.setChildScope(e,a),e.$watch("model",function(a){return function(b,c){if(b!==c)return a.setChildScope(e,b)}}(this),!0),f={html:function(b){return function(){return b.interpolateContent(b.linked.element.html(),a)}}(this)},this.DEFAULTS=this.scopeOrModelVal(this.optionsKey,this.scope,a)||{},g=this.createWindowOptions(b,e,f.html(),this.DEFAULTS),d=new h({model:a,scope:e,opts:g,isIconVisibleOnClick:this.isIconVisibleOnClick,gMap:c,markerScope:null!=(i=this.markersScope)&&null!=(j=i.plurals.get(a[this.idKey]))?j.scope:void 0,element:f,needToManualDestroy:!1,markerIsVisibleAfterWindowClose:!0,isScopeModel:!0}),null==a[this.idKey]?void this.$log.error("Window model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key."):(this.plurals.put(a[this.idKey],d),d)},t.prototype.setChildScope=function(a,b){return c.each(r.scopeKeys,function(c){return function(d){var e,f;if(e=d+"Key",f="self"===c[e]?b:b[c[e]],f!==a[d])return a[d]=f}}(this)),a.model=b},t.prototype.interpolateContent=function(a,b){var c,d,e,f,g,h;if(void 0!==this.contentKeys&&0!==this.contentKeys.length){for(c=p(a),e={},h=this.contentKeys,d=0,g=h.length;d"),o=function(a,b,c){return c&&(b[0].index=c),a.controls[google.maps.ControlPosition[n]].push(b[0])},j?l(function(a){return k.append(a),o(d,k.children(),m)}):e.get(a.template,{cache:f}).then(function(c){var d,e,f;return d=c.data,f=a.$new(),k.append(d),b.isDefined(a.controller)&&(e=h(a.controller,{$scope:f}),k.children().data("$ngControllerController",e)),i=g(k.children())(f)}).catch(function(a){return c.$log.error("mapControl: template could not be found")}).then(function(){return o(d,i,m)})}):void c.$log.error("mapControl: invalid position property")}}(this))},k}(d)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapDragZoom",["uiGmapCtrlHandle","uiGmapPropertyAction",function(a,b){return{restrict:"EMA",transclude:!0,template:'',require:"^uiGmapGoogleMap",scope:{keyboardkey:"=",options:"=",spec:"="},controller:["$scope","$element",function(b,d){return b.ctrlType="uiGmapDragZoom",c.extend(this,a.handle(b,d))}],link:function(c,d,e,f){return a.mapPromise(c,f).then(function(a){var d,e,f;return d=function(b){return a.enableKeyDragZoom(b)},e=new b(function(a,b){return b?d({key:b}):d()}),f=new b(function(a,b){if(b)return d(b)}),c.$watch("keyboardkey",e.sic("keyboardkey")),e.sic(c.keyboardkey),c.$watch("options",f.sic("options")),f.sic(c.options)})}}}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapDrawingManager",["uiGmapIDrawingManager","uiGmapDrawingManagerParentModel",function(a,b){return c.extend(a,{link:function(a,c,d,e){return e.getScope().deferred.promise.then(function(e){return new b(a,c,d,e)})}})}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapApiFreeDrawPolygons",["uiGmapLogger","uiGmapBaseObject","uiGmapCtrlHandle","uiGmapDrawFreeHandChildModel","uiGmapLodash",function(b,e,f,g,h){var i;return i=function(e){function i(){return this.link=a(this.link,this),i.__super__.constructor.apply(this,arguments)}return d(i,e),i.include(f),i.prototype.restrict="EMA",i.prototype.replace=!0,i.prototype.require="^uiGmapGoogleMap",i.prototype.scope={polygons:"=",draw:"="},i.prototype.link=function(a,d,e,f){return this.mapPromise(a,f).then(function(d){return function(d){var e,i;return a.polygons?c.isArray(a.polygons)?(e=new g(d,f.getScope()),i=void 0,a.draw=function(){return"function"==typeof i&&i(),e.engage(a.polygons).then(function(){var b;return b=!0,i=a.$watchCollection("polygons",function(a,c){var d;return b||a===c?void(b=!1):(d=h.differenceObjects(c,a),d.forEach(function(a){return a.setMap(null)}))})})}):b.error("Free Draw Polygons must be of type Array!"):b.error("No polygons to bind to!")}}(this))},i}(e)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapICircle",[function(){return{restrict:"EA",replace:!0,require:"^uiGmapGoogleMap",scope:{center:"=center",radius:"=radius",stroke:"=stroke",fill:"=fill",clickable:"=",draggable:"=",editable:"=",geodesic:"=",icons:"=icons",visible:"=",events:"=",control:"=",zIndex:"=zindex"}}}])}.call(this),function(){var a=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a},c={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIControl",["uiGmapBaseObject","uiGmapLogger","uiGmapCtrlHandle",function(b,c,d){var e;return e=function(b){function e(){this.restrict="EA",this.replace=!0,this.require="^uiGmapGoogleMap",this.scope={template:"@template",position:"@position",controller:"@controller",index:"@index"},this.$log=c}return a(e,b),e.extend(d),e.prototype.link=function(a,b,c,d){throw new Error("Not implemented!!")},e}(b)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapIDrawingManager",[function(){return{restrict:"EA",replace:!0,require:"^uiGmapGoogleMap",scope:{static:"@",control:"=",options:"=",events:"="}}}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIMarker",["uiGmapBaseObject","uiGmapCtrlHandle",function(b,d){var e;return e=function(b){function e(){this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.replace=!0,this.scope=c.extend(this.scope||{},e.scope)}return a(e,b),e.scope={coords:"=coords",icon:"=icon",click:"&click",options:"=options",events:"=events",fit:"=fit",idKey:"=idkey",control:"=control"},e.scopeKeys=c.keys(e.scope),e.keys=e.scopeKeys,e.extend(d),e}(b)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIPolygon",["uiGmapGmapUtil","uiGmapBaseObject","uiGmapLogger","uiGmapCtrlHandle",function(b,d,e,f){var g;return g=function(d){function g(){}return a(g,d),g.scope={path:"=path",stroke:"=stroke",clickable:"=",draggable:"=",editable:"=",geodesic:"=",fill:"=",icons:"=icons",visible:"=",static:"=",events:"=",zIndex:"=zindex",fit:"=",control:"=control"},g.scopeKeys=c.keys(g.scope),g.include(b),g.extend(f),g.prototype.restrict="EMA",g.prototype.replace=!0,g.prototype.require="^uiGmapGoogleMap",g.prototype.scope=g.scope,g.prototype.DEFAULTS={},g.prototype.$log=e,g}(d)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIPolyline",["uiGmapGmapUtil","uiGmapBaseObject","uiGmapLogger","uiGmapCtrlHandle",function(b,d,e,f){var g;return g=function(d){function g(){}return a(g,d),g.scope={path:"=",stroke:"=",clickable:"=",draggable:"=",editable:"=",geodesic:"=",icons:"=",visible:"=",static:"=",fit:"=",events:"=",zIndex:"=zindex"},g.scopeKeys=c.keys(g.scope),g.include(b),g.extend(f),g.prototype.restrict="EMA",g.prototype.replace=!0,g.prototype.require="^uiGmapGoogleMap",g.prototype.scope=g.scope,g.prototype.DEFAULTS={},g.prototype.$log=e,g}(d)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapIRectangle",[function(){return{restrict:"EMA",require:"^uiGmapGoogleMap",replace:!0,scope:{bounds:"=",stroke:"=",clickable:"=",draggable:"=",editable:"=",fill:"=",visible:"=",events:"="}}}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapIWindow",["uiGmapBaseObject","uiGmapChildEvents","uiGmapCtrlHandle",function(b,d,e){var f;return f=function(b){function f(){this.restrict="EMA",this.template=void 0,this.transclude=!0,this.priority=-100,this.require="^uiGmapGoogleMap",this.replace=!0,this.scope=c.extend(this.scope||{},f.scope)}return a(f,b),f.scope={coords:"=coords",template:"=template",templateUrl:"=templateurl",templateParameter:"=templateparameter",isIconVisibleOnClick:"=isiconvisibleonclick",closeClick:"&closeclick",options:"=options",control:"=control",show:"=show"},f.scopeKeys=c.keys(f.scope),f.include(d),f.extend(e),f}(b)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},d=function(a,b){function c(){this.constructor=a}for(var d in b)e.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},e={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMap",["$timeout","$q","$log","uiGmapGmapUtil","uiGmapBaseObject","uiGmapCtrlHandle","uiGmapIsReady","uiGmapuuid","uiGmapExtendGWin","uiGmapExtendMarkerClusterer","uiGmapGoogleMapsUtilV3","uiGmapGoogleMapApi","uiGmapEventsHelper","uiGmapGoogleMapObjectManager",function(e,f,g,h,i,j,k,l,m,n,o,p,q,r){var s,t,u;return s=void 0,u=[o,m,n],t=function(f){function i(){this.link=a(this.link,this);var b;b=function(a){var b,d;return d=void 0,a.$on("$destroy",function(){return k.decrement()}),b=j.handle(a),a.ctrlType="Map",a.deferred.promise.then(function(){return u.forEach(function(a){return a.init()})}),b.getMap=function(){return a.map},d=c.extend(this,b)},this.controller=["$scope",b]}return d(i,f),i.include(h),i.prototype.restrict="EMA",i.prototype.transclude=!0,i.prototype.replace=!1,i.prototype.template='
\n
',i.prototype.scope={center:"=",zoom:"=",dragging:"=",control:"=",options:"=",events:"=",eventOpts:"=",styles:"=",bounds:"=",update:"="},i.prototype.link=function(a,d,f){var h;return h=[],a.$on("$destroy",function(){if(q.removeEvents(h),"true"===f.recycleMapInstance&&a.map)return r.recycleMapInstance(a.map),a.map=null}),a.idleAndZoomChanged=!1,p.then(function(i){return function(j){var m,n,o,p,t,u,v,w,x,y,z,A,B,C,D,E,F;if(s={mapTypeId:j.MapTypeId.ROADMAP},C=k.spawn(),A=function(){return C.deferred.resolve({instance:C.instance,map:m})},!b.isDefined(a.center)&&!b.isDefined(a.bounds))return void g.error("angular-google-maps: a center or bounds property is required");if(b.isDefined(a.center)||(a.center=new google.maps.LatLngBounds(i.getCoords(a.bounds.southwest),i.getCoords(a.bounds.northeast)).getCenter()),b.isDefined(a.zoom)||(a.zoom=10),t=b.element(d),t.addClass("angular-google-map"),y={options:{}},f.options&&(y.options=a.options),f.styles&&(y.styles=a.styles),f.type&&(D=f.type.toUpperCase(),google.maps.MapTypeId.hasOwnProperty(D)?y.mapTypeId=google.maps.MapTypeId[f.type.toUpperCase()]:g.error("angular-google-maps: invalid map type '"+f.type+"'")),w=b.extend({},s,y,{center:i.getCoords(a.center),zoom:a.zoom,bounds:a.bounds}),m="true"===f.recycleMapInstance?r.createMapInstance(t.find("div")[1],w):new google.maps.Map(t.find("div")[1],w),m.uiGmap_id=l.generate(),p=!1,h.push(google.maps.event.addListenerOnce(m,"idle",function(){return a.deferred.resolve(m),A()})),o=f.events&&null!=(null!=(z=a.events)?z.blacklist:void 0)?a.events.blacklist:[],c.isString(o)&&(o=[o]),x=function(b,d,e){if(!c.includes(o,b))return e&&e(),h.push(google.maps.event.addListener(m,b,function(){var b;if(!(null!=(b=a.update)?b.lazy:void 0))return d()}))},c.includes(o,"all")||(x("dragstart",function(){return p=!0,a.$evalAsync(function(a){if(null!=a.dragging)return a.dragging=p})}),x("dragend",function(){return p=!1,a.$evalAsync(function(a){if(null!=a.dragging)return a.dragging=p})}),E=function(d,e){var f,g;if(null==d&&(d=m.center),null==e&&(e=a),!c.includes(o,"center"))if(f=d.lat(),g=d.lng(),b.isDefined(e.center.type)){if(e.center.coordinates[1]!==f&&(e.center.coordinates[1]=f),e.center.coordinates[0]!==g)return e.center.coordinates[0]=g}else if(e.center.latitude!==f&&(e.center.latitude=f),e.center.longitude!==g)return e.center.longitude=g},B=!1,x("idle",function(){var b,d,e;return b=m.getBounds(),d=b.getNorthEast(),e=b.getSouthWest(),B=!0,a.$evalAsync(function(b){return E(),c.isUndefined(b.bounds)||c.includes(o,"bounds")||(b.bounds.northeast={latitude:d.lat(),longitude:d.lng()},b.bounds.southwest={latitude:e.lat(),longitude:e.lng()}),c.includes(o,"zoom")||(b.zoom=m.zoom,a.idleAndZoomChanged=!a.idleAndZoomChanged),B=!1})})),b.isDefined(a.events)&&null!==a.events&&b.isObject(a.events)){v=function(b){return function(){return a.events[b].apply(a,[m,b,arguments])}},n=[];for(u in a.events)a.events.hasOwnProperty(u)&&b.isFunction(a.events[u])&&n.push(google.maps.event.addListener(m,u,v(u)));h.concat(n)}return m.getOptions=function(){return w},a.map=m,null!=f.control&&null!=a.control&&(a.control.refresh=function(a){var b,c,d;if(null!=m)return null!=("undefined"!=typeof google&&null!==google&&null!=(c=google.maps)&&null!=(d=c.event)?d.trigger:void 0)&&null!=m&&google.maps.event.trigger(m,"resize"),null!=(null!=a?a.latitude:void 0)&&null!=(null!=a?a.longitude:void 0)?(b=i.getCoords(a),i.isTrue(f.pan)?m.panTo(b):m.setCenter(b)):void 0},a.control.getGMap=function(){return m},a.control.getMapOptions=function(){return w},a.control.getCustomEventListeners=function(){return n},a.control.removeEvents=function(a){return q.removeEvents(a)}),a.$watch("center",function(b,c){var d;if(b!==c&&!B&&(d=i.getCoords(a.center),d.lat()!==m.center.lat()||d.lng()!==m.center.lng()))return p?void 0:(i.validateCoords(b)||g.error("Invalid center for newValue: "+JSON.stringify(b)),i.isTrue(f.pan)&&a.zoom===m.zoom?m.panTo(d):m.setCenter(d))},!0),F=null,a.$watch("zoom",function(b,d){var f,g;if(null!=b&&!c.isEqual(b,d)&&(null!=m?m.getZoom():void 0)!==(null!=a?a.zoom:void 0)&&!B)return null!=F&&e.cancel(F),F=e(function(){return m.setZoom(b)},(null!=(f=a.eventOpts)&&null!=(g=f.debounce)?g.zoomMs:void 0)+20,!1)}),a.$watch("bounds",function(a,b){var c,d,e,f,h,i,j;if(a!==b)return null==(null!=a&&null!=(e=a.northeast)?e.latitude:void 0)||null==(null!=a&&null!=(f=a.northeast)?f.longitude:void 0)||null==(null!=a&&null!=(h=a.southwest)?h.latitude:void 0)||null==(null!=a&&null!=(i=a.southwest)?i.longitude:void 0)?void g.error("Invalid map bounds for new value: "+JSON.stringify(a)):(d=new google.maps.LatLng(a.northeast.latitude,a.northeast.longitude),j=new google.maps.LatLng(a.southwest.latitude,a.southwest.longitude),c=new google.maps.LatLngBounds(j,d),m.fitBounds(c))}),["options","styles"].forEach(function(b){return a.$watch(b,function(a,d){if(!c.isEqual(a,d))return"options"===b?y.options=a:y.options[b]=a,null!=m?m.setOptions(y):void 0},!0)})}}(this))},i}(i)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMarker",["uiGmapIMarker","uiGmapMarkerChildModel","uiGmapMarkerManager","uiGmapLogger",function(b,d,e,f){var g;return g=function(g){function h(){h.__super__.constructor.call(this),this.template='',f.info(this)}return a(h,g),h.prototype.controller=["$scope","$element",function(a,d){return a.ctrlType="Marker",c.extend(this,b.handle(a,d))}],h.prototype.link=function(a,f,g,h){var i;return i=b.mapPromise(a,h),i.then(function(f){var g,h,i;if(g=new e(f),h=c.object(b.keys,b.keys),i=new d({scope:a,model:a,keys:h,gMap:f,doClick:!0,gManager:g,doDrawSelf:!1,trackModel:!1}),i.deferred.promise.then(function(b){return a.deferred.resolve(b)}),null!=a.control)return a.control.getGMarkers=g.getGMarkers}),a.$on("$destroy",function(){var a;return"undefined"!=typeof a&&null!==a&&a.clear(),a=null})},h}(b)}])}.call(this),function(){var a=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapMarkers",["uiGmapIMarker","uiGmapPlural","uiGmapMarkersParentModel","uiGmap_sync","uiGmapLogger",function(b,d,e,f,g){var h;return h=function(f){function h(){h.__super__.constructor.call(this),this.template='',d.extend(this,{doCluster:"=?docluster",clusterOptions:"=clusteroptions",clusterEvents:"=clusterevents",modelsByRef:"=modelsbyref",type:"=?type",typeOptions:"=?typeoptions",typeEvents:"=?typeevents",deepComparison:"=?deepcomparison"}),g.info(this)}return a(h,f),h.prototype.controller=["$scope","$element",function(a,d){return a.ctrlType="Markers",c.extend(this,b.handle(a,d))}],h.prototype.link=function(a,f,g,h){var i,j;return i=void 0,j=function(){return a.deferred.resolve()},b.mapPromise(a,h).then(function(b){var k;return k=h.getScope(),k.$watch("idleAndZoomChanged",function(){return c.defer(i.gManager.draw)}),i=new e(a,f,g,b),d.link(a,i),null!=a.control&&(a.control.getGMarkers=function(){var a;return null!=(a=i.gManager)?a.getGMarkers():void 0},a.control.getChildMarkers=function(){return i.plurals}),c.last(i.existingPieces._content).then(function(){return j()})})},h}(b)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").service("uiGmapPlural",[function(){var a;return a=function(a,b){if(null!=a.control)return a.control.updateModels=function(c){return a.models=c,b.createChildScopes(!1)},a.control.newModels=function(c){return a.models=c,b.rebuildAll(a,!0,!0)},a.control.clean=function(){return b.rebuildAll(a,!1,!0)},a.control.getPlurals=function(){return b.plurals},a.control.getManager=function(){return b.gManager},a.control.hasManager=function(){return null!=b.gManager==!0},a.control.managerDraw=function(){var b;if(a.control.hasManager())return null!=(b=a.control.getManager())?b.draw():void 0}},{extend:function(a,b){return c.extend(a.scope||{},b||{},{idKey:"=idkey",doRebuildAll:"=dorebuildall",models:"=models",chunk:"=chunk",cleanchunk:"=cleanchunk",control:"=control",deepComparison:"=deepcomparison"})},link:function(b,c){return a(b,c)}}}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolygon",["uiGmapIPolygon","$timeout","uiGmapPolygonChildModel",function(b,d,e){var f;return f=function(d){function f(){return this.link=a(this.link,this),f.__super__.constructor.apply(this,arguments)}return c(f,d),f.prototype.link=function(a,c,d,f){var g,h;return g=[],h=b.mapPromise(a,f),null!=a.control&&(a.control.getInstance=this,a.control.polygons=g,a.control.promise=h),h.then(function(b){return function(c){return g.push(new e({scope:a,attrs:d,gMap:c,defaults:b.DEFAULTS}))}}(this))},f}(b)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolygons",["uiGmapIPolygon","$timeout","uiGmapPolygonsParentModel","uiGmapPlural",function(d,e,f,g){var h;return h=function(d){function e(){this.link=a(this.link,this),e.__super__.constructor.call(this),g.extend(this),this.$log.info(this)}return c(e,d),e.prototype.link=function(a,c,d,e){return e.getScope().deferred.promise.then(function(e){return function(h){return(b.isUndefined(a.path)||null===a.path)&&e.$log.warn("polygons: no valid path attribute found"),a.models||e.$log.warn("polygons: no models found to create from"),g.link(a,new f(a,c,d,h,e.DEFAULTS))}}(this))},e}(d)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolyline",["uiGmapIPolyline","$timeout","uiGmapPolylineChildModel",function(d,e,f){var g;return g=function(e){function g(){return this.link=a(this.link,this),g.__super__.constructor.apply(this,arguments)}return c(g,e),g.prototype.link=function(a,c,e,g){return d.mapPromise(a,g).then(function(c){return function(d){return!b.isUndefined(a.path)&&null!==a.path&&c.validatePath(a.path)||c.$log.warn("polyline: no valid path attribute found"),new f({scope:a,attrs:e,gMap:d,defaults:c.DEFAULTS})}}(this))},g}(d)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapPolylines",["uiGmapIPolyline","$timeout","uiGmapPolylinesParentModel","uiGmapPlural",function(d,e,f,g){var h;return h=function(d){function e(){this.link=a(this.link,this),e.__super__.constructor.call(this),g.extend(this),this.$log.info(this)}return c(e,d),e.prototype.link=function(a,c,d,e){return e.getScope().deferred.promise.then(function(e){return function(h){return(b.isUndefined(a.path)||null===a.path)&&e.$log.warn("polylines: no valid path attribute found"),a.models||e.$log.warn("polylines: no models found to create from"),g.link(a,new f(a,c,d,h,e.DEFAULTS))}}(this))},e}(d)}])}.call(this),function(){b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapRectangle",["uiGmapLogger","uiGmapGmapUtil","uiGmapIRectangle","uiGmapRectangleParentModel",function(a,b,d,e){return c.extend(d,{link:function(a,b,c,d){return d.getScope().deferred.promise.then(function(d){return new e(a,b,c,d)})}})}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapWindow",["uiGmapIWindow","uiGmapGmapUtil","uiGmapWindowChildModel","uiGmapLodash","uiGmapLogger",function(d,e,f,g,h){var i;return i=function(i){function j(){this.link=a(this.link,this),j.__super__.constructor.call(this),this.require=["^uiGmapGoogleMap","^?uiGmapMarker"],this.template='',h.debug(this),this.childWindows=[]}return c(j,i),j.include(e),j.prototype.link=function(a,c,e,f){var g,h;return g=f.length>1&&null!=f[1]?f[1]:void 0,h=null!=g?g.getScope():void 0,this.mapPromise=d.mapPromise(a,f[0]),this.mapPromise.then(function(d){return function(f){var i;return i=!0,b.isDefined(e.isiconvisibleonclick)&&(i=a.isIconVisibleOnClick),g?h.deferred.promise.then(function(b){return d.init(a,c,i,f,h)}):void d.init(a,c,i,f)}}(this))},j.prototype.init=function(a,b,c,d,e){var h,i,j,k,l;if(i=null!=a.options?a.options:{},k=null!=a&&this.validateCoords(a.coords),null!=(null!=e?e.getGMarker:void 0)&&(j=e.getGMarker()),l=k?this.createWindowOptions(j,a,b.html(),i):i,null!=d&&(h=new f({scope:a,opts:l,isIconVisibleOnClick:c,gMap:d,markerScope:e,element:b}),this.childWindows.push(h),a.$on("$destroy",function(a){return function(){return a.childWindows=g.withoutObjects(a.childWindows,[h],function(a,b){return a.scope.$id===b.scope.$id}),a.childWindows.length=0}}(this))),null!=a.control&&(a.control.getGWindows=function(a){return function(){return a.childWindows.map(function(a){return a.gObject})}}(this),a.control.getChildWindows=function(a){return function(){return a.childWindows}}(this),a.control.getPlurals=a.control.getChildWindows,a.control.showWindow=function(a){return function(){return a.childWindows.map(function(a){return a.showWindow()})}}(this),a.control.hideWindow=function(a){return function(){return a.childWindows.map(function(a){return a.hideWindow()})}}(this)),null!=this.onChildCreation&&null!=h)return this.onChildCreation(h)},j}(d)}])}.call(this),function(){var a=function(a,b){return function(){ +return a.apply(b,arguments)}},c=function(a,b){function c(){this.constructor=a}for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},d={}.hasOwnProperty;b.module("uiGmapgoogle-maps.directives.api").factory("uiGmapWindows",["uiGmapIWindow","uiGmapPlural","uiGmapWindowsParentModel","uiGmapPromise","uiGmapLogger",function(b,d,e,f,g){var h;return h=function(b){function h(){this.link=a(this.link,this),h.__super__.constructor.call(this),this.require=["^uiGmapGoogleMap","^?uiGmapMarkers"],this.template='',d.extend(this),g.debug(this)}return c(h,b),h.prototype.link=function(a,b,c,d){var e,g,h;return e=d[0].getScope(),g=d.length>1&&null!=d[1]?d[1]:void 0,h=null!=g?g.getScope():void 0,e.deferred.promise.then(function(e){return function(g){var i,j;return i=(null!=h&&null!=(j=h.deferred)?j.promise:void 0)||f.resolve(),i.then(function(){var f,i;return f=null!=(i=e.parentModel)?i.existingPieces:void 0,f?f.then(function(){return e.init(a,b,c,d,g,h)}):e.init(a,b,c,d,g,h)})}}(this))},h.prototype.init=function(a,b,c,f,g,h){var i;if(i=new e(a,b,c,f,g,h),d.link(a,i),null!=a.control)return a.control.getGWindows=function(){return i.plurals.map(function(a){return a.gObject})},a.control.getChildWindows=function(){return i.plurals}},h}(b)}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapGoogleMap",["uiGmapMap",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapMarker",["$timeout","uiGmapMarker",function(a,b){return new b(a)}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapMarkers",["$timeout","uiGmapMarkers",function(a,b){return new b(a)}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapPolygon",["uiGmapPolygon",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapCircle",["uiGmapCircle",function(a){return a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapPolyline",["uiGmapPolyline",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapPolylines",["uiGmapPolylines",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapRectangle",["uiGmapLogger","uiGmapRectangle",function(a,b){return b}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapWindow",["$timeout","$compile","$http","$templateCache","uiGmapWindow",function(a,b,c,d,e){return new e(a,b,c,d)}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapWindows",["$timeout","$compile","$http","$templateCache","$interpolate","uiGmapWindows",function(a,b,c,d,e,f){return new f(a,b,c,d,e)}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps").directive("uiGmapLayer",["$timeout","uiGmapLogger","uiGmapLayerParentModel",function(b,c,d){var e;return new(e=function(){function b(){this.link=a(this.link,this),this.$log=c,this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.template="",this.replace=!0,this.scope={show:"=show",type:"=type",namespace:"=namespace",options:"=options",onCreated:"&oncreated"}}return b.prototype.link=function(a,b,c,e){return e.getScope().deferred.promise.then(function(e){return function(e){return null!=a.onCreated?new d(a,b,c,e,a.onCreated):new d(a,b,c,e)}}(this))},b}())}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapMapControl",["uiGmapControl",function(a){return new a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapDragZoom",["uiGmapDragZoom",function(a){return a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapDrawingManager",["uiGmapDrawingManager",function(a){return a}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapFreeDrawPolygons",["uiGmapApiFreeDrawPolygons",function(a){return new a}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps").directive("uiGmapMapType",["$timeout","uiGmapLogger","uiGmapMapTypeParentModel",function(b,c,d){var e;return new(e=function(){function b(){this.link=a(this.link,this),this.$log=c,this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.template='',this.replace=!0,this.scope={show:"=show",options:"=options",refresh:"=refresh",id:"@"}}return b.prototype.link=function(a,b,c,e){return e.getScope().deferred.promise.then(function(e){return function(e){return new d(a,b,c,e)}}(this))},b}())}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps").directive("uiGmapMapTypes",["$timeout","uiGmapLogger","uiGmapMapTypesParentModel",function(b,c,d){var e;return new(e=function(){function b(){this.link=a(this.link,this),this.$log=c,this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.template='',this.scope={mapTypes:"=mapTypes",show:"=show",options:"=options",refresh:"=refresh",id:"=idKey"}}return b.prototype.link=function(a,b,c,e){return e.getScope().deferred.promise.then(function(e){return function(e){return new d(a,b,c,e)}}(this))},b}())}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapPolygons",["uiGmapPolygons",function(a){return new a}])}.call(this),function(){var a=function(a,b){return function(){return a.apply(b,arguments)}};b.module("uiGmapgoogle-maps").directive("uiGmapSearchBox",["uiGmapGoogleMapApi","uiGmapLogger","uiGmapSearchBoxParentModel","$http","$templateCache","$compile",function(c,d,e,f,g,h){var i;return new(i=function(){function i(){this.link=a(this.link,this),this.$log=d,this.restrict="EMA",this.require="^uiGmapGoogleMap",this.priority=-1,this.transclude=!0,this.template="",this.replace=!0,this.scope={template:"=template",events:"=events",position:"=?position",options:"=?options",parentdiv:"=?parentdiv",ngModel:"=?"}}return i.prototype.require="ngModel",i.prototype.link=function(a,d,i,j){return c.then(function(c){return function(k){return null==a.template&&(g.put("uigmap-searchbox-default.tpl.html",''),a.template="uigmap-searchbox-default.tpl.html"),f.get(a.template,{cache:g}).then(function(f){var g;return g=f.data,b.isUndefined(a.events)?void c.$log.error("searchBox: the events property is required"):j.getScope().deferred.promise.then(function(f){var j;return j=b.isDefined(a.position)?a.position.toUpperCase().replace(/-/g,"_"):"TOP_LEFT",k.ControlPosition[j]?new e(a,d,i,f,j,h(g)(a)):void c.$log.error("searchBox: invalid position property")})})}}(this))},i}())}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapShow",["$animate","uiGmapLogger",function(a,c){return{scope:{uiGmapShow:"=",uiGmapAfterShow:"&",uiGmapAfterHide:"&"},link:function(d,e){var f,g,h;return f=function(b,c){return a[b](e,"ng-hide").then(function(){return c()})},g=function(b,c){return a[b](e,"ng-hide",c)},h=function(a,d){return b.version.major>1?c.error("uiGmapShow is not supported for Angular Major greater than 1.\nYour Major is "+b.version.major+'"'):1===b.version.major&&b.version.minor<3?g(a,d):f(a,d)},d.$watch("uiGmapShow",function(a){if(a&&h("removeClass",d.uiGmapAfterShow),!a)return h("addClass",d.uiGmapAfterHide)})}}}])}.call(this),function(){b.module("uiGmapgoogle-maps").directive("uiGmapStreetViewPanorama",["uiGmapGoogleMapApi","uiGmapLogger","uiGmapGmapUtil","uiGmapEventsHelper",function(a,c,d,e){var f;return f="uiGmapStreetViewPanorama",{restrict:"EMA",template:'
',replace:!0,scope:{focalcoord:"=",radius:"=?",events:"=?",options:"=?",control:"=?",povoptions:"=?",imagestatus:"="},link:function(g,h,i){return a.then(function(a){return function(a){var i,j,k,l,m,n,o,p,q,r;return p=void 0,r=void 0,k=!1,n=void 0,o=null,q=null,i=function(){if(e.removeEvents(n),null!=p&&(p.unbind("position"),p.setVisible(!1)),null!=r)return null!=(null!=r?r.setVisible:void 0)&&r.setVisible(!1),r=void 0},m=function(a,c){var d;return d=google.maps.geometry.spherical.computeHeading(a,c),k=!0,g.radius=g.radius||50,q=b.extend({heading:d,zoom:1,pitch:0},g.povoptions||{}),o=o=b.extend({navigationControl:!1,addressControl:!1,linksControl:!1,position:a,pov:q,visible:!0},g.options||{}),k=!1},j=function(){var a;return g.focalcoord?g.radius?(i(),null==r&&(r=new google.maps.StreetViewService),g.events&&(n=e.setEvents(r,g,g)),a=d.getCoords(g.focalcoord),r.getPanoramaByLocation(a,g.radius,function(b,c){var d,e,f;if(null!=g.imagestatus&&(g.imagestatus=c),null!=(null!=(f=g.events)?f.image_status_changed:void 0)&&g.events.image_status_changed(r,"image_status_changed",g,c),"OK"===c)return e=b.location.latLng,m(e,a),d=h[0],p=new google.maps.StreetViewPanorama(d,o)})):void c.error(f+": needs a radius to set the camera view from its focal target."):void c.error(f+": focalCoord needs to be defined")},null!=g.control&&(g.control.getOptions=function(){return o},g.control.getPovOptions=function(){return q},g.control.getGObject=function(){return r},g.control.getGPano=function(){return p}),g.$watch("options",function(a,b){if(a!==b&&a!==o&&!k)return j()}),l=!0,g.$watch("focalcoord",function(a,b){if((a!==b||l)&&null!=a)return l=!1,j()}),g.$on("$destroy",function(){return i()})}}(this))}}}])}.call(this),b.module("uiGmapgoogle-maps.wrapped").service("uiGmapuuid",function(){function a(){}return a.generate=function(){var b=a._gri,c=a._ha;return c(b(32),8)+"-"+c(b(16),4)+"-"+c(16384|b(12),4)+"-"+c(32768|b(14),4)+"-"+c(b(48),12)},a._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<>>=1,e+=e)1&d&&(c=e+c);return c},a}),b.module("uiGmapgoogle-maps.wrapped").service("uiGmapGoogleMapsUtilV3",function(){return{init:c.once(function(){+function(){function b(a,c){a.getMarkerClusterer().extend(b,google.maps.OverlayView),this.cluster_=a,this.className_=a.getMarkerClusterer().getClusterClass(),this.styles_=c,this.center_=null,this.div_=null,this.sums_=null,this.visible_=!1,this.setMap(a.getMap())}function c(a){this.markerClusterer_=a,this.map_=a.getMap(),this.gridSize_=a.getGridSize(),this.minClusterSize_=a.getMinimumClusterSize(),this.averageCenter_=a.getAverageCenter(),this.hideLabel_=a.getHideLabel(),this.markers_=[],this.center_=null,this.bounds_=null,this.clusterIcon_=new b(this,a.getStyles())}function e(a,b,c){this.extend(e,google.maps.OverlayView),b=b||[],c=c||{},this.markers_=[],this.clusters_=[],this.listeners_=[],this.activeMap_=null,this.ready_=!1,this.gridSize_=c.gridSize||60,this.minClusterSize_=c.minimumClusterSize||2,this.maxZoom_=c.maxZoom||null,this.styles_=c.styles||[],this.title_=c.title||"",this.zoomOnClick_=!0,void 0!==c.zoomOnClick&&(this.zoomOnClick_=c.zoomOnClick),this.averageCenter_=!1,void 0!==c.averageCenter&&(this.averageCenter_=c.averageCenter),this.ignoreHidden_=!1,void 0!==c.ignoreHidden&&(this.ignoreHidden_=c.ignoreHidden),this.enableRetinaIcons_=!1,void 0!==c.enableRetinaIcons&&(this.enableRetinaIcons_=c.enableRetinaIcons),this.hideLabel_=!1,void 0!==c.hideLabel&&(this.hideLabel_=c.hideLabel),this.imagePath_=c.imagePath||e.IMAGE_PATH,this.imageExtension_=c.imageExtension||e.IMAGE_EXTENSION,this.imageSizes_=c.imageSizes||e.IMAGE_SIZES,this.calculator_=c.calculator||e.CALCULATOR,this.batchSize_=c.batchSize||e.BATCH_SIZE,this.batchSizeIE_=c.batchSizeIE||e.BATCH_SIZE_IE,this.clusterClass_=c.clusterClass||"cluster",-1!==navigator.userAgent.toLowerCase().indexOf("msie")&&(this.batchSize_=this.batchSizeIE_),this.setupStyles_(),this.addMarkers(b,!0),this.setMap(a)}function f(a){a=a||{},google.maps.OverlayView.apply(this,arguments),this.content_=a.content||"",this.disableAutoPan_=a.disableAutoPan||!1,this.maxWidth_=a.maxWidth||0,this.pixelOffset_=a.pixelOffset||new google.maps.Size(0,0),this.position_=a.position||new google.maps.LatLng(0,0),this.zIndex_=a.zIndex||null,this.boxClass_=a.boxClass||"infoBox",this.boxStyle_=a.boxStyle||{},this.closeBoxMargin_=a.closeBoxMargin||"2px",this.closeBoxURL_=a.closeBoxURL||"http://www.google.com/intl/en_us/mapfiles/close.gif",""===a.closeBoxURL&&(this.closeBoxURL_=""),this.infoBoxClearance_=a.infoBoxClearance||new google.maps.Size(1,1),"undefined"==typeof a.visible&&("undefined"==typeof a.isHidden?a.visible=!0:a.visible=!a.isHidden),this.isHidden_=!a.visible,this.alignBottom_=a.alignBottom||!1,this.pane_=a.pane||"floatPane",this.enableEventPropagation_=a.enableEventPropagation||!1,this.div_=null,this.closeListener_=null,this.moveListener_=null,this.contextListener_=null,this.eventListeners_=null,this.fixedWidthSet_=null}function g(a,b){function c(){}c.prototype=b.prototype,a.superClass_=b.prototype,a.prototype=new c,a.prototype.constructor=a}function h(a,b,c){this.marker_=a,this.handCursorURL_=a.handCursorURL,this.labelDiv_=document.createElement("div"),this.labelDiv_.style.cssText="position: absolute; overflow: hidden;",this.eventDiv_=document.createElement("div"),this.eventDiv_.style.cssText=this.labelDiv_.style.cssText,this.eventDiv_.setAttribute("onselectstart","return false;"),this.eventDiv_.setAttribute("ondragstart","return false;"),this.crossDiv_=h.getSharedCross(b)}function i(a){a=a||{},a.labelContent=a.labelContent||"",a.labelAnchor=a.labelAnchor||new google.maps.Point(0,0),a.labelClass=a.labelClass||"markerLabels",a.labelStyle=a.labelStyle||{},a.labelInBackground=a.labelInBackground||!1,"undefined"==typeof a.labelVisible&&(a.labelVisible=!0),"undefined"==typeof a.raiseOnDrag&&(a.raiseOnDrag=!0),"undefined"==typeof a.clickable&&(a.clickable=!0),"undefined"==typeof a.draggable&&(a.draggable=!1),"undefined"==typeof a.optimized&&(a.optimized=!1),a.crossImage=a.crossImage||"http"+("https:"===document.location.protocol?"s":"")+"://maps.gstatic.com/intl/en_us/mapfiles/drag_cross_67_16.png",a.handCursor=a.handCursor||"http"+("https:"===document.location.protocol?"s":"")+"://maps.gstatic.com/intl/en_us/mapfiles/closedhand_8_8.cur",a.optimized=!1,this.label=new h(this,a.crossImage,a.handCursor),google.maps.Marker.apply(this,arguments)}function j(a){var b=a||{};this.ready_=!1,this.dragging_=!1,a.visible==d&&(a.visible=!0),a.shadow==d&&(a.shadow="7px -3px 5px rgba(88,88,88,0.7)"),a.anchor==d&&(a.anchor=k.BOTTOM),this.setValues(b)}b.prototype.onAdd=function(){var a,b,c=this;this.div_=document.createElement("div"),this.div_.className=this.className_,this.visible_&&this.show(),this.getPanes().overlayMouseTarget.appendChild(this.div_),this.boundsChangedListener_=google.maps.event.addListener(this.getMap(),"bounds_changed",function(){b=a}),google.maps.event.addDomListener(this.div_,"mousedown",function(){a=!0,b=!1}),google.maps.event.addDomListener(this.div_,"click",function(d){if(a=!1,!b){var e,f,g=c.cluster_.getMarkerClusterer();google.maps.event.trigger(g,"click",c.cluster_),google.maps.event.trigger(g,"clusterclick",c.cluster_),g.getZoomOnClick()&&(f=g.getMaxZoom(),e=c.cluster_.getBounds(),g.getMap().fitBounds(e),setTimeout(function(){g.getMap().fitBounds(e),null!==f&&g.getMap().getZoom()>f&&g.getMap().setZoom(f+1)},100)),d.cancelBubble=!0,d.stopPropagation&&d.stopPropagation()}}),google.maps.event.addDomListener(this.div_,"mouseover",function(){var a=c.cluster_.getMarkerClusterer();google.maps.event.trigger(a,"mouseover",c.cluster_)}),google.maps.event.addDomListener(this.div_,"mouseout",function(){var a=c.cluster_.getMarkerClusterer();google.maps.event.trigger(a,"mouseout",c.cluster_)})},b.prototype.onRemove=function(){this.div_&&this.div_.parentNode&&(this.hide(),google.maps.event.removeListener(this.boundsChangedListener_),google.maps.event.clearInstanceListeners(this.div_),this.div_.parentNode.removeChild(this.div_),this.div_=null)},b.prototype.draw=function(){if(this.visible_){var a=this.getPosFromLatLng_(this.center_);this.div_.style.top=a.y+"px",this.div_.style.left=a.x+"px"}},b.prototype.hide=function(){this.div_&&(this.div_.style.display="none"),this.visible_=!1},b.prototype.show=function(){if(this.div_){var a="",b=this.backgroundPosition_.split(" "),c=parseInt(b[0].trim(),10),d=parseInt(b[1].trim(),10),e=this.getPosFromLatLng_(this.center_);this.div_.style.cssText=this.createCss(e),a="",this.div_.innerHTML=a+"
"+(this.cluster_.hideLabel_?" ":this.sums_.text)+"
",this.div_.title="undefined"==typeof this.sums_.title||""===this.sums_.title?this.cluster_.getMarkerClusterer().getTitle():this.sums_.title,this.div_.style.display=""}this.visible_=!0},b.prototype.useStyle=function(a){this.sums_=a;var b=Math.max(0,a.index-1);b=Math.min(this.styles_.length-1,b);var c=this.styles_[b];this.url_=c.url,this.height_=c.height,this.width_=c.width,this.anchorText_=c.anchorText||[0,0],this.anchorIcon_=c.anchorIcon||[parseInt(this.height_/2,10),parseInt(this.width_/2,10)],this.textColor_=c.textColor||"black",this.textSize_=c.textSize||11,this.textDecoration_=c.textDecoration||"none",this.fontWeight_=c.fontWeight||"bold",this.fontStyle_=c.fontStyle||"normal",this.fontFamily_=c.fontFamily||"Arial,sans-serif",this.backgroundPosition_=c.backgroundPosition||"0 0"},b.prototype.setCenter=function(a){this.center_=a},b.prototype.createCss=function(a){var b=[];return b.push("cursor: pointer;"),b.push("position: absolute; top: "+a.y+"px; left: "+a.x+"px;"),b.push("width: "+this.width_+"px; height: "+this.height_+"px;"),b.join("")},b.prototype.getPosFromLatLng_=function(a){var b=this.getProjection().fromLatLngToDivPixel(a);return b.x-=this.anchorIcon_[1],b.y-=this.anchorIcon_[0],b.x=parseInt(b.x,10),b.y=parseInt(b.y,10),b},c.prototype.getSize=function(){return this.markers_.length},c.prototype.getMarkers=function(){return this.markers_},c.prototype.getCenter=function(){return this.center_},c.prototype.getMap=function(){return this.map_},c.prototype.getMarkerClusterer=function(){return this.markerClusterer_},c.prototype.getBounds=function(){var a,b=new google.maps.LatLngBounds(this.center_,this.center_),c=this.getMarkers();for(a=0;ad)a.getMap()!==this.map_&&a.setMap(this.map_);else if(cb;b++)this.markers_[b].setMap(null);else a.setMap(null);return!0},c.prototype.isMarkerInClusterBounds=function(a){return this.bounds_.contains(a.getPosition())},c.prototype.calculateBounds_=function(){var a=new google.maps.LatLngBounds(this.center_,this.center_);this.bounds_=this.markerClusterer_.getExtendedBounds(a)},c.prototype.updateIcon_=function(){var a=this.markers_.length,b=this.markerClusterer_.getMaxZoom();if(null!==b&&this.map_.getZoom()>b)return void this.clusterIcon_.hide();if(ab;b++)if(a===this.markers_[b])return!0;return!1},e.prototype.onAdd=function(){var a=this;this.activeMap_=this.getMap(),this.ready_=!0,this.repaint(),this.listeners_=[google.maps.event.addListener(this.getMap(),"zoom_changed",function(){a.resetViewport_(!1),(this.getZoom()===(this.get("minZoom")||0)||this.getZoom()===this.get("maxZoom"))&&google.maps.event.trigger(this,"idle")}),google.maps.event.addListener(this.getMap(),"idle",function(){a.redraw_()})]},e.prototype.onRemove=function(){var a;for(a=0;a0))for(a=0;ad&&(g=d,h=e));h&&h.isMarkerInClusterBounds(a)?h.addMarker(a):(e=new c(this),e.addMarker(a),this.clusters_.push(e))},e.prototype.createClusters_=function(a){var b,c,d,e=this;if(this.ready_){0===a&&(google.maps.event.trigger(this,"clusteringbegin",this),"undefined"!=typeof this.timerRefStatic&&(clearTimeout(this.timerRefStatic),delete this.timerRefStatic)),d=this.getMap().getZoom()>3?new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),this.getMap().getBounds().getNorthEast()):new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,-178.48388434375),new google.maps.LatLng(-85.08136444384544,178.00048865625));var f=this.getExtendedBounds(d),g=Math.min(a+this.batchSize_,this.markers_.length);for(b=a;g>b;b++)c=this.markers_[b],!c.isAdded&&this.isMarkerInBounds_(c,f)&&(!this.ignoreHidden_||this.ignoreHidden_&&c.getVisible())&&this.addToClosestCluster_(c);if(gthis.maxWidth_?(this.div_.style.width=this.maxWidth_,this.div_.style.overflow="auto",this.fixedWidthSet_=!0):(c=this.getBoxWidths_(),this.div_.style.width=this.div_.offsetWidth-c.left-c.right+"px",this.fixedWidthSet_=!1),this.panBox_(this.disableAutoPan_),!this.enableEventPropagation_){for(this.eventListeners_=[],b=["mousedown","mouseover","mouseout","mouseup","click","dblclick","touchstart","touchend","touchmove"],a=0;ag&&(d=o.x+k+i+m-g),this.alignBottom_?o.y<-j+n+l?e=o.y+j-n-l:o.y+j+n>h&&(e=o.y+j+n-h):o.y<-j+n?e=o.y+j-n:o.y+l+j+n>h&&(e=o.y+l+j+n-h),0!==d||0!==e){b.getCenter();b.panBy(d,e)}}},f.prototype.setBoxStyle_=function(){var a,b;if(this.div_){this.div_.className=this.boxClass_,this.div_.style.cssText="",b=this.boxStyle_;for(a in b)b.hasOwnProperty(a)&&(this.div_.style[a]=b[a]);this.div_.style.WebkitTransform="translateZ(0)","undefined"!=typeof this.div_.style.opacity&&""!==this.div_.style.opacity&&(this.div_.style.MsFilter='"progid:DXImageTransform.Microsoft.Alpha(Opacity='+100*this.div_.style.opacity+')"',this.div_.style.filter="alpha(opacity="+100*this.div_.style.opacity+")"),this.div_.style.position="absolute",this.div_.style.visibility="hidden",null!==this.zIndex_&&(this.div_.style.zIndex=this.zIndex_)}},f.prototype.getBoxWidths_=function(){var a,b={top:0,bottom:0,left:0,right:0},c=this.div_;return document.defaultView&&document.defaultView.getComputedStyle?(a=c.ownerDocument.defaultView.getComputedStyle(c,""), +a&&(b.top=parseInt(a.borderTopWidth,10)||0,b.bottom=parseInt(a.borderBottomWidth,10)||0,b.left=parseInt(a.borderLeftWidth,10)||0,b.right=parseInt(a.borderRightWidth,10)||0)):document.documentElement.currentStyle&&c.currentStyle&&(b.top=parseInt(c.currentStyle.borderTopWidth,10)||0,b.bottom=parseInt(c.currentStyle.borderBottomWidth,10)||0,b.left=parseInt(c.currentStyle.borderLeftWidth,10)||0,b.right=parseInt(c.currentStyle.borderRightWidth,10)||0),b},f.prototype.onRemove=function(){this.div_&&(this.div_.parentNode.removeChild(this.div_),this.div_=null)},f.prototype.draw=function(){this.createInfoBoxDiv_();var a=this.getProjection().fromLatLngToDivPixel(this.position_);this.div_.style.left=a.x+this.pixelOffset_.width+"px",this.alignBottom_?this.div_.style.bottom=-(a.y+this.pixelOffset_.height)+"px":this.div_.style.top=a.y+this.pixelOffset_.height+"px",this.isHidden_?this.div_.style.visibility="hidden":this.div_.style.visibility="visible"},f.prototype.setOptions=function(a){"undefined"!=typeof a.boxClass&&(this.boxClass_=a.boxClass,this.setBoxStyle_()),"undefined"!=typeof a.boxStyle&&(this.boxStyle_=a.boxStyle,this.setBoxStyle_()),"undefined"!=typeof a.content&&this.setContent(a.content),"undefined"!=typeof a.disableAutoPan&&(this.disableAutoPan_=a.disableAutoPan),"undefined"!=typeof a.maxWidth&&(this.maxWidth_=a.maxWidth),"undefined"!=typeof a.pixelOffset&&(this.pixelOffset_=a.pixelOffset),"undefined"!=typeof a.alignBottom&&(this.alignBottom_=a.alignBottom),"undefined"!=typeof a.position&&this.setPosition(a.position),"undefined"!=typeof a.zIndex&&this.setZIndex(a.zIndex),"undefined"!=typeof a.closeBoxMargin&&(this.closeBoxMargin_=a.closeBoxMargin),"undefined"!=typeof a.closeBoxURL&&(this.closeBoxURL_=a.closeBoxURL),"undefined"!=typeof a.infoBoxClearance&&(this.infoBoxClearance_=a.infoBoxClearance),"undefined"!=typeof a.isHidden&&(this.isHidden_=a.isHidden),"undefined"!=typeof a.visible&&(this.isHidden_=!a.visible),"undefined"!=typeof a.enableEventPropagation&&(this.enableEventPropagation_=a.enableEventPropagation),this.div_&&this.draw()},f.prototype.setContent=function(a){this.content_=a,this.div_&&(this.closeListener_&&(google.maps.event.removeListener(this.closeListener_),this.closeListener_=null),this.fixedWidthSet_||(this.div_.style.width=""),"undefined"==typeof a.nodeType?this.div_.innerHTML=this.getCloseBoxImg_()+a:(this.div_.innerHTML=this.getCloseBoxImg_(),this.div_.appendChild(a)),this.fixedWidthSet_||(this.div_.style.width=this.div_.offsetWidth+"px","undefined"==typeof a.nodeType?this.div_.innerHTML=this.getCloseBoxImg_()+a:(this.div_.innerHTML=this.getCloseBoxImg_(),this.div_.appendChild(a))),this.addClickHandler_()),google.maps.event.trigger(this,"content_changed")},f.prototype.setPosition=function(a){this.position_=a,this.div_&&this.draw(),google.maps.event.trigger(this,"position_changed")},f.prototype.setZIndex=function(a){this.zIndex_=a,this.div_&&(this.div_.style.zIndex=a),google.maps.event.trigger(this,"zindex_changed")},f.prototype.setVisible=function(a){this.isHidden_=!a,this.div_&&(this.div_.style.visibility=this.isHidden_?"hidden":"visible")},f.prototype.getContent=function(){return this.content_},f.prototype.getPosition=function(){return this.position_},f.prototype.getZIndex=function(){return this.zIndex_},f.prototype.getVisible=function(){var a;return a="undefined"!=typeof this.getMap()&&null!==this.getMap()&&!this.isHidden_},f.prototype.show=function(){this.isHidden_=!1,this.div_&&(this.div_.style.visibility="visible")},f.prototype.hide=function(){this.isHidden_=!0,this.div_&&(this.div_.style.visibility="hidden")},f.prototype.open=function(a,b){var c=this;b&&(this.position_=b.getPosition(),this.moveListener_=google.maps.event.addListener(b,"position_changed",function(){c.setPosition(this.getPosition())})),this.setMap(a),this.div_&&this.panBox_()},f.prototype.close=function(){var a;if(this.closeListener_&&(google.maps.event.removeListener(this.closeListener_),this.closeListener_=null),this.eventListeners_){for(a=0;ab.left&&a.leftb.top&&a.topg;b=0<=g?++f:--f)if(c[b]===e){h=[c[c.length-1],c[b]],c[b]=h[0],c[c.length-1]=h[1],c.pop();break}return c.concat(d)},a.prototype.forEachNode=function(a){var b,d,e;e=this._nodes;for(b in e)c.call(e,b)&&(d=e[b],a(d,b))},a.prototype.forEachEdge=function(a){var b,d,e,f,g,h;g=this._nodes;for(d in g)if(c.call(g,d)){e=g[d],h=e._outEdges;for(f in h)c.call(h,f)&&(b=h[f],a(b))}},a}(),a.exports=b}).call(this)},function(a,b){(function(){var b,c,d,e;b=function(){function a(a){var b,c,d,e,f,g;for(null==a&&(a=[]),this._data=[void 0],d=0,f=a.length;d1)for(b=e=2,g=this._data.length;2<=g?eg;b=2<=g?++e:--e)this._upHeap(b);this.size=this._data.length-1}return a.prototype.add=function(a){if(null!=a)return this._data.push(a),this._upHeap(this._data.length-1),this.size++,a},a.prototype.removeMin=function(){var a;if(1!==this._data.length)return this.size--,2===this._data.length?this._data.pop():(a=this._data[1],this._data[1]=this._data.pop(),this._downHeap(),a)},a.prototype.peekMin=function(){return this._data[1]},a.prototype._upHeap=function(a){var b,c;for(b=this._data[a];this._data[a]1;)c=[this._data[d(a)],this._data[a]],this._data[a]=c[0],this._data[d(a)]=c[1],a=d(a)},a.prototype._downHeap=function(){var a,b,d;for(a=1;c(a>1},c=function(a){return a<<1},e=function(a){return(a<<1)+1},a.exports=b}).call(this)},function(a,b){(function(){var b;b=function(){function a(a){var b,c,d;for(null==a&&(a=[]),this.head={prev:void 0,value:void 0,next:void 0},this.tail={prev:void 0,value:void 0,next:void 0},this.size=0,c=0,d=a.length;c=this.size)return-1;for(b=Math.max(0,this._adjust(b)),c=this.at(b),d=b;c&&c.value!==a;)c=c.next,d++;return d===this.size?-1:d},a.prototype._adjust=function(a){return a<0?this.size+a:a},a}(),a.exports=b}).call(this)},function(a,b){(function(){var b,c,d,e,f={}.hasOwnProperty;c="_mapId_",b=function(){function a(b){var c,d;this._content={},this._itemId=0,this._id=a._newMapId(),this.size=0;for(c in b)f.call(b,c)&&(d=b[c],this.set(c,d))}return a._mapIdTracker=0,a._newMapId=function(){return this._mapIdTracker++},a.prototype.hash=function(a,b){var f,g;return null==b&&(b=!1),g=d(a),e(a)?(f=c+this._id,b&&!a[f]&&(a[f]=this._itemId++),f+"_"+a[f]):g+"_"+a},a.prototype.set=function(a,b){return this.has(a)||this.size++,this._content[this.hash(a,!0)]=[b,a],b},a.prototype.get=function(a){var b;return null!=(b=this._content[this.hash(a)])?b[0]:void 0},a.prototype.has=function(a){return this.hash(a)in this._content},a.prototype.delete=function(a){var b;return b=this.hash(a),b in this._content&&(delete this._content[b],e(a)&&delete a[c+this._id],this.size--,!0)},a.prototype.forEach=function(a){var b,c,d;d=this._content;for(b in d)f.call(d,b)&&(c=d[b],a(c[1],c[0]))},a}(),e=function(a){var b,c,e,f,g;for(b=["Boolean","Number","String","Undefined","Null","RegExp","Function"],e=d(a),f=0,g=b.length;fthis._content.length&&(this._content=this._content.slice(this._dequeueIndex),this._dequeueIndex=0),a},a.prototype.peek=function(){return this._content[this._dequeueIndex]},a}(),a.exports=b}).call(this)},function(a,b){(function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;c=0,d=1,e=2,h=3,f=1,b=2,g=function(){function a(a){var b,c,d;for(null==a&&(a=[]),this._root,this.size=0,c=0,d=a.length;c=1)&&!f(g[c][1],1);c=k<=1?++i:--i)delete g[c-1][1][g[c][0]];return f(this._root[g[0][0]],1)||delete this._root[g[0][0]],a}}},a}(),f=function(a,b){var c,d;if(0===b)return!0;d=0;for(c in a)if(g.call(a,c)&&(d++,d>=b))return!0;return!1},a.exports=d}).call(this)}]),b.module("uiGmapgoogle-maps.wrapped").service("uiGmapMarkerSpiderfier",["uiGmapGoogleMapApi",function(b){var c=this;return+function(){var b={}.hasOwnProperty,c=[].slice;this.OverlappingMarkerSpiderfier=function(){function d(a,c){var d,f,g,h,i,j;this.map=a,null==c&&(c={});for(f in c)b.call(c,f)&&(j=c[f],this[f]=j);for(this.projHelper=new this.constructor.ProjHelper(this.map),this.initMarkerArrays(),this.listeners={},i=["click","zoom_changed","maptypeid_changed"],g=0,h=i.length;gj;g=0<=j?++h:--h)c=this.circleStartAngle+g*d,k.push(new f.Point(b.x+i*Math.cos(c),b.y+i*Math.sin(c)));return k},l.generatePtsSpiral=function(a,b){var c,d,e,g,h,i,j;for(g=this.spiralLengthStart,c=0,j=[],d=e=0,i=a;0<=i?ei;d=0<=i?++e:--e)c+=this.spiralFootSeparation/g+5e-4*d,h=new f.Point(b.x+g*Math.cos(c),b.y+g*Math.sin(c)),g+=n*this.spiralLengthFactor/c,j.push(h);return j},l.spiderListener=function(b,c){var d,e,f,g,h,i,j,k,m,n,o,p,q;if(k=null!=b._omsData,k&&this.keepSpiderfied||("mouseover"===this.event?(d=this,e=function(){return d.unspiderfy()},a.clearTimeout(l.timeout),l.timeout=setTimeout(e,3e3)):this.unspiderfy()),k||this.map.getStreetView().getVisible()||"GoogleEarthAPI"===this.map.getMapTypeId())return this.trigger("click",b,c);for(n=[],o=[],m=this.nearbyDistance,p=m*m,j=this.llToPt(b.position),q=this.markers,f=0,g=q.length;f=this.circleSpiralSwitchover?this.generatePtsSpiral(n,c).reverse():this.generatePtsCircle(n,c),o=function(){var b,c,l;for(l=[],b=0,c=h.length;bc?a.getMap()!==this.map_&&a.setMap(this.map_):b3?new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(),this.getMap().getBounds().getNorthEast()):new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472,-178.48388434375),new google.maps.LatLng(-85.08136444384544,178.00048865625));var f=this.getExtendedBounds(d),g=Math.min(a+this.batchSize_,this.markers_.length),h=this.markers_.values();for(b=a;b",this.div_.innerHTML=a+"
"+this.sums_.text+"
","undefined"==typeof this.sums_.title||""===this.sums_.title?this.div_.title=this.cluster_.getMarkerClusterer().getTitle():this.div_.title=this.sums_.title,this.div_.style.display=""}this.visible_=!0},b}(MarkerClusterer)}).call(this)})}}])}(window,angular,_); +//# sourceMappingURL=angular-google-maps-street-view_dev_mapped.min.js.map \ No newline at end of file diff --git a/dist/architecture/dot/all.dot b/dist/architecture/dot/all.dot new file mode 100644 index 000000000..abece9df2 --- /dev/null +++ b/dist/architecture/dot/all.dot @@ -0,0 +1,2036 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + node[shape="component"] + + "uiGmapgoogle-maps.providers"[label="uiGmapgoogle-maps.providers", color=1] + + "uiGmapgoogle-maps.wrapped"[label="uiGmapgoogle-maps.wrapped", color=1] + + "uiGmapgoogle-maps.extensions"[label="uiGmapgoogle-maps.extensions", color=1] + + "uiGmapgoogle-maps.directives.api.utils"[label="uiGmapgoogle-maps.directives.api.utils", color=1] + + "uiGmapgoogle-maps.directives.api.managers"[label="uiGmapgoogle-maps.directives.api.managers", color=1] + + "uiGmapgoogle-maps.directives.api.options"[label="uiGmapgoogle-maps.directives.api.options", color=1] + + "uiGmapgoogle-maps.directives.api.options.builders"[label="uiGmapgoogle-maps.directives.api.options.builders", color=1] + + "uiGmapgoogle-maps.directives.api.models.child"[label="uiGmapgoogle-maps.directives.api.models.child", color=1] + + "uiGmapgoogle-maps.directives.api.models.parent"[label="uiGmapgoogle-maps.directives.api.models.parent", color=1] + + "uiGmapgoogle-maps.directives.api"[label="uiGmapgoogle-maps.directives.api", color=1] + + "uiGmapgoogle-maps"[label="uiGmapgoogle-maps", color=1] + + + + + "uiGmapgoogle-maps.providers" -> "nemLogging" + + + + + + "uiGmapgoogle-maps.extensions" -> "uiGmapgoogle-maps.wrapped" + + "uiGmapgoogle-maps.extensions" -> "uiGmapgoogle-maps.providers" + + + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapgoogle-maps.extensions" + + + + + + "uiGmapgoogle-maps.directives.api.options" -> "uiGmapgoogle-maps.directives.api.utils" + + + + + + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapgoogle-maps.directives.api.utils" + + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapgoogle-maps.directives.api.options" + + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapgoogle-maps.directives.api.options.builders" + + + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapgoogle-maps.directives.api.managers" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapgoogle-maps.directives.api.models.child" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapgoogle-maps.providers" + + + + "uiGmapgoogle-maps.directives.api" -> "uiGmapgoogle-maps.directives.api.models.parent" + + + + "uiGmapgoogle-maps" -> "uiGmapgoogle-maps.directives.api" + + "uiGmapgoogle-maps" -> "uiGmapgoogle-maps.providers" + + + + node[shape="ellipse"] + + + + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi", color=2] + + + + + + "uiGmapGoogleMapApiManualLoader"[label="uiGmapGoogleMapApiManualLoader", color=5] + + + + "uiGmapMapScriptLoader"[label="uiGmapMapScriptLoader", color=6] + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + "uiGmapgoogle-maps.providers" -> "uiGmapGoogleMapApi" + + + + + + + + "uiGmapgoogle-maps.providers" -> "uiGmapGoogleMapApiManualLoader" + + + + "uiGmapgoogle-maps.providers" -> "uiGmapMapScriptLoader" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + + + "uiGmapMapScriptLoader"[label="uiGmapMapScriptLoader"] + "uiGmapMapScriptLoader" -> "uiGmapGoogleMapApiManualLoader" + + + + + + "uiGmapuuid"[label="uiGmapuuid"] + "uiGmapuuid" -> "uiGmapMapScriptLoader" + + + + + + + + + + + + "uiGmapuuid"[label="uiGmapuuid", color=5] + + "uiGmapGoogleMapsUtilV3"[label="uiGmapGoogleMapsUtilV3", color=5] + + "uiGmapDataStructures"[label="uiGmapDataStructures", color=5] + + "uiGmapMarkerSpiderfier"[label="uiGmapMarkerSpiderfier", color=5] + + + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + "uiGmapgoogle-maps.wrapped" -> "uiGmapuuid" + + "uiGmapgoogle-maps.wrapped" -> "uiGmapGoogleMapsUtilV3" + + "uiGmapgoogle-maps.wrapped" -> "uiGmapDataStructures" + + "uiGmapgoogle-maps.wrapped" -> "uiGmapMarkerSpiderfier" + + + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + + + + + + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapMarkerSpiderfier" + + + + + + + + + + + + + + "uiGmapExtendGWin"[label="uiGmapExtendGWin", color=5] + + "uiGmapLodash"[label="uiGmapLodash", color=5] + + "uiGmapExtendMarkerClusterer"[label="uiGmapExtendMarkerClusterer", color=5] + + + + "uiGmapString"[label="uiGmapString", color=6] + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + "uiGmapgoogle-maps.extensions" -> "uiGmapExtendGWin" + + "uiGmapgoogle-maps.extensions" -> "uiGmapLodash" + + "uiGmapgoogle-maps.extensions" -> "uiGmapExtendMarkerClusterer" + + + + "uiGmapgoogle-maps.extensions" -> "uiGmapString" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + + + + + "uiGmapLodash"[label="uiGmapLodash"] + "uiGmapLodash" -> "uiGmapExtendMarkerClusterer" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapExtendMarkerClusterer" + + + + + + + + + + + + + + + + "uiGmap_sync"[label="uiGmap_sync", color=5] + + "uiGmap_async"[label="uiGmap_async", color=5] + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle", color=5] + + "uiGmapEventsHelper"[label="uiGmapEventsHelper", color=5] + + "uiGmapFitHelper"[label="uiGmapFitHelper", color=5] + + "uiGmapGmapUtil"[label="uiGmapGmapUtil", color=5] + + "uiGmapIsReady"[label="uiGmapIsReady", color=5] + + "uiGmapLogger"[label="uiGmapLogger", color=5] + + "uiGmapPromise"[label="uiGmapPromise", color=5] + + + + "uiGmapBaseObject"[label="uiGmapBaseObject", color=6] + + "uiGmapChildEvents"[label="uiGmapChildEvents", color=6] + + "uiGmapLinked"[label="uiGmapLinked", color=6] + + "uiGmapModelKey"[label="uiGmapModelKey", color=6] + + "uiGmapModelsWatcher"[label="uiGmapModelsWatcher", color=6] + + "uiGmapPropMap"[label="uiGmapPropMap", color=6] + + "uiGmapPropertyAction"[label="uiGmapPropertyAction", color=6] + + "uiGmapChromeFixes"[label="uiGmapChromeFixes", color=6] + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmap_sync" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmap_async" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapCtrlHandle" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapEventsHelper" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapFitHelper" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapGmapUtil" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapIsReady" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapLogger" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapPromise" + + + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapBaseObject" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapChildEvents" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapLinked" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapModelKey" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapModelsWatcher" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapPropMap" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapPropertyAction" + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapChromeFixes" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmap_async" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmap_async" + + "uiGmapDataStructures"[label="uiGmapDataStructures"] + "uiGmapDataStructures" -> "uiGmap_async" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmap_async" + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapEventsHelper" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapFitHelper" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapGmapUtil" + + + + + + "nemSimpleLogger"[label="nemSimpleLogger"] + "nemSimpleLogger" -> "uiGmapLogger" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapPromise" + + + + + + + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapLinked" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapModelKey" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapModelKey" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapModelsWatcher" + + "uiGmap_async"[label="uiGmap_async"] + "uiGmap_async" -> "uiGmapModelsWatcher" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapModelsWatcher" + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapPropertyAction" + + + + + + + + + + + + + + "uiGmapGoogleMapObjectManager"[label="uiGmapGoogleMapObjectManager", color=5] + + + + "uiGmapClustererMarkerManager"[label="uiGmapClustererMarkerManager", color=6] + + "uiGmapMarkerManager"[label="uiGmapMarkerManager", color=6] + + "uiGmapSpiderfierMarkerManager"[label="uiGmapSpiderfierMarkerManager", color=6] + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapGoogleMapObjectManager" + + + + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapClustererMarkerManager" + + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapMarkerManager" + + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapSpiderfierMarkerManager" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapClustererMarkerManager" + + "uiGmapFitHelper"[label="uiGmapFitHelper"] + "uiGmapFitHelper" -> "uiGmapClustererMarkerManager" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapClustererMarkerManager" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapClustererMarkerManager" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkerManager" + + "uiGmapFitHelper"[label="uiGmapFitHelper"] + "uiGmapFitHelper" -> "uiGmapMarkerManager" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapMarkerManager" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapSpiderfierMarkerManager" + + "uiGmapFitHelper"[label="uiGmapFitHelper"] + "uiGmapFitHelper" -> "uiGmapSpiderfierMarkerManager" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapSpiderfierMarkerManager" + + "uiGmapMarkerSpiderfier"[label="uiGmapMarkerSpiderfier"] + "uiGmapMarkerSpiderfier" -> "uiGmapSpiderfierMarkerManager" + + + + + + + + + + + + "uiGmapMarkerOptions"[label="uiGmapMarkerOptions", color=5] + + + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + "uiGmapgoogle-maps.directives.api.options" -> "uiGmapMarkerOptions" + + + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkerOptions" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapMarkerOptions" + + + + + + + + + + + + + + "uiGmapCommonOptionsBuilder"[label="uiGmapCommonOptionsBuilder", color=5] + + + + "uiGmapPolylineOptionsBuilder"[label="uiGmapPolylineOptionsBuilder", color=6] + + "uiGmapShapeOptionsBuilder"[label="uiGmapShapeOptionsBuilder", color=6] + + "uiGmapPolygonOptionsBuilder"[label="uiGmapPolygonOptionsBuilder", color=6] + + "uiGmapRectangleOptionsBuilder"[label="uiGmapRectangleOptionsBuilder", color=6] + + "uiGmapCircleOptionsBuilder"[label="uiGmapCircleOptionsBuilder", color=6] + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapCommonOptionsBuilder" + + + + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapPolylineOptionsBuilder" + + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapShapeOptionsBuilder" + + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapPolygonOptionsBuilder" + + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapRectangleOptionsBuilder" + + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapCircleOptionsBuilder" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapCommonOptionsBuilder" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapCommonOptionsBuilder" + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapCommonOptionsBuilder" + + + + + + "uiGmapCommonOptionsBuilder"[label="uiGmapCommonOptionsBuilder"] + "uiGmapCommonOptionsBuilder" -> "uiGmapPolylineOptionsBuilder" + + + + "uiGmapCommonOptionsBuilder"[label="uiGmapCommonOptionsBuilder"] + "uiGmapCommonOptionsBuilder" -> "uiGmapShapeOptionsBuilder" + + + + "uiGmapShapeOptionsBuilder"[label="uiGmapShapeOptionsBuilder"] + "uiGmapShapeOptionsBuilder" -> "uiGmapPolygonOptionsBuilder" + + + + "uiGmapShapeOptionsBuilder"[label="uiGmapShapeOptionsBuilder"] + "uiGmapShapeOptionsBuilder" -> "uiGmapRectangleOptionsBuilder" + + + + "uiGmapShapeOptionsBuilder"[label="uiGmapShapeOptionsBuilder"] + "uiGmapShapeOptionsBuilder" -> "uiGmapCircleOptionsBuilder" + + + + + + + + + + + + + + "uiGmapDrawFreeHandChildModel"[label="uiGmapDrawFreeHandChildModel", color=6] + + "uiGmapMarkerChildModel"[label="uiGmapMarkerChildModel", color=6] + + "uiGmapWindowChildModel"[label="uiGmapWindowChildModel", color=6] + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + + + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapDrawFreeHandChildModel" + + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapMarkerChildModel" + + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapWindowChildModel" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapDrawFreeHandChildModel" + + + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapMarkerChildModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapMarkerChildModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkerChildModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapMarkerChildModel" + + "uiGmapPropertyAction"[label="uiGmapPropertyAction"] + "uiGmapPropertyAction" -> "uiGmapMarkerChildModel" + + "uiGmapMarkerOptions"[label="uiGmapMarkerOptions"] + "uiGmapMarkerOptions" -> "uiGmapMarkerChildModel" + + "uiGmapIMarker"[label="uiGmapIMarker"] + "uiGmapIMarker" -> "uiGmapMarkerChildModel" + + "uiGmapMarkerManager"[label="uiGmapMarkerManager"] + "uiGmapMarkerManager" -> "uiGmapMarkerChildModel" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapMarkerChildModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapWindowChildModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapWindowChildModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapWindowChildModel" + + "uiGmapChromeFixes"[label="uiGmapChromeFixes"] + "uiGmapChromeFixes" -> "uiGmapWindowChildModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapWindowChildModel" + + + + + + + + + + + + + + "uiGmapBasePolysParentModel"[label="uiGmapBasePolysParentModel", color=6] + + "uiGmapCircleParentModel"[label="uiGmapCircleParentModel", color=6] + + "uiGmapDrawingManagerParentModel"[label="uiGmapDrawingManagerParentModel", color=6] + + "uiGmapIMarkerParentModel"[label="uiGmapIMarkerParentModel", color=6] + + "uiGmapIWindowParentModel"[label="uiGmapIWindowParentModel", color=6] + + "uiGmapLayerParentModel"[label="uiGmapLayerParentModel", color=6] + + "uiGmapMapTypeParentModel"[label="uiGmapMapTypeParentModel", color=6] + + "uiGmapMapTypesParentModel"[label="uiGmapMapTypesParentModel", color=6] + + "uiGmapMarkersParentModel"[label="uiGmapMarkersParentModel", color=6] + + "uiGmapPolygonsParentModel"[label="uiGmapPolygonsParentModel", color=6] + + "uiGmapPolylinesParentModel"[label="uiGmapPolylinesParentModel", color=6] + + "uiGmapRectangleParentModel"[label="uiGmapRectangleParentModel", color=6] + + "uiGmapSearchBoxParentModel"[label="uiGmapSearchBoxParentModel", color=6] + + "uiGmapWindowsParentModel"[label="uiGmapWindowsParentModel", color=6] + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapBasePolysParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapCircleParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapDrawingManagerParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapIMarkerParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapIWindowParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapLayerParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapMapTypeParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapMapTypesParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapMarkersParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapPolygonsParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapPolylinesParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapRectangleParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapSearchBoxParentModel" + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapWindowsParentModel" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapBasePolysParentModel" + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapBasePolysParentModel" + + "uiGmapModelsWatcher"[label="uiGmapModelsWatcher"] + "uiGmapModelsWatcher" -> "uiGmapBasePolysParentModel" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapBasePolysParentModel" + + "uiGmap_async"[label="uiGmap_async"] + "uiGmap_async" -> "uiGmapBasePolysParentModel" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapBasePolysParentModel" + + "uiGmapFitHelper"[label="uiGmapFitHelper"] + "uiGmapFitHelper" -> "uiGmapBasePolysParentModel" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapCircleParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapCircleParentModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapCircleParentModel" + + "uiGmapCircleOptionsBuilder"[label="uiGmapCircleOptionsBuilder"] + "uiGmapCircleOptionsBuilder" -> "uiGmapCircleParentModel" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapDrawingManagerParentModel" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapDrawingManagerParentModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapDrawingManagerParentModel" + + + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapIMarkerParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIMarkerParentModel" + + + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapIWindowParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapIWindowParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIWindowParentModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapLayerParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapLayerParentModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapMapTypeParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMapTypeParentModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapMapTypesParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMapTypesParentModel" + + "uiGmapMapTypeParentModel"[label="uiGmapMapTypeParentModel"] + "uiGmapMapTypeParentModel" -> "uiGmapMapTypesParentModel" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapMapTypesParentModel" + + + + "uiGmapIMarkerParentModel"[label="uiGmapIMarkerParentModel"] + "uiGmapIMarkerParentModel" -> "uiGmapMarkersParentModel" + + "uiGmapModelsWatcher"[label="uiGmapModelsWatcher"] + "uiGmapModelsWatcher" -> "uiGmapMarkersParentModel" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapMarkersParentModel" + + "uiGmapMarkerChildModel"[label="uiGmapMarkerChildModel"] + "uiGmapMarkerChildModel" -> "uiGmapMarkersParentModel" + + "uiGmap_async"[label="uiGmap_async"] + "uiGmap_async" -> "uiGmapMarkersParentModel" + + "uiGmapClustererMarkerManager"[label="uiGmapClustererMarkerManager"] + "uiGmapClustererMarkerManager" -> "uiGmapMarkersParentModel" + + "uiGmapMarkerManager"[label="uiGmapMarkerManager"] + "uiGmapMarkerManager" -> "uiGmapMarkersParentModel" + + "uiGmapIMarker"[label="uiGmapIMarker"] + "uiGmapIMarker" -> "uiGmapMarkersParentModel" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapMarkersParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapMarkersParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkersParentModel" + + "uiGmapSpiderfierMarkerManager"[label="uiGmapSpiderfierMarkerManager"] + "uiGmapSpiderfierMarkerManager" -> "uiGmapMarkersParentModel" + + + + "uiGmapBasePolysParentModel"[label="uiGmapBasePolysParentModel"] + "uiGmapBasePolysParentModel" -> "uiGmapPolygonsParentModel" + + "uiGmapPolygonChildModel"[label="uiGmapPolygonChildModel"] + "uiGmapPolygonChildModel" -> "uiGmapPolygonsParentModel" + + "uiGmapIPolygon"[label="uiGmapIPolygon"] + "uiGmapIPolygon" -> "uiGmapPolygonsParentModel" + + + + "uiGmapBasePolysParentModel"[label="uiGmapBasePolysParentModel"] + "uiGmapBasePolysParentModel" -> "uiGmapPolylinesParentModel" + + "uiGmapPolylineChildModel"[label="uiGmapPolylineChildModel"] + "uiGmapPolylineChildModel" -> "uiGmapPolylinesParentModel" + + "uiGmapIPolyline"[label="uiGmapIPolyline"] + "uiGmapIPolyline" -> "uiGmapPolylinesParentModel" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapRectangleParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapRectangleParentModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapRectangleParentModel" + + "uiGmapRectangleOptionsBuilder"[label="uiGmapRectangleOptionsBuilder"] + "uiGmapRectangleOptionsBuilder" -> "uiGmapRectangleParentModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapSearchBoxParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapSearchBoxParentModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapSearchBoxParentModel" + + + + "uiGmapIWindowParentModel"[label="uiGmapIWindowParentModel"] + "uiGmapIWindowParentModel" -> "uiGmapWindowsParentModel" + + "uiGmapModelsWatcher"[label="uiGmapModelsWatcher"] + "uiGmapModelsWatcher" -> "uiGmapWindowsParentModel" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapWindowsParentModel" + + "uiGmapWindowChildModel"[label="uiGmapWindowChildModel"] + "uiGmapWindowChildModel" -> "uiGmapWindowsParentModel" + + "uiGmapLinked"[label="uiGmapLinked"] + "uiGmapLinked" -> "uiGmapWindowsParentModel" + + "uiGmap_async"[label="uiGmap_async"] + "uiGmap_async" -> "uiGmapWindowsParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapWindowsParentModel" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapWindowsParentModel" + + "uiGmapIWindow"[label="uiGmapIWindow"] + "uiGmapIWindow" -> "uiGmapWindowsParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapWindowsParentModel" + + + + + + + + + + + + "uiGmapDragZoom"[label="uiGmapDragZoom", color=5] + + "uiGmapICircle"[label="uiGmapICircle", color=5] + + "uiGmapIDrawingManager"[label="uiGmapIDrawingManager", color=5] + + "uiGmapIRectangle"[label="uiGmapIRectangle", color=5] + + "uiGmapPlural"[label="uiGmapPlural", color=5] + + + + "uiGmapBasePolyChildModel"[label="uiGmapBasePolyChildModel", color=6] + + "uiGmapPolygonChildModel"[label="uiGmapPolygonChildModel", color=6] + + "uiGmapPolylineChildModel"[label="uiGmapPolylineChildModel", color=6] + + "uiGmapCircle"[label="uiGmapCircle", color=6] + + "uiGmapControl"[label="uiGmapControl", color=6] + + "uiGmapDrawingManager"[label="uiGmapDrawingManager", color=6] + + "uiGmapApiFreeDrawPolygons"[label="uiGmapApiFreeDrawPolygons", color=6] + + "uiGmapIControl"[label="uiGmapIControl", color=6] + + "uiGmapIMarker"[label="uiGmapIMarker", color=6] + + "uiGmapIPolygon"[label="uiGmapIPolygon", color=6] + + "uiGmapIPolyline"[label="uiGmapIPolyline", color=6] + + "uiGmapIWindow"[label="uiGmapIWindow", color=6] + + "uiGmapMap"[label="uiGmapMap", color=6] + + "uiGmapMarker"[label="uiGmapMarker", color=6] + + "uiGmapMarkers"[label="uiGmapMarkers", color=6] + + "uiGmapPolygon"[label="uiGmapPolygon", color=6] + + "uiGmapPolygons"[label="uiGmapPolygons", color=6] + + "uiGmapPolyline"[label="uiGmapPolyline", color=6] + + "uiGmapPolylines"[label="uiGmapPolylines", color=6] + + "uiGmapRectangle"[label="uiGmapRectangle", color=6] + + "uiGmapWindow"[label="uiGmapWindow", color=6] + + "uiGmapWindows"[label="uiGmapWindows", color=6] + + + + node[shape="cds"] + + + + + + + + + + node[shape="ellipse"] + + + + + + + + "uiGmapgoogle-maps.directives.api" -> "uiGmapDragZoom" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapICircle" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapIDrawingManager" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapIRectangle" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapPlural" + + + + "uiGmapgoogle-maps.directives.api" -> "uiGmapBasePolyChildModel" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolygonChildModel" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolylineChildModel" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapCircle" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapControl" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapDrawingManager" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapIControl" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapIMarker" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapIPolygon" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapIPolyline" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapIWindow" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapMap" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapMarker" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapMarkers" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolygon" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolygons" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolyline" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolylines" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapRectangle" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapWindow" + + "uiGmapgoogle-maps.directives.api" -> "uiGmapWindows" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + + + + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapDragZoom" + + "uiGmapPropertyAction"[label="uiGmapPropertyAction"] + "uiGmapPropertyAction" -> "uiGmapDragZoom" + + + + + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapBasePolyChildModel" + + "uiGmaparray-sync"[label="uiGmaparray-sync"] + "uiGmaparray-sync" -> "uiGmapBasePolyChildModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapBasePolyChildModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapBasePolyChildModel" + + + + "uiGmapBasePolyChildModel"[label="uiGmapBasePolyChildModel"] + "uiGmapBasePolyChildModel" -> "uiGmapPolygonChildModel" + + "uiGmapPolygonOptionsBuilder"[label="uiGmapPolygonOptionsBuilder"] + "uiGmapPolygonOptionsBuilder" -> "uiGmapPolygonChildModel" + + + + "uiGmapBasePolyChildModel"[label="uiGmapBasePolyChildModel"] + "uiGmapBasePolyChildModel" -> "uiGmapPolylineChildModel" + + "uiGmapPolylineOptionsBuilder"[label="uiGmapPolylineOptionsBuilder"] + "uiGmapPolylineOptionsBuilder" -> "uiGmapPolylineChildModel" + + + + "uiGmapICircle"[label="uiGmapICircle"] + "uiGmapICircle" -> "uiGmapCircle" + + "uiGmapCircleParentModel"[label="uiGmapCircleParentModel"] + "uiGmapCircleParentModel" -> "uiGmapCircle" + + + + "uiGmapIControl"[label="uiGmapIControl"] + "uiGmapIControl" -> "uiGmapControl" + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapControl" + + + + "uiGmapIDrawingManager"[label="uiGmapIDrawingManager"] + "uiGmapIDrawingManager" -> "uiGmapDrawingManager" + + "uiGmapDrawingManagerParentModel"[label="uiGmapDrawingManagerParentModel"] + "uiGmapDrawingManagerParentModel" -> "uiGmapDrawingManager" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapDrawFreeHandChildModel"[label="uiGmapDrawFreeHandChildModel"] + "uiGmapDrawFreeHandChildModel" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapLodash"[label="uiGmapLodash"] + "uiGmapLodash" -> "uiGmapApiFreeDrawPolygons" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIControl" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIControl" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIControl" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIMarker" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIMarker" + + + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapIPolygon" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIPolygon" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIPolygon" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIPolygon" + + + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapIPolyline" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIPolyline" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIPolyline" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIPolyline" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIWindow" + + "uiGmapChildEvents"[label="uiGmapChildEvents"] + "uiGmapChildEvents" -> "uiGmapIWindow" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIWindow" + + + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapMap" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapMap" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapMap" + + "uiGmapIsReady"[label="uiGmapIsReady"] + "uiGmapIsReady" -> "uiGmapMap" + + "uiGmapuuid"[label="uiGmapuuid"] + "uiGmapuuid" -> "uiGmapMap" + + "uiGmapExtendGWin"[label="uiGmapExtendGWin"] + "uiGmapExtendGWin" -> "uiGmapMap" + + "uiGmapExtendMarkerClusterer"[label="uiGmapExtendMarkerClusterer"] + "uiGmapExtendMarkerClusterer" -> "uiGmapMap" + + "uiGmapGoogleMapsUtilV3"[label="uiGmapGoogleMapsUtilV3"] + "uiGmapGoogleMapsUtilV3" -> "uiGmapMap" + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapMap" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapMap" + + "uiGmapGoogleMapObjectManager"[label="uiGmapGoogleMapObjectManager"] + "uiGmapGoogleMapObjectManager" -> "uiGmapMap" + + + + "uiGmapIMarker"[label="uiGmapIMarker"] + "uiGmapIMarker" -> "uiGmapMarker" + + "uiGmapMarkerChildModel"[label="uiGmapMarkerChildModel"] + "uiGmapMarkerChildModel" -> "uiGmapMarker" + + "uiGmapMarkerManager"[label="uiGmapMarkerManager"] + "uiGmapMarkerManager" -> "uiGmapMarker" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarker" + + + + "uiGmapIMarker"[label="uiGmapIMarker"] + "uiGmapIMarker" -> "uiGmapMarkers" + + "uiGmapPlural"[label="uiGmapPlural"] + "uiGmapPlural" -> "uiGmapMarkers" + + "uiGmapMarkersParentModel"[label="uiGmapMarkersParentModel"] + "uiGmapMarkersParentModel" -> "uiGmapMarkers" + + "uiGmap_sync"[label="uiGmap_sync"] + "uiGmap_sync" -> "uiGmapMarkers" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkers" + + + + "uiGmapIPolygon"[label="uiGmapIPolygon"] + "uiGmapIPolygon" -> "uiGmapPolygon" + + "uiGmapPolygonChildModel"[label="uiGmapPolygonChildModel"] + "uiGmapPolygonChildModel" -> "uiGmapPolygon" + + + + "uiGmapIPolygon"[label="uiGmapIPolygon"] + "uiGmapIPolygon" -> "uiGmapPolygons" + + "uiGmapPolygonsParentModel"[label="uiGmapPolygonsParentModel"] + "uiGmapPolygonsParentModel" -> "uiGmapPolygons" + + "uiGmapPlural"[label="uiGmapPlural"] + "uiGmapPlural" -> "uiGmapPolygons" + + + + "uiGmapIPolyline"[label="uiGmapIPolyline"] + "uiGmapIPolyline" -> "uiGmapPolyline" + + "uiGmapPolylineChildModel"[label="uiGmapPolylineChildModel"] + "uiGmapPolylineChildModel" -> "uiGmapPolyline" + + + + "uiGmapIPolyline"[label="uiGmapIPolyline"] + "uiGmapIPolyline" -> "uiGmapPolylines" + + "uiGmapPolylinesParentModel"[label="uiGmapPolylinesParentModel"] + "uiGmapPolylinesParentModel" -> "uiGmapPolylines" + + "uiGmapPlural"[label="uiGmapPlural"] + "uiGmapPlural" -> "uiGmapPolylines" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapRectangle" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapRectangle" + + "uiGmapIRectangle"[label="uiGmapIRectangle"] + "uiGmapIRectangle" -> "uiGmapRectangle" + + "uiGmapRectangleParentModel"[label="uiGmapRectangleParentModel"] + "uiGmapRectangleParentModel" -> "uiGmapRectangle" + + + + "uiGmapIWindow"[label="uiGmapIWindow"] + "uiGmapIWindow" -> "uiGmapWindow" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapWindow" + + "uiGmapWindowChildModel"[label="uiGmapWindowChildModel"] + "uiGmapWindowChildModel" -> "uiGmapWindow" + + "uiGmapLodash"[label="uiGmapLodash"] + "uiGmapLodash" -> "uiGmapWindow" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapWindow" + + + + "uiGmapIWindow"[label="uiGmapIWindow"] + "uiGmapIWindow" -> "uiGmapWindows" + + "uiGmapPlural"[label="uiGmapPlural"] + "uiGmapPlural" -> "uiGmapWindows" + + "uiGmapWindowsParentModel"[label="uiGmapWindowsParentModel"] + "uiGmapWindowsParentModel" -> "uiGmapWindows" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapWindows" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapWindows" + + + + + + + + + + + + "uiGmapObjectIterators"[label="uiGmapObjectIterators", color=5] + + + + "uiGmapadd-events"[label="uiGmapadd-events", color=6] + + "uiGmaparray-sync"[label="uiGmaparray-sync", color=6] + + + + node[shape="cds"] + + + + + "uiGmapGoogleMap"[label="uiGmapGoogleMap", color=3] + + "uiGmapMarker"[label="uiGmapMarker", color=3] + + "uiGmapMarkers"[label="uiGmapMarkers", color=3] + + "uiGmapPolygon"[label="uiGmapPolygon", color=3] + + "uiGmapCircle"[label="uiGmapCircle", color=3] + + "uiGmapPolyline"[label="uiGmapPolyline", color=3] + + "uiGmapPolylines"[label="uiGmapPolylines", color=3] + + "uiGmapRectangle"[label="uiGmapRectangle", color=3] + + "uiGmapWindow"[label="uiGmapWindow", color=3] + + "uiGmapWindows"[label="uiGmapWindows", color=3] + + "uiGmapLayer"[label="uiGmapLayer", color=3] + + "uiGmapMapControl"[label="uiGmapMapControl", color=3] + + "uiGmapDragZoom"[label="uiGmapDragZoom", color=3] + + "uiGmapDrawingManager"[label="uiGmapDrawingManager", color=3] + + "uiGmapFreeDrawPolygons"[label="uiGmapFreeDrawPolygons", color=3] + + "uiGmapMapType"[label="uiGmapMapType", color=3] + + "uiGmapMapTypes"[label="uiGmapMapTypes", color=3] + + "uiGmapPolygons"[label="uiGmapPolygons", color=3] + + "uiGmapSearchBox"[label="uiGmapSearchBox", color=3] + + "uiGmapShow"[label="uiGmapShow", color=3] + + "uiGmapStreetViewPanorama"[label="uiGmapStreetViewPanorama", color=3] + + + + + + + node[shape="ellipse"] + + + + "uiGmapgoogle-maps" -> "uiGmapGoogleMap" + + "uiGmapgoogle-maps" -> "uiGmapMarker" + + "uiGmapgoogle-maps" -> "uiGmapMarkers" + + "uiGmapgoogle-maps" -> "uiGmapPolygon" + + "uiGmapgoogle-maps" -> "uiGmapCircle" + + "uiGmapgoogle-maps" -> "uiGmapPolyline" + + "uiGmapgoogle-maps" -> "uiGmapPolylines" + + "uiGmapgoogle-maps" -> "uiGmapRectangle" + + "uiGmapgoogle-maps" -> "uiGmapWindow" + + "uiGmapgoogle-maps" -> "uiGmapWindows" + + "uiGmapgoogle-maps" -> "uiGmapLayer" + + "uiGmapgoogle-maps" -> "uiGmapMapControl" + + "uiGmapgoogle-maps" -> "uiGmapDragZoom" + + "uiGmapgoogle-maps" -> "uiGmapDrawingManager" + + "uiGmapgoogle-maps" -> "uiGmapFreeDrawPolygons" + + "uiGmapgoogle-maps" -> "uiGmapMapType" + + "uiGmapgoogle-maps" -> "uiGmapMapTypes" + + "uiGmapgoogle-maps" -> "uiGmapPolygons" + + "uiGmapgoogle-maps" -> "uiGmapSearchBox" + + "uiGmapgoogle-maps" -> "uiGmapShow" + + "uiGmapgoogle-maps" -> "uiGmapStreetViewPanorama" + + + + + + "uiGmapgoogle-maps" -> "uiGmapObjectIterators" + + + + "uiGmapgoogle-maps" -> "uiGmapadd-events" + + "uiGmapgoogle-maps" -> "uiGmaparray-sync" + + + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=8] + + + + + "uiGmapMap"[label="uiGmapMap"] + "uiGmapMap" -> "uiGmapGoogleMap" + + + + "uiGmapMarker"[label="uiGmapMarker"] + "uiGmapMarker" -> "uiGmapMarker" + + + + "uiGmapMarkers"[label="uiGmapMarkers"] + "uiGmapMarkers" -> "uiGmapMarkers" + + + + "uiGmapPolygon"[label="uiGmapPolygon"] + "uiGmapPolygon" -> "uiGmapPolygon" + + + + "uiGmapCircle"[label="uiGmapCircle"] + "uiGmapCircle" -> "uiGmapCircle" + + + + "uiGmapPolyline"[label="uiGmapPolyline"] + "uiGmapPolyline" -> "uiGmapPolyline" + + + + "uiGmapPolylines"[label="uiGmapPolylines"] + "uiGmapPolylines" -> "uiGmapPolylines" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapRectangle" + + "uiGmapRectangle"[label="uiGmapRectangle"] + "uiGmapRectangle" -> "uiGmapRectangle" + + + + "uiGmapWindow"[label="uiGmapWindow"] + "uiGmapWindow" -> "uiGmapWindow" + + + + "uiGmapWindows"[label="uiGmapWindows"] + "uiGmapWindows" -> "uiGmapWindows" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapLayer" + + "uiGmapLayerParentModel"[label="uiGmapLayerParentModel"] + "uiGmapLayerParentModel" -> "uiGmapLayer" + + + + "uiGmapControl"[label="uiGmapControl"] + "uiGmapControl" -> "uiGmapMapControl" + + + + "uiGmapDragZoom"[label="uiGmapDragZoom"] + "uiGmapDragZoom" -> "uiGmapDragZoom" + + + + "uiGmapDrawingManager"[label="uiGmapDrawingManager"] + "uiGmapDrawingManager" -> "uiGmapDrawingManager" + + + + "uiGmapApiFreeDrawPolygons"[label="uiGmapApiFreeDrawPolygons"] + "uiGmapApiFreeDrawPolygons" -> "uiGmapFreeDrawPolygons" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMapType" + + "uiGmapMapTypeParentModel"[label="uiGmapMapTypeParentModel"] + "uiGmapMapTypeParentModel" -> "uiGmapMapType" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMapTypes" + + "uiGmapMapTypesParentModel"[label="uiGmapMapTypesParentModel"] + "uiGmapMapTypesParentModel" -> "uiGmapMapTypes" + + + + "uiGmapPolygons"[label="uiGmapPolygons"] + "uiGmapPolygons" -> "uiGmapPolygons" + + + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapSearchBox" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapSearchBox" + + "uiGmapSearchBoxParentModel"[label="uiGmapSearchBoxParentModel"] + "uiGmapSearchBoxParentModel" -> "uiGmapSearchBox" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapShow" + + + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapStreetViewPanorama" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapStreetViewPanorama" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapStreetViewPanorama" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapStreetViewPanorama" + + + + + + + + + + + + + + "uiGmapadd-events"[label="uiGmapadd-events"] + "uiGmapadd-events" -> "uiGmaparray-sync" + + + + + + +} diff --git a/dist/architecture/dot/legend.dot b/dist/architecture/dot/legend.dot new file mode 100644 index 000000000..7f91f5deb --- /dev/null +++ b/dist/architecture/dot/legend.dot @@ -0,0 +1,18 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "legend.module"[label="Modules", color=1] + node[shape="ellipse"] + "legend.provider" [label="Providers", color=2] + "legend.controllers"[label="Controllers", color=4] + "legend.services" [label="Services", color=5] + "legend.factories" [label="Factories", color=6] + "legend.injected" [label="Injected Services", color=9] + node[shape="cds"] + "legend.filters" [label="Filters", color=7] + "legend.directives" [label="Directives", color=3] + + +} \ No newline at end of file diff --git a/dist/architecture/dot/modules.dot b/dist/architecture/dot/modules.dot new file mode 100644 index 000000000..8134399c9 --- /dev/null +++ b/dist/architecture/dot/modules.dot @@ -0,0 +1,80 @@ +digraph dependencies { + node[shape="ellipse",style="filled",colorscheme=paired12] + + + "uiGmapgoogle-maps.providers"[label="uiGmapgoogle-maps.providers", color=1] + + "uiGmapgoogle-maps.wrapped"[label="uiGmapgoogle-maps.wrapped", color=1] + + "uiGmapgoogle-maps.extensions"[label="uiGmapgoogle-maps.extensions", color=1] + + "uiGmapgoogle-maps.directives.api.utils"[label="uiGmapgoogle-maps.directives.api.utils", color=1] + + "uiGmapgoogle-maps.directives.api.managers"[label="uiGmapgoogle-maps.directives.api.managers", color=1] + + "uiGmapgoogle-maps.directives.api.options"[label="uiGmapgoogle-maps.directives.api.options", color=1] + + "uiGmapgoogle-maps.directives.api.options.builders"[label="uiGmapgoogle-maps.directives.api.options.builders", color=1] + + "uiGmapgoogle-maps.directives.api.models.child"[label="uiGmapgoogle-maps.directives.api.models.child", color=1] + + "uiGmapgoogle-maps.directives.api.models.parent"[label="uiGmapgoogle-maps.directives.api.models.parent", color=1] + + "uiGmapgoogle-maps.directives.api"[label="uiGmapgoogle-maps.directives.api", color=1] + + "uiGmapgoogle-maps"[label="uiGmapgoogle-maps", color=1] + + + node[shape="ellipse",style="filled",color=2] + + + "nemLogging" -> "uiGmapgoogle-maps.providers" + + + + + + "uiGmapgoogle-maps.wrapped" -> "uiGmapgoogle-maps.extensions" + + "uiGmapgoogle-maps.providers" -> "uiGmapgoogle-maps.extensions" + + + + "uiGmapgoogle-maps.extensions" -> "uiGmapgoogle-maps.directives.api.utils" + + + + + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapgoogle-maps.directives.api.options" + + + + + + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapgoogle-maps.directives.api.models.child" + + "uiGmapgoogle-maps.directives.api.options" -> "uiGmapgoogle-maps.directives.api.models.child" + + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapgoogle-maps.directives.api.models.child" + + + + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapgoogle-maps.directives.api.models.parent" + + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapgoogle-maps.directives.api.models.parent" + + "uiGmapgoogle-maps.providers" -> "uiGmapgoogle-maps.directives.api.models.parent" + + + + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapgoogle-maps.directives.api" + + + + "uiGmapgoogle-maps.directives.api" -> "uiGmapgoogle-maps" + + "uiGmapgoogle-maps.providers" -> "uiGmapgoogle-maps" + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.dot new file mode 100644 index 000000000..ea0f7466d --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.dot @@ -0,0 +1,430 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.directives.api"[label="uiGmapgoogle-maps.directives.api", color=1] + + + "uiGmapgoogle-maps.directives.api.models.parent"[label="uiGmapgoogle-maps.directives.api.models.parent", color=1] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapgoogle-maps.directives.api" + + + + node[shape="ellipse"] + + + + + + + "uiGmapDragZoom"[label="uiGmapDragZoom", color=5] + "uiGmapgoogle-maps.directives.api" -> "uiGmapDragZoom" + + "uiGmapICircle"[label="uiGmapICircle", color=5] + "uiGmapgoogle-maps.directives.api" -> "uiGmapICircle" + + "uiGmapIDrawingManager"[label="uiGmapIDrawingManager", color=5] + "uiGmapgoogle-maps.directives.api" -> "uiGmapIDrawingManager" + + "uiGmapIRectangle"[label="uiGmapIRectangle", color=5] + "uiGmapgoogle-maps.directives.api" -> "uiGmapIRectangle" + + "uiGmapPlural"[label="uiGmapPlural", color=5] + "uiGmapgoogle-maps.directives.api" -> "uiGmapPlural" + + + + "uiGmapBasePolyChildModel"[label="uiGmapBasePolyChildModel", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapBasePolyChildModel" + + "uiGmapPolygonChildModel"[label="uiGmapPolygonChildModel", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolygonChildModel" + + "uiGmapPolylineChildModel"[label="uiGmapPolylineChildModel", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolylineChildModel" + + "uiGmapCircle"[label="uiGmapCircle", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapCircle" + + "uiGmapControl"[label="uiGmapControl", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapControl" + + "uiGmapDrawingManager"[label="uiGmapDrawingManager", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapDrawingManager" + + "uiGmapApiFreeDrawPolygons"[label="uiGmapApiFreeDrawPolygons", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapIControl"[label="uiGmapIControl", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapIControl" + + "uiGmapIMarker"[label="uiGmapIMarker", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapIMarker" + + "uiGmapIPolygon"[label="uiGmapIPolygon", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapIPolygon" + + "uiGmapIPolyline"[label="uiGmapIPolyline", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapIPolyline" + + "uiGmapIWindow"[label="uiGmapIWindow", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapIWindow" + + "uiGmapMap"[label="uiGmapMap", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapMap" + + "uiGmapMarker"[label="uiGmapMarker", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapMarker" + + "uiGmapMarkers"[label="uiGmapMarkers", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapMarkers" + + "uiGmapPolygon"[label="uiGmapPolygon", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolygon" + + "uiGmapPolygons"[label="uiGmapPolygons", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolygons" + + "uiGmapPolyline"[label="uiGmapPolyline", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolyline" + + "uiGmapPolylines"[label="uiGmapPolylines", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapPolylines" + + "uiGmapRectangle"[label="uiGmapRectangle", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapRectangle" + + "uiGmapWindow"[label="uiGmapWindow", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapWindow" + + "uiGmapWindows"[label="uiGmapWindows", color=6] + "uiGmapgoogle-maps.directives.api" -> "uiGmapWindows" + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapDragZoom" + + "uiGmapPropertyAction"[label="uiGmapPropertyAction"] + "uiGmapPropertyAction" -> "uiGmapDragZoom" + + + + + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapBasePolyChildModel" + + "uiGmaparray-sync"[label="uiGmaparray-sync"] + "uiGmaparray-sync" -> "uiGmapBasePolyChildModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapBasePolyChildModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapBasePolyChildModel" + + + + "uiGmapBasePolyChildModel"[label="uiGmapBasePolyChildModel"] + "uiGmapBasePolyChildModel" -> "uiGmapPolygonChildModel" + + "uiGmapPolygonOptionsBuilder"[label="uiGmapPolygonOptionsBuilder"] + "uiGmapPolygonOptionsBuilder" -> "uiGmapPolygonChildModel" + + + + "uiGmapBasePolyChildModel"[label="uiGmapBasePolyChildModel"] + "uiGmapBasePolyChildModel" -> "uiGmapPolylineChildModel" + + "uiGmapPolylineOptionsBuilder"[label="uiGmapPolylineOptionsBuilder"] + "uiGmapPolylineOptionsBuilder" -> "uiGmapPolylineChildModel" + + + + "uiGmapICircle"[label="uiGmapICircle"] + "uiGmapICircle" -> "uiGmapCircle" + + "uiGmapCircleParentModel"[label="uiGmapCircleParentModel"] + "uiGmapCircleParentModel" -> "uiGmapCircle" + + + + "uiGmapIControl"[label="uiGmapIControl"] + "uiGmapIControl" -> "uiGmapControl" + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapControl" + + + + "uiGmapIDrawingManager"[label="uiGmapIDrawingManager"] + "uiGmapIDrawingManager" -> "uiGmapDrawingManager" + + "uiGmapDrawingManagerParentModel"[label="uiGmapDrawingManagerParentModel"] + "uiGmapDrawingManagerParentModel" -> "uiGmapDrawingManager" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapDrawFreeHandChildModel"[label="uiGmapDrawFreeHandChildModel"] + "uiGmapDrawFreeHandChildModel" -> "uiGmapApiFreeDrawPolygons" + + "uiGmapLodash"[label="uiGmapLodash"] + "uiGmapLodash" -> "uiGmapApiFreeDrawPolygons" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIControl" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIControl" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIControl" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIMarker" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIMarker" + + + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapIPolygon" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIPolygon" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIPolygon" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIPolygon" + + + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapIPolyline" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIPolyline" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIPolyline" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIPolyline" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapIWindow" + + "uiGmapChildEvents"[label="uiGmapChildEvents"] + "uiGmapChildEvents" -> "uiGmapIWindow" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapIWindow" + + + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapMap" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapMap" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle"] + "uiGmapCtrlHandle" -> "uiGmapMap" + + "uiGmapIsReady"[label="uiGmapIsReady"] + "uiGmapIsReady" -> "uiGmapMap" + + "uiGmapuuid"[label="uiGmapuuid"] + "uiGmapuuid" -> "uiGmapMap" + + "uiGmapExtendGWin"[label="uiGmapExtendGWin"] + "uiGmapExtendGWin" -> "uiGmapMap" + + "uiGmapExtendMarkerClusterer"[label="uiGmapExtendMarkerClusterer"] + "uiGmapExtendMarkerClusterer" -> "uiGmapMap" + + "uiGmapGoogleMapsUtilV3"[label="uiGmapGoogleMapsUtilV3"] + "uiGmapGoogleMapsUtilV3" -> "uiGmapMap" + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapMap" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapMap" + + "uiGmapGoogleMapObjectManager"[label="uiGmapGoogleMapObjectManager"] + "uiGmapGoogleMapObjectManager" -> "uiGmapMap" + + + + "uiGmapIMarker"[label="uiGmapIMarker"] + "uiGmapIMarker" -> "uiGmapMarker" + + "uiGmapMarkerChildModel"[label="uiGmapMarkerChildModel"] + "uiGmapMarkerChildModel" -> "uiGmapMarker" + + "uiGmapMarkerManager"[label="uiGmapMarkerManager"] + "uiGmapMarkerManager" -> "uiGmapMarker" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarker" + + + + "uiGmapIMarker"[label="uiGmapIMarker"] + "uiGmapIMarker" -> "uiGmapMarkers" + + "uiGmapPlural"[label="uiGmapPlural"] + "uiGmapPlural" -> "uiGmapMarkers" + + "uiGmapMarkersParentModel"[label="uiGmapMarkersParentModel"] + "uiGmapMarkersParentModel" -> "uiGmapMarkers" + + "uiGmap_sync"[label="uiGmap_sync"] + "uiGmap_sync" -> "uiGmapMarkers" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkers" + + + + "uiGmapIPolygon"[label="uiGmapIPolygon"] + "uiGmapIPolygon" -> "uiGmapPolygon" + + "uiGmapPolygonChildModel"[label="uiGmapPolygonChildModel"] + "uiGmapPolygonChildModel" -> "uiGmapPolygon" + + + + "uiGmapIPolygon"[label="uiGmapIPolygon"] + "uiGmapIPolygon" -> "uiGmapPolygons" + + "uiGmapPolygonsParentModel"[label="uiGmapPolygonsParentModel"] + "uiGmapPolygonsParentModel" -> "uiGmapPolygons" + + "uiGmapPlural"[label="uiGmapPlural"] + "uiGmapPlural" -> "uiGmapPolygons" + + + + "uiGmapIPolyline"[label="uiGmapIPolyline"] + "uiGmapIPolyline" -> "uiGmapPolyline" + + "uiGmapPolylineChildModel"[label="uiGmapPolylineChildModel"] + "uiGmapPolylineChildModel" -> "uiGmapPolyline" + + + + "uiGmapIPolyline"[label="uiGmapIPolyline"] + "uiGmapIPolyline" -> "uiGmapPolylines" + + "uiGmapPolylinesParentModel"[label="uiGmapPolylinesParentModel"] + "uiGmapPolylinesParentModel" -> "uiGmapPolylines" + + "uiGmapPlural"[label="uiGmapPlural"] + "uiGmapPlural" -> "uiGmapPolylines" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapRectangle" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapRectangle" + + "uiGmapIRectangle"[label="uiGmapIRectangle"] + "uiGmapIRectangle" -> "uiGmapRectangle" + + "uiGmapRectangleParentModel"[label="uiGmapRectangleParentModel"] + "uiGmapRectangleParentModel" -> "uiGmapRectangle" + + + + "uiGmapIWindow"[label="uiGmapIWindow"] + "uiGmapIWindow" -> "uiGmapWindow" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapWindow" + + "uiGmapWindowChildModel"[label="uiGmapWindowChildModel"] + "uiGmapWindowChildModel" -> "uiGmapWindow" + + "uiGmapLodash"[label="uiGmapLodash"] + "uiGmapLodash" -> "uiGmapWindow" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapWindow" + + + + "uiGmapIWindow"[label="uiGmapIWindow"] + "uiGmapIWindow" -> "uiGmapWindows" + + "uiGmapPlural"[label="uiGmapPlural"] + "uiGmapPlural" -> "uiGmapWindows" + + "uiGmapWindowsParentModel"[label="uiGmapWindowsParentModel"] + "uiGmapWindowsParentModel" -> "uiGmapWindows" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapWindows" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapWindows" + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.managers.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.managers.dot new file mode 100644 index 000000000..5f446e71f --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.managers.dot @@ -0,0 +1,102 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.directives.api.managers"[label="uiGmapgoogle-maps.directives.api.managers", color=1] + + + + + node[shape="ellipse"] + + + + + + + "uiGmapGoogleMapObjectManager"[label="uiGmapGoogleMapObjectManager", color=5] + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapGoogleMapObjectManager" + + + + "uiGmapClustererMarkerManager"[label="uiGmapClustererMarkerManager", color=6] + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapClustererMarkerManager" + + "uiGmapMarkerManager"[label="uiGmapMarkerManager", color=6] + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapMarkerManager" + + "uiGmapSpiderfierMarkerManager"[label="uiGmapSpiderfierMarkerManager", color=6] + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapSpiderfierMarkerManager" + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapClustererMarkerManager" + + "uiGmapFitHelper"[label="uiGmapFitHelper"] + "uiGmapFitHelper" -> "uiGmapClustererMarkerManager" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapClustererMarkerManager" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapClustererMarkerManager" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkerManager" + + "uiGmapFitHelper"[label="uiGmapFitHelper"] + "uiGmapFitHelper" -> "uiGmapMarkerManager" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapMarkerManager" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapSpiderfierMarkerManager" + + "uiGmapFitHelper"[label="uiGmapFitHelper"] + "uiGmapFitHelper" -> "uiGmapSpiderfierMarkerManager" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapSpiderfierMarkerManager" + + "uiGmapMarkerSpiderfier"[label="uiGmapMarkerSpiderfier"] + "uiGmapMarkerSpiderfier" -> "uiGmapSpiderfierMarkerManager" + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.models.child.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.models.child.dot new file mode 100644 index 000000000..93dd8af61 --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.models.child.dot @@ -0,0 +1,118 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.directives.api.models.child"[label="uiGmapgoogle-maps.directives.api.models.child", color=1] + + + "uiGmapgoogle-maps.directives.api.utils"[label="uiGmapgoogle-maps.directives.api.utils", color=1] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapgoogle-maps.directives.api.models.child" + + "uiGmapgoogle-maps.directives.api.options"[label="uiGmapgoogle-maps.directives.api.options", color=1] + "uiGmapgoogle-maps.directives.api.options" -> "uiGmapgoogle-maps.directives.api.models.child" + + "uiGmapgoogle-maps.directives.api.options.builders"[label="uiGmapgoogle-maps.directives.api.options.builders", color=1] + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapgoogle-maps.directives.api.models.child" + + + + node[shape="ellipse"] + + + + + + + + + "uiGmapDrawFreeHandChildModel"[label="uiGmapDrawFreeHandChildModel", color=6] + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapDrawFreeHandChildModel" + + "uiGmapMarkerChildModel"[label="uiGmapMarkerChildModel", color=6] + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapMarkerChildModel" + + "uiGmapWindowChildModel"[label="uiGmapWindowChildModel", color=6] + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapWindowChildModel" + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapDrawFreeHandChildModel" + + + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapMarkerChildModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapMarkerChildModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkerChildModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapMarkerChildModel" + + "uiGmapPropertyAction"[label="uiGmapPropertyAction"] + "uiGmapPropertyAction" -> "uiGmapMarkerChildModel" + + "uiGmapMarkerOptions"[label="uiGmapMarkerOptions"] + "uiGmapMarkerOptions" -> "uiGmapMarkerChildModel" + + "uiGmapIMarker"[label="uiGmapIMarker"] + "uiGmapIMarker" -> "uiGmapMarkerChildModel" + + "uiGmapMarkerManager"[label="uiGmapMarkerManager"] + "uiGmapMarkerManager" -> "uiGmapMarkerChildModel" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapMarkerChildModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapWindowChildModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapWindowChildModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapWindowChildModel" + + "uiGmapChromeFixes"[label="uiGmapChromeFixes"] + "uiGmapChromeFixes" -> "uiGmapWindowChildModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapWindowChildModel" + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.models.parent.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.models.parent.dot new file mode 100644 index 000000000..181128bf4 --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.models.parent.dot @@ -0,0 +1,314 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.directives.api.models.parent"[label="uiGmapgoogle-maps.directives.api.models.parent", color=1] + + + "uiGmapgoogle-maps.directives.api.managers"[label="uiGmapgoogle-maps.directives.api.managers", color=1] + "uiGmapgoogle-maps.directives.api.managers" -> "uiGmapgoogle-maps.directives.api.models.parent" + + "uiGmapgoogle-maps.directives.api.models.child"[label="uiGmapgoogle-maps.directives.api.models.child", color=1] + "uiGmapgoogle-maps.directives.api.models.child" -> "uiGmapgoogle-maps.directives.api.models.parent" + + "uiGmapgoogle-maps.providers"[label="uiGmapgoogle-maps.providers", color=1] + "uiGmapgoogle-maps.providers" -> "uiGmapgoogle-maps.directives.api.models.parent" + + + + node[shape="ellipse"] + + + + + + + + + "uiGmapBasePolysParentModel"[label="uiGmapBasePolysParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapBasePolysParentModel" + + "uiGmapCircleParentModel"[label="uiGmapCircleParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapCircleParentModel" + + "uiGmapDrawingManagerParentModel"[label="uiGmapDrawingManagerParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapDrawingManagerParentModel" + + "uiGmapIMarkerParentModel"[label="uiGmapIMarkerParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapIMarkerParentModel" + + "uiGmapIWindowParentModel"[label="uiGmapIWindowParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapIWindowParentModel" + + "uiGmapLayerParentModel"[label="uiGmapLayerParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapLayerParentModel" + + "uiGmapMapTypeParentModel"[label="uiGmapMapTypeParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapMapTypeParentModel" + + "uiGmapMapTypesParentModel"[label="uiGmapMapTypesParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapMapTypesParentModel" + + "uiGmapMarkersParentModel"[label="uiGmapMarkersParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapMarkersParentModel" + + "uiGmapPolygonsParentModel"[label="uiGmapPolygonsParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapPolygonsParentModel" + + "uiGmapPolylinesParentModel"[label="uiGmapPolylinesParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapPolylinesParentModel" + + "uiGmapRectangleParentModel"[label="uiGmapRectangleParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapRectangleParentModel" + + "uiGmapSearchBoxParentModel"[label="uiGmapSearchBoxParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapSearchBoxParentModel" + + "uiGmapWindowsParentModel"[label="uiGmapWindowsParentModel", color=6] + "uiGmapgoogle-maps.directives.api.models.parent" -> "uiGmapWindowsParentModel" + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapBasePolysParentModel" + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapBasePolysParentModel" + + "uiGmapModelsWatcher"[label="uiGmapModelsWatcher"] + "uiGmapModelsWatcher" -> "uiGmapBasePolysParentModel" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapBasePolysParentModel" + + "uiGmap_async"[label="uiGmap_async"] + "uiGmap_async" -> "uiGmapBasePolysParentModel" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapBasePolysParentModel" + + "uiGmapFitHelper"[label="uiGmapFitHelper"] + "uiGmapFitHelper" -> "uiGmapBasePolysParentModel" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapCircleParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapCircleParentModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapCircleParentModel" + + "uiGmapCircleOptionsBuilder"[label="uiGmapCircleOptionsBuilder"] + "uiGmapCircleOptionsBuilder" -> "uiGmapCircleParentModel" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapDrawingManagerParentModel" + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapDrawingManagerParentModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapDrawingManagerParentModel" + + + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapIMarkerParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIMarkerParentModel" + + + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapIWindowParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapIWindowParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapIWindowParentModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapLayerParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapLayerParentModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapMapTypeParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMapTypeParentModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapMapTypesParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMapTypesParentModel" + + "uiGmapMapTypeParentModel"[label="uiGmapMapTypeParentModel"] + "uiGmapMapTypeParentModel" -> "uiGmapMapTypesParentModel" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapMapTypesParentModel" + + + + "uiGmapIMarkerParentModel"[label="uiGmapIMarkerParentModel"] + "uiGmapIMarkerParentModel" -> "uiGmapMarkersParentModel" + + "uiGmapModelsWatcher"[label="uiGmapModelsWatcher"] + "uiGmapModelsWatcher" -> "uiGmapMarkersParentModel" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapMarkersParentModel" + + "uiGmapMarkerChildModel"[label="uiGmapMarkerChildModel"] + "uiGmapMarkerChildModel" -> "uiGmapMarkersParentModel" + + "uiGmap_async"[label="uiGmap_async"] + "uiGmap_async" -> "uiGmapMarkersParentModel" + + "uiGmapClustererMarkerManager"[label="uiGmapClustererMarkerManager"] + "uiGmapClustererMarkerManager" -> "uiGmapMarkersParentModel" + + "uiGmapMarkerManager"[label="uiGmapMarkerManager"] + "uiGmapMarkerManager" -> "uiGmapMarkersParentModel" + + "uiGmapIMarker"[label="uiGmapIMarker"] + "uiGmapIMarker" -> "uiGmapMarkersParentModel" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapMarkersParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapMarkersParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkersParentModel" + + "uiGmapSpiderfierMarkerManager"[label="uiGmapSpiderfierMarkerManager"] + "uiGmapSpiderfierMarkerManager" -> "uiGmapMarkersParentModel" + + + + "uiGmapBasePolysParentModel"[label="uiGmapBasePolysParentModel"] + "uiGmapBasePolysParentModel" -> "uiGmapPolygonsParentModel" + + "uiGmapPolygonChildModel"[label="uiGmapPolygonChildModel"] + "uiGmapPolygonChildModel" -> "uiGmapPolygonsParentModel" + + "uiGmapIPolygon"[label="uiGmapIPolygon"] + "uiGmapIPolygon" -> "uiGmapPolygonsParentModel" + + + + "uiGmapBasePolysParentModel"[label="uiGmapBasePolysParentModel"] + "uiGmapBasePolysParentModel" -> "uiGmapPolylinesParentModel" + + "uiGmapPolylineChildModel"[label="uiGmapPolylineChildModel"] + "uiGmapPolylineChildModel" -> "uiGmapPolylinesParentModel" + + "uiGmapIPolyline"[label="uiGmapIPolyline"] + "uiGmapIPolyline" -> "uiGmapPolylinesParentModel" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapRectangleParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapRectangleParentModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapRectangleParentModel" + + "uiGmapRectangleOptionsBuilder"[label="uiGmapRectangleOptionsBuilder"] + "uiGmapRectangleOptionsBuilder" -> "uiGmapRectangleParentModel" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapSearchBoxParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapSearchBoxParentModel" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapSearchBoxParentModel" + + + + "uiGmapIWindowParentModel"[label="uiGmapIWindowParentModel"] + "uiGmapIWindowParentModel" -> "uiGmapWindowsParentModel" + + "uiGmapModelsWatcher"[label="uiGmapModelsWatcher"] + "uiGmapModelsWatcher" -> "uiGmapWindowsParentModel" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapWindowsParentModel" + + "uiGmapWindowChildModel"[label="uiGmapWindowChildModel"] + "uiGmapWindowChildModel" -> "uiGmapWindowsParentModel" + + "uiGmapLinked"[label="uiGmapLinked"] + "uiGmapLinked" -> "uiGmapWindowsParentModel" + + "uiGmap_async"[label="uiGmap_async"] + "uiGmap_async" -> "uiGmapWindowsParentModel" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapWindowsParentModel" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapWindowsParentModel" + + "uiGmapIWindow"[label="uiGmapIWindow"] + "uiGmapIWindow" -> "uiGmapWindowsParentModel" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapWindowsParentModel" + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.options.builders.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.options.builders.dot new file mode 100644 index 000000000..d27f92348 --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.options.builders.dot @@ -0,0 +1,103 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.directives.api.options.builders"[label="uiGmapgoogle-maps.directives.api.options.builders", color=1] + + + + + node[shape="ellipse"] + + + + + + + "uiGmapCommonOptionsBuilder"[label="uiGmapCommonOptionsBuilder", color=5] + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapCommonOptionsBuilder" + + + + "uiGmapPolylineOptionsBuilder"[label="uiGmapPolylineOptionsBuilder", color=6] + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapPolylineOptionsBuilder" + + "uiGmapShapeOptionsBuilder"[label="uiGmapShapeOptionsBuilder", color=6] + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapShapeOptionsBuilder" + + "uiGmapPolygonOptionsBuilder"[label="uiGmapPolygonOptionsBuilder", color=6] + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapPolygonOptionsBuilder" + + "uiGmapRectangleOptionsBuilder"[label="uiGmapRectangleOptionsBuilder", color=6] + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapRectangleOptionsBuilder" + + "uiGmapCircleOptionsBuilder"[label="uiGmapCircleOptionsBuilder", color=6] + "uiGmapgoogle-maps.directives.api.options.builders" -> "uiGmapCircleOptionsBuilder" + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapCommonOptionsBuilder" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapCommonOptionsBuilder" + + "uiGmapModelKey"[label="uiGmapModelKey"] + "uiGmapModelKey" -> "uiGmapCommonOptionsBuilder" + + + + + + "uiGmapCommonOptionsBuilder"[label="uiGmapCommonOptionsBuilder"] + "uiGmapCommonOptionsBuilder" -> "uiGmapPolylineOptionsBuilder" + + + + "uiGmapCommonOptionsBuilder"[label="uiGmapCommonOptionsBuilder"] + "uiGmapCommonOptionsBuilder" -> "uiGmapShapeOptionsBuilder" + + + + "uiGmapShapeOptionsBuilder"[label="uiGmapShapeOptionsBuilder"] + "uiGmapShapeOptionsBuilder" -> "uiGmapPolygonOptionsBuilder" + + + + "uiGmapShapeOptionsBuilder"[label="uiGmapShapeOptionsBuilder"] + "uiGmapShapeOptionsBuilder" -> "uiGmapRectangleOptionsBuilder" + + + + "uiGmapShapeOptionsBuilder"[label="uiGmapShapeOptionsBuilder"] + "uiGmapShapeOptionsBuilder" -> "uiGmapCircleOptionsBuilder" + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.options.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.options.dot new file mode 100644 index 000000000..e3db0e4f9 --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.options.dot @@ -0,0 +1,63 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.directives.api.options"[label="uiGmapgoogle-maps.directives.api.options", color=1] + + + "uiGmapgoogle-maps.directives.api.utils"[label="uiGmapgoogle-maps.directives.api.utils", color=1] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapgoogle-maps.directives.api.options" + + + + node[shape="ellipse"] + + + + + + + "uiGmapMarkerOptions"[label="uiGmapMarkerOptions", color=5] + "uiGmapgoogle-maps.directives.api.options" -> "uiGmapMarkerOptions" + + + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMarkerOptions" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapMarkerOptions" + + + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.utils.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.utils.dot new file mode 100644 index 000000000..1a40aa1e6 --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.directives.api.utils.dot @@ -0,0 +1,185 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.directives.api.utils"[label="uiGmapgoogle-maps.directives.api.utils", color=1] + + + "uiGmapgoogle-maps.extensions"[label="uiGmapgoogle-maps.extensions", color=1] + "uiGmapgoogle-maps.extensions" -> "uiGmapgoogle-maps.directives.api.utils" + + + + node[shape="ellipse"] + + + + + + + "uiGmap_sync"[label="uiGmap_sync", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmap_sync" + + "uiGmap_async"[label="uiGmap_async", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmap_async" + + "uiGmapCtrlHandle"[label="uiGmapCtrlHandle", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapCtrlHandle" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapEventsHelper" + + "uiGmapFitHelper"[label="uiGmapFitHelper", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapFitHelper" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapGmapUtil" + + "uiGmapIsReady"[label="uiGmapIsReady", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapIsReady" + + "uiGmapLogger"[label="uiGmapLogger", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapLogger" + + "uiGmapPromise"[label="uiGmapPromise", color=5] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapPromise" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject", color=6] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapBaseObject" + + "uiGmapChildEvents"[label="uiGmapChildEvents", color=6] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapChildEvents" + + "uiGmapLinked"[label="uiGmapLinked", color=6] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapLinked" + + "uiGmapModelKey"[label="uiGmapModelKey", color=6] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapModelKey" + + "uiGmapModelsWatcher"[label="uiGmapModelsWatcher", color=6] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapModelsWatcher" + + "uiGmapPropMap"[label="uiGmapPropMap", color=6] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapPropMap" + + "uiGmapPropertyAction"[label="uiGmapPropertyAction", color=6] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapPropertyAction" + + "uiGmapChromeFixes"[label="uiGmapChromeFixes", color=6] + "uiGmapgoogle-maps.directives.api.utils" -> "uiGmapChromeFixes" + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmap_async" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmap_async" + + "uiGmapDataStructures"[label="uiGmapDataStructures"] + "uiGmapDataStructures" -> "uiGmap_async" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmap_async" + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapEventsHelper" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapFitHelper" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapGmapUtil" + + + + + + "nemSimpleLogger"[label="nemSimpleLogger"] + "nemSimpleLogger" -> "uiGmapLogger" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapPromise" + + + + + + + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapLinked" + + + + "uiGmapBaseObject"[label="uiGmapBaseObject"] + "uiGmapBaseObject" -> "uiGmapModelKey" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapModelKey" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapModelsWatcher" + + "uiGmap_async"[label="uiGmap_async"] + "uiGmap_async" -> "uiGmapModelsWatcher" + + "uiGmapPromise"[label="uiGmapPromise"] + "uiGmapPromise" -> "uiGmapModelsWatcher" + + + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapPropertyAction" + + + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.dot new file mode 100644 index 000000000..7faaec1fa --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.dot @@ -0,0 +1,268 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps"[label="uiGmapgoogle-maps", color=1] + + + "uiGmapgoogle-maps.directives.api"[label="uiGmapgoogle-maps.directives.api", color=1] + "uiGmapgoogle-maps.directives.api" -> "uiGmapgoogle-maps" + + "uiGmapgoogle-maps.providers"[label="uiGmapgoogle-maps.providers", color=1] + "uiGmapgoogle-maps.providers" -> "uiGmapgoogle-maps" + + + + node[shape="ellipse"] + + + + + + + "uiGmapObjectIterators"[label="uiGmapObjectIterators", color=5] + "uiGmapgoogle-maps" -> "uiGmapObjectIterators" + + + + "uiGmapadd-events"[label="uiGmapadd-events", color=6] + "uiGmapgoogle-maps" -> "uiGmapadd-events" + + "uiGmaparray-sync"[label="uiGmaparray-sync", color=6] + "uiGmapgoogle-maps" -> "uiGmaparray-sync" + + + node[shape="cds"] + + + + "uiGmapGoogleMap"[label="uiGmapGoogleMap", color=3] + "uiGmapgoogle-maps" -> "uiGmapGoogleMap" + + "uiGmapMarker"[label="uiGmapMarker", color=3] + "uiGmapgoogle-maps" -> "uiGmapMarker" + + "uiGmapMarkers"[label="uiGmapMarkers", color=3] + "uiGmapgoogle-maps" -> "uiGmapMarkers" + + "uiGmapPolygon"[label="uiGmapPolygon", color=3] + "uiGmapgoogle-maps" -> "uiGmapPolygon" + + "uiGmapCircle"[label="uiGmapCircle", color=3] + "uiGmapgoogle-maps" -> "uiGmapCircle" + + "uiGmapPolyline"[label="uiGmapPolyline", color=3] + "uiGmapgoogle-maps" -> "uiGmapPolyline" + + "uiGmapPolylines"[label="uiGmapPolylines", color=3] + "uiGmapgoogle-maps" -> "uiGmapPolylines" + + "uiGmapRectangle"[label="uiGmapRectangle", color=3] + "uiGmapgoogle-maps" -> "uiGmapRectangle" + + "uiGmapWindow"[label="uiGmapWindow", color=3] + "uiGmapgoogle-maps" -> "uiGmapWindow" + + "uiGmapWindows"[label="uiGmapWindows", color=3] + "uiGmapgoogle-maps" -> "uiGmapWindows" + + "uiGmapLayer"[label="uiGmapLayer", color=3] + "uiGmapgoogle-maps" -> "uiGmapLayer" + + "uiGmapMapControl"[label="uiGmapMapControl", color=3] + "uiGmapgoogle-maps" -> "uiGmapMapControl" + + "uiGmapDragZoom"[label="uiGmapDragZoom", color=3] + "uiGmapgoogle-maps" -> "uiGmapDragZoom" + + "uiGmapDrawingManager"[label="uiGmapDrawingManager", color=3] + "uiGmapgoogle-maps" -> "uiGmapDrawingManager" + + "uiGmapFreeDrawPolygons"[label="uiGmapFreeDrawPolygons", color=3] + "uiGmapgoogle-maps" -> "uiGmapFreeDrawPolygons" + + "uiGmapMapType"[label="uiGmapMapType", color=3] + "uiGmapgoogle-maps" -> "uiGmapMapType" + + "uiGmapMapTypes"[label="uiGmapMapTypes", color=3] + "uiGmapgoogle-maps" -> "uiGmapMapTypes" + + "uiGmapPolygons"[label="uiGmapPolygons", color=3] + "uiGmapgoogle-maps" -> "uiGmapPolygons" + + "uiGmapSearchBox"[label="uiGmapSearchBox", color=3] + "uiGmapgoogle-maps" -> "uiGmapSearchBox" + + "uiGmapShow"[label="uiGmapShow", color=3] + "uiGmapgoogle-maps" -> "uiGmapShow" + + "uiGmapStreetViewPanorama"[label="uiGmapStreetViewPanorama", color=3] + "uiGmapgoogle-maps" -> "uiGmapStreetViewPanorama" + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + "uiGmapMap"[label="uiGmapMap"] + "uiGmapMap" -> "uiGmapGoogleMap" + + + + "uiGmapMarker"[label="uiGmapMarker"] + "uiGmapMarker" -> "uiGmapMarker" + + + + "uiGmapMarkers"[label="uiGmapMarkers"] + "uiGmapMarkers" -> "uiGmapMarkers" + + + + "uiGmapPolygon"[label="uiGmapPolygon"] + "uiGmapPolygon" -> "uiGmapPolygon" + + + + "uiGmapCircle"[label="uiGmapCircle"] + "uiGmapCircle" -> "uiGmapCircle" + + + + "uiGmapPolyline"[label="uiGmapPolyline"] + "uiGmapPolyline" -> "uiGmapPolyline" + + + + "uiGmapPolylines"[label="uiGmapPolylines"] + "uiGmapPolylines" -> "uiGmapPolylines" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapRectangle" + + "uiGmapRectangle"[label="uiGmapRectangle"] + "uiGmapRectangle" -> "uiGmapRectangle" + + + + "uiGmapWindow"[label="uiGmapWindow"] + "uiGmapWindow" -> "uiGmapWindow" + + + + "uiGmapWindows"[label="uiGmapWindows"] + "uiGmapWindows" -> "uiGmapWindows" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapLayer" + + "uiGmapLayerParentModel"[label="uiGmapLayerParentModel"] + "uiGmapLayerParentModel" -> "uiGmapLayer" + + + + "uiGmapControl"[label="uiGmapControl"] + "uiGmapControl" -> "uiGmapMapControl" + + + + "uiGmapDragZoom"[label="uiGmapDragZoom"] + "uiGmapDragZoom" -> "uiGmapDragZoom" + + + + "uiGmapDrawingManager"[label="uiGmapDrawingManager"] + "uiGmapDrawingManager" -> "uiGmapDrawingManager" + + + + "uiGmapApiFreeDrawPolygons"[label="uiGmapApiFreeDrawPolygons"] + "uiGmapApiFreeDrawPolygons" -> "uiGmapFreeDrawPolygons" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMapType" + + "uiGmapMapTypeParentModel"[label="uiGmapMapTypeParentModel"] + "uiGmapMapTypeParentModel" -> "uiGmapMapType" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapMapTypes" + + "uiGmapMapTypesParentModel"[label="uiGmapMapTypesParentModel"] + "uiGmapMapTypesParentModel" -> "uiGmapMapTypes" + + + + "uiGmapPolygons"[label="uiGmapPolygons"] + "uiGmapPolygons" -> "uiGmapPolygons" + + + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapSearchBox" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapSearchBox" + + "uiGmapSearchBoxParentModel"[label="uiGmapSearchBoxParentModel"] + "uiGmapSearchBoxParentModel" -> "uiGmapSearchBox" + + + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapShow" + + + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapStreetViewPanorama" + + "uiGmapLogger"[label="uiGmapLogger"] + "uiGmapLogger" -> "uiGmapStreetViewPanorama" + + "uiGmapGmapUtil"[label="uiGmapGmapUtil"] + "uiGmapGmapUtil" -> "uiGmapStreetViewPanorama" + + "uiGmapEventsHelper"[label="uiGmapEventsHelper"] + "uiGmapEventsHelper" -> "uiGmapStreetViewPanorama" + + + + + + + + + + + + + + + "uiGmapadd-events"[label="uiGmapadd-events"] + "uiGmapadd-events" -> "uiGmaparray-sync" + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.extensions.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.extensions.dot new file mode 100644 index 000000000..b3e889d30 --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.extensions.dot @@ -0,0 +1,81 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.extensions"[label="uiGmapgoogle-maps.extensions", color=1] + + + "uiGmapgoogle-maps.wrapped"[label="uiGmapgoogle-maps.wrapped", color=1] + "uiGmapgoogle-maps.wrapped" -> "uiGmapgoogle-maps.extensions" + + "uiGmapgoogle-maps.providers"[label="uiGmapgoogle-maps.providers", color=1] + "uiGmapgoogle-maps.providers" -> "uiGmapgoogle-maps.extensions" + + + + node[shape="ellipse"] + + + + + + + "uiGmapExtendGWin"[label="uiGmapExtendGWin", color=5] + "uiGmapgoogle-maps.extensions" -> "uiGmapExtendGWin" + + "uiGmapLodash"[label="uiGmapLodash", color=5] + "uiGmapgoogle-maps.extensions" -> "uiGmapLodash" + + "uiGmapExtendMarkerClusterer"[label="uiGmapExtendMarkerClusterer", color=5] + "uiGmapgoogle-maps.extensions" -> "uiGmapExtendMarkerClusterer" + + + + "uiGmapString"[label="uiGmapString", color=6] + "uiGmapgoogle-maps.extensions" -> "uiGmapString" + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + + + + + "uiGmapLodash"[label="uiGmapLodash"] + "uiGmapLodash" -> "uiGmapExtendMarkerClusterer" + + "uiGmapPropMap"[label="uiGmapPropMap"] + "uiGmapPropMap" -> "uiGmapExtendMarkerClusterer" + + + + + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.providers.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.providers.dot new file mode 100644 index 000000000..68d3f066d --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.providers.dot @@ -0,0 +1,73 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.providers"[label="uiGmapgoogle-maps.providers", color=1] + + + "nemLogging"[label="nemLogging", color=1] + "nemLogging" -> "uiGmapgoogle-maps.providers" + + + + node[shape="ellipse"] + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi", fillcolor=2] + "uiGmapgoogle-maps.providers" -> "uiGmapGoogleMapApi" + + + + + + + "uiGmapGoogleMapApiManualLoader"[label="uiGmapGoogleMapApiManualLoader", color=5] + "uiGmapgoogle-maps.providers" -> "uiGmapGoogleMapApiManualLoader" + + + + "uiGmapMapScriptLoader"[label="uiGmapMapScriptLoader", color=6] + "uiGmapgoogle-maps.providers" -> "uiGmapMapScriptLoader" + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + + + "uiGmapMapScriptLoader"[label="uiGmapMapScriptLoader"] + "uiGmapMapScriptLoader" -> "uiGmapGoogleMapApiManualLoader" + + + + + + "uiGmapuuid"[label="uiGmapuuid"] + "uiGmapuuid" -> "uiGmapMapScriptLoader" + + + + + + +} diff --git a/dist/architecture/dot/modules/uiGmapgoogle-maps.wrapped.dot b/dist/architecture/dot/modules/uiGmapgoogle-maps.wrapped.dot new file mode 100644 index 000000000..9b8b9a3d9 --- /dev/null +++ b/dist/architecture/dot/modules/uiGmapgoogle-maps.wrapped.dot @@ -0,0 +1,72 @@ +digraph dependencies { + node[shape="component",style="filled",colorscheme=paired12] + + + node[shape="component"] + "uiGmapgoogle-maps.wrapped"[label="uiGmapgoogle-maps.wrapped", color=1] + + + + + node[shape="ellipse"] + + + + + + + "uiGmapuuid"[label="uiGmapuuid", color=5] + "uiGmapgoogle-maps.wrapped" -> "uiGmapuuid" + + "uiGmapGoogleMapsUtilV3"[label="uiGmapGoogleMapsUtilV3", color=5] + "uiGmapgoogle-maps.wrapped" -> "uiGmapGoogleMapsUtilV3" + + "uiGmapDataStructures"[label="uiGmapDataStructures", color=5] + "uiGmapgoogle-maps.wrapped" -> "uiGmapDataStructures" + + "uiGmapMarkerSpiderfier"[label="uiGmapMarkerSpiderfier", color=5] + "uiGmapgoogle-maps.wrapped" -> "uiGmapMarkerSpiderfier" + + + + + node[shape="cds"] + + + + + + + + + + + + + node[shape="ellipse",style="filled", color=9] + + + + + + + + + + + + + + + + "uiGmapGoogleMapApi"[label="uiGmapGoogleMapApi"] + "uiGmapGoogleMapApi" -> "uiGmapMarkerSpiderfier" + + + + + + + + +} diff --git a/dist/architecture/png/all.png b/dist/architecture/png/all.png new file mode 100644 index 000000000..9a3d95faa Binary files /dev/null and b/dist/architecture/png/all.png differ diff --git a/dist/architecture/png/legend.png b/dist/architecture/png/legend.png new file mode 100644 index 000000000..e555687bf Binary files /dev/null and b/dist/architecture/png/legend.png differ diff --git a/dist/architecture/png/modules.png b/dist/architecture/png/modules.png new file mode 100644 index 000000000..4efb7935d Binary files /dev/null and b/dist/architecture/png/modules.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.managers.png b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.managers.png new file mode 100644 index 000000000..f76be9cf0 Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.managers.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.models.child.png b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.models.child.png new file mode 100644 index 000000000..aea48e561 Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.models.child.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.models.parent.png b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.models.parent.png new file mode 100644 index 000000000..f3ee2717a Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.models.parent.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.options.builders.png b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.options.builders.png new file mode 100644 index 000000000..596e79029 Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.options.builders.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.options.png b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.options.png new file mode 100644 index 000000000..e1e69b89d Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.options.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.png b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.png new file mode 100644 index 000000000..76a05e75d Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.utils.png b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.utils.png new file mode 100644 index 000000000..5f93c13a2 Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.directives.api.utils.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.extensions.png b/dist/architecture/png/modules/uiGmapgoogle-maps.extensions.png new file mode 100644 index 000000000..9adcdc757 Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.extensions.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.png b/dist/architecture/png/modules/uiGmapgoogle-maps.png new file mode 100644 index 000000000..fe1e9c4c6 Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.providers.png b/dist/architecture/png/modules/uiGmapgoogle-maps.providers.png new file mode 100644 index 000000000..fc84a58b5 Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.providers.png differ diff --git a/dist/architecture/png/modules/uiGmapgoogle-maps.wrapped.png b/dist/architecture/png/modules/uiGmapgoogle-maps.wrapped.png new file mode 100644 index 000000000..e758863d7 Binary files /dev/null and b/dist/architecture/png/modules/uiGmapgoogle-maps.wrapped.png differ diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 000000000..2b5fc52c1 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1 @@ +/angular-google-maps.js diff --git a/example/assets/images/beer.png b/example/assets/images/beer.png new file mode 100644 index 000000000..4daa754c3 Binary files /dev/null and b/example/assets/images/beer.png differ diff --git a/example/assets/images/blue_marker.png b/example/assets/images/blue_marker.png new file mode 100644 index 000000000..7c4589dcf Binary files /dev/null and b/example/assets/images/blue_marker.png differ diff --git a/example/assets/images/cluster1.png b/example/assets/images/cluster1.png new file mode 100644 index 000000000..ee9d622c3 Binary files /dev/null and b/example/assets/images/cluster1.png differ diff --git a/example/assets/images/plane.png b/example/assets/images/plane.png new file mode 100644 index 000000000..d5e646be5 Binary files /dev/null and b/example/assets/images/plane.png differ diff --git a/example/assets/json/1028-locations.json b/example/assets/json/1028-locations.json new file mode 100644 index 000000000..57e71a8e1 --- /dev/null +++ b/example/assets/json/1028-locations.json @@ -0,0 +1 @@ +[{"id":0,"latitude":"51.5185619","longitude":"-0.1718532"},{"id":1,"latitude":"51.5175655","longitude":"-0.1727974"},{"id":2,"latitude":"51.5184409","longitude":"-0.1720185"},{"id":3,"latitude":"51.51768647451152","longitude":"-0.1727936585009833"},{"id":4,"latitude":"51.5180559605168","longitude":"-0.1727164434082992"},{"id":5,"latitude":"0","longitude":"0"},{"id":6,"latitude":"2.3461711406707764","longitude":"37.972373962402344"},{"id":7,"latitude":51.610523,"longitude":0.08178799999996},{"id":8,"latitude":51.53066,"longitude":-0.12316999999996},{"id":9,"latitude":51.512105,"longitude":-0.30389890000004},{"id":10,"latitude":"51.46332171086008","longitude":"0.01938141976166912"},{"id":11,"latitude":"0","longitude":"0"},{"id":12,"latitude":"0","longitude":"0"},{"id":13,"latitude":"0","longitude":"0"},{"id":14,"latitude":"35.32942075","longitude":"-97.51760031"},{"id":15,"latitude":"0","longitude":"0"},{"id":16,"latitude":"56.4576017","longitude":"-2.9787849"},{"id":17,"latitude":"40.7257069","longitude":"-74.0062079"},{"id":18,"latitude":"0","longitude":"0"},{"id":19,"latitude":"44.1129434","longitude":"9.8124684"},{"id":20,"latitude":"0","longitude":"0"},{"id":21,"latitude":"31.07138037","longitude":"-96.19030466"},{"id":22,"latitude":"9.7096268","longitude":"-63.1552028"},{"id":23,"latitude":"0","longitude":"0"},{"id":24,"latitude":"44.93376072419662","longitude":"-68.65017913496267"},{"id":25,"latitude":"0","longitude":"0"},{"id":26,"latitude":"0","longitude":"0"},{"id":27,"latitude":"51.5175465","longitude":"-0.1728347"},{"id":28,"latitude":"51.5175507","longitude":"-0.1728357"},{"id":29,"latitude":"0","longitude":"0"},{"id":30,"latitude":"-2.8340809","longitude":"37.5231003"},{"id":31,"latitude":"51.5175343","longitude":"-0.1728357"},{"id":32,"latitude":"0","longitude":"0"},{"id":33,"latitude":"-2.80508543","longitude":"37.53856564"},{"id":34,"latitude":"0","longitude":"0"},{"id":35,"latitude":"0","longitude":"0"},{"id":36,"latitude":"51.5175649","longitude":"-0.1728365"},{"id":37,"latitude":"21.0475107","longitude":"105.8836822"},{"id":38,"latitude":"0","longitude":"0"},{"id":39,"latitude":"38.70322287","longitude":"-90.47056473"},{"id":40,"latitude":"0","longitude":"0"},{"id":41,"latitude":"51.4720134","longitude":"-2.48323876"},{"id":42,"latitude":"0","longitude":"0"},{"id":43,"latitude":"51.5175461","longitude":"-0.1728396"},{"id":44,"latitude":"27.68592109","longitude":"85.31201736"},{"id":45,"latitude":"-37.854061354161615","longitude":"145.05993926352866"},{"id":46,"latitude":"19.521288566666666","longitude":"-96.91822413333334"},{"id":47,"latitude":"19.5212953","longitude":"-96.91807505"},{"id":48,"latitude":"19.52134245","longitude":"-96.918210725"},{"id":49,"latitude":"6.4224899","longitude":"2.339804"},{"id":50,"latitude":"6.5808209","longitude":"2.2864039"},{"id":51,"latitude":"-1.2954985","longitude":"36.8163601"},{"id":52,"latitude":"0","longitude":"0"},{"id":53,"latitude":"33.85965","longitude":"35.4920291"},{"id":54,"latitude":"41.5306714","longitude":"-72.89066534"},{"id":55,"latitude":"51.7525506","longitude":"-1.2162034"},{"id":56,"latitude":"6.3731345","longitude":"2.0848562"},{"id":57,"latitude":"0","longitude":"0"},{"id":58,"latitude":"0","longitude":"0"},{"id":59,"latitude":"0","longitude":"0"},{"id":60,"latitude":"0","longitude":"0"},{"id":61,"latitude":"0","longitude":"0"},{"id":62,"latitude":"0","longitude":"0"},{"id":63,"latitude":"0","longitude":"0"},{"id":64,"latitude":"0","longitude":"0"},{"id":65,"latitude":"0","longitude":"0"},{"id":66,"latitude":"0","longitude":"0"},{"id":67,"latitude":"0","longitude":"0"},{"id":68,"latitude":"32.8016136","longitude":"-117.2586688"},{"id":69,"latitude":"0","longitude":"0"},{"id":70,"latitude":"8.9433445","longitude":"125.5332631"},{"id":71,"latitude":"0","longitude":"0"},{"id":72,"latitude":"-6.2240856","longitude":"106.8427975"},{"id":73,"latitude":"0","longitude":"0"},{"id":74,"latitude":"51.2885327","longitude":"-0.108194"},{"id":75,"latitude":"0","longitude":"0"},{"id":76,"latitude":"0","longitude":"0"},{"id":77,"latitude":"51.4719584","longitude":"-2.483327"},{"id":78,"latitude":"51.5181861","longitude":"-0.1713904"},{"id":79,"latitude":"0","longitude":"0"},{"id":80,"latitude":"0","longitude":"0"},{"id":81,"latitude":"6.8194713","longitude":"2.1886217"},{"id":82,"latitude":"0","longitude":"0"},{"id":83,"latitude":"0","longitude":"0"},{"id":84,"latitude":"51.4970305","longitude":"-0.1779259"},{"id":85,"latitude":"0","longitude":"0"},{"id":86,"latitude":"0","longitude":"0"},{"id":87,"latitude":"52.68949269","longitude":"-2.9495927"},{"id":88,"latitude":"52.68935049","longitude":"-2.95024299"},{"id":89,"latitude":"52.68920794","longitude":"-2.95107057"},{"id":90,"latitude":"52.68889004","longitude":"-2.95291744"},{"id":91,"latitude":"52.68802179","longitude":"-2.95427502"},{"id":92,"latitude":"52.68768892","longitude":"-2.95324749"},{"id":93,"latitude":"52.68770029","longitude":"-2.95212009"},{"id":94,"latitude":"52.68770661","longitude":"-2.95180006"},{"id":95,"latitude":"52.68776689","longitude":"-2.95103997"},{"id":96,"latitude":"52.68776688","longitude":"-2.95054578"},{"id":97,"latitude":"52.68777495","longitude":"-2.94977611"},{"id":98,"latitude":"52.68767336","longitude":"-2.94940814"},{"id":99,"latitude":"52.68742717","longitude":"-2.94947157"},{"id":100,"latitude":"52.68661159","longitude":"-2.94930835"},{"id":101,"latitude":"52.68677428","longitude":"-2.94914219"},{"id":102,"latitude":"52.68808894","longitude":"-2.94647478"},{"id":103,"latitude":"52.68910149","longitude":"-2.94849512"},{"id":104,"latitude":"-42.77852303814143","longitude":"-65.02852594479918"},{"id":105,"latitude":"0","longitude":"0"},{"id":106,"latitude":"12.965205","longitude":"77.5368611"},{"id":107,"latitude":"12.965205","longitude":"77.5368611"},{"id":108,"latitude":"0","longitude":"0"},{"id":109,"latitude":"38.7476599","longitude":"-77.1717789"},{"id":110,"latitude":"45.3505115","longitude":"-75.6475401"},{"id":111,"latitude":"0","longitude":"0"},{"id":112,"latitude":"0","longitude":"0"},{"id":113,"latitude":"11.51588636","longitude":"79.33767545"},{"id":114,"latitude":"0","longitude":"0"},{"id":115,"latitude":"0","longitude":"0"},{"id":116,"latitude":"0","longitude":"0"},{"id":117,"latitude":"0","longitude":"0"},{"id":118,"latitude":"40.4109082","longitude":"-3.6987446"},{"id":119,"latitude":"48.4794067","longitude":"2.192429"},{"id":120,"latitude":"0","longitude":"0"},{"id":121,"latitude":"0","longitude":"0"},{"id":122,"latitude":"0","longitude":"0"},{"id":123,"latitude":"12.3403344","longitude":"-1.4859853"},{"id":124,"latitude":"12.3403344","longitude":"-1.4859853"},{"id":125,"latitude":"52.1954504","longitude":"0.1102092"},{"id":126,"latitude":"48.7921218","longitude":"2.2848311"},{"id":127,"latitude":"48.7921218","longitude":"2.2848311"},{"id":128,"latitude":"0","longitude":"0"},{"id":129,"latitude":"32.9381670203134","longitude":"35.08685148747767"},{"id":130,"latitude":"0","longitude":"0"},{"id":131,"latitude":"51.5251094","longitude":"-0.1347237"},{"id":132,"latitude":"0","longitude":"0"},{"id":133,"latitude":"0","longitude":"0"},{"id":134,"latitude":"33.72045015524619","longitude":"-117.90276242198988"},{"id":135,"latitude":"52.6194997","longitude":"-2.1541181"},{"id":136,"latitude":"0","longitude":"0"},{"id":137,"latitude":"40.27780525","longitude":"-80.02722676666667"},{"id":138,"latitude":"40.2776644","longitude":"-80.02709543333333"},{"id":139,"latitude":"40.27761168333333","longitude":"-80.02705778333333"},{"id":140,"latitude":"40.2774143","longitude":"-80.02692241666666"},{"id":141,"latitude":"40.2777555","longitude":"-80.0271096"},{"id":142,"latitude":"40.277615","longitude":"-80.02706325"},{"id":143,"latitude":"40.2776868","longitude":"-80.0271268"},{"id":144,"latitude":"40.27723541666667","longitude":"-80.02703436666667"},{"id":145,"latitude":"40.27727493333333","longitude":"-80.02720721666667"},{"id":146,"latitude":"40.27720238333333","longitude":"-80.02737665"},{"id":147,"latitude":"40.277442433333334","longitude":"-80.02759175"},{"id":148,"latitude":"40.27768221666667","longitude":"-80.02777818333334"},{"id":149,"latitude":"40.278003983333335","longitude":"-80.02777041666667"},{"id":150,"latitude":"40.27741205","longitude":"-80.02664156666667"},{"id":151,"latitude":"40.27751043333333","longitude":"-80.02643651666666"},{"id":152,"latitude":"40.277226133333336","longitude":"-80.02659278333333"},{"id":153,"latitude":"40.27729905","longitude":"-80.0266767"},{"id":154,"latitude":"40.277005083333336","longitude":"-80.02698786666667"},{"id":155,"latitude":"40.27687075","longitude":"-80.0268147"},{"id":156,"latitude":"40.27719798333333","longitude":"-80.02610383333334"},{"id":157,"latitude":"40.2771564","longitude":"-80.02573668333334"},{"id":158,"latitude":"40.27710205","longitude":"-80.02538095"},{"id":159,"latitude":"0","longitude":"0"},{"id":160,"latitude":"-15.8345496","longitude":"35.0684842"},{"id":161,"latitude":"45.6843142","longitude":"4.954369"},{"id":162,"latitude":"0","longitude":"0"},{"id":163,"latitude":"-26.0754224","longitude":"28.0114379"},{"id":164,"latitude":"24.899592398603634","longitude":"67.08118569858004"},{"id":165,"latitude":"24.89926835","longitude":"67.08212280000001"},{"id":166,"latitude":"0","longitude":"0"},{"id":167,"latitude":"39.2411944","longitude":"-8.6815208"},{"id":168,"latitude":"0","longitude":"0"},{"id":169,"latitude":"-1.2954001","longitude":"36.8163052"},{"id":170,"latitude":"23.739706511523906","longitude":"-99.15427782145278"},{"id":171,"latitude":"38.9402989","longitude":"-92.3335843"},{"id":172,"latitude":"-20.1820792","longitude":"28.5101499"},{"id":173,"latitude":"39.70784762","longitude":"-119.65839607"},{"id":174,"latitude":"39.70784835","longitude":"-119.65839604"},{"id":175,"latitude":"0","longitude":"0"},{"id":176,"latitude":"11.5582092","longitude":"104.9200905"},{"id":177,"latitude":"45.895385201789026","longitude":"1.317921541952242"},{"id":178,"latitude":"0","longitude":"0"},{"id":179,"latitude":"48.1997131","longitude":"16.3433035"},{"id":180,"latitude":"33.9216878","longitude":"-84.3357999"},{"id":181,"latitude":"51.53843516","longitude":"-0.1926268"},{"id":182,"latitude":"0","longitude":"0"},{"id":183,"latitude":"0","longitude":"0"},{"id":184,"latitude":"12.8788208","longitude":"79.1326035"},{"id":185,"latitude":"-6.8515523","longitude":"37.6585117"},{"id":186,"latitude":"-1.282772","longitude":"36.8246448"},{"id":187,"latitude":"0","longitude":"0"},{"id":188,"latitude":"0","longitude":"0"},{"id":189,"latitude":"37.61752536","longitude":"-84.40816935"},{"id":190,"latitude":"52.5133276","longitude":"13.4564627"},{"id":191,"latitude":"0","longitude":"0"},{"id":192,"latitude":"0","longitude":"0"},{"id":193,"latitude":"52.4309876","longitude":"-1.5396356"},{"id":194,"latitude":"0","longitude":"0"},{"id":195,"latitude":"0","longitude":"0"},{"id":196,"latitude":"0","longitude":"0"},{"id":197,"latitude":"0","longitude":"0"},{"id":198,"latitude":"5.810808333333334","longitude":"-0.3531283333333333"},{"id":199,"latitude":"0","longitude":"0"},{"id":200,"latitude":"0","longitude":"0"},{"id":201,"latitude":"0","longitude":"0"},{"id":202,"latitude":"0","longitude":"0"},{"id":203,"latitude":"43.1427031","longitude":"-2.0705815"},{"id":204,"latitude":"0","longitude":"0"},{"id":205,"latitude":"0","longitude":"0"},{"id":206,"latitude":"-23.53325017","longitude":"-46.66003182"},{"id":207,"latitude":"0","longitude":"0"},{"id":208,"latitude":"0","longitude":"0"},{"id":209,"latitude":"-1.30988078","longitude":"36.81396601"},{"id":210,"latitude":"-27.5984943","longitude":"-48.5253331"},{"id":211,"latitude":"50.77892214890545","longitude":"0.09124425306434863"},{"id":212,"latitude":"0","longitude":"0"},{"id":213,"latitude":"0","longitude":"0"},{"id":214,"latitude":"0","longitude":"0"},{"id":215,"latitude":"0","longitude":"0"},{"id":216,"latitude":"47.60583699","longitude":"-52.72464685"},{"id":217,"latitude":"0","longitude":"0"},{"id":218,"latitude":"0","longitude":"0"},{"id":219,"latitude":"45.07268904","longitude":"7.7188862"},{"id":220,"latitude":"22.341784","longitude":"114.1785033"},{"id":221,"latitude":"0","longitude":"0"},{"id":222,"latitude":"53.99557852","longitude":"-1.54761106"},{"id":223,"latitude":"42.55796851","longitude":"-89.3532668"},{"id":224,"latitude":"53.99543478","longitude":"-1.54825094"},{"id":225,"latitude":"0","longitude":"0"},{"id":226,"latitude":"0","longitude":"0"},{"id":227,"latitude":"41.8822527","longitude":"12.4885377"},{"id":228,"latitude":"43.04061468","longitude":"-76.11500342"},{"id":229,"latitude":"0","longitude":"0"},{"id":230,"latitude":"47.58776407688856","longitude":"7.675242768600583"},{"id":231,"latitude":"47.587675815448165","longitude":"7.675318289548159"},{"id":232,"latitude":"43.0045828","longitude":"-76.0991001"},{"id":233,"latitude":"43.0045828","longitude":"-76.0991001"},{"id":234,"latitude":"43.0045828","longitude":"-76.0991001"},{"id":235,"latitude":"43.0045828","longitude":"-76.0991001"},{"id":236,"latitude":"43.0045828","longitude":"-76.0991001"},{"id":237,"latitude":"43.0045828","longitude":"-76.0991001"},{"id":238,"latitude":"0","longitude":"0"},{"id":239,"latitude":"0","longitude":"0"},{"id":240,"latitude":"0","longitude":"0"},{"id":241,"latitude":"0","longitude":"0"},{"id":242,"latitude":"46.69108655769378","longitude":"13.676463989540935"},{"id":243,"latitude":"46.69158737640828","longitude":"13.676128378137946"},{"id":244,"latitude":"43.0253003","longitude":"-76.1606331"},{"id":245,"latitude":"0","longitude":"0"},{"id":246,"latitude":"0","longitude":"0"},{"id":247,"latitude":"0","longitude":"0"},{"id":248,"latitude":"43.0301589","longitude":"-76.1529542"},{"id":249,"latitude":"0","longitude":"0"},{"id":250,"latitude":"24.1872635","longitude":"120.6847824"},{"id":251,"latitude":"0","longitude":"0"},{"id":252,"latitude":"51.5176262","longitude":"-0.1728107"},{"id":253,"latitude":"0","longitude":"0"},{"id":254,"latitude":"0","longitude":"0"},{"id":255,"latitude":"0","longitude":"0"},{"id":256,"latitude":"-17.819546264188713","longitude":"31.049332883444617"},{"id":257,"latitude":"-17.81956882","longitude":"31.04932308"},{"id":258,"latitude":"-17.81957122","longitude":"31.04932796"},{"id":259,"latitude":"-17.819502248323","longitude":"31.049345362953837"},{"id":260,"latitude":"-17.81957137","longitude":"31.04932772"},{"id":261,"latitude":"48.2042483","longitude":"16.3372803"},{"id":262,"latitude":"48.2042358","longitude":"16.3372814"},{"id":263,"latitude":"4.4327621","longitude":"-75.218002"},{"id":264,"latitude":"46.083256187235754","longitude":"18.23388960439199"},{"id":265,"latitude":"0","longitude":"0"},{"id":266,"latitude":"0","longitude":"0"},{"id":267,"latitude":"-17.5126565","longitude":"126.1091032"},{"id":268,"latitude":"12.253582","longitude":"-2.3625389"},{"id":269,"latitude":"0","longitude":"0"},{"id":270,"latitude":"0","longitude":"0"},{"id":271,"latitude":"-9.4462397","longitude":"159.9830279"},{"id":272,"latitude":"13.0192733","longitude":"77.5984251"},{"id":273,"latitude":"34.00954116798963","longitude":"-117.87414911292767"},{"id":274,"latitude":"-29.9346992","longitude":"-71.2827801"},{"id":275,"latitude":"0","longitude":"0"},{"id":276,"latitude":"0","longitude":"0"},{"id":277,"latitude":"37.360825","longitude":"-6.0442428"},{"id":278,"latitude":"37.3642364","longitude":"-6.0511491"},{"id":279,"latitude":"0","longitude":"0"},{"id":280,"latitude":"0","longitude":"0"},{"id":281,"latitude":"0","longitude":"0"},{"id":282,"latitude":"53.8032017","longitude":"-1.5626958"},{"id":283,"latitude":"4.452687984431839","longitude":"-75.20234861333287"},{"id":284,"latitude":"0","longitude":"0"},{"id":285,"latitude":"-1.6052999","longitude":"103.5745836"},{"id":286,"latitude":"0","longitude":"0"},{"id":287,"latitude":"38.9431747","longitude":"-92.323154"},{"id":288,"latitude":"0","longitude":"0"},{"id":289,"latitude":"31.456720177084208","longitude":"35.110029838979244"},{"id":290,"latitude":"31.901353691482637","longitude":"34.80313787177578"},{"id":291,"latitude":"0","longitude":"0"},{"id":292,"latitude":"0","longitude":"0"},{"id":293,"latitude":"39.6366825979203","longitude":"-0.4324745200574398"},{"id":294,"latitude":"0","longitude":"0"},{"id":295,"latitude":"0","longitude":"0"},{"id":296,"latitude":"54.210474715477716","longitude":"-8.508218497906158"},{"id":297,"latitude":"0","longitude":"0"},{"id":298,"latitude":"0","longitude":"0"},{"id":299,"latitude":"38.9427235","longitude":"-92.3240915"},{"id":300,"latitude":"48.85982535","longitude":"17.02652354"},{"id":301,"latitude":"-1.6773209","longitude":"29.215585"},{"id":302,"latitude":"40.72768616024405","longitude":"-74.0059528592974"},{"id":303,"latitude":"0","longitude":"0"},{"id":304,"latitude":"0","longitude":"0"},{"id":305,"latitude":"47.39197333333333","longitude":"8.538685"},{"id":306,"latitude":"0","longitude":"0"},{"id":307,"latitude":"1.3111732","longitude":"103.7884708"},{"id":308,"latitude":"11.5495253","longitude":"104.9274452"},{"id":309,"latitude":"31.9057113","longitude":"34.8227247"},{"id":310,"latitude":"31.9057541","longitude":"34.8226224"},{"id":311,"latitude":"42.643420517836965","longitude":"21.11910062832476"},{"id":312,"latitude":"7.10950423","longitude":"-73.09858143"},{"id":313,"latitude":"0","longitude":"0"},{"id":314,"latitude":"7.11116977","longitude":"-73.10300658"},{"id":315,"latitude":"7.11116657","longitude":"-73.10302108"},{"id":316,"latitude":"17.4385656","longitude":"78.444446"},{"id":317,"latitude":"17.3602143","longitude":"78.5257931"},{"id":318,"latitude":"0","longitude":"0"},{"id":319,"latitude":"0","longitude":"0"},{"id":320,"latitude":"0","longitude":"0"},{"id":321,"latitude":"9.9563265","longitude":"-83.9953835"},{"id":322,"latitude":"0","longitude":"0"},{"id":323,"latitude":"52.15860538","longitude":"-2.80492626"},{"id":324,"latitude":"-1.3429571","longitude":"36.6656921"},{"id":325,"latitude":"0","longitude":"0"},{"id":326,"latitude":"0","longitude":"0"},{"id":327,"latitude":"-1.2893204","longitude":"36.7286428"},{"id":328,"latitude":"51.4948696","longitude":"-0.1459822"},{"id":329,"latitude":"51.495004","longitude":"-0.1458313"},{"id":330,"latitude":"51.4949008","longitude":"-0.1459842"},{"id":331,"latitude":"0","longitude":"0"},{"id":332,"latitude":"42.643555159406844","longitude":"21.119085531123424"},{"id":333,"latitude":"0","longitude":"0"},{"id":334,"latitude":"2.3444244","longitude":"37.9965526"},{"id":335,"latitude":"-1.3103425","longitude":"36.8131262"},{"id":336,"latitude":"-3.75654615","longitude":"-38.53859527"},{"id":337,"latitude":"0","longitude":"0"},{"id":338,"latitude":"-1.2238637","longitude":"36.9255412"},{"id":339,"latitude":"1.0409438","longitude":"34.9835097"},{"id":340,"latitude":"1.1380116","longitude":"34.9573527"},{"id":341,"latitude":"1.0196798","longitude":"34.8458016"},{"id":342,"latitude":"1.1994297","longitude":"34.9485845"},{"id":343,"latitude":"1.1994297","longitude":"34.9485845"},{"id":344,"latitude":"1.1113579","longitude":"34.837205"},{"id":345,"latitude":"1.1380116","longitude":"34.9573527"},{"id":346,"latitude":"1.0216277","longitude":"34.8217355"},{"id":347,"latitude":"1.1380116","longitude":"34.9573527"},{"id":348,"latitude":"1.1774657","longitude":"34.987936"},{"id":349,"latitude":"1.1821979","longitude":"34.9751605"},{"id":350,"latitude":"0","longitude":"0"},{"id":351,"latitude":"7.4388019","longitude":"3.8946635"},{"id":352,"latitude":"1.0671521","longitude":"34.9193871"},{"id":353,"latitude":"1.2147761","longitude":"34.8666116"},{"id":354,"latitude":"7.4478844","longitude":"3.8948576"},{"id":355,"latitude":"1.1774657","longitude":"34.987936"},{"id":356,"latitude":"1.2020903","longitude":"34.9487632"},{"id":357,"latitude":"1.2020903","longitude":"34.9487632"},{"id":358,"latitude":"1.1933599","longitude":"34.9866923"},{"id":359,"latitude":"1.1933599","longitude":"34.9866923"},{"id":360,"latitude":"1.1678492","longitude":"35.002437"},{"id":361,"latitude":"1.1578262","longitude":"35.0081681"},{"id":362,"latitude":"1.0210866","longitude":"35.0058578"},{"id":363,"latitude":"7.4376788","longitude":"3.8950172"},{"id":364,"latitude":"51.617340087890625","longitude":"5.427868366241455"},{"id":365,"latitude":"1.043526","longitude":"34.9979581"},{"id":366,"latitude":"1.0515817","longitude":"35.0450887"},{"id":367,"latitude":"1.0393325","longitude":"35.0305265"},{"id":368,"latitude":"1.0393325","longitude":"35.0305265"},{"id":369,"latitude":"1.0393325","longitude":"35.0305265"},{"id":370,"latitude":"1.0868924","longitude":"35.0760097"},{"id":371,"latitude":"1.142071","longitude":"35.1033283"},{"id":372,"latitude":"1.1713955","longitude":"35.1088063"},{"id":373,"latitude":"1.1713955","longitude":"35.1088063"},{"id":374,"latitude":"1.2054131","longitude":"35.1125191"},{"id":375,"latitude":"1.1211278","longitude":"35.0879999"},{"id":376,"latitude":"1.1153374","longitude":"34.9748742"},{"id":377,"latitude":"1.1047584","longitude":"35.0178708"},{"id":378,"latitude":"1.1933599","longitude":"34.9866923"},{"id":379,"latitude":"1.1879112","longitude":"34.9809212"},{"id":380,"latitude":"1.0882467","longitude":"34.8548943"},{"id":381,"latitude":"0","longitude":"0"},{"id":382,"latitude":"51.2830322","longitude":"-0.4419856"},{"id":383,"latitude":"0","longitude":"0"},{"id":384,"latitude":"24.80543376","longitude":"67.1117391"},{"id":385,"latitude":"52.197738","longitude":"0.1383673"},{"id":386,"latitude":"17.498266666666666","longitude":"78.38413666666666"},{"id":387,"latitude":"0","longitude":"0"},{"id":388,"latitude":"0","longitude":"0"},{"id":389,"latitude":"0","longitude":"0"},{"id":390,"latitude":"0","longitude":"0"},{"id":391,"latitude":"42.43957693637567","longitude":"19.250904625162057"},{"id":392,"latitude":"42.439576631168094","longitude":"19.250857898490022"},{"id":393,"latitude":"47.6034933","longitude":"-122.3314349"},{"id":394,"latitude":"50.96182788","longitude":"7.01388622"},{"id":395,"latitude":"0","longitude":"0"},{"id":396,"latitude":"0","longitude":"0"},{"id":397,"latitude":"0","longitude":"0"},{"id":398,"latitude":"33.7081146","longitude":"73.0482244"},{"id":399,"latitude":"54.90874565","longitude":"23.92878877"},{"id":400,"latitude":"0","longitude":"0"},{"id":401,"latitude":"0","longitude":"0"},{"id":402,"latitude":"0","longitude":"0"},{"id":403,"latitude":"45.49721479","longitude":"-117.40980894"},{"id":404,"latitude":"0","longitude":"0"},{"id":405,"latitude":"18.1905515","longitude":"-67.06121695"},{"id":406,"latitude":"32.54063808","longitude":"-84.86107067"},{"id":407,"latitude":"51.284086","longitude":"-2.7795172"},{"id":408,"latitude":"5.667551904916763","longitude":"-0.1988522708415985"},{"id":409,"latitude":"0","longitude":"0"},{"id":410,"latitude":"0","longitude":"0"},{"id":411,"latitude":"-0.103676","longitude":"34.7549987"},{"id":412,"latitude":"0","longitude":"0"},{"id":413,"latitude":"0","longitude":"0"},{"id":414,"latitude":"10.914159251553254","longitude":"-0.8069109844718155"},{"id":415,"latitude":"0","longitude":"0"},{"id":416,"latitude":"-31.4142255","longitude":"-64.256593"},{"id":417,"latitude":"41.1391579","longitude":"24.1474901"},{"id":418,"latitude":"-0.06834923","longitude":"109.35394125"},{"id":419,"latitude":"0","longitude":"0"},{"id":420,"latitude":"0","longitude":"0"},{"id":421,"latitude":"0","longitude":"0"},{"id":422,"latitude":"0","longitude":"0"},{"id":423,"latitude":"0","longitude":"0"},{"id":424,"latitude":"0","longitude":"0"},{"id":425,"latitude":"0","longitude":"0"},{"id":426,"latitude":"0","longitude":"0"},{"id":427,"latitude":"1.4385473","longitude":"103.79830217777777"},{"id":428,"latitude":"30.72254667","longitude":"76.76745983"},{"id":429,"latitude":"-33.4449646","longitude":"-70.6534417"},{"id":430,"latitude":"5.528659326955676","longitude":"-0.24524258449673653"},{"id":431,"latitude":"-23.523589","longitude":"-46.5035403"},{"id":432,"latitude":"42.9091519","longitude":"-8.5248163"},{"id":433,"latitude":"0","longitude":"0"},{"id":434,"latitude":"6.9040441","longitude":"79.9243848"},{"id":435,"latitude":"0","longitude":"0"},{"id":436,"latitude":"-0.07688894991103637","longitude":"34.678853161005236"},{"id":437,"latitude":"-0.07690866202815551","longitude":"34.67886985811702"},{"id":438,"latitude":"0","longitude":"0"},{"id":439,"latitude":"-0.07701329229587427","longitude":"34.67878085705525"},{"id":440,"latitude":"-0.07700461314162953","longitude":"34.67881849988565"},{"id":441,"latitude":"-0.07699669534406507","longitude":"34.67888348789721"},{"id":442,"latitude":"-0.07699627471561428","longitude":"34.678770188561856"}] \ No newline at end of file diff --git a/example/assets/json/many_polygons.json b/example/assets/json/many_polygons.json new file mode 100644 index 000000000..77f30d081 --- /dev/null +++ b/example/assets/json/many_polygons.json @@ -0,0 +1 @@ +[{"id":1,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7909014988425,26.1600486322945],[-81.7909042034464,26.160182208485],[-81.7901026433014,26.1601988284883],[-81.7900509269373,26.1602037433384],[-81.7899997405748,26.1602119107851],[-81.789949237096,26.1602233987689],[-81.7898997957011,26.1602379300958],[-81.789875463777,26.1602463399312],[-81.7898396364971,26.1602604526655],[-81.789793289851,26.1602818448462],[-81.7897595712933,26.160299751747],[-81.7897377588728,26.1603125954271],[-81.789695545123,26.1603403383986],[-81.7896752441735,26.1603550537301],[-81.7896459830495,26.1603784613785],[-81.7896090404221,26.1604118152686],[-81.7895666860178,26.1604564097438],[-81.7895359746114,26.1604945898063],[-81.7895082214574,26.1605344501827],[-81.7894894785174,26.1605655033389],[-81.7894673836723,26.1606081067568],[-81.7894485242141,26.1606520450804],[-81.7894331024511,26.1606971796443],[-81.7894212164532,26.160742982609],[-81.7894128662244,26.1607894539753],[-81.7894081269003,26.1608364328483],[-81.78940703152,26.1608699569814],[-81.7894277245396,26.1620342659585],[-81.7872054176208,26.1620696568853],[-81.7871723747966,26.1602355104408],[-81.7896405283304,26.160205994433],[-81.7896826589562,26.1601810030797],[-81.7897210114136,26.1601608469405],[-81.7897700172426,26.1601382251093],[-81.7898119238038,26.1601214654597],[-81.7898547834178,26.1601066492989],[-81.7898969476196,26.1600941983404],[-81.7900338907779,26.1600619923072],[-81.7909014988425,26.1600486322945]]]]}},{"id":2,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8080864361767,26.1467165168634],[-81.8081257941221,26.1469873066261],[-81.8069225839678,26.147123676475],[-81.8068830491954,26.1468526351423],[-81.8080864361767,26.1467165168634]]]]}},{"id":3,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8080342792425,26.1463576705694],[-81.8080864361767,26.1467165168634],[-81.8068830491954,26.1468526351423],[-81.806830689971,26.1464933997424],[-81.8080342792425,26.1463576705694]]]]}},{"id":4,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8079879902001,26.1460393706921],[-81.8080342792425,26.1463576705694],[-81.806830689971,26.1464933997424],[-81.8067842493501,26.1461747563829],[-81.8079879902001,26.1460393706921]]]]}},{"id":5,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7976999844426,26.1533303677159],[-81.7977516904705,26.1536905042815],[-81.7971228993846,26.153764048339],[-81.7970871149965,26.1535148779778],[-81.7971385157471,26.153508861941],[-81.7971276636916,26.1534333801329],[-81.797391190911,26.1534025757932],[-81.7973860976845,26.1533670912891],[-81.7976999844426,26.1533303677159]]]]}},{"id":6,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7973240476935,26.152852810104],[-81.7973823930421,26.1532593356747],[-81.7976847048169,26.153223960091],[-81.7976999844426,26.1533303677159],[-81.7973860976845,26.1533670912891],[-81.797391190911,26.1534025757932],[-81.7971276636916,26.1534333801329],[-81.7971385157471,26.153508861941],[-81.7970871149965,26.1535148779778],[-81.7971228993846,26.153764048339],[-81.7966482849536,26.153819565193],[-81.7966387347453,26.1538197785026],[-81.7966308768442,26.1538185610256],[-81.79662265319,26.1538158553674],[-81.7966144934441,26.1538113381843],[-81.7966080803917,26.1538059172172],[-81.7966029563228,26.1537995262194],[-81.796599274897,26.1537923477506],[-81.7965971649943,26.1537846562129],[-81.7965253587677,26.1532846657973],[-81.7970653071447,26.1532215202121],[-81.7970175230945,26.152888666755],[-81.7973240476935,26.152852810104]]]]}},{"id":7,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7976263331988,26.1528174577305],[-81.7976847048169,26.153223960091],[-81.7973823930421,26.1532593356747],[-81.7973240476935,26.152852810104],[-81.7976263331988,26.1528174577305]]]]}},{"id":8,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7970175230945,26.152888666755],[-81.7970653071447,26.1532215202121],[-81.7965253587677,26.1532846657973],[-81.7964775763696,26.1529518350545],[-81.7970175230945,26.152888666755]]]]}},{"id":9,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7908591142693,26.1579036589476],[-81.790872804473,26.1585361640091],[-81.7894165704486,26.1585658196067],[-81.789403650187,26.1579333100521],[-81.7908591142693,26.1579036589476]]]]}},{"id":10,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7908532465683,26.1576287370044],[-81.7908591142693,26.1579036589476],[-81.789403650187,26.1579333100521],[-81.789398268555,26.1576583853271],[-81.7908532465683,26.1576287370044]]]]}},{"id":11,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7894110538478,26.158301051964],[-81.7894165704486,26.1585658196067],[-81.790872804473,26.1585361640091],[-81.7908921159051,26.1594484067527],[-81.7898635247752,26.1594657447796],[-81.7898638409997,26.1595126959414],[-81.7890597733586,26.1595146968874],[-81.7890548859501,26.1592640483574],[-81.7890108564148,26.1591502545793],[-81.7893092041914,26.1586628816884],[-81.7893228373527,26.1586388949109],[-81.7893415673356,26.1586021790666],[-81.7893581575528,26.1585646037527],[-81.7893679952399,26.1585391017188],[-81.7893809204,26.1585005148124],[-81.789391478403,26.1584612530941],[-81.7893997973482,26.1584214763459],[-81.7894059051104,26.1583815512349],[-81.7894095464231,26.1583412957507],[-81.7894110538478,26.158301051964]]]]}},{"id":12,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7908921159051,26.1594484067527],[-81.7908931946507,26.1594953537172],[-81.7898638409997,26.1595126959414],[-81.7898635247752,26.1594657447796],[-81.7908921159051,26.1594484067527]]]]}},{"id":13,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8089506900192,26.1603402205757],[-81.8089805541822,26.160496867668],[-81.8093842126485,26.1604309792512],[-81.8093796770658,26.1604069322887],[-81.8096133903284,26.1603686614821],[-81.8096401702879,26.1605089794187],[-81.8094064569153,26.1605472731997],[-81.8094019189494,26.1605228823596],[-81.808997954069,26.160588589143],[-81.8090280978096,26.1607452346473],[-81.8089412100451,26.1607594784856],[-81.8088611629268,26.1603548230809],[-81.8089506900192,26.1603402205757]]],[[[-81.8103813178608,26.1601067665402],[-81.810458350446,26.160511942365],[-81.8102554684119,26.1605450660868],[-81.8101784619032,26.1601398899964],[-81.8103813178608,26.1601067665402]]]]}},{"id":14,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8102865252821,26.1596901587271],[-81.8103813178608,26.1601067665402],[-81.8088611629268,26.1603548230809],[-81.8087784556099,26.1599364039233],[-81.8102865252821,26.1596901587271]]]]}},{"id":15,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8100470142036,26.1584318260428],[-81.8101732502392,26.1590949913161],[-81.8086645809165,26.1593416283257],[-81.8085766358346,26.1588818108179],[-81.808573637221,26.1588632574684],[-81.8085724973686,26.1588490037993],[-81.8085721867752,26.1588297475717],[-81.8085732733688,26.1588104834988],[-81.8085759106754,26.1587913712017],[-81.8085813381998,26.158767956046],[-81.8085926751369,26.1587357499162],[-81.808614955253,26.1586916065875],[-81.8086240572312,26.1586698558696],[-81.8100470142036,26.1584318260428]]]]}},{"id":16,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8099747531097,26.1580522343759],[-81.8100470142036,26.1584318260428],[-81.8086240572312,26.1586698558696],[-81.8086326962794,26.1586412986819],[-81.8086372068946,26.1586175447804],[-81.8086394729575,26.1585888055806],[-81.8086384354788,26.1585599244484],[-81.8086351254985,26.158536741764],[-81.8085807719269,26.1582805032628],[-81.8099747531097,26.1580522343759]]]]}},{"id":17,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8082583466587,26.1588784851387],[-81.8082773395975,26.1588807857799],[-81.8082909588638,26.1588848360432],[-81.8083036765646,26.1588907713108],[-81.8083152631217,26.1588984553145],[-81.808325334798,26.158907500464],[-81.8083310979706,26.1589143459606],[-81.8083381113208,26.15892565504],[-81.8083442445965,26.1589419669614],[-81.8085704311054,26.1601226549958],[-81.8081693873836,26.1601881825555],[-81.807846621521,26.1601550771529],[-81.807830412207,26.1601512247901],[-81.8078166444694,26.1601440802882],[-81.8078088767411,26.1601375899103],[-81.8078024737065,26.1601300601993],[-81.807795778736,26.1601170298483],[-81.807793115846,26.160102945201],[-81.8077936846134,26.1600933130251],[-81.8078144161537,26.1599718027305],[-81.8078407026784,26.1598490461817],[-81.8078717953274,26.1597269733743],[-81.8079993094223,26.1592931140538],[-81.8080077157415,26.1592669310657],[-81.8080259291937,26.1592150845292],[-81.808046152822,26.1591637081598],[-81.8080803085449,26.1590880435841],[-81.8081186676406,26.1590140748734],[-81.8081467115338,26.1589657725607],[-81.8081764885244,26.1589182858578],[-81.8081856596953,26.1589072527569],[-81.8081923743486,26.1589010250093],[-81.8081997785272,26.1588953206931],[-81.8082120263837,26.1588883741051],[-81.8082206639855,26.1588847032934],[-81.8082344562675,26.1588806825835],[-81.8082439718035,26.158879070197],[-81.8082583466587,26.1588784851387]]]]}},{"id":18,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8085704311054,26.1601226549958],[-81.8087417674989,26.1609857106504],[-81.8087392128231,26.1610020713432],[-81.8087323830232,26.1610174014441],[-81.8087255869031,26.1610265642214],[-81.8087195326611,26.1610327882846],[-81.8087051985439,26.1610430021474],[-81.8086970458463,26.1610470141586],[-81.8086861978074,26.1610506744884],[-81.8082952729331,26.1611140822632],[-81.8082789926703,26.1611147009517],[-81.8082634497158,26.161111716094],[-81.8082537930391,26.1611076206653],[-81.8082412592089,26.161098910303],[-81.8082316545351,26.1610876157695],[-81.8082257446101,26.1610742371434],[-81.8081828475739,26.1608363439806],[-81.8081578168751,26.1606731356319],[-81.8081360101608,26.160509565288],[-81.8081173499429,26.1603454499763],[-81.8081019403509,26.1601811559321],[-81.8081693873836,26.1601881825555],[-81.8085704311054,26.1601226549958]]]]}},{"id":19,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8072288877531,26.1598939506278],[-81.8076517369433,26.1599587990772],[-81.8076382402785,26.1600168320994],[-81.8076275078962,26.160081544054],[-81.8076179694765,26.160146249311],[-81.8076039324465,26.1602660025709],[-81.8071781639091,26.1602348488925],[-81.8071936427493,26.160103051351],[-81.807204024452,26.1600316469524],[-81.8072159049588,26.1599602341508],[-81.8072288877531,26.1598939506278]]]]}},{"id":20,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.807313196257,26.1595493792746],[-81.807727246555,26.1596463046976],[-81.8076923014423,26.1597733969882],[-81.8076767364201,26.1598372648601],[-81.8076517369433,26.1599587990772],[-81.8072288877531,26.1598939506278],[-81.8072575877378,26.1597600385312],[-81.8072748351332,26.159689581461],[-81.8072934049154,26.1596193233103],[-81.807313196257,26.1595493792746]]]]}},{"id":21,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8074056460976,26.1592361252031],[-81.8078103601294,26.1593645345194],[-81.807727246555,26.1596463046976],[-81.807313196257,26.1595493792746],[-81.8074056460976,26.1592361252031]]]]}},{"id":22,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8069924008391,26.1591008846924],[-81.8070030761325,26.1591016731349],[-81.8070133811015,26.1591040226309],[-81.8072972518619,26.1591964975136],[-81.8073064242611,26.1592003893905],[-81.8073151236214,26.1592056824146],[-81.8073226891367,26.1592123344383],[-81.8073288404217,26.1592202094769],[-81.807333396022,26.1592287812461],[-81.807336127306,26.1592380510279],[-81.8073371335198,26.1592476743737],[-81.8073361571562,26.1592571483516],[-81.8072606709645,26.1595141152683],[-81.806849962094,26.1594301001188],[-81.8068982072695,26.159256851903],[-81.8069346277596,26.1591373171493],[-81.8069392415841,26.1591285105751],[-81.8069453868724,26.1591207500222],[-81.8069572094446,26.1591110547833],[-81.8069714653782,26.1591042575295],[-81.8069817372193,26.1591017927196],[-81.8069924008391,26.1591008846924]]]]}},{"id":23,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.806849962094,26.1594301001188],[-81.8072606709645,26.1595141152683],[-81.8072400977669,26.1595848890222],[-81.8072208734606,26.15965602203],[-81.8072030728384,26.1597273075374],[-81.8071814241077,26.1598226870792],[-81.8067711114165,26.1597668686826],[-81.8068205580341,26.1595466609884],[-81.806849962094,26.1594301001188]]]]}},{"id":24,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8067711114165,26.1597668686826],[-81.8071814241077,26.1598226870792],[-81.8071553620589,26.1599670845552],[-81.8071435637215,26.160039368086],[-81.8071304871386,26.1601326362143],[-81.8067078775874,26.1601026785133],[-81.8067249511333,26.1599958157383],[-81.806745973292,26.1598794623345],[-81.8067711114165,26.1597668686826]]]]}},{"id":25,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8067078775874,26.1601026785133],[-81.8071304871386,26.1601326362143],[-81.8071164816408,26.1602570432689],[-81.8071103252508,26.1603296390635],[-81.8071036711854,26.1604443529967],[-81.8066529829821,26.160432091046],[-81.8066668832694,26.1603883388455],[-81.8066746861333,26.1603556253578],[-81.8066898731529,26.1602293317753],[-81.8067078775874,26.1601026785133]]]]}},{"id":26,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8001656965713,26.1565997901511],[-81.8002670546201,26.157116785716],[-81.8001760513616,26.1571270808815],[-81.8000427578898,26.1571384821349],[-81.8000267505051,26.1571380666869],[-81.8000113073756,26.1571347135501],[-81.7999968603549,26.1571284203254],[-81.7999882608922,26.1571228053275],[-81.7999805941514,26.1571161305428],[-81.7999740647646,26.1571086011706],[-81.7999686738263,26.1571003776882],[-81.7999632466122,26.1570868355307],[-81.799879070207,26.1566454007342],[-81.8001656965713,26.1565997901511]]]]}},{"id":27,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8004368190128,26.1565568329086],[-81.8005380755012,26.1570736683465],[-81.800459878213,26.1570880192166],[-81.8003957285511,26.1570985320739],[-81.8002670546201,26.157116785716],[-81.8001656965713,26.1565997901511],[-81.8004368190128,26.1565568329086]]]]}},{"id":28,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8007082195785,26.1565137131291],[-81.8008058217498,26.1570123423593],[-81.8006650659475,26.1570469869858],[-81.8005380755012,26.1570736683465],[-81.8004368190128,26.1565568329086],[-81.8007082195785,26.1565137131291]]]]}},{"id":29,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009796950434,26.1564704319414],[-81.801067554417,26.1569335107956],[-81.8009924762699,26.156958184313],[-81.8009306715577,26.1569772587586],[-81.8008058217498,26.1570123423593],[-81.8007082195785,26.1565137131291],[-81.8009796950434,26.1564704319414]]]]}},{"id":30,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012457663617,26.1564281890648],[-81.8013250746643,26.1568368197744],[-81.8011890198836,26.1568901923713],[-81.801067554417,26.1569335107956],[-81.8009796950434,26.1564704319414],[-81.8012457663617,26.1564281890648]]]]}},{"id":31,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015172644552,26.1563845628512],[-81.8015897661623,26.1567598507559],[-81.8015220482657,26.1567760467403],[-81.8014548791647,26.1567944864054],[-81.8013885622821,26.1568149617278],[-81.8013250746643,26.1568368197744],[-81.8012457663617,26.1564281890648],[-81.8015172644552,26.1563845628512]]]]}},{"id":32,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801788867392,26.1563414399213],[-81.801860963486,26.1567167299351],[-81.8017914861392,26.1567245219315],[-81.8017222780126,26.1567345362358],[-81.8016534904233,26.156746611523],[-81.8015897661623,26.1567598507559],[-81.8015172644552,26.1563845628512],[-81.801788867392,26.1563414399213]]]]}},{"id":33,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020601663777,26.1562984786585],[-81.8021386922639,26.156707457129],[-81.8020686733416,26.1567066320295],[-81.8019986686843,26.1567078930993],[-81.8019287541839,26.1567111940637],[-81.801860963486,26.1567167299351],[-81.801788867392,26.1563414399213],[-81.8020601663777,26.1562984786585]]]]}},{"id":34,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.802332122332,26.1562550317776],[-81.8024190853365,26.1567125895128],[-81.8023669932355,26.1567142553289],[-81.8023034592843,26.1567144488165],[-81.8022398094507,26.1567125566386],[-81.8021386922639,26.156707457129],[-81.8020601663777,26.1562984786585],[-81.802332122332,26.1562550317776]]]]}},{"id":35,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8026034462934,26.1562120693585],[-81.8026926785952,26.1566818339216],[-81.8026404327095,26.1566907224414],[-81.8025459132928,26.156703124976],[-81.8024825184501,26.1567087971253],[-81.8024190853365,26.1567125895128],[-81.802332122332,26.1562550317776],[-81.8026034462934,26.1562120693585]]]]}},{"id":36,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8028901453426,26.1561662695717],[-81.8029739610087,26.1566090800251],[-81.8029081053779,26.1566300807718],[-81.8028472536169,26.1566472707724],[-81.8027858047023,26.1566625841294],[-81.8026926785952,26.1566818339216],[-81.8026034462934,26.1562120693585],[-81.8028901453426,26.1561662695717]]]]}},{"id":37,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8031772531093,26.1561208337571],[-81.8032502139674,26.1565067788623],[-81.8031863516498,26.1565294880802],[-81.8030332615557,26.156587955318],[-81.8029739610087,26.1566090800251],[-81.8028901453426,26.1561662695717],[-81.8031772531093,26.1561208337571]]]]}},{"id":38,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034641040968,26.1560750319873],[-81.8035293230261,26.1564209680913],[-81.8033985722557,26.156458494093],[-81.8032502139674,26.1565067788623],[-81.8031772531093,26.1561208337571],[-81.8034641040968,26.1560750319873]]]]}},{"id":39,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8037508811496,26.1560295968813],[-81.8038122748146,26.1563547372218],[-81.8036788223068,26.1563835207541],[-81.8036126267608,26.1563993653253],[-81.8035293230261,26.1564209680913],[-81.8034641040968,26.1560750319873],[-81.8037508811496,26.1560295968813]]]]}},{"id":40,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040377823068,26.1559837707697],[-81.8040987876773,26.1563077439092],[-81.8039634691535,26.1563274135025],[-81.8038122748146,26.1563547372218],[-81.8037508811496,26.1560295968813],[-81.8040377823068,26.1559837707697]]]]}},{"id":41,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8043247101988,26.1559381732026],[-81.8043888606491,26.1562798276522],[-81.8042524379743,26.1562903561374],[-81.8040987876773,26.1563077439092],[-81.8040377823068,26.1559837707697],[-81.8043247101988,26.1559381732026]]]]}},{"id":42,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8046116122918,26.1558925522853],[-81.8046827003939,26.1562714687222],[-81.8045458079437,26.1562727608597],[-81.8044773359551,26.1562752067286],[-81.8043888606491,26.1562798276522],[-81.8043247101988,26.1559381732026],[-81.8046116122918,26.1558925522853]]]]}},{"id":43,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8048988951875,26.1558469286717],[-81.8049803812202,26.1562823686378],[-81.804855932393,26.1562756361304],[-81.8047876042565,26.1562731292885],[-81.8046827003939,26.1562714687222],[-81.8046116122918,26.1558925522853],[-81.8048988951875,26.1558469286717]]]]}},{"id":44,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8052159676391,26.1557963234338],[-81.8052929345656,26.1562098022705],[-81.8052933815589,26.1562194058388],[-81.8052923032791,26.156228857453],[-81.8052897009851,26.1562383405153],[-81.8052857487188,26.1562473038243],[-81.8052803702715,26.1562557478059],[-81.8052738682738,26.1562633498014],[-81.8052620205934,26.1562730679698],[-81.8052481505027,26.1562805277543],[-81.8052276106934,26.1562859614746],[-81.8052170478213,26.1562867083206],[-81.805110730988,26.1562864544637],[-81.8049803812202,26.1562823686378],[-81.8048988951875,26.1558469286717],[-81.8052159676391,26.1557963234338]]]]}},{"id":45,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8051479063802,26.1554292660998],[-81.8052159676391,26.1557963234338],[-81.8048988951875,26.1558469286717],[-81.8048304538423,26.1554798732974],[-81.8051479063802,26.1554292660998]]]]}},{"id":46,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8048304538423,26.1554798732974],[-81.8048988951875,26.1558469286717],[-81.8046116122918,26.1558925522853],[-81.8045430689423,26.1555253139217],[-81.8048304538423,26.1554798732974]]]]}},{"id":47,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8045430689423,26.1555253139217],[-81.8046116122918,26.1558925522853],[-81.8043247101988,26.1559381732026],[-81.8042560673596,26.1555711186543],[-81.8045430689423,26.1555253139217]]]]}},{"id":48,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8042560673596,26.1555711186543],[-81.8043247101988,26.1559381732026],[-81.8040377823068,26.1559837707697],[-81.8039690642798,26.1556167394174],[-81.8042560673596,26.1555711186543]]]]}},{"id":49,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8039690642798,26.1556167394174],[-81.8040377823068,26.1559837707697],[-81.8037508811496,26.1560295968813],[-81.8036820620605,26.1556625200906],[-81.8039690642798,26.1556167394174]]]]}},{"id":50,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8036820620605,26.1556625200906],[-81.8037508811496,26.1560295968813],[-81.8034641040968,26.1560750319873],[-81.803395159014,26.1557079786755],[-81.8036820620605,26.1556625200906]]]]}},{"id":51,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.803395159014,26.1557079786755],[-81.8034641040968,26.1560750319873],[-81.8031772531093,26.1561208337571],[-81.8031083341351,26.155753757223],[-81.803395159014,26.1557079786755]]]]}},{"id":52,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8031083341351,26.155753757223],[-81.8031772531093,26.1561208337571],[-81.8028901453426,26.1561662695717],[-81.8028212551456,26.1557995595455],[-81.8031083341351,26.155753757223]]]]}},{"id":53,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8028212551456,26.1557995595455],[-81.8028901453426,26.1561662695717],[-81.8026034462934,26.1562120693585],[-81.8025344528371,26.1558449929385],[-81.8028212551456,26.1557995595455]]]]}},{"id":54,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8025344528371,26.1558449929385],[-81.8026034462934,26.1562120693585],[-81.802332122332,26.1562550317776],[-81.8022626481366,26.1558881183766],[-81.8025344528371,26.1558449929385]]]]}},{"id":55,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8022626481366,26.1558881183766],[-81.802332122332,26.1562550317776],[-81.8020601663777,26.1562984786585],[-81.8019909725873,26.1559315864785],[-81.8022626481366,26.1558881183766]]]]}},{"id":56,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8019909725873,26.1559315864785],[-81.8020601663777,26.1562984786585],[-81.801788867392,26.1563414399213],[-81.8017195739031,26.155974708637],[-81.8019909725873,26.1559315864785]]]]}},{"id":57,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8017195739031,26.155974708637],[-81.801788867392,26.1563414399213],[-81.8015172644552,26.1563845628512],[-81.8014479706861,26.156017670942],[-81.8017195739031,26.155974708637]]]]}},{"id":58,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8014479706861,26.156017670942],[-81.8015172644552,26.1563845628512],[-81.8012457663617,26.1564281890648],[-81.8011763971999,26.156061297432],[-81.8014479706861,26.156017670942]]]]}},{"id":59,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8011763971999,26.156061297432],[-81.8012457663617,26.1564281890648],[-81.8009796950434,26.1564704319414],[-81.8009103266816,26.1561035401638],[-81.8011763971999,26.156061297432]]]]}},{"id":60,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009103266816,26.1561035401638],[-81.8009796950434,26.1564704319414],[-81.8007082195785,26.1565137131291],[-81.8006387262704,26.1561470053126],[-81.8009103266816,26.1561035401638]]]]}},{"id":61,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8006387262704,26.1561470053126],[-81.8007082195785,26.1565137131291],[-81.8004368190128,26.1565568329086],[-81.8003672503116,26.1561901253678],[-81.8006387262704,26.1561470053126]]]]}},{"id":62,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003672503116,26.1561901253678],[-81.8004368190128,26.1565568329086],[-81.8001656965713,26.1565997901511],[-81.8000961310306,26.1562334263423],[-81.8003672503116,26.1561901253678]]]]}},{"id":63,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8000961310306,26.1562334263423],[-81.8001656965713,26.1565997901511],[-81.799879070207,26.1566454007342],[-81.7998097837079,26.1562788518145],[-81.8000961310306,26.1562334263423]]]]}},{"id":64,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7978881689797,26.1565529332335],[-81.7980560384177,26.1573818168283],[-81.7979925402313,26.1573873270996],[-81.7979293061879,26.157390589112],[-81.7978660593518,26.1573919712193],[-81.7978026968658,26.1573912905817],[-81.7977287492031,26.1573881008187],[-81.7974023284509,26.1573689311752],[-81.7973804063073,26.1573654302214],[-81.7973660047444,26.1573620710328],[-81.7973381217444,26.1573524359295],[-81.7973151828558,26.157341374949],[-81.7972881836776,26.1573234815104],[-81.7972695017754,26.1573070780754],[-81.797255398209,26.157291497561],[-81.7972470154918,26.1572803789092],[-81.7972377709421,26.1572658031718],[-81.7972314134664,26.1572536416281],[-81.7972259935703,26.1572411310007],[-81.797220650511,26.1572249746818],[-81.7971099389241,26.1566791415028],[-81.7978881689797,26.1565529332335]]]]}},{"id":65,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7985167828867,26.1564512561444],[-81.798673148116,26.1572203883004],[-81.7985322938604,26.1572742894071],[-81.7984731641535,26.1572945630623],[-81.7984133622395,26.1573131209556],[-81.7983332311174,26.1573345426677],[-81.7982718732955,26.1573484551103],[-81.7981790124643,26.1573658205851],[-81.7981164788591,26.1573749479038],[-81.7979482079989,26.1565431320566],[-81.7985167828867,26.1564512561444]]]]}},{"id":66,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7988603204782,26.1567721058886],[-81.7989363021326,26.1571448082169],[-81.7988687601859,26.1571608185772],[-81.798802121537,26.1571789101794],[-81.7987361316834,26.1571990156578],[-81.798673148116,26.1572203883004],[-81.7985909046577,26.1568158989854],[-81.7988603204782,26.1567721058886]]]]}},{"id":67,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7991298895951,26.1567284719236],[-81.7992060882605,26.1571030757671],[-81.7991368874075,26.1571104981356],[-81.7990680828976,26.1571201650389],[-81.798999749687,26.1571318926522],[-81.7989363021326,26.1571448082169],[-81.7988603204782,26.1567721058886],[-81.7991298895951,26.1567284719236]]]]}},{"id":68,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7993992033738,26.1566846783912],[-81.7994829638233,26.1570951654452],[-81.7994134238722,26.1570938320228],[-81.7993436716996,26.1570949069951],[-81.7992741865226,26.1570978833259],[-81.7992060882605,26.1571030757671],[-81.7991298895951,26.1567284719236],[-81.7993992033738,26.1566846783912]]]]}},{"id":69,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7996687987148,26.1566412266877],[-81.7997472598208,26.1570269827127],[-81.799746925747,26.1570450504079],[-81.7997425313251,26.1570600226897],[-81.7997336637725,26.1570746988455],[-81.7997269557949,26.1570819578479],[-81.7997190745853,26.1570885355793],[-81.7997020911765,26.15709773159],[-81.7996843142544,26.1571023238403],[-81.7996670713459,26.1571032678585],[-81.7994829638233,26.1570951654452],[-81.7993992033738,26.1566846783912],[-81.7996687987148,26.1566412266877]]]]}},{"id":70,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7995941923292,26.1562767705502],[-81.7996687987148,26.1566412266877],[-81.7993992033738,26.1566846783912],[-81.7993251081922,26.1563205631574],[-81.7995941923292,26.1562767705502]]]]}},{"id":71,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7993251081922,26.1563205631574],[-81.7993992033738,26.1566846783912],[-81.7991298895951,26.1567284719236],[-81.7990554892858,26.1563641977489],[-81.7993251081922,26.1563205631574]]]]}},{"id":72,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7990554892858,26.1563641977489],[-81.7991298895951,26.1567284719236],[-81.7988603204782,26.1567721058886],[-81.7987862753629,26.1564076461828],[-81.7990554892858,26.1563641977489]]]]}},{"id":73,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7987862753629,26.1564076461828],[-81.7988603204782,26.1567721058886],[-81.7985909046577,26.1568158989854],[-81.7985167828867,26.1564512561444],[-81.7987862753629,26.1564076461828]]]]}},{"id":74,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8097525688888,26.1568859693712],[-81.8099747531097,26.1580522343759],[-81.8085807719269,26.1582805032628],[-81.8083778218065,26.1573228706454],[-81.808351066896,26.1571158141731],[-81.8097525688888,26.1568859693712]]]]}},{"id":75,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7920393123991,26.1467542664236],[-81.7920577869508,26.1471429711261],[-81.7919065607514,26.1471605158119],[-81.7918886241371,26.1467724042076],[-81.7920393123991,26.1467542664236]]]]}},{"id":76,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7923208781771,26.1471698381767],[-81.7923338660251,26.147336463492],[-81.7919153352823,26.1473540797557],[-81.791909093953,26.1472159375589],[-81.7923208781771,26.1471698381767]]]]}},{"id":77,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7923338660251,26.147336463492],[-81.7923553393801,26.1476123544748],[-81.7919279199124,26.1476304094317],[-81.7919153352823,26.1473540797557],[-81.7923338660251,26.147336463492]]]]}},{"id":78,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7923682186177,26.1477779257653],[-81.7923875758886,26.1480263168689],[-81.7919473567571,26.1480450384015],[-81.7919400735744,26.1479068560959],[-81.791935897683,26.1477962369806],[-81.7923682186177,26.1477779257653]]]]}},{"id":79,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795130210561,26.1599882037653],[-81.7951455163553,26.160042454341],[-81.7951694480105,26.1601174513442],[-81.7951962712201,26.1601917675143],[-81.7952169497743,26.1602440855353],[-81.79521870462,26.160255607722],[-81.7952182110291,26.1602652394511],[-81.7952155119717,26.1602755711457],[-81.7952090140034,26.1602876432843],[-81.7951994559185,26.1602980128568],[-81.7951893156304,26.160304946714],[-81.7950916987254,26.1603519112998],[-81.7950313879124,26.1603594201995],[-81.7949594292548,26.160372587371],[-81.7949036789952,26.1603857796636],[-81.7948392549892,26.1604048889198],[-81.7947316404767,26.1601349995898],[-81.795130210561,26.1599882037653]]]]}},{"id":80,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7947316404767,26.1601349995898],[-81.7948392549892,26.1604048889198],[-81.7947774418847,26.1604268953642],[-81.7947424801479,26.1604411879413],[-81.7946910929883,26.1604646728613],[-81.7946516997668,26.1604848360541],[-81.794482764016,26.160227000213],[-81.7947316404767,26.1601349995898]]]]}},{"id":81,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937948820906,26.1601372549467],[-81.7939999046191,26.1604571372862],[-81.7938845460091,26.1605478733051],[-81.793602542326,26.1602084922134],[-81.7937948820906,26.1601372549467]]]]}},{"id":82,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939926488618,26.1600646348565],[-81.7941251690304,26.1603586204179],[-81.7939999046191,26.1604571372862],[-81.7937948820906,26.1601372549467],[-81.7939926488618,26.1600646348565]]]]}},{"id":83,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7941624602608,26.1600017976824],[-81.7942947035072,26.1602961055781],[-81.7941251690304,26.1603586204179],[-81.7939926488618,26.1600646348565],[-81.7941624602608,26.1600017976824]]]]}},{"id":84,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7943319181501,26.1599393061537],[-81.7944642391964,26.1602337968704],[-81.7942947035072,26.1602961055781],[-81.7941624602608,26.1600017976824],[-81.7943319181501,26.1599393061537]]]]}},{"id":85,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945441018269,26.1598611264254],[-81.7946765236791,26.1601554329765],[-81.7944642391964,26.1602337968704],[-81.7943319181501,26.1599393061537],[-81.7945441018269,26.1598611264254]]]]}},{"id":86,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7947985049067,26.1597675362203],[-81.794902695252,26.1600719942027],[-81.7946765236791,26.1601554329765],[-81.7945441018269,26.1598611264254],[-81.7947985049067,26.1597675362203]]]]}},{"id":87,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950256759553,26.159689250142],[-81.7950361515924,26.1596905678772],[-81.7950443720536,26.1596927463323],[-81.7950575488035,26.1596990241381],[-81.7950664614678,26.159705875715],[-81.7950726037339,26.159712536252],[-81.7950807050543,26.1597271184372],[-81.7950831570365,26.1597365504933],[-81.7950915311084,26.1598100973587],[-81.7950983142321,26.1598513270654],[-81.7951151226022,26.15992861018],[-81.795130210561,26.1599882037653],[-81.794902695252,26.1600719942027],[-81.7947985049067,26.1597675362203],[-81.795003871609,26.1596919382575],[-81.7950150087451,26.1596896529287],[-81.7950256759553,26.159689250142]]]]}},{"id":88,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7960777565379,26.1598650131958],[-81.7961101119579,26.160028183467],[-81.7959974511666,26.1600482247704],[-81.7959413086178,26.1600597230907],[-81.7958297520596,26.1600852604474],[-81.795738632719,26.1601088048345],[-81.795702232619,26.159926054924],[-81.7960777565379,26.1598650131958]]]]}},{"id":89,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.796045124108,26.1597021883365],[-81.7960777565379,26.1598650131958],[-81.795702232619,26.159926054924],[-81.7956695996,26.1597630694919],[-81.796045124108,26.1597021883365]]]]}},{"id":90,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7960124651264,26.1595391802017],[-81.796045124108,26.1597021883365],[-81.7956695996,26.1597630694919],[-81.7956370693812,26.1596002439626],[-81.7960124651264,26.1595391802017]]]]}},{"id":91,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959798318011,26.1593761948387],[-81.7960124651264,26.1595391802017],[-81.7956370693812,26.1596002439626],[-81.795604409908,26.1594370752419],[-81.7959798318011,26.1593761948387]]]]}},{"id":92,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959417821509,26.1591862323385],[-81.7959798318011,26.1593761948387],[-81.795604409908,26.1594370752419],[-81.7956117599257,26.159239800536],[-81.7959417821509,26.1591862323385]]]]}},{"id":93,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959039866676,26.1589962684164],[-81.7959417821509,26.1591862323385],[-81.7956117599257,26.159239800536],[-81.7956038842981,26.159045040124],[-81.7959039866676,26.1589962684164]]]]}},{"id":94,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958659383695,26.1588064663579],[-81.7959039866676,26.1589962684164],[-81.7956038842981,26.159045040124],[-81.7955258183994,26.1588618325418],[-81.7958659383695,26.1588064663579]]]]}},{"id":95,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795827864955,26.1586166873474],[-81.7958659383695,26.1588064663579],[-81.7955258183994,26.1588618325418],[-81.7954478035584,26.1586786246265],[-81.795827864955,26.1586166873474]]]]}},{"id":96,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7957899197781,26.1584270680944],[-81.795827864955,26.1586166873474],[-81.7954478035584,26.1586786246265],[-81.7953698639344,26.1584952328349],[-81.7957899197781,26.1584270680944]]]]}},{"id":97,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7957195996357,26.1580749663097],[-81.7957899197781,26.1584270680944],[-81.7955798785977,26.1584610589853],[-81.7955097635304,26.1581091393657],[-81.7957195996357,26.1580749663097]]]]}},{"id":98,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7955097635304,26.1581091393657],[-81.7955798785977,26.1584610589853],[-81.7953698639344,26.1584952328349],[-81.7952998487526,26.1581429686592],[-81.7955097635304,26.1581091393657]]]]}},{"id":99,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7952998487526,26.1581429686592],[-81.7953698639344,26.1584952328349],[-81.7950033438699,26.1585197932115],[-81.7949397576931,26.1582013553562],[-81.7952998487526,26.1581429686592]]]]}},{"id":100,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949397576931,26.1582013553562],[-81.7950033438699,26.1585197932115],[-81.7948199558985,26.1585319476629],[-81.7947598898431,26.1582305473885],[-81.7949397576931,26.1582013553562]]]]}},{"id":101,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7947598898431,26.1582305473885],[-81.7948199558985,26.1585319476629],[-81.7946363660533,26.1585443093311],[-81.7945800473008,26.1582597390579],[-81.7947598898431,26.1582305473885]]]]}},{"id":102,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945800473008,26.1582597390579],[-81.7946363660533,26.1585443093311],[-81.7944569719791,26.1585872770296],[-81.7943977174618,26.1582892881183],[-81.7945800473008,26.1582597390579]]]]}},{"id":103,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7943977174618,26.1582892881183],[-81.7944569719791,26.1585872770296],[-81.7942797842962,26.1586297050341],[-81.79421774771,26.1583184800398],[-81.7943977174618,26.1582892881183]]]]}},{"id":104,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.79421774771,26.1583184800398],[-81.7942797842962,26.1586297050341],[-81.7941022152724,26.1586721119992],[-81.7940379047242,26.1583476481126],[-81.79421774771,26.1583184800398]]]]}},{"id":105,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7940379047242,26.1583476481126],[-81.7941022152724,26.1586721119992],[-81.7939249257077,26.1587145401327],[-81.7938579603396,26.1583768623735],[-81.7940379047242,26.1583476481126]]]]}},{"id":106,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7938579603396,26.1583768623735],[-81.7939249257077,26.1587145401327],[-81.7937472548017,26.1587569472256],[-81.7936777108632,26.1584060551663],[-81.7938579603396,26.1583768623735]]]]}},{"id":107,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7936777108632,26.1584060551663],[-81.7937472548017,26.1587569472256],[-81.7935283948903,26.158809393497],[-81.7934556151202,26.1584419893555],[-81.7936777108632,26.1584060551663]]]]}},{"id":108,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7934556151202,26.1584419893555],[-81.7935283948903,26.158809393497],[-81.7933109804479,26.1588614875824],[-81.7932352190899,26.1584775928746],[-81.7934556151202,26.1584419893555]]]]}},{"id":109,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7932352190899,26.1584775928746],[-81.7933109804479,26.1588614875824],[-81.793123975624,26.1589061691758],[-81.7930864379826,26.1588926431181],[-81.7930114755547,26.1585140856889],[-81.7932352190899,26.1584775928746]]]]}},{"id":110,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7930114755547,26.1585140856889],[-81.7930864379826,26.1588926431181],[-81.7930281211914,26.1588756091424],[-81.7929658946202,26.1588627004642],[-81.7929153956772,26.1588559401869],[-81.7928490633979,26.1588519952869],[-81.792789557354,26.1585500408057],[-81.7930114755547,26.1585140856889]]]]}},{"id":111,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.792789557354,26.1585500408057],[-81.7928490633979,26.1588519952869],[-81.7927979284727,26.1588526207098],[-81.792759712473,26.158855238353],[-81.792709071998,26.1588613633129],[-81.792666547322,26.1588692318261],[-81.7926096098263,26.1585788867143],[-81.792789557354,26.1585500408057]]]]}},{"id":112,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7926096098263,26.1585788867143],[-81.792666547322,26.1588692318261],[-81.7924880818212,26.1589069418767],[-81.7924292857992,26.1586084222576],[-81.7926096098263,26.1585788867143]]]]}},{"id":113,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7924292857992,26.1586084222576],[-81.7924880818212,26.1589069418767],[-81.7923097181236,26.1589446970002],[-81.7922493393199,26.1586374511227],[-81.7924292857992,26.1586084222576]]]]}},{"id":114,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7922493393199,26.1586374511227],[-81.7923097181236,26.1589446970002],[-81.792196219776,26.1589685686108],[-81.7921776544403,26.1589693585292],[-81.7921594156415,26.1589658365209],[-81.7921438488683,26.1589592276992],[-81.7921293730638,26.1589486466397],[-81.7921233601881,26.1589423062281],[-81.7921168970268,26.1589332400738],[-81.7921113019313,26.1589210511793],[-81.7920610949468,26.1586678780521],[-81.7922493393199,26.1586374511227]]]]}},{"id":115,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7935727292951,26.1587986719076],[-81.7937115501369,26.1591531484079],[-81.7935977532281,26.1591891965829],[-81.7935795863002,26.159192552222],[-81.7935609992629,26.1591938926678],[-81.793531846009,26.159191783628],[-81.7935037007975,26.1591847169667],[-81.7934866835931,26.1591777723915],[-81.7934730160941,26.1591702820541],[-81.7934582631893,26.1591600694773],[-81.7934414936006,26.1591446637616],[-81.793402690809,26.1590981080938],[-81.7933693018876,26.1590632149537],[-81.7933332849755,26.1590303996422],[-81.7932947694168,26.159000005338],[-81.7932540611387,26.1589721908373],[-81.7932113381197,26.1589469780842],[-81.793166779268,26.1589245265749],[-81.793123975624,26.1589061691758],[-81.7935727292951,26.1587986719076]]]]}},{"id":116,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937472548017,26.1587569472256],[-81.7938810386187,26.159099071169],[-81.7937115501369,26.1591531484079],[-81.7935727292951,26.1587986719076],[-81.7937472548017,26.1587569472256]]]]}},{"id":117,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939249257077,26.1587145401327],[-81.794053540802,26.1590436244688],[-81.7938810386187,26.159099071169],[-81.7937472548017,26.1587569472256],[-81.7939249257077,26.1587145401327]]]]}},{"id":118,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7941022152724,26.1586721119992],[-81.7942260947108,26.1589883377624],[-81.794053540802,26.1590436244688],[-81.7939249257077,26.1587145401327],[-81.7941022152724,26.1586721119992]]]]}},{"id":119,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7942797842962,26.1586297050341],[-81.7943986507812,26.1589333947328],[-81.7942260947108,26.1589883377624],[-81.7941022152724,26.1586721119992],[-81.7942797842962,26.1586297050341]]]]}},{"id":120,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7944569719791,26.1585872770296],[-81.7945710773375,26.1588781083203],[-81.7943986507812,26.1589333947328],[-81.7942797842962,26.1586297050341],[-81.7944569719791,26.1585872770296]]]]}},{"id":121,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7946363660533,26.1585443093311],[-81.7947577755925,26.1588182723284],[-81.7945710773375,26.1588781083203],[-81.7944569719791,26.1585872770296],[-81.7946363660533,26.1585443093311]]]]}},{"id":122,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949747004706,26.158521670806],[-81.7949438028663,26.1587981479862],[-81.7949066225061,26.1587961293879],[-81.7948842431303,26.1587964134056],[-81.7948545327149,26.1587982968672],[-81.7948103726125,26.158804730687],[-81.794781558538,26.1588114236892],[-81.7947577755925,26.1588182723284],[-81.7946363660533,26.1585443093311],[-81.7949747004706,26.158521670806]]]]}},{"id":123,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953220746178,26.1584984313336],[-81.7951084366195,26.158845040191],[-81.7950886582361,26.1588355203905],[-81.795068303813,26.1588272188564],[-81.7950334702566,26.1588153749189],[-81.7949903376954,26.1588047460254],[-81.7949438028663,26.1587981479862],[-81.7949747004706,26.158521670806],[-81.7953220746178,26.1584984313336]]]]}},{"id":124,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953698639344,26.1584952328349],[-81.7954882579554,26.158773820011],[-81.7952392747977,26.1589469812441],[-81.7952101049442,26.1589161919559],[-81.795183271473,26.1588927719972],[-81.7951482211825,26.1588677008658],[-81.7951297775197,26.1588564542359],[-81.7951084366195,26.158845040191],[-81.7953220746178,26.1584984313336],[-81.7953698639344,26.1584952328349]]]]}},{"id":125,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7954882579554,26.158773820011],[-81.7956038842981,26.159045040124],[-81.7953180553731,26.1591007707227],[-81.7953063579302,26.1590616315223],[-81.7952960758461,26.1590364007083],[-81.7952871096488,26.1590179029294],[-81.7952659854366,26.1589822547167],[-81.7952392747977,26.1589469812441],[-81.7954882579554,26.158773820011]]]]}},{"id":126,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7956038842981,26.159045040124],[-81.7956117599257,26.159239800536],[-81.7953112249362,26.1592885740353],[-81.7953183905777,26.159262582],[-81.7953224469072,26.1592426138019],[-81.7953253600748,26.1592226519174],[-81.7953274389338,26.1591957938541],[-81.7953274591713,26.1591688096035],[-81.7953261034517,26.1591487108127],[-81.7953224920711,26.1591219071028],[-81.7953180553731,26.1591007707227],[-81.7956038842981,26.159045040124]]]]}},{"id":127,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7956117599257,26.159239800536],[-81.795604409908,26.1594370752419],[-81.7952674609421,26.1594920565057],[-81.7952730724165,26.1594504144612],[-81.7952844714041,26.1593893448874],[-81.7952993029747,26.1593287148786],[-81.7953112249362,26.1592885740353],[-81.7956117599257,26.159239800536]]]]}},{"id":128,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795604409908,26.1594370752419],[-81.7956370693812,26.1596002439626],[-81.7952612642723,26.1596609421926],[-81.7952602982934,26.1596158975443],[-81.7952610589228,26.1595744656999],[-81.795263446473,26.1595331853537],[-81.7952674609421,26.1594920565057],[-81.795604409908,26.1594370752419]]]]}},{"id":129,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7956370693812,26.1596002439626],[-81.7956695996,26.1597630694919],[-81.7952811592737,26.1598262448481],[-81.7952737145034,26.1597848583217],[-81.7952678977508,26.1597437837703],[-81.7952638327679,26.1597025390604],[-81.7952612642723,26.1596609421926],[-81.7956370693812,26.1596002439626]]]]}},{"id":130,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7956695996,26.1597630694919],[-81.795738632719,26.1601088048345],[-81.7954648459558,26.160194915205],[-81.7954476073656,26.1601965694143],[-81.795430445821,26.1601946008567],[-81.7954118313438,26.1601881697141],[-81.7954007098935,26.1601815366966],[-81.7953869284739,26.1601685219616],[-81.7953782753534,26.1601549974487],[-81.795354501242,26.1600920129408],[-81.7953426320116,26.1600575287177],[-81.7953209221395,26.1599879988347],[-81.7953055029971,26.1599320294396],[-81.7952966775799,26.1598968406144],[-81.7952811592737,26.1598262448481],[-81.7956695996,26.1597630694919]]]]}},{"id":131,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7938253944683,26.1596195276824],[-81.7939520088519,26.1599006385414],[-81.7937485404515,26.1599753533601],[-81.7937316183458,26.1599787250846],[-81.7937196034626,26.1599789517947],[-81.7937077803274,26.1599774809079],[-81.7936963276977,26.1599744489959],[-81.7936878183337,26.1599708735578],[-81.7936777950996,26.1599650826213],[-81.7936636099154,26.1599524367619],[-81.7936569687529,26.1599433716621],[-81.7936534950311,26.1599368568394],[-81.7936482204703,26.1599195078472],[-81.7936475801351,26.1599074751189],[-81.7936523638418,26.1598560482023],[-81.7936553202585,26.1597973866757],[-81.7936549235412,26.1597387665557],[-81.7936515005701,26.1596834415618],[-81.7938253944683,26.1596195276824]]]]}},{"id":132,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939951314419,26.1595570350149],[-81.7941215429268,26.15983814684],[-81.7939520088519,26.1599006385414],[-81.7938253944683,26.1596195276824],[-81.7939951314419,26.1595570350149]]]]}},{"id":133,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7941645633862,26.1594945438322],[-81.7942912546422,26.1597756539618],[-81.7941215429268,26.15983814684],[-81.7939951314419,26.1595570350149],[-81.7941645633862,26.1594945438322]]]]}},{"id":134,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7943342745851,26.1594320509122],[-81.7944607121351,26.1597131622887],[-81.7942912546422,26.1597756539618],[-81.7941645633862,26.1594945438322],[-81.7943342745851,26.1594320509122]]]]}},{"id":135,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945036299479,26.1593695597581],[-81.7946305250941,26.1596506684572],[-81.7944607121351,26.1597131622887],[-81.7943342745851,26.1594320509122],[-81.7945036299479,26.1593695597581]]]]}},{"id":136,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7946733418632,26.1593072269232],[-81.7947998541104,26.1595880166157],[-81.7946305250941,26.1596506684572],[-81.7945036299479,26.1593695597581],[-81.7946733418632,26.1593072269232]]]]}},{"id":137,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948426980987,26.1592449187803],[-81.7949695904871,26.1595255228122],[-81.7947998541104,26.1595880166157],[-81.7946733418632,26.1593072269232],[-81.7948426980987,26.1592449187803]]]]}},{"id":138,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7951391888967,26.1591354600057],[-81.7951428471367,26.159154193439],[-81.7951447815111,26.1591734636937],[-81.7951449866462,26.1591887314114],[-81.7951430343643,26.1592117830243],[-81.7951384377789,26.1592345053453],[-81.7951217501872,26.159291179355],[-81.795109969254,26.1593371426602],[-81.7950999944548,26.1593834628111],[-81.7950888303073,26.1594492080204],[-81.79508489456,26.1594607387044],[-81.7950795234642,26.1594703973648],[-81.7950725461885,26.159479216624],[-81.7950651495536,26.1594861353234],[-81.7950533892444,26.1594939263848],[-81.795043892103,26.159498288946],[-81.7949695904871,26.1595255228122],[-81.7948426980987,26.1592449187803],[-81.7951391888967,26.1591354600057]]]]}},{"id":139,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949042113003,26.1589613718475],[-81.7949212121553,26.158962149196],[-81.794942263513,26.1589645777951],[-81.7949589759987,26.1589677869085],[-81.7949833845897,26.1589745300204],[-81.7950030461447,26.158981803712],[-81.795021981568,26.1589906403916],[-81.7950365175227,26.1589988135721],[-81.7950569348332,26.1590126399777],[-81.7950726975526,26.15902564381],[-81.7950870962562,26.1590398014819],[-81.795097644109,26.1590517794992],[-81.7951115955896,26.1590711668119],[-81.7951266441093,26.1590987327199],[-81.7951338044603,26.1591169195134],[-81.7951391888967,26.1591354600057],[-81.7948568383327,26.1592396823341],[-81.794760002062,26.1589931181986],[-81.7948409235363,26.1589680946724],[-81.7948702319657,26.1589631183944],[-81.7949042113003,26.1589613718475]]]]}},{"id":140,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794760002062,26.1589931181986],[-81.7948568383327,26.1592396823341],[-81.7946588218013,26.1593126488573],[-81.794558674893,26.159057345042],[-81.794760002062,26.1589931181986]]]]}},{"id":141,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794558674893,26.159057345042],[-81.7946588218013,26.1593126488573],[-81.7944608534947,26.1593852709527],[-81.7943577053202,26.1591218906015],[-81.794558674893,26.159057345042]]]]}},{"id":142,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7943577053202,26.1591218906015],[-81.7944608534947,26.1593852709527],[-81.7942627360859,26.1594584209045],[-81.7941562771683,26.1591862779292],[-81.7943577053202,26.1591218906015]]]]}},{"id":143,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7941562771683,26.1591862779292],[-81.7942627360859,26.1594584209045],[-81.7940733338365,26.1595280606717],[-81.7939637734659,26.1592480480379],[-81.7941562771683,26.1591862779292]]]]}},{"id":144,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939637734659,26.1592480480379],[-81.7940733338365,26.1595280606717],[-81.793889381503,26.1595959506816],[-81.7937766155925,26.1593077021396],[-81.7939637734659,26.1592480480379]]]]}},{"id":145,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937766155925,26.1593077021396],[-81.793889381503,26.1595959506816],[-81.7936515005701,26.1596834415618],[-81.7935949628108,26.1594263147914],[-81.7935941882923,26.1594094682981],[-81.7935975143052,26.1593941581885],[-81.793604531908,26.1593800198967],[-81.7936140045452,26.1593682753262],[-81.7936249193303,26.159359411509],[-81.7936350934152,26.1593537155898],[-81.7937766155925,26.1593077021396]]]]}},{"id":146,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793038115504,26.1597036487619],[-81.7934653088447,26.1598897718088],[-81.7934599317886,26.1599248556056],[-81.7934518388218,26.1599565383625],[-81.7934380903115,26.1599934106776],[-81.7934233286776,26.1600232273024],[-81.7934059146535,26.1600515224843],[-81.7933814639658,26.1600836392579],[-81.7933582854065,26.160108527264],[-81.7933328077801,26.1601315479841],[-81.7929476117164,26.1597882175629],[-81.7929690344043,26.1597741604605],[-81.7929967246301,26.1597514944384],[-81.7930211179257,26.1597259120133],[-81.793038115504,26.1597036487619]]]]}},{"id":147,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7929476117164,26.1597882175629],[-81.7933328077801,26.1601315479841],[-81.7933064211607,26.1601516391533],[-81.7932709793378,26.1601738435609],[-81.7932395589981,26.1601896523219],[-81.7932000339095,26.1602053681635],[-81.7931658060835,26.1602155066745],[-81.7931307976865,26.1602229212583],[-81.7930880514909,26.1602281546092],[-81.7930579583768,26.1602298564046],[-81.7928171299331,26.1598327938535],[-81.7928581056289,26.159824979672],[-81.7928834859205,26.1598176181703],[-81.7929176914918,26.1598042014024],[-81.7929476117164,26.1597882175629]]]]}},{"id":148,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7928171299331,26.1598327938535],[-81.7930579583768,26.1602298564046],[-81.7929660418688,26.1602332971558],[-81.7929126972976,26.1602340952813],[-81.7928061952632,26.1602333061174],[-81.7927529095433,26.1602315361245],[-81.7926988824652,26.1602290824068],[-81.7925925879869,26.16022141408],[-81.7925396105221,26.1602163867899],[-81.7924348330072,26.1602038725672],[-81.7925521173317,26.1598641713983],[-81.79258384194,26.159867068898],[-81.7926124869586,26.1598653751739],[-81.7928171299331,26.1598327938535]]]]}},{"id":149,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7924655074908,26.159825788139],[-81.7924856971062,26.159839776647],[-81.7925051232163,26.1598498031198],[-81.7925287074838,26.1598586145418],[-81.7925521173317,26.1598641713983],[-81.7924348330072,26.1602038725672],[-81.7923654860617,26.1601937768982],[-81.792260872473,26.1601754383892],[-81.7922088763458,26.1601652471805],[-81.7921056516589,26.1601419030029],[-81.7924655074908,26.159825788139]]]]}},{"id":150,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7924125272482,26.1597526470461],[-81.7924220984092,26.1597742596444],[-81.7924330897014,26.1597917377093],[-81.7924484575614,26.159810246294],[-81.7924655074908,26.159825788139],[-81.7921056516589,26.1601419030029],[-81.792096284484,26.1601392033847],[-81.7920867037046,26.1601349688849],[-81.7920718998304,26.1601247335215],[-81.7920609457203,26.1601127575152],[-81.7920558333873,26.1601043487905],[-81.7920524520731,26.160096457847],[-81.7920450272763,26.1600691477185],[-81.792036884077,26.1600332671384],[-81.7920273706843,26.1599788238639],[-81.7920228312679,26.1599423961578],[-81.7920196382525,26.1599059610458],[-81.7920178666096,26.1598693347061],[-81.7924125272482,26.1597526470461]]]]}},{"id":151,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7920232255437,26.1596208538849],[-81.7924116638081,26.159651180394],[-81.7924050117674,26.1596818464154],[-81.7924037448399,26.1597048942277],[-81.7924064850357,26.1597306940608],[-81.7924125272482,26.1597526470461],[-81.7920178666096,26.1598693347061],[-81.7920175154087,26.1598323795865],[-81.7920232255437,26.1596208538849]]]]}},{"id":152,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7920294670473,26.1593864448953],[-81.7924405237284,26.159538430962],[-81.7924116638081,26.159651180394],[-81.7920232255437,26.1596208538849],[-81.7920294670473,26.1593864448953]]]]}},{"id":153,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7921383887795,26.1591814127335],[-81.7924879964063,26.1594319067256],[-81.7924723392655,26.1594532913412],[-81.7924597412449,26.1594762410287],[-81.7924502759232,26.1595003656385],[-81.7924405237284,26.159538430962],[-81.7920294670473,26.1593864448953],[-81.7920314695245,26.1593594497299],[-81.7920383075354,26.1593262149644],[-81.7920476480904,26.1592986521344],[-81.7920601191673,26.1592719432807],[-81.7920785171826,26.159242611163],[-81.7920940090863,26.159223084521],[-81.7921149974585,26.1592011433166],[-81.7921383887795,26.1591814127335]]]]}},{"id":154,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7923961000135,26.1590960849218],[-81.7925995381939,26.1593590523383],[-81.7925696112048,26.1593702674909],[-81.7925384784747,26.1593872666784],[-81.7925255828948,26.1593962559472],[-81.7925106265247,26.1594085579309],[-81.792499443518,26.1594190967545],[-81.7924879964063,26.1594319067256],[-81.7921383887795,26.1591814127335],[-81.7921591729629,26.1591668548863],[-81.7921816453911,26.1591540072148],[-81.7922052967542,26.1591426891103],[-81.7922299021374,26.1591334520386],[-81.7922553077267,26.1591260905097],[-81.7923961000135,26.1590960849218]]]]}},{"id":155,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7928400940952,26.1590171133855],[-81.7928877951346,26.1590196018922],[-81.7929351142096,26.1590257148274],[-81.7928635089297,26.159342834685],[-81.7928274759052,26.1593376912706],[-81.7928004047905,26.1593354330621],[-81.7927733417353,26.159334366967],[-81.792729704227,26.159335478396],[-81.7927026644161,26.1593378510912],[-81.7926668778687,26.1593428625906],[-81.792631590411,26.1593503015123],[-81.7925995381939,26.1593590523383],[-81.7923961000135,26.1590960849218],[-81.792725711591,26.1590266843252],[-81.7927731224772,26.1590200727616],[-81.7928016885952,26.1590180126183],[-81.7928400940952,26.1590171133855]]]]}},{"id":156,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7929351142096,26.1590257148274],[-81.7929599152119,26.1590303927645],[-81.7929968396147,26.1590396350303],[-81.7930329408984,26.1590511285881],[-81.7930593795396,26.1590612997794],[-81.7930937040048,26.1590767693414],[-81.7931185608379,26.1590897003786],[-81.7931504963235,26.1591087824992],[-81.793180946964,26.1591299361501],[-81.792981048666,26.1593793508505],[-81.7929613451714,26.1593696240088],[-81.7929427263026,26.1593625047795],[-81.7929070394482,26.159352201082],[-81.7928635089297,26.159342834685],[-81.7929351142096,26.1590257148274]]]]}},{"id":157,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793180946964,26.1591299361501],[-81.7932010453143,26.1591454611183],[-81.7932350644664,26.1591758802152],[-81.793254071901,26.159195377419],[-81.7932775022573,26.1592227597969],[-81.7933036500909,26.1592575323653],[-81.7933324170519,26.1593001771145],[-81.7933502448832,26.1593293098106],[-81.7933748354824,26.1593742243277],[-81.7930652795103,26.1594679323765],[-81.79305717272,26.1594525018331],[-81.79304967564,26.1594408278294],[-81.7930296957083,26.1594165214513],[-81.793005723096,26.1593953550222],[-81.792981048666,26.1593793508505],[-81.793180946964,26.1591299361501]]]]}},{"id":158,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7933748354824,26.1593742243277],[-81.7934015144131,26.1594311635926],[-81.7934141993042,26.1594623879743],[-81.7934256683951,26.1594941463563],[-81.7934448778432,26.1595585090058],[-81.7934526183538,26.1595911361992],[-81.7934591153301,26.1596239536537],[-81.793081829925,26.1595899232826],[-81.7930837754854,26.1595658171231],[-81.7930837794271,26.1595513735905],[-81.79308127359,26.1595226837793],[-81.7930759653141,26.1594965771376],[-81.7930717869589,26.1594835322111],[-81.7930652795103,26.1594679323765],[-81.7933748354824,26.1593742243277]]]]}},{"id":159,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793081829925,26.1595899232826],[-81.7934591153301,26.1596239536537],[-81.7934649080221,26.1596615665654],[-81.7934686637356,26.159694743017],[-81.7934711757564,26.1597280868048],[-81.7934723413832,26.1597614380114],[-81.7934722876331,26.1597947959369],[-81.7934708874867,26.1598281612812],[-81.7934653088447,26.1598897718088],[-81.793038115504,26.1597036487619],[-81.793053466156,26.1596782766146],[-81.7930658619136,26.1596517285768],[-81.7930763128566,26.159619345066],[-81.793081829925,26.1595899232826]]]]}},{"id":160,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7918730276831,26.1601316734823],[-81.7918995345696,26.160234695657],[-81.7919140527601,26.1602966770639],[-81.7915154935602,26.1603028346314],[-81.7915128506043,26.1601370926534],[-81.7918730276831,26.1601316734823]]]]}},{"id":161,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7918414262803,26.1599664346534],[-81.7918470454308,26.1600085192026],[-81.7918542639395,26.1600504344728],[-81.7918631326157,26.1600921801845],[-81.7918730276831,26.1601316734823],[-81.7915128506043,26.1601370926534],[-81.7915101071307,26.1599715117075],[-81.7918414262803,26.1599664346534]]]]}},{"id":162,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7918351599759,26.1597871173629],[-81.7918348999466,26.1598765310161],[-81.7918370920615,26.1599190012307],[-81.7918414262803,26.1599664346534],[-81.7915101071307,26.1599715117075],[-81.7915072709881,26.1597921984659],[-81.7918351599759,26.1597871173629]]]]}},{"id":163,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7918402226525,26.1596075772874],[-81.7918351599759,26.1597871173629],[-81.7915072709881,26.1597921984659],[-81.7915043584962,26.1596128627131],[-81.7918402226525,26.1596075772874]]]]}},{"id":164,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7918449309088,26.1594282225662],[-81.7918402226525,26.1596075772874],[-81.7915043584962,26.1596128627131],[-81.7915014206173,26.1594335270953],[-81.7918449309088,26.1594282225662]]]]}},{"id":165,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7918674451524,26.159263534407],[-81.7918567458858,26.1593005732236],[-81.7918496607367,26.1593386009188],[-81.7918466155682,26.1593692012316],[-81.7918449309088,26.1594282225662],[-81.7915014206173,26.1594335270953],[-81.7914987802111,26.1592681519022],[-81.7918674451524,26.159263534407]]]]}},{"id":166,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7919342458114,26.1590960349602],[-81.7919274745652,26.159124110957],[-81.7919171110246,26.1591544305515],[-81.7919042474015,26.1591832049114],[-81.7918835577156,26.1592230498155],[-81.7918674451524,26.159263534407],[-81.7914987802111,26.1592681519022],[-81.7914961395094,26.1591027308543],[-81.7919342458114,26.1590960349602]]]]}},{"id":167,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7919267284229,26.158930847082],[-81.7919366030627,26.1589823767574],[-81.7919402881298,26.1590202076697],[-81.7919395029484,26.1590581777969],[-81.7919342458114,26.1590960349602],[-81.7914961395094,26.1591027308543],[-81.791493500369,26.1589375390562],[-81.7919267284229,26.158930847082]]]]}},{"id":168,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.791880869918,26.1586970684753],[-81.7919267284229,26.158930847082],[-81.791493500369,26.1589375390562],[-81.7914906029639,26.1587604270415],[-81.791880869918,26.1586970684753]]]]}},{"id":169,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7925333704343,26.1563606676101],[-81.7926133585051,26.1567653566048],[-81.7920704593398,26.1568533081905],[-81.7920632763613,26.1564366865696],[-81.7925333704343,26.1563606676101]]],[[[-81.7924005040351,26.1556192998906],[-81.7924354104613,26.1558639598734],[-81.7924907574079,26.156144776637],[-81.7920593883308,26.1562145528691],[-81.7920501367103,26.1556759063012],[-81.7924005040351,26.1556192998906]]],[[[-81.7949559819517,26.1542306751769],[-81.7949678034308,26.1542319854979],[-81.7949779056201,26.1542344974715],[-81.7949888081829,26.1542389079025],[-81.7949978100655,26.1542439936848],[-81.7950095110628,26.1542537644418],[-81.7950151694517,26.1542602901049],[-81.7950211256034,26.1542695194178],[-81.7950253856931,26.1542796292893],[-81.7950299434751,26.1543036766576],[-81.7950751160494,26.1546155218756],[-81.792484863637,26.1549190127398],[-81.7925349304696,26.1552681328756],[-81.7925147205865,26.1552773458015],[-81.7924919453335,26.1552903785944],[-81.7924741200464,26.1553028568426],[-81.7924514662181,26.1553225834182],[-81.7924341663209,26.1553413864083],[-81.792419265118,26.1553617810336],[-81.7924085897529,26.1553797222263],[-81.7923970706662,26.1554043854438],[-81.7924001694996,26.1553968027399],[-81.7920462498541,26.1554539330536],[-81.7920310496302,26.1545722740168],[-81.7949479801679,26.1542307193445],[-81.7949559819517,26.1542306751769]]]]}},{"id":170,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7966040409477,26.1557023727827],[-81.7966908026231,26.1561336391678],[-81.796092336923,26.156230671022],[-81.7960058542979,26.1557990358829],[-81.7966040409477,26.1557023727827]]]]}},{"id":171,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7965208119112,26.1552861951425],[-81.7966040409477,26.1557023727827],[-81.7960058542979,26.1557990358829],[-81.7959221447996,26.155382883448],[-81.7959186443681,26.1553574546992],[-81.7965208119112,26.1552861951425]]]]}},{"id":172,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7964415833215,26.1547444972178],[-81.7965208119112,26.1552861951425],[-81.7959186443681,26.1553574546992],[-81.7958391354865,26.1548152306465],[-81.7964415833215,26.1547444972178]]]]}},{"id":173,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7964217130653,26.1546091131915],[-81.7964415833215,26.1547444972178],[-81.7958391354865,26.1548152306465],[-81.7958196457035,26.1546796610142],[-81.7964217130653,26.1546091131915]]]]}},{"id":174,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7962935537627,26.1540741967378],[-81.7963049965355,26.1540758529362],[-81.7963150273544,26.1540790759231],[-81.7963292833502,26.1540872505356],[-81.7963353144352,26.1540925360695],[-81.7963416668476,26.1541002500052],[-81.79634637386,26.1541088213085],[-81.7963489124818,26.1541160519549],[-81.7964217130653,26.1546091131915],[-81.7958196457035,26.1546796610142],[-81.7957405211959,26.1541377786102],[-81.7962744581262,26.1540753339962],[-81.7962935537627,26.1540741967378]]]]}},{"id":175,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7956798616135,26.1541420799881],[-81.7957074408089,26.1543317566803],[-81.7952257895858,26.154387720443],[-81.7952075125554,26.1542623003241],[-81.7952056532387,26.154242846232],[-81.7952084295383,26.1542289376151],[-81.7952157538143,26.1542151414437],[-81.7952261727702,26.1542044232235],[-81.7952374544071,26.1541972996553],[-81.7952451557787,26.1541941620911],[-81.7952574319273,26.1541913431587],[-81.7956798616135,26.1541420799881]]]]}},{"id":176,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7957074408089,26.1543317566803],[-81.7957351193794,26.1545210889185],[-81.7952533692064,26.1545775577088],[-81.7952257895858,26.154387720443],[-81.7957074408089,26.1543317566803]]]]}},{"id":177,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7957351193794,26.1545210889185],[-81.7957627991365,26.1547105816219],[-81.7952809478366,26.1547672344849],[-81.7952533692064,26.1545775577088],[-81.7957351193794,26.1545210889185]]]]}},{"id":178,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7957627991365,26.1547105816219],[-81.7957905576879,26.1549004406975],[-81.7953084249541,26.1549569118098],[-81.7952809478366,26.1547672344849],[-81.7957627991365,26.1547105816219]]]]}},{"id":179,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7957905576879,26.1549004406975],[-81.7958183415848,26.155090276695],[-81.7953363098555,26.1551467702807],[-81.7953084249541,26.1549569118098],[-81.7957905576879,26.1549004406975]]]]}},{"id":180,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958183415848,26.155090276695],[-81.7958459212697,26.1552799533256],[-81.7953637895002,26.1553367914614],[-81.7953363098555,26.1551467702807],[-81.7958183415848,26.155090276695]]]]}},{"id":181,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958459212697,26.1552799533256],[-81.7958621972119,26.1553911242865],[-81.7958757115451,26.1554584526634],[-81.7953969462155,26.155536066392],[-81.7953813795314,26.1554582490957],[-81.7953637895002,26.1553367914614],[-81.7958459212697,26.1552799533256]]]]}},{"id":182,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958757115451,26.1554584526634],[-81.7959132677218,26.1556470424552],[-81.7954348041559,26.1557243107598],[-81.7953969462155,26.155536066392],[-81.7958757115451,26.1554584526634]]]]}},{"id":183,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959132677218,26.1556470424552],[-81.7959512315617,26.1558357904605],[-81.795472589438,26.1559130598886],[-81.7954348041559,26.1557243107598],[-81.7959132677218,26.1556470424552]]]]}},{"id":184,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959512315617,26.1558357904605],[-81.7959891956878,26.1560245613735],[-81.7955104512142,26.1561018315042],[-81.795472589438,26.1559130598886],[-81.7959512315617,26.1558357904605]]]]}},{"id":185,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959891956878,26.1560245613735],[-81.7960271597888,26.1562133093435],[-81.7959464637854,26.1562263189287],[-81.795952262185,26.1562534544381],[-81.7955534508003,26.1563177193527],[-81.7955104512142,26.1561018315042],[-81.7959891956878,26.1560245613735]]]]}},{"id":186,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7952405892361,26.1559936200146],[-81.7952511625804,26.1559944098981],[-81.7952640363278,26.155997273363],[-81.7952750394344,26.1560014998033],[-81.7952861339839,26.1560079725065],[-81.7952950243915,26.1560153285769],[-81.7953008847077,26.1560216467745],[-81.7953072475763,26.1560308967515],[-81.7953113969758,26.1560396545754],[-81.7953158839454,26.1560569849379],[-81.795368549817,26.1563197723449],[-81.7951064656698,26.1563621428636],[-81.795039019369,26.1560249955397],[-81.7952188837724,26.1559958032293],[-81.7952405892361,26.1559936200146]]]]}},{"id":187,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795039019369,26.1560249955397],[-81.7951064656698,26.1563621428636],[-81.7948820917424,26.1563986419952],[-81.7948146448169,26.1560613111507],[-81.795039019369,26.1560249955397]]]]}},{"id":188,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948146448169,26.1560613111507],[-81.7948820917424,26.1563986419952],[-81.7946573076459,26.1564346157399],[-81.7945902458005,26.1560977870328],[-81.7948146448169,26.1560613111507]]]]}},{"id":189,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945902458005,26.1560977870328],[-81.7946573076459,26.1564346157399],[-81.7944328316538,26.1564710918129],[-81.7943655915191,26.156134103492],[-81.7945902458005,26.1560977870328]]]]}},{"id":190,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7943655915191,26.156134103492],[-81.7944328316538,26.1564710918129],[-81.7941707721868,26.1565134605031],[-81.7941166234609,26.1562413956794],[-81.794115915126,26.1562305784121],[-81.7941167653722,26.1562210822708],[-81.7941223901759,26.1562038795195],[-81.7941302828752,26.156191455841],[-81.7941399459139,26.1561816130621],[-81.7941525383575,26.1561729462917],[-81.7941669771942,26.1561668370742],[-81.7941772490748,26.1561643731764],[-81.7943655915191,26.156134103492]]]]}},{"id":191,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7938650559207,26.1562161653218],[-81.7938756303648,26.1562171157836],[-81.7938871819132,26.1562198032506],[-81.7938980579797,26.1562240304968],[-81.7939092540892,26.156230502747],[-81.7939240300881,26.1562441770186],[-81.7939302658478,26.1562534277586],[-81.7939344151539,26.1562621856241],[-81.7939388257219,26.1562795164536],[-81.7939911861281,26.1565426499859],[-81.7937290236217,26.1565848579618],[-81.7936620648579,26.1562478677326],[-81.7938550491854,26.156216518524],[-81.7938650559207,26.1562161653218]]]]}},{"id":192,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7936620648579,26.1562478677326],[-81.7937290236217,26.1565848579618],[-81.7935045459281,26.1566211721227],[-81.7934375877827,26.1562841817765],[-81.7936620648579,26.1562478677326]]]]}},{"id":193,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7934375877827,26.1562841817765],[-81.7935045459281,26.1566211721227],[-81.7932796881259,26.1566576485132],[-81.7932130839156,26.1563203122104],[-81.7934375877827,26.1562841817765]]]]}},{"id":194,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7932130839156,26.1563203122104],[-81.7932796881259,26.1566576485132],[-81.7930552101348,26.1566939619796],[-81.7929883271111,26.156356627099],[-81.7932130839156,26.1563203122104]]]]}},{"id":195,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7929883271111,26.156356627099],[-81.7930552101348,26.1566939619796],[-81.7927930238281,26.1567365122864],[-81.792739069769,26.1564627263609],[-81.7927385150616,26.1564520687227],[-81.7927395942023,26.1564425942541],[-81.7927425717486,26.1564321005817],[-81.792745574706,26.1564253666692],[-81.7927553864174,26.1564111901075],[-81.7927665716006,26.1564010180725],[-81.7927787160611,26.1563937065333],[-81.7927934390814,26.1563882836741],[-81.7929883271111,26.156356627099]]]]}},{"id":196,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7928627731592,26.1558368473641],[-81.7929341875207,26.1561982299187],[-81.7927628990537,26.1562259966076],[-81.7927443248606,26.1562254110673],[-81.7927278104667,26.1562213752535],[-81.7927105014483,26.1562125293055],[-81.7926979565628,26.1562019376656],[-81.7926878525231,26.1561878936565],[-81.7926824272718,26.15617451168],[-81.7926222741933,26.1558704971899],[-81.7928627731592,26.1558368473641]]]]}},{"id":197,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793073198597,26.1558076499572],[-81.7931437427321,26.1561642226848],[-81.7929341875207,26.1561982299187],[-81.7928627731592,26.1558368473641],[-81.793073198597,26.1558076499572]]]]}},{"id":198,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7932834450164,26.1557782927471],[-81.7933532748917,26.1561305820943],[-81.7931437427321,26.1561642226848],[-81.793073198597,26.1558076499572],[-81.7932834450164,26.1557782927471]]]]}},{"id":199,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7934938691419,26.1557489342525],[-81.7935628310849,26.1560967576587],[-81.7933532748917,26.1561305820943],[-81.7932834450164,26.1557782927471],[-81.7934938691419,26.1557489342525]]]]}},{"id":200,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937043960059,26.1557197582956],[-81.7937723605049,26.1560627496578],[-81.7935628310849,26.1560967576587],[-81.7934938691419,26.1557489342525],[-81.7937043960059,26.1557197582956]]]]}},{"id":201,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939148453068,26.1556903990505],[-81.7939819176808,26.1560291080204],[-81.7937723605049,26.1560627496578],[-81.7937043960059,26.1557197582956],[-81.7939148453068,26.1556903990505]]]]}},{"id":202,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7941249630158,26.1556608579181],[-81.7941914468417,26.155995099415],[-81.7939819176808,26.1560291080204],[-81.7939148453068,26.1556903990505],[-81.7941249630158,26.1556608579181]]]]}},{"id":203,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7943354133309,26.1556316814659],[-81.7944008998194,26.1559611138531],[-81.7941914468417,26.155995099415],[-81.7941249630158,26.1556608579181],[-81.7943354133309,26.1556316814659]]]]}},{"id":204,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945458368877,26.1556023214456],[-81.7946104298079,26.1559272651208],[-81.7944008998194,26.1559611138531],[-81.7943354133309,26.1556316814659],[-81.7945458368877,26.1556023214456]]]]}},{"id":205,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794756261418,26.1555731215976],[-81.7948198848567,26.1558936228351],[-81.7946104298079,26.1559272651208],[-81.7945458368877,26.1556023214456],[-81.794756261418,26.1555731215976]]]]}},{"id":206,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949663280209,26.1555436024526],[-81.7950294390574,26.155859635806],[-81.7948198848567,26.1558936228351],[-81.794756261418,26.1555731215976],[-81.7949663280209,26.1555436024526]]]]}},{"id":207,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795206446826,26.1555102947257],[-81.7952561446632,26.1557587926342],[-81.7952565102722,26.1557677547642],[-81.7952554059371,26.155777229388],[-81.7952529033586,26.1557865512495],[-81.7952495262033,26.1557942731055],[-81.7952405726374,26.1558075738976],[-81.7952295923509,26.1558179513253],[-81.7952199050325,26.1558241948945],[-81.79520546614,26.1558302812903],[-81.7951952959234,26.1558327446993],[-81.7950294390574,26.155859635806],[-81.7949663280209,26.1555436024526],[-81.795206446826,26.1555102947257]]]]}},{"id":208,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795085989126,26.1551252721036],[-81.7950978106967,26.1551265824117],[-81.7951092628825,26.1551296142242],[-81.7951212117062,26.1551347066532],[-81.7951299113185,26.1551401609136],[-81.7951394932719,26.1551483614476],[-81.7951466897051,26.1551569190452],[-81.7951517004203,26.1551653282268],[-81.795155782737,26.155175439074],[-81.7951971123891,26.1554561716253],[-81.7949567165916,26.1554898247571],[-81.7949068529056,26.1551455189855],[-81.7950779872815,26.1551253162798],[-81.795085989126,26.1551252721036]]]]}},{"id":209,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949068529056,26.1551455189855],[-81.7949567165916,26.1554898247571],[-81.7947463684766,26.1555190244732],[-81.794695813391,26.1551700684129],[-81.7949068529056,26.1551455189855]]]]}},{"id":210,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794695813391,26.1551700684129],[-81.7947463684766,26.1555190244732],[-81.7945362245577,26.1555483832407],[-81.7944851560621,26.1551947988338],[-81.794695813391,26.1551700684129]]]]}},{"id":211,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7944851560621,26.1551947988338],[-81.7945362245577,26.1555483832407],[-81.7943257998525,26.1555775598421],[-81.794274118682,26.1552196915275],[-81.7944851560621,26.1551947988338]]]]}},{"id":212,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794274118682,26.1552196915275],[-81.7943257998525,26.1555775598421],[-81.794115477887,26.1556069189809],[-81.7940633837083,26.1552442383527],[-81.794274118682,26.1552196915275]]]]}},{"id":213,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7940633837083,26.1552442383527],[-81.794115477887,26.1556069189809],[-81.7939053325412,26.155636116357],[-81.7938522421943,26.1552687871119],[-81.7940633837083,26.1552442383527]]]]}},{"id":214,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7938522421943,26.1552687871119],[-81.7939053325412,26.155636116357],[-81.7936948833345,26.1556654755863],[-81.7936412299237,26.1552936787439],[-81.7938522421943,26.1552687871119]]]]}},{"id":215,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7936412299237,26.1552936787439],[-81.7936948833345,26.1556654755863],[-81.7934844594167,26.1556948343704],[-81.7934304703416,26.1553183852663],[-81.7936412299237,26.1552936787439]]]]}},{"id":216,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7934304703416,26.1553183852663],[-81.7934844594167,26.1556948343704],[-81.7932739337739,26.1557241934089],[-81.7932194313872,26.1553431159466],[-81.7934304703416,26.1553183852663]]]]}},{"id":217,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7932194313872,26.1553431159466],[-81.7932739337739,26.1557241934089],[-81.7930637889047,26.1557535271183],[-81.7930085954021,26.1553678222752],[-81.7932194313872,26.1553431159466]]]]}},{"id":218,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7930085954021,26.1553678222752],[-81.7930637889047,26.1557535271183],[-81.7928532619495,26.1557827250689],[-81.7927975562526,26.1553925523412],[-81.7930085954021,26.1553678222752]]]]}},{"id":219,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7927975562526,26.1553925523412],[-81.7928532619495,26.1557827250689],[-81.792612763091,26.1558163748766],[-81.7925654491688,26.1554837465319],[-81.7925663861201,26.1554682661755],[-81.7925706876997,26.1554544638428],[-81.7925788774504,26.155440869374],[-81.792589193908,26.1554299684947],[-81.7926040899866,26.1554200970166],[-81.7926212710753,26.1554137894516],[-81.7927975562526,26.1553925523412]]]]}},{"id":220,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.79272588054,26.1548908626153],[-81.7927743552687,26.155229835104],[-81.7925953259065,26.1552509497276],[-81.7925646846487,26.1552578128158],[-81.7925349304696,26.1552681328756],[-81.792484863637,26.1549190127398],[-81.79272588054,26.1548908626153]]]]}},{"id":221,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7929368923203,26.1548659723353],[-81.7929853930474,26.1552049446005],[-81.7927743552687,26.155229835104],[-81.79272588054,26.1548908626153],[-81.7929368923203,26.1548659723353]]]]}},{"id":222,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793147550691,26.1548414275872],[-81.7931961525383,26.1551802387316],[-81.7929853930474,26.1552049446005],[-81.7929368923203,26.1548659723353],[-81.793147550691,26.1548414275872]]]]}},{"id":223,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7933584871534,26.1548166975906],[-81.7934071658038,26.1551555082314],[-81.7931961525383,26.1551802387316],[-81.793147550691,26.1548414275872],[-81.7933584871534,26.1548166975906]]]]}},{"id":224,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7935695252838,26.1547919896525],[-81.7936182045296,26.1551308002094],[-81.7934071658038,26.1551555082314],[-81.7933584871534,26.1548166975906],[-81.7935695252838,26.1547919896525]]]]}},{"id":225,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937801833635,26.1547674439848],[-81.7938289635732,26.1551060704949],[-81.7936182045296,26.1551308002094],[-81.7935695252838,26.1547919896525],[-81.7937801833635,26.1547674439848]]]]}},{"id":226,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939911195337,26.1547427130675],[-81.7940399767013,26.1550813619987],[-81.7938289635732,26.1551060704949],[-81.7937801833635,26.1547674439848],[-81.7939911195337,26.1547427130675]]]]}},{"id":227,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7942020557616,26.1547180047685],[-81.7942509133687,26.1550566306901],[-81.7940399767013,26.1550813619987],[-81.7939911195337,26.1547427130675],[-81.7942020557616,26.1547180047685]]]]}},{"id":228,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7944126881478,26.1546934583215],[-81.7944616722752,26.1550319229808],[-81.7942509133687,26.1550566306901],[-81.7942020557616,26.1547180047685],[-81.7944126881478,26.1546934583215]]]]}},{"id":229,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7946235732207,26.1546687267638],[-81.7946726087476,26.1550071910585],[-81.7944616722752,26.1550319229808],[-81.7944126881478,26.1546934583215],[-81.7946235732207,26.1546687267638]]]]}},{"id":230,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794834177525,26.1546438130386],[-81.7948833431442,26.1549826433537],[-81.7946726087476,26.1550071910585],[-81.7946235732207,26.1546687267638],[-81.794834177525,26.1546438130386]]]]}},{"id":231,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950751160494,26.1546155218756],[-81.7951150857975,26.1548905762848],[-81.7951139588628,26.1549079605777],[-81.7951117271715,26.1549160200003],[-81.7951072224516,26.1549260407004],[-81.7950978855623,26.1549389997074],[-81.7950865219714,26.1549490353471],[-81.7950731352531,26.1549566749024],[-81.7950607678207,26.1549610303807],[-81.7950535386332,26.1549626292725],[-81.7948833431442,26.1549826433537],[-81.794834177525,26.1546438130386],[-81.7950751160494,26.1546155218756]]]]}},{"id":232,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7968211318668,26.1567816609297],[-81.7969953341261,26.1576462986198],[-81.7962162574436,26.1577725068692],[-81.7961490289412,26.1574381101404],[-81.7961453682682,26.1574190328505],[-81.7961451686148,26.1574045904458],[-81.7961479633856,26.1573934099336],[-81.7961555428578,26.1573797727913],[-81.7961671271205,26.1573685436854],[-81.7961796535962,26.1573613902336],[-81.7961896404971,26.1573581024238],[-81.796274599216,26.1573442208515],[-81.796182515051,26.156884761543],[-81.7968211318668,26.1567816609297]]]]}},{"id":233,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7973392286047,26.1593537033845],[-81.7974322999544,26.1598153800591],[-81.7966512050629,26.1599419688647],[-81.7965588225572,26.1594802878306],[-81.7973392286047,26.1593537033845]]]]}},{"id":234,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7973121129424,26.1592178553395],[-81.7973392286047,26.1593537033845],[-81.7965588225572,26.1594802878306],[-81.796531504377,26.1593444178196],[-81.7973121129424,26.1592178553395]]]]}},{"id":235,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7972847188436,26.1590821463845],[-81.7973121129424,26.1592178553395],[-81.796531504377,26.1593444178196],[-81.7965041887556,26.1592089146048],[-81.7972847188436,26.1590821463845]]]]}},{"id":236,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7972027188291,26.1586756145387],[-81.7972847188436,26.1590821463845],[-81.7965041887556,26.1592089146048],[-81.7964227477188,26.1588020123649],[-81.7972027188291,26.1586756145387]]]]}},{"id":237,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7971209480519,26.1582690813447],[-81.7972027188291,26.1586756145387],[-81.7964227477188,26.1588020123649],[-81.796341105304,26.1583952945696],[-81.7971209480519,26.1582690813447]]]]}},{"id":238,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7964395892517,26.1579600691582],[-81.7965209487982,26.1583662841093],[-81.796341105304,26.1583952945696],[-81.7962597465102,26.15798910243],[-81.7964395892517,26.1579600691582]]]]}},{"id":239,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7970390276418,26.1578628698668],[-81.7971209480519,26.1582690813447],[-81.7965209487982,26.1583662841093],[-81.7964395892517,26.1579600691582],[-81.7970390276418,26.1578628698668]]]]}},{"id":240,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7970556624746,26.1601011769377],[-81.7971976536763,26.1608081224296],[-81.796476114212,26.1609254394438],[-81.7963342264582,26.1602181487128],[-81.7970556624746,26.1601011769377]]]]}},{"id":241,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7935886040093,26.1475968763179],[-81.7937611316731,26.1488318335042],[-81.7935780077834,26.1488545307423],[-81.793560063566,26.1489957406057],[-81.7935369582845,26.1490874811484],[-81.7934981498899,26.149193591241],[-81.79344739932,26.1492955028269],[-81.793385308742,26.1493921121179],[-81.7933124806403,26.1494823611747],[-81.7932297719868,26.1495652594337],[-81.7931380402272,26.1496398851072],[-81.7930554494268,26.1496951565019],[-81.792949883798,26.1497525718411],[-81.7928383802831,26.1497996571287],[-81.7927221549253,26.1498359242072],[-81.7926025255351,26.1498609072885],[-81.7924807100257,26.1498743933266],[-81.7923581296807,26.1498761910869],[-81.7922562917495,26.1498687729361],[-81.7921357264295,26.149849215093],[-81.7920538828839,26.1498271286742],[-81.7919524361179,26.1497910962063],[-81.7918449848257,26.1497423496848],[-81.7918305772728,26.1494932894062],[-81.7918181800337,26.149207100476],[-81.7919999878707,26.1491849858538],[-81.7919473567571,26.1480450384015],[-81.7923875758886,26.1480263168689],[-81.7923682186177,26.1477779257653],[-81.7930564678218,26.1477487588305],[-81.7934197323353,26.1477021897665],[-81.7934082281063,26.1476199708438],[-81.7935886040093,26.1475968763179]]]]}},{"id":242,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7928475439659,26.146983025981],[-81.7928520244972,26.1470408671691],[-81.7929017315844,26.1470928424868],[-81.792947154063,26.1470896578952],[-81.7930170252367,26.1475843884667],[-81.7923553393801,26.1476123544748],[-81.7923208781771,26.1471698381767],[-81.7923538972902,26.1471655756821],[-81.7924084439174,26.1471480580179],[-81.792450371685,26.1471238923631],[-81.7925289696684,26.1470568591987],[-81.7925835986346,26.1470252184472],[-81.7926438075596,26.147003611594],[-81.792707366439,26.1469928303965],[-81.7928475439659,26.146983025981]]]]}},{"id":243,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8074945833635,26.1560033124706],[-81.8075682355329,26.1560042750477],[-81.8076317881248,26.1560068532057],[-81.8077807425759,26.156015990669],[-81.8078258355545,26.1560198644422],[-81.8081315602175,26.1560368798666],[-81.8081386818096,26.1560749890451],[-81.8081435482707,26.1561176273328],[-81.8081451162331,26.1561497839457],[-81.8081442680113,26.1561925918583],[-81.8081401660144,26.1562350970634],[-81.8081047308213,26.1564973419847],[-81.8081014129265,26.1565541028623],[-81.808101303477,26.156582463143],[-81.8081024652795,26.1566109767732],[-81.8081072953782,26.1566630837691],[-81.8081957206182,26.1573479652118],[-81.8082242011458,26.1574810522269],[-81.8081750238729,26.1575186520121],[-81.8081277585953,26.1575572268762],[-81.8076962578622,26.1579243800201],[-81.8076274248684,26.1579888905497],[-81.807561198399,26.1580556331941],[-81.8074975762452,26.158124287003],[-81.8074366350918,26.1581949203282],[-81.8073784241692,26.1582673036353],[-81.8073503782047,26.1583042573668],[-81.8072965034125,26.1583791840615],[-81.8072454855594,26.1584558141835],[-81.8071975266137,26.1585339631943],[-81.8071746563443,26.1585736390198],[-81.807131284269,26.1586538485791],[-81.8070910714639,26.1587353930623],[-81.80705391427,26.1588179750128],[-81.8070201184805,26.1589017302761],[-81.8070067295626,26.1589385330213],[-81.8067624674592,26.158861173251],[-81.8067060737691,26.1590205738256],[-81.8066685040862,26.1591392666964],[-81.8066331236046,26.1592586121525],[-81.8066001090514,26.1593784487224],[-81.8065695117138,26.1594988448987],[-81.8065411772852,26.1596195264332],[-81.8065152597708,26.1597407217261],[-81.8064851260998,26.1598990122284],[-81.806465671694,26.1600549732231],[-81.8064530868422,26.1601791888612],[-81.8064406216967,26.1603355921539],[-81.8064360024344,26.160369479961],[-81.8064299621799,26.1603962227642],[-81.8064240772273,26.160415995145],[-81.8063900490611,26.1605030300005],[-81.8063729494438,26.1605581256144],[-81.8063629238281,26.1606001137019],[-81.8063576050995,26.1606283426616],[-81.806353379678,26.1606567030556],[-81.8063489122578,26.1607015945649],[-81.8032580889051,26.1612061652165],[-81.8031840844354,26.1611950461651],[-81.803089453524,26.161143462798],[-81.8030833870127,26.1611256829995],[-81.8030800331925,26.1611219188867],[-81.8030790626319,26.1611174536968],[-81.8030587557753,26.1610754286525],[-81.8030554019574,26.161071664539],[-81.803037642474,26.1610380621146],[-81.8030330462211,26.161034648822],[-81.8030308998616,26.1610291355852],[-81.803024184224,26.1610204381667],[-81.8030219641653,26.1610152921594],[-81.8030115743261,26.1610005627218],[-81.8030094292242,26.160995232887],[-81.8029897974401,26.1609664553927],[-81.8029805944252,26.1609580928093],[-81.8029738690628,26.1609479740199],[-81.802966197348,26.1609406345739],[-81.8029514443588,26.1609305605483],[-81.802942342965,26.1609221973957],[-81.8029337211324,26.1609170870844],[-81.8029233760494,26.1609088913487],[-81.8028994701113,26.1608940538591],[-81.8028725677771,26.160879416482],[-81.8028420448032,26.1608702786412],[-81.8028368083085,26.1608698263877],[-81.8028169543612,26.1608642513912],[-81.8027937914982,26.1608614689063],[-81.8027714503286,26.1608562516627],[-81.8027656152642,26.1608537164621],[-81.8027424464409,26.1608500628077],[-81.8027174598203,26.1608443559277],[-81.8026987467029,26.1608384306624],[-81.8026834902572,26.1608364523534],[-81.8026758436921,26.1608364949782],[-81.8026581431569,26.1608374648406],[-81.8026487300892,26.1608392367737],[-81.8026322175726,26.1608393288161],[-81.8026041768909,26.1608439557168],[-81.80259961706,26.1608458610785],[-81.8025730882266,26.1608523824186],[-81.8025584223593,26.1608550318913],[-81.8025538614289,26.1608567767745],[-81.8025355894653,26.1608596297528],[-81.8025310043856,26.1608615581793],[-81.8025004858804,26.1608679183325],[-81.8024998964023,26.1608634510143],[-81.802495056028,26.1608651974531],[-81.8024910704544,26.1608693463759],[-81.8024831069825,26.160875053521],[-81.8024554749645,26.1608874271614],[-81.8024492822214,26.1608883099407],[-81.8024325498566,26.1608934010909],[-81.8024115429009,26.1609012442739],[-81.8023871823072,26.1609053462495],[-81.8023825461017,26.1609072291039],[-81.8023569408719,26.1609113609361],[-81.8023426607558,26.1609146960226],[-81.8023085507203,26.1609271057308],[-81.802302078531,26.1609279900609],[-81.8022810715599,26.1609358332252],[-81.802276225376,26.1609367314207],[-81.8022719521935,26.1609396897791],[-81.8022578906728,26.1609452704042],[-81.8022451813602,26.1609516917627],[-81.8022171053612,26.1609697305961],[-81.8022052567991,26.1609794255983],[-81.8021894692219,26.1609963642881],[-81.8021709773815,26.1610227865503],[-81.8021336914939,26.1610611663368],[-81.8021211833542,26.1610784306433],[-81.8020805253179,26.1610583674621],[-81.7992464874817,26.1615213468774],[-81.7989635004999,26.1609432976128],[-81.7979982559079,26.1610834560895],[-81.7973545469087,26.1578926008699],[-81.797348025734,26.1578563677313],[-81.7973460910262,26.1578370975106],[-81.7973457581266,26.1578180247567],[-81.7973468719654,26.1577987605826],[-81.7973494107233,26.1577798324119],[-81.7973534736748,26.1577608958018],[-81.7973589624792,26.1577424327468],[-81.7973658754214,26.1577241910681],[-81.7973764978535,26.1577022835838],[-81.7973891332149,26.1576812590746],[-81.797397713883,26.1576691753074],[-81.7974069573709,26.1576574317625],[-81.7974239031665,26.1576389281902],[-81.7974425361678,26.1576219742546],[-81.7974585565358,26.1576093449098],[-81.7974799009726,26.1575951270984],[-81.7974933638777,26.1575874639713],[-81.7975214449858,26.1575739195591],[-81.7975560639058,26.1575616915789],[-81.7975921322126,26.1575533988692],[-81.7976236318478,26.1575494415807],[-81.797644863146,26.1575484757146],[-81.7976662052558,26.1575488618772],[-81.7977462639748,26.1575541041017],[-81.7978159128333,26.1575564694004],[-81.7978856480221,26.1575565874196],[-81.7979552931188,26.1575546654728],[-81.7980247946616,26.1575503141108],[-81.7981101995034,26.157542275165],[-81.7981776880669,26.157533303794],[-81.7982462803163,26.157522262916],[-81.7983143239488,26.1575090012058],[-81.7983818442079,26.1574934955981],[-81.7984699887826,26.1574699660686],[-81.7985029969042,26.1574599706351],[-81.7985684717029,26.1574388135121],[-81.7986008850754,26.1574272852994],[-81.7987439955193,26.157372660898],[-81.7987983865382,26.1573541328817],[-81.7988883896691,26.1573274977534],[-81.7989493809801,26.1573120051754],[-81.7990378111886,26.157293150661],[-81.7991311685373,26.1572778452375],[-81.7991938891941,26.1572700920139],[-81.799220646586,26.1572673757841],[-81.7992868364905,26.1572654494458],[-81.7993153005746,26.1572634115116],[-81.7993460891534,26.1572632406171],[-81.7993856069147,26.1572728107455],[-81.7994229383167,26.157274689799],[-81.7994331163352,26.1573143643907],[-81.7995695720786,26.1573196134818],[-81.7997062778776,26.1573205509306],[-81.7998428783861,26.1573172245627],[-81.7999111673785,26.157313910707],[-81.8001278048639,26.157297759329],[-81.8001958429946,26.1572911912133],[-81.8002912375191,26.1572803443276],[-81.8004262831115,26.1572613674608],[-81.8004935539989,26.1572503328626],[-81.8005755824079,26.1572352499628],[-81.8007088383495,26.1572071810846],[-81.8007751133359,26.1571916812864],[-81.8008565452259,26.1571710992595],[-81.800922548606,26.1571530331714],[-81.8010525041107,26.1571141382467],[-81.8011313086082,26.1570882747315],[-81.8012585518535,26.1570428378217],[-81.801392427753,26.1569903026256],[-81.8014801504588,26.156960950365],[-81.801540795927,26.1569432577087],[-81.801602038494,26.1569274416507],[-81.8016328561696,26.1569203922508],[-81.8017220036294,26.156902517933],[-81.801784632472,26.156892540258],[-81.8018476299542,26.1568844633768],[-81.8019408314584,26.1568761953495],[-81.8020043454369,26.15687306758],[-81.8020678992374,26.1568720487697],[-81.8021315421016,26.1568729093825],[-81.8022644723184,26.1568790467587],[-81.8023344162311,26.1568800326623],[-81.8023694711385,26.1568796539442],[-81.8024616629096,26.1568760452217],[-81.8025662935117,26.1568673921374],[-81.802635765076,26.1568587515301],[-81.802727880249,26.1568439550871],[-81.8027963778234,26.1568303448501],[-81.8028643022345,26.1568146514937],[-81.8028980547745,26.156805865999],[-81.8029649928117,26.1567871059863],[-81.8029981757969,26.1567767646637],[-81.8031027957103,26.1567405998327],[-81.8032539854523,26.1566828309044],[-81.803314807805,26.1566613537008],[-81.8033945452519,26.1566345896342],[-81.8035184109203,26.1565969415664],[-81.8035808870808,26.1565795588106],[-81.8037233606139,26.1565437096084],[-81.8038505227919,26.1565163367151],[-81.8039304417612,26.1565012636937],[-81.8040590205454,26.1564804395971],[-81.804123637436,26.1564714814897],[-81.8042051171353,26.1564617414019],[-81.8042700297836,26.1564551659002],[-81.8044001041217,26.1564449938216],[-81.8044843893297,26.1564405797054],[-81.8045496109432,26.1564383124736],[-81.8046801263562,26.1564368954784],[-81.8047800779015,26.1564387442022],[-81.8048452552304,26.1564411310981],[-81.8050375498178,26.1564503730616],[-81.8051059740062,26.1564520539037],[-81.8052175241456,26.1564523014265],[-81.8054408239325,26.156437457486],[-81.8056638993283,26.1564195423481],[-81.8058099931777,26.1564004986529],[-81.806107984889,26.1563456880783],[-81.8064057259023,26.1562692359887],[-81.8067075867782,26.1561676331276],[-81.8068178017817,26.1561252442159],[-81.8068774096524,26.1561046205947],[-81.8069682918542,26.1560769438572],[-81.8070408438983,26.1560583109919],[-81.8071028614798,26.1560445516257],[-81.8071652730248,26.1560326699708],[-81.8072281815672,26.1560228717848],[-81.8072720408411,26.1560172841387],[-81.8073354545832,26.1560107615164],[-81.8073990600243,26.1560062552946],[-81.8074945833635,26.1560033124706]]]]}},{"id":244,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8082242011458,26.1574810522269],[-81.8084365900504,26.1584776753164],[-81.8083366426748,26.1585614583419],[-81.8082894588165,26.1586045263301],[-81.808243961183,26.1586489833347],[-81.8081789960642,26.1587181264248],[-81.8081379917735,26.1587658136933],[-81.8080987751655,26.158814866488],[-81.8080798676545,26.1588397099151],[-81.8080436606056,26.1588904881948],[-81.808009340487,26.1589422875549],[-81.8079770351074,26.1589952219105],[-81.8079468189417,26.1590490386572],[-81.8079187172375,26.1591037147285],[-81.8078927044361,26.1591592273428],[-81.8078689064517,26.1592154153117],[-81.8078692126926,26.1592119288176],[-81.8070067295626,26.1589385330213],[-81.8070201184805,26.1589017302761],[-81.80705391427,26.1588179750128],[-81.8070910714639,26.1587353930623],[-81.807131284269,26.1586538485791],[-81.8071746563443,26.1585736390198],[-81.8071975266137,26.1585339631943],[-81.8072454855594,26.1584558141835],[-81.8072965034125,26.1583791840615],[-81.8073503782047,26.1583042573668],[-81.8073784241692,26.1582673036353],[-81.8074366350918,26.1581949203282],[-81.8074975762452,26.158124287003],[-81.807561198399,26.1580556331941],[-81.8076274248684,26.1579888905497],[-81.8076962578622,26.1579243800201],[-81.8081277585953,26.1575572268762],[-81.8081750238729,26.1575186520121],[-81.8082242011458,26.1574810522269]]]]}},{"id":245,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8095646241241,26.1558986792506],[-81.8097525688888,26.1568859693712],[-81.808351066896,26.1571158141731],[-81.8082899561649,26.1566419294902],[-81.8082860645715,26.1566006842363],[-81.8082852489522,26.1565781753204],[-81.8082855732055,26.1565441281458],[-81.8082891735436,26.156498874615],[-81.8083243549609,26.1562404138975],[-81.8083269874546,26.1562132316153],[-81.8083292041002,26.1561588841606],[-81.8083286866423,26.1561317195584],[-81.8083262968588,26.1560945925831],[-81.8095646241241,26.1558986792506]]]]}},{"id":246,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805690018241,26.1557433033169],[-81.8057855221337,26.1562367592843],[-81.8056282064023,26.1562567369237],[-81.8056014281656,26.1562563594211],[-81.8055804471871,26.1562530378604],[-81.8055601090494,26.1562471449692],[-81.8055409989642,26.1562388150314],[-81.8055276081454,26.1562309804026],[-81.8055151744497,26.1562219482578],[-81.8055038501371,26.1562116948196],[-81.8054907907734,26.156196636588],[-81.8054826009895,26.1561841188506],[-81.8054740976127,26.1561666278865],[-81.805468254452,26.1561480903653],[-81.8054026755835,26.1557949354925],[-81.805690018241,26.1557433033169]]]]}},{"id":247,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8059790507176,26.1556973238803],[-81.8060728562245,26.1561837508091],[-81.8057855221337,26.1562367592843],[-81.805690018241,26.1557433033169],[-81.8059790507176,26.1556973238803]]]]}},{"id":248,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.806268032146,26.1556513441529],[-81.8063565424457,26.1561101057082],[-81.8060728562245,26.1561837508091],[-81.8059790507176,26.1556973238803],[-81.806268032146,26.1556513441529]]]]}},{"id":249,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8065568366162,26.1556055253236],[-81.8066363499812,26.1560155272577],[-81.8063565424457,26.1561101057082],[-81.806268032146,26.1556513441529],[-81.8065568366162,26.1556055253236]]]]}},{"id":250,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8068459191705,26.1555595438774],[-81.8069155573319,26.1559187048682],[-81.8068487280748,26.155938337285],[-81.8067826761739,26.1559601891548],[-81.8066363499812,26.1560155272577],[-81.8065568366162,26.1556055253236],[-81.8068459191705,26.1555595438774]]]]}},{"id":251,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8071347474551,26.1555135632797],[-81.8072017018256,26.1558591439413],[-81.8071325261414,26.155870031843],[-81.8070637201213,26.1558829580692],[-81.8069954364942,26.1558979676172],[-81.8069155573319,26.1559187048682],[-81.8068459191705,26.1555595438774],[-81.8071347474551,26.1555135632797]]]]}},{"id":252,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8074239311346,26.1554675801137],[-81.8074952471263,26.1558377359528],[-81.8074248641314,26.1558392998125],[-81.8073547763441,26.1558431545999],[-81.8072849058163,26.1558490485646],[-81.8072017018256,26.1558591439413],[-81.8071347474551,26.1555135632797],[-81.8074239311346,26.1554675801137]]]]}},{"id":253,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8077132161818,26.1554215958021],[-81.807794846204,26.155850659738],[-81.8076110264348,26.155839837864],[-81.8075760359459,26.1558384521763],[-81.8074952471263,26.1558377359528],[-81.8074239311346,26.1554675801137],[-81.8077132161818,26.1554215958021]]]]}},{"id":254,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8080022215569,26.1553756124821],[-81.8080687250246,26.1557365099132],[-81.8080693631702,26.1557480152689],[-81.8080677809046,26.1557654021824],[-81.8080610507516,26.1557877929592],[-81.8080558137553,26.1557982996026],[-81.8080493044096,26.1558084924185],[-81.8080375868917,26.1558223138647],[-81.8080283958821,26.1558304354447],[-81.8080184382087,26.1558378964669],[-81.8080076338729,26.1558441471517],[-81.8079902596971,26.1558518102661],[-81.8079779895559,26.1558554785157],[-81.8079590605747,26.1558587026729],[-81.8079398087569,26.1558593150557],[-81.807794846204,26.155850659738],[-81.8077132161818,26.1554215958021],[-81.8080022215569,26.1553756124821]]]]}},{"id":255,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8079303678968,26.1549865916721],[-81.8080022215569,26.1553756124821],[-81.8077132161818,26.1554215958021],[-81.807641287078,26.1550325523306],[-81.8079303678968,26.1549865916721]]]]}},{"id":256,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.807641287078,26.1550325523306],[-81.8077132161818,26.1554215958021],[-81.8074239311346,26.1554675801137],[-81.8073522557172,26.155078351652],[-81.807641287078,26.1550325523306]]]]}},{"id":257,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8073522557172,26.155078351652],[-81.8074239311346,26.1554675801137],[-81.8071347474551,26.1555135632797],[-81.8070630996253,26.1551245179147],[-81.8073522557172,26.155078351652]]]]}},{"id":258,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8070630996253,26.1551245179147],[-81.8071347474551,26.1555135632797],[-81.8068459191705,26.1555595438774],[-81.8067741960543,26.1551704987764],[-81.8070630996253,26.1551245179147]]]]}},{"id":259,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8067741960543,26.1551704987764],[-81.8068459191705,26.1555595438774],[-81.8065568366162,26.1556055253236],[-81.8064849885126,26.1552166412476],[-81.8067741960543,26.1551704987764]]]]}},{"id":260,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8064849885126,26.1552166412476],[-81.8065568366162,26.1556055253236],[-81.806268032146,26.1556513441529],[-81.8061958039238,26.1552624620467],[-81.8064849885126,26.1552166412476]]]]}},{"id":261,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8061958039238,26.1552624620467],[-81.806268032146,26.1556513441529],[-81.8059790507176,26.1556973238803],[-81.8059070023379,26.1553086010919],[-81.8061958039238,26.1552624620467]]]]}},{"id":262,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8059070023379,26.1553086010919],[-81.8059790507176,26.1556973238803],[-81.805690018241,26.1557433033169],[-81.8056179950831,26.1553544197455],[-81.8059070023379,26.1553086010919]]]]}},{"id":263,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8056179950831,26.1553544197455],[-81.805690018241,26.1557433033169],[-81.8054026755835,26.1557949354925],[-81.8053293176637,26.1554002130521],[-81.8056179950831,26.1553544197455]]]]}},{"id":264,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8056128344242,26.1468307429553],[-81.8056723768725,26.1472377856542],[-81.8053906859297,26.1472697152028],[-81.8053313720994,26.1468625335367],[-81.8056128344242,26.1468307429553]]]]}},{"id":265,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8058440147302,26.1468046437089],[-81.8059034558859,26.1472116180879],[-81.8056723768725,26.1472377856542],[-81.8056128344242,26.1468307429553],[-81.8058440147302,26.1468046437089]]]]}},{"id":266,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8060750934771,26.1467785675877],[-81.8061345346283,26.1471854272277],[-81.8059034558859,26.1472116180879],[-81.8058440147302,26.1468046437089],[-81.8060750934771,26.1467785675877]]]]}},{"id":267,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8063763277694,26.1467445098158],[-81.8064356932657,26.1471513009601],[-81.8061345346283,26.1471854272277],[-81.8060750934771,26.1467785675877],[-81.8063763277694,26.1467445098158]]]]}},{"id":268,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8066786028286,26.1467103768098],[-81.806737892358,26.1471170536075],[-81.8064356932657,26.1471513009601],[-81.8063763277694,26.1467445098158],[-81.8066786028286,26.1467103768098]]]]}},{"id":269,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8066113705417,26.1462493634809],[-81.8066706857489,26.1466561548273],[-81.8064060777038,26.1466860190169],[-81.8063466865606,26.1462791362674],[-81.8066113705417,26.1462493634809]]]]}},{"id":270,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8063466865606,26.1462791362674],[-81.8064060777038,26.1466860190169],[-81.8061799741596,26.1467115405183],[-81.8061205580668,26.1463046119505],[-81.8063466865606,26.1462791362674]]]]}},{"id":271,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8061205580668,26.1463046119505],[-81.8061799741596,26.1467115405183],[-81.8059235897147,26.1467404866057],[-81.8058641229018,26.1463334435709],[-81.8061205580668,26.1463046119505]]]]}},{"id":272,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8058641229018,26.1463334435709],[-81.8059235897147,26.1467404866057],[-81.8056746166564,26.1467685883695],[-81.805615124657,26.1463614536544],[-81.8058641229018,26.1463334435709]]]]}},{"id":273,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805615124657,26.1463614536544],[-81.8056746166564,26.1467685883695],[-81.8054437156273,26.1467946628557],[-81.805384147579,26.1463874367531],[-81.805615124657,26.1463614536544]]]]}},{"id":274,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8059316396884,26.14789771038],[-81.8059911053208,26.1483044093956],[-81.8055989249554,26.1483492231081],[-81.8055415664204,26.1479421453065],[-81.8059316396884,26.14789771038]]]]}},{"id":275,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8062329005634,26.1478634005246],[-81.8062922648236,26.148269985336],[-81.8059911053208,26.1483044093956],[-81.8059316396884,26.14789771038],[-81.8062329005634,26.1478634005246]]]]}},{"id":276,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8065339834372,26.1478290910387],[-81.8065932718827,26.1482355844293],[-81.8062922648236,26.148269985336],[-81.8062329005634,26.1478634005246],[-81.8065339834372,26.1478290910387]]]]}},{"id":277,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8068366906789,26.1477946113442],[-81.8068959793605,26.1482009899616],[-81.8065932718827,26.1482355844293],[-81.8065339834372,26.1478290910387],[-81.8068366906789,26.1477946113442]]]]}},{"id":278,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8067695100381,26.1473339188567],[-81.8068287991551,26.1477404350902],[-81.8065278431444,26.1477746756985],[-81.8064685544156,26.1473680676178],[-81.8067695100381,26.1473339188567]]]]}},{"id":279,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8064685544156,26.1473680676178],[-81.8065278431444,26.1477746756985],[-81.8061888140665,26.1478133013409],[-81.8061294239366,26.1474065561125],[-81.8064685544156,26.1473680676178]]]]}},{"id":280,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8061294239366,26.1474065561125],[-81.8061888140665,26.1478133013409],[-81.8058872232482,26.1478476358744],[-81.8058277573069,26.1474407992246],[-81.8061294239366,26.1474065561125]]]]}},{"id":281,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8058277573069,26.1474407992246],[-81.8058872232482,26.1478476358744],[-81.8055341825575,26.147887828576],[-81.805474691624,26.14748087727],[-81.8058277573069,26.1474407992246]]]]}},{"id":282,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8059993369552,26.1489924014448],[-81.8060587763512,26.1493988483166],[-81.8057572096598,26.1494335951798],[-81.8056977452529,26.1490270566024],[-81.8059993369552,26.1489924014448]]]]}},{"id":283,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8062926539474,26.1489587090258],[-81.8063499106062,26.1493652826109],[-81.8060587763512,26.1493988483166],[-81.8059993369552,26.1489924014448],[-81.8062926539474,26.1489587090258]]]]}},{"id":284,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8065936361056,26.1489241248201],[-81.8066508169492,26.1493306069891],[-81.8063499106062,26.1493652826109],[-81.8062926539474,26.1489587090258],[-81.8065936361056,26.1489241248201]]]]}},{"id":285,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8069947254122,26.1488780433741],[-81.8070539370405,26.1492841242382],[-81.8066508169492,26.1493306069891],[-81.8065936361056,26.1489241248201],[-81.8069947254122,26.1488780433741]]]]}},{"id":286,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8069275456179,26.1484176720122],[-81.8069868084849,26.1488238902078],[-81.8065857192015,26.1488699487026],[-81.8065264061004,26.1484636159705],[-81.8069275456179,26.1484176720122]]]]}},{"id":287,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8065264061004,26.1484636159705],[-81.8065857192015,26.1488699487026],[-81.806284737179,26.1489045328888],[-81.8062253733484,26.1484980627432],[-81.8065264061004,26.1484636159705]]]]}},{"id":288,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8062253733484,26.1484980627432],[-81.806284737179,26.1489045328888],[-81.8059836025538,26.1489391173028],[-81.8059241629085,26.1485325557362],[-81.8062253733484,26.1484980627432]]]]}},{"id":289,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8059241629085,26.1485325557362],[-81.8059836025538,26.1489391173028],[-81.8056922145843,26.1489725919673],[-81.8056327497368,26.1485659157747],[-81.8059241629085,26.1485325557362]]]]}},{"id":290,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8062502409067,26.1500652499166],[-81.8063095780068,26.1504713762064],[-81.8059178018752,26.1505168993495],[-81.8058583892647,26.1501106815949],[-81.8062502409067,26.1500652499166]]]]}},{"id":291,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8065511732152,26.150030390919],[-81.8066104849853,26.1504363796533],[-81.8063095780068,26.1504713762064],[-81.8062502409067,26.1500652499166],[-81.8065511732152,26.150030390919]]]]}},{"id":292,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8068520037212,26.1499955318658],[-81.8069112142707,26.1504014293222],[-81.8066104849853,26.1504363796533],[-81.8065511732152,26.150030390919],[-81.8068520037212,26.1499955318658]]]]}},{"id":293,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8071525801736,26.1499606965369],[-81.8072117911075,26.1503665021466],[-81.8069112142707,26.1504014293222],[-81.8068520037212,26.1499955318658],[-81.8071525801736,26.1499606965369]]]]}},{"id":294,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8070855029912,26.1495006686565],[-81.8071446634017,26.1499065892414],[-81.806844086927,26.1499414016255],[-81.8067847998944,26.1495353899053],[-81.8070855029912,26.1495006686565]]]]}},{"id":295,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8067847998944,26.1495353899053],[-81.806844086927,26.1499414016255],[-81.8065728015163,26.1499728396979],[-81.806513489211,26.1495667133618],[-81.8067847998944,26.1495353899053]]]]}},{"id":296,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.806513489211,26.1495667133618],[-81.8065728015163,26.1499728396979],[-81.8061811530716,26.1500182023309],[-81.8061218157436,26.1496119383953],[-81.806513489211,26.1495667133618]]]]}},{"id":297,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8061218157436,26.1496119383953],[-81.8061811530716,26.1500182023309],[-81.8058495587785,26.1500566022571],[-81.8057901201787,26.1496502241025],[-81.8061218157436,26.1496119383953]]]]}},{"id":298,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8043841354465,26.1469695038646],[-81.8044438799245,26.1473769816078],[-81.8041413239014,26.1474112490878],[-81.8040815288624,26.1470036568539],[-81.8043841354465,26.1469695038646]]]]}},{"id":299,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8046865894314,26.1469353510949],[-81.8047462579465,26.1473427144896],[-81.8044438799245,26.1473769816078],[-81.8043841354465,26.1469695038646],[-81.8046865894314,26.1469353510949]]]]}},{"id":300,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8049888401729,26.1469012217549],[-81.8050484581248,26.1473084706596],[-81.8047462579465,26.1473427144896],[-81.8046865894314,26.1469353510949],[-81.8049888401729,26.1469012217549]]]]}},{"id":301,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8053313720994,26.1468625335367],[-81.8053906859297,26.1472697152028],[-81.8050484581248,26.1473084706596],[-81.8049888401729,26.1469012217549],[-81.8053313720994,26.1468625335367]]]]}},{"id":302,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805384147579,26.1463874367531],[-81.8054437156273,26.1467946628557],[-81.8052123575851,26.1468207853804],[-81.8051527388905,26.1464134677478],[-81.805384147579,26.1463874367531]]]]}},{"id":303,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8051527388905,26.1464134677478],[-81.8052123575851,26.1468207853804],[-81.8049808978261,26.1468469081036],[-81.8049212794446,26.1464395215823],[-81.8051527388905,26.1464134677478]]]]}},{"id":304,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8049212794446,26.1464395215823],[-81.8049808978261,26.1468469081036],[-81.8046786218204,26.1468810375659],[-81.8046188766745,26.14647353698],[-81.8049212794446,26.1464395215823]]]]}},{"id":305,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8046188766745,26.14647353698],[-81.8046786218204,26.1468810375659],[-81.8043761678151,26.1469151673905],[-81.8043164230667,26.1465075749557],[-81.8046188766745,26.14647353698]]]]}},{"id":306,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8043164230667,26.1465075749557],[-81.8043761678151,26.1469151673905],[-81.8040735613679,26.1469493203601],[-81.8040137662165,26.1465416363598],[-81.8043164230667,26.1465075749557]]]]}},{"id":307,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8048450533666,26.1480214888775],[-81.8049046702436,26.1484285543748],[-81.8043006738735,26.1484975659403],[-81.8042409306234,26.1480902945301],[-81.8048450533666,26.1480214888775]]]]}},{"id":308,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805146898694,26.1479871092392],[-81.8052064650048,26.1483940602467],[-81.8049046702436,26.1484285543748],[-81.8048450533666,26.1480214888775],[-81.805146898694,26.1479871092392]]]]}},{"id":309,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8055415664204,26.1479421453065],[-81.8055989249554,26.1483492231081],[-81.8052064650048,26.1483940602467],[-81.805146898694,26.1479871092392],[-81.8055415664204,26.1479421453065]]]]}},{"id":310,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805474691624,26.14748087727],[-81.8055341825575,26.147887828576],[-81.8051416469684,26.1479325283796],[-81.805082080218,26.1475254397568],[-81.805474691624,26.14748087727]]]]}},{"id":311,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805082080218,26.1475254397568],[-81.8051416469684,26.1479325283796],[-81.804839827023,26.1479668849368],[-81.8047801590625,26.1475597050334],[-81.805082080218,26.1475254397568]]]]}},{"id":312,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8047801590625,26.1475597050334],[-81.804839827023,26.1479668849368],[-81.8045378290755,26.1480012418585],[-81.8044781361089,26.1475939702485],[-81.8047801590625,26.1475597050334]]]]}},{"id":313,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8044781361089,26.1475939702485],[-81.8045378290755,26.1480012418585],[-81.8042329631243,26.148035980982],[-81.8041731940456,26.1476285720967],[-81.8044781361089,26.1475939702485]]]]}},{"id":314,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8047022017641,26.1491414295429],[-81.8047618429708,26.1495483114904],[-81.804459920129,26.149583103492],[-81.8044002285134,26.1491761299799],[-81.8047022017641,26.1491414295429]]]]}},{"id":315,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8050040479691,26.1491067521119],[-81.8050636135219,26.1495135655623],[-81.8047618429708,26.1495483114904],[-81.8047022017641,26.1491414295429],[-81.8050040479691,26.1491067521119]]]]}},{"id":316,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8054062555198,26.1490605541886],[-81.8054657195698,26.1494671846089],[-81.8050636135219,26.1495135655623],[-81.8050040479691,26.1491067521119],[-81.8054062555198,26.1490605541886]]]]}},{"id":317,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8056977452529,26.1490270566024],[-81.8057572096598,26.1494335951798],[-81.8054657195698,26.1494671846089],[-81.8054062555198,26.1490605541886],[-81.8056977452529,26.1490270566024]]]]}},{"id":318,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8056327497368,26.1485659157747],[-81.8056922145843,26.1489725919673],[-81.8052497763111,26.1490233715738],[-81.8051902104125,26.1486165581822],[-81.8056327497368,26.1485659157747]]]]}},{"id":319,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8051902104125,26.1486165581822],[-81.8052497763111,26.1490233715738],[-81.8050175285654,26.1490500490589],[-81.8049579629814,26.1486431667783],[-81.8051902104125,26.1486165581822]]]]}},{"id":320,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8049579629814,26.1486431667783],[-81.8050175285654,26.1490500490589],[-81.8047909663515,26.1490760753973],[-81.8047352589042,26.1486686441534],[-81.8049579629814,26.1486431667783]]]]}},{"id":321,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8047352589042,26.1486686441534],[-81.8047909663515,26.1490760753973],[-81.8046111327937,26.1490967278182],[-81.8045514658807,26.1486896854301],[-81.8047352589042,26.1486686441534]]]]}},{"id":322,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8045514658807,26.1486896854301],[-81.8046111327937,26.1490967278182],[-81.8043922611671,26.1491218623028],[-81.8043325183204,26.1487147514576],[-81.8045514658807,26.1486896854301]]]]}},{"id":323,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8050466624308,26.150204724658],[-81.8051062267521,26.1506112399839],[-81.8046190372597,26.1506678618858],[-81.8045593717226,26.1502611634879],[-81.8050466624308,26.150204724658]]]]}},{"id":324,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8052731235693,26.1501784691868],[-81.8053326119797,26.1505849160526],[-81.8051062267521,26.1506112399839],[-81.8050466624308,26.150204724658],[-81.8052731235693,26.1501784691868]]]]}},{"id":325,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805499432502,26.1501522600647],[-81.8055589464499,26.1505586149773],[-81.8053326119797,26.1505849160526],[-81.8052731235693,26.1501784691868],[-81.805499432502,26.1501522600647]]]]}},{"id":326,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8058583892647,26.1501106815949],[-81.8059178018752,26.1505168993495],[-81.8055589464499,26.1505586149773],[-81.805499432502,26.1501522600647],[-81.8058583892647,26.1501106815949]]]]}},{"id":327,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8057901201787,26.1496502241025],[-81.8058495587785,26.1500566022571],[-81.8055982993159,26.1500857026196],[-81.8055388355348,26.1496792327838],[-81.8057901201787,26.1496502241025]]]]}},{"id":328,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8055388355348,26.1496792327838],[-81.8055982993159,26.1500857026196],[-81.8052965541487,26.1501206329564],[-81.805237014712,26.1497140946241],[-81.8055388355348,26.1496792327838]]]]}},{"id":329,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805237014712,26.1497140946241],[-81.8052965541487,26.1501206329564],[-81.8050550159388,26.1501486234193],[-81.8049954511313,26.1497419704848],[-81.805237014712,26.1497140946241]]]]}},{"id":330,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8049954511313,26.1497419704848],[-81.8050550159388,26.1501486234193],[-81.8048282245789,26.1501748803926],[-81.8047685838629,26.1497681589976],[-81.8049954511313,26.1497419704848]]]]}},{"id":331,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8047685838629,26.1497681589976],[-81.8048282245789,26.1501748803926],[-81.8045514299308,26.15020694154],[-81.8044917387199,26.1498001285927],[-81.8047685838629,26.1497681589976]]]]}},{"id":332,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8059485799412,26.15073363183],[-81.8060057331145,26.1511399538505],[-81.8051743078431,26.1512370654547],[-81.8051147694098,26.1508307105401],[-81.8059485799412,26.15073363183]]]]}},{"id":333,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8051147694098,26.1508307105401],[-81.8051743078431,26.1512370654547],[-81.8047104949673,26.1512912414777],[-81.8046508552377,26.1508847035027],[-81.8051147694098,26.1508307105401]]]]}},{"id":334,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8027017022537,26.1459975552377],[-81.8027617506156,26.146405834569],[-81.8025793539774,26.1464263152678],[-81.8025192802077,26.1460179442873],[-81.8027017022537,26.1459975552377]]]]}},{"id":335,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8028837938644,26.1459771448736],[-81.8029437664863,26.1463854016151],[-81.8027617506156,26.146405834569],[-81.8027017022537,26.1459975552377],[-81.8028837938644,26.1459771448736]]]]}},{"id":336,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8030657588728,26.1459568037648],[-81.8031257568863,26.1463649685742],[-81.8029437664863,26.1463854016151],[-81.8028837938644,26.1459771448736],[-81.8030657588728,26.1459568037648]]]]}},{"id":337,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8032477236547,26.1459364395021],[-81.8033076711713,26.146344558655],[-81.8031257568863,26.1463649685742],[-81.8030657588728,26.1459568037648],[-81.8032477236547,26.1459364395021]]]]}},{"id":338,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034296121651,26.145916075436],[-81.8034895091844,26.1463241489325],[-81.8033076711713,26.146344558655],[-81.8032477236547,26.1459364395021],[-81.8034296121651,26.145916075436]]]]}},{"id":339,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8030217671747,26.1473307418906],[-81.8030517401252,26.1475346868564],[-81.8027475333964,26.147569144034],[-81.8027174844459,26.1473651535679],[-81.8030217671747,26.1473307418906]]]]}},{"id":340,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.802991743066,26.1471267284177],[-81.8030217671747,26.1473307418906],[-81.8027174844459,26.1473651535679],[-81.8026874605403,26.1471610941697],[-81.802991743066,26.1471267284177]]]]}},{"id":341,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8031936843265,26.147103937287],[-81.8032536053978,26.1475118272756],[-81.8030517401252,26.1475346868564],[-81.802991743066,26.1471267284177],[-81.8031936843265,26.147103937287]]]]}},{"id":342,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8033955492979,26.1470811462998],[-81.8034554450258,26.1474889446301],[-81.8032536053978,26.1475118272756],[-81.8031936843265,26.147103937287],[-81.8033955492979,26.1470811462998]]]]}},{"id":343,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8035973379803,26.1470583554566],[-81.8036572340793,26.1474661078375],[-81.8034554450258,26.1474889446301],[-81.8033955492979,26.1470811462998],[-81.8035973379803,26.1470583554566]]]]}},{"id":344,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8038998939162,26.1470241808365],[-81.8039298421081,26.1472280111095],[-81.8036272859728,26.1472622316543],[-81.8035973379803,26.1470583554566],[-81.8038998939162,26.1470241808365]]]]}},{"id":345,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8039298421081,26.1472280111095],[-81.803959714054,26.1474318188681],[-81.8036572340793,26.1474661078375],[-81.8036272859728,26.1472622316543],[-81.8039298421081,26.1472280111095]]]]}},{"id":346,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8038321060971,26.1465620916077],[-81.8038919263469,26.1469698214056],[-81.8034884761847,26.1470153799935],[-81.8034285544455,26.1466074671625],[-81.8038321060971,26.1465620916077]]]]}},{"id":347,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034285544455,26.1466074671625],[-81.8034884761847,26.1470153799935],[-81.8032866367487,26.1470381709664],[-81.8032266896664,26.1466301664769],[-81.8034285544455,26.1466074671625]]]]}},{"id":348,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8032266896664,26.1466301664769],[-81.8032866367487,26.1470381709664],[-81.8030847208667,26.1470609391577],[-81.8030247233549,26.1466528890019],[-81.8032266896664,26.1466301664769]]]]}},{"id":349,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8030247233549,26.1466528890019],[-81.8030847208667,26.1470609391577],[-81.802881535952,26.1470838746239],[-81.802821513259,26.1466757557342],[-81.8030247233549,26.1466528890019]]]]}},{"id":350,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.802821513259,26.1466757557342],[-81.802881535952,26.1470838746239],[-81.8026794678051,26.1471066889508],[-81.8026194199275,26.1466985013276],[-81.802821513259,26.1466757557342]]]]}},{"id":351,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8031816479568,26.1484182035298],[-81.8032116205743,26.1486220108668],[-81.8029075655388,26.1486567656213],[-81.8028775675652,26.1484528895754],[-81.8031816479568,26.1484182035298]]]]}},{"id":352,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8031516752963,26.148214373253],[-81.8031816479568,26.1484182035298],[-81.8028775675652,26.1484528895754],[-81.8028475695489,26.1482489905899],[-81.8031516752963,26.148214373253]]]]}},{"id":353,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8033535153682,26.1481913760973],[-81.803413435616,26.1485989679033],[-81.8032116205743,26.1486220108668],[-81.8031516752963,26.148214373253],[-81.8033535153682,26.1481913760973]]]]}},{"id":354,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8035552793067,26.1481684020109],[-81.8036151742097,26.1485759021586],[-81.803413435616,26.1485989679033],[-81.8033535153682,26.1481913760973],[-81.8035552793067,26.1481684020109]]]]}},{"id":355,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8037569669549,26.1481454280688],[-81.8038168112684,26.1485528596255],[-81.8036151742097,26.1485759021586],[-81.8035552793067,26.1481684020109],[-81.8037569669549,26.1481454280688]]]]}},{"id":356,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040872701393,26.1483010876444],[-81.8041191398442,26.1485183189341],[-81.8038168112684,26.1485528596255],[-81.8037848909938,26.1483355826899],[-81.8040872701393,26.1483010876444]]]]}},{"id":357,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040593713371,26.1481109788011],[-81.8040872701393,26.1483010876444],[-81.8037848909938,26.1483355826899],[-81.8037569669549,26.1481454280688],[-81.8040593713371,26.1481109788011]]]]}},{"id":358,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040274760024,26.1478936788467],[-81.804051403763,26.1480566423159],[-81.8036481556714,26.1481025671009],[-81.8036242025857,26.1479395349185],[-81.8040274760024,26.1478936788467]]]]}},{"id":359,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8039916095849,26.1476491876332],[-81.8040274760024,26.1478936788467],[-81.8036242025857,26.1479395349185],[-81.8035882855589,26.147694952169],[-81.8039916095849,26.1476491876332]]]]}},{"id":360,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8035882855589,26.147694952169],[-81.8036481556714,26.1481025671009],[-81.80344644267,26.1481255410311],[-81.8033865219689,26.147717857508],[-81.8035882855589,26.147694952169]]]]}},{"id":361,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8033865219689,26.147717857508],[-81.80344644267,26.1481255410311],[-81.8032494505801,26.1481479610517],[-81.8031883117688,26.1477403530067],[-81.8033865219689,26.147717857508]]]]}},{"id":362,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8031883117688,26.1477403530067],[-81.8032494505801,26.1481479610517],[-81.803051849408,26.1481704759045],[-81.8029915228449,26.1477626798273],[-81.8031883117688,26.1477403530067]]]]}},{"id":363,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8029915228449,26.1477626798273],[-81.803051849408,26.1481704759045],[-81.802839576965,26.1481946312421],[-81.8027795551506,26.147786718735],[-81.8029915228449,26.1477626798273]]]]}},{"id":364,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8032339351626,26.1493101311364],[-81.8032938541091,26.1497174936726],[-81.8030675192345,26.1497435848374],[-81.8030075240667,26.1493361079888],[-81.8032339351626,26.1493101311364]]]]}},{"id":365,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034232620705,26.1492883499425],[-81.8034831813448,26.1496956665355],[-81.8032938541091,26.1497174936726],[-81.8032339351626,26.1493101311364],[-81.8034232620705,26.1492883499425]]]]}},{"id":366,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8036140867961,26.1492664455134],[-81.8036739300419,26.1496736936622],[-81.8034831813448,26.1496956665355],[-81.8034232620705,26.1492883499425],[-81.8036140867961,26.1492664455134]]]]}},{"id":367,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8038157240957,26.1492432654044],[-81.8038755169079,26.1496504678876],[-81.8036739300419,26.1496736936622],[-81.8036140867961,26.1492664455134],[-81.8038157240957,26.1492432654044]]]]}},{"id":368,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8042187702913,26.1491969743971],[-81.8042466433153,26.149386945759],[-81.8038436223549,26.1494333054922],[-81.8038157240957,26.1492432654044],[-81.8042187702913,26.1491969743971]]]]}},{"id":369,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8042466433153,26.149386945759],[-81.8042784871651,26.1496040166319],[-81.8038755169079,26.1496504678876],[-81.8038436223549,26.1494333054922],[-81.8042466433153,26.149386945759]]]]}},{"id":370,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8041510095212,26.1487355272822],[-81.8042108028698,26.149142683783],[-81.8039085247821,26.1491774078197],[-81.8038487061142,26.1487701137611],[-81.8041510095212,26.1487355272822]]]]}},{"id":371,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8038487061142,26.1487701137611],[-81.8039085247821,26.1491774078197],[-81.803706938106,26.1492005419217],[-81.8036470690049,26.1487932021975],[-81.8038487061142,26.1487701137611]]]]}},{"id":372,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8036470690049,26.1487932021975],[-81.803706938106,26.1492005419217],[-81.8035052498941,26.1492236992354],[-81.8034453810058,26.1488162906366],[-81.8036470690049,26.1487932021975]]]]}},{"id":373,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034453810058,26.1488162906366],[-81.8035052498941,26.1492236992354],[-81.8033035109488,26.1492468794771],[-81.8032435911574,26.1488393564364],[-81.8034453810058,26.1488162906366]]]]}},{"id":374,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8032735638537,26.1490431408185],[-81.8033035109488,26.1492468794771],[-81.8029995314773,26.1492817715867],[-81.8029695591825,26.1490779871447],[-81.8032735638537,26.1490431408185]]]]}},{"id":375,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8032435911574,26.1488393564364],[-81.8032735638537,26.1490431408185],[-81.8029695591825,26.1490779871447],[-81.8029395614437,26.1488741799046],[-81.8032435911574,26.1488393564364]]]]}},{"id":376,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034712026386,26.1503872334537],[-81.8035310702185,26.1507942980531],[-81.8032272928707,26.1508296022499],[-81.8031674002904,26.1504224459424],[-81.8034712026386,26.1503872334537]]]]}},{"id":377,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8037736343569,26.1503522113854],[-81.8038334513725,26.1507591614939],[-81.8035310702185,26.1507942980531],[-81.8034712026386,26.1503872334537],[-81.8037736343569,26.1503522113854]]]]}},{"id":378,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040759134672,26.1503171895368],[-81.804135654673,26.150724048222],[-81.8038334513725,26.1507591614939],[-81.8037736343569,26.1503522113854],[-81.8040759134672,26.1503171895368]]]]}},{"id":379,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8043780147254,26.1502821909761],[-81.8044377307665,26.1506889350292],[-81.804135654673,26.150724048222],[-81.8040759134672,26.1503171895368],[-81.8043780147254,26.1502821909761]]]]}},{"id":380,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8043103563885,26.1498210644213],[-81.8043700474568,26.1502279462329],[-81.8040679461779,26.1502629218486],[-81.8040081791425,26.1498559256885],[-81.8043103563885,26.1498210644213]]]]}},{"id":381,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040081791425,26.1498559256885],[-81.8040679461779,26.1502629218486],[-81.8037656416454,26.150297920894],[-81.8037058243599,26.1498908560938],[-81.8040081791425,26.1498559256885]]]]}},{"id":382,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8037058243599,26.1498908560938],[-81.8037656416454,26.150297920894],[-81.8035640545865,26.1503212840911],[-81.8035041865528,26.1499141277746],[-81.8037058243599,26.1498908560938]]]]}},{"id":383,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8035041865528,26.1499141277746],[-81.8035640545865,26.1503212840911],[-81.803362365676,26.1503446246492],[-81.8033024726102,26.1499374225253],[-81.8035041865528,26.1499141277746]]]]}},{"id":384,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8033024726102,26.1499374225253],[-81.803362365676,26.1503446246492],[-81.8031594076959,26.1503681324862],[-81.8030994892887,26.1499608387033],[-81.8033024726102,26.1499374225253]]]]}},{"id":385,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8013541653761,26.1462868210795],[-81.8013943576327,26.1465593278007],[-81.801181400141,26.1465832322767],[-81.8011411570966,26.1463106569922],[-81.8013541653761,26.1462868210795]]]]}},{"id":386,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015670465567,26.1462629855605],[-81.801607213269,26.1465354006518],[-81.8013943576327,26.1465593278007],[-81.8013541653761,26.1462868210795],[-81.8015670465567,26.1462629855605]]]]}},{"id":387,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.80172538873,26.1460790614442],[-81.8017896359951,26.1465149668858],[-81.801607213269,26.1465354006518],[-81.8015429409521,26.1460994494053],[-81.80172538873,26.1460790614442]]]]}},{"id":388,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801907760236,26.1460586736776],[-81.8019719567347,26.1464944876051],[-81.8017896359951,26.1465149668858],[-81.80172538873,26.1460790614442],[-81.801907760236,26.1460586736776]]]]}},{"id":389,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8021445181828,26.1461983058904],[-81.8021846347765,26.146470629374],[-81.8019719567347,26.1464944876051],[-81.8019318403099,26.1462221182011],[-81.8021445181828,26.1461983058904]]]]}},{"id":390,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8023571197585,26.146174493692],[-81.8023972109632,26.1464467484716],[-81.8021846347765,26.146470629374],[-81.8021445181828,26.1461983058904],[-81.8023571197585,26.146174493692]]]]}},{"id":391,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015937627534,26.1472846126009],[-81.801654037452,26.1476930057505],[-81.801350286725,26.1477274116002],[-81.8012899867188,26.1473188808904],[-81.8015937627534,26.1472846126009]]]]}},{"id":392,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8017962120044,26.1472617288889],[-81.8018576547417,26.1476699549572],[-81.801654037452,26.1476930057505],[-81.8015937627534,26.1472846126009],[-81.8017962120044,26.1472617288889]]]]}},{"id":393,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8019986105233,26.1472388681023],[-81.8020599772749,26.1476470257178],[-81.8018576547417,26.1476699549572],[-81.8017962120044,26.1472617288889],[-81.8019986105233,26.1472388681023]]]]}},{"id":394,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8021805510128,26.147218344805],[-81.8022406740462,26.1476265551122],[-81.8020599772749,26.1476470257178],[-81.8019986105233,26.1472388681023],[-81.8021805510128,26.147218344805]]]]}},{"id":395,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8025354171515,26.1473857241044],[-81.8025654916643,26.1475897832497],[-81.8022406740462,26.1476265551122],[-81.8022105999285,26.1474224729619],[-81.8025354171515,26.1473857241044]]]]}},{"id":396,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8025053283674,26.1471811864401],[-81.8025354171515,26.1473857241044],[-81.8022105999285,26.1474224729619],[-81.8021805510128,26.147218344805],[-81.8025053283674,26.1471811864401]]]]}},{"id":397,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8024372768139,26.1467189804415],[-81.8024973753447,26.147127236647],[-81.8022951800288,26.1471500511456],[-81.8022350563141,26.1467417262064],[-81.8024372768139,26.1467189804415]]]]}},{"id":398,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8022350563141,26.1467417262064],[-81.8022951800288,26.1471500511456],[-81.8021737002945,26.1471637497848],[-81.8021135768361,26.1467554018607],[-81.8022350563141,26.1467417262064]]]]}},{"id":399,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8021135768361,26.1467554018607],[-81.8021737002945,26.1471637497848],[-81.8019905671415,26.1471844401959],[-81.8019303674765,26.1467760009048],[-81.8021135768361,26.1467554018607]]]]}},{"id":400,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8019303674765,26.1467760009048],[-81.8019905671415,26.1471844401959],[-81.8017881939587,26.1472072779025],[-81.801727969111,26.1467987698773],[-81.8019303674765,26.1467760009048]]]]}},{"id":401,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801727969111,26.1467987698773],[-81.8017881939587,26.1472072779025],[-81.8015857444862,26.1472301157506],[-81.8015254438113,26.1468215621992],[-81.801727969111,26.1467987698773]]]]}},{"id":402,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015254438113,26.1468215621992],[-81.8015556195705,26.1470258503034],[-81.8012517930753,26.1470600729304],[-81.8012216429206,26.1468557387594],[-81.8015254438113,26.1468215621992]]]]}},{"id":403,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015556195705,26.1470258503034],[-81.8015857444862,26.1472301157506],[-81.801281943345,26.1472644070869],[-81.8012517930753,26.1470600729304],[-81.8015556195705,26.1470258503034]]]]}},{"id":404,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8016538115496,26.1483849430816],[-81.8017140349185,26.1487931300811],[-81.8015110006641,26.1488162920895],[-81.8014507524272,26.1484080822063],[-81.8016538115496,26.1483849430816]]]]}},{"id":405,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8019777162565,26.148348062958],[-81.8020378637386,26.148756135596],[-81.8017140349185,26.1487931300811],[-81.8016538115496,26.1483849430816],[-81.8019777162565,26.148348062958]]]]}},{"id":406,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8022206255104,26.1483203910337],[-81.8022807731906,26.1487283718512],[-81.8020378637386,26.148756135596],[-81.8019777162565,26.148348062958],[-81.8022206255104,26.1483203910337]]]]}},{"id":407,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8024228214433,26.1482973702682],[-81.8024828931359,26.148705282635],[-81.8022807731906,26.1487283718512],[-81.8022206255104,26.1483203910337],[-81.8024228214433,26.1482973702682]]]]}},{"id":408,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8026655782161,26.1482697213724],[-81.8027255993032,26.148677542202],[-81.8024828931359,26.148705282635],[-81.8024228214433,26.1482973702682],[-81.8026655782161,26.1482697213724]]]]}},{"id":409,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8025975386466,26.1478073807821],[-81.8026575347554,26.1482153393705],[-81.8024554658679,26.1482383368286],[-81.8023953939285,26.147830332715],[-81.8025975386466,26.1478073807821]]]]}},{"id":410,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8023953939285,26.147830332715],[-81.8024554658679,26.1482383368286],[-81.8022126328967,26.1482659857943],[-81.8021524849519,26.1478578902847],[-81.8023953939285,26.147830332715]]]]}},{"id":411,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8021524849519,26.1478578902847],[-81.8022126328967,26.1482659857943],[-81.8019089327875,26.1483005530445],[-81.8018487344456,26.1478923659673],[-81.8021524849519,26.1478578902847]]]]}},{"id":412,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8018487344456,26.1478923659673],[-81.8019089327875,26.1483005530445],[-81.8018226835612,26.1483103870755],[-81.8017985534217,26.1481471033473],[-81.8014186045114,26.1481903015537],[-81.8013824348328,26.1479452610638],[-81.8018487344456,26.1478923659673]]]]}},{"id":413,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8017985534217,26.1481471033473],[-81.8018226835612,26.1483103870755],[-81.8014427344477,26.1483536312073],[-81.8014186045114,26.1481903015537],[-81.8017985534217,26.1481471033473]]]]}},{"id":414,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801970824908,26.1496625755878],[-81.8020008981984,26.1498664972443],[-81.8016716364955,26.1499044160552],[-81.8016415382057,26.1497004715339],[-81.801970824908,26.1496625755878]]]]}},{"id":415,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801940751732,26.1494586539168],[-81.801970824908,26.1496625755878],[-81.8016415382057,26.1497004715339],[-81.8016114397173,26.1494964811475],[-81.801940751732,26.1494586539168]]]]}},{"id":416,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8021836363196,26.1494307528935],[-81.8022437575819,26.1498385045421],[-81.8020008981984,26.1498664972443],[-81.801940751732,26.1494586539168],[-81.8021836363196,26.1494307528935]]]]}},{"id":417,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8023960872398,26.1494063453024],[-81.8024562087526,26.1498140280708],[-81.8022437575819,26.1498385045421],[-81.8021836363196,26.1494307528935],[-81.8023960872398,26.1494063453024]]]]}},{"id":418,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8026236659998,26.1493802024169],[-81.8026836862083,26.1497878168639],[-81.8024562087526,26.1498140280708],[-81.8023960872398,26.1494063453024],[-81.8026236659998,26.1493802024169]]]]}},{"id":419,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8028256337906,26.1493569989199],[-81.8028856288122,26.1497645446336],[-81.8026836862083,26.1497878168639],[-81.8026236659998,26.1493802024169],[-81.8028256337906,26.1493569989199]]]]}},{"id":420,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8027576205938,26.148895002242],[-81.8028176158821,26.1493026626476],[-81.8026156481826,26.1493258661314],[-81.8025555769052,26.1489181372756],[-81.8027576205938,26.148895002242]]]]}},{"id":421,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8025555769052,26.1489181372756],[-81.8026156481826,26.1493258661314],[-81.8023632199121,26.1493548297942],[-81.8023030982183,26.1489470323216],[-81.8025555769052,26.1489181372756]]]]}},{"id":422,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8023030982183,26.1489470323216],[-81.8023632199121,26.1493548297942],[-81.8021106394096,26.1493838397167],[-81.8020504923882,26.1489759276351],[-81.8023030982183,26.1489470323216]]]]}},{"id":423,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020504923882,26.1489759276351],[-81.8021106394096,26.1493838397167],[-81.801928469609,26.1494047540014],[-81.8018682720901,26.1489967962625],[-81.8020504923882,26.1489759276351]]]]}},{"id":424,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8018682720901,26.1489967962625],[-81.8018983708706,26.1492007866019],[-81.8015732979867,26.1492380628312],[-81.8015431484856,26.1490340039187],[-81.8018682720901,26.1489967962625]]]]}},{"id":425,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8018983708706,26.1492007866019],[-81.801928469609,26.1494047540014],[-81.8016033964866,26.1494420761612],[-81.8015732979867,26.1492380628312],[-81.8018983708706,26.1492007866019]]]]}},{"id":426,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020510532496,26.150551757388],[-81.8021111226808,26.1509593259067],[-81.8018321430965,26.1509917379303],[-81.8017719723781,26.1505840781392],[-81.8020510532496,26.150551757388]]]]}},{"id":427,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8022786581507,26.1505253856036],[-81.8023387531284,26.1509328621679],[-81.8021111226808,26.1509593259067],[-81.8020510532496,26.150551757388],[-81.8022786581507,26.1505253856036]]]]}},{"id":428,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8025817252217,26.150490293709],[-81.8026417696395,26.1508976557813],[-81.8023387531284,26.1509328621679],[-81.8022786581507,26.1505253856036],[-81.8025817252217,26.150490293709]]]]}},{"id":429,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8029855858299,26.1504435200886],[-81.8030455289114,26.1508507220524],[-81.8026417696395,26.1508976557813],[-81.8025817252217,26.150490293709],[-81.8029855858299,26.1504435200886]]]]}},{"id":430,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8029175988513,26.1499818443976],[-81.802977567759,26.1503891838368],[-81.8027757010945,26.1504125704205],[-81.8027157068421,26.1500051393228],[-81.8029175988513,26.1499818443976]]]]}},{"id":431,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8027157068421,26.1500051393228],[-81.8027757010945,26.1504125704205],[-81.802573732735,26.1504359572893],[-81.8025136878939,26.1500284575998],[-81.8027157068421,26.1500051393228]]]]}},{"id":432,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8025136878939,26.1500284575998],[-81.802573732735,26.1504359572893],[-81.8023717134839,26.1504593441596],[-81.802311643456,26.1500517757366],[-81.8025136878939,26.1500284575998]]]]}},{"id":433,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.802311643456,26.1500517757366],[-81.8023717134839,26.1504593441596],[-81.8021289045997,26.1504874743734],[-81.8020688093669,26.1500798142716],[-81.802311643456,26.1500517757366]]]]}},{"id":434,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020988569261,26.1502836443297],[-81.8021289045997,26.1504874743734],[-81.8017639546993,26.1505297188827],[-81.8017338565282,26.1503258431817],[-81.8020988569261,26.1502836443297]]]]}},{"id":435,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020688093669,26.1500798142716],[-81.8020988569261,26.1502836443297],[-81.8017338565282,26.1503258431817],[-81.801703758315,26.1501219445409],[-81.8020688093669,26.1500798142716]]]]}},{"id":436,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009585570586,26.1463311367721],[-81.8009987998452,26.1466037350419],[-81.8007856897711,26.1466276397839],[-81.8007453963538,26.1463549958759],[-81.8009585570586,26.1463311367721]]]]}},{"id":437,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009344010117,26.1461675320037],[-81.8009585570586,26.1463311367721],[-81.8005017260556,26.146382279737],[-81.8004775196731,26.1462186522355],[-81.8009344010117,26.1461675320037]]]]}},{"id":438,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8007453963538,26.1463549958759],[-81.8007856897711,26.1466276397839],[-81.8005420447898,26.14665499236],[-81.8005017260556,26.146382279737],[-81.8007453963538,26.1463549958759]]]]}},{"id":439,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8004775196731,26.1462186522355],[-81.8005420447898,26.14665499236],[-81.8003592410413,26.1466754954487],[-81.8002946902498,26.146239017817],[-81.8004775196731,26.1462186522355]]]]}},{"id":440,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.80110746229,26.1473394980203],[-81.8011677875462,26.1477480974546],[-81.8009246242249,26.147775631444],[-81.800864273769,26.1473669403299],[-81.80110746229,26.1473394980203]]]]}},{"id":441,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.800864273769,26.1473669403299],[-81.8009246242249,26.147775631444],[-81.8007419978756,26.1477963174683],[-81.8006815969262,26.1473875806961],[-81.800864273769,26.1473669403299]]]]}},{"id":442,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8006815969262,26.1473875806961],[-81.8007419978756,26.1477963174683],[-81.8005589907523,26.1478170512309],[-81.8004985645553,26.1474082457337],[-81.8006815969262,26.1473875806961]]]]}},{"id":443,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8004465147422,26.1474750897941],[-81.8004980983291,26.1478239465384],[-81.8002696056938,26.147849815988],[-81.800217971343,26.1475008677284],[-81.8004465147422,26.1474750897941]]]]}},{"id":444,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.800217971343,26.1475008677284],[-81.8002696056938,26.147849815988],[-81.8000410369006,26.147875708426],[-81.7999894029011,26.1475267142195],[-81.800217971343,26.1475008677284]]]]}},{"id":445,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8004087000863,26.1472194432966],[-81.8004465147422,26.1474750897941],[-81.7999894029011,26.1475267142195],[-81.7999518082113,26.1472733819134],[-81.8001804780877,26.1472475807786],[-81.8004087000863,26.1472194432966]]]]}},{"id":446,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8001405070432,26.146977342166],[-81.8001804780877,26.1472475807786],[-81.7999518082113,26.1472733819134],[-81.799911862457,26.1470030513838],[-81.8001405070432,26.146977342166]]]]}},{"id":447,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003690753164,26.1469516330108],[-81.8004087000863,26.1472194432966],[-81.8001804780877,26.1472475807786],[-81.8001405070432,26.146977342166],[-81.8003690753164,26.1469516330108]]]]}},{"id":448,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8005804850031,26.1469278529559],[-81.800642003118,26.1473366065233],[-81.8004905212276,26.1473537260275],[-81.8004300438129,26.1469447831946],[-81.8005804850031,26.1469278529559]]]]}},{"id":449,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8007346066118,26.1469105123564],[-81.8007950082347,26.1473193637614],[-81.800642003118,26.1473366065233],[-81.8005804850031,26.1469278529559],[-81.8007346066118,26.1469105123564]]]]}},{"id":450,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8010692433259,26.147080644294],[-81.8010993935981,26.147285024346],[-81.8007950082347,26.1473193637614],[-81.8007648075221,26.1471149609915],[-81.8010692433259,26.147080644294]]]]}},{"id":451,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801039042367,26.1468762645099],[-81.8010692433259,26.147080644294],[-81.8007648075221,26.1471149609915],[-81.8007346066118,26.1469105123564],[-81.801039042367,26.1468762645099]]]]}},{"id":452,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012984531084,26.1486330103319],[-81.8013286026888,26.1488371610205],[-81.8009483988947,26.1488805887049],[-81.8009181990014,26.14867641528],[-81.8012984531084,26.1486330103319]]]]}},{"id":453,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801268303643,26.1484288596289],[-81.8012984531084,26.1486330103319],[-81.8009181990014,26.14867641528],[-81.8008880239984,26.148472149998],[-81.801268303643,26.1484288596289]]]]}},{"id":454,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8008880239984,26.148472149998],[-81.8009483988947,26.1488805887049],[-81.800720134504,26.1489066868931],[-81.8006597343566,26.1484981565137],[-81.8008880239984,26.148472149998]]]]}},{"id":455,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003889853653,26.1486564306895],[-81.8004309011052,26.1489397262876],[-81.8002024078495,26.1489658249308],[-81.8001604667781,26.1486824606197],[-81.8003889853653,26.1486564306895]]]]}},{"id":456,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8006173514336,26.1486304012461],[-81.8006592418413,26.1489136281313],[-81.8004309011052,26.1489397262876],[-81.8003889853653,26.1486564306895],[-81.8006173514336,26.1486304012461]]]]}},{"id":457,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.800594288054,26.1484743101975],[-81.8006173514336,26.1486304012461],[-81.8001604667781,26.1486824606197],[-81.8001379105352,26.1485298743828],[-81.800594288054,26.1484743101975]]]]}},{"id":458,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8005722383208,26.1483252977082],[-81.800594288054,26.1484743101975],[-81.8001379105352,26.1485298743828],[-81.8001152779966,26.1483772656358],[-81.8005722383208,26.1483252977082]]]]}},{"id":459,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003018802547,26.1480678713575],[-81.8003438217173,26.1483512814992],[-81.8001152779966,26.1483772656358],[-81.8000733367605,26.1480938095652],[-81.8003018802547,26.1480678713575]]]]}},{"id":460,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8005303474344,26.1480419332129],[-81.8005722383208,26.1483252977082],[-81.8003438217173,26.1483512814992],[-81.8003018802547,26.1480678713575],[-81.8005303474344,26.1480419332129]]]]}},{"id":461,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.800819580158,26.14800912292],[-81.8008799808728,26.1484176991035],[-81.8006516911781,26.1484436826789],[-81.8005912399681,26.1480350378893],[-81.800819580158,26.14800912292]]]]}},{"id":462,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8011999608807,26.1479659697501],[-81.8012301107119,26.1481702121873],[-81.8008497804578,26.148213411019],[-81.800819580158,26.14800912292],[-81.8011999608807,26.1479659697501]]]]}},{"id":463,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012301107119,26.1481702121873],[-81.801260260345,26.1483744087594],[-81.8008799808728,26.1484176991035],[-81.8008497804578,26.148213411019],[-81.8012301107119,26.1481702121873]]]]}},{"id":464,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8014580720263,26.1497213465954],[-81.8014881703178,26.1499253370124],[-81.801184494046,26.1499603382718],[-81.801154345154,26.1497563022122],[-81.8014580720263,26.1497213465954]]]]}},{"id":465,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8014279482914,26.1495173333799],[-81.8014580720263,26.1497213465954],[-81.801154345154,26.1497563022122],[-81.8011241960637,26.1495522202875],[-81.8014279482914,26.1495173333799]]]]}},{"id":466,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8011241960637,26.1495522202875],[-81.801184494046,26.1499603382718],[-81.800981916132,26.1499836804394],[-81.8009215929668,26.1495754937206],[-81.8011241960637,26.1495522202875]]]]}},{"id":467,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009215929668,26.1495754937206],[-81.800981916132,26.1499836804394],[-81.800880030597,26.1499954120494],[-81.8008196568185,26.1495872026377],[-81.8009215929668,26.1495754937206]]]]}},{"id":468,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8007789226216,26.1497302823335],[-81.8008191632534,26.1500024220019],[-81.8005909234619,26.1500287262195],[-81.8005506320747,26.1497565179825],[-81.8007789226216,26.1497302823335]]]]}},{"id":469,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8005506320747,26.1497565179825],[-81.8005909234619,26.1500287262195],[-81.8003625565501,26.1500550307833],[-81.8003222653675,26.1497827766207],[-81.8005506320747,26.1497565179825]]]]}},{"id":470,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8007547680236,26.1495669756512],[-81.8007789226216,26.1497302823335],[-81.8003222653675,26.1497827766207],[-81.8002980601181,26.1496194013548],[-81.8007547680236,26.1495669756512]]]]}},{"id":471,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8006903214192,26.1491313690396],[-81.8007547680236,26.1495669756512],[-81.8002980601181,26.1496194013548],[-81.8002335634284,26.1491836572335],[-81.8006903214192,26.1491313690396]]]]}},{"id":472,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009545279474,26.1491011735786],[-81.801014851249,26.1495094061638],[-81.8008115882319,26.14953275189],[-81.8007512140358,26.1491244048605],[-81.8009545279474,26.1491011735786]]]]}},{"id":473,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8011571052883,26.149077969034],[-81.8012174545231,26.149486178453],[-81.801014851249,26.1495094061638],[-81.8009545279474,26.1491011735786],[-81.8011571052883,26.149077969034]]]]}},{"id":474,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801359631895,26.1490547874142],[-81.8014199051438,26.1494629283816],[-81.8012174545231,26.149486178453],[-81.8011571052883,26.149077969034],[-81.801359631895,26.1490547874142]]]]}},{"id":475,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015885567491,26.1506051135904],[-81.8016488033636,26.151012818898],[-81.8013452278296,26.1510480950938],[-81.801284981462,26.1506402750105],[-81.8015885567491,26.1506051135904]]]]}},{"id":476,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801284981462,26.1506402750105],[-81.8013452278296,26.1510480950938],[-81.80104091607,26.1510834664521],[-81.800980619149,26.1506755318751],[-81.801284981462,26.1506402750105]]]]}},{"id":477,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009358630597,26.1507913747018],[-81.8009800992918,26.1510905220525],[-81.8005237200422,26.1511435657436],[-81.800479433204,26.1508442809587],[-81.8009358630597,26.1507913747018]]]]}},{"id":478,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8008916013599,26.1504921816106],[-81.8009358630597,26.1507913747018],[-81.800479433204,26.1508442809587],[-81.8004350956535,26.1505449734996],[-81.8008916013599,26.1504921816106]]]]}},{"id":479,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8006231463393,26.1502464607514],[-81.8006633866656,26.150518577523],[-81.8004350956535,26.1505449734996],[-81.8003948047281,26.1502728110848],[-81.8006231463393,26.1502464607514]]]]}},{"id":480,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8008513608298,26.1502201107645],[-81.8008916013599,26.1504921816106],[-81.8006633866656,26.150518577523],[-81.8006231463393,26.1502464607514],[-81.8008513608298,26.1502201107645]]]]}},{"id":481,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012166662564,26.1501779353785],[-81.8012769384452,26.1505858929381],[-81.80097257627,26.1506211497828],[-81.8009122027255,26.150213078012],[-81.8012166662564,26.1501779353785]]]]}},{"id":482,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015203175199,26.1501429112554],[-81.8015504155784,26.1503468328666],[-81.8012467896709,26.1503819256988],[-81.8012166662564,26.1501779353785],[-81.8015203175199,26.1501429112554]]]]}},{"id":483,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015504155784,26.1503468328666],[-81.8015805643982,26.1505507312552],[-81.8012769384452,26.1505858929381],[-81.8012467896709,26.1503819256988],[-81.8015504155784,26.1503468328666]]]]}},{"id":484,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7995457975761,26.1470442416999],[-81.7996751234856,26.1479171504603],[-81.7985759601628,26.1480416393836],[-81.7985122556523,26.1476241620806],[-81.7985095909516,26.1476133327471],[-81.7984461794067,26.1471679066864],[-81.7995457975761,26.1470442416999]]]]}},{"id":485,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7995675816989,26.1487611343221],[-81.7996079746667,26.149033732099],[-81.7993792017498,26.1490598539208],[-81.799338758186,26.1487872104999],[-81.7995675816989,26.1487611343221]]]]}},{"id":486,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.799796328896,26.1487350582062],[-81.7998366965127,26.1490075872728],[-81.7996079746667,26.149033732099],[-81.7995675816989,26.1487611343221],[-81.799796328896,26.1487350582062]]]]}},{"id":487,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.799772098139,26.1485715224699],[-81.799796328896,26.1487350582062],[-81.799338758186,26.1487872104999],[-81.7993144767808,26.1486236061792],[-81.799772098139,26.1485715224699]]]]}},{"id":488,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7997478418985,26.1484079639401],[-81.799772098139,26.1485715224699],[-81.7993144767808,26.1486236061792],[-81.7992902206947,26.1484599787828],[-81.7997478418985,26.1484079639401]]]]}},{"id":489,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7997074483948,26.1481352974054],[-81.7997478418985,26.1484079639401],[-81.7995190694542,26.1484339713306],[-81.7994786761573,26.14816125887],[-81.7997074483948,26.1481352974054]]]]}},{"id":490,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7994786761573,26.14816125887],[-81.7995190694542,26.1484339713306],[-81.7992902206947,26.1484599787828],[-81.7992497515576,26.1481872437443],[-81.7994786761573,26.14816125887]]]]}},{"id":491,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7991887320006,26.1481941621343],[-81.799253431757,26.1486305476676],[-81.7990397600572,26.1486548771418],[-81.7989749859145,26.1482184116711],[-81.7991887320006,26.1481941621343]]]]}},{"id":492,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7990053630717,26.1484230201928],[-81.7990397600572,26.1486548771418],[-81.798673263103,26.1486966064899],[-81.7986387884874,26.1484646696307],[-81.7990053630717,26.1484230201928]]]]}},{"id":493,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7989749859145,26.1482184116711],[-81.7990053630717,26.1484230201928],[-81.7986387884874,26.1484646696307],[-81.7986084114863,26.1482599922422],[-81.7989749859145,26.1482184116711]]]]}},{"id":494,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7998678774546,26.1492255112291],[-81.800158362392,26.1511860148282],[-81.7989741842986,26.1513235889522],[-81.7988945021796,26.1513245353211],[-81.7976337830738,26.1514809098252],[-81.797354935018,26.1495072451911],[-81.7987388102032,26.1493547070342],[-81.7998678774546,26.1492255112291]]]]}},{"id":495,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7973252364037,26.1477573589533],[-81.7973832227879,26.14816757796],[-81.7971687776846,26.1481936857158],[-81.7971107917207,26.1477834207565],[-81.7973252364037,26.1477573589533]]]]}},{"id":496,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7975300870153,26.1477324733371],[-81.7975880988765,26.1481426004043],[-81.7973832227879,26.14816757796],[-81.7973252364037,26.1477573589533],[-81.7975300870153,26.1477324733371]]]]}},{"id":497,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7977129321144,26.1477102541087],[-81.7977709696889,26.1481203350977],[-81.7975880988765,26.1481426004043],[-81.7975300870153,26.1477324733371],[-81.7977129321144,26.1477102541087]]]]}},{"id":498,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7979083914839,26.1476864974974],[-81.7979664548145,26.148096532402],[-81.7977709696889,26.1481203350977],[-81.7977129321144,26.1477102541087],[-81.7979083914839,26.1476864974974]]]]}},{"id":499,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7982781421842,26.1476415539005],[-81.7983363076008,26.1480514734393],[-81.7979664548145,26.148096532402],[-81.7979083914839,26.1476864974974],[-81.7982781421842,26.1476415539005]]]]}},{"id":500,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7982122908811,26.1471771583264],[-81.7982428949066,26.1473929538082],[-81.7979437798265,26.1474292525925],[-81.797913280592,26.1472138462042],[-81.7982122908811,26.1471771583264]]]]}},{"id":501,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7982428949066,26.1473929538082],[-81.7982703784973,26.1475869178734],[-81.7979712884914,26.1476232395096],[-81.7979437798265,26.1474292525925],[-81.7982428949066,26.1473929538082]]]]}},{"id":502,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.797913280592,26.1472138462042],[-81.7979712884914,26.1476232395096],[-81.7977822253176,26.1476462271406],[-81.7977241384303,26.1472363298093],[-81.797913280592,26.1472138462042]]]]}},{"id":503,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7977241384303,26.1472363298093],[-81.7977822253176,26.1476462271406],[-81.7975917405389,26.1476693599535],[-81.7975338063954,26.147259415837],[-81.7977241384303,26.1472363298093]]]]}},{"id":504,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7975338063954,26.147259415837],[-81.7975917405389,26.1476693599535],[-81.7974025755983,26.1476923476521],[-81.7973445908306,26.1472823349508],[-81.7975338063954,26.147259415837]]]]}},{"id":505,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7973735703025,26.1474873184534],[-81.7974025755983,26.1476923476521],[-81.7971031043003,26.1477287154574],[-81.7970740992039,26.1475236403368],[-81.7973735703025,26.1474873184534]]]]}},{"id":506,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7973445908306,26.1472823349508],[-81.7973735703025,26.1474873184534],[-81.7970740992039,26.1475236403368],[-81.7970451707332,26.1473186106313],[-81.7973445908306,26.1472823349508]]]]}},{"id":507,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7976644500436,26.1488290015159],[-81.7977225167883,26.1492395637443],[-81.7973234226562,26.1492884741825],[-81.7972654072984,26.1488777968563],[-81.7976644500436,26.1488290015159]]]]}},{"id":508,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7984320264496,26.1487351531422],[-81.7984901958611,26.1491454851887],[-81.7977225167883,26.1492395637443],[-81.7976644500436,26.1488290015159],[-81.7984320264496,26.1487351531422]]]]}},{"id":509,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7983971002712,26.1484890503148],[-81.7984242622924,26.1486804712842],[-81.7980962873971,26.1487205527465],[-81.7980691509876,26.1485290857127],[-81.7983971002712,26.1484890503148]]]]}},{"id":510,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7983660692342,26.1482703227179],[-81.7983971002712,26.1484890503148],[-81.7980691509876,26.1485290857127],[-81.7980381456366,26.148310312041],[-81.7983660692342,26.1482703227179]]]]}},{"id":511,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7980381456366,26.148310312041],[-81.7980962873971,26.1487205527465],[-81.7978867154035,26.1487461760591],[-81.7978286500941,26.1483358660557],[-81.7980381456366,26.148310312041]]]]}},{"id":512,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7978286500941,26.1483358660557],[-81.7978867154035,26.1487461760591],[-81.7976770923515,26.1487717764249],[-81.7976190528471,26.1483614203303],[-81.7978286500941,26.1483358660557]]]]}},{"id":513,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7976190528471,26.1483614203303],[-81.7976770923515,26.1487717764249],[-81.7972577194083,26.1488230457262],[-81.7971996549997,26.1484125520206],[-81.7976190528471,26.1483614203303]]]]}},{"id":514,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7980578053126,26.1523357721573],[-81.7980869207745,26.1525416716264],[-81.797787241191,26.1525790738778],[-81.7977581513325,26.1523731283458],[-81.7980578053126,26.1523357721573]]]]}},{"id":515,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7980286901189,26.1521298955995],[-81.7980578053126,26.1523357721573],[-81.7977581513325,26.1523731283458],[-81.797729036496,26.1521672287912],[-81.7980286901189,26.1521298955995]]]]}},{"id":516,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7982189242491,26.1521062132569],[-81.7982772060484,26.1525179430609],[-81.7980869207745,26.1525416716264],[-81.7980286901189,26.1521298955995],[-81.7982189242491,26.1521062132569]]]]}},{"id":517,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7984081939555,26.1520826735678],[-81.7984664757788,26.15249431158],[-81.7982772060484,26.1525179430609],[-81.7982189242491,26.1521062132569],[-81.7984081939555,26.1520826735678]]]]}},{"id":518,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7985988846863,26.152058919416],[-81.7986571924084,26.152470534271],[-81.7984664757788,26.15249431158],[-81.7984081939555,26.1520826735678],[-81.7985988846863,26.152058919416]]]]}},{"id":519,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7989293795405,26.1522271302406],[-81.7989585211164,26.1524329147342],[-81.7986571924084,26.152470534271],[-81.7986280511922,26.1522647267801],[-81.7989293795405,26.1522271302406]]]]}},{"id":520,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7988999591235,26.1520214160588],[-81.7989293795405,26.1522271302406],[-81.7986280511922,26.1522647267801],[-81.7985988846863,26.152058919416],[-81.7988999591235,26.1520214160588]]]]}},{"id":521,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7988340392802,26.1515552103418],[-81.7988923964547,26.1519665497309],[-81.7981707512969,26.1520563635247],[-81.7981124967949,26.1516448168997],[-81.7988340392802,26.1515552103418]]]]}},{"id":522,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7981124967949,26.1516448168997],[-81.7981707512969,26.1520563635247],[-81.797721296236,26.1521123175245],[-81.7976631691908,26.1517006095042],[-81.7981124967949,26.1516448168997]]]]}},{"id":523,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7982035302174,26.1534091951676],[-81.7982357655156,26.1536255087015],[-81.7979348995945,26.1536606940354],[-81.7979027412007,26.1534444029258],[-81.7982035302174,26.1534091951676]]]]}},{"id":524,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7981712962972,26.1531930650202],[-81.7982035302174,26.1534091951676],[-81.7979027412007,26.1534444029258],[-81.797870888855,26.1532282705886],[-81.7981712962972,26.1531930650202]]]]}},{"id":525,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.79848711115,26.153156076869],[-81.7985514047807,26.153588681848],[-81.7982357655156,26.1536255087015],[-81.7981712962972,26.1531930650202],[-81.79848711115,26.153156076869]]]]}},{"id":526,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7987125131481,26.1531298833243],[-81.7987769081067,26.1535623271444],[-81.7985514047807,26.153588681848],[-81.79848711115,26.153156076869],[-81.7987125131481,26.1531298833243]]]]}},{"id":527,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7990774336282,26.1533206226812],[-81.799107673813,26.1535235123073],[-81.7987769081067,26.1535623271444],[-81.7987466672313,26.1533592540342],[-81.7990774336282,26.1533206226812]]]]}},{"id":528,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7990431000052,26.1530910925723],[-81.7990774336282,26.1533206226812],[-81.7987466672313,26.1533592540342],[-81.7987125131481,26.1531298833243],[-81.7990431000052,26.1530910925723]]]]}},{"id":529,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7984827249565,26.1527169496353],[-81.7985472687174,26.153149025957],[-81.7983594857639,26.153171044484],[-81.7982948918737,26.1527389683453],[-81.7984827249565,26.1527169496353]]]]}},{"id":530,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7981392403222,26.1529769338709],[-81.7981712962972,26.1531930650202],[-81.797870888855,26.1532282705886],[-81.7978386556048,26.153012140346],[-81.7981392403222,26.1529769338709]]]]}},{"id":531,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.79810710827,26.1527608031276],[-81.7981392403222,26.1529769338709],[-81.7978386556048,26.153012140346],[-81.7978067781147,26.152796008117],[-81.79810710827,26.1527608031276]]]]}},{"id":532,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7990107641317,26.1528751236781],[-81.7990431000052,26.1530910925723],[-81.7987427945894,26.1531262764589],[-81.7987103578028,26.1529103309746],[-81.7990107641317,26.1528751236781]]]]}},{"id":533,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7989786305124,26.1526589931628],[-81.7990107641317,26.1528751236781],[-81.7987103578028,26.1529103309746],[-81.7986781231151,26.1526942009441],[-81.7989786305124,26.1526589931628]]]]}},{"id":534,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7986781231151,26.1526942009441],[-81.7987427945894,26.1531262764589],[-81.7985472687174,26.153149025957],[-81.7984827249565,26.1527169496353],[-81.7986781231151,26.1526942009441]]]]}},{"id":535,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7982948918737,26.1527389683453],[-81.7983594857639,26.153171044484],[-81.7981712962972,26.1531930650202],[-81.79810710827,26.1527608031276],[-81.7982948918737,26.1527389683453]]]]}},{"id":536,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7960946841199,26.1479068579779],[-81.7961524654281,26.1483174225729],[-81.7958527135986,26.1483539269176],[-81.7957949326925,26.1479432704792],[-81.7960946841199,26.1479068579779]]]]}},{"id":537,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7961546850588,26.1478995567822],[-81.7962124919731,26.1483101212084],[-81.7961524654281,26.1483174225729],[-81.7960946841199,26.1479068579779],[-81.7961546850588,26.1478995567822]]]]}},{"id":538,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7969331492348,26.1478049685061],[-81.7969911095026,26.1482152795411],[-81.7962124919731,26.1483101212084],[-81.7961546850588,26.1478995567822],[-81.7969331492348,26.1478049685061]]]]}},{"id":539,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7968011662931,26.1474093499398],[-81.7968428242357,26.147704661562],[-81.7966842940276,26.1477239252834],[-81.7966426360075,26.1474285448309],[-81.7968011662931,26.1474093499398]]]]}},{"id":540,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.796568235208,26.1473763864276],[-81.7966260664772,26.1477866295942],[-81.7963865448853,26.1478157177108],[-81.7963286885659,26.147405405795],[-81.796568235208,26.1473763864276]]]]}},{"id":541,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7963286885659,26.147405405795],[-81.7963865448853,26.1478157177108],[-81.7957872709612,26.147888519106],[-81.7957391256576,26.1475464276039],[-81.795740954167,26.1475201440362],[-81.7957551066814,26.1474944572482],[-81.7957748377562,26.1474785520698],[-81.7958045182919,26.1474689424893],[-81.7963286885659,26.147405405795]]]]}},{"id":542,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7962453693963,26.1489774366872],[-81.7963068020822,26.149413062251],[-81.7960068966668,26.1494497970708],[-81.7959451919248,26.1490113529389],[-81.7962453693963,26.1489774366872]]]]}},{"id":543,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7962430134852,26.1485292189747],[-81.7963664988002,26.1494057397109],[-81.7963068020822,26.149413062251],[-81.7961832914901,26.148536495744],[-81.7962430134852,26.1485292189747]]]]}},{"id":544,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7961832914901,26.148536495744],[-81.7962453693963,26.1489774366872],[-81.7959451919248,26.1490113529389],[-81.7958835141795,26.1485730690809],[-81.7961832914901,26.148536495744]]],[[[-81.7970219868057,26.1484341917416],[-81.7971457537904,26.1493102057851],[-81.7963664988002,26.1494057397109],[-81.7962430134852,26.1485292189747],[-81.7970219868057,26.1484341917416]]]]}},{"id":545,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7971767091776,26.1495293008874],[-81.797455555866,26.1515031951821],[-81.7969158956499,26.1515701691873],[-81.7967921136564,26.1506921148767],[-81.7967320867181,26.1506995311345],[-81.7967166079916,26.1505898001463],[-81.7961767459151,26.1506564285466],[-81.7961033773824,26.1501352395186],[-81.7965232608298,26.1500835580019],[-81.7964575818779,26.1496175788192],[-81.7971767091776,26.1495293008874]]]]}},{"id":546,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7964575818779,26.1496175788192],[-81.7965155473215,26.1500287381996],[-81.7960956891561,26.1500803736986],[-81.7960377497722,26.1496690993516],[-81.7964575818779,26.1496175788192]]]]}},{"id":547,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7967166079916,26.1505898001463],[-81.7967320867181,26.1506995311345],[-81.7967921136564,26.1506921148767],[-81.7969158956499,26.1515701691873],[-81.7963158267482,26.1516446281618],[-81.7961767459151,26.1506564285466],[-81.7967166079916,26.1505898001463]]]]}},{"id":548,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.797556062906,26.1521889578871],[-81.7976176939565,26.1526004401846],[-81.7964775576015,26.1527507722346],[-81.7964161314804,26.1523389672885],[-81.797556062906,26.1521889578871]]]]}},{"id":549,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7974863127378,26.151722795608],[-81.7975478405542,26.1521341180582],[-81.7967981319471,26.1522327465145],[-81.7967366813379,26.151821194015],[-81.7974863127378,26.151722795608]]]]}},{"id":550,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7967366813379,26.151821194015],[-81.7967981319471,26.1522327465145],[-81.7967068688689,26.1522454251971],[-81.7966453376946,26.1518331853129],[-81.7967366813379,26.151821194015]]]]}},{"id":551,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7966453376946,26.1518331853129],[-81.7967068688689,26.1522454251971],[-81.7964079345822,26.1522840584669],[-81.7963465353312,26.1518723908652],[-81.7966453376946,26.1518331853129]]]]}},{"id":552,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7972946861666,26.1560639258092],[-81.797376492724,26.1564684184129],[-81.7970772091415,26.1565170051412],[-81.796995530743,26.1561125345697],[-81.7972946861666,26.1560639258092]]]]}},{"id":553,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7954948511578,26.1479797300351],[-81.7955526062591,26.1483904784574],[-81.7944119984376,26.1485293789062],[-81.7943544227147,26.1481182850827],[-81.7954948511578,26.1479797300351]]]]}},{"id":554,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953544349014,26.1475234938191],[-81.7953832513286,26.1475250541736],[-81.7954113563193,26.1475378293808],[-81.7954312689207,26.1475599349475],[-81.7954390952943,26.1475827950405],[-81.7954871640067,26.1479249558579],[-81.7950193380613,26.1479817821451],[-81.7949616869774,26.1475710787283],[-81.7953544349014,26.1475234938191]]]]}},{"id":555,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949616869774,26.1475710787283],[-81.7950193380613,26.1479817821451],[-81.7948871528508,26.1479978493022],[-81.794829552555,26.1475870767665],[-81.7949616869774,26.1475710787283]]]]}},{"id":556,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794829552555,26.1475870767665],[-81.7948871528508,26.1479978493022],[-81.7946470719569,26.148027006405],[-81.7945894467701,26.1476161880453],[-81.794829552555,26.1475870767665]]]]}},{"id":557,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945894467701,26.1476161880453],[-81.7946470719569,26.148027006405],[-81.7943467868857,26.1480635105535],[-81.7942891871953,26.1476525543595],[-81.7945894467701,26.1476161880453]]]]}},{"id":558,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794822126036,26.1492769189348],[-81.7948288525616,26.149324912277],[-81.7945285467633,26.1493625862075],[-81.7945217125419,26.1493136763941],[-81.794822126036,26.1492769189348]]]]}},{"id":559,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948083243037,26.1491782059506],[-81.794822126036,26.1492769189348],[-81.7945217125419,26.1493136763941],[-81.7945079107459,26.1492149175251],[-81.7948083243037,26.1491782059506]]]]}},{"id":560,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948356580932,26.1493733178546],[-81.7948427052901,26.1494236479015],[-81.7945426946522,26.1494636816387],[-81.7945352443581,26.1494100753472],[-81.7948356580932,26.1493733178546]]]]}},{"id":561,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948427052901,26.1494236479015],[-81.7948659804607,26.1495895970935],[-81.7945655156925,26.1496264007918],[-81.7945426946522,26.1494636816387],[-81.7948427052901,26.1494236479015]]]]}},{"id":562,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948288525616,26.149324912277],[-81.7948356580932,26.1493733178546],[-81.7945352443581,26.1494100753472],[-81.7945285467633,26.1493625862075],[-81.7948288525616,26.149324912277]]]]}},{"id":563,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950485331065,26.1491488415009],[-81.7951061642182,26.1495601638943],[-81.7948659804607,26.1495895970935],[-81.7948083243037,26.1491782059506],[-81.7950485331065,26.1491488415009]]]]}},{"id":564,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7956868901011,26.1493468152318],[-81.7957065344419,26.1494866254975],[-81.7951061642182,26.1495601638943],[-81.7950865710679,26.1494203074008],[-81.7956868901011,26.1493468152318]]]]}},{"id":565,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7955833558012,26.1486096668278],[-81.7956410624911,26.1490206676245],[-81.7948006369119,26.1491233629642],[-81.7947430077469,26.1487121320957],[-81.7955833558012,26.1486096668278]]]]}},{"id":566,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7947430077469,26.1487121320957],[-81.7947718093403,26.1489177132189],[-81.794471370877,26.1489544019182],[-81.7944426201345,26.1487487516677],[-81.7947430077469,26.1487121320957]]]]}},{"id":567,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7947718093403,26.1489177132189],[-81.7948006369119,26.1491233629642],[-81.7945002234911,26.1491600745197],[-81.794471370877,26.1489544019182],[-81.7947718093403,26.1489177132189]]]]}},{"id":568,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794962102775,26.1502755926151],[-81.7950197883156,26.150687396126],[-81.7947192209041,26.1507244529429],[-81.7946615865754,26.150312557308],[-81.794962102775,26.1502755926151]]]]}},{"id":569,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7951121832966,26.1502571568673],[-81.795169894287,26.1506688913909],[-81.7950197883156,26.150687396126],[-81.794962102775,26.1502755926151],[-81.7951121832966,26.1502571568673]]]]}},{"id":570,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7952625428738,26.1502386735707],[-81.7953199749605,26.150650409566],[-81.795169894287,26.1506688913909],[-81.7951121832966,26.1502571568673],[-81.7952625428738,26.1502386735707]]]]}},{"id":571,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7954025718678,26.150221416404],[-81.7954600804839,26.1506331289871],[-81.7953199749605,26.150650409566],[-81.7952625428738,26.1502386735707],[-81.7954025718678,26.150221416404]]]]}},{"id":572,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958028872141,26.1501721835114],[-81.795860726335,26.1505837336035],[-81.7954600804839,26.1506331289871],[-81.7954025718678,26.150221416404],[-81.7958028872141,26.1501721835114]]]]}},{"id":573,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7957373617533,26.14970595092],[-81.7957951738789,26.1501173407381],[-81.795394909363,26.1501665503995],[-81.7953371486334,26.1497550454844],[-81.7957373617533,26.14970595092]]]]}},{"id":574,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953371486334,26.1497550454844],[-81.795394909363,26.1501665503995],[-81.7950945457026,26.1502034692945],[-81.7950368364937,26.149791918106],[-81.7953371486334,26.1497550454844]]]]}},{"id":575,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950368364937,26.149791918106],[-81.7950945457026,26.1502034692945],[-81.7949444654015,26.1502219279479],[-81.7948876953206,26.1498101880987],[-81.7950368364937,26.149791918106]]]]}},{"id":576,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949213829304,26.1500544645922],[-81.7949444654015,26.1502219279479],[-81.7946538732951,26.1502576456865],[-81.794630435762,26.150090207163],[-81.7949213829304,26.1500544645922]]]]}},{"id":577,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948876953206,26.1498101880987],[-81.7949213829304,26.1500544645922],[-81.794630435762,26.150090207163],[-81.7945961899098,26.1498459336717],[-81.7948876953206,26.1498101880987]]]]}},{"id":578,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953564070837,26.1513442999058],[-81.7954141730176,26.1517564236886],[-81.7948730631233,26.1518235127132],[-81.7948153487612,26.1514112279163],[-81.7953564070837,26.1513442999058]]]]}},{"id":579,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7955969731264,26.1513145427561],[-81.7956066599523,26.1513831991436],[-81.7956484379975,26.1513780392238],[-81.7956966190356,26.1517214142259],[-81.7954141730176,26.1517564236886],[-81.7953564070837,26.1513442999058],[-81.7955969731264,26.1513145427561]]]]}},{"id":580,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959571619596,26.1512699787091],[-81.7959667981874,26.1513386353487],[-81.7956066599523,26.1513831991436],[-81.7955969731264,26.1513145427561],[-81.7959571619596,26.1512699787091]]]]}},{"id":581,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959667981874,26.1513386353487],[-81.7960150304721,26.1516819411682],[-81.7956966190356,26.1517214142259],[-81.7956484379975,26.1513780392238],[-81.7959667981874,26.1513386353487]]]]}},{"id":582,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958916066388,26.1508032879196],[-81.7959494479992,26.1512150671795],[-81.7953480840642,26.1512894375555],[-81.7952893806378,26.1508775940031],[-81.7958916066388,26.1508032879196]]]]}},{"id":583,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7952893806378,26.1508775940031],[-81.7953480840642,26.1512894375555],[-81.7951208452715,26.151317836849],[-81.7950631046278,26.1509055064265],[-81.7952893806378,26.1508775940031]]]]}},{"id":584,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950318847955,26.1512166501078],[-81.7950472367502,26.1513266341822],[-81.7948065182615,26.1513564141837],[-81.7947911154127,26.1512463845087],[-81.7950318847955,26.1512166501078]]]]}},{"id":585,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950631046278,26.1509055064265],[-81.7951208452715,26.151317836849],[-81.7950472367502,26.1513266341822],[-81.7950318847955,26.1512166501078],[-81.7947911154127,26.1512463845087],[-81.7947488054958,26.1509442898006],[-81.7950631046278,26.1509055064265]]]]}},{"id":586,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7956719529906,26.152425568925],[-81.7957297993641,26.1528380588668],[-81.7950274376862,26.1529256871319],[-81.7949696940883,26.1525130128933],[-81.7956719529906,26.152425568925]]]]}},{"id":587,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958316125121,26.1525455996915],[-81.7958702106905,26.1528205468976],[-81.7957297993641,26.1528380588668],[-81.795691226598,26.1525630656252],[-81.7958316125121,26.1525455996915]]]]}},{"id":588,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7961323082111,26.152508104179],[-81.7961709575704,26.1527830051584],[-81.7958702106905,26.1528205468976],[-81.7958316125121,26.1525455996915],[-81.7961323082111,26.152508104179]]]]}},{"id":589,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7961129837618,26.1523706766053],[-81.7961323082111,26.152508104179],[-81.795691226598,26.1525630656252],[-81.7956719529906,26.152425568925],[-81.7961129837618,26.1523706766053]]]]}},{"id":590,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.796066646334,26.1520409097843],[-81.7960859451064,26.152178314588],[-81.7957852748567,26.1522156952191],[-81.7957659508705,26.1520782675829],[-81.796066646334,26.1520409097843]]]]}},{"id":591,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7960473223649,26.1519035280402],[-81.796066646334,26.1520409097843],[-81.7957659508705,26.1520782675829],[-81.7957466778935,26.151940862585],[-81.7960473223649,26.1519035280402]]]]}},{"id":592,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7960859451064,26.152178314588],[-81.796105269175,26.1523156963197],[-81.7958045734907,26.1523531229895],[-81.7957852748567,26.1522156952191],[-81.7960859451064,26.152178314588]]]]}},{"id":593,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7957466778935,26.151940862585],[-81.7958045734907,26.1523531229895],[-81.7957444444895,26.1523606081925],[-81.795686548943,26.1519483248341],[-81.7957466778935,26.151940862585]]]]}},{"id":594,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795686548943,26.1519483248341],[-81.7957444444895,26.1523606081925],[-81.7956241356579,26.1523755788043],[-81.7955662403686,26.1519632724635],[-81.795686548943,26.1519483248341]]]]}},{"id":595,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7955662403686,26.1519632724635],[-81.7956241356579,26.1523755788043],[-81.795523827624,26.1523880774439],[-81.7954659831718,26.1519757249241],[-81.7955662403686,26.1519632724635]]]]}},{"id":596,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7954659831718,26.1519757249241],[-81.795523827624,26.1523880774439],[-81.7953974524502,26.1524037920869],[-81.795339608276,26.1519914165819],[-81.7954659831718,26.1519757249241]]]]}},{"id":597,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795339608276,26.1519914165819],[-81.7953974524502,26.1524037920869],[-81.7952770419136,26.1524187629719],[-81.7952192488011,26.1520063642039],[-81.795339608276,26.1519914165819]]]]}},{"id":598,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7952192488011,26.1520063642039],[-81.7952770419136,26.1524187629719],[-81.7952630059009,26.1524205140882],[-81.7952494412975,26.1523231754655],[-81.7951430415795,26.1523364181878],[-81.7950988891374,26.1520212888006],[-81.7952192488011,26.1520063642039]]]]}},{"id":599,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7952494412975,26.1523231754655],[-81.7952630059009,26.1524205140882],[-81.7949619797137,26.1524579866846],[-81.7949483643946,26.1523606253835],[-81.7952494412975,26.1523231754655]]]]}},{"id":600,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950988891374,26.1520212888006],[-81.7951430415795,26.1523364181878],[-81.7949483643946,26.1523606253835],[-81.7949042377094,26.1520454728602],[-81.7950988891374,26.1520212888006]]]]}},{"id":601,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7962510018579,26.1534452908093],[-81.7963104300863,26.1538509167324],[-81.7957088480808,26.1539213008651],[-81.7956495753857,26.153515834286],[-81.7962510018579,26.1534452908093]]]]}},{"id":602,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7961837658854,26.1529858772354],[-81.7962431912702,26.1533911593423],[-81.7959423264771,26.1534265239171],[-81.7958830810113,26.1530214011594],[-81.7961837658854,26.1529858772354]]]]}},{"id":603,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958830810113,26.1530214011594],[-81.7959423264771,26.1534265239171],[-81.7957419522788,26.1534499842038],[-81.795682806765,26.1530445169076],[-81.7958830810113,26.1530214011594]]]]}},{"id":604,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795682806765,26.1530445169076],[-81.7957419522788,26.1534499842038],[-81.7955915832473,26.1534676656983],[-81.7955324151708,26.1530625423502],[-81.795682806765,26.1530445169076]]]]}},{"id":605,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7955324151708,26.1530625423502],[-81.7955915832473,26.1534676656983],[-81.7954011839256,26.1534898782476],[-81.7953421422588,26.1530845707034],[-81.7955324151708,26.1530625423502]]]]}},{"id":606,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953421422588,26.1530845707034],[-81.7954011839256,26.1534898782476],[-81.7951002931742,26.1535252412148],[-81.7950413531991,26.1531197954126],[-81.7953421422588,26.1530845707034]]]]}},{"id":607,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795896091767,26.1564852049498],[-81.7959394734211,26.1567011134715],[-81.795639831681,26.1567495158011],[-81.7955967301439,26.1565336285599],[-81.795896091767,26.1564852049498]]]]}},{"id":608,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7958528131396,26.1562694792462],[-81.795896091767,26.1564852049498],[-81.7955967301439,26.1565336285599],[-81.7955534508003,26.1563177193527],[-81.7958528131396,26.1562694792462]]]]}},{"id":609,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.795952262185,26.1562534544381],[-81.7959579553975,26.1562800632257],[-81.7960576838675,26.1562640368005],[-81.7961391317848,26.1566686926344],[-81.7959394734211,26.1567011134715],[-81.7958528131396,26.1562694792462],[-81.795952262185,26.1562534544381]]]]}},{"id":610,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7963915184769,26.1561820639826],[-81.7964785640382,26.1566140396174],[-81.7961391317848,26.1566686926344],[-81.7960576838675,26.1562640368005],[-81.7960977519786,26.1562574647509],[-81.796092336923,26.156230671022],[-81.7963915184769,26.1561820639826]]]]}},{"id":611,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7966908026231,26.1561336391678],[-81.7967779496067,26.156565430635],[-81.7964785640382,26.1566140396174],[-81.7963915184769,26.1561820639826],[-81.7966908026231,26.1561336391678]]]]}},{"id":612,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7961129344039,26.1575660544924],[-81.7961563942106,26.1577821229543],[-81.795856371108,26.1578308717757],[-81.7958129847739,26.157614321359],[-81.7961129344039,26.1575660544924]]]]}},{"id":613,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7960748633852,26.1573766193949],[-81.7961129344039,26.1575660544924],[-81.7958129847739,26.157614321359],[-81.7957752986892,26.1574253884246],[-81.7960748633852,26.1573766193949]]]]}},{"id":614,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.796182515051,26.156884761543],[-81.7962637665779,26.1572902895386],[-81.7960640295903,26.1573225046625],[-81.7959828550902,26.1569169990447],[-81.796182515051,26.156884761543]]]]}},{"id":615,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.796026061442,26.1571332294578],[-81.7960640295903,26.1573225046625],[-81.795764463938,26.1573711131895],[-81.795726496253,26.1571818378963],[-81.796026061442,26.1571332294578]]]]}},{"id":616,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7959828550902,26.1569169990447],[-81.796026061442,26.1571332294578],[-81.795726496253,26.1571818378963],[-81.7956831124534,26.1569655854396],[-81.7959828550902,26.1569169990447]]]]}},{"id":617,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7963298726202,26.1586491267922],[-81.7963952360398,26.1589742944171],[-81.7960951847666,26.1590230668619],[-81.7960299215795,26.1586975775679],[-81.7963298726202,26.1586491267922]]]]}},{"id":618,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7962865589457,26.1584322322681],[-81.7963298726202,26.1586491267922],[-81.7960299215795,26.1586975775679],[-81.7959864327913,26.1584810048804],[-81.7962865589457,26.1584322322681]]]]}},{"id":619,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7962430939561,26.1582154761157],[-81.7962865589457,26.1584322322681],[-81.7959864327913,26.1584810048804],[-81.7959432223668,26.1582642472224],[-81.7962430939561,26.1582154761157]]]]}},{"id":620,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7961996048244,26.1579988805578],[-81.7962430939561,26.1582154761157],[-81.7959432223668,26.1582642472224],[-81.7958998342899,26.158047490524],[-81.7961996048244,26.1579988805578]]]]}},{"id":621,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7965476677645,26.1597343030048],[-81.796591367262,26.1599517454893],[-81.7962909337817,26.1600007039019],[-81.796247361992,26.1597832835382],[-81.7965476677645,26.1597343030048]]]]}},{"id":622,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7965039974249,26.159517387639],[-81.7965476677645,26.1597343030048],[-81.796247361992,26.1597832835382],[-81.7962037669946,26.1595661613211],[-81.7965039974249,26.159517387639]]]]}},{"id":623,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7964607058204,26.1593001033369],[-81.7965039974249,26.159517387639],[-81.7962037669946,26.1595661613211],[-81.7961601687457,26.159348534723],[-81.7964607058204,26.1593001033369]]]]}},{"id":624,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7963952360398,26.1589742944171],[-81.7964607058204,26.1593001033369],[-81.7961601687457,26.159348534723],[-81.7960951847666,26.1590230668619],[-81.7963952360398,26.1589742944171]]]]}},{"id":625,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945186498377,26.156707904671],[-81.7945617507149,26.1569239756767],[-81.794261905931,26.1569725826132],[-81.7942191855422,26.1567563489279],[-81.7945186498377,26.156707904671]]]]}},{"id":626,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7946805244625,26.1564867593908],[-81.7947613858862,26.1568917632019],[-81.7945617507149,26.1569239756767],[-81.7945186498377,26.156707904671],[-81.7942191855422,26.1567563489279],[-81.7941815021729,26.1565673925633],[-81.7946805244625,26.1564867593908]]]]}},{"id":627,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948800824914,26.1564545242625],[-81.7949610451001,26.1568593669095],[-81.7947613858862,26.1568917632019],[-81.7946805244625,26.1564867593908],[-81.7948800824914,26.1564545242625]]]]}},{"id":628,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950800203596,26.1564221262788],[-81.7951606798812,26.1568271309605],[-81.7949610451001,26.1568593669095],[-81.7948800824914,26.1564545242625],[-81.7950800203596,26.1564221262788]]]]}},{"id":629,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953789998105,26.1563735453709],[-81.7954601707147,26.1567788909387],[-81.7951606798812,26.1568271309605],[-81.7950800203596,26.1564221262788],[-81.7953789998105,26.1563735453709]]]]}},{"id":630,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7947339331946,26.1577891318949],[-81.7947772415646,26.1580057060219],[-81.7944769876765,26.1580543157038],[-81.7944339083121,26.157837717289],[-81.7947339331946,26.1577891318949]]]]}},{"id":631,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7946962729368,26.1576000151009],[-81.7947339331946,26.1577891318949],[-81.7944339083121,26.157837717289],[-81.7943965014635,26.1576484385282],[-81.7946962729368,26.1576000151009]]]]}},{"id":632,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948960086489,26.1575674809012],[-81.7949770793967,26.1579731482099],[-81.7947772415646,26.1580057060219],[-81.7946962729368,26.1576000151009],[-81.7948960086489,26.1575674809012]]]]}},{"id":633,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950958466326,26.1575350604924],[-81.7951769192864,26.1579409110778],[-81.7949770793967,26.1579731482099],[-81.7948960086489,26.1575674809012],[-81.7950958466326,26.1575350604924]]]]}},{"id":634,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7952955842845,26.157502846698],[-81.7953768354239,26.1579086961753],[-81.7951769192864,26.1579409110778],[-81.7950958466326,26.1575350604924],[-81.7952955842845,26.157502846698]]]]}},{"id":635,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7956332195257,26.157643490972],[-81.7956766058528,26.1578600873001],[-81.7953768354239,26.1579086961753],[-81.7953334496274,26.157692099746],[-81.7956332195257,26.157643490972]]]]}},{"id":636,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7955952521064,26.1574542385738],[-81.7956332195257,26.157643490972],[-81.7953334496274,26.157692099746],[-81.7952955842845,26.157502846698],[-81.7955952521064,26.1574542385738]]]]}},{"id":637,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7955468334082,26.1572110297523],[-81.7955844197678,26.1574003072037],[-81.7952847519225,26.1574488923773],[-81.7952471636948,26.157259270958],[-81.7955468334082,26.1572110297523]]]]}},{"id":638,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7955034499261,26.1569947772349],[-81.7955468334082,26.1572110297523],[-81.7952471636948,26.157259270958],[-81.7952039864541,26.1570433840229],[-81.7955034499261,26.1569947772349]]]]}},{"id":639,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7952039864541,26.1570433840229],[-81.7952847519225,26.1574488923773],[-81.7950849891108,26.1574811292205],[-81.7950042230616,26.1570754373376],[-81.7952039864541,26.1570433840229]]]]}},{"id":640,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7950042230616,26.1570754373376],[-81.7950849891108,26.1574811292205],[-81.7948852514297,26.1575133427233],[-81.7948045899856,26.1571079940343],[-81.7950042230616,26.1570754373376]]]]}},{"id":641,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948045899856,26.1571079940343],[-81.7948852514297,26.1575133427233],[-81.794685413261,26.157545739915],[-81.7946048530044,26.1571402300623],[-81.7948045899856,26.1571079940343]]]]}},{"id":642,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7946478536957,26.1573564620602],[-81.794685413261,26.157545739915],[-81.7943857689368,26.1575941626163],[-81.7943479824487,26.1574050693378],[-81.7946478536957,26.1573564620602]]]]}},{"id":643,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7946048530044,26.1571402300623],[-81.7946478536957,26.1573564620602],[-81.7943479824487,26.1574050693378],[-81.7943052869697,26.1571888126327],[-81.7946048530044,26.1571402300623]]]]}},{"id":644,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7931406205267,26.1569309613531],[-81.7931834406211,26.1571471948377],[-81.7928834917645,26.1571956160854],[-81.7928410543317,26.1569795408804],[-81.7931406205267,26.1569309613531]]]]}},{"id":645,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7931031409624,26.1567418430754],[-81.7931406205267,26.1569309613531],[-81.7928410543317,26.1569795408804],[-81.7928036769977,26.1567904448813],[-81.7931031409624,26.1567418430754]]]]}},{"id":646,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793302903453,26.1567096548455],[-81.7933832036187,26.1571149835575],[-81.7931834406211,26.1571471948377],[-81.7931031409624,26.1567418430754],[-81.793302903453,26.1567096548455]]]]}},{"id":647,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7935028166934,26.1566772362474],[-81.7935829132109,26.1570824054767],[-81.7933832036187,26.1571149835575],[-81.793302903453,26.1567096548455],[-81.7935028166934,26.1566772362474]]]]}},{"id":648,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937021723456,26.1566450267826],[-81.793782674732,26.1570500102443],[-81.7935829132109,26.1570824054767],[-81.7935028166934,26.1566772362474],[-81.7937021723456,26.1566450267826]]]]}},{"id":649,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7940392433292,26.156785517514],[-81.7940822417474,26.1570015892408],[-81.793782674732,26.1570500102443],[-81.7937397542933,26.1568341214],[-81.7940392433292,26.156785517514]]]]}},{"id":650,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7940019414381,26.1565965819211],[-81.7940392433292,26.156785517514],[-81.7937397542933,26.1568341214],[-81.7937021723456,26.1566450267826],[-81.7940019414381,26.1565965819211]]]]}},{"id":651,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7933545741435,26.1580127025219],[-81.7933974736182,26.158229279353],[-81.7930972449958,26.1582780465202],[-81.7930543448125,26.1580612861858],[-81.7933545741435,26.1580127025219]]]]}},{"id":652,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7933169899017,26.1578232410233],[-81.7933545741435,26.1580127025219],[-81.7930543448125,26.1580612861858],[-81.7930172415281,26.1578715009864],[-81.7933169899017,26.1578232410233]]]]}},{"id":653,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7935169318266,26.1577910285554],[-81.7935974138801,26.1581967228794],[-81.7933974736182,26.158229279353],[-81.7933169899017,26.1578232410233],[-81.7935169318266,26.1577910285554]]]]}},{"id":654,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937167695387,26.1577584495665],[-81.7937973561957,26.1581644870855],[-81.7935974138801,26.1581967228794],[-81.7935169318266,26.1577910285554],[-81.7937167695387,26.1577584495665]]]]}},{"id":655,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939166096152,26.1577262371084],[-81.7939972962209,26.1581319300615],[-81.7937973561957,26.1581644870855],[-81.7937167695387,26.1577584495665],[-81.7939166096152,26.1577262371084]]]]}},{"id":656,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7942541424867,26.1578669081205],[-81.7942971453228,26.1580835070159],[-81.7939972962209,26.1581319300615],[-81.7939542962438,26.1579156749459],[-81.7942541424867,26.1578669081205]]]]}},{"id":657,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7942163802709,26.1576776312688],[-81.7942541424867,26.1578669081205],[-81.7939542962438,26.1579156749459],[-81.7939166096152,26.1577262371084],[-81.7942163802709,26.1576776312688]]]]}},{"id":658,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7941682414203,26.1574340765061],[-81.7942056236628,26.1576235388847],[-81.7939058518982,26.1576719612964],[-81.7938682935391,26.1574826832136],[-81.7941682414203,26.1574340765061]]]]}},{"id":659,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794125240335,26.1572176609448],[-81.7941682414203,26.1574340765061],[-81.7938682935391,26.1574826832136],[-81.7938255724191,26.1572662660115],[-81.794125240335,26.1572176609448]]]]}},{"id":660,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7938255724191,26.1572662660115],[-81.7939058518982,26.1576719612964],[-81.7937060119104,26.1577041737378],[-81.793625835948,26.1572986611707],[-81.7938255724191,26.1572662660115]]]]}},{"id":661,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793625835948,26.1572986611707],[-81.7937060119104,26.1577041737378],[-81.793506174287,26.1577367527099],[-81.7934261002895,26.1573311936074],[-81.793625835948,26.1572986611707]]]]}},{"id":662,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7934261002895,26.1573311936074],[-81.793506174287,26.1577367527099],[-81.7933063340639,26.1577689646013],[-81.7932262356362,26.1573634513648],[-81.7934261002895,26.1573311936074]]]]}},{"id":663,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7932689533697,26.1575795248861],[-81.7933063340639,26.1577689646013],[-81.7930064863804,26.1578175460541],[-81.7929691061507,26.1576281062515],[-81.7932689533697,26.1575795248861]]]]}},{"id":664,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7932262356362,26.1573634513648],[-81.7932689533697,26.1575795248861],[-81.7929691061507,26.1576281062515],[-81.7929265898475,26.1574116876311],[-81.7932262356362,26.1573634513648]]]]}},{"id":665,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7923244454401,26.1568678676662],[-81.7924040566327,26.1572732236895],[-81.7920786047651,26.1573259103177],[-81.7920714184302,26.1569088072929],[-81.7923244454401,26.1568678676662]]]]}},{"id":666,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7926611104569,26.157008570207],[-81.7927037253937,26.1572246444926],[-81.7924040566327,26.1572732236895],[-81.7923614399022,26.1570568054239],[-81.7926611104569,26.157008570207]]]]}},{"id":667,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7926240126799,26.1568194496921],[-81.7926611104569,26.157008570207],[-81.7923614399022,26.1570568054239],[-81.7923244454401,26.1568678676662],[-81.7926240126799,26.1568194496921]]]]}},{"id":668,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7923372043224,26.1579818511275],[-81.7924173037352,26.1583878921682],[-81.7920990055911,26.1584395078433],[-81.7920916596166,26.1580213740836],[-81.7923372043224,26.1579818511275]]]]}},{"id":669,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7925371455846,26.1579494566055],[-81.7926173483594,26.1583556574396],[-81.7924173037352,26.1583878921682],[-81.7923372043224,26.1579818511275],[-81.7925371455846,26.1579494566055]]]]}},{"id":670,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7928744743159,26.158090131989],[-81.7929172979701,26.1583068928031],[-81.7926173483594,26.1583556574396],[-81.7925745252367,26.1581388965255],[-81.7928744743159,26.158090131989]]]]}},{"id":671,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7928370965238,26.1579010360368],[-81.7928744743159,26.158090131989],[-81.7925745252367,26.1581388965255],[-81.7925371455846,26.1579494566055],[-81.7928370965238,26.1579010360368]]]]}},{"id":672,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.792789238616,26.1576572958156],[-81.7928263392859,26.1578467601343],[-81.7925264900929,26.1578951801187],[-81.7924894928949,26.1577059214823],[-81.792789238616,26.1576572958156]]]]}},{"id":673,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7927465448087,26.1574408781144],[-81.792789238616,26.1576572958156],[-81.7924894928949,26.1577059214823],[-81.7924467742149,26.1574895038212],[-81.7927465448087,26.1574408781144]]]]}},{"id":674,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7924467742149,26.1574895038212],[-81.7925264900929,26.1578951801187],[-81.7920907509896,26.1579658288601],[-81.7920835333765,26.1575478777757],[-81.7924467742149,26.1574895038212]]]]}},{"id":675,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8081452268524,26.1476180347625],[-81.8082032961389,26.1480790756544],[-81.8070805444145,26.1482074298944],[-81.8070133893567,26.1477469437602],[-81.8081452268524,26.1476180347625]]]]}},{"id":676,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8080869558139,26.1471571324991],[-81.8081452268524,26.1476180347625],[-81.8070133893567,26.1477469437602],[-81.8069462845752,26.1472862967913],[-81.8080869558139,26.1471571324991]]]]}},{"id":677,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8082753466351,26.1486484330573],[-81.8083404943311,26.149163333558],[-81.8072384009358,26.1492903810946],[-81.8071634314847,26.1487760852866],[-81.8082753466351,26.1486484330573]]]]}},{"id":678,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8082239001269,26.1482417589313],[-81.8082753466351,26.1486484330573],[-81.8071634314847,26.1487760852866],[-81.8071042193124,26.1483699356661],[-81.8082239001269,26.1482417589313]]]]}},{"id":679,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8084432581114,26.1499760403408],[-81.8084772840216,26.1502468827069],[-81.8073961538406,26.1503725759271],[-81.8073567222177,26.1501021074596],[-81.8084432581114,26.1499760403408]]]]}},{"id":680,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8083610979528,26.1493259021556],[-81.8084432581114,26.1499760403408],[-81.8073567222177,26.1501021074596],[-81.8072620755245,26.1494527721794],[-81.8083610979528,26.1493259021556]]]]}},{"id":681,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8085562332133,26.150869527329],[-81.8086194819972,26.1513702010064],[-81.807559721174,26.1514944917766],[-81.8074868282708,26.1509944677117],[-81.8085562332133,26.150869527329]]]]}},{"id":682,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8084978871178,26.1504093137001],[-81.8085562332133,26.150869527329],[-81.8074868282708,26.1509944677117],[-81.8074198279617,26.1505348293997],[-81.8084978871178,26.1504093137001]]]]}},{"id":683,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8087381534535,26.1521167447122],[-81.8087848173638,26.1524076451209],[-81.8077113479863,26.1525345818653],[-81.8076688218248,26.1522428783738],[-81.8087381534535,26.1521167447122]]]]}},{"id":684,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8086245375392,26.1514107978139],[-81.8087381534535,26.1521167447122],[-81.8076688218248,26.1522428783738],[-81.8075656397033,26.151535037936],[-81.8086245375392,26.1514107978139]]]]}},{"id":685,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8088509033799,26.1526121423029],[-81.8088799421577,26.1528152197569],[-81.8089188998359,26.1528984063779],[-81.8081355201474,26.1529870578073],[-81.8080989278455,26.1526977055096],[-81.8088509033799,26.1526121423029]]]]}},{"id":686,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8080989278455,26.1526977055096],[-81.8081336933047,26.1529726245667],[-81.8077919842441,26.1530114985131],[-81.8077560015321,26.1527367695973],[-81.8080989278455,26.1526977055096]]]]}},{"id":687,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8084714156566,26.1541208665335],[-81.808503215518,26.154215946261],[-81.8089443726754,26.1541462494767],[-81.8089567420437,26.1542012028066],[-81.8090080511364,26.1541930050673],[-81.8090862180665,26.1546571647643],[-81.8080798174902,26.1548170394982],[-81.8079667703193,26.1542009138725],[-81.8084714156566,26.1541208665335]]]]}},{"id":688,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8090097091005,26.153715145585],[-81.8091683338668,26.1546441398794],[-81.8090862180665,26.1546571647643],[-81.808977460286,26.1540117621195],[-81.808954796727,26.153723890863],[-81.8090097091005,26.153715145585]]]]}},{"id":689,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.808954796727,26.153723890863],[-81.808977460286,26.1540117621195],[-81.8090080511364,26.1541930050673],[-81.8089567420437,26.1542012028066],[-81.8089443726754,26.1541462494767],[-81.808503215518,26.154215946261],[-81.8084714156566,26.1541208665335],[-81.8079667703193,26.1542009138725],[-81.8079096802208,26.1538898279219],[-81.808954796727,26.153723890863]]]]}},{"id":690,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8093017125725,26.1552678991964],[-81.8093810465439,26.155731547698],[-81.8082931749495,26.1559035742601],[-81.8082083422246,26.1554413315244],[-81.8093017125725,26.1552678991964]]]]}},{"id":691,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8092226056883,26.1548039283683],[-81.8093017125725,26.1552678991964],[-81.8087609275448,26.155353654748],[-81.8086760875965,26.1548905640514],[-81.8092226056883,26.1548039283683]]]]}},{"id":692,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8086760875965,26.1548905640514],[-81.8087609275448,26.155353654748],[-81.8082083422246,26.1554413315244],[-81.8081234016595,26.1549780805515],[-81.8086760875965,26.1548905640514]]]]}},{"id":693,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8054942804899,26.1547220053085],[-81.8055803525167,26.155185091224],[-81.8052912460114,26.1552312307411],[-81.8052128978378,26.1548088642014],[-81.8052127342874,26.1547961410854],[-81.8052151404205,26.154787690798],[-81.8052194820253,26.1547799404007],[-81.8052254298125,26.1547730292916],[-81.80523698558,26.154765215632],[-81.8052460320961,26.1547619324591],[-81.8054942804899,26.1547220053085]]]]}},{"id":694,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8057788255031,26.1546517955112],[-81.8058690558017,26.1551394577623],[-81.8055803525167,26.155185091224],[-81.8054942804899,26.1547220053085],[-81.8055615629775,26.1547092488443],[-81.8056271801147,26.1546944383086],[-81.8056922253094,26.15467772807],[-81.8057788255031,26.1546517955112]]]]}},{"id":695,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8060558446767,26.1545400391901],[-81.8061581641848,26.1550936609746],[-81.8058690558017,26.1551394577623],[-81.8057788255031,26.1546517955112],[-81.8058516391838,26.1546269717215],[-81.8059139686882,26.1546032382424],[-81.8059753186949,26.1545774468622],[-81.8060558446767,26.1545400391901]]]]}},{"id":696,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8063246545862,26.1543834388483],[-81.8064473471152,26.1550476568571],[-81.8061581641848,26.1550936609746],[-81.806112836392,26.1548485587486],[-81.806371644996,26.1548075393006],[-81.8062966752995,26.1544004462349],[-81.8063246545862,26.1543834388483]]]]}},{"id":697,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8062966752995,26.1544004462349],[-81.806371644996,26.1548075393006],[-81.806112836392,26.1548485587486],[-81.8060558446767,26.1545400391901],[-81.8061242943093,26.1545049229091],[-81.8061818397456,26.1544726187768],[-81.8062381540135,26.1544386020507],[-81.8062966752995,26.1544004462349]]]]}},{"id":698,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.806945284728,26.154519927081],[-81.8070255360063,26.1549558771443],[-81.8067362517932,26.1550018600568],[-81.8066558999393,26.1545659103798],[-81.806945284728,26.154519927081]]]]}},{"id":699,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8072344676317,26.1544741735976],[-81.8073148210809,26.1549100541326],[-81.8070255360063,26.1549558771443],[-81.806945284728,26.154519927081],[-81.8072344676317,26.1544741735976]]]]}},{"id":700,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8075236495044,26.1544283049121],[-81.807603827748,26.1548644155141],[-81.8073148210809,26.1549100541326],[-81.8072344676317,26.1544741735976],[-81.8075236495044,26.1544283049121]]]]}},{"id":701,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8078132367845,26.1543823187446],[-81.8078932117383,26.1548182698268],[-81.807603827748,26.1548644155141],[-81.8075236495044,26.1544283049121],[-81.8078132367845,26.1543823187446]]]]}},{"id":702,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8076864102751,26.1538934874642],[-81.807700526409,26.1538959989565],[-81.8077130426824,26.1539022793127],[-81.8077228115709,26.1539116930359],[-81.8077287103202,26.1539235127859],[-81.8078132367845,26.1543823187446],[-81.8075236495044,26.1544283049121],[-81.8074316210835,26.1539275859236],[-81.8076864102751,26.1538934874642]]]]}},{"id":703,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8074316210835,26.1539275859236],[-81.8075236495044,26.1544283049121],[-81.8071995501253,26.1544796423281],[-81.8071083920725,26.1539833888389],[-81.8071668026826,26.1539698330841],[-81.8072565096093,26.1539525024796],[-81.8074316210835,26.1539275859236]]]]}},{"id":704,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8071083920725,26.1539833888389],[-81.8071995501253,26.1544796423281],[-81.806945284728,26.154519927081],[-81.8068613636035,26.1540637078295],[-81.8069333726454,26.1540364807607],[-81.8069907015893,26.1540170849618],[-81.8070487790117,26.1539994044094],[-81.8071083920725,26.1539833888389]]]]}},{"id":705,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8068613636035,26.1540637078295],[-81.806945284728,26.154519927081],[-81.8066558999393,26.1545659103798],[-81.8065886100165,26.1542007293589],[-81.8066593040407,26.1541595706737],[-81.8067121793547,26.1541316026123],[-81.8067933543699,26.1540926089933],[-81.8068613636035,26.1540637078295]]]]}},{"id":706,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8065886100165,26.1542007293589],[-81.8067362517932,26.1550018600568],[-81.8064473471152,26.1550476568571],[-81.8063246545862,26.1543834388483],[-81.8064977699635,26.1542602042127],[-81.8065569409761,26.154220508601],[-81.8065886100165,26.1542007293589]]]]}},{"id":707,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8052282246653,26.1538479422062],[-81.8053708818963,26.1539393077917],[-81.8053600223408,26.1541558146095],[-81.8052761771283,26.1543794927578],[-81.8052755129101,26.1544233542577],[-81.805194283955,26.1545952274836],[-81.8051827330303,26.1545889415109],[-81.8051754448486,26.1545819209937],[-81.8051702303882,26.1545735362377],[-81.805167219966,26.1545642679645],[-81.8050929274351,26.15416267268],[-81.8050546024487,26.1538678269299],[-81.8052282246653,26.1538479422062]]]]}},{"id":708,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8055684617121,26.1538568606884],[-81.8055562120129,26.154540427457],[-81.8055072052468,26.1545510183448],[-81.805451566059,26.1545613024165],[-81.8052201384448,26.1545980174826],[-81.8052048969425,26.1545981026983],[-81.805194283955,26.1545952274836],[-81.8052755129101,26.1544233542577],[-81.8052761771283,26.1543794927578],[-81.8053600223408,26.1541558146095],[-81.8053708818963,26.1539393077917],[-81.8055065206452,26.1538816235203],[-81.8055684617121,26.1538568606884]]]]}},{"id":709,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8057408074064,26.1537879892372],[-81.8058114124819,26.1539705451444],[-81.8057658334884,26.1544801052621],[-81.8057150936313,26.1544972628038],[-81.8056699448759,26.1545110647541],[-81.8056036644946,26.1545291574616],[-81.8055562120129,26.154540427457],[-81.8055684617121,26.1538568606884],[-81.8057408074064,26.1537879892372]]]]}},{"id":710,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8058704788091,26.1536123828055],[-81.8062384630786,26.1542322417851],[-81.8061892388635,26.1542666085673],[-81.806137016817,26.1543009462607],[-81.8060664067602,26.1543432734587],[-81.8060137403971,26.154372111312],[-81.8059477659133,26.1544051274068],[-81.8058900267616,26.1544314258713],[-81.8058284459834,26.1544568975394],[-81.8057658334884,26.1544801052621],[-81.8058114124819,26.1539705451444],[-81.8057408074064,26.1537879892372],[-81.8058704788091,26.1536123828055]]]]}},{"id":711,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8063991232662,26.1533245201809],[-81.8064588772186,26.1534251066503],[-81.8065405616552,26.1534750409793],[-81.8065113839835,26.1535135369475],[-81.8067557249205,26.1539253669817],[-81.8066824061536,26.153957920171],[-81.8066227822361,26.1539871411056],[-81.8065643894245,26.1540180745847],[-81.8065071781736,26.1540509042968],[-81.8064237073048,26.1541032994997],[-81.8062384630786,26.1542322417851],[-81.8058704788091,26.1536123828055],[-81.8059410287679,26.1535650581346],[-81.8059804595384,26.1535398937911],[-81.8060204284651,26.1535154142106],[-81.8061016496137,26.1534683736338],[-81.8061845902929,26.1534238911192],[-81.8062267408582,26.1534026777146],[-81.806312121915,26.1533621476962],[-81.8063991232662,26.1533245201809]]]]}},{"id":712,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.806684621137,26.1532161312239],[-81.8070469318147,26.1538269182024],[-81.8069626783843,26.1538504311134],[-81.806898904577,26.1538709176127],[-81.8068359057471,26.1538932796892],[-81.8067557249205,26.1539253669817],[-81.8065113839835,26.1535135369475],[-81.8065405616552,26.1534750409793],[-81.8064588772186,26.1534251066503],[-81.8063991232662,26.1533245201809],[-81.8064367166444,26.1533055560714],[-81.8064750816908,26.1532879861283],[-81.8065339774342,26.1532637443168],[-81.806573887864,26.1532492607281],[-81.8066143653291,26.1532359661141],[-81.806684621137,26.1532161312239]]]]}},{"id":713,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8069972590544,26.1531535107785],[-81.8073622219702,26.1537692799886],[-81.8072578126257,26.1537837814415],[-81.8071913077756,26.153794998275],[-81.8071252741927,26.1538082528667],[-81.8070469318147,26.1538269182024],[-81.806684621137,26.1532161312239],[-81.8067384672253,26.1532037933747],[-81.8068017422442,26.1531920904718],[-81.8068654946728,26.1531833194178],[-81.8068979817047,26.1531827935195],[-81.8069299577088,26.1531781437646],[-81.8069609411443,26.1531695333348],[-81.8069759656854,26.1531637863858],[-81.8069972590544,26.1531535107785]]]]}},{"id":714,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8057437539679,26.1522753030935],[-81.806260403356,26.1522795418831],[-81.8062595666349,26.1523167328392],[-81.8062448060407,26.1524311024993],[-81.8062321906643,26.152484293088],[-81.806168021053,26.1526836744895],[-81.8061504416845,26.1527168782968],[-81.8060366305063,26.1528048181928],[-81.8058654238759,26.1529209344717],[-81.8057442838519,26.1529848885069],[-81.8056057702596,26.153012188948],[-81.8055398294494,26.1530204214559],[-81.8055080290195,26.1525623048531],[-81.805504690173,26.1525606957672],[-81.8055045499398,26.1525587707518],[-81.8054640949471,26.1525346264639],[-81.8054320911045,26.1525019063621],[-81.8053927870059,26.152456686451],[-81.8053469523496,26.1524148731945],[-81.8054205593698,26.152405887198],[-81.8054600376868,26.1523802871345],[-81.8054947527442,26.1523528108262],[-81.8055207498006,26.1523283407464],[-81.8055210449805,26.1523195354395],[-81.8057437539679,26.1522753030935]]]]}},{"id":715,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8057559672504,26.1514867114528],[-81.8063786563717,26.1519287740838],[-81.8063417364747,26.1519495684984],[-81.8062929513535,26.1520033284042],[-81.8062609686224,26.152066095932],[-81.8055546797395,26.151901678027],[-81.8055800759144,26.1518230137873],[-81.8055997518999,26.1517547900275],[-81.8056260925997,26.1516879045575],[-81.8056587491471,26.1516233451514],[-81.8056969427358,26.1515623771021],[-81.8057559672504,26.1514867114528]]]]}},{"id":716,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8055546797395,26.151901678027],[-81.8062609686224,26.152066095932],[-81.8062502383376,26.1521089591878],[-81.8062473460317,26.1521538419238],[-81.8062526830195,26.152198541036],[-81.8062660872872,26.1522416589328],[-81.806260403356,26.1522795418831],[-81.8057437539679,26.1522753030935],[-81.8055210449805,26.1523195354395],[-81.8055164627182,26.1523070204426],[-81.8055100398058,26.1522965103181],[-81.8055007739168,26.1522863141337],[-81.805489538794,26.1522778942783],[-81.8054779404301,26.1522720671126],[-81.8054640921505,26.1522678344354],[-81.8054496258215,26.1522660812415],[-81.8054368517648,26.1522666112014],[-81.8055546797395,26.151901678027]]]]}},{"id":717,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8053469523496,26.1524148731945],[-81.8053927870059,26.152456686451],[-81.8054320911045,26.1525019063621],[-81.8054640949471,26.1525346264639],[-81.8055045499398,26.1525587707518],[-81.805504690173,26.1525606957672],[-81.8055080290195,26.1525623048531],[-81.8055398294494,26.1530204214559],[-81.8054837943475,26.1530099366196],[-81.8054276136476,26.1530078435595],[-81.8053703225277,26.1530142164494],[-81.8053160082053,26.1530286656155],[-81.8052135900824,26.1527114583743],[-81.8052455494469,26.1524268344824],[-81.8053469523496,26.1524148731945]]]]}},{"id":718,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8052455494469,26.1524268344824],[-81.8052135900824,26.1527114583743],[-81.8049238488367,26.1527456789945],[-81.8048833412902,26.152469507242],[-81.8052455494469,26.1524268344824]]]]}},{"id":719,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8073387986976,26.1515654488136],[-81.8073409576909,26.1515801782478],[-81.8072260347543,26.1519345046174],[-81.807193728121,26.1519168949619],[-81.8072116464161,26.1519108566584],[-81.8072213141417,26.1519019071162],[-81.8072368487891,26.151866949326],[-81.8072406670071,26.151827471965],[-81.8072344929376,26.1516870149168],[-81.807244669345,26.1516486253024],[-81.8072893548767,26.1515898442998],[-81.8073114527502,26.1515747037892],[-81.8073387986976,26.1515654488136]]]]}},{"id":720,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8052135900824,26.1527114583743],[-81.8053160082053,26.1530286656155],[-81.8052502708145,26.1530591352545],[-81.8051929488604,26.1531017316212],[-81.8051470758074,26.153154282706],[-81.805115294031,26.1532131514108],[-81.8049945493472,26.1532274674217],[-81.8049238488367,26.1527456789945],[-81.8052135900824,26.1527114583743]]]]}},{"id":721,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8062572155684,26.151194738419],[-81.8066592463107,26.1518422842752],[-81.8065826675512,26.1518549557295],[-81.8065079921288,26.1518747465291],[-81.806436006072,26.1519014459404],[-81.8063786563717,26.1519287740838],[-81.8057559672504,26.1514867114528],[-81.8058150640757,26.1514252825388],[-81.8058835832848,26.151367262736],[-81.8059456247888,26.151324043614],[-81.8060252569226,26.1512788690055],[-81.8061241850054,26.1512359248297],[-81.8062572155684,26.151194738419]]]]}},{"id":722,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8068462537292,26.1511355687965],[-81.8069488238238,26.1518437571934],[-81.8068870849306,26.1518386237249],[-81.8068146879498,26.1518388000303],[-81.8067368658597,26.1518368974775],[-81.8066592463107,26.1518422842752],[-81.8062572155684,26.151194738419],[-81.8063513222545,26.1511821294993],[-81.8066524583898,26.1511469481373],[-81.806740068742,26.1511390293635],[-81.8068462537292,26.1511355687965]]]]}},{"id":723,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8068462537292,26.1511355687965],[-81.8069573390092,26.1511391419623],[-81.8070833237326,26.1511520542164],[-81.8072130903272,26.1511755829147],[-81.8073337094975,26.1512024412132],[-81.8073821523698,26.1515346222663],[-81.8073351189126,26.151540136007],[-81.8073387986976,26.1515654488136],[-81.8073114527502,26.1515747037892],[-81.8072893548767,26.1515898442998],[-81.807244669345,26.1516486253024],[-81.8072344929376,26.1516870149168],[-81.8072406670071,26.151827471965],[-81.8072368487891,26.151866949326],[-81.8072213141417,26.1519019071162],[-81.8072116464161,26.1519108566584],[-81.807193728121,26.1519168949619],[-81.8071830695833,26.151911062667],[-81.8070696312326,26.1518683449528],[-81.8069488238238,26.1518437571934],[-81.8068462537292,26.1511355687965]]]]}},{"id":724,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8051641848398,26.151871833648],[-81.8051979245754,26.1521019844576],[-81.8048356659645,26.152144565659],[-81.8048019010489,26.1519143461156],[-81.8051641848398,26.151871833648]]]]}},{"id":725,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8055800759144,26.1518230137873],[-81.8054368517648,26.1522666112014],[-81.8054226464782,26.1522695793397],[-81.8054116506569,26.1522738133957],[-81.8054004414839,26.1522802724841],[-81.8053915746452,26.152287497964],[-81.8053833070036,26.1522968980806],[-81.8053769777826,26.1523074336667],[-81.8053727881527,26.1523188055575],[-81.805370930628,26.1523294536956],[-81.8052336368908,26.1523456277464],[-81.8051641848398,26.151871833648],[-81.8055800759144,26.1518230137873]]]]}},{"id":726,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8051979245754,26.1521019844576],[-81.8052336368908,26.1523456277464],[-81.8048714288215,26.1523882775455],[-81.8048356659645,26.152144565659],[-81.8051979245754,26.1521019844576]]]]}},{"id":727,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8054936663756,26.1512548587709],[-81.8055284213978,26.151492225586],[-81.8056969427358,26.1515623771021],[-81.8056587491471,26.1516233451514],[-81.8056260925997,26.1516879045575],[-81.8055997518999,26.1517547900275],[-81.8055800759144,26.1518230137873],[-81.8048019010489,26.1519143461156],[-81.8047701088044,26.1516976419857],[-81.8050720584288,26.1516622759445],[-81.8050204367778,26.1513101430582],[-81.8054936663756,26.1512548587709]]]]}},{"id":728,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8050204367778,26.1513101430582],[-81.8050720584288,26.1516622759445],[-81.8047701088044,26.1516976419857],[-81.8047184620074,26.1513454174128],[-81.8050204367778,26.1513101430582]]]]}},{"id":729,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8060133451138,26.1511941316915],[-81.8060252569226,26.1512788690055],[-81.8059456247888,26.151324043614],[-81.8058835832848,26.151367262736],[-81.8058150640757,26.1514252825388],[-81.8057559672504,26.1514867114528],[-81.8056969427358,26.1515623771021],[-81.8055284213978,26.151492225586],[-81.8054936663756,26.1512548587709],[-81.8060133451138,26.1511941316915]]]]}},{"id":730,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8064507691745,26.1506751561369],[-81.806521916963,26.1511621914535],[-81.8063513222545,26.1511821294993],[-81.8062572155684,26.151194738419],[-81.8061241850054,26.1512359248297],[-81.8060252569226,26.1512788690055],[-81.8059485799412,26.15073363183],[-81.8064507691745,26.1506751561369]]]]}},{"id":731,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8068822936402,26.1506249153404],[-81.8069573390092,26.1511391419623],[-81.8068462537292,26.1511355687965],[-81.806740068742,26.1511390293635],[-81.8066524583898,26.1511469481373],[-81.806521916963,26.1511621914535],[-81.8064507691745,26.1506751561369],[-81.8068822936402,26.1506249153404]]]]}},{"id":732,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8069195096085,26.1508799211713],[-81.8072881208889,26.1508900064985],[-81.8073337094975,26.1512024412132],[-81.8072130903272,26.1511755829147],[-81.8070833237326,26.1511520542164],[-81.8069573390092,26.1511391419623],[-81.8069195096085,26.1508799211713]]]]}},{"id":733,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8072433310336,26.1505828632243],[-81.8072881208889,26.1508900064985],[-81.8069195096085,26.1508799211713],[-81.8068822936402,26.1506249153404],[-81.8072433310336,26.1505828632243]]]]}},{"id":734,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8073821523698,26.1515346222663],[-81.8075033307629,26.1523657721569],[-81.807292012942,26.15239208817],[-81.8072990273208,26.1523494032903],[-81.8073050081933,26.1522587425711],[-81.8073022717692,26.1521637976645],[-81.8072902671132,26.1520694090821],[-81.8072727474097,26.151989403199],[-81.8072614267031,26.1519537935103],[-81.8072260347543,26.1519345046174],[-81.8073409576909,26.1515801782478],[-81.8073351189126,26.151540136007],[-81.8073821523698,26.1515346222663]]]]}},{"id":735,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.805115294031,26.1532131514108],[-81.8050918785754,26.1532621838599],[-81.8050860581735,26.1533024518524],[-81.8050832883961,26.1533430466844],[-81.8050836684952,26.1533836239086],[-81.8050871730718,26.1534241836668],[-81.8050919520659,26.1534542590339],[-81.8051081840414,26.1535244829064],[-81.8051233187542,26.1535828829986],[-81.805150307627,26.1536695535831],[-81.805171097499,26.1537265235561],[-81.8051940418688,26.1537827936945],[-81.8052063499788,26.1538105801957],[-81.8052282246653,26.1538479422062],[-81.8050546024487,26.1538678269299],[-81.8049945493472,26.1532274674217],[-81.805115294031,26.1532131514108]]]]}},{"id":736,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8071951735999,26.1527813514975],[-81.8075723566993,26.1528288321285],[-81.8076223545597,26.1531424412446],[-81.8071185652731,26.1529760271915],[-81.8071721312138,26.1528627740068],[-81.8071951735999,26.1527813514975]]]]}},{"id":737,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8075033307629,26.1523657721569],[-81.8075529009158,26.1527067977007],[-81.8075723566993,26.1528288321285],[-81.8071951735999,26.1527813514975],[-81.8072047535841,26.1527476421732],[-81.8072158297741,26.1527027149931],[-81.8072258523467,26.1526911025918],[-81.8072382248658,26.1526795142739],[-81.8072389075449,26.1526601292278],[-81.80725262402,26.1526511913801],[-81.8072532641288,26.1526290812227],[-81.8072608926689,26.1526131162329],[-81.8072639813995,26.1525947565432],[-81.8072571246711,26.1525666817457],[-81.807267624024,26.1525489109898],[-81.8072702275793,26.1525301857675],[-81.8072857264069,26.1525098550779],[-81.8072973223093,26.1524894688876],[-81.8073029963065,26.1524774137347],[-81.8073272187865,26.1524514473187],[-81.8073350161255,26.1524408647326],[-81.8073380301122,26.1524331016545],[-81.8073392643601,26.1524216560045],[-81.8073449427478,26.1524113933661],[-81.8073444243943,26.1523965171803],[-81.8073464747401,26.1523853062476],[-81.8075033307629,26.1523657721569]]]]}},{"id":738,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8029762003503,26.1517964474811],[-81.8030750929563,26.1518742578563],[-81.8031811443888,26.1519365072039],[-81.8028770327931,26.1524133711309],[-81.8027676402331,26.15234921439],[-81.8026889886563,26.1522966703079],[-81.8025414182698,26.1521809129481],[-81.8029762003503,26.1517964474811]]]]}},{"id":739,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8027975549534,26.1516090358299],[-81.8029248956272,26.1517458144135],[-81.8029762003503,26.1517964474811],[-81.8025414182698,26.1521809129481],[-81.802429271699,26.1520743119663],[-81.8023279150508,26.1519593285755],[-81.8027975549534,26.1516090358299]]]]}},{"id":740,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8023169026604,26.1530271546717],[-81.8023505981831,26.1530510394667],[-81.8023915052786,26.1530819224186],[-81.8024505205723,26.1531307473835],[-81.8025065067832,26.153182386197],[-81.8025628146594,26.1532401903414],[-81.8021082575008,26.1536165342342],[-81.8020671569786,26.1535722404587],[-81.8020452922363,26.1535510408605],[-81.8020110702532,26.1535207625201],[-81.8019873122712,26.1535013158463],[-81.8019502643829,26.1534738502226],[-81.8018983875666,26.1534399102626],[-81.8023169026604,26.1530271546717]]]]}},{"id":741,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8025628146594,26.1532401903414],[-81.8026092832896,26.1532930743103],[-81.8026555898424,26.1533519658292],[-81.8026985077557,26.1534131000589],[-81.8027349973573,26.1534703267987],[-81.8027553722699,26.1534965325046],[-81.8022661288093,26.1538342103227],[-81.8022421993416,26.1538045624924],[-81.8022229194522,26.1537787403597],[-81.8022045744411,26.1537521793786],[-81.8021714722865,26.1536999315469],[-81.8021457929443,26.1536632780298],[-81.8021082575008,26.1536165342342],[-81.8025628146594,26.1532401903414]]]]}},{"id":742,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040181025298,26.1551807535396],[-81.8040131849363,26.1552564373999],[-81.8040071671538,26.1553087426944],[-81.8039992175061,26.155360875364],[-81.8039834659886,26.1554385225775],[-81.8034730254861,26.1555194349276],[-81.8035136219862,26.1553527643288],[-81.8035242963353,26.1552978424116],[-81.8035296582613,26.1552610159678],[-81.8040181025298,26.1551807535396]]]]}},{"id":743,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040083711681,26.1549581258403],[-81.8040147904611,26.1550199907011],[-81.8040180204971,26.1550724277781],[-81.8040191432188,26.1551250371026],[-81.8040181025298,26.1551807535396],[-81.8035296582613,26.1552610159678],[-81.8035349934857,26.1552054589792],[-81.8035370759122,26.1551497367295],[-81.8035359322045,26.1550940324796],[-81.8035309462266,26.155033695651],[-81.8040083711681,26.1549581258403]]]]}},{"id":744,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8039628831859,26.154740879062],[-81.8039819414441,26.1548121189589],[-81.8039931418926,26.1548636403481],[-81.8040023633075,26.1549155166769],[-81.8040083711681,26.1549581258403],[-81.8035309462266,26.155033695651],[-81.8035240459106,26.1549831589841],[-81.8035132807576,26.1549284025349],[-81.8034992938856,26.1548743059922],[-81.8034822381852,26.1548209372804],[-81.8039628831859,26.154740879062]]]]}},{"id":745,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8038810335129,26.1545296584785],[-81.8039068491784,26.1545860962066],[-81.8039268996514,26.1546353214364],[-81.8039450244204,26.1546852681243],[-81.8039628831859,26.154740879062],[-81.8034822381852,26.1548209372804],[-81.803462062541,26.1547682508312],[-81.8034388469331,26.1547167964256],[-81.8034217742238,26.1546831901732],[-81.8034033321435,26.1546499354502],[-81.8033783872752,26.1546093347666],[-81.8038810335129,26.1545296584785]]]]}},{"id":746,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8037300478038,26.1542830817544],[-81.8037632330567,26.1543287947813],[-81.8038077959383,26.1543962929553],[-81.8038483860783,26.1544660600544],[-81.8038810335129,26.1545296584785],[-81.8033783872752,26.1546093347666],[-81.8033405671471,26.1545545228821],[-81.8033050471581,26.1545091437466],[-81.803267024125,26.1544654980265],[-81.8032268804988,26.1544237899225],[-81.8032190975217,26.154411269778],[-81.8032160618545,26.1544020016018],[-81.8032147778596,26.1543925631729],[-81.8032153723918,26.1543829308577],[-81.803217771598,26.1543734489609],[-81.8032247440039,26.1543603421468],[-81.8032313476449,26.1543527396745],[-81.8032394075457,26.1543463441679],[-81.8032484154999,26.1543411355351],[-81.8032583992651,26.154337457514],[-81.8032688776076,26.154335519124],[-81.8037300478038,26.1542830817544]]]]}},{"id":747,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8042525457268,26.1548352078476],[-81.8043539307958,26.1553797116362],[-81.8039834659886,26.1554385225775],[-81.8039992175061,26.155360875364],[-81.8040104173709,26.1552825887],[-81.8040171184402,26.1552039603316],[-81.80401894258,26.155151357482],[-81.804018861208,26.1550987194178],[-81.8040147904611,26.1550199907011],[-81.8040062512231,26.1549416308224],[-81.8039954356701,26.1548758471994],[-81.8042525457268,26.1548352078476]]]]}},{"id":748,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8045247038957,26.1547922372115],[-81.8046259874684,26.1553365808738],[-81.8043539307958,26.1553797116362],[-81.8042525457268,26.1548352078476],[-81.8045247038957,26.1547922372115]]]]}},{"id":749,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8050655689804,26.155021525764],[-81.8051097805527,26.1552597567377],[-81.8046259874684,26.1553365808738],[-81.8045815734629,26.1550983279418],[-81.8050655689804,26.155021525764]]]]}},{"id":750,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8050264997455,26.1548107545131],[-81.8050655689804,26.155021525764],[-81.8045815734629,26.1550983279418],[-81.8045424012528,26.1548872361555],[-81.8050264997455,26.1548107545131]]]]}},{"id":751,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8049872239803,26.1545994800214],[-81.8050264997455,26.1548107545131],[-81.8045424012528,26.1548872361555],[-81.8045032302949,26.1546763048263],[-81.8049872239803,26.1545994800214]]]]}},{"id":752,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.804948049977,26.1543882049417],[-81.8049872239803,26.1545994800214],[-81.8045032302949,26.1546763048263],[-81.8044638793127,26.1544650305907],[-81.804948049977,26.1543882049417]]]]}},{"id":753,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8049057406734,26.1541494359447],[-81.8049107771477,26.1541874194095],[-81.804948049977,26.1543882049417],[-81.8044638793127,26.1544650305907],[-81.8044157103032,26.1542051332969],[-81.8049057406734,26.1541494359447]]]]}},{"id":754,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8044157103032,26.1542051332969],[-81.8045247038957,26.1547922372115],[-81.8042525457268,26.1548352078476],[-81.8041409584515,26.1542364258339],[-81.8044157103032,26.1542051332969]]]]}},{"id":755,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8041409584515,26.1542364258339],[-81.8042525457268,26.1548352078476],[-81.8039954356701,26.1548758471994],[-81.8039877321863,26.1548378785901],[-81.8039754660927,26.1547865465587],[-81.8039534268949,26.1547103253926],[-81.8039268996514,26.1546353214364],[-81.803896089004,26.1545617398808],[-81.8038610213045,26.154489718133],[-81.8038217740234,26.1544194391669],[-81.8037934901403,26.1543735153902],[-81.8037785006807,26.1543510626057],[-81.8037300478038,26.1542830817544],[-81.8041409584515,26.1542364258339]]]]}},{"id":756,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.804851119774,26.1537305359115],[-81.8048842366033,26.153984671008],[-81.8044728977088,26.1540316753153],[-81.8044398314561,26.1537773793445],[-81.804851119774,26.1537305359115]]]]}},{"id":757,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8044398314561,26.1537773793445],[-81.8044728977088,26.1540316753153],[-81.8039858349484,26.1540866668382],[-81.8039751635831,26.1540863825171],[-81.8039646582502,26.1540843778044],[-81.8039501121563,26.1540784294168],[-81.8039377804208,26.1540693965579],[-81.8039312497033,26.1540616839614],[-81.8039262385739,26.1540532980228],[-81.8039219516519,26.1540393828303],[-81.8039218526684,26.1540249398845],[-81.803924074151,26.1540154818949],[-81.8039307657737,26.1540021932055],[-81.8039773930277,26.1539520684645],[-81.8040151925304,26.153907495276],[-81.8040502888268,26.1538614011148],[-81.8040796387219,26.1538182506536],[-81.8044398314561,26.1537773793445]]]]}},{"id":758,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8048180528073,26.1534762400342],[-81.804851119774,26.1537305359115],[-81.8040796387219,26.1538182506536],[-81.8041028050975,26.1537809808885],[-81.804121629289,26.153747678668],[-81.8041391292492,26.1537139023888],[-81.8041553553121,26.1536795829919],[-81.8041701807814,26.1536447670375],[-81.8041837579149,26.1536094307496],[-81.8042041806717,26.1535462238429],[-81.8048180528073,26.1534762400342]]]]}},{"id":759,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8047849605973,26.1532219442789],[-81.8048180528073,26.1534762400342],[-81.8042041806717,26.1535462238429],[-81.8042201591105,26.1534832022335],[-81.8042335265796,26.153409878417],[-81.804240397176,26.15335600936],[-81.8042463761876,26.1532832541014],[-81.8047849605973,26.1532219442789]]]]}},{"id":760,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8047677428663,26.1529376411282],[-81.8047849605973,26.1532219442789],[-81.8042463761876,26.1532832541014],[-81.8042486143331,26.1532206531071],[-81.8042481665655,26.1531664580961],[-81.8042456881957,26.1531125036857],[-81.8042411266933,26.1530585379809],[-81.8042403705347,26.1530260557925],[-81.8047677428663,26.1529376411282]]]]}},{"id":761,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8047309685082,26.1526871945854],[-81.8047677428663,26.1529376411282],[-81.8042403705347,26.1530260557925],[-81.8042268659802,26.152868169752],[-81.8041983160477,26.1527500529524],[-81.8047309685082,26.1526871945854]]]]}},{"id":762,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8046942194098,26.1524367020283],[-81.8047309685082,26.1526871945854],[-81.8041983160477,26.1527500529524],[-81.8041651177359,26.1526616285899],[-81.8041199627907,26.1525632751541],[-81.8043316556682,26.1524794212433],[-81.8046942194098,26.1524367020283]]]]}},{"id":763,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8042947288974,26.1522288149222],[-81.8043316556682,26.1524794212433],[-81.8041199627907,26.1525632751541],[-81.8040904453961,26.1525078210093],[-81.8040178572148,26.1523912109594],[-81.8039269870686,26.1522720664028],[-81.8042947288974,26.1522288149222]]]]}},{"id":764,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.804657444924,26.1521861866662],[-81.8046942194098,26.1524367020283],[-81.8043316556682,26.1524794212433],[-81.8042947288974,26.1522288149222],[-81.804657444924,26.1521861866662]]]]}},{"id":765,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8046206702959,26.1519356254318],[-81.804657444924,26.1521861866662],[-81.8042947288974,26.1522288149222],[-81.8042046765799,26.1519844201818],[-81.8046206702959,26.1519356254318]]]]}},{"id":766,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8042046765799,26.1519844201818],[-81.8042947288974,26.1522288149222],[-81.8039269870686,26.1522720664028],[-81.8038518351188,26.1521890574442],[-81.8037829163615,26.1521222454035],[-81.8037668580783,26.1520957635603],[-81.8037682393292,26.1520674878544],[-81.8037852227674,26.1520436186117],[-81.8038184563601,26.152029746202],[-81.8042046765799,26.1519844201818]]]]}},{"id":767,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034442763725,26.1514667032558],[-81.8034520557677,26.1515195276709],[-81.8032493106197,26.1517821776452],[-81.8031461183841,26.1517145476708],[-81.8030656958801,26.1516407610747],[-81.8029566527416,26.1515236429923],[-81.8034442763725,26.1514667032558]]]]}},{"id":768,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8035502229267,26.1514543281519],[-81.8036140857712,26.1518882398545],[-81.8035505747084,26.1518913911978],[-81.8034924395163,26.1518857317899],[-81.8034299167623,26.1518699863809],[-81.8033770021678,26.1518476763119],[-81.8032493106197,26.1517821776452],[-81.8034520557677,26.1515195276709],[-81.8034442763725,26.1514667032558],[-81.8035502229267,26.1514543281519]]]]}},{"id":769,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8037772184253,26.1514277968936],[-81.8038410054123,26.1518616401272],[-81.8036140857712,26.1518882398545],[-81.8035502229267,26.1514543281519],[-81.8037772184253,26.1514277968936]]]]}},{"id":770,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040041125181,26.1514013116976],[-81.8040678488918,26.1518350633955],[-81.8038410054123,26.1518616401272],[-81.8037772184253,26.1514277968936],[-81.8040041125181,26.1514013116976]]]]}},{"id":771,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8042309301358,26.1513748036466],[-81.8042946160528,26.1518084867343],[-81.8040678488918,26.1518350633955],[-81.8040041125181,26.1514013116976],[-81.8042309301358,26.1513748036466]]]]}},{"id":772,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8045331844201,26.1513395058231],[-81.8045968196806,26.1517730514855],[-81.8042946160528,26.1518084867343],[-81.8042309301358,26.1513748036466],[-81.8045331844201,26.1513395058231]]]]}},{"id":773,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8044695487317,26.1509058225438],[-81.8045331844201,26.1513395058231],[-81.8042309301358,26.1513748036466],[-81.8041671931456,26.150941006151],[-81.8044695487317,26.1509058225438]]]]}},{"id":774,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8041671931456,26.150941006151],[-81.8042309301358,26.1513748036466],[-81.8040041125181,26.1514013116976],[-81.8039403757182,26.1509674223828],[-81.8041671931456,26.150941006151]]]]}},{"id":775,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8039403757182,26.1509674223828],[-81.8040041125181,26.1514013116976],[-81.8037772184253,26.1514277968936],[-81.8037134057682,26.15099383911],[-81.8039403757182,26.1509674223828]]]]}},{"id":776,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8037134057682,26.15099383911],[-81.8037772184253,26.1514277968936],[-81.8033231509529,26.1514808365545],[-81.8032592626314,26.1510467184822],[-81.8037134057682,26.15099383911]]]]}},{"id":777,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8032592626314,26.1510467184822],[-81.8033231509529,26.1514808365545],[-81.803095977416,26.1515073680932],[-81.8030320638856,26.1510731583428],[-81.8032592626314,26.1510467184822]]]]}},{"id":778,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8030320638856,26.1510731583428],[-81.803095977416,26.1515073680932],[-81.8029566527416,26.1515236429923],[-81.802938380722,26.1515040053985],[-81.8028435708023,26.1514139524967],[-81.8027372016676,26.1513348768242],[-81.8026208819362,26.1512679844804],[-81.8024937480834,26.1512133031792],[-81.8024718133166,26.1511966663369],[-81.8024651920628,26.1511719658553],[-81.8024760564844,26.1511485205987],[-81.8024869480383,26.1511401835571],[-81.8025049451893,26.1511345122163],[-81.8030320638856,26.1510731583428]]]]}},{"id":779,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8031811443888,26.1519365072039],[-81.8033181896709,26.1520064931442],[-81.8034052694037,26.152054496336],[-81.8034920193654,26.152109975253],[-81.8031234609252,26.1525460008225],[-81.8030158964306,26.1524817423776],[-81.8028770327931,26.1524133711309],[-81.8031811443888,26.1519365072039]]]]}},{"id":780,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034920193654,26.152109975253],[-81.8036279615187,26.1522154109407],[-81.8037532319867,26.1523389948154],[-81.8032770589021,26.1526811882831],[-81.8032075908696,26.1526120634886],[-81.8031234609252,26.1525460008225],[-81.8034920193654,26.152109975253]]]]}},{"id":781,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8037532319867,26.1523389948154],[-81.8038572679563,26.1524703085879],[-81.8039461165883,26.1526169529721],[-81.8033912481148,26.1528447487685],[-81.8033374528713,26.1527569663988],[-81.8032770589021,26.1526811882831],[-81.8037532319867,26.1523389948154]]]]}},{"id":782,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8039461165883,26.1526169529721],[-81.8040123005275,26.1527665208156],[-81.8040596908271,26.1529278629756],[-81.803461187628,26.1530346001682],[-81.8034327079189,26.1529377583218],[-81.8033912481148,26.1528447487685],[-81.8039461165883,26.1526169529721]]]]}},{"id":783,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8040596908271,26.1529278629756],[-81.8040616477641,26.1529947048223],[-81.8040649640411,26.1530189651439],[-81.8040635357158,26.1530403632536],[-81.8040668323524,26.1530617579108],[-81.8040670476321,26.1530931655896],[-81.8040628712208,26.1531398437027],[-81.8040645116632,26.1532123959356],[-81.8040620623504,26.1532849710002],[-81.8034492536732,26.1532579449284],[-81.8034613797579,26.153188754813],[-81.8034658162067,26.1531392094886],[-81.8034658507834,26.1531145865654],[-81.8034623743792,26.1530743475654],[-81.8034633641203,26.1530408239507],[-81.803461187628,26.1530346001682],[-81.8040596908271,26.1529278629756]]]]}},{"id":784,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034492536732,26.1532579449284],[-81.8040620623504,26.1532849710002],[-81.8040572136944,26.1533410526029],[-81.8040510662689,26.1533892548466],[-81.8040422630725,26.1534391455282],[-81.8040355149853,26.1534701335561],[-81.8040275706308,26.1535007843692],[-81.8040132754428,26.1535462580276],[-81.8039965356531,26.1535908741362],[-81.8039770986503,26.15363484044],[-81.8034134027287,26.1534201184657],[-81.8034273694237,26.1533859951595],[-81.8034372138814,26.1533508631693],[-81.8034447304874,26.1533059546806],[-81.8034492536732,26.1532579449284]]]]}},{"id":785,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8034134027287,26.1534201184657],[-81.8039770986503,26.15363484044],[-81.8039552157837,26.1536777657897],[-81.8039309127678,26.1537196958932],[-81.8039042377343,26.1537602407352],[-81.8038650688046,26.1538125705907],[-81.8038219688692,26.153862148307],[-81.8037871552248,26.1538976030851],[-81.8037504244435,26.1539313261638],[-81.8036985089186,26.1539734103255],[-81.8033077209755,26.1535493238925],[-81.8033357308759,26.153525622462],[-81.8033537964492,26.1535076392649],[-81.8033663743728,26.153493286088],[-81.803378086418,26.1534786167733],[-81.8033923238951,26.1534580642653],[-81.8034050314221,26.1534366720214],[-81.8034134027287,26.1534201184657]]]]}},{"id":786,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8033077209755,26.1535493238925],[-81.8036985089186,26.1539734103255],[-81.8036574557138,26.1540028703046],[-81.8036003432317,26.154039114327],[-81.8035556498587,26.1540637800891],[-81.8035096976154,26.1540863895041],[-81.8034624854045,26.1541067820934],[-81.8033978440151,26.1541305274135],[-81.803348359928,26.1541456137633],[-81.8032943432071,26.1541591205444],[-81.8031508955777,26.1536219116514],[-81.8031780035516,26.153614882622],[-81.8031969123865,26.1536087475824],[-81.8032336965334,26.1535939384529],[-81.8032685263915,26.1535756783589],[-81.8032905310948,26.1535616394306],[-81.8033077209755,26.1535493238925]]]]}},{"id":787,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8031508955777,26.1536219116514],[-81.8032943432071,26.1541591205444],[-81.8032470566736,26.1541686693909],[-81.8031955682142,26.1541767056013],[-81.8031263392784,26.1541834422262],[-81.8030741757196,26.1541856359796],[-81.8030220463273,26.1541853993474],[-81.8029526914004,26.1541811549464],[-81.8029010058965,26.1541752530264],[-81.8028327167496,26.1541634140564],[-81.8029732618023,26.1536235669879],[-81.8029994834381,26.1536280748082],[-81.8030194153257,26.1536303709265],[-81.8030460995198,26.1536319416066],[-81.8030660923919,26.1536320135377],[-81.803086180909,26.1536312137374],[-81.8031128368518,26.1536286578481],[-81.8031508955777,26.1536219116514]]]]}},{"id":788,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8028559807219,26.1535798815644],[-81.8028855012427,26.1535950087694],[-81.8029158921786,26.1536074028988],[-81.8029473841883,26.1536173607066],[-81.8029732618023,26.1536235669879],[-81.8028327167496,26.1541634140564],[-81.8027823388338,26.1541518420353],[-81.8027491251325,26.1541427420599],[-81.8026999648115,26.1541271969917],[-81.8026677748956,26.1541155006316],[-81.8026049248654,26.1540892106638],[-81.8025591214521,26.1540667689814],[-81.8025211791611,26.1540460029446],[-81.8028559807219,26.1535798815644]]]]}},{"id":789,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8027553722699,26.1534965325046],[-81.8027706320485,26.1535139859868],[-81.8027983469834,26.1535399673639],[-81.8028289897689,26.1535631812714],[-81.8028559807219,26.1535798815644],[-81.8025211791611,26.1540460029446],[-81.8024859781465,26.1540249006563],[-81.8024579337228,26.1540064637749],[-81.802417241105,26.153977276195],[-81.8023910879252,26.1539567883318],[-81.8023533718091,26.1539245120401],[-81.8023292875343,26.1539019492816],[-81.8022949297403,26.1538666967857],[-81.8022661288093,26.1538342103227],[-81.8027553722699,26.1534965325046]]]]}},{"id":790,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020216416269,26.1528153333477],[-81.8021030435258,26.1529022976217],[-81.802175807,26.1529407522746],[-81.8022210204697,26.1529661548569],[-81.8022653296716,26.1529930526643],[-81.8023169026604,26.1530271546717],[-81.8018983875666,26.1534399102626],[-81.8018579132175,26.1534165904076],[-81.8017709210229,26.153370305273],[-81.8017577904795,26.1533558660865],[-81.801711679924,26.1533218710306],[-81.8016239817252,26.1532317319174],[-81.8020216416269,26.1528153333477]]]]}},{"id":791,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8018803103518,26.1526758119593],[-81.8019215156802,26.1527243465635],[-81.8019698546528,26.1527721994998],[-81.8020216416269,26.1528153333477],[-81.8016239817252,26.1532317319174],[-81.8015565932737,26.1531768777671],[-81.8014869270702,26.1531121092151],[-81.8013777407967,26.1529888923841],[-81.8018803103518,26.1526758119593]]]]}},{"id":792,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8017828663452,26.1525088785673],[-81.8018253422892,26.1525946612027],[-81.8018803103518,26.1526758119593],[-81.8013777407967,26.1529888923841],[-81.8013315333747,26.1529258043913],[-81.8012819965785,26.1528476036128],[-81.801207967878,26.1526982385788],[-81.8017828663452,26.1525088785673]]]]}},{"id":793,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8017357342669,26.1523253645171],[-81.8017514242597,26.1524132450083],[-81.8017828663452,26.1525088785673],[-81.801207967878,26.1526982385788],[-81.8011783891729,26.1526187345699],[-81.801153179275,26.1525317093838],[-81.8011257653138,26.1523786002095],[-81.8017357342669,26.1523253645171]]]]}},{"id":794,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8011321676809,26.1520141755249],[-81.8017369390952,26.1521039365613],[-81.8017326764856,26.152149285389],[-81.8017317929934,26.1522467495877],[-81.8017357342669,26.1523253645171],[-81.8011257653138,26.1523786002095],[-81.8011188861187,26.1522417002642],[-81.8011197698073,26.1521441902068],[-81.8011321676809,26.1520141755249]]]]}},{"id":795,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012959503403,26.1516585960513],[-81.801794050757,26.1519784186513],[-81.8017574984318,26.1520382531799],[-81.8017369390952,26.1521039365613],[-81.8011321676809,26.1520141755249],[-81.801154138972,26.1519245723389],[-81.8011918783304,26.1518264904463],[-81.8012346678834,26.151746285815],[-81.8012959503403,26.1516585960513]]]]}},{"id":796,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8016183537552,26.1514043845333],[-81.80190693366,26.1518881029001],[-81.8018447371479,26.1519274924974],[-81.801794050757,26.1519784186513],[-81.8012959503403,26.1516585960513],[-81.8013579902137,26.1515888303398],[-81.801439972854,26.1515155834825],[-81.8015313430273,26.1514518216393],[-81.8016183537552,26.1514043845333]]]]}},{"id":797,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020330774103,26.151303699418],[-81.8020526974487,26.1518512283478],[-81.8019774785361,26.1518622391028],[-81.80190693366,26.1518881029001],[-81.8016183537552,26.1514043845333],[-81.8017211723148,26.1513617426668],[-81.8018154278048,26.151333637759],[-81.801928806551,26.1513122354005],[-81.8020330774103,26.151303699418]]]]}},{"id":798,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020330774103,26.151303699418],[-81.8021380535211,26.1513054303713],[-81.802252893516,26.1513194176771],[-81.8023491671576,26.1513412803012],[-81.8024549597798,26.1513769601782],[-81.8022071988341,26.151877374961],[-81.8021287838974,26.1518556420553],[-81.8020526974487,26.1518512283478],[-81.8020330774103,26.151303699418]]]]}},{"id":799,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8024549597798,26.1513769601782],[-81.8025458822086,26.1514186607201],[-81.8026422477837,26.151476218727],[-81.8027180868704,26.1515336159535],[-81.8027975549534,26.1516090358299],[-81.8023279150508,26.1519593285755],[-81.8022727732634,26.1519122014301],[-81.8022071988341,26.151877374961],[-81.8024549597798,26.1513769601782]]]]}},{"id":800,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012380156452,26.1555910823285],[-81.8015972451606,26.1557093999285],[-81.8015499159578,26.1558243401644],[-81.8010343959933,26.1559059599808],[-81.8011934453713,26.155801288358],[-81.8011587984565,26.1557869688256],[-81.8012380156452,26.1555910823285]]]]}},{"id":801,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8010232269609,26.1555203576943],[-81.8012380156452,26.1555910823285],[-81.8011587984565,26.1557869688256],[-81.8011934453713,26.155801288358],[-81.8010343959933,26.1559059599808],[-81.8008531581846,26.15593466279],[-81.8010232269609,26.1555203576943]]]]}},{"id":802,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8011351998465,26.1552478760506],[-81.8017093208291,26.1554372611864],[-81.8015972451606,26.1557093999285],[-81.8010232269609,26.1555203576943],[-81.8011351998465,26.1552478760506]]]]}},{"id":803,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012472739944,26.1549754166818],[-81.8018214941559,26.1551646174363],[-81.8017093208291,26.1554372611864],[-81.8011351998465,26.1552478760506],[-81.8012472739944,26.1549754166818]]]]}},{"id":804,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8014865213913,26.1546179957764],[-81.8019432364162,26.1549837397129],[-81.8019222508125,26.1550057052279],[-81.8019025930332,26.1550286720989],[-81.8018727648831,26.1550689131652],[-81.8018568058239,26.1550941062027],[-81.8018422486045,26.1551199792192],[-81.8018214941559,26.1551646174363],[-81.8012472739944,26.1549754166818],[-81.8012711162263,26.1549216367383],[-81.8012980900025,26.154868871046],[-81.8013177718067,26.1548345327294],[-81.8013497154885,26.1547841466253],[-81.8013845402828,26.1547353034637],[-81.8014221201143,26.1546881415012],[-81.8014486876369,26.1546577310814],[-81.8014865213913,26.1546179957764]]]]}},{"id":805,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8018548935578,26.1543647200282],[-81.8021213919863,26.1548611928984],[-81.8020746841222,26.1548848377504],[-81.8020303899468,26.1549122519673],[-81.8020051858263,26.1549302747558],[-81.8019810048555,26.154949323521],[-81.8019432364162,26.1549837397129],[-81.8014865213913,26.1546179957764],[-81.8015201111256,26.1545854599802],[-81.8015661449886,26.1545449683058],[-81.8016145553531,26.1545065267468],[-81.8016649889344,26.1544704811603],[-81.801699788907,26.1544477739238],[-81.8017535021598,26.1544158367652],[-81.8018090365101,26.1543864571819],[-81.8018548935578,26.1543647200282]]]]}},{"id":806,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8023506262284,26.1542510421768],[-81.8023535461352,26.1548041890616],[-81.8023335577653,26.1548048047957],[-81.8023003282285,26.1548082683612],[-81.8022620658436,26.1548150154741],[-81.8022309704285,26.1548222270306],[-81.802200368163,26.1548309718885],[-81.802170258262,26.1548411354213],[-81.8021213919863,26.1548611928984],[-81.8018548935578,26.1543647200282],[-81.8019248094159,26.1543358105574],[-81.80198466647,26.1543144768581],[-81.8020456103124,26.1542960487084],[-81.802107616015,26.1542805950245],[-81.8021704036845,26.1542680485852],[-81.802225979707,26.1542596460781],[-81.8022951082396,26.154253070927],[-81.8023506262284,26.1542510421768]]]]}},{"id":807,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8023646229765,26.1542509641988],[-81.8024167328034,26.1542520494467],[-81.8024513982074,26.1542542635522],[-81.80250320729,26.1542596605685],[-81.8025546008477,26.1542674442055],[-81.8026054775875,26.1542776608805],[-81.8026556339792,26.1542902658759],[-81.8027049928769,26.1543051220653],[-81.8027531235397,26.1543223923336],[-81.8025096854076,26.1548315183068],[-81.8024721560695,26.1548191638741],[-81.8024333305849,26.1548104389915],[-81.8023936661968,26.1548053411103],[-81.8023535461352,26.1548041890616],[-81.8023506262284,26.1542510421768],[-81.8023646229765,26.1542509641988]]]]}},{"id":808,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8027531235397,26.1543223923336],[-81.8028006091284,26.154341912948],[-81.802846763622,26.1543636648072],[-81.8028915098734,26.1543875107853],[-81.8029347469021,26.1544135431513],[-81.8029899780665,26.1544512468395],[-81.8030293339178,26.154481794349],[-81.8030668992391,26.1545142547051],[-81.80309489846,26.1545408992905],[-81.8026395285355,26.1549140167923],[-81.8026108538075,26.1548888890125],[-81.8025794545933,26.1548665504788],[-81.8025513491144,26.1548503607284],[-81.8025338376281,26.154841700507],[-81.8025096854076,26.1548315183068],[-81.8027531235397,26.1543223923336]]]]}},{"id":809,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.80309489846,26.1545408992905],[-81.8031251132316,26.1545720479743],[-81.8031572729219,26.1546089861307],[-81.803187256649,26.154647197355],[-81.8032149645286,26.1546869343938],[-81.8032402927513,26.1547278768607],[-81.8032631906676,26.1547700479656],[-81.8032835797129,26.1548131042552],[-81.8033020844618,26.1548592202345],[-81.8027207796309,26.1550380531462],[-81.8027057587252,26.1550035641759],[-81.8026871737896,26.1549716857275],[-81.8026650455219,26.1549417298985],[-81.8026395285355,26.1549140167923],[-81.80309489846,26.1545408992905]]]]}},{"id":810,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8033020844618,26.1548592202345],[-81.8033119791605,26.1548870432872],[-81.8033255501786,26.1549323614395],[-81.8033364332426,26.1549783823693],[-81.803344651397,26.1550247620559],[-81.8033501284308,26.1550715009248],[-81.8033522479494,26.1551027833463],[-81.8033532299804,26.1551497306979],[-81.8033522089951,26.1551824062085],[-81.802716157707,26.1552832744928],[-81.8027341470657,26.1552095582327],[-81.8027380734097,26.1551856472594],[-81.8027403327202,26.1551557159905],[-81.8027397445814,26.1551254567],[-81.8027362120917,26.1550955577139],[-81.8027281710891,26.155060181572],[-81.8027207796309,26.1550380531462],[-81.8033020844618,26.1548592202345]]]]}},{"id":811,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8033522089951,26.1551824062085],[-81.8033486019069,26.1552269489829],[-81.803046678975,26.1552750583754],[-81.8029755265978,26.1555983704489],[-81.8026259178395,26.1556536227041],[-81.802716157707,26.1552832744928],[-81.8033522089951,26.1551824062085]]]]}},{"id":812,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8033486019069,26.1552269489829],[-81.8033424770031,26.1552747842463],[-81.8033334456704,26.1553210996672],[-81.8032773741836,26.1555502616128],[-81.8029755265978,26.1555983704489],[-81.803046678975,26.1552750583754],[-81.8033486019069,26.1552269489829]]]]}},{"id":813,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7996800814424,26.153657044134],[-81.7997263526754,26.1540053113429],[-81.799660932477,26.1540080818473],[-81.7994771261139,26.1540285437146],[-81.7994664524116,26.1540279151791],[-81.7994560487614,26.1540259095715],[-81.7994462176489,26.1540221813199],[-81.7994372141924,26.1540168894915],[-81.7994294727329,26.1540103984949],[-81.7994230186729,26.1540027081893],[-81.7994182098334,26.1539941375556],[-81.7994141763751,26.1539800603289],[-81.7993759367139,26.153691906785],[-81.7996800814424,26.153657044134]]]]}},{"id":814,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8000754815016,26.1536120219988],[-81.7999377405994,26.1540323366119],[-81.7998918396057,26.1540215869763],[-81.7998404403657,26.1540129312194],[-81.7997753391499,26.1540065983021],[-81.7997263526754,26.1540053113429],[-81.7996800814424,26.153657044134],[-81.8000754815016,26.1536120219988]]]]}},{"id":815,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8002122843782,26.1535980335469],[-81.8002378265325,26.153599771577],[-81.8002566985126,26.153603105647],[-81.8002689150859,26.1536064766958],[-81.8002926002412,26.1536152863047],[-81.8003038910073,26.153620725853],[-81.8003198598049,26.153630449531],[-81.8003346936338,26.1536413716767],[-81.800352285401,26.1536581246759],[-81.8004125869689,26.1537317265572],[-81.800132137644,26.1541120715959],[-81.8000870088103,26.1540879059062],[-81.8000402996563,26.1540666835344],[-81.7999920873246,26.1540485416077],[-81.7999377405994,26.1540323366119],[-81.8000754815016,26.1536120219988],[-81.8001879061278,26.1535993382305],[-81.8002122843782,26.1535980335469]]]]}},{"id":816,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8004125869689,26.1537317265572],[-81.8004727783018,26.1538003311121],[-81.8005328353973,26.1538641448104],[-81.8005954706153,26.1539260412759],[-81.8006500254356,26.1539764507555],[-81.8002919877868,26.1542367043757],[-81.8002564172725,26.1542023522466],[-81.8002181934418,26.1541700552825],[-81.8001774992724,26.1541405690295],[-81.800132137644,26.1541120715959],[-81.8004125869689,26.1537317265572]]]]}},{"id":817,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8006500254356,26.1539764507555],[-81.8006937276831,26.154014907221],[-81.8007620433987,26.154071613634],[-81.8008496592519,26.1541385294818],[-81.8004443158976,26.1544167455464],[-81.8003169428781,26.1542640771424],[-81.8002919877868,26.1542367043757],[-81.8006500254356,26.1539764507555]]]]}},{"id":818,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8008496592519,26.1541385294818],[-81.8009421140793,26.1542035154886],[-81.8010177162283,26.154252111231],[-81.8010845731807,26.1542923187357],[-81.8005383717991,26.1545488278929],[-81.8005183264346,26.1545150314681],[-81.8004963832469,26.1544823231201],[-81.8004725430192,26.1544508174747],[-81.8004443158976,26.1544167455464],[-81.8008496592519,26.1541385294818]]]]}},{"id":819,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8010845731807,26.1542923187357],[-81.8011344045283,26.154320584664],[-81.8012156628496,26.1543641509247],[-81.801236256606,26.1543777920728],[-81.80125455628,26.154394013715],[-81.8012664612993,26.1544075427149],[-81.8012767474524,26.1544220894732],[-81.801287839219,26.1544430052308],[-81.801295534102,26.1544649715658],[-81.8012989781886,26.1544819865668],[-81.8013002000748,26.1544935116447],[-81.8012999013165,26.1545167146166],[-81.8012961199078,26.1545395701462],[-81.8012887525141,26.1545618266201],[-81.8012781516365,26.1545830235526],[-81.8012680408296,26.1545978672017],[-81.8012427273924,26.1546296461836],[-81.8006049562656,26.1547165984948],[-81.8005946179668,26.1546795155262],[-81.8005774173977,26.1546307783422],[-81.8005565173054,26.1545834143659],[-81.8005383717991,26.1545488278929],[-81.8010845731807,26.1542923187357]]]]}},{"id":820,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012427273924,26.1546296461836],[-81.8012084692886,26.1546759184257],[-81.8011827154484,26.15471388992],[-81.8011584154879,26.1547527245175],[-81.8011357204144,26.1547922150431],[-81.801114452724,26.1548324083372],[-81.8010948396323,26.1548730968008],[-81.8010748540606,26.1549187623179],[-81.8010382209877,26.1550078738625],[-81.800624614616,26.1548872205988],[-81.8006238304337,26.1548430461776],[-81.800620723558,26.1548047079222],[-81.8006132150032,26.1547541973993],[-81.8006049562656,26.1547165984948],[-81.8012427273924,26.1546296461836]]]]}},{"id":821,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.800624614616,26.1548872205988],[-81.8010382209877,26.1550078738625],[-81.800942265708,26.1552413835335],[-81.8005783013133,26.1551213252588],[-81.8005957647947,26.1550708593271],[-81.8006059009818,26.1550336625417],[-81.8006115468415,26.155008526971],[-81.8006180455942,26.1549706396935],[-81.8006211998024,26.154945197007],[-81.800624614616,26.1548872205988]]]]}},{"id":822,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8005783013133,26.1551213252588],[-81.800942265708,26.1552413835335],[-81.8008404887383,26.1554892085321],[-81.8004745204493,26.1553696884565],[-81.8004940412008,26.1553265933376],[-81.8005783013133,26.1551213252588]]]]}},{"id":823,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8004745204493,26.1553696884565],[-81.8008404887383,26.1554892085321],[-81.8007398610985,26.1557342759242],[-81.80035676789,26.1555362597833],[-81.8003894908136,26.1554994647897],[-81.8004196084031,26.1554605979852],[-81.8004465898621,26.1554200520669],[-81.8004745204493,26.1553696884565]]]]}},{"id":824,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.80035676789,26.1555362597833],[-81.8007398610985,26.1557342759242],[-81.800643955628,26.1559678080435],[-81.8004436877034,26.1559998716568],[-81.8001989204502,26.1556607778994],[-81.8002416899306,26.1556331892987],[-81.8002824628036,26.1556033879398],[-81.8003207286673,26.1555710327676],[-81.80035676789,26.1555362597833]]]]}},{"id":825,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8001989204502,26.1556607778994],[-81.8004436877034,26.1559998716568],[-81.8000967146856,26.1560545758574],[-81.8000013323963,26.1557430343705],[-81.8000413647384,26.1557312801083],[-81.8000658729332,26.1557228905257],[-81.8001019769702,26.155708773746],[-81.8001488036057,26.1556875361144],[-81.8001989204502,26.1556607778994]]]]}},{"id":826,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8000013323963,26.1557430343705],[-81.8000967146856,26.1560545758574],[-81.7997649956249,26.1561073145681],[-81.7997153672996,26.1558443515819],[-81.7997161336157,26.155830064306],[-81.7997190170365,26.1558207631845],[-81.7997235298311,26.1558119803175],[-81.7997296752819,26.1558041971366],[-81.7997372492284,26.1557972772183],[-81.7997508135444,26.1557896362476],[-81.7997608762576,26.1557863248463],[-81.7999169645279,26.1557613625171],[-81.7999554017523,26.155754110673],[-81.8000013323963,26.1557430343705]]]]}},{"id":827,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7998946181001,26.1553827000126],[-81.8000227158751,26.1556787680871],[-81.7999884914022,26.15568911451],[-81.7999301806399,26.1557026668248],[-81.7997557484355,26.1557309865576],[-81.7997450839559,26.1557317335662],[-81.7997345104581,26.1557309210874],[-81.7997242048243,26.1557284105818],[-81.7997145490345,26.1557243374854],[-81.7997058491727,26.1557188835084],[-81.799698359267,26.1557120472402],[-81.7996898169892,26.1556998979375],[-81.7996862237956,26.1556907932634],[-81.7996363151688,26.1554276483757],[-81.7998475734615,26.1553943097689],[-81.7998710647911,26.1553895482068],[-81.7998946181001,26.1553827000126]]]]}},{"id":828,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8000595954831,26.1552345974126],[-81.8003842917993,26.1554076742709],[-81.8003527589498,26.1554513405083],[-81.8003311417411,26.1554775965054],[-81.8003159123705,26.1554943714087],[-81.8003000200218,26.1555107831754],[-81.8002750308593,26.1555343067589],[-81.800230494518,26.1555710068864],[-81.8001826299853,26.1556039426704],[-81.8001421959023,26.1556275520464],[-81.800110677372,26.1556435462342],[-81.8000782846618,26.1556580092167],[-81.8000563456011,26.155666888905],[-81.8000227158751,26.1556787680871],[-81.7998946181001,26.1553827000126],[-81.7999205902101,26.1553729267527],[-81.7999500327101,26.1553579758171],[-81.7999734524176,26.155342714438],[-81.7999949517503,26.1553252398815],[-81.8000173810407,26.1553025788353],[-81.8000341030061,26.1552811645794],[-81.8000503071316,26.155254594804],[-81.8000595954831,26.1552345974126]]]]}},{"id":829,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8001501015544,26.1550138426141],[-81.8005060211135,26.155138921688],[-81.8004279491863,26.1553278089556],[-81.8004082006274,26.1553673059193],[-81.8003842917993,26.1554076742709],[-81.8000595954831,26.1552345974126],[-81.8001501015544,26.1550138426141]]]]}},{"id":830,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8005556763937,26.1547803092231],[-81.8005619370147,26.1548340822062],[-81.8005634236378,26.1548695178427],[-81.8005621205048,26.154916798904],[-81.8005573107156,26.1549639389744],[-81.8005512491632,26.1549988892661],[-81.8005400575179,26.1550452165411],[-81.8005253022975,26.1550905090185],[-81.8005060211135,26.155138921688],[-81.8001501015544,26.1550138426141],[-81.8001620145196,26.1549838577379],[-81.8001676162573,26.1549671363425],[-81.800173457699,26.1549445903608],[-81.800177671026,26.1549217095318],[-81.8001800031515,26.1548986328191],[-81.8001806469975,26.1548812970361],[-81.8001799054082,26.1548582374013],[-81.8001773857947,26.1548352105714],[-81.8005556763937,26.1547803092231]]]]}},{"id":831,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003954658841,26.1544503746602],[-81.8004302534551,26.1544928240513],[-81.8004517946257,26.1545224625334],[-81.8004777061187,26.154563402263],[-81.8005003767444,26.1546059189826],[-81.8005197279457,26.1546496692375],[-81.8005355563428,26.1546946312333],[-81.8005479624471,26.1547406439292],[-81.8005556763937,26.1547803092231],[-81.8001773857947,26.1548352105714],[-81.8001730382912,26.1548123543806],[-81.8001669659164,26.1547898745923],[-81.8001591948559,26.1547678856915],[-81.8001497255796,26.1547464564542],[-81.8001386085806,26.1547255407469],[-81.8001258971669,26.1547055050923],[-81.8001116673903,26.1546863261412],[-81.8000937135214,26.1546649211103],[-81.8003954658841,26.1544503746602]]]]}},{"id":832,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8001942586387,26.1542252111493],[-81.8002299155817,26.1542573389723],[-81.8002613085269,26.1542900177819],[-81.8003954658841,26.1544503746602],[-81.8000937135214,26.1546649211103],[-81.799937729201,26.1544776781259],[-81.8001942586387,26.1542252111493]]]]}},{"id":833,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7997641815858,26.1540616831467],[-81.7998201251418,26.1540661869773],[-81.7998792537755,26.1540758314919],[-81.7999026337778,26.1540808600348],[-81.7999371935878,26.1540899531943],[-81.7999935138381,26.154108714962],[-81.8000154960191,26.1541173735906],[-81.8000477805021,26.1541317982409],[-81.800099611297,26.1541590217473],[-81.8001485997876,26.154190387742],[-81.800167363322,26.154203878731],[-81.8001942586387,26.1542252111493],[-81.799937729201,26.1544776781259],[-81.7999191244677,26.1544576751849],[-81.7998984241524,26.1544395638289],[-81.7998717773138,26.1544211416033],[-81.7998513525318,26.15440990657],[-81.7998254395643,26.1543985186034],[-81.7997983249456,26.1543897279659],[-81.7997656081033,26.1543826878986],[-81.7997370081057,26.1543795911959],[-81.7997641815858,26.1540616831467]]]]}},{"id":834,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7997241644876,26.1540606902719],[-81.7997641815858,26.1540616831467],[-81.7997370081057,26.1543795911959],[-81.7997081472813,26.1543792241537],[-81.7996889004767,26.1543805461142],[-81.7994711075628,26.1544053004842],[-81.7994359702046,26.1541400101072],[-81.799437497529,26.1541255581215],[-81.7994408648301,26.1541164377275],[-81.7994458359214,26.1541078128074],[-81.799452465201,26.1541002103617],[-81.7994647739995,26.1540910174068],[-81.7994743723021,26.154086676926],[-81.7994845386761,26.1540836859371],[-81.7996640533646,26.1540634312978],[-81.7997241644876,26.1540606902719]]]]}},{"id":835,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7997157549478,26.1545449383426],[-81.7997349201755,26.1545465513848],[-81.7997532440695,26.154551447543],[-81.7997699654931,26.1545597686017],[-81.7997845235597,26.1545712196355],[-81.7999407836013,26.1547579339515],[-81.7995259223927,26.1548144122892],[-81.7994933132291,26.1545697414912],[-81.7997157549478,26.1545449383426]]]]}},{"id":836,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7999407836013,26.1547579339515],[-81.7999660151104,26.1547885836877],[-81.7999787265066,26.1548086193566],[-81.7999862023897,26.1548245803169],[-81.7999900878274,26.1548355633096],[-81.7999952977338,26.1548582313063],[-81.79999683864,26.1548755778792],[-81.7999967394686,26.154887110308],[-81.7999939245013,26.1549101667743],[-81.7999856564982,26.1549382285161],[-81.7999744106002,26.1549654585294],[-81.7995595231204,26.1550219141946],[-81.7995399677294,26.1549183504855],[-81.7995259223927,26.1548144122892],[-81.7999407836013,26.1547579339515]]]]}},{"id":837,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7999744106002,26.1549654585294],[-81.7998855758793,26.1551817562588],[-81.7998761530609,26.1551969398848],[-81.7998634646284,26.1552100782895],[-81.7998560845681,26.1552156215655],[-81.7998439381843,26.1552225668845],[-81.7998306369544,26.1552277991514],[-81.7998214055445,26.1552300742612],[-81.799605378866,26.1552644709793],[-81.7995595231204,26.1550219141946],[-81.7999744106002,26.1549654585294]]]]}},{"id":838,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7995589485372,26.1525710145208],[-81.7996225568274,26.1529994502273],[-81.7993786789247,26.1530281549885],[-81.7993521694328,26.1530261012054],[-81.7993332094291,26.1530172881396],[-81.7993160654571,26.1529991111002],[-81.7993096161252,26.1529809205583],[-81.7992540507568,26.1526067980995],[-81.7995589485372,26.1525710145208]]]]}},{"id":839,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.799833234482,26.1525388163063],[-81.7998967669179,26.1529671605927],[-81.7996225568274,26.1529994502273],[-81.7995589485372,26.1525710145208],[-81.799833234482,26.1525388163063]]]]}},{"id":840,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8001073427597,26.1525066644112],[-81.8001708499884,26.1529348940703],[-81.7998967669179,26.1529671605927],[-81.799833234482,26.1525388163063],[-81.8001073427597,26.1525066644112]]]]}},{"id":841,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003813746664,26.1524745124213],[-81.8004447806369,26.152902650802],[-81.8001708499884,26.1529348940703],[-81.8001073427597,26.1525066644112],[-81.8003813746664,26.1524745124213]]]]}},{"id":842,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8008377301527,26.152420941928],[-81.8006608384812,26.1528772168663],[-81.8004447806369,26.152902650802],[-81.8003813746664,26.1524745124213],[-81.8008377301527,26.152420941928]]]]}},{"id":843,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009442613602,26.1524084508413],[-81.8009604168009,26.1525087777677],[-81.8009915416737,26.1526324520186],[-81.8010346114515,26.1527531940504],[-81.801065003882,26.1528774684338],[-81.8006938450459,26.153027245851],[-81.8006608384812,26.1528772168663],[-81.8008377301527,26.152420941928],[-81.8009442613602,26.1524084508413]]]]}},{"id":844,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801065003882,26.1528774684338],[-81.8010693478755,26.1528997973187],[-81.8011076402759,26.1529682024505],[-81.8011500094795,26.1530346820185],[-81.8011918431669,26.153093415496],[-81.8008610609398,26.1532969599347],[-81.8008092979208,26.1532238151382],[-81.8007736883371,26.1531688297655],[-81.80074015457,26.1531127782366],[-81.8006938450459,26.153027245851],[-81.801065003882,26.1528774684338]]]]}},{"id":845,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8011918431669,26.153093415496],[-81.8012288480771,26.1531406668711],[-81.8012809816453,26.1532010854114],[-81.8013176508245,26.1532400851979],[-81.801364732223,26.1532860653831],[-81.8010765699115,26.1535370138082],[-81.8010181553104,26.153479381275],[-81.8009724798997,26.1534309629801],[-81.8009074671459,26.1533556909937],[-81.8008610609398,26.1532969599347],[-81.8011918431669,26.153093415496]]]]}},{"id":846,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.801364732223,26.1532860653831],[-81.8014157245091,26.1533318633066],[-81.8014573928791,26.1533663646286],[-81.8015003994486,26.1533996663285],[-81.8015714116266,26.1534494794963],[-81.8013341012124,26.1537405184339],[-81.801245652251,26.1536780781203],[-81.8011921247742,26.1536367648521],[-81.8011402877036,26.1535937456214],[-81.8010765699115,26.1535370138082],[-81.801364732223,26.1532860653831]]]]}},{"id":847,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015714116266,26.1534494794963],[-81.8016133332129,26.1534764137167],[-81.8016604958368,26.1535045109141],[-81.801708690733,26.1535312497037],[-81.8017626104132,26.1535593092531],[-81.8018034440306,26.1535831544363],[-81.8015742703526,26.153878985887],[-81.8014449952422,26.153808702898],[-81.8013862514809,26.1537735858792],[-81.8013341012124,26.1537405184339],[-81.8015714116266,26.1534494794963]]]]}},{"id":848,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8018034440306,26.1535831544363],[-81.8018364663052,26.1536051631489],[-81.8018661353298,26.1536271675971],[-81.8019035151888,26.1536585976249],[-81.8019299805557,26.153683898343],[-81.8019548272377,26.153710239748],[-81.8019856655579,26.1537472084651],[-81.8020068212352,26.1537761610738],[-81.8020260775462,26.1538059725256],[-81.8017387024013,26.1540345419055],[-81.8016235808304,26.153916539657],[-81.8015977001753,26.1538950184511],[-81.8015742703526,26.153878985887],[-81.8018034440306,26.1535831544363]]]]}},{"id":849,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8020260775462,26.1538059725256],[-81.8020572705809,26.1538539438241],[-81.8020911964382,26.1539003409142],[-81.8021277028623,26.153945187568],[-81.8021615931924,26.1539826665484],[-81.8021691875512,26.1539936288226],[-81.8021760805164,26.1540097533966],[-81.8021791446195,26.1540269080492],[-81.8021782218005,26.1540442683178],[-81.8021733827778,26.1540610313919],[-81.8021647257103,26.1540766923481],[-81.8021590586107,26.1540838081064],[-81.8021491144933,26.1540932861579],[-81.8021336630665,26.1541035285204],[-81.8021160842678,26.1541110086601],[-81.8020683162546,26.154120743212],[-81.8020210644323,26.1541316670357],[-81.8019740783803,26.1541443088287],[-81.8019063902521,26.1541646315213],[-81.8018957282836,26.1541657225655],[-81.8018850547177,26.1541651171352],[-81.8018696589783,26.1541612136978],[-81.8018561185723,26.1541537234425],[-81.801848350474,26.1541470722436],[-81.8017387024013,26.1540345419055],[-81.8020260775462,26.1538059725256]]]]}},{"id":850,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8015166523736,26.1539119763874],[-81.8015353174068,26.1539221892987],[-81.801554635048,26.1539349663095],[-81.8015761934058,26.1539522243809],[-81.8015893371791,26.1539648752651],[-81.8017663200809,26.1541466577372],[-81.8017743315087,26.1541591766919],[-81.8017775194706,26.1541684440531],[-81.8017789303594,26.1541778817907],[-81.8017775049335,26.1541923332289],[-81.8017720601239,26.1542059587741],[-81.8017629198931,26.1542178395746],[-81.8017549629381,26.1542244407626],[-81.8017457540546,26.1542299943145],[-81.801681576326,26.1542621731296],[-81.8016398184803,26.1542852629832],[-81.8015990100656,26.1543097460383],[-81.801549996274,26.1543416569846],[-81.8013213408322,26.1542265101749],[-81.8015166523736,26.1539119763874]]]]}},{"id":851,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8013230097427,26.1538014492005],[-81.8014075733039,26.153852906509],[-81.8014693351384,26.1538872960104],[-81.8015166523736,26.1539119763874],[-81.8013213408322,26.1542265101749],[-81.80126818646,26.1541989505848],[-81.8011945436066,26.1541582765393],[-81.8011582998784,26.154136973388],[-81.8010905675672,26.1540950513198],[-81.8013230097427,26.1538014492005]]]]}},{"id":852,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8011426461923,26.1536712689057],[-81.8011748278666,26.1536966755248],[-81.8012307469438,26.1537385257224],[-81.8012881527413,26.1537786023086],[-81.8013230097427,26.1538014492005],[-81.8010905675672,26.1540950513198],[-81.8010521885488,26.1540698167122],[-81.8009836566711,26.1540223967517],[-81.8009171164545,26.1539727418403],[-81.8008758431411,26.1539403015268],[-81.8011426461923,26.1536712689057]]]]}},{"id":853,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009797705269,26.153523956952],[-81.8010174694658,26.1535612316213],[-81.801068189362,26.1536080628603],[-81.8011426461923,26.1536712689057],[-81.8008758431411,26.1539403015268],[-81.8007898871279,26.1538671863879],[-81.8007294024905,26.1538114681248],[-81.800681630404,26.1537647808621],[-81.8009797705269,26.153523956952]]]]}},{"id":854,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8008355860525,26.1533608822787],[-81.8008989802181,26.1534372179043],[-81.8009449502104,26.153487858426],[-81.8009797705269,26.153523956952],[-81.800681630404,26.1537647808621],[-81.8006428688821,26.1537244169753],[-81.8005879666982,26.1536640365229],[-81.8005355433595,26.153602083288],[-81.8005102541238,26.1535704022866],[-81.8008355860525,26.1533608822787]]]]}},{"id":855,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8006544868546,26.1530817997531],[-81.8007002115483,26.1531635296528],[-81.8007356587731,26.1532207856409],[-81.8007930055543,26.1533043766922],[-81.8008355860525,26.1533608822787],[-81.8005102541238,26.1535704022866],[-81.8004906156729,26.153547814501],[-81.8004733263846,26.1535307159444],[-81.8004547244728,26.1535148397695],[-81.8004299332265,26.1534965678131],[-81.8003923389819,26.1534746071069],[-81.8003696061525,26.1534638893468],[-81.8003460964925,26.1534547348817],[-81.8006544868546,26.1530817997531]]]]}},{"id":856,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8005535853506,26.1529514978801],[-81.8005641620432,26.152952814662],[-81.8005791580326,26.1529577292182],[-81.80059224677,26.1529660703788],[-81.8006024331902,26.152977201742],[-81.8006074440371,26.1529855878041],[-81.8006360524396,26.1530457934632],[-81.8006544868546,26.1530817997531],[-81.8003460964925,26.1534547348817],[-81.8003219357611,26.1534469596027],[-81.8003034608569,26.1534422477622],[-81.800278429819,26.1534372284561],[-81.8002465980091,26.1534332786125],[-81.8002210582368,26.1534318844631],[-81.8001953268192,26.1534321879129],[-81.8001449845852,26.1534369382158],[-81.8002698186611,26.1529830165197],[-81.8005431982072,26.1529518995089],[-81.8005535853506,26.1529514978801]]]]}},{"id":857,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8002698186611,26.1529830165197],[-81.8001449845852,26.1534369382158],[-81.7999318133113,26.1534611632005],[-81.7998742185255,26.1530281778222],[-81.8002698186611,26.1529830165197]]]]}},{"id":858,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7998742185255,26.1530281778222],[-81.7999318133113,26.1534611632005],[-81.7996580003915,26.153492258552],[-81.799600280834,26.1530594571509],[-81.7998742185255,26.1530281778222]]]]}},{"id":859,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.799600280834,26.1530594571509],[-81.7996580003915,26.153492258552],[-81.7993538538939,26.1535268001927],[-81.7993031933027,26.1531493033394],[-81.7993029244775,26.1531396758246],[-81.7993044846125,26.1531300381594],[-81.7993101076368,26.1531164346385],[-81.799315869603,26.1531083097096],[-81.7993273088554,26.1530982733231],[-81.7993412815145,26.1530909510938],[-81.7993515508214,26.1530881658799],[-81.799600280834,26.1530594571509]]]]}},{"id":860,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7996737693248,26.1514640499241],[-81.7997343182511,26.1518722817188],[-81.7992160030789,26.1519327952658],[-81.7991894681228,26.1519306957369],[-81.7991704829081,26.1519218827849],[-81.7991533134115,26.1519036600093],[-81.7991468895716,26.1518854693145],[-81.7990943076096,26.1515314823073],[-81.7996737693248,26.1514640499241]]]]}},{"id":861,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7999480545279,26.1514321266507],[-81.8000085529567,26.1518402668911],[-81.7997343182511,26.1518722817188],[-81.7996737693248,26.1514640499241],[-81.7999480545279,26.1514321266507]]]]}},{"id":862,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8002222127144,26.1514002264894],[-81.8002826352427,26.1518082753167],[-81.8000085529567,26.1518402668911],[-81.7999480545279,26.1514321266507],[-81.8002222127144,26.1514002264894]]]]}},{"id":863,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8004962183261,26.1513683266564],[-81.800556615757,26.1517762837887],[-81.8002826352427,26.1518082753167],[-81.8002222127144,26.1514002264894],[-81.8004962183261,26.1513683266564]]]]}},{"id":864,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8007700715197,26.1513364500782],[-81.8008303930485,26.1517443157981],[-81.800556615757,26.1517762837887],[-81.8004962183261,26.1513683266564],[-81.8007700715197,26.1513364500782]]]]}},{"id":865,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8012232019873,26.1512837217096],[-81.8012470315478,26.1512839788934],[-81.8012747780829,26.1512923989377],[-81.8012935858099,26.1513049724971],[-81.8013105232889,26.151326383048],[-81.8013174935505,26.1513464276249],[-81.8013171387805,26.1513725883987],[-81.8013067891884,26.1513970623866],[-81.8012921164954,26.1514134216219],[-81.8012233275251,26.1514769201438],[-81.8011610003787,26.1515455410865],[-81.8011056144082,26.1516188003416],[-81.8010606114849,26.15169108478],[-81.8010406174277,26.1517131134327],[-81.8010109651332,26.1517232283177],[-81.8008303930485,26.1517443157981],[-81.8007700715197,26.1513364500782],[-81.8012232019873,26.1512837217096]]]]}},{"id":866,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8009166906125,26.1517895507962],[-81.800947400865,26.1517930023605],[-81.8009728689083,26.1518099866057],[-81.8009844461284,26.1518313582239],[-81.8009834965093,26.151859700294],[-81.8009487223898,26.1519977260194],[-81.800939498572,26.1520680461292],[-81.8009322623645,26.1522025256297],[-81.8006250301496,26.1522384855541],[-81.8005646586948,26.1518306888236],[-81.8009166906125,26.1517895507962]]]]}},{"id":867,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8005646586948,26.1518306888236],[-81.8006250301496,26.1522384855541],[-81.8003511509718,26.1522705912968],[-81.800290703302,26.151862657303],[-81.8005646586948,26.1518306888236]]]]}},{"id":868,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.800290703302,26.151862657303],[-81.8003511509718,26.1522705912968],[-81.8000771192173,26.1523026973686],[-81.8000166210483,26.1518946718208],[-81.800290703302,26.151862657303]]]]}},{"id":869,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8000166210483,26.1518946718208],[-81.8000771192173,26.1523026973686],[-81.7998029604443,26.152334826553],[-81.7997424116206,26.1519266865255],[-81.8000166210483,26.1518946718208]]]]}},{"id":870,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7997424116206,26.1519266865255],[-81.7998029604443,26.152334826553],[-81.7995286490942,26.1523669560649],[-81.7994680753312,26.1519587472671],[-81.7997424116206,26.1519266865255]]]]}},{"id":871,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7994680753312,26.1519587472671],[-81.7995286490942,26.1523669560649],[-81.7992237513628,26.1524026707924],[-81.7991711444284,26.1520488215421],[-81.7991734726508,26.1520251487744],[-81.7991833152826,26.1520082204693],[-81.7991990537244,26.1519953632402],[-81.7992240965262,26.1519872459573],[-81.7994680753312,26.1519587472671]]]]}},{"id":872,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7985084485829,26.1555890021139],[-81.7985715293466,26.1558991877318],[-81.7983757779134,26.1559305356463],[-81.7983662275397,26.1559307490743],[-81.7983547097566,26.1559292997955],[-81.7983399143524,26.1559240400097],[-81.7983286369923,26.1559168578458],[-81.7983194287785,26.155907623779],[-81.7983127745494,26.155896656089],[-81.798309847858,26.1558884188801],[-81.7982573307451,26.1556297585375],[-81.7985084485829,26.1555890021139]]]]}},{"id":873,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7987295982138,26.1555532030423],[-81.798792781149,26.1558633879882],[-81.7985715293466,26.1558991877318],[-81.7985084485829,26.1555890021139],[-81.7987295982138,26.1555532030423]]]]}},{"id":874,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7989510272867,26.1555174250092],[-81.7990143123941,26.1558276092826],[-81.798792781149,26.1558633879882],[-81.7987295982138,26.1555532030423],[-81.7989510272867,26.1555174250092]]]]}},{"id":875,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7991720762676,26.1554818092304],[-81.799235461203,26.1557916489513],[-81.7990143123941,26.1558276092826],[-81.7989510272867,26.1555174250092],[-81.7991720762676,26.1554818092304]]]]}},{"id":876,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7994232199234,26.1554412115617],[-81.7994764370938,26.1557015870205],[-81.7994760458527,26.1557150010182],[-81.7994708167431,26.1557305052303],[-81.799464781015,26.1557394799536],[-81.7994553159096,26.1557484737139],[-81.79944486784,26.1557548822699],[-81.7994330849177,26.1557592578033],[-81.799235461203,26.1557916489513],[-81.7991720762676,26.1554818092304],[-81.7994232199234,26.1554412115617]]]]}},{"id":877,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7994492822741,26.1558136634618],[-81.7994670067788,26.1558163162123],[-81.7994758947024,26.1558195453187],[-81.7994857387816,26.1558251534409],[-81.799497626093,26.1558360920235],[-81.7995021669255,26.1558426007811],[-81.799506418239,26.1558513579132],[-81.7995123846308,26.1558769333524],[-81.7995610805574,26.1561149808166],[-81.7993098605612,26.1561557625799],[-81.799246497016,26.1558453954928],[-81.7994178593847,26.1558176207153],[-81.7994492822741,26.1558136634618]]]]}},{"id":878,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.799246497016,26.1558453954928],[-81.7993098605612,26.1561557625799],[-81.7990882017878,26.1561915424555],[-81.7990249670678,26.1558813579573],[-81.799246497016,26.1558453954928]]]]}},{"id":879,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7990249670678,26.1558813579573],[-81.7990882017878,26.1561915424555],[-81.7988669748751,26.1562273425227],[-81.798803816924,26.155917157493],[-81.7990249670678,26.1558813579573]]]]}},{"id":880,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.798803816924,26.155917157493],[-81.7988669748751,26.1562273425227],[-81.798645442827,26.1562631210181],[-81.7985825648684,26.1559529343302],[-81.798803816924,26.155917157493]]]]}},{"id":881,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7985825648684,26.1559529343302],[-81.798645442827,26.1562631210181],[-81.7983941470349,26.1563040620976],[-81.7983414666529,26.1560438666567],[-81.7983419720868,26.1560285491527],[-81.7983466300448,26.1560149510202],[-81.7983544530913,26.1560035591831],[-81.7983633398114,26.1559954169694],[-81.7983739922785,26.155989167841],[-81.7983848135465,26.1559853250271],[-81.7985825648684,26.1559529343302]]]]}},{"id":882,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7983457036989,26.154688216796],[-81.7983968136729,26.1550312992267],[-81.7982023807955,26.1550583523747],[-81.7981917878915,26.1550584110845],[-81.7981833967498,26.155057242502],[-81.7981685025053,26.1550523729893],[-81.7981578660786,26.1550460355268],[-81.7981489697998,26.155037831397],[-81.79814119449,26.1550263655333],[-81.7981369234979,26.1550146968386],[-81.7980926804277,26.1547174745119],[-81.7983457036989,26.154688216796]]]]}},{"id":883,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7985684668034,26.1546620380583],[-81.7986188589198,26.1550003328042],[-81.7983968136729,26.1550312992267],[-81.7983457036989,26.154688216796],[-81.7985684668034,26.1546620380583]]]]}},{"id":884,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7987910775395,26.1546358827488],[-81.7988408772323,26.1549691598547],[-81.7986188589198,26.1550003328042],[-81.7985684668034,26.1546620380583],[-81.7987910775395,26.1546358827488]]]]}},{"id":885,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7990140944514,26.1546097019172],[-81.7990632005609,26.154938030725],[-81.7988408772323,26.1549691598547],[-81.7987910775395,26.1546358827488],[-81.7990140944514,26.1546097019172]]]]}},{"id":886,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7992670132618,26.1545800992765],[-81.7993074566959,26.154852398578],[-81.7993076802867,26.154859114714],[-81.7993064238706,26.1548685902083],[-81.7993037112265,26.154876858696],[-81.799300150923,26.154883756316],[-81.799292872839,26.1548930818207],[-81.7992835773254,26.15490085954],[-81.7992717310833,26.1549071153592],[-81.7992626810977,26.1549099167289],[-81.7990632005609,26.154938030725],[-81.7990140944514,26.1546097019172],[-81.7992670132618,26.1545800992765]]]]}},{"id":887,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7992784847711,26.1549662274758],[-81.7992889854264,26.1549675447701],[-81.7992981480227,26.1549700845786],[-81.7993136490566,26.1549782519791],[-81.7993252833316,26.1549893524667],[-81.7993306487217,26.1549975761198],[-81.7993337462484,26.1550047806809],[-81.7993905163479,26.1552796029059],[-81.7991393451219,26.1553198338464],[-81.7990727273515,26.1549940324293],[-81.7992686054948,26.1549666261972],[-81.7992784847711,26.1549662274758]]]]}},{"id":888,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7990727273515,26.1549940324293],[-81.7991393451219,26.1553198338464],[-81.7989180207513,26.155356001327],[-81.7988507065659,26.1550248389303],[-81.7990727273515,26.1549940324293]]]]}},{"id":889,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7988507065659,26.1550248389303],[-81.7989180207513,26.155356001327],[-81.7986969462033,26.155391571003],[-81.7986282792118,26.1550556473456],[-81.7988507065659,26.1550248389303]]]]}},{"id":890,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7986282792118,26.1550556473456],[-81.7986969462033,26.155391571003],[-81.7984755174343,26.1554273715676],[-81.7984062327711,26.1550864533074],[-81.7986282792118,26.1550556473456]]]]}},{"id":891,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7984062327711,26.1550864533074],[-81.7984755174343,26.1554273715676],[-81.7982243988359,26.1554679674497],[-81.7981650735114,26.1551756432672],[-81.7981647662384,26.1551603531921],[-81.7981687624682,26.1551465753218],[-81.7981747899996,26.1551363856075],[-81.7981844513587,26.1551263591628],[-81.7981975307131,26.1551183771321],[-81.7982083773105,26.1551145341919],[-81.7984062327711,26.1550864533074]]]]}},{"id":892,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7982211016432,26.1538485932027],[-81.7982674219862,26.1541599036286],[-81.7980692293678,26.1541830111804],[-81.7980515110645,26.1541812294139],[-81.7980434929134,26.1541788665923],[-81.798034038188,26.1541744483719],[-81.7980248488534,26.1541679653216],[-81.7980172505166,26.1541600978825],[-81.7980113966841,26.1541510056878],[-81.7980073094828,26.1541402071646],[-81.797968387308,26.1538781928532],[-81.7982211016432,26.1538485932027]]]]}},{"id":893,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7984436104162,26.1538225995019],[-81.7984899556455,26.1541337492258],[-81.7982674219862,26.1541599036286],[-81.7982211016432,26.1538485932027],[-81.7984436104162,26.1538225995019]]]]}},{"id":894,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7986661941954,26.1537964445595],[-81.7987126173009,26.1541077542542],[-81.7984899556455,26.1541337492258],[-81.7984436104162,26.1538225995019],[-81.7986661941954,26.1537964445595]]]]}},{"id":895,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7988889301239,26.1537702655045],[-81.7989354300134,26.1540815746923],[-81.7987126173009,26.1541077542542],[-81.7986661941954,26.1537964445595],[-81.7988889301239,26.1537702655045]]]]}},{"id":896,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7991413668659,26.1537410096795],[-81.7991800856667,26.1539988980453],[-81.7991804236644,26.1540074934964],[-81.7991790643861,26.1540167861517],[-81.7991770004995,26.1540233315725],[-81.7991726900107,26.1540319757442],[-81.7991646544242,26.1540419703061],[-81.7991567975346,26.1540483644619],[-81.7991470296835,26.1540539209513],[-81.7991341025599,26.1540581193979],[-81.7989354300134,26.1540815746923],[-81.7988889301239,26.1537702655045],[-81.7991413668659,26.1537410096795]]]]}},{"id":897,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7991475065026,26.154112724019],[-81.7991589493131,26.1541143799895],[-81.7991689802082,26.1541176027757],[-81.7991832363996,26.1541257771009],[-81.7991913913214,26.1541332974956],[-81.7991956202106,26.1541387763177],[-81.7991999404584,26.1541464784744],[-81.7992029676813,26.1541545546256],[-81.7992425600518,26.154417573577],[-81.7989899464134,26.1544471744764],[-81.7989434198678,26.1541357279174],[-81.7991255173632,26.1541142216037],[-81.7991475065026,26.154112724019]]]]}},{"id":898,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7989434198678,26.1541357279174],[-81.7989899464134,26.1544471744764],[-81.7987669298031,26.1544733552641],[-81.7987207845598,26.1541618606569],[-81.7989434198678,26.1541357279174]]]]}},{"id":899,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7987207845598,26.1541618606569],[-81.7987669298031,26.1544733552641],[-81.7985442662218,26.1544991669314],[-81.7984979462355,26.1541880400319],[-81.7987207845598,26.1541618606569]]]]}},{"id":900,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7984979462355,26.1541880400319],[-81.7985442662218,26.1544991669314],[-81.7983216304319,26.1545253449213],[-81.7982753086816,26.1542138740576],[-81.7984979462355,26.1541880400319]]]]}},{"id":901,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7982753086816,26.1542138740576],[-81.7983216304319,26.1545253449213],[-81.7980687114535,26.1545549459046],[-81.798029941393,26.1542929307864],[-81.7980303851842,26.15428348273],[-81.7980317632724,26.1542769411248],[-81.7980367399137,26.1542653816662],[-81.7980437375428,26.1542558972938],[-81.7980527270136,26.1542479379396],[-81.7980624936867,26.1542421981202],[-81.7980753181698,26.1542378398543],[-81.7982753086816,26.1542138740576]]]]}},{"id":902,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7971966947756,26.1539694484828],[-81.7972134042629,26.1539723134715],[-81.7972212225927,26.1539751818226],[-81.7972302236128,26.1539801299117],[-81.7972381669248,26.1539864365017],[-81.7972441313417,26.153993120865],[-81.7972517439465,26.1540068344509],[-81.7972534329668,26.1540123961703],[-81.7972850353976,26.1542255266872],[-81.7966829707755,26.1542961009911],[-81.7966445294628,26.15403339583],[-81.7971753674947,26.1539711484421],[-81.7971966947756,26.1539694484828]]]]}},{"id":903,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7972850353976,26.1542255266872],[-81.7973360639603,26.1545720718823],[-81.7967341003022,26.1546428063518],[-81.7966829707755,26.1542961009911],[-81.7972850353976,26.1542255266872]]]]}},{"id":904,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7973360639603,26.1545720718823],[-81.7973757127936,26.1548402494874],[-81.7967737653893,26.1549135747155],[-81.7967341003022,26.1546428063518],[-81.7973360639603,26.1545720718823]]]]}},{"id":905,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7973757127936,26.1548402494874],[-81.7974139489352,26.1550986454002],[-81.7968130320386,26.155181754598],[-81.7967737653893,26.1549135747155],[-81.7973757127936,26.1548402494874]]]]}},{"id":906,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7974139489352,26.1550986454002],[-81.797427862625,26.1551946979447],[-81.797460275947,26.1553551165406],[-81.7968623217372,26.1554519652829],[-81.7968273055597,26.1552784930032],[-81.7968130320386,26.155181754598],[-81.7974139489352,26.1550986454002]]]]}},{"id":907,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.797460275947,26.1553551165406],[-81.7975230707925,26.1556647769591],[-81.7969249130941,26.1557618105206],[-81.7968623217372,26.1554519652829],[-81.797460275947,26.1553551165406]]]]}},{"id":908,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7975230707925,26.1556647769591],[-81.7975688079004,26.1558904614117],[-81.797573091519,26.1559151979885],[-81.7975718352723,26.1559284562915],[-81.7975670698477,26.1559412067262],[-81.7975590422576,26.1559524162451],[-81.7975473970175,26.1559621097425],[-81.7975363841907,26.15596767302],[-81.7975262938097,26.1559706634535],[-81.7970407012851,26.1560493521472],[-81.7970276188074,26.1560494245516],[-81.7970151550445,26.156047086279],[-81.7970073110212,26.1560441951358],[-81.796994022384,26.1560363591372],[-81.7969822275444,26.1560240442604],[-81.7969762328156,26.1560129123736],[-81.796973997855,26.1560055195776],[-81.7969249130941,26.1557618105206],[-81.7975230707925,26.1556647769591]]]]}},{"id":909,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7975701663359,26.1560192533005],[-81.7976104928125,26.1562188088929],[-81.7976732996684,26.1562088549459],[-81.7977146026322,26.156413746896],[-81.797376492724,26.1564684184129],[-81.7972946861666,26.1560639258092],[-81.7975701663359,26.1560192533005]]]]}},{"id":910,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7978036246974,26.1559815075172],[-81.7978853070133,26.1563861609782],[-81.7977146026322,26.156413746896],[-81.7976732996684,26.1562088549459],[-81.7976104928125,26.1562188088929],[-81.7975701663359,26.1560192533005],[-81.7978036246974,26.1559815075172]]]]}},{"id":911,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7980853555786,26.155937097442],[-81.7981010964706,26.1559394403867],[-81.7981109266134,26.1559430082491],[-81.7981207960433,26.1559486163251],[-81.7981286391747,26.1559551068259],[-81.7981345032252,26.1559619521875],[-81.7981386641938,26.1559686465041],[-81.7981423322379,26.155977567394],[-81.7982145601554,26.1563329129367],[-81.7978853070133,26.1563861609782],[-81.7978036246974,26.1559815075172],[-81.798076771915,26.1559375118294],[-81.7980853555786,26.155937097442]]]]}},{"id":912,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7980670144282,26.1556048608511],[-81.7981114784865,26.1558262420439],[-81.7981110742977,26.1558377761636],[-81.7981073515432,26.1558506813202],[-81.798099637113,26.1558631042216],[-81.7980893128743,26.1558727904412],[-81.7980768881315,26.1558799205658],[-81.7980658613,26.1558834206027],[-81.7976976809816,26.1559427071665],[-81.7976849022607,26.1559426174644],[-81.7976755677245,26.1559409497025],[-81.7976665794739,26.1559379044496],[-81.7976539570488,26.1559309130919],[-81.7976462906732,26.1559242611023],[-81.7976411172062,26.1559180996814],[-81.7976361062814,26.1559096905922],[-81.7976325328734,26.1558997374853],[-81.7975882478217,26.1556821379638],[-81.7980670144282,26.1556048608511]]]]}},{"id":913,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7979684507626,26.1551198300103],[-81.7980670144282,26.1556048608511],[-81.7975882478217,26.1556821379638],[-81.7974879103479,26.1551862724936],[-81.7979684507626,26.1551198300103]]]]}},{"id":914,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7979361760285,26.1549014533192],[-81.7979684507626,26.1551198300103],[-81.7974879103479,26.1551862724936],[-81.797454247904,26.1549579533915],[-81.7979361760285,26.1549014533192]]]]}},{"id":915,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7978640909287,26.1544137078992],[-81.7979361760285,26.1549014533192],[-81.797454247904,26.1549579533915],[-81.7973824429411,26.1544700227387],[-81.7978640909287,26.1544137078992]]]]}},{"id":916,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.797787913183,26.1538993218896],[-81.7978640909287,26.1544137078992],[-81.7973824429411,26.1544700227387],[-81.7973143275723,26.1540090557313],[-81.7973139839456,26.1539996120349],[-81.7973155453448,26.1539901348659],[-81.7973180619043,26.1539828991776],[-81.7973233333026,26.1539735848791],[-81.7973305168935,26.1539652916737],[-81.7973410303813,26.1539573009996],[-81.7973532879058,26.1539517537738],[-81.7973655639734,26.1539489346633],[-81.797787913183,26.1538993218896]]]]}},{"id":917,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7935282034717,26.1504521677712],[-81.7935858616439,26.1508644076823],[-81.7933845862372,26.1508892680942],[-81.7933537230119,26.150878158389],[-81.7933294212658,26.1508531421653],[-81.7933209196918,26.1508205649601],[-81.7933302002799,26.1507880273694],[-81.793523558841,26.1504527665155],[-81.7935282034717,26.1504521677712]]]]}},{"id":918,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939801205425,26.1503965113925],[-81.7940378045805,26.1508085904723],[-81.7935858616439,26.1508644076823],[-81.7935282034717,26.1504521677712],[-81.7939801205425,26.1503965113925]]],[[[-81.7944157282264,26.1498680900071],[-81.7944657489172,26.1502249360437],[-81.7944647360926,26.150244176739],[-81.7944535539793,26.150265949558],[-81.794437968881,26.1502789888406],[-81.7944132573938,26.1502872639487],[-81.7934845503231,26.1504016495777],[-81.7937447711911,26.1499505635528],[-81.7944157282264,26.1498680900071]]]]}},{"id":919,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7947848179626,26.1525066051183],[-81.7948477004306,26.152946716697],[-81.7943657364776,26.1530082502992],[-81.7943029564496,26.1525680003604],[-81.7947848179626,26.1525066051183]]],[[[-81.7941517938184,26.1510198233212],[-81.7941872278204,26.1512670707477],[-81.7938709796582,26.1513070780631],[-81.7933369380722,26.1522426826032],[-81.7934044730398,26.1527104641815],[-81.7927616922921,26.1527923196671],[-81.7937468391095,26.1510709801251],[-81.7941517938184,26.1510198233212]]]]}},{"id":920,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945641849652,26.1509677531643],[-81.7947848179626,26.1525066051183],[-81.7943029564496,26.1525680003604],[-81.7943657364776,26.1530082502992],[-81.7925743759254,26.1532369272865],[-81.7925708194487,26.1531955650141],[-81.7925743861429,26.1531519626243],[-81.7925838082115,26.1531139907903],[-81.7926011367246,26.1530731555186],[-81.7927616922921,26.1527923196671],[-81.7934044730398,26.1527104641815],[-81.7933369380722,26.1522426826032],[-81.7938709796582,26.1513070780631],[-81.7941872278204,26.1512670707477],[-81.7941517938184,26.1510198233212],[-81.7945641849652,26.1509677531643]]]]}},{"id":921,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7924404022383,26.1528274683773],[-81.7924717485493,26.1528310558061],[-81.792496684979,26.1528484571629],[-81.7925086258581,26.1528749858856],[-81.7925021676355,26.1529079664155],[-81.7924482629463,26.1530021000781],[-81.7924192590829,26.1530670033334],[-81.7924030540641,26.1531275031086],[-81.7923962066691,26.1531893728242],[-81.7923996933441,26.1532580176995],[-81.7920759999688,26.153294852456],[-81.7921458762888,26.1528648076484],[-81.7924404022383,26.1528274683773]]],[[[-81.7930221295155,26.1513424066121],[-81.7933183072239,26.1514823221437],[-81.7925914726714,26.1527519663648],[-81.7923015664506,26.1527887302981],[-81.7922702201551,26.1527851428318],[-81.7922452837716,26.1527677414345],[-81.7922333428081,26.1527411897626],[-81.792239826501,26.1527082091028],[-81.7930221295155,26.1513424066121]]]]}},{"id":922,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7931746013134,26.1510762417379],[-81.7934277609971,26.1510868836599],[-81.7934623081685,26.1510980647583],[-81.7934869636042,26.1511227809678],[-81.7934958964592,26.1511552640797],[-81.7934893558507,26.151183522305],[-81.7933183072239,26.1514823221437],[-81.7930221295155,26.1513424066121],[-81.7931746013134,26.1510762417379]]]]}},{"id":923,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949552781854,26.1537894639833],[-81.7949865688353,26.1540059440343],[-81.7945952618864,26.1540519613473],[-81.7945641751609,26.1538354800752],[-81.7949552781854,26.1537894639833]]]]}},{"id":924,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945641751609,26.1538354800752],[-81.7945952618864,26.1540519613473],[-81.7945352799928,26.1540588033144],[-81.7945038123393,26.1538423241291],[-81.7945641751609,26.1538354800752]]]]}},{"id":925,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7948610583539,26.1531410573392],[-81.7948925217794,26.1533568486956],[-81.7944412607777,26.1534097074891],[-81.7944098720407,26.1531935717161],[-81.7948610583539,26.1531410573392]]]]}},{"id":926,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794400486563,26.1535519603427],[-81.794400938704,26.1535624580584],[-81.7943988309521,26.1535738181642],[-81.7943955568063,26.1535817457702],[-81.794389699693,26.1535908797866],[-81.7943805150256,26.1536000550827],[-81.7943701951101,26.1536066459767],[-81.7943584894941,26.1536111811529],[-81.7943503215781,26.1536129456695],[-81.7931088785655,26.1537581930635],[-81.7931010949555,26.153704084181],[-81.794400486563,26.1535519603427]]],[[[-81.7943499184578,26.1532007802627],[-81.7943736950491,26.1533657179287],[-81.7930743042164,26.1535176580796],[-81.7930507061406,26.1533525587045],[-81.7943499184578,26.1532007802627]]]]}},{"id":927,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7930507061406,26.1533525587045],[-81.7931088785655,26.1537581930635],[-81.7929371615173,26.1537783966116],[-81.7928790923662,26.1533729220892],[-81.7930507061406,26.1533525587045]]]]}},{"id":928,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7928790923662,26.1533729220892],[-81.7929371615173,26.1537783966116],[-81.7926497971622,26.1538119834692],[-81.7925918039492,26.153406324988],[-81.7928790923662,26.1533729220892]]]]}},{"id":929,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7924186647775,26.1534265357375],[-81.7925414950569,26.1542921273731],[-81.7920882986092,26.1543449895176],[-81.792072943851,26.1534667701395],[-81.7924186647775,26.1534265357375]]]]}},{"id":930,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794326123297,26.1536708532113],[-81.794341420235,26.1537765045776],[-81.7935950500898,26.1538636808929],[-81.793619353531,26.154031527412],[-81.7943656474251,26.1539441908914],[-81.7943848083562,26.15407648413],[-81.7927094072073,26.1542726330135],[-81.7926515879251,26.1538664692551],[-81.794326123297,26.1536708532113]],[[-81.7934974844278,26.1538724719111],[-81.7927510133278,26.1539599424688],[-81.7927751114395,26.1541276527218],[-81.793521481817,26.1540401596516],[-81.7934974844278,26.1538724719111]]]]}},{"id":931,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7943657241375,26.1536666685592],[-81.7943834748635,26.1536695052092],[-81.7943940712817,26.1536737339657],[-81.7944027707511,26.1536791882744],[-81.7944147659732,26.1536911583767],[-81.794419776571,26.1536995675881],[-81.794422879507,26.1537076205024],[-81.7944750465513,26.1540660134638],[-81.7943848083562,26.15407648413],[-81.794326123297,26.1536708532113],[-81.7943657241375,26.1536666685592]]]]}},{"id":932,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7908015398902,26.1542965334174],[-81.7908156401477,26.1552010562692],[-81.7902536465408,26.1552103312405],[-81.790240529809,26.1543078662239],[-81.7908015398902,26.1542965334174]]]]}},{"id":933,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7907976003241,26.1540362276808],[-81.7908015398902,26.1542965334174],[-81.790240529809,26.1543078662239],[-81.7902365659294,26.1540475376579],[-81.7907976003241,26.1540362276808]]]]}},{"id":934,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7907910481623,26.1536144668148],[-81.7907976003241,26.1540362276808],[-81.7902365659294,26.1540475376579],[-81.7902293557471,26.153682408145],[-81.7907910481623,26.1536144668148]]]]}},{"id":935,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.790821012929,26.1555495742182],[-81.7908273376542,26.1559601482183],[-81.7902650597463,26.1559692414478],[-81.7902588629202,26.1555585062039],[-81.790821012929,26.1555495742182]]]]}},{"id":936,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7908156401477,26.1552010562692],[-81.790821012929,26.1555495742182],[-81.7902588629202,26.1555585062039],[-81.7902536465408,26.1552103312405],[-81.7908156401477,26.1552010562692]]]]}},{"id":937,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7907772999487,26.1529504838999],[-81.7907785001432,26.1530456211899],[-81.7907865985077,26.1534028362502],[-81.7904958232244,26.153431600098],[-81.7901328025675,26.1534757076337],[-81.7901252815454,26.1531511133747],[-81.7901224742328,26.152960611737],[-81.7907772999487,26.1529504838999]]]]}},{"id":938,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8071476512703,26.1529856350413],[-81.8076223545597,26.1531424412446],[-81.807691920973,26.1536866166045],[-81.8076912180983,26.1536952178622],[-81.8076886087887,26.153703646402],[-81.8076840897288,26.1537114207926],[-81.8076742478665,26.1537209215704],[-81.8076661003691,26.153725621275],[-81.8076523086672,26.1537296419195],[-81.8073622219702,26.1537692799886],[-81.8069972590544,26.1531535107785],[-81.8070177242515,26.1531410159692],[-81.8070303373238,26.1531318435999],[-81.8070479385437,26.1531166136929],[-81.8070586333573,26.1531055491973],[-81.8070685613721,26.1530938012124],[-81.8070815665328,26.1530751581293],[-81.8070923546039,26.1530554957912],[-81.8070991297545,26.15303963876],[-81.8071257238065,26.1530133538823],[-81.8071476512703,26.1529856350413]]]]}},{"id":939,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7993637862451,26.1458723689946],[-81.7994880269109,26.1467449853608],[-81.7984127140668,26.1468750949767],[-81.7982887814921,26.146001810992],[-81.7993637862451,26.1458723689946]]]]}},{"id":940,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7972297018467,26.1462547522049],[-81.7972430966153,26.1463494092755],[-81.7972326397541,26.1463506822386],[-81.7972411255972,26.1464107478617],[-81.7971902369026,26.1464168986099],[-81.7972109159037,26.1465630076918],[-81.7972617794151,26.1465568800009],[-81.7972844595518,26.1467171005517],[-81.7972096110169,26.1467261350679],[-81.7972175358938,26.1467821458502],[-81.7973751771017,26.1467630928203],[-81.7973989518468,26.1469311022051],[-81.7972293308519,26.146951642993],[-81.7972154026059,26.1468532519063],[-81.7970776853657,26.1468699018946],[-81.7970550558095,26.1467096122515],[-81.7971238890202,26.1467012988897],[-81.7971202865707,26.1466758019259],[-81.797107291245,26.1465838479324],[-81.7970384327008,26.1465921614253],[-81.7970150836511,26.146426900756],[-81.7970839168555,26.1464186103421],[-81.7970636090697,26.1462747688792],[-81.7972297018467,26.1462547522049]]],[[[-81.7975289175228,26.1462187065782],[-81.7975397754252,26.1462951283805],[-81.7976773653787,26.1462785474456],[-81.7977000201482,26.1464386992898],[-81.7976312379413,26.1464470126414],[-81.79764788655,26.1465643944715],[-81.79771666898,26.1465561040359],[-81.7977400695356,26.1467213184331],[-81.7976712363652,26.1467296320886],[-81.7976916211908,26.1468734730159],[-81.7975255536589,26.1468935818004],[-81.7975036465494,26.1467387676089],[-81.7975649922545,26.1467313437602],[-81.7975443129341,26.1465852576688],[-81.7974934494281,26.1465913854594],[-81.7974707693476,26.1464312107954],[-81.7975455667138,26.1464221535039],[-81.7975376420216,26.1463661885907],[-81.7973800772673,26.1463851955139],[-81.7973593984054,26.1462391323076],[-81.7975289175228,26.1462187065782]]]]}},{"id":941,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7980496938068,26.146030601365],[-81.7981735495332,26.1469040464922],[-81.7978745110929,26.1469402300578],[-81.7977507578954,26.1460666006615],[-81.7980496938068,26.146030601365]]]]}},{"id":942,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7960426807922,26.1466891890942],[-81.7961081194362,26.1471539778734],[-81.7957606521983,26.1471959728635],[-81.7957294368097,26.1471927522199],[-81.7957063961436,26.147181347599],[-81.7956890521023,26.1471634233823],[-81.7956786571669,26.1471363819885],[-81.795622903963,26.146739859681],[-81.7960426807922,26.1466891890942]]]]}},{"id":943,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7963289947444,26.1462377938085],[-81.7963867458139,26.1466476707829],[-81.795622903963,26.146739859681],[-81.7955748126809,26.1463980887228],[-81.7955766669281,26.146371850863],[-81.7955907941022,26.1463461871552],[-81.7956105253221,26.1463303278515],[-81.7956401803391,26.1463207413754],[-81.7963289947444,26.1462377938085]]]]}},{"id":944,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7967397786387,26.1466661917164],[-81.7967968848741,26.1470706385227],[-81.7961531198526,26.1471485019808],[-81.7960953679008,26.1467384185995],[-81.7964394076433,26.1466969003002],[-81.7964401809905,26.1467023066162],[-81.7967397786387,26.1466661917164]]]]}},{"id":945,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7960953679008,26.1467384185995],[-81.7961531198526,26.1471485019808],[-81.7961081194362,26.1471539778734],[-81.7960503927278,26.1467438484796],[-81.7960953679008,26.1467384185995]]]]}},{"id":946,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7966734398043,26.1461963415126],[-81.7967351615417,26.1466334098105],[-81.7964355593001,26.1466695376208],[-81.7963739192185,26.1462324099774],[-81.7966734398043,26.1461963415126]]]]}},{"id":947,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7967351615417,26.1466334098105],[-81.7967397786387,26.1466661917164],[-81.7964401809905,26.1467023066162],[-81.7964355593001,26.1466695376208],[-81.7967351615417,26.1466334098105]]]]}},{"id":948,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7945403465609,26.1470762707968],[-81.7945770792112,26.1473390780211],[-81.7942765655526,26.1473753310684],[-81.7942398840512,26.1471124776227],[-81.7945403465609,26.1470762707968]]]]}},{"id":949,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794497501274,26.1467697769201],[-81.7945403465609,26.1470762707968],[-81.7942398840512,26.1471124776227],[-81.7941970643109,26.1468058917988],[-81.794497501274,26.1467697769201]]]]}},{"id":950,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7944547073452,26.1464633285831],[-81.794497501274,26.1467697769201],[-81.7941970643109,26.1468058917988],[-81.7941542708382,26.1464993975056],[-81.7944547073452,26.1464633285831]]]]}},{"id":951,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949845913716,26.1468725044275],[-81.7950420626074,26.1472829566829],[-81.7946221561415,26.1473336251088],[-81.7945647617667,26.1469230576083],[-81.7949845913716,26.1468725044275]]]]}},{"id":952,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953297748584,26.1468309595277],[-81.7953779846508,26.1471752976413],[-81.7953743421122,26.1472037921422],[-81.7953575629905,26.1472279802657],[-81.7953373695532,26.1472431313748],[-81.7953122452037,26.1472503543009],[-81.7950871142449,26.1472775266916],[-81.7950296430105,26.1468670973828],[-81.7953297748584,26.1468309595277]]]]}},{"id":953,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7953137042716,26.1467160731627],[-81.7953297748584,26.1468309595277],[-81.7950296430105,26.1468670973828],[-81.7950135471545,26.1467521881931],[-81.7953137042716,26.1467160731627]]]]}},{"id":954,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7949195115657,26.1464075067229],[-81.7949769304119,26.1468177988437],[-81.7947670535452,26.1468430295118],[-81.7947096606613,26.1464327142267],[-81.7949195115657,26.1464075067229]]],[[[-81.7951896170787,26.1463750655109],[-81.7952184335328,26.1463766717558],[-81.7952465129825,26.1463894700696],[-81.7952664253524,26.1464115756678],[-81.7952742514559,26.1464344128505],[-81.7953137042716,26.1467160731627],[-81.7950135471545,26.1467521881931],[-81.7949645122287,26.1464020999827],[-81.7951896170787,26.1463750655109]]]]}},{"id":955,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7947096606613,26.1464327142267],[-81.7947670535452,26.1468430295118],[-81.7945571008429,26.1468683290726],[-81.7944997078998,26.1464578990618],[-81.7947096606613,26.1464327142267]]]]}},{"id":956,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793822921592,26.1457058435699],[-81.7939069321787,26.1463076760363],[-81.7934167204947,26.1463664315768],[-81.7933307930724,26.1457662600325],[-81.793822921592,26.1457058435699]]]]}},{"id":957,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7939359699406,26.1465259572683],[-81.7940658782485,26.1474010925052],[-81.7935696504346,26.1474611198173],[-81.7934472312338,26.1465847965132],[-81.7939359699406,26.1465259572683]]]]}},{"id":958,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937383582809,26.1481652868649],[-81.7937544038734,26.1482804257329],[-81.7938736961671,26.1482659667239],[-81.7939187896056,26.1485895054735],[-81.7937304596422,26.1486123462245],[-81.7936691941785,26.148173669228],[-81.7937383582809,26.1481652868649]]]]}},{"id":959,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.794170323016,26.148112972571],[-81.7941863942685,26.1482280883167],[-81.7937544038734,26.1482804257329],[-81.7937383582809,26.1481652868649],[-81.794170323016,26.148112972571]]]]}},{"id":960,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7941863942685,26.1482280883167],[-81.7942315133297,26.148551535109],[-81.7939187896056,26.1485895054735],[-81.7938736961671,26.1482659667239],[-81.7941863942685,26.1482280883167]]]]}},{"id":961,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7941091341362,26.1476745475224],[-81.794170323016,26.148112972571],[-81.7936691941785,26.148173669228],[-81.7936079301488,26.1477351297207],[-81.7941091341362,26.1476745475224]]]]}},{"id":962,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7943273985863,26.1492369823085],[-81.7943849775133,26.1496484658005],[-81.7938838216787,26.1497098741665],[-81.7938263451427,26.1492982523256],[-81.7943273985863,26.1492369823085]]]]}},{"id":963,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7942621337661,26.1487707703636],[-81.7943196860125,26.1491821394318],[-81.7938186580438,26.1492433863519],[-81.7937611316731,26.1488318335042],[-81.7942621337661,26.1487707703636]]]]}},{"id":964,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7944811500586,26.1503347823762],[-81.7945388855311,26.1507467004612],[-81.7940378045805,26.1508085904723],[-81.7939801205425,26.1503965113925],[-81.7944811500586,26.1503347823762]]]]}},{"id":965,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7913615315693,26.1507790031174],[-81.7913931308405,26.1533770369943],[-81.7910884705281,26.1534148654149],[-81.7910568630699,26.1507844824847],[-81.7913615315693,26.1507790031174]]]]}},{"id":966,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7913588649478,26.1505569083421],[-81.7913600811123,26.1506581210167],[-81.7910558452273,26.1506975746908],[-81.7910542475189,26.150562341561],[-81.7913588649478,26.1505569083421]]]]}},{"id":967,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7918305772728,26.1494932894062],[-81.7918449848257,26.1497423496848],[-81.7919524361179,26.1497910962063],[-81.7919623099607,26.1505952715181],[-81.7913602076888,26.1506693541795],[-81.7913588649478,26.1505569083421],[-81.7910542475189,26.150562341561],[-81.7910417709042,26.1495068399377],[-81.7914832436976,26.1494998982799],[-81.7918305772728,26.1494932894062]]]]}},{"id":968,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7912979638609,26.1489093732583],[-81.791322173941,26.1490866435537],[-81.7913412609473,26.1490843377735],[-81.7913426797335,26.1492043030251],[-81.7910382925714,26.14920945977],[-81.7910351098599,26.1489408504075],[-81.7912979638609,26.1489093732583]]]]}},{"id":969,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7913274364026,26.1479309712492],[-81.7913340930728,26.1484848328588],[-81.7910301502976,26.1485217170421],[-81.791023228958,26.147935920582],[-81.7913274364026,26.1479309712492]]]]}},{"id":970,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7917125291705,26.1467935931093],[-81.7917459055988,26.1475688671761],[-81.7917410845898,26.1475960154279],[-81.7917260451072,26.1476183824055],[-81.7917016422758,26.147634702462],[-81.7916733621442,26.1476410938317],[-81.7913241469933,26.1476541548456],[-81.7910199653578,26.1476590581649],[-81.7910107391933,26.1468782864993],[-81.7917125291705,26.1467935931093]]]]}},{"id":971,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7913426797335,26.1492043030251],[-81.7914075538496,26.1493355890997],[-81.7914826736447,26.14944552036],[-81.7914832436976,26.1494998982799],[-81.7910417709042,26.1495068399377],[-81.7910382925714,26.14920945977],[-81.7913426797335,26.1492043030251]]]]}},{"id":972,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7919524361179,26.1497910962063],[-81.7920538828839,26.1498271286742],[-81.7921357264295,26.149849215093],[-81.7921374733935,26.1499913252538],[-81.7920472459871,26.1499691015306],[-81.7919542760617,26.1499394876533],[-81.7919524361179,26.1497910962063]]]]}},{"id":973,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7937611316731,26.1488318335042],[-81.7938263451427,26.1492982523256],[-81.7936022983021,26.1493323631375],[-81.7935576017991,26.1494092059524],[-81.7934955094972,26.1494980433038],[-81.7934252275655,26.1495816527065],[-81.7933472345932,26.1496594354308],[-81.793262161429,26.1497307689816],[-81.793170588744,26.1497951228454],[-81.7930732753354,26.1498520113811],[-81.792991799349,26.1498918472443],[-81.7928860048701,26.1499342241863],[-81.7927766217116,26.1499680693166],[-81.7926644610407,26.1499931259743],[-81.7925733322253,26.1500066954028],[-81.7924583688031,26.1500154667671],[-81.7923430640131,26.1500150694219],[-81.7922283070926,26.150005521401],[-81.7921374733935,26.1499913252538],[-81.7921357264295,26.149849215093],[-81.7922562917495,26.1498687729361],[-81.7923581296807,26.1498761910869],[-81.7924807100257,26.1498743933266],[-81.7926025255351,26.1498609072885],[-81.7927221549253,26.1498359242072],[-81.7928383802831,26.1497996571287],[-81.792949883798,26.1497525718411],[-81.7930554494268,26.1496951565019],[-81.7931380402272,26.1496398851072],[-81.7932297719868,26.1495652594337],[-81.7933124806403,26.1494823611747],[-81.793385308742,26.1493921121179],[-81.79344739932,26.1492955028269],[-81.7934981498899,26.149193591241],[-81.7935369582845,26.1490874811484],[-81.793560063566,26.1489957406057],[-81.7935780077834,26.1488545307423],[-81.7937611316731,26.1488318335042]]]]}},{"id":974,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7938263451427,26.1492982523256],[-81.7938838216787,26.1497098741665],[-81.7931954010009,26.1509026443809],[-81.79300719246,26.1508726156795],[-81.7932803752534,26.1503995416268],[-81.7933659308047,26.1502379448164],[-81.7934389801416,26.1500714189285],[-81.7934991477126,26.1499007684682],[-81.7935402794643,26.1497512920679],[-81.793553404959,26.1496938353848],[-81.7935909080418,26.149466085859],[-81.7936022983021,26.1493323631375],[-81.7938263451427,26.1492982523256]]]]}},{"id":975,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.79300719246,26.1508726156795],[-81.7931954010009,26.1509026443809],[-81.7930761604157,26.1511092932097],[-81.7928879261661,26.1510792645],[-81.79300719246,26.1508726156795]]]]}},{"id":976,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7920739326669,26.1528457160254],[-81.7920091060017,26.1529589154418],[-81.7920147236958,26.1533018380456],[-81.7918243963246,26.1533234952476],[-81.7916156801985,26.1533494029208],[-81.7917452898498,26.153074974188],[-81.7918519275849,26.1528747921508],[-81.7920739326669,26.1528457160254]]]]}},{"id":977,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7936022983021,26.1493323631375],[-81.7935909080418,26.149466085859],[-81.7935430664219,26.1495323770017],[-81.7934846843949,26.1496026695076],[-81.7933702016159,26.149716257703],[-81.793553404959,26.1496938353848],[-81.7935402794643,26.1497512920679],[-81.7932892569204,26.1497820433065],[-81.793156617285,26.149870260284],[-81.7930306837026,26.1499359266544],[-81.7928753276528,26.1499969174444],[-81.7927365836027,26.1500351884448],[-81.7925942940834,26.1500600440466],[-81.7924500067805,26.1500712006089],[-81.7923053471368,26.1500686033312],[-81.7921381924377,26.1500489120161],[-81.7920525759856,26.1500286345957],[-81.7919549795174,26.1499985417837],[-81.7919542760617,26.1499394876533],[-81.7920472459871,26.1499691015306],[-81.7921374733935,26.1499913252538],[-81.7922283070926,26.150005521401],[-81.7923430640131,26.1500150694219],[-81.7924583688031,26.1500154667671],[-81.7925733322253,26.1500066954028],[-81.7926644610407,26.1499931259743],[-81.7927766217116,26.1499680693166],[-81.7928860048701,26.1499342241863],[-81.792991799349,26.1498918472443],[-81.7930732753354,26.1498520113811],[-81.793170588744,26.1497951228454],[-81.793262161429,26.1497307689816],[-81.7933472345932,26.1496594354308],[-81.7934252275655,26.1495816527065],[-81.7934955094972,26.1494980433038],[-81.7935576017991,26.1494092059524],[-81.7936022983021,26.1493323631375]]]]}},{"id":978,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7919873357887,26.1564505160611],[-81.792002675092,26.157337676406],[-81.7911675367691,26.1574727859699],[-81.7911508325971,26.1564614415865],[-81.7919873357887,26.1564505160611]]]]}},{"id":979,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7919724921678,26.1555840323315],[-81.7919873357887,26.1564505160611],[-81.7911508325971,26.1564614415865],[-81.7911367318317,26.1555949535836],[-81.7919724921678,26.1555840323315]]]]}},{"id":980,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7920063636019,26.1575603614018],[-81.7920218084375,26.158451785301],[-81.7911857246338,26.158587244181],[-81.7911730061695,26.1578053007457],[-81.7914711720118,26.1576466635647],[-81.7920063636019,26.1575603614018]]]]}},{"id":981,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003356602298,26.1465160470546],[-81.8003592410413,26.1466754954487],[-81.7998714682123,26.146730247288],[-81.7998478610794,26.1465708018156],[-81.8003356602298,26.1465160470546]]]]}},{"id":982,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003192046796,26.146404784378],[-81.8003356602298,26.1465160470546],[-81.7998478610794,26.1465708018156],[-81.7998313742594,26.1464595435483],[-81.8003192046796,26.146404784378]]]]}},{"id":983,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8003027507609,26.146293523121],[-81.8003192046796,26.146404784378],[-81.7998313742594,26.1464595435483],[-81.7998148969891,26.146348283791],[-81.8003027507609,26.146293523121]]]]}},{"id":984,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8002862936915,26.1461822604445],[-81.8003027507609,26.146293523121],[-81.7998148969891,26.146348283791],[-81.7997984260935,26.1462370225613],[-81.8002862936915,26.1461822604445]]]]}},{"id":985,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7890627128185,26.150805347944],[-81.7890928536472,26.1529713232503],[-81.7853887921289,26.153009818906],[-81.7854305796202,26.1529186425765],[-81.7854695594085,26.1527647782405],[-81.7855045565493,26.1526876468628],[-81.7855567729159,26.1525795628205],[-81.7856934782899,26.1523953841669],[-81.7857143393298,26.1523240843427],[-81.7858605876061,26.1520401013361],[-81.7858995246709,26.1518875668361],[-81.7859225260992,26.1518514012521],[-81.7859943396104,26.1517527245121],[-81.7861157242831,26.1515683768828],[-81.7862403141387,26.1513847452969],[-81.7863027674687,26.1513118470599],[-81.7863708176028,26.1512498026471],[-81.7864437555499,26.1511924598231],[-81.7865211835258,26.1511401313145],[-81.7866026792613,26.1510931025016],[-81.7866877983046,26.1510516298616],[-81.7867760764456,26.15101593957],[-81.7868303171778,26.1509920702406],[-81.7868870427419,26.1509734919478],[-81.7869456215664,26.1509604115384],[-81.7870054014472,26.1509529746465],[-81.7878326950098,26.1509274918783],[-81.7878816131662,26.1508242395713],[-81.7890627128185,26.150805347944]]],[[[-81.7907159716061,26.1476880782289],[-81.790717904056,26.1478542141736],[-81.7895070562248,26.1479022377771],[-81.7895153364362,26.1487892550473],[-81.7899017994593,26.1491315344136],[-81.7899159011941,26.1506110483967],[-81.7900697699707,26.1507475556032],[-81.790751454237,26.150736661757],[-81.7907519382151,26.1507783160838],[-81.7890627128185,26.150805347944],[-81.7890490429787,26.1492978154823],[-81.7882855830613,26.1493105013352],[-81.7882795984371,26.1486163499469],[-81.789042700381,26.1486039871314],[-81.7893329993794,26.14886107355],[-81.7893222809396,26.1477435690265],[-81.7907159716061,26.1476880782289]]]]}},{"id":986,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7907519382151,26.1507783160838],[-81.7907772999487,26.1529504838999],[-81.7901224742328,26.152960611737],[-81.7890928536472,26.1529713232503],[-81.7890627128185,26.150805347944],[-81.7907519382151,26.1507783160838]]]]}},{"id":987,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7920835333765,26.1575478777757],[-81.7920990055911,26.1584395078433],[-81.7920218084375,26.158451785301],[-81.7920063636019,26.1575603614018],[-81.7920835333765,26.1575478777757]]],[[[-81.7920119991293,26.1534702003402],[-81.7920786047651,26.1573259103177],[-81.792002675092,26.157337676406],[-81.7919363304655,26.1534788698798],[-81.7920119991293,26.1534702003402]]],[[[-81.7919648490828,26.1508037186855],[-81.7921519858602,26.1508502457803],[-81.792919818633,26.1510246620494],[-81.7928879261661,26.1510792645],[-81.7930761604157,26.1511092932097],[-81.7920739326669,26.1528457160254],[-81.7918519275849,26.1528747921508],[-81.7917452898498,26.153074974188],[-81.7916156801985,26.1533494029208],[-81.7913931308405,26.1533770369943],[-81.7913669113115,26.1512263103601],[-81.7919691315198,26.1511504616577],[-81.7919759910007,26.1517074856443],[-81.792158434617,26.1516849087418],[-81.7921541117186,26.1511253489405],[-81.7919690727753,26.1511457578033],[-81.7919648490828,26.1508037186855]]]]}},{"id":988,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7935402794643,26.1497512920679],[-81.7934991477126,26.1499007684682],[-81.7934389801416,26.1500714189285],[-81.7933659308047,26.1502379448164],[-81.7932803752534,26.1503995416268],[-81.79300719246,26.1508726156795],[-81.7921459635753,26.1506769106867],[-81.7921381924377,26.1500489120161],[-81.7923053471368,26.1500686033312],[-81.7924500067805,26.1500712006089],[-81.7925942940834,26.1500600440466],[-81.7927365836027,26.1500351884448],[-81.7928753276528,26.1499969174444],[-81.7930306837026,26.1499359266544],[-81.793156617285,26.149870260284],[-81.7932892569204,26.1497820433065],[-81.7935402794643,26.1497512920679]]],[[[-81.7935909080418,26.149466085859],[-81.793553404959,26.1496938353848],[-81.7933702016159,26.149716257703],[-81.7934846843949,26.1496026695076],[-81.7935430664219,26.1495323770017],[-81.7935909080418,26.149466085859]]]]}},{"id":989,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7919623099607,26.1505952715181],[-81.7919691315198,26.1511504616577],[-81.7913669113115,26.1512263103601],[-81.7913615315693,26.1507790031174],[-81.7910568630699,26.1507844824847],[-81.7910558452273,26.1506975746908],[-81.7913600811123,26.1506581210167],[-81.7913602076888,26.1506693541795],[-81.7919623099607,26.1505952715181]]]]}},{"id":990,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.793266745946,26.146606515866],[-81.7933429859686,26.1471526577154],[-81.7929626276365,26.1471992289553],[-81.792947154063,26.1470896578952],[-81.7929017315844,26.1470928424868],[-81.7928520244972,26.1470408671691],[-81.7928475439659,26.146983025981],[-81.792707366439,26.1469928303965],[-81.7926629281902,26.1466791916626],[-81.793266745946,26.146606515866]]]]}},{"id":991,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7926629281902,26.1466791916626],[-81.792707366439,26.1469928303965],[-81.7926438075596,26.147003611594],[-81.7925835986346,26.1470252184472],[-81.7925289696684,26.1470568591987],[-81.792450371685,26.1471238923631],[-81.7924084439174,26.1471480580179],[-81.7923538972902,26.1471655756821],[-81.7923208781771,26.1471698381767],[-81.7922862207447,26.1467245488421],[-81.7926629281902,26.1466791916626]]]]}},{"id":992,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7933429859686,26.1471526577154],[-81.7933967748522,26.1475377745644],[-81.7930170252367,26.1475843884667],[-81.7929626276365,26.1471992289553],[-81.7933429859686,26.1471526577154]]]]}},{"id":993,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7922862207447,26.1467245488421],[-81.7923163151959,26.1471110345196],[-81.7921870765709,26.1471270142035],[-81.7921565988947,26.1467401408536],[-81.7922862207447,26.1467245488421]]]]}},{"id":994,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7921565988947,26.1467401408536],[-81.7921870765709,26.1471270142035],[-81.7920577869508,26.1471429711261],[-81.7920393123991,26.1467542664236],[-81.7921565988947,26.1467401408536]]]]}},{"id":995,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7918022833156,26.1488465121768],[-81.7918305772728,26.1494932894062],[-81.7915270789277,26.1494985110893],[-81.7914826736447,26.14944552036],[-81.7914787794636,26.1490678318657],[-81.7913412609473,26.1490843377735],[-81.7913390958593,26.1489026820897],[-81.7918022833156,26.1488465121768]]]]}},{"id":996,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.791783753355,26.1484269490979],[-81.7918022833156,26.1488465121768],[-81.7913390958593,26.1489026820897],[-81.7913340930728,26.1484848328588],[-81.791783753355,26.1484269490979]]]]}},{"id":997,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7917594294636,26.1478752709412],[-81.791783753355,26.1484269490979],[-81.7913340930728,26.1484848328588],[-81.7913274364026,26.1479309712492],[-81.7917594294636,26.1478752709412]]]]}},{"id":998,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7926656925736,26.1455654650247],[-81.7927907912783,26.146440903291],[-81.7922689538591,26.1465035201205],[-81.7921968805411,26.1456142861842],[-81.7926656925736,26.1455654650247]]]]}},{"id":999,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7932914161951,26.1454913160251],[-81.7934167204947,26.1463664315768],[-81.7927907912783,26.146440903291],[-81.7926656925736,26.1455654650247],[-81.7932914161951,26.1454913160251]]]]}},{"id":1000,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7921968805411,26.1456142861842],[-81.7922689538591,26.1465035201205],[-81.7917855428591,26.1465614990919],[-81.7917243112542,26.1456634932942],[-81.7921968805411,26.1456142861842]]]]}},{"id":1001,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7916961437186,26.1461270106436],[-81.7917504151565,26.1465657042648],[-81.7913011668768,26.1466195963807],[-81.7912849578864,26.1461747097374],[-81.7916961437186,26.1461270106436]]]]}},{"id":1002,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7934472312338,26.1465847965132],[-81.7935235244292,26.1471311672238],[-81.7933429859686,26.1471526577154],[-81.793266745946,26.146606515866],[-81.7934472312338,26.1465847965132]]]]}},{"id":1003,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7935235244292,26.1471311672238],[-81.7935886040093,26.1475968763179],[-81.7934082281063,26.1476199708438],[-81.7933429859686,26.1471526577154],[-81.7935235244292,26.1471311672238]]]]}},{"id":1004,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7914869964925,26.1585384752406],[-81.7915883048016,26.1648227251406],[-81.7912863322249,26.1648716817922],[-81.7911857246338,26.158587244181],[-81.7914869964925,26.1585384752406]]]]}},{"id":1005,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7912808701003,26.1460619808656],[-81.7913011668768,26.1466195963807],[-81.7909962362617,26.146656187803],[-81.7909759907963,26.1460984343832],[-81.7912808701003,26.1460619808656]]]]}},{"id":1006,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7914787794636,26.1490678318657],[-81.7914826736447,26.14944552036],[-81.7914075538496,26.1493355890997],[-81.7913426797335,26.1492043030251],[-81.7913412609473,26.1490843377735],[-81.7914787794636,26.1490678318657]]]]}},{"id":1007,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7908367621951,26.1565629415688],[-81.7908532465683,26.1576287370044],[-81.7903965170617,26.1576381223956],[-81.7903885476593,26.1571039392707],[-81.7899320728394,26.1571093555193],[-81.7899242546768,26.1565746670862],[-81.7908367621951,26.1565629415688]]]]}},{"id":1008,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7903885476593,26.1571039392707],[-81.7903965170617,26.1576381223956],[-81.7899398879734,26.1576473453046],[-81.7899320728394,26.1571093555193],[-81.7903885476593,26.1571039392707]]]]}},{"id":1009,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7908931946507,26.1594953537172],[-81.7909014988425,26.1600486322945],[-81.7898746192562,26.1600643791811],[-81.7898638409997,26.1595126959414],[-81.7908931946507,26.1594953537172]]]]}},{"id":1010,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7906835414056,26.1455518501257],[-81.7906968066848,26.146769138672],[-81.7906980736077,26.1468037732901],[-81.7906160683594,26.1468197684695],[-81.790533777982,26.1468294500027],[-81.7904508815007,26.1468329394854],[-81.7903731232856,26.1468305764428],[-81.7902958044549,26.1468227605529],[-81.7902193937205,26.1468095391958],[-81.7901443542889,26.1467909925201],[-81.7900786605987,26.1467699658242],[-81.7900147512887,26.1467448560196],[-81.789952937468,26.1467157853404],[-81.7898935200439,26.1466828953023],[-81.7900693184419,26.1462441313683],[-81.7900706914705,26.1461500115416],[-81.790057579628,26.146100287618],[-81.7900593459816,26.1458759444724],[-81.7899932505216,26.1458381576602],[-81.7898924013358,26.1457770848957],[-81.7898624438439,26.145715371179],[-81.7898547969507,26.1456925785507],[-81.7898472197308,26.1456247200345],[-81.7898472102957,26.1456145791523],[-81.7898488697911,26.1455997864511],[-81.7898526556063,26.1455853160615],[-81.7898585028894,26.1455714158614],[-81.7906835414056,26.1455518501257]]]]}},{"id":1011,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.790717904056,26.1478542141736],[-81.790751454237,26.150736661757],[-81.7900697699707,26.1507475556032],[-81.7899159011941,26.1506110483967],[-81.7899017994593,26.1491315344136],[-81.7895153364362,26.1487892550473],[-81.7895070562248,26.1479022377771],[-81.790717904056,26.1478542141736]]]]}},{"id":1012,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.7883960746758,26.145936939243],[-81.7885343205774,26.1459422121684],[-81.7886199627585,26.1459403906936],[-81.7888470899348,26.1459382300497],[-81.7889759743913,26.1459641415999],[-81.7890301886226,26.1460634134219],[-81.7890789011534,26.1461642284909],[-81.7891566744031,26.1461707720316],[-81.7892040285291,26.1461262419907],[-81.7891993456645,26.1460493729601],[-81.7891975738,26.1459936489215],[-81.7893116387258,26.1459575799637],[-81.7894171088859,26.1459579419957],[-81.7895794142059,26.145948707301],[-81.7898023001164,26.1459617685091],[-81.7898596857841,26.1460301867976],[-81.7898932903065,26.1461582061845],[-81.7899699529398,26.1462940824076],[-81.7900284733059,26.1463461250493],[-81.7898935200439,26.1466828953023],[-81.7899408529236,26.1467095081864],[-81.789977391724,26.1467278809449],[-81.7900273756198,26.1467501992156],[-81.790078660072,26.1467699655207],[-81.7901310874947,26.1467871191089],[-81.7901850872394,26.1468017636577],[-81.7902262906606,26.1468109631871],[-81.7902818310885,26.1468207575084],[-81.790323839753,26.1468262313738],[-81.7903801815479,26.1468310176047],[-81.7904367325158,26.1468329168231],[-81.7904923704911,26.1468319710092],[-81.7905475500998,26.1468282650756],[-81.7906024190582,26.1468218096751],[-81.790656809207,26.1468126243588],[-81.7906980736077,26.1468037732901],[-81.7907159716061,26.1476880782289],[-81.7893222809396,26.1477435690265],[-81.7893212503815,26.1476885516556],[-81.7889240111568,26.1473028843091],[-81.7889837658729,26.147160712258],[-81.788910379559,26.1471342446159],[-81.7888831198622,26.1470808381616],[-81.788866892974,26.1469871127668],[-81.7888095084272,26.1469339629739],[-81.7886775817056,26.1469015339679],[-81.7885915959159,26.1468901289165],[-81.7885108519963,26.1468838535292],[-81.7883807069025,26.1468632673743],[-81.7882722182602,26.146856112015],[-81.7881983033851,26.1468530087583],[-81.7880447091682,26.1468432800954],[-81.7879198160255,26.1468141820718],[-81.787829470326,26.1468079129678],[-81.7876376900605,26.1467668461678],[-81.7875518694637,26.1467611023765],[-81.787399165137,26.1467325456914],[-81.7873291384811,26.1467107587514],[-81.7872218070921,26.1466753969625],[-81.7871914784341,26.1466490599375],[-81.7871940212071,26.1464714820937],[-81.7872025350414,26.1463623065286],[-81.7872274403097,26.1461671366538],[-81.7872330488537,26.1461095610671],[-81.7872455410465,26.1460443821918],[-81.7873238098041,26.1459733644475],[-81.7875867857688,26.1459608764416],[-81.7877329498056,26.1459575094942],[-81.7878273739121,26.1459508488771],[-81.7879316388671,26.1459457392105],[-81.7880756441141,26.1459462124104],[-81.7882299204785,26.1459404391729],[-81.7883960746758,26.145936939243]]]]}},{"id":1013,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8082807678828,26.1532477616207],[-81.8083280249883,26.1536211471895],[-81.8078758682024,26.1536721730783],[-81.8078282557708,26.1532986288482],[-81.8082807678828,26.1532477616207]]]]}},{"id":1014,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8081336933047,26.1529726245667],[-81.8081355201474,26.1529870578073],[-81.808246115435,26.152974561446],[-81.8082807678828,26.1532477616207],[-81.8078282557708,26.1532986288482],[-81.8077919842441,26.1530114985131],[-81.8081336933047,26.1529726245667]]]]}},{"id":1015,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8089188998359,26.1528984063779],[-81.8089856237342,26.1532211072402],[-81.8086519863425,26.1532590896266],[-81.8085978925082,26.1532207168822],[-81.8082816920573,26.1532565371592],[-81.808246115435,26.152974561446],[-81.8089188998359,26.1528984063779]]]]}},{"id":1016,"geom":{"type":"MultiPolygon","coordinates":[[[[-81.8085978925082,26.1532207168822],[-81.8086519863425,26.1532590896266],[-81.8089856237342,26.1532211072402],[-81.8090512504553,26.153539366537],[-81.8083280249883,26.1536211471895],[-81.8082816920573,26.1532565371592],[-81.8085978925082,26.1532207168822]]]]}}] \ No newline at end of file diff --git a/example/assets/json/polylines.json b/example/assets/json/polylines.json new file mode 100644 index 000000000..f1a6abb11 --- /dev/null +++ b/example/assets/json/polylines.json @@ -0,0 +1,60 @@ +[ + { + "id": 1, + "path": [ + { + "latitude": 45, + "longitude": -74 + }, + { + "latitude": 30, + "longitude": -89 + }, + { + "latitude": 37, + "longitude": -122 + }, + { + "latitude": 60, + "longitude": -95 + } + ], + "stroke": { + "color": "#6060FB", + "weight": 3 + }, + "editable": false, + "draggable": true, + "geodesic": true, + "visible": true + }, + { + "id": 2, + "path": [ + { + "latitude": 47, + "longitude": -74 + }, + { + "latitude": 32, + "longitude": -89 + }, + { + "latitude": 39, + "longitude": -122 + }, + { + "latitude": 62, + "longitude": -95 + } + ], + "stroke": { + "color": "#6060FB", + "weight": 3 + }, + "editable": false, + "draggable": true, + "geodesic": true, + "visible": true + } +] \ No newline at end of file diff --git a/example/assets/scripts/controllers/dragzoom.js b/example/assets/scripts/controllers/dragzoom.js new file mode 100644 index 000000000..7e6e2c636 --- /dev/null +++ b/example/assets/scripts/controllers/dragzoom.js @@ -0,0 +1,35 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .controller('ctrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", + function ($scope, $log, GoogleMapApi) { + $scope.map = { + dragZoom: {options: {}}, + center: { + latitude: 26.153215225012733, + longitude: -81.80121597097774 + }, + pan: true, + zoom: 16, + refresh: false, + events: {}, + bounds: {} + }; + GoogleMapApi.then(function () { + $scope.map.dragZoom = { + options: { + visualEnabled: true, + visualPosition: google.maps.ControlPosition.LEFT, + visualPositionOffset: new google.maps.Size(35, 0), + visualPositionIndex: null, + visualSprite: "http://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png", + visualSize: new google.maps.Size(20, 20), + visualTips: { + off: "Turn on", + on: "Turn off" + } + } + } + }); + }]); + +})(window, angular); diff --git a/example/assets/scripts/controllers/dynamic-map-height.js b/example/assets/scripts/controllers/dynamic-map-height.js new file mode 100644 index 000000000..42e73f8eb --- /dev/null +++ b/example/assets/scripts/controllers/dynamic-map-height.js @@ -0,0 +1,69 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .factory('channel', function(){ + return function () { + var callbacks = []; + this.add = function (cb) { + callbacks.push(cb); + }; + this.invoke = function () { + callbacks.forEach(function (cb) { + cb(); + }); + }; + return this; + }; + }) + .service('drawChannel',['channel',function(channel){ + return new channel() + }]) + .service('clearChannel',['channel',function(channel){ + return new channel() + }]) + .controller('mapWidgetCtrl', ['$scope', 'drawChannel','clearChannel', function ($scope, drawChannel, clearChannel) { + $scope.drawWidget = { + controlText: 'draw', + controlClick: function () { + drawChannel.invoke() + } + }; + $scope.clearWidget = { + controlText: 'clear', + controlClick: function () { + clearChannel.invoke() + } + }; + }]) + .controller('ctrl', ['$rootScope', '$scope',"uiGmapLogger", 'drawChannel','clearChannel',function ($rootScope, $scope, $log,drawChannel, clearChannel) { + $scope.map = { + center: { + latitude: 53.406754, + longitude: -2.158843 + }, + pan: true, + zoom: 14, + refresh: false, + options: { + disableDefaultUI: true + }, + events: {}, + bounds: {}, + polys: [], + draw: undefined + }; + var clear = function(){ + $scope.map.polys = []; + }; + var draw = function(){ + $scope.map.draw();//should be defined by now + }; + //add beginDraw as a subscriber to be invoked by the channel, allows controller to controller coms + drawChannel.add(draw); + clearChannel.add(clear); + }]) + .run(['$templateCache','uiGmapLogger', function ($templateCache,Logger) { + Logger.doLog = true; + $templateCache.put('draw.tpl.html', ''); + $templateCache.put('clear.tpl.html', ''); + }]); +})(window, angular); diff --git a/example/assets/scripts/controllers/example.js b/example/assets/scripts/controllers/example.js new file mode 100644 index 000000000..99c87235b --- /dev/null +++ b/example/assets/scripts/controllers/example.js @@ -0,0 +1,722 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']) + +.value("rndAddToLatLon", function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1); +}) + +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ +// key: 'your api key', + // v: '3.20', + libraries: 'weather,geometry,visualization' + }); +}]) + +.run(['$templateCache', function ($templateCache) { + $templateCache.put('control.tpl.html', ''); +}]) + +.controller('controlController', function ($scope) { + $scope.controlText = 'I\'m a custom control'; + $scope.danger = false; + $scope.controlClick = function () { + $scope.danger = !$scope.danger; + alert('custom control clicked!'); + }; +}) + +.controller("ExampleController",['$scope', '$timeout', 'uiGmapLogger', '$http', 'rndAddToLatLon','uiGmapGoogleMapApi', +function ($scope, $timeout, $log, $http, rndAddToLatLon,GoogleMapApi) { + $log.currentLevel = $log.LEVELS.debug; + + GoogleMapApi.then(function(maps) { + $scope.googleVersion = maps.version; + maps.visualRefresh = true; + $log.info('$scope.map.rectangle.bounds set'); + $scope.map.rectangle.bounds = new maps.LatLngBounds( + new maps.LatLng(55,-100), + new maps.LatLng(49,-78) + ); + $scope.map.polylines = [ + { + id: 1, + path: [ + { + latitude: 45, + longitude: -74 + }, + { + latitude: 30, + longitude: -89 + }, + { + latitude: 37, + longitude: -122 + }, + { + latitude: 60, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true, + icons: [ + { + icon: { + path: google.maps.SymbolPath.BACKWARD_OPEN_ARROW + }, + offset: '25px', + repeat: '50px' + } + ] + }, + { + id: 2, + path: [ + { + latitude: 47, + longitude: -74 + }, + { + latitude: 32, + longitude: -89 + }, + { + latitude: 39, + longitude: -122 + }, + { + latitude: 62, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true, + icons: [ + { + icon: { + path: google.maps.SymbolPath.BACKWARD_OPEN_ARROW + }, + offset: '25px', + repeat: '50px' + } + ] + }, + { + id: 3, + path: google.maps.geometry.encoding.decodePath("uowfHnzb}Uyll@i|i@syAcx}Cpj[_wXpd}AhhCxu[ria@_{AznyCnt^|re@nt~B?m|Awn`G?vk`RzyD}nr@uhjHuqGrf^ren@"), + stroke: { + color: '#4EAE47', + weight: 3 + }, + editable: false, + draggable: false, + geodesic: false, + visible: true + }]; + }); + + var versionUrl = (window.location.host === "rawgithub.com" || window.location.host === "rawgit.com") ? + "../package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + var onMarkerClicked = function (marker) { + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }; + + var genRandomMarkers = function (numberOfMarkers, scope) { + var markers = []; + for (var i = 0; i < numberOfMarkers; i++) { + markers.push(createRandomMarker(i, scope.map.bounds)); + } + scope.map.randomMarkers = markers; + }; + + var createRandomMarker = function (i, bounds, idKey) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (!idKey) + idKey = "id"; + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + latitude: latitude, + longitude: longitude, + title: 'm' + i + }; + ret[idKey] = i; + return ret; + }; + + + var clusterTypes = ['standard','ugly','beer']; + var selectedClusterTypes = { + ugly:{ + title: 'Hi I am a Cluster!', + gridSize: 60, ignoreHidden: true, + minimumClusterSize: 2, + imageExtension: 'png', + imagePath: 'assets/images/cluster', imageSizes: [72] + }, + beer:{ + title: 'Beer!', + gridSize: 60, + ignoreHidden: true, + minimumClusterSize: 2, + enableRetinaIcons: true, + styles: [{ + url: 'assets/images/beer.png', + textColor: '#ddddd', + textSize: 18, + width: 33, + height: 33, + }] + }, + standard:{ + title: 'Hi I am a Cluster!', gridSize: 60, ignoreHidden: true, minimumClusterSize: 2 + } + }; + var selectClusterType = function(value){ + var cloned = _.clone($scope.map.randomMarkers, true); + $scope.map.randomMarkers = []; + $scope.map.clusterOptions = $scope.map.selectedClusterTypes[value] || $scope.map.selectedClusterTypes.standard; + $scope.map.clusterOptionsText = angular.toJson($scope.map.clusterOptions); + if(!value){ + value = 'standard'; + } + $timeout(function(){ + $scope.map.randomMarkers = cloned; + },200); + + return value; + }; + + angular.extend($scope, { + example2: { + doRebuildAll: false + }, + clickWindow: function () { + $log.info('CLICK CLICK'); + Logger.info('CLICK CLICK'); + }, + map: { + show: true, + control: {}, + version: "uknown", + heatLayerCallback: function (layer) { + //set the heat layers backend data + var mockHeatLayer = new MockHeatLayer(layer); + }, + showTraffic: true, + showBicycling: false, + showWeather: false, + showHeat: false, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: false, + options: { + animation: 1, + labelContent: 'Markers id 1', + labelAnchor: "22 0", + labelClass: "marker-labels" + } + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane', + options: { + labelContent: 'Markers id 3', + labelAnchor: "26 0", + labelClass: "marker-labels" + } + } + ], + markers2: [ + { + id: 1, + icon: 'assets/images/blue_marker.png', + latitude: 46, + longitude: -77, + showWindow: false, + options: { + labelContent: '[46,-77]', + labelAnchor: "22 0", + labelClass: "marker-labels" + } + }, + { + id: 2, + icon: 'assets/images/blue_marker.png', + latitude: 33, + longitude: -77, + showWindow: false, + options: { + labelContent: 'DRAG ME!', + labelAnchor: "22 0", + labelClass: "marker-labels", + draggable: true + } + }, + { + id: 3, + icon: 'assets/images/blue_marker.png', + latitude: 35, + longitude: -125, + showWindow: false, + options: { + labelContent: '[35,-125]', + labelAnchor: "22 0", + labelClass: "marker-labels" + } + } + ], + mexiIdKey: 'mid', + mexiMarkers: [ + { + mid: 1, + latitude: 29.302567, + longitude: -106.248779, + + }, + { + mid: 2, + latitude: 30.369913, + longitude: -109.434814, + }, + { + mid: 3, + latitude: 26.739478, + longitude: -108.61084, + } + ], + clickMarkers: [ + {id: 1, "latitude": 50.948968, "longitude": 6.944781}, + {id: 2, "latitude": 50.94129, "longitude": 6.95817}, + {id: 3, "latitude": 50.9175, "longitude": 6.943611} + ], + dynamicMarkers: [], + randomMarkers: [], + doClusterRandomMarkers: true, + currentClusterType: 'standard', + clusterTypes: clusterTypes, + selectClusterType: selectClusterType, + selectedClusterTypes: selectedClusterTypes, + clusterOptions: selectedClusterTypes.standard, + clickedMarker: { + id: 0, + options:{ + } + }, + events: { +//This turns of events and hits against scope from gMap events this does speed things up +// adding a blacklist for watching your controller scope should even be better +// blacklist: ['drag', 'dragend','dragstart','zoom_changed', 'center_changed'], + tilesloaded: function (map, eventName, originalEventArgs) { + }, + click: function (mapModel, eventName, originalEventArgs) { + // 'this' is the directive's scope + $log.info("user defined event: " + eventName, mapModel, originalEventArgs); + + var e = originalEventArgs[0]; + var lat = e.latLng.lat(), + lon = e.latLng.lng(); + $scope.map.clickedMarker = { + id: 0, + options: { + labelContent: 'You clicked here ' + 'lat: ' + lat + ' lon: ' + lon, + labelClass: "marker-labels", + labelAnchor:"50 0" + }, + latitude: lat, + longitude: lon + }; + //scope apply required because this event handler is outside of the angular domain + $scope.$evalAsync(); + }, + dragend: function () { + $timeout(function () { + var markers = []; + + var id = 0; + if ($scope.map.mexiMarkers !== null && $scope.map.mexiMarkers.length > 0) { + var maxMarker = _.max($scope.map.mexiMarkers, function (marker) { + return marker.mid; + }); + id = maxMarker.mid; + } + for (var i = 0; i < 4; i++) { + id++; + markers.push(createRandomMarker(id, $scope.map.bounds, "mid")); + } + $scope.map.mexiMarkers = markers.concat($scope.map.mexiMarkers); + }); + } + }, + infoWindow: { + coords: { + latitude: 36.270850, + longitude: -44.296875 + }, + options: { + disableAutoPan: true + }, + show: false + }, + infoWindowWithCustomClass: { + coords: { + latitude: 36.270850, + longitude: -44.296875 + }, + options: { + boxClass: 'custom-info-window', + closeBoxDiv: 'X', + disableAutoPan: true + }, + show: true + }, + templatedInfoWindow: { + coords: { + latitude: 48.654686, + longitude: -75.937500 + }, + options: { + disableAutoPan: true + }, + show: true, + templateUrl: 'assets/templates/info.html', + templateParameter: { + message: 'passed in from the opener' + } + }, + circles: [ + { + id: 1, + center: { + latitude: 44, + longitude: -108 + }, + radius: 500000, + stroke: { + color: '#08B21F', + weight: 2, + opacity: 1 + }, + fill: { + color: '#08B21F', + opacity: 0.5 + }, + geodesic: true, // optional: defaults to false + draggable: true, // optional: defaults to false + clickable: true, // optional: defaults to true + editable: true, // optional: defaults to false + visible: true, // optional: defaults to true + events:{ + dblclick: function(){ + window.alert("circle dblclick"); + } + } + } + ], + rectangle:{ + bounds:{}, + stroke: { + color: '#08B21F', + weight: 2, + opacity: 1 + }, + fill: { + color: 'pink', + opacity: 0.5 + }, + events:{ + dblclick: function(){ + window.alert("rectangle dblclick"); + } + }, + draggable: true, // optional: defaults to false + clickable: true, // optional: defaults to true + editable: true, // optional: defaults to false + visible: true // optional: defaults to true + }, + polygonEvents:{ + dblclick:function(){ + alert("Polgon Double Clicked!"); + } + }, + polygons: [ + { + id: 1, + path: [ + { + latitude: 50, + longitude: -80 + }, + { + latitude: 30, + longitude: -120 + }, + { + latitude: 20, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: false, + visible: true, + fill: { + color: '#ff0000', + opacity: 0.8 + } + } + ], + polygons2: [ + { + id: 1, + path: [ + { + latitude: 60, + longitude: -80 + }, + { + latitude: 40, + longitude: -120 + }, + { + latitude: 45, + longitude: -95 + } + ], + stroke: { + color: '#33CDDC', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: false, + visible: true, + fill: { + color: '#33CCCC', + opacity: 0.8 + } + } + ], + polylines: [] + }, + toggleColor: function (color) { + return color == 'red' ? '#6060FB' : 'red'; + } + + }); + $scope.map.markers2Events = { + dragend: function (marker, eventName, model, args) { + model.options.labelContent = "Dragged lat: " + model.latitude + " lon: " + model.longitude; + } + }; + + _.each($scope.map.markers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$evalAsync(); + }; + marker.onClicked = function () { + onMarkerClicked(marker); + }; + }); + + $scope.map.markers2.forEach( function (marker) { + marker.onClicked = function () { + onMarkerClicked(marker); + }; + marker.closeClick = function () { + marker.showWindow = false; + $scope.$evalAsync(); + }; + }); + + $scope.removeMarkers = function () { + $log.info("Clearing markers. They should disappear from the map now"); + $scope.map.markers = []; + $scope.map.markers2 = []; + $scope.map.dynamicMarkers = []; + $scope.map.randomMarkers = []; + $scope.map.mexiMarkers = []; + $scope.map.clickMarkers = []; + $scope.map.polylines = []; + $scope.map.polygons = []; + $scope.map.polygons2 = []; + $scope.map.circles = []; + $scope.map.rectangle = null; + $scope.map.clickedMarker = null; + $scope.staticMarker = null; + $scope.map.infoWindow.show = false; + $scope.map.templatedInfoWindow.show = false; + $scope.map.templatedInfoWindow.coords = null; + $scope.map.infoWindowWithCustomClass.show = false; + $scope.map.infoWindowWithCustomClass.coords = null; + $scope.map.infoWindow.show = false; + $scope.map.infoWindow.coords = null; + }; + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + return; + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + return; + }; + $scope.map.clusterOptionsText = JSON.stringify($scope.map.clusterOptions); + $scope.$watch('map.clusterOptionsText', function (newValue, oldValue) { + if (newValue !== oldValue) + $scope.map.clusterOptions = angular.fromJson($scope.map.clusterOptionsText); + }); + + $scope.genRandomMarkers = function (numberOfMarkers) { + genRandomMarkers(numberOfMarkers, $scope); + }; + + $scope.staticMarker = { + id: 0, + coords: { + latitude: 40.1451, + longitude: -99.6680 + }, + options: { draggable: true }, + events: { + dragend: function (marker, eventName, args) { + $log.log('marker dragend'); + $log.log(marker.getPosition().lat()); + $log.log(marker.getPosition().lng()); + } + } + }; + $scope.onMarkerClicked = onMarkerClicked; + + $scope.clackMarker = function (gMarker,eventName, model) { + alert("clackMarker: " + model); + $log.log("from clackMarker"); + $log.log(model); + }; + + $timeout(function () { + $scope.map.infoWindow.show = true; + var dynamicMarkers = [ + { + id: 1, + latitude: 46, + longitude: -79, + showWindow: false + }, + { + id: 2, + latitude: 33, + longitude: -79, + showWindow: false + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127, + showWindow: false + } + ]; + + $scope.map.polylines.push({ + id: 3, + path: [ + { + latitude: 65, + longitude: -74 + }, + { + latitude: 50, + longitude: -89 + }, + { + latitude: 57, + longitude: -122 + }, + { + latitude: 20, + longitude: -95 + } + ], + stroke: { + color: '#FF0066', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true + }); + + $scope.map.polylines = $scope.map.polylines.slice(1); + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); +}]); diff --git a/example/assets/scripts/controllers/free-draw-polygons.js b/example/assets/scripts/controllers/free-draw-polygons.js new file mode 100644 index 000000000..42e73f8eb --- /dev/null +++ b/example/assets/scripts/controllers/free-draw-polygons.js @@ -0,0 +1,69 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .factory('channel', function(){ + return function () { + var callbacks = []; + this.add = function (cb) { + callbacks.push(cb); + }; + this.invoke = function () { + callbacks.forEach(function (cb) { + cb(); + }); + }; + return this; + }; + }) + .service('drawChannel',['channel',function(channel){ + return new channel() + }]) + .service('clearChannel',['channel',function(channel){ + return new channel() + }]) + .controller('mapWidgetCtrl', ['$scope', 'drawChannel','clearChannel', function ($scope, drawChannel, clearChannel) { + $scope.drawWidget = { + controlText: 'draw', + controlClick: function () { + drawChannel.invoke() + } + }; + $scope.clearWidget = { + controlText: 'clear', + controlClick: function () { + clearChannel.invoke() + } + }; + }]) + .controller('ctrl', ['$rootScope', '$scope',"uiGmapLogger", 'drawChannel','clearChannel',function ($rootScope, $scope, $log,drawChannel, clearChannel) { + $scope.map = { + center: { + latitude: 53.406754, + longitude: -2.158843 + }, + pan: true, + zoom: 14, + refresh: false, + options: { + disableDefaultUI: true + }, + events: {}, + bounds: {}, + polys: [], + draw: undefined + }; + var clear = function(){ + $scope.map.polys = []; + }; + var draw = function(){ + $scope.map.draw();//should be defined by now + }; + //add beginDraw as a subscriber to be invoked by the channel, allows controller to controller coms + drawChannel.add(draw); + clearChannel.add(clear); + }]) + .run(['$templateCache','uiGmapLogger', function ($templateCache,Logger) { + Logger.doLog = true; + $templateCache.put('draw.tpl.html', ''); + $templateCache.put('clear.tpl.html', ''); + }]); +})(window, angular); diff --git a/example/assets/scripts/controllers/geojson.js b/example/assets/scripts/controllers/geojson.js new file mode 100644 index 000000000..397bdb128 --- /dev/null +++ b/example/assets/scripts/controllers/geojson.js @@ -0,0 +1,518 @@ +(function () { + var module = angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']); +}()); + +var rndAddToLatLon = function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +} + +function ExampleController($scope, $timeout, $log, $http, uiGmapLogger) { + uiGmapLogger.doLog = true + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + var onMarkerClicked = function (marker) { + marker.showWindow = true; + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }; + + var genRandomMarkers = function (numberOfMarkers, scope) { + var markers = []; + for (var i = 0; i < numberOfMarkers; i++) { + markers.push(createRandomMarker(i, scope.map.bounds)); + } + + scope.map.randomMarkers = markers; + }; + + var createRandomMarker = function (i, bounds, idKey) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (idKey == null) + idKey = "id"; + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + geometry: { + type: "Point", + coordinates: [ longitude, latitude ] + }, + title: 'm' + i + }; + ret[idKey] = i; + return ret; + }; + + angular.extend($scope, { + example2: { + doRebuildAll: false + }, + clickWindow: function () { + $log.info('CLICK CLICK'); + Logger.info('CLICK CLICK'); + }, + map: { + control: {}, + version: "uknown", + heatLayerCallback: function (layer) { + //set the heat layers backend data + var mockHeatLayer = new MockHeatLayer(layer); + }, + showTraffic: true, + showBicycling: false, + showWeather: false, + showHeat: false, + center: { + type: "Point", + coordinates: [ -73, 45 ] + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id: 1, + geometry: { + type: "Point", + coordinates: [ -74, 45 ] + }, + showWindow: false, + title: 'Marker 2' + }, + { + id: 2, + geometry: { + type: "Point", + coordinates: [ 30, 15 ] + }, + showWindow: false, + title: 'Marker 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + geometry: { + type: "Point", + coordinates: [ -122, 37 ] + }, + showWindow: false, + title: 'Plane' + } + ], + markers2: [ + { + id: 1, + geometry: { + type: "Point", + coordinates: [ -77, 46 ] + }, + showWindow: false, + title: '[46,-77]' + }, + { + id: 2, + geometry: { + type: "Point", + coordinates: [ -77, 33 ] + }, + showWindow: false, + title: '[33,-77]' + }, + { + id: 3, + icon: 'assets/images/plane.png', + geometry: { + type: "Point", + coordinates: [ -125, 35 ] + }, + showWindow: false, + title: '[35,-125]' + } + ], + mexiIdKey: 'mid', + mexiMarkers: [ + { + mid: 1, + geometry: { + type: "Point", + coordinates: [ -106.248779, 29.302567 ] + } + }, + { + mid: 2, + geometry: { + type: "Point", + coordinates: [ -109.434814, 30.369913 ] + } + }, + { + mid: 3, + geometry: { + type: "Point", + coordinates: [ -108.61084, 26.739478 ] + } + } + ], + dynamicMarkers: [], + randomMarkers: [], + doClusterRandomMarkers: true, + doUgly: true, //great name :) + clusterOptions: {title: 'Hi I am a Cluster!', gridSize: 60, ignoreHidden: true, minimumClusterSize: 2, + imageExtension: 'png', imagePath: 'assets/images/cluster', imageSizes: [72]}, + clickedMarker: { + id: 0, + title: 'You clicked here', + geometry: { + type: "Point", + coordinates: [ ] + } + }, + events: { + tilesloaded: function (map, eventName, originalEventArgs) { + }, + click: function (mapModel, eventName, originalEventArgs) { + // 'this' is the directive's scope + $log.log("user defined event: " + eventName, mapModel, originalEventArgs); + + var e = originalEventArgs[0]; + $scope.map.clickedMarker = { + id: 0, + title: 'You clicked here ' + 'lat: ' + e.latLng.lng() + ' lon: ' + e.latLng.lng(), + geometry: { + type: "Point", + coordinates: [ e.latLng.lng(), e.latLng.lat() ] + } + }; + //scope apply required because this event handler is outside of the angular domain + $scope.$apply(); + }, + dragend: function () { + self = this; + $timeout(function () { + var markers = []; + var id = 0; + if ($scope.map.mexiMarkers !== null && $scope.map.mexiMarkers.length > 0) { + var maxMarker = _.max($scope.map.mexiMarkers, function (marker) { + return marker.mid; + }); + id = maxMarker.mid; + } + for (var i = 0; i < 4; i++) { + id++; + markers.push(createRandomMarker(id, $scope.map.bounds, "mid")); + } + $scope.map.mexiMarkers = markers.concat($scope.map.mexiMarkers); + }); + } + }, + infoWindow: { + coords: { + type: "Point", + coordinates: [ -44.296875, 36.270850 ] + }, + options: { + disableAutoPan: true + }, + show: false + }, + infoWindowWithCustomClass: { + coords: { + type: "Point", + coordinates: [ -44.296875, 36.270850 ] + }, + options: { + boxClass: 'custom-info-window' + }, + show: true + }, + templatedInfoWindow: { + coords: { + type: "Point", + coordinates: [ -75.937500, 48.654686 ] + }, + options: { + disableAutoPan: true + }, + show: true, + templateUrl: 'assets/templates/info.html', + templateParameter: { + message: 'passed in from the opener' + } + }, + circles: [ + { + id: 1, + center: { + type: "Point", + coordinates: [ -108, 44 ] + }, + radius: 500000, + stroke: { + color: '#08B21F', + weight: 2, + opacity: 1 + }, + fill: { + color: '#08B21F', + opacity: 0.5 + }, + geodesic: true, // optional: defaults to false + draggable: true, // optional: defaults to false + clickable: true, // optional: defaults to true + editable: true, // optional: defaults to false + visible: true // optional: defaults to true + } + ], + polygons: [ + { + id: 1, + path: { + type: "Polygon", + coordinates: [ + [ + [ -80, 50 ], + [ -120, 30 ], + [ -95, 20 ], + [ -80, 50 ] + ] + ] + }, + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: false, + visible: true, + fill: { + color: '#ff0000', + opacity: 0.8 + } + } + ], + polylines: [ + { + id: 1, + path: { + type: "LineString", + coordinates: [ + [ -74, 45 ], + [ -89, 30 ], + [ -122, 37 ], + [ -95, 60 ] + ] + }, + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true + }, + { + id: 2, + path: [ + { + latitude: 47, + longitude: -74 + }, + { + latitude: 32, + longitude: -89 + }, + { + latitude: 39, + longitude: -122 + }, + { + latitude: 62, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true + } + ] + }, + toggleColor: function (color) { + return color == 'red' ? '#6060FB' : 'red'; + } + + }); + + _.each($scope.map.markers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + onMarkerClicked(marker); + }; + }); + + _.each($scope.map.markers2, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + onMarkerClicked(marker); + }; + }); + + $scope.removeMarkers = function () { + $log.info("Clearing markers. They should disappear from the map now"); + $scope.map.markers = []; + $scope.map.markers2 = []; + $scope.map.dynamicMarkers = []; + $scope.map.randomMarkers = []; + $scope.map.mexiMarkers = []; + $scope.map.polylines = []; + $scope.map.clickedMarker = null; + $scope.searchLocationMarker = null; + $scope.map.infoWindow.show = false; + $scope.map.templatedInfoWindow.show = false; + // $scope.map.infoWindow.coords = null; + }; + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + return; + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + return; + } + $scope.map.clusterOptionsText = JSON.stringify($scope.map.clusterOptions); + $scope.$watch('map.clusterOptionsText', function (newValue, oldValue) { + if (newValue !== oldValue) + $scope.map.clusterOptions = angular.fromJson($scope.map.clusterOptionsText); + }); + + $scope.$watch('map.doUgly', function (newValue, oldValue) { + var json; + if (newValue !== oldValue) { + if (newValue) + json = {title: 'Hi I am a Cluster!', gridSize: 60, ignoreHidden: true, minimumClusterSize: 2, + imageExtension: 'png', imagePath: 'http://localhost:3000/example/cluster', imageSizes: [72]}; + else + json = {title: 'Hi I am a Cluster!', gridSize: 60, ignoreHidden: true, minimumClusterSize: 2}; + $scope.map.clusterOptions = json; + $scope.map.clusterOptionsText = angular.toJson(json); + } + }); + + $scope.genRandomMarkers = function (numberOfMarkers) { + genRandomMarkers(numberOfMarkers, $scope); + }; + + $scope.searchLocationMarker = { + id: 0, + title:'searchLocationMarker', + geometry: { + type: "Point", + coordinates: [ -99.6680, 40.1451 ] + }, + options: { draggable: true }, + events: { + dragend: function (marker, eventName, args) { + $log.log('marker dragend'); + $log.log(marker.getPosition().lat()); + $log.log(marker.getPosition().lng()); + } + } + } + $scope.onMarkerClicked = onMarkerClicked; + + $timeout(function () { + $scope.map.infoWindow.show = true; + dynamicMarkers = [ + { + id: 1, + geometry: { + type: "Point", + coordinates: [ -79, 46 ] + }, + showWindow: false + }, + { + id: 2, + geometry: { + type: "Point", + coordinates: [ -79, 33 ] + }, + showWindow: false + }, + { + id: 3, + icon: 'assets/images/plane.png', + geometry: { + type: "Point", + coordinates: [ -127, 35 ] + }, + showWindow: false + } + ]; + + $scope.map.polylines.push({ + id: 3, + path: { + type: "LineString", + coordinates: [ + [ -74, 65 ], + [ -89, 50 ], + [ -122, 57 ], + [ -95, 20 ] + ] + }, + stroke: { + color: '#FF0066', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true + }); + + $scope.map.polylines = $scope.map.polylines.slice(1); + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + }; + marker.onClicked = function () { + onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); +} diff --git a/example/assets/scripts/controllers/hugedata.js b/example/assets/scripts/controllers/hugedata.js new file mode 100644 index 000000000..e4880cdab --- /dev/null +++ b/example/assets/scripts/controllers/hugedata.js @@ -0,0 +1,11 @@ +var app = angular.module("HugeData", ['uiGmapgoogle-maps']); + +app.controller("HugeDataCtrl", function ($scope) { + $scope.center = { + latitude: 47.6201, + longitude: -122.1653 + }; + $scope.zoom = 11 + + $scope.places = [{"boundary":{"type":"Polygon","coordinates":[[[-122.22279999999999,47.619885999999994],[-122.22207999999999,47.620368000000006],[-122.22205,47.620407],[-122.222028,47.620449],[-122.22202,47.620483],[-122.22203999999999,47.620520000000006],[-122.22207999999999,47.620560000000005],[-122.222156,47.62059500000001],[-122.22246,47.620630000000006],[-122.22236999999998,47.621057],[-122.220464,47.621049],[-122.21786000000002,47.621052000000006],[-122.21541500000001,47.62106],[-122.21002000000001,47.621079],[-122.20992000000001,47.62153800000001],[-122.20994,47.622927000000004],[-122.2098,47.623850000000004],[-122.20978,47.62472],[-122.20976999999999,47.626540000000006],[-122.20978,47.627430000000004],[-122.20978,47.628260000000004],[-122.20976999999999,47.62835000000001],[-122.20976,47.628490000000006],[-122.20976,47.629245000000004],[-122.209765,47.630160000000004],[-122.20976999999999,47.63108],[-122.20975,47.63192],[-122.20972400000001,47.63198],[-122.20972,47.63288],[-122.20972,47.63378],[-122.20971,47.63469],[-122.20971,47.635619000000005],[-122.2097,47.636523000000004],[-122.2097,47.637434],[-122.20971,47.63832000000001],[-122.2097,47.639252000000006],[-122.2097,47.64047],[-122.20969000000001,47.64134],[-122.20965000000001,47.6414],[-122.20973,47.642320000000005],[-122.20974,47.64247],[-122.20975,47.64286],[-122.20975,47.64294],[-122.20974,47.643054],[-122.20974,47.643105000000006],[-122.20973,47.64325],[-122.20951000000001,47.64331000000001],[-122.209236,47.643369],[-122.20889,47.643433],[-122.20854,47.64348],[-122.20837999999999,47.64349],[-122.20777,47.64354],[-122.20757,47.64354],[-122.20716000000002,47.64354],[-122.20701000000001,47.643530000000005],[-122.20699,47.643533000000005],[-122.20676,47.643510000000006],[-122.20667,47.643498],[-122.20567,47.643350000000005],[-122.20542999999999,47.64331000000001],[-122.20499000000001,47.643246],[-122.20456000000001,47.64318],[-122.20427000000001,47.643141],[-122.20401000000001,47.64312],[-122.20365000000001,47.64312],[-122.20349,47.643142000000005],[-122.20335,47.643170000000005],[-122.20320000000001,47.64321],[-122.203041,47.643273],[-122.202947,47.64332],[-122.20282999999999,47.643406],[-122.20268,47.643539000000004],[-122.20257,47.6437],[-122.20241,47.64382],[-122.20232999999999,47.64385],[-122.20205,47.644098],[-122.20193,47.644206999999994],[-122.20188,47.644252],[-122.20184,47.6443],[-122.20179,47.64436],[-122.20175,47.64442],[-122.201727,47.644479999999994],[-122.20171,47.644529],[-122.20169000000001,47.644583],[-122.20168000000001,47.64472],[-122.20165000000001,47.64444699999999],[-122.20164000000001,47.64439],[-122.20160000000001,47.644268],[-122.20154000000001,47.644151],[-122.20148,47.64404],[-122.20146000000001,47.644009],[-122.20144,47.64398],[-122.20141000000001,47.643930000000005],[-122.20136400000001,47.643879999999996],[-122.20132000000001,47.64383],[-122.20132000000001,47.64382],[-122.20128000000001,47.6438],[-122.20105000000001,47.643673],[-122.20066200000001,47.643390000000004],[-122.20060000000001,47.64334],[-122.20048,47.64321],[-122.200196,47.642849],[-122.20004,47.64265],[-122.2,47.6426],[-122.19995,47.64255000000001],[-122.1999,47.642500000000005],[-122.19981,47.64242],[-122.19845,47.64242],[-122.19846,47.642635000000006],[-122.19846,47.642846],[-122.19806,47.642843],[-122.19753,47.642844],[-122.19753,47.642810000000004],[-122.19711000000001,47.642813000000004],[-122.19703,47.642813000000004],[-122.19685,47.642810000000004],[-122.19662000000001,47.642810000000004],[-122.19628,47.642809],[-122.19628,47.64288],[-122.19628,47.642900000000004],[-122.19617,47.642900000000004],[-122.19625,47.643390000000004],[-122.19625,47.643758000000005],[-122.19629,47.645430000000005],[-122.19629,47.64631500000001],[-122.19629,47.64643],[-122.19592,47.64643],[-122.19525,47.64643],[-122.19085,47.64643],[-122.18765,47.64643],[-122.18716,47.64643],[-122.18682999999999,47.64643],[-122.18554999999999,47.64641],[-122.18022,47.646370000000005],[-122.17503999999998,47.646374],[-122.17228999999999,47.646313000000006],[-122.16927,47.64625],[-122.16512,47.646148000000004],[-122.16468,47.6462],[-122.16466000000001,47.646530000000006],[-122.16460000000001,47.651373],[-122.16453,47.653382],[-122.16451,47.653729],[-122.164457,47.654759999999996],[-122.16436,47.656639999999996],[-122.16436,47.657059999999994],[-122.16438,47.657678999999995],[-122.16426000000001,47.660470000000004],[-122.16427,47.66064],[-122.16407,47.66078],[-122.1638,47.660790000000006],[-122.16005,47.660703000000005],[-122.15937999999998,47.660688],[-122.15886999999998,47.66068],[-122.15874999999998,47.66067],[-122.15874999999998,47.660644],[-122.15861,47.66064],[-122.15842999999998,47.66064],[-122.15749,47.660590000000006],[-122.15558999999999,47.66061800000001],[-122.15432,47.66058],[-122.15339999999999,47.660559000000006],[-122.15152,47.66057000000001],[-122.1495,47.660590000000006],[-122.14908,47.6606],[-122.14814199999999,47.660605000000004],[-122.14443,47.66064],[-122.14335,47.660643],[-122.14336,47.659217],[-122.14335,47.658530000000006],[-122.14334,47.657849999999996],[-122.14334,47.65745],[-122.14332999999999,47.657048999999994],[-122.14334,47.65513000000001],[-122.14334,47.65506],[-122.14341,47.65357],[-122.1434,47.653459],[-122.1434,47.653285],[-122.14335,47.65234],[-122.14335,47.65227],[-122.14326200000001,47.65054],[-122.14324,47.650002],[-122.14317,47.648700000000005],[-122.14308,47.646871],[-122.14307799999999,47.646770000000004],[-122.14305,47.645950000000006],[-122.14305,47.64504],[-122.14305,47.64437],[-122.14306,47.64403],[-122.14306,47.642404],[-122.14307,47.64147],[-122.14308,47.64014],[-122.14309,47.638821],[-122.14308199999999,47.63871000000001],[-122.14308,47.63862],[-122.14308,47.637860999999994],[-122.14308,47.63762],[-122.14308199999999,47.63689],[-122.14308,47.636655000000005],[-122.14308,47.63617000000001],[-122.14309,47.63591500000001],[-122.14309,47.63564],[-122.14308199999999,47.635360000000006],[-122.143046,47.63521000000001],[-122.14304,47.634750000000004],[-122.14304,47.63453500000001],[-122.14304,47.63434],[-122.143046,47.634189],[-122.14305,47.633741],[-122.14306,47.63326],[-122.14305,47.63311000000001],[-122.14302,47.63298],[-122.14301,47.63286],[-122.143,47.63243000000001],[-122.14302,47.63208],[-122.14304,47.631491],[-122.14309,47.628246000000004],[-122.14309,47.627863],[-122.14311000000001,47.62713000000001],[-122.1424,47.62748],[-122.14183,47.62778],[-122.1418,47.62778],[-122.14174,47.627790000000005],[-122.14169500000001,47.627790000000005],[-122.14157,47.627790000000005],[-122.14145,47.627790000000005],[-122.14124000000001,47.627790000000005],[-122.1409,47.627790000000005],[-122.13978999999999,47.627790000000005],[-122.13892,47.627790000000005],[-122.13808999999999,47.6278],[-122.13773099999999,47.627790000000005],[-122.13772999999999,47.62788],[-122.13727,47.62787],[-122.13677999999999,47.628040000000006],[-122.13652,47.62813000000001],[-122.13621,47.628260000000004],[-122.13586999999998,47.628420000000006],[-122.13561,47.62857000000001],[-122.1355,47.628640000000004],[-122.13528,47.628820000000005],[-122.135179,47.62891000000001],[-122.13501,47.629090000000005],[-122.13493,47.62919000000001],[-122.13476,47.62944],[-122.13465000000001,47.629675000000006],[-122.13463,47.629760000000005],[-122.13458,47.629960000000004],[-122.13452000000001,47.630230000000005],[-122.13441,47.63091000000001],[-122.13439,47.631005],[-122.13432999999999,47.63116],[-122.13425000000001,47.6313],[-122.13415,47.63147],[-122.13412000000001,47.631501],[-122.13427,47.6315],[-122.1342,47.631581],[-122.13419,47.6316],[-122.13414,47.63166],[-122.13398,47.63182],[-122.13385,47.631930000000004],[-122.13376,47.632000000000005],[-122.13365,47.632070000000006],[-122.13347999999999,47.63217300000001],[-122.13336,47.632249],[-122.13286999999998,47.63252000000001],[-122.13272999999998,47.632600000000004],[-122.132612,47.632669],[-122.13257999999999,47.632690000000004],[-122.13256,47.63270800000001],[-122.13253999999999,47.63273000000001],[-122.13252999999999,47.63274500000001],[-122.13252,47.633654],[-122.13234999999999,47.633658000000004],[-122.13234999999999,47.63513700000001],[-122.13165000000001,47.63512000000001],[-122.13037999999999,47.63510000000001],[-122.12966999999999,47.63510000000001],[-122.12966999999999,47.635222000000006],[-122.12898999999999,47.63521000000001],[-122.12836099999998,47.635204],[-122.12821799999999,47.635200000000005],[-122.12777999999999,47.635450000000006],[-122.12754,47.63559000000001],[-122.12729,47.63574200000001],[-122.127,47.63590000000001],[-122.127,47.63597000000001],[-122.1262,47.63642],[-122.12588999999998,47.6366],[-122.12499999999999,47.637130000000006],[-122.12391,47.637735000000006],[-122.12375999999999,47.63783],[-122.12362999999999,47.63783],[-122.12346999999998,47.63794],[-122.12322,47.63811000000001],[-122.12257999999999,47.638580000000005],[-122.12235999999999,47.638740000000006],[-122.12226999999999,47.638740000000006],[-122.12219999999999,47.638740000000006],[-122.12188799999998,47.638960000000004],[-122.12178999999999,47.639029],[-122.12136999999998,47.63936],[-122.12105,47.6396],[-122.12101,47.639570000000006],[-122.12075499999999,47.639790000000005],[-122.12042,47.64005],[-122.12006999999998,47.64032],[-122.11984,47.640505000000005],[-122.1198,47.64054],[-122.11956,47.64072],[-122.11902,47.64115],[-122.1188,47.64134],[-122.11874999999999,47.641365],[-122.11829999999999,47.64173],[-122.11819,47.64181],[-122.11805,47.641928],[-122.11785,47.642085],[-122.11773,47.64218],[-122.117571,47.64231000000001],[-122.11748,47.64238],[-122.11742000000001,47.64238],[-122.11723,47.64251000000001],[-122.11720000000001,47.642499],[-122.11710000000001,47.64258],[-122.11648,47.643023],[-122.11586199999999,47.64356],[-122.11507999999999,47.64429],[-122.11434,47.645071],[-122.11414,47.645340000000004],[-122.11403,47.645618000000006],[-122.11403,47.64594],[-122.11346999999999,47.645920000000004],[-122.11288799999998,47.64593000000001],[-122.11174,47.64594],[-122.11111500000001,47.64594],[-122.11110000000001,47.64526],[-122.11109,47.644859999999994],[-122.11107,47.643910000000005],[-122.11108,47.64347],[-122.11108300000001,47.643235000000004],[-122.11107,47.642364],[-122.11107,47.64232500000001],[-122.11106000000001,47.64129],[-122.11108,47.640646],[-122.11107,47.639450000000004],[-122.11106000000001,47.63922],[-122.11108,47.638740000000006],[-122.11090300000001,47.638740000000006],[-122.1109,47.638604],[-122.1109,47.638450000000006],[-122.1109,47.638076000000005],[-122.11091,47.637259],[-122.11091,47.636720000000004],[-122.11091,47.63631000000001],[-122.11092000000001,47.635605000000005],[-122.11091,47.635450000000006],[-122.11089,47.63541000000001],[-122.11086999999999,47.63537000000001],[-122.11082999999999,47.635360000000006],[-122.11085,47.635307000000005],[-122.11085,47.63506],[-122.11085,47.634014],[-122.11085,47.633900000000004],[-122.11095,47.632940000000005],[-122.11086,47.63124],[-122.11095,47.630770000000005],[-122.11092000000001,47.63009],[-122.11093,47.62935000000001],[-122.11093,47.628454000000005],[-122.11093,47.62816000000001],[-122.11094,47.627634],[-122.11039,47.62763],[-122.10862,47.627637],[-122.10686,47.62762],[-122.10565,47.627611],[-122.10434,47.627604],[-122.10434,47.62758],[-122.10370999999999,47.627561],[-122.10372,47.62758],[-122.10356999999999,47.62758],[-122.10266,47.62758],[-122.10236999999998,47.62758],[-122.10111,47.627570000000006],[-122.10036,47.627570000000006],[-122.09972,47.62756],[-122.098486,47.627561],[-122.09829,47.62755800000001],[-122.09732000000001,47.627553000000006],[-122.096548,47.627548000000004],[-122.09597,47.627545000000005],[-122.09556,47.62754],[-122.09552000000001,47.62754],[-122.09492000000002,47.62754],[-122.0937,47.62753000000001],[-122.09297,47.62753000000001],[-122.09255,47.62753000000001],[-122.09222000000001,47.62718],[-122.09209,47.627244],[-122.09203,47.62728],[-122.09195000000001,47.627344],[-122.09186000000001,47.62745],[-122.09182000000001,47.627511000000005],[-122.0909,47.62751000000001],[-122.08989,47.62753000000001],[-122.08872999999998,47.62753000000001],[-122.08819,47.62753000000001],[-122.08693,47.62753000000001],[-122.08693,47.627320000000005],[-122.08753,47.626422000000005],[-122.08753,47.625820000000004],[-122.08753,47.62532000000001],[-122.0881,47.62476],[-122.088201,47.624522000000006],[-122.08824,47.624384],[-122.08841,47.624100000000006],[-122.08849,47.62398],[-122.08861,47.62382],[-122.08869,47.623698000000005],[-122.08876,47.62371000000001],[-122.08896999999999,47.62348],[-122.08886999999999,47.623441],[-122.08888999999999,47.62341000000001],[-122.08897999999999,47.623290000000004],[-122.08915,47.62308],[-122.08931,47.62312000000001],[-122.08941,47.623003000000004],[-122.08926000000001,47.62295200000001],[-122.08933999999999,47.62285200000001],[-122.0894,47.62276000000001],[-122.08942,47.62269800000001],[-122.08951,47.622580000000006],[-122.08981,47.62268],[-122.090092,47.62237000000001],[-122.09012000000001,47.62234000000001],[-122.08986,47.622240000000005],[-122.09003,47.62210000000001],[-122.09019,47.621961],[-122.09038,47.62181],[-122.0905,47.621700000000004],[-122.09068,47.621566],[-122.09073,47.62154],[-122.09086,47.62146],[-122.09102000000001,47.62135800000001],[-122.09117,47.62125],[-122.09134,47.62111000000001],[-122.09147,47.620967],[-122.09163000000001,47.620746000000004],[-122.09172000000001,47.620655000000006],[-122.09181000000001,47.620567],[-122.09201,47.62042],[-122.09225,47.62026],[-122.09262000000001,47.620050000000006],[-122.09266000000001,47.62001000000001],[-122.09275,47.61994],[-122.09360000000001,47.61947],[-122.09367900000001,47.61943],[-122.09371,47.61942],[-122.09397,47.619324],[-122.09413,47.61926],[-122.09422000000002,47.61921],[-122.09455000000001,47.61906],[-122.09482000000001,47.618966],[-122.09512000000001,47.618845],[-122.09520300000001,47.61882],[-122.09546,47.61872],[-122.09588,47.618610000000004],[-122.09612000000001,47.61853000000001],[-122.09627,47.61844],[-122.09647,47.61836],[-122.09673,47.61826],[-122.09693,47.61818],[-122.09723000000001,47.61804],[-122.09740000000001,47.617895],[-122.09756000000002,47.61775],[-122.0977,47.61761],[-122.09781000000001,47.61753],[-122.09808,47.617332000000005],[-122.09821400000001,47.617219999999996],[-122.09864,47.61683],[-122.09906000000001,47.6164],[-122.09920000000001,47.6163],[-122.09926000000002,47.61625],[-122.09931,47.61622],[-122.09934,47.61619],[-122.09939,47.616150000000005],[-122.09945,47.61611500000001],[-122.0995,47.61608],[-122.09956100000001,47.61604],[-122.09961000000001,47.61601],[-122.09969000000001,47.615957],[-122.09971,47.61594],[-122.09973,47.61592],[-122.09975,47.61591000000001],[-122.09976999999999,47.61589],[-122.0998,47.61586],[-122.09982000000001,47.61585],[-122.099835,47.61584],[-122.099873,47.615808],[-122.09996300000002,47.61574],[-122.10012,47.615629],[-122.10022000000001,47.615570000000005],[-122.10037999999999,47.615508000000005],[-122.10055,47.61542],[-122.10065,47.61533800000001],[-122.10069999999999,47.615300000000005],[-122.10082,47.61524],[-122.10085,47.615216000000004],[-122.10087999999999,47.615190000000005],[-122.1009,47.615170000000006],[-122.10094,47.61513000000001],[-122.101,47.615100000000005],[-122.10113,47.615010000000005],[-122.10117,47.614982],[-122.10122000000001,47.614959999999996],[-122.10126000000001,47.614959999999996],[-122.10141,47.614939],[-122.10148,47.61493],[-122.10151,47.61491],[-122.10153,47.61489399999999],[-122.10157,47.614869999999996],[-122.1016,47.61485699999999],[-122.10166000000001,47.614839999999994],[-122.10177999999999,47.61479],[-122.10189,47.61475],[-122.10202999999998,47.61467],[-122.10207999999999,47.614619999999995],[-122.10215,47.61459],[-122.1022,47.61457],[-122.10244699999998,47.614416],[-122.10352999999999,47.61362],[-122.106021,47.612469],[-122.10763,47.61172],[-122.10902999999999,47.60892200000001],[-122.11173,47.60532200000001],[-122.11082999999999,47.602920000000005],[-122.11061000000001,47.602419000000005],[-122.10982999999999,47.60062],[-122.10862999999999,47.599920000000004],[-122.10865,47.599830000000004],[-122.10863499999999,47.59977000000001],[-122.10862,47.59973900000001],[-122.10861,47.59968],[-122.10861,47.599630000000005],[-122.1086,47.599590000000006],[-122.10859099999999,47.599529000000004],[-122.10856999999999,47.599469],[-122.10855,47.599410000000006],[-122.10856,47.59929],[-122.10856999999999,47.599230000000006],[-122.10857999999999,47.599160000000005],[-122.10857999999999,47.59911000000001],[-122.10856999999999,47.59908],[-122.10856999999999,47.59906],[-122.10854599999999,47.59902],[-122.10852,47.59899000000001],[-122.10848999999999,47.59895000000001],[-122.10843999999999,47.598890000000004],[-122.10838999999999,47.59884],[-122.10834999999999,47.598800000000004],[-122.10833999999998,47.598760000000006],[-122.10839999999999,47.59872000000001],[-122.10852999999999,47.59864],[-122.10858999999999,47.59861000000001],[-122.10862999999999,47.59857000000001],[-122.10870999999999,47.59851000000001],[-122.10877999999998,47.598448000000005],[-122.10892,47.59834000000001],[-122.10896,47.59830200000001],[-122.10897999999999,47.59828],[-122.11013,47.59282],[-122.11025000000001,47.592594000000005],[-122.11053,47.59202200000001],[-122.11035,47.58992],[-122.11018,47.58803],[-122.10987999999999,47.585950000000004],[-122.10986,47.58485999999999],[-122.11016000000001,47.583330000000004],[-122.110465,47.582510000000006],[-122.11065,47.5819],[-122.11105,47.58131],[-122.11160000000001,47.58071],[-122.1118,47.579992000000004],[-122.11184,47.579350000000005],[-122.11165000000001,47.579100000000004],[-122.11123,47.578722000000006],[-122.11136,47.578210000000006],[-122.11141,47.578],[-122.11145,47.577813],[-122.11143,47.57642],[-122.10976,47.575282],[-122.10896999999999,47.574742],[-122.10724,47.57361],[-122.10056,47.57249],[-122.09789,47.57204],[-122.09790000000001,47.571878],[-122.09790000000001,47.57157],[-122.09789,47.57052],[-122.09789,47.569810000000004],[-122.09894,47.56982],[-122.09894,47.56987],[-122.09919000000001,47.570009],[-122.0994,47.56992],[-122.09963,47.569762000000004],[-122.09926000000002,47.569285],[-122.09912000000001,47.569334000000005],[-122.09877999999999,47.568830000000005],[-122.0999,47.568450000000006],[-122.09978199999999,47.56812800000001],[-122.09966000000001,47.56777],[-122.09914,47.56669],[-122.09905,47.566234],[-122.09889,47.56525200000001],[-122.09872999999999,47.564710000000005],[-122.09866000000001,47.56442],[-122.09831,47.56297000000001],[-122.09824,47.56270000000001],[-122.09818,47.562475000000006],[-122.09834,47.561879],[-122.0987,47.56058],[-122.09797,47.559228],[-122.10019,47.559225],[-122.10024,47.557379999999995],[-122.1004,47.555676],[-122.10054,47.554199999999994],[-122.10049,47.553716],[-122.10041,47.552865],[-122.10041,47.551035],[-122.10045,47.550059999999995],[-122.10046999999999,47.548925000000004],[-122.10046999999999,47.54858],[-122.10046999999999,47.54849],[-122.10052,47.544933],[-122.10191,47.54488299999999],[-122.10298999999999,47.54484399999999],[-122.10383999999999,47.54481],[-122.10439,47.544798],[-122.104366,47.5469],[-122.10462000000001,47.54689],[-122.10538999999999,47.54688599999999],[-122.10537999999998,47.546102000000005],[-122.10539999999999,47.54491],[-122.10536999999998,47.54477],[-122.10544999999999,47.544754],[-122.10547799999998,47.544753],[-122.10677999999999,47.5447],[-122.1071,47.544689999999996],[-122.10712000000001,47.545277],[-122.10726000000001,47.54526],[-122.10736,47.545237],[-122.10758,47.545199000000004],[-122.10758,47.544895],[-122.10757,47.54467699999999],[-122.10792000000001,47.54465999999999],[-122.10837999999998,47.544636],[-122.10928,47.54461],[-122.10931,47.54418],[-122.10933899999999,47.543786999999995],[-122.10982999999999,47.54379],[-122.11022000000001,47.54379],[-122.1114,47.543803],[-122.11182000000001,47.544259999999994],[-122.11183,47.54354],[-122.11185,47.542978000000005],[-122.11162000000002,47.54298],[-122.11136,47.542974],[-122.1108,47.542970000000004],[-122.11081,47.54262],[-122.10998599999999,47.542642],[-122.11,47.541799999999995],[-122.11002,47.54123],[-122.11003,47.54054],[-122.10878999999998,47.540555000000005],[-122.10829,47.54056],[-122.10830999999999,47.539546],[-122.11089,47.53954],[-122.11097199999999,47.53605],[-122.11213,47.536073],[-122.11262,47.53608],[-122.11298,47.536089],[-122.11525,47.53613000000001],[-122.115227,47.536226],[-122.11522000000001,47.53633000000001],[-122.11522000000001,47.536370000000005],[-122.11523,47.536431],[-122.11528,47.53651000000001],[-122.11546999999999,47.536702000000005],[-122.11573999999999,47.536885],[-122.11591,47.53698],[-122.11599,47.53703],[-122.11602500000001,47.537056],[-122.1161,47.537098],[-122.11617,47.53714],[-122.11624,47.53722],[-122.11631,47.53732],[-122.11675,47.537948],[-122.1188,47.537966],[-122.12013999999999,47.53798],[-122.12029,47.537679999999995],[-122.12080999999999,47.537608],[-122.1216,47.537530000000004],[-122.12172,47.537442],[-122.122644,47.537279999999996],[-122.12316999999999,47.53716],[-122.12376999999998,47.537151],[-122.1242,47.536771],[-122.12486,47.536525000000005],[-122.12523999999999,47.535793000000005],[-122.12575999999999,47.53539000000001],[-122.12639999999999,47.53513000000001],[-122.12691,47.53513000000001],[-122.12727,47.53526],[-122.12765,47.535500000000006],[-122.12861,47.535650000000004],[-122.12892,47.53555000000001],[-122.12903999999999,47.535430000000005],[-122.12919,47.53531900000001],[-122.12931999999999,47.53524],[-122.1295,47.535160000000005],[-122.12972999999998,47.535089],[-122.13004,47.535030000000006],[-122.13035599999999,47.535013000000006],[-122.13056999999999,47.53502],[-122.130725,47.53504],[-122.13086999999999,47.535070000000005],[-122.131,47.53511000000001],[-122.13113,47.535160000000005],[-122.13123,47.5352],[-122.13134,47.535250000000005],[-122.13144,47.535309000000005],[-122.13152000000001,47.535365000000006],[-122.13162700000001,47.535443],[-122.13222,47.53598],[-122.13236999999998,47.536120000000004],[-122.13262999999999,47.53636],[-122.13277999999998,47.536485],[-122.133046,47.53668],[-122.133104,47.53672],[-122.13328,47.53681],[-122.13346999999999,47.536930000000005],[-122.13389,47.53712],[-122.13548999999999,47.53783],[-122.13604,47.538070000000005],[-122.13636999999999,47.5382],[-122.136528,47.538250000000005],[-122.13682,47.538340000000005],[-122.13726000000001,47.538430000000005],[-122.13753,47.53848],[-122.14108,47.53893000000001],[-122.14129000000001,47.53896],[-122.14160000000001,47.539006],[-122.14204,47.539104],[-122.14240199999999,47.5392],[-122.14292,47.53936],[-122.14294199999999,47.53936],[-122.14292,47.54167999999999],[-122.15342999999999,47.54175],[-122.15342,47.544560999999995],[-122.15342,47.54538],[-122.15356,47.545370000000005],[-122.15996,47.54543],[-122.16198,47.545455000000004],[-122.1626,47.545463],[-122.16424,47.54548],[-122.16424,47.544672],[-122.16425000000001,47.54431],[-122.16415,47.54399],[-122.16415,47.54369],[-122.16414,47.54338],[-122.16414,47.543071],[-122.164187,47.542727],[-122.16445,47.54208],[-122.16476,47.54132],[-122.16534999999999,47.54002],[-122.16556,47.54001],[-122.16765000000001,47.54007],[-122.16822,47.540085],[-122.16837999999998,47.540088],[-122.16879999999999,47.5401],[-122.169166,47.5401],[-122.16963,47.5401],[-122.16976999999999,47.5401],[-122.16986999999999,47.5401],[-122.16991,47.54014],[-122.17022999999999,47.54044],[-122.17044999999999,47.5406],[-122.170656,47.540696],[-122.17073999999998,47.54072],[-122.17083999999998,47.540756],[-122.17106999999999,47.54081],[-122.17135999999999,47.540855],[-122.17152999999999,47.540868999999994],[-122.17385999999999,47.54093],[-122.1749,47.54096],[-122.17580999999998,47.54099],[-122.17702,47.541025],[-122.17803999999998,47.54105],[-122.17903999999999,47.541078],[-122.17981999999999,47.5411],[-122.18092,47.54113],[-122.18115,47.54114],[-122.18125,47.54115],[-122.18163,47.54119],[-122.18198,47.54124099999999],[-122.1822,47.54127],[-122.18356999999999,47.541489999999996],[-122.184256,47.54160399999999],[-122.18446999999999,47.54165],[-122.18481,47.54176],[-122.18502999999998,47.54183],[-122.18544999999999,47.542010000000005],[-122.18561,47.54205],[-122.18576999999998,47.54209],[-122.18587999999998,47.542100000000005],[-122.18711,47.542120000000004],[-122.18813999999999,47.54213000000001],[-122.18834899999999,47.54213000000001],[-122.18881999999999,47.54213000000001],[-122.19055,47.54214],[-122.19065,47.54215000000001],[-122.19069,47.54216],[-122.19081,47.542212000000006],[-122.19086999999999,47.54227],[-122.1909,47.542333000000006],[-122.19092,47.54242],[-122.19091,47.54299],[-122.1909,47.54357],[-122.1909,47.54491],[-122.1909,47.545662],[-122.1909,47.5458],[-122.19098699999999,47.545798000000005],[-122.1929,47.545792000000006],[-122.19355,47.545798000000005],[-122.19382999999999,47.5458],[-122.19389,47.545795000000005],[-122.194542,47.54582],[-122.19485,47.54583],[-122.19485,47.54582],[-122.19486,47.54568],[-122.19501,47.54568],[-122.19539599999999,47.54569],[-122.19563,47.545700000000004],[-122.19562,47.54609],[-122.19628,47.54604],[-122.19649,47.54605],[-122.19676,47.54604],[-122.19727,47.54603],[-122.19727,47.546079999999996],[-122.19728,47.54618],[-122.19728,47.546274],[-122.19728300000001,47.546369],[-122.19729000000001,47.546459999999996],[-122.19729000000001,47.54655],[-122.19729000000001,47.54665],[-122.19729000000001,47.54674],[-122.1973,47.546839],[-122.1973,47.546934],[-122.1973,47.54703],[-122.19731,47.54712],[-122.19731,47.547219999999996],[-122.19731,47.547309],[-122.19732,47.547395],[-122.19732,47.54747999999999],[-122.19732,47.547560999999995],[-122.19732,47.547599999999996],[-122.19732,47.5477],[-122.19732,47.54772],[-122.19733,47.547795],[-122.197328,47.54783],[-122.19733,47.547889999999995],[-122.19733,47.54795],[-122.19733,47.547979999999995],[-122.19733,47.54806],[-122.19733,47.54808],[-122.19734,47.548170000000006],[-122.19734,47.548269],[-122.19734,47.54829],[-122.19734,47.54836],[-122.19734,47.548398000000006],[-122.19735,47.54846],[-122.19735,47.54851000000001],[-122.19735,47.548550000000006],[-122.19735,47.54863],[-122.19735,47.54865],[-122.19735,47.548744],[-122.19736,47.548837],[-122.19736,47.54886],[-122.19736,47.548930000000006],[-122.19736,47.548969],[-122.19736,47.54902],[-122.19736,47.54908],[-122.19736,47.549110000000006],[-122.19736999999999,47.5492],[-122.19736999999999,47.549219],[-122.19736999999999,47.54923],[-122.19736999999999,47.54931800000001],[-122.19737099999999,47.54936],[-122.19736999999999,47.54941],[-122.19736999999999,47.549510000000005],[-122.19738,47.54961],[-122.19738,47.54964],[-122.19738,47.54978],[-122.19738,47.549912000000006],[-122.19739,47.550048],[-122.19739,47.550185],[-122.19739,47.55032],[-122.1974,47.550459999999994],[-122.1974,47.55059],[-122.1974,47.550733],[-122.19741,47.55086299999999],[-122.19741,47.55100699999999],[-122.19741,47.55114],[-122.19741,47.55127999999999],[-122.19742000000001,47.55141999999999],[-122.19742000000001,47.551472],[-122.19742000000001,47.551559999999995],[-122.19742000000001,47.55169399999999],[-122.19742000000001,47.551832],[-122.19743,47.551955],[-122.19743,47.55209],[-122.19744,47.55245],[-122.19744,47.552710000000005],[-122.19745,47.55307],[-122.19745,47.553166],[-122.19731,47.55317],[-122.19639,47.55323],[-122.19632999999999,47.553239999999995],[-122.19616,47.553248999999994],[-122.19592999999999,47.55327],[-122.19572,47.553279999999994],[-122.1956,47.55329],[-122.1956,47.553301],[-122.19556999999999,47.553335000000004],[-122.19555,47.553379],[-122.1955,47.55345],[-122.19546999999999,47.553515000000004],[-122.19542,47.55359],[-122.195409,47.55361],[-122.19532999999998,47.55375],[-122.19525,47.553889999999996],[-122.19516999999999,47.554019999999994],[-122.19515,47.55405],[-122.19509,47.554156],[-122.19501,47.554292999999994],[-122.19493,47.55442099999999],[-122.19485,47.554559999999995],[-122.194767,47.5547],[-122.19469000000001,47.554829999999995],[-122.19464,47.554919999999996],[-122.19460000000001,47.554973999999994],[-122.19452000000001,47.555110000000006],[-122.19444,47.555245],[-122.194362,47.555381],[-122.19428,47.55552],[-122.19420000000001,47.55565],[-122.19416000000001,47.55571200000001],[-122.19411000000001,47.5558],[-122.19406000000001,47.55589],[-122.19403,47.555943],[-122.193951,47.55607],[-122.19386999999999,47.55621],[-122.19384,47.556259999999995],[-122.19378999999999,47.55634],[-122.19368,47.55652],[-122.19358,47.5567],[-122.19348,47.556869999999996],[-122.19344,47.55694],[-122.19339,47.55702599999999],[-122.193317,47.557142],[-122.1933,47.55717],[-122.19321000000001,47.557316],[-122.1932,47.55733],[-122.19312000000001,47.55747999999999],[-122.19304,47.55761],[-122.19296999999999,47.557732],[-122.19288999999999,47.55785999999999],[-122.19286999999998,47.55789599999999],[-122.19281,47.55799],[-122.19274799999998,47.558101],[-122.19266999999999,47.55824],[-122.19259,47.55836],[-122.192519,47.55849],[-122.19243999999999,47.55861],[-122.19242999999999,47.55863],[-122.19236999999998,47.55874],[-122.19229,47.55887],[-122.19222,47.55899],[-122.19214,47.55912],[-122.1921,47.559200999999995],[-122.19206999999999,47.55925],[-122.19199,47.55937],[-122.19193,47.55949],[-122.19184,47.55963],[-122.19176999999999,47.55975],[-122.19172,47.559889999999996],[-122.19176,47.55988899999999],[-122.19166400000002,47.560049],[-122.19156000000001,47.560230000000004],[-122.191489,47.560340000000004],[-122.19139,47.560520000000004],[-122.19128,47.560750000000006],[-122.19119,47.560921],[-122.191131,47.56103],[-122.19097,47.561310000000006],[-122.19085,47.561510000000006],[-122.19082,47.56158],[-122.19076999999999,47.56169],[-122.19075,47.56178],[-122.190729,47.56187],[-122.19072999999999,47.561906],[-122.190726,47.562007],[-122.190733,47.56206],[-122.19072999999999,47.56208],[-122.19073999999999,47.56209200000001],[-122.19073999999999,47.56211000000001],[-122.19073999999999,47.56212000000001],[-122.19075,47.56213700000001],[-122.19075,47.56215000000001],[-122.19075,47.56217000000001],[-122.19076,47.56218200000001],[-122.19076,47.562200000000004],[-122.19076999999999,47.56221000000001],[-122.19076999999999,47.562227],[-122.19077799999998,47.56224],[-122.19077999999999,47.56226],[-122.19078999999999,47.562270000000005],[-122.1908,47.562290000000004],[-122.1908,47.56230000000001],[-122.19081,47.56231500000001],[-122.19082,47.56233000000001],[-122.19082,47.562340000000006],[-122.19082999999999,47.562360000000005],[-122.19084,47.56237000000001],[-122.19346999999999,47.56676],[-122.1936,47.56696],[-122.1938,47.5673],[-122.194,47.567634],[-122.19398,47.56765],[-122.19401300000001,47.56765],[-122.19420000000001,47.56796],[-122.19432400000001,47.56817000000001],[-122.19434,47.56830000000001],[-122.19439,47.568650000000005],[-122.19444,47.569],[-122.19448,47.569340000000004],[-122.19453,47.56966],[-122.19457,47.56998],[-122.19461000000001,47.570236],[-122.19466000000001,47.570280999999994],[-122.19472999999999,47.570370000000004],[-122.19476999999999,47.57041],[-122.19478,47.57043],[-122.1948,47.57046],[-122.19482,47.570493],[-122.19484,47.570530000000005],[-122.19485,47.570583],[-122.19486300000001,47.570673],[-122.19488,47.57076],[-122.1949,47.57081],[-122.19491000000001,47.57087],[-122.19491000000001,47.57094],[-122.1949,47.571],[-122.1949,47.57102],[-122.19487,47.571059999999996],[-122.19485,47.57109],[-122.19475,47.57115],[-122.19472999999999,47.57116],[-122.19476,47.57133],[-122.19444,47.571492],[-122.19375,47.57185],[-122.193339,47.572064],[-122.19304,47.572219000000004],[-122.19274999999999,47.57237200000001],[-122.19246,47.572522000000006],[-122.19224,47.572630000000004],[-122.19218,47.572669],[-122.19202,47.57276],[-122.19183,47.573130000000006],[-122.19163,47.573527],[-122.19159,47.573612000000004],[-122.1915,47.5738],[-122.191444,47.573910000000005],[-122.1914,47.57399],[-122.19135,47.574098],[-122.19101,47.57478],[-122.19095,47.574918000000004],[-122.19091,47.575],[-122.19069999999999,47.575486],[-122.19033999999999,47.576214],[-122.19024,47.576419],[-122.18999,47.576416],[-122.18975999999999,47.576860999999994],[-122.18986,47.57696],[-122.19001,47.5771],[-122.190544,47.577636],[-122.19108,47.577639999999995],[-122.19121000000001,47.577639999999995],[-122.19153,47.577639999999995],[-122.19207999999999,47.57764099999999],[-122.19246,47.577642],[-122.19317,47.577639999999995],[-122.19353,47.577639999999995],[-122.19388,47.57764399999999],[-122.19427900000001,47.57764399999999],[-122.19468,47.57774],[-122.1948,47.577768],[-122.1949,47.57779],[-122.19522,47.57787],[-122.19552999999999,47.577948],[-122.19572999999998,47.577999],[-122.19603,47.578074],[-122.19636999999999,47.578160000000004],[-122.19832999999998,47.578641],[-122.19888999999999,47.578776000000005],[-122.19839999999999,47.57893000000001],[-122.19816999999999,47.579],[-122.19771,47.57914],[-122.19777099999999,47.579170000000005],[-122.19784,47.579252000000004],[-122.1979,47.57931000000001],[-122.19809,47.57941],[-122.19816,47.57945],[-122.19836199999999,47.579550000000005],[-122.19855,47.57965],[-122.19864,47.5797],[-122.19868,47.57974],[-122.19888999999999,47.579879999999996],[-122.19909,47.58004],[-122.19909,47.58005],[-122.19912000000001,47.580076],[-122.19919,47.58014],[-122.19924,47.58018],[-122.19929,47.58022],[-122.199349,47.58027],[-122.19936999999999,47.58029],[-122.19939,47.5803],[-122.1994,47.580310000000004],[-122.19945,47.58035],[-122.19948,47.580374],[-122.19951,47.58039],[-122.19954,47.580439999999996],[-122.19956,47.58047],[-122.19957,47.580496999999994],[-122.19958,47.58053],[-122.19958,47.580551],[-122.19957,47.58058],[-122.19957,47.580625],[-122.19957,47.580645999999994],[-122.1996,47.58075],[-122.19962000000001,47.58078],[-122.19963,47.580798],[-122.19969,47.58091],[-122.19973999999999,47.580943],[-122.19977999999999,47.58096],[-122.1998,47.58098],[-122.19981,47.58099],[-122.19982999999999,47.58101],[-122.19986999999999,47.58103],[-122.19988,47.581039999999994],[-122.19991,47.581058],[-122.19994,47.58107999999999],[-122.19996,47.58107999999999],[-122.19999,47.581089999999996],[-122.20001,47.581105],[-122.20002600000001,47.58112],[-122.20004,47.58114],[-122.20005,47.58115],[-122.20006000000001,47.581188],[-122.20006000000001,47.581202],[-122.20007,47.581219999999995],[-122.2001,47.58127999999999],[-122.20021000000001,47.581415],[-122.200291,47.58152],[-122.20035,47.581559999999996],[-122.20054,47.58167099999999],[-122.20057,47.58167999999999],[-122.20059,47.581689999999995],[-122.20061300000002,47.5817],[-122.20064,47.5817],[-122.20067,47.581711],[-122.20071,47.58172],[-122.20073,47.58172],[-122.20075,47.58173],[-122.20076999999999,47.58173],[-122.20082000000001,47.581739999999996],[-122.20087,47.581739999999996],[-122.20092000000001,47.581739999999996],[-122.20095,47.58175],[-122.20097,47.58175],[-122.20103,47.58175],[-122.20108,47.581759],[-122.20114000000001,47.581759999999996],[-122.20119000000001,47.581768],[-122.20127000000001,47.581779999999995],[-122.20129000000001,47.581779999999995],[-122.2013,47.581779999999995],[-122.20133,47.58179],[-122.20136400000001,47.58179],[-122.20138,47.58179],[-122.20141300000002,47.58179],[-122.20144,47.58179],[-122.20147,47.58179],[-122.20153,47.58179],[-122.20161000000002,47.581792],[-122.20167000000001,47.58179],[-122.20175,47.58179],[-122.20178,47.58179],[-122.2018,47.58179],[-122.20184,47.58179],[-122.20192000000002,47.58179],[-122.20201,47.581779999999995],[-122.20208,47.581779999999995],[-122.20211,47.581779999999995],[-122.20214,47.581779999999995],[-122.20216,47.581779999999995],[-122.20218,47.58177],[-122.2022,47.58176699999999],[-122.20222000000001,47.581759999999996],[-122.20225,47.581759999999996],[-122.20229,47.58175],[-122.20232999999999,47.58175],[-122.20237999999999,47.581739999999996],[-122.20242999999999,47.581739999999996],[-122.20248,47.581738],[-122.202493,47.581739999999996],[-122.202493,47.581779999999995],[-122.20255,47.581779999999995],[-122.20263,47.581779999999995],[-122.202677,47.581782999999994],[-122.202677,47.581756],[-122.20282,47.581758],[-122.20285,47.58177],[-122.20295,47.581779999999995],[-122.20298,47.581779999999995],[-122.203,47.58179],[-122.20301,47.58180099999999],[-122.20305,47.581802999999994],[-122.2031,47.58180399999999],[-122.20315000000001,47.58181],[-122.203178,47.58181999999999],[-122.20321000000001,47.58183],[-122.20323,47.581849999999996],[-122.20326000000001,47.58185999999999],[-122.20328,47.58188499999999],[-122.2033,47.58192],[-122.20331,47.581939999999996],[-122.20332,47.581979999999994],[-122.20332,47.58203],[-122.20332,47.58213000000001],[-122.20333,47.582170000000005],[-122.203336,47.58226],[-122.20334,47.58234],[-122.20335,47.582390000000004],[-122.20336,47.58243],[-122.20336999999999,47.582448],[-122.20336999999999,47.58247],[-122.20336,47.58248],[-122.20339799999999,47.58261],[-122.20343,47.58272],[-122.20349,47.582710000000006],[-122.20351000000001,47.58278],[-122.20352000000001,47.582876],[-122.20354,47.582975000000005],[-122.20353,47.58298],[-122.20352000000001,47.58299],[-122.20351000000001,47.582996],[-122.2035,47.583],[-122.2035,47.58301],[-122.20349,47.58302],[-122.20348,47.58303],[-122.20347,47.583040999999994],[-122.203471,47.583051],[-122.20347,47.583059999999996],[-122.20347,47.58307],[-122.20346,47.583079999999995],[-122.20346,47.58309],[-122.20347,47.5831],[-122.20347,47.583106],[-122.203471,47.58312],[-122.20347,47.58312],[-122.20349,47.58318],[-122.20351000000001,47.58325],[-122.20352000000001,47.583279999999995],[-122.20352000000001,47.5833],[-122.203531,47.58332],[-122.20354,47.583330000000004],[-122.20355,47.58334],[-122.20355,47.58336],[-122.20356000000001,47.58337],[-122.203576,47.58339],[-122.20359,47.5834],[-122.20360000000001,47.583413],[-122.20367,47.58347],[-122.20372,47.583496999999994],[-122.20376,47.583525],[-122.20386,47.583528],[-122.20405000000001,47.58353],[-122.20406000000001,47.58353],[-122.20419000000001,47.58356],[-122.20424000000001,47.583588],[-122.204327,47.583659],[-122.20436000000001,47.583679999999994],[-122.20444,47.583751],[-122.20453,47.583819999999996],[-122.20249,47.5838],[-122.20215,47.583805],[-122.20206,47.5838],[-122.20202,47.58376],[-122.20195000000001,47.58378],[-122.20190000000001,47.583786999999994],[-122.20103,47.58379],[-122.20091000000001,47.583756],[-122.20082000000001,47.583743],[-122.19982,47.583745],[-122.19975,47.58374],[-122.19966000000001,47.58373],[-122.19962000000001,47.583715000000005],[-122.19954,47.583679999999994],[-122.19948,47.583701],[-122.19932999999999,47.58374],[-122.19921000000001,47.583759],[-122.1991,47.58377],[-122.19842999999999,47.58377],[-122.19796000000001,47.58378],[-122.19731,47.58378],[-122.19654,47.58378],[-122.19654799999999,47.583929],[-122.196557,47.58427],[-122.196566,47.58532],[-122.19657,47.585623],[-122.196557,47.58655],[-122.19655,47.58672],[-122.19728,47.586722],[-122.198454,47.58672],[-122.19963,47.58672],[-122.20106000000001,47.58673],[-122.201367,47.58673],[-122.20149,47.58673],[-122.20239,47.586731],[-122.202587,47.586749],[-122.20327,47.586752000000004],[-122.20327,47.58692],[-122.20360000000001,47.586923],[-122.20369000000001,47.586921],[-122.20362000000002,47.58673],[-122.20379,47.58674],[-122.203842,47.586839999999995],[-122.20399,47.586839999999995],[-122.203981,47.586734],[-122.20568,47.58674],[-122.205906,47.586737],[-122.20603,47.587002],[-122.20615000000001,47.58725999999999],[-122.20629000000001,47.587311],[-122.20641,47.58755],[-122.206531,47.58775],[-122.206534,47.58792],[-122.20651000000001,47.58808],[-122.20651000000001,47.58823],[-122.20662900000002,47.58846],[-122.20667900000001,47.588653],[-122.20681,47.58891200000001],[-122.20686,47.589110000000005],[-122.20694,47.58925],[-122.206939,47.589388],[-122.20701000000001,47.589479999999995],[-122.20711000000001,47.589512000000006],[-122.20706200000001,47.58965],[-122.20706000000001,47.589710000000004],[-122.20706000000001,47.58981],[-122.20707,47.58987],[-122.20708,47.589957],[-122.20712000000002,47.59002],[-122.20709000000001,47.59011000000001],[-122.20717,47.590140000000005],[-122.20727000000001,47.590160000000004],[-122.20729000000001,47.590205000000005],[-122.20729000000001,47.590297],[-122.20732000000001,47.59035000000001],[-122.20741000000001,47.590450000000004],[-122.20749,47.59050800000001],[-122.20753,47.59050800000001],[-122.20774,47.590557000000004],[-122.20788,47.590662],[-122.20796000000001,47.59078],[-122.20806,47.590903000000004],[-122.2081,47.59105],[-122.208107,47.59127],[-122.20821000000001,47.5914],[-122.20836,47.591570000000004],[-122.2085,47.591663999999994],[-122.20869,47.591695],[-122.20879,47.591676],[-122.20886,47.591682],[-122.20889,47.59174],[-122.20891,47.59179],[-122.20894,47.59182],[-122.20889,47.59192],[-122.20889,47.59194],[-122.20889,47.59203000000001],[-122.20893,47.59207800000001],[-122.20898,47.59210300000001],[-122.20908,47.59215200000001],[-122.20921000000001,47.59223000000001],[-122.20923,47.592290000000006],[-122.20916000000001,47.59237500000001],[-122.20917,47.592424],[-122.20920000000001,47.59245000000001],[-122.20926000000001,47.592490000000005],[-122.20934,47.59250000000001],[-122.20944,47.59250000000001],[-122.20956000000001,47.59252000000001],[-122.20968,47.59252000000001],[-122.20981,47.59254800000001],[-122.20988,47.592628000000005],[-122.20991000000001,47.59275000000001],[-122.20992000000001,47.59286],[-122.20992000000001,47.59301200000001],[-122.20991000000001,47.593140000000005],[-122.20996000000001,47.593300000000006],[-122.209987,47.59344],[-122.21004900000001,47.593494],[-122.21012000000002,47.59357000000001],[-122.21020000000001,47.59384],[-122.21024000000001,47.594013000000004],[-122.21026500000002,47.59408],[-122.21033,47.59416],[-122.21044,47.5942],[-122.21056000000002,47.594210000000004],[-122.21061000000002,47.594210000000004],[-122.21067000000001,47.59424],[-122.21083,47.59433000000001],[-122.21093,47.5944],[-122.21102000000002,47.59471200000001],[-122.21104000000001,47.59492],[-122.21103000000001,47.59512000000001],[-122.21099000000001,47.595240000000004],[-122.21081000000001,47.595448000000005],[-122.21064000000001,47.59565800000001],[-122.21059000000001,47.59583000000001],[-122.21033,47.596323000000005],[-122.21025700000001,47.59667],[-122.21023000000001,47.596990000000005],[-122.21063400000001,47.597621],[-122.21066000000002,47.598180000000006],[-122.21101000000002,47.59890000000001],[-122.21115000000002,47.59933000000001],[-122.21102000000002,47.599410000000006],[-122.21092000000002,47.59953000000001],[-122.21089,47.599740000000004],[-122.21099000000001,47.59989],[-122.21130400000001,47.599990000000005],[-122.21178,47.600127],[-122.212185,47.60026],[-122.21249,47.600438000000004],[-122.21267,47.600570000000005],[-122.21269000000001,47.60071000000001],[-122.212905,47.60086],[-122.21305000000001,47.60098],[-122.21324000000001,47.6011],[-122.213848,47.60141],[-122.215117,47.602734000000005],[-122.21576,47.605430000000005],[-122.21598,47.60643],[-122.215486,47.607659],[-122.21541,47.60779],[-122.21541,47.60781],[-122.21539,47.607876],[-122.21535,47.60792],[-122.21533699999999,47.60801000000001],[-122.21534,47.60806],[-122.21523,47.608380000000004],[-122.21515000000001,47.608470000000004],[-122.21514,47.608494],[-122.21512000000001,47.608498000000004],[-122.21511300000002,47.608520000000006],[-122.21514,47.608543000000004],[-122.21513,47.608574000000004],[-122.2151,47.60858],[-122.21506400000001,47.608661],[-122.21503,47.60869],[-122.21501,47.608700000000006],[-122.21497000000001,47.608700000000006],[-122.21493000000001,47.60869],[-122.21492000000002,47.608700000000006],[-122.21491000000002,47.60873000000001],[-122.214882,47.60873000000001],[-122.21473,47.60882],[-122.21471000000001,47.608829],[-122.21467000000001,47.60882],[-122.21465000000002,47.60882],[-122.21460000000002,47.608796000000005],[-122.21457000000001,47.60877000000001],[-122.21455000000002,47.60877000000001],[-122.21439000000001,47.60877000000001],[-122.21436000000001,47.60877000000001],[-122.21425000000002,47.60873000000001],[-122.21423000000001,47.608720000000005],[-122.21362000000002,47.608658000000005],[-122.212185,47.60857800000001],[-122.21078,47.60804],[-122.20774,47.606621],[-122.20689,47.606883999999994],[-122.20703400000001,47.607921],[-122.20787,47.60857800000001],[-122.20836,47.60917200000001],[-122.20963,47.610001],[-122.21011000000001,47.60981],[-122.21036000000001,47.60971000000001],[-122.21018400000001,47.609970000000004],[-122.21003,47.61022],[-122.21608,47.613304],[-122.21778,47.61417],[-122.21983,47.61522],[-122.22024,47.615342000000005],[-122.22017,47.615390000000005],[-122.21998,47.615610000000004],[-122.22,47.616504],[-122.22011,47.61656],[-122.22023,47.616634],[-122.221,47.617025],[-122.22129000000001,47.61717],[-122.22269999999999,47.617183999999995],[-122.22256999999999,47.61740699999999],[-122.22249,47.617408],[-122.22247999999999,47.618376000000005],[-122.22152000000001,47.618550000000006],[-122.22142000000001,47.618570000000005],[-122.22146000000001,47.618635000000005],[-122.22179,47.61922],[-122.22249,47.619679999999995],[-122.22279999999999,47.619885999999994]],[[-122.10194,47.54858],[-122.10069999999999,47.54858],[-122.10069999999999,47.549033],[-122.10102,47.549215000000004],[-122.10115,47.549302000000004],[-122.1013,47.54937],[-122.10153,47.54943],[-122.10194,47.549510000000005],[-122.10194,47.54858]],[[-122.10806,47.545334000000004],[-122.10784,47.545390000000005],[-122.1074,47.545505000000006],[-122.1073,47.54553000000001],[-122.10710900000001,47.545547],[-122.10662,47.54553000000001],[-122.10664,47.54659],[-122.10806,47.54656],[-122.10806,47.545334000000004]]]},"name":"Bellevue"},{"boundary":{"type":"Polygon","coordinates":[[[-122.22798,47.621300000000005],[-122.22792000000001,47.62657000000001],[-122.22791400000001,47.62708],[-122.2279,47.62830000000001],[-122.22788,47.630069],[-122.22786900000001,47.63118],[-122.22788,47.63195],[-122.22789,47.633879],[-122.22789,47.63409],[-122.22787,47.63553000000001],[-122.22737099999999,47.635540000000006],[-122.22586999999999,47.63555000000001],[-122.22507699999998,47.635563000000005],[-122.22431,47.635604],[-122.22371,47.63568],[-122.22326000000001,47.63573900000001],[-122.22249,47.635833000000005],[-122.22234499999999,47.63586],[-122.22219,47.635920000000006],[-122.222118,47.635951000000006],[-122.222,47.63602],[-122.22148,47.636393000000005],[-122.21957,47.637825],[-122.21797000000001,47.639009],[-122.21784000000001,47.63917000000001],[-122.21770000000001,47.63917000000001],[-122.21769000000002,47.639630000000004],[-122.21769000000002,47.64005],[-122.21767000000001,47.640378000000005],[-122.21767000000001,47.640423],[-122.21767000000001,47.64052],[-122.21767000000001,47.64074],[-122.21767000000001,47.64104],[-122.21766000000002,47.641245],[-122.21743000000001,47.64125],[-122.21737,47.641259999999996],[-122.21727000000001,47.64128699999999],[-122.21720000000002,47.641321],[-122.21704000000001,47.641425],[-122.21668000000001,47.64166899999999],[-122.21538,47.642545000000005],[-122.21519,47.64264],[-122.21512000000001,47.642669],[-122.215,47.642714000000005],[-122.21482000000002,47.642761],[-122.21468000000002,47.642783],[-122.21460000000002,47.642796000000004],[-122.21449000000001,47.6428],[-122.21433,47.642810000000004],[-122.21412400000003,47.6428],[-122.21401000000002,47.642790000000005],[-122.213901,47.642764],[-122.21381000000001,47.64274],[-122.2137,47.642700000000005],[-122.21368000000001,47.64269],[-122.21364000000001,47.64268],[-122.21320000000001,47.642541],[-122.21306000000001,47.642500000000005],[-122.21292000000001,47.64247],[-122.21275,47.64244],[-122.21266000000001,47.642430000000004],[-122.21254,47.642430000000004],[-122.21239,47.642430000000004],[-122.21218,47.64244],[-122.21196000000002,47.64249],[-122.21172000000001,47.64255000000001],[-122.21144000000001,47.64265],[-122.21091000000001,47.642830000000004],[-122.21021600000002,47.643099],[-122.20986,47.64321],[-122.20973,47.64325],[-122.20974,47.643105000000006],[-122.20974,47.643054],[-122.20975,47.64294],[-122.20975,47.64286],[-122.20974,47.64247],[-122.20973,47.642320000000005],[-122.20965000000001,47.6414],[-122.20969000000001,47.64134],[-122.2097,47.64047],[-122.2097,47.639252000000006],[-122.20971,47.63832000000001],[-122.2097,47.637434],[-122.2097,47.636523000000004],[-122.20971,47.635619000000005],[-122.20971,47.63469],[-122.20972,47.63378],[-122.20972,47.63288],[-122.20972400000001,47.63198],[-122.20975,47.63192],[-122.20976999999999,47.63108],[-122.209765,47.630160000000004],[-122.20976,47.629245000000004],[-122.20976,47.628490000000006],[-122.20976999999999,47.62835000000001],[-122.20978,47.628260000000004],[-122.20978,47.627430000000004],[-122.20976999999999,47.626540000000006],[-122.20978,47.62472],[-122.2098,47.623850000000004],[-122.20994,47.622927000000004],[-122.20992000000001,47.62153800000001],[-122.21002000000001,47.621079],[-122.21541500000001,47.62106],[-122.21786000000002,47.621052000000006],[-122.220464,47.621049],[-122.22236999999998,47.621057],[-122.22305,47.62107],[-122.22473,47.621007],[-122.22496000000001,47.62104],[-122.22516999999999,47.621049],[-122.22688,47.62104],[-122.22756500000001,47.621030000000005],[-122.228,47.621030000000005],[-122.22798,47.621300000000005]]]},"name":"Clyde Hill"},{"boundary":{"type":"Polygon","coordinates":[[[-122.24335,47.62567000000001],[-122.24325400000002,47.625870000000006],[-122.24320000000002,47.626000000000005],[-122.24317,47.62623200000001],[-122.24314000000001,47.626490000000004],[-122.24314000000001,47.626768000000006],[-122.24322000000002,47.62715000000001],[-122.24322000000002,47.627282],[-122.24303,47.62749],[-122.24302000000002,47.627720000000004],[-122.242385,47.62771000000001],[-122.24217,47.629810000000006],[-122.24213,47.630120000000005],[-122.24218,47.630900000000004],[-122.24221000000001,47.631502000000005],[-122.24223,47.631975000000004],[-122.24229000000001,47.631975000000004],[-122.242275,47.632780000000004],[-122.24235,47.634150000000005],[-122.2424,47.63514000000001],[-122.24242300000002,47.63562],[-122.24253,47.637785],[-122.24251000000001,47.637856],[-122.24225000000001,47.63891000000001],[-122.24191000000002,47.640283999999994],[-122.24162000000003,47.64147],[-122.24110000000002,47.643619],[-122.24083,47.64472],[-122.24043,47.64522],[-122.24027000000001,47.645340000000004],[-122.24026000000002,47.64546],[-122.24020000000002,47.64555000000001],[-122.24020000000002,47.64558],[-122.24020000000002,47.6456],[-122.24023000000001,47.645610000000005],[-122.24026100000002,47.64562],[-122.24028000000001,47.645645],[-122.24027000000001,47.64566],[-122.24023000000001,47.64569],[-122.24017,47.645714000000005],[-122.24008,47.64575000000001],[-122.23999,47.645770000000006],[-122.23981,47.645793000000005],[-122.23975,47.6458],[-122.23962000000002,47.645790000000005],[-122.23943,47.645920000000004],[-122.23926000000002,47.64574],[-122.23904,47.64568],[-122.23893,47.64564],[-122.23883,47.645590000000006],[-122.23876,47.64555000000001],[-122.23866000000001,47.645500000000006],[-122.23859,47.64546],[-122.23846,47.645390000000006],[-122.23839,47.64535600000001],[-122.23835,47.64533000000001],[-122.238279,47.64528],[-122.23825000000001,47.64526],[-122.23823,47.645210000000006],[-122.23821000000001,47.645160000000004],[-122.23818,47.645085],[-122.23812000000001,47.64494],[-122.23809,47.6449],[-122.23805,47.644819999999996],[-122.23801900000001,47.644752000000004],[-122.23796000000002,47.644659999999995],[-122.23792000000002,47.644574],[-122.23790000000001,47.644496999999994],[-122.23789000000001,47.64447],[-122.23786000000001,47.644396],[-122.23784,47.644354],[-122.23779,47.644279],[-122.23775,47.644233],[-122.23763000000001,47.64412],[-122.23759000000001,47.64407],[-122.23749000000001,47.64397],[-122.23746000000001,47.643926],[-122.237346,47.64381],[-122.23730400000001,47.64377],[-122.23724000000001,47.643708000000004],[-122.23717,47.643629],[-122.23711000000002,47.643550000000005],[-122.23703,47.64348],[-122.23697,47.64342],[-122.2369,47.643350000000005],[-122.23685,47.643283999999994],[-122.23678,47.6432],[-122.23654,47.642942000000005],[-122.23603,47.64242],[-122.23304,47.63977500000001],[-122.23271,47.63949],[-122.23263,47.639421],[-122.2327,47.63936],[-122.23272999999999,47.639342000000006],[-122.23275,47.639320000000005],[-122.23281,47.63938],[-122.23282,47.63938],[-122.23284,47.63937000000001],[-122.23293,47.639320000000005],[-122.23295,47.63933600000001],[-122.23313,47.639213000000005],[-122.23317,47.639213000000005],[-122.23319000000001,47.63921200000001],[-122.23321000000001,47.6392],[-122.23322000000002,47.639190000000006],[-122.23325000000001,47.639190000000006],[-122.23325000000001,47.638360000000006],[-122.23331,47.63832500000001],[-122.23326000000002,47.63828],[-122.23324000000001,47.63821900000001],[-122.23323,47.63811000000001],[-122.23326000000002,47.637010000000004],[-122.23326300000002,47.63685],[-122.23327,47.636827],[-122.23327,47.63647],[-122.23327,47.636390000000006],[-122.23329000000001,47.63617000000001],[-122.23328000000001,47.63559000000001],[-122.23190000000001,47.63557600000001],[-122.23102000000002,47.63557000000001],[-122.2309,47.63559000000001],[-122.230792,47.63564],[-122.23073,47.635690000000004],[-122.22948,47.63562],[-122.22787,47.63553000000001],[-122.22789,47.63409],[-122.22789,47.633879],[-122.22788,47.63195],[-122.22786900000001,47.63118],[-122.22788,47.630069],[-122.2279,47.62830000000001],[-122.22791400000001,47.62708],[-122.22792000000001,47.62657000000001],[-122.22798,47.621300000000005],[-122.228,47.621030000000005],[-122.22756500000001,47.621030000000005],[-122.22688,47.62104],[-122.22516999999999,47.621049],[-122.22496000000001,47.62104],[-122.22473,47.621007],[-122.22305,47.62107],[-122.22236999999998,47.621057],[-122.22246,47.620630000000006],[-122.222156,47.62059500000001],[-122.22207999999999,47.620560000000005],[-122.22203999999999,47.620520000000006],[-122.22202,47.620483],[-122.222028,47.620449],[-122.22205,47.620407],[-122.22207999999999,47.620368000000006],[-122.22279999999999,47.619885999999994],[-122.22249,47.619679999999995],[-122.22179,47.61922],[-122.22146000000001,47.618635000000005],[-122.22142000000001,47.618570000000005],[-122.22152000000001,47.618550000000006],[-122.22247999999999,47.618376000000005],[-122.22249,47.617408],[-122.22256999999999,47.61740699999999],[-122.22269999999999,47.617183999999995],[-122.22129000000001,47.61717],[-122.221,47.617025],[-122.22023,47.616634],[-122.22011,47.61656],[-122.22,47.616504],[-122.21998,47.615610000000004],[-122.22017,47.615390000000005],[-122.22024,47.615342000000005],[-122.22082999999999,47.615520000000004],[-122.22095300000001,47.615209],[-122.22167,47.614279999999994],[-122.22242,47.613110000000006],[-122.22201,47.61246],[-122.22276,47.61047],[-122.2235,47.60855000000001],[-122.22372999999999,47.607921],[-122.224631,47.608160000000005],[-122.22606999999999,47.60913000000001],[-122.227286,47.610271],[-122.22781,47.61099],[-122.22783,47.61132],[-122.22823,47.61152],[-122.2284,47.611667999999995],[-122.22932,47.61298],[-122.23085,47.613856],[-122.23103,47.61402],[-122.23333,47.61397],[-122.23568,47.61393],[-122.23603,47.61392],[-122.23661000000001,47.614153],[-122.23716900000002,47.614439999999995],[-122.23738,47.614509],[-122.23764000000001,47.614563],[-122.23803,47.614635],[-122.2384,47.61474],[-122.23848,47.614779999999996],[-122.2387,47.61487999999999],[-122.23882,47.614943999999994],[-122.23886999999999,47.614959999999996],[-122.239,47.614959999999996],[-122.23905,47.614959999999996],[-122.23913,47.614979999999996],[-122.23918,47.61502],[-122.23951000000001,47.61529],[-122.239631,47.615390000000005],[-122.23982000000001,47.615590000000005],[-122.23999,47.615773000000004],[-122.23997,47.615790000000004],[-122.240042,47.615862],[-122.24020000000002,47.61602],[-122.24027000000001,47.61609],[-122.24042000000001,47.61623],[-122.24291000000001,47.61996],[-122.242871,47.62115000000001],[-122.24286000000001,47.621364],[-122.24281,47.622420000000005],[-122.24281,47.62256000000001],[-122.24259,47.62292000000001],[-122.24237,47.623360000000005],[-122.2423,47.623810000000006],[-122.2423,47.624190000000006],[-122.24248,47.624479],[-122.24273,47.624703000000004],[-122.24273,47.62512900000001],[-122.24307,47.62517200000001],[-122.24317,47.625220000000006],[-122.2433,47.62541000000001],[-122.24335,47.62567000000001]]]},"name":"Medina"},{"boundary":{"type":"Polygon","coordinates":[[[-122.16498,47.68982],[-122.16496000000001,47.69014000000001],[-122.16472999999999,47.69014000000001],[-122.16438,47.69014200000001],[-122.16403,47.69014000000001],[-122.16402000000001,47.69044],[-122.16369,47.69044],[-122.16371,47.690180000000005],[-122.16372,47.689910000000005],[-122.16373999999999,47.689550000000004],[-122.16373999999999,47.68946699999999],[-122.16272999999998,47.68947],[-122.16269,47.690270000000005],[-122.16265,47.69097300000001],[-122.16256,47.69319000000001],[-122.15976999999998,47.69319300000001],[-122.15957999999999,47.693180000000005],[-122.15952,47.693160000000006],[-122.15944999999999,47.69311000000001],[-122.15943999999999,47.693090000000005],[-122.15941,47.693000000000005],[-122.15944999999999,47.69212600000001],[-122.15946,47.691801],[-122.15874799999997,47.691798000000006],[-122.15674999999999,47.69179200000001],[-122.15673999999999,47.692080000000004],[-122.15672999999998,47.69245300000001],[-122.156729,47.692780000000006],[-122.15671999999999,47.69311300000001],[-122.15671999999999,47.69319000000001],[-122.15669999999999,47.694120000000005],[-122.15853999999999,47.694120000000005],[-122.15872999999998,47.694120000000005],[-122.15938999999999,47.694120000000005],[-122.15937999999998,47.69446],[-122.15937999999998,47.694539000000006],[-122.15936999999998,47.69504800000001],[-122.15932,47.69661000000001],[-122.15930999999999,47.69690200000001],[-122.15978999999999,47.69690200000001],[-122.16022000000001,47.69690200000001],[-122.16037999999999,47.69690000000001],[-122.16046,47.696874],[-122.16142,47.69690000000001],[-122.16197,47.69688],[-122.1625,47.696821],[-122.16442,47.69686],[-122.16442,47.696909000000005],[-122.16441,47.697432000000006],[-122.16436999999999,47.69838000000001],[-122.16436,47.699020000000004],[-122.16436,47.69937000000001],[-122.16436,47.69977300000001],[-122.16435,47.70018],[-122.16435,47.70106],[-122.16432999999999,47.70166],[-122.16432,47.702000000000005],[-122.16429000000001,47.70255000000001],[-122.16428,47.703],[-122.16427,47.70327],[-122.16424,47.704130000000006],[-122.16426000000001,47.705670000000005],[-122.16425000000001,47.705763000000005],[-122.16424,47.70631000000001],[-122.16425000000001,47.706624],[-122.16428,47.70727],[-122.16429000000001,47.70776],[-122.1643,47.7079],[-122.16376,47.70789],[-122.16314,47.70789],[-122.16322000000001,47.709832000000006],[-122.16317,47.711459999999995],[-122.16317,47.71157],[-122.16169000000001,47.71155],[-122.16046999999999,47.71153],[-122.15984999999999,47.71154],[-122.15926,47.711619999999996],[-122.15856,47.71175],[-122.15813999999999,47.711819999999996],[-122.15793,47.71185],[-122.157543,47.71183],[-122.15738999999999,47.71181],[-122.15714,47.711777],[-122.15665,47.71168399999999],[-122.15614199999999,47.71157],[-122.15570999999998,47.711509],[-122.15530099999998,47.711479999999995],[-122.15482999999999,47.711479999999995],[-122.15423,47.711465],[-122.15426000000001,47.71138],[-122.15416,47.711376],[-122.15423,47.711059999999996],[-122.15431,47.71054],[-122.15432,47.710524],[-122.15431,47.71011800000001],[-122.15425,47.709616000000004],[-122.15422000000001,47.70937000000001],[-122.15411,47.70884],[-122.15392,47.70782],[-122.15366,47.7078],[-122.14296,47.70767],[-122.14273999999999,47.70767],[-122.14286999999999,47.70425],[-122.14287999999999,47.70409],[-122.14287999999999,47.70408],[-122.14261,47.70407],[-122.14254,47.70407],[-122.14066000000001,47.704062],[-122.14035,47.704059],[-122.13842,47.70404],[-122.13486999999999,47.703990000000005],[-122.13465000000001,47.703981],[-122.13364,47.70396],[-122.13364,47.703994],[-122.13364,47.70402],[-122.13365,47.70408],[-122.13366,47.70421],[-122.13367,47.704276],[-122.13374199999998,47.70447],[-122.13391,47.704833],[-122.13391,47.704843],[-122.13415,47.70532000000001],[-122.13427,47.705560000000006],[-122.134333,47.70570000000001],[-122.13442,47.705934000000006],[-122.13448,47.70613000000001],[-122.13452000000001,47.70626],[-122.13453,47.70635000000001],[-122.134544,47.70646],[-122.134544,47.706500000000005],[-122.13445,47.706500000000005],[-122.13197,47.706500000000005],[-122.13197,47.707],[-122.13195,47.70758],[-122.13195,47.707879],[-122.13195,47.707969],[-122.13195,47.70801000000001],[-122.13196,47.70912500000001],[-122.13199999999999,47.71018],[-122.13199,47.71116],[-122.13199999999999,47.71123],[-122.13185,47.71122],[-122.13116000000001,47.71121],[-122.12856999999998,47.711177],[-122.12777999999999,47.71118],[-122.12729999999999,47.71118],[-122.12536999999998,47.711132000000006],[-122.12457699999999,47.71114],[-122.12418,47.711166],[-122.12377999999998,47.71119],[-122.12352999999999,47.71123],[-122.12307999999999,47.711307],[-122.12298999999999,47.71132],[-122.12156999999999,47.71163],[-122.12077999999998,47.711710000000004],[-122.11976,47.71174],[-122.11967,47.71175],[-122.11925000000001,47.7118],[-122.11876,47.711879999999994],[-122.11726000000002,47.712360000000004],[-122.11726000000002,47.71229],[-122.11729000000001,47.71164399999999],[-122.117303,47.71124399999999],[-122.11731,47.71102],[-122.11733,47.710657],[-122.11711900000002,47.710657],[-122.11704,47.710657],[-122.11599199999999,47.71066],[-122.116,47.71055500000001],[-122.115999,47.710426],[-122.11531,47.71042],[-122.11531,47.710190000000004],[-122.11472,47.710191],[-122.11471,47.710370000000005],[-122.11402000000001,47.710370000000005],[-122.11399,47.710930000000005],[-122.11399,47.71101],[-122.11399,47.711033],[-122.11399,47.71114],[-122.11343799999999,47.71114],[-122.11190300000001,47.711133000000004],[-122.1114,47.711130000000004],[-122.11088,47.711129],[-122.11077999999999,47.711129],[-122.11073999999999,47.711129],[-122.11066000000001,47.711129],[-122.11052000000001,47.711130000000004],[-122.11042,47.711133000000004],[-122.11031,47.711130000000004],[-122.11014,47.71114],[-122.1092,47.71115],[-122.10871999999999,47.711163],[-122.10871999999999,47.71101],[-122.102443,47.711072],[-122.09975,47.7111],[-122.09976,47.710985],[-122.09976,47.71097],[-122.09978799999999,47.71012],[-122.09979,47.71006],[-122.0998,47.70955000000001],[-122.0998,47.70917000000001],[-122.09984,47.707350000000005],[-122.09984,47.7072],[-122.09985,47.707003],[-122.09985,47.706801],[-122.09986,47.706520000000005],[-122.09987,47.70573000000001],[-122.09989,47.70512000000001],[-122.09991000000001,47.704145000000004],[-122.09991000000001,47.703966],[-122.09991000000001,47.703810000000004],[-122.099597,47.703790000000005],[-122.09897,47.70373000000001],[-122.09882,47.703720000000004],[-122.09672,47.70353000000001],[-122.09504,47.703390000000006],[-122.093,47.703190000000006],[-122.09297,47.703187],[-122.09294,47.70318],[-122.09291,47.70318],[-122.09282,47.70317000000001],[-122.09216,47.703120000000006],[-122.09215,47.703054],[-122.09215,47.70299000000001],[-122.09128000000001,47.70291000000001],[-122.09105000000001,47.702891],[-122.09103,47.702780000000004],[-122.09100000000001,47.702540000000006],[-122.09095,47.70238200000001],[-122.09086,47.70231000000001],[-122.09079,47.702245000000005],[-122.09074,47.702200000000005],[-122.09059,47.702090000000005],[-122.09068,47.702090000000005],[-122.09083,47.70210000000001],[-122.09087,47.70210000000001],[-122.09093,47.70210000000001],[-122.09096000000001,47.702107000000005],[-122.09094,47.70161],[-122.09093,47.70161],[-122.09052000000001,47.70159],[-122.09052000000001,47.70139],[-122.09049,47.701010000000004],[-122.09053,47.700970000000005],[-122.09069000000001,47.7008],[-122.09113,47.700320000000005],[-122.09107,47.700247],[-122.09043,47.69957000000001],[-122.09043,47.69944],[-122.09042000000001,47.699383000000005],[-122.09168000000001,47.69948],[-122.09269,47.699554000000006],[-122.09279,47.699563000000005],[-122.09293,47.699580000000005],[-122.09301,47.69928],[-122.09309,47.699000000000005],[-122.09312000000001,47.698890000000006],[-122.09312000000001,47.69832000000001],[-122.09313,47.697790000000005],[-122.09313,47.69749],[-122.09314,47.6968],[-122.09312000000001,47.695690000000006],[-122.0929,47.694406],[-122.09288,47.69428],[-122.09284,47.693470000000005],[-122.09277699999998,47.692820000000005],[-122.0926,47.69213000000001],[-122.09185000000001,47.69075000000001],[-122.09181000000001,47.6906],[-122.09178,47.69037900000001],[-122.09178,47.690064],[-122.09178,47.69004],[-122.09171,47.69005000000001],[-122.09147,47.69004],[-122.09141000000001,47.69001900000001],[-122.09134,47.690022000000006],[-122.09124000000001,47.69001000000001],[-122.09114000000001,47.690000000000005],[-122.09107300000001,47.68999],[-122.09096000000001,47.689941],[-122.09087,47.689910000000005],[-122.09079,47.689859999999996],[-122.09065000000001,47.68981],[-122.09049,47.689730000000004],[-122.09039,47.689688],[-122.0903,47.68962],[-122.09025000000001,47.689589],[-122.09022000000002,47.689498],[-122.09013,47.68944],[-122.09007,47.689372000000006],[-122.08995,47.689370000000004],[-122.08992,47.68934],[-122.08988,47.68932],[-122.089853,47.68927],[-122.08986,47.689237],[-122.089867,47.68916],[-122.0899,47.68905],[-122.08993099999999,47.68898],[-122.08981,47.688970000000005],[-122.089724,47.688970000000005],[-122.08946,47.689076],[-122.0894,47.689095],[-122.08937999999999,47.6891],[-122.08937999999999,47.68902],[-122.08937999999999,47.688987],[-122.08937999999999,47.688941],[-122.08937999999999,47.68891000000001],[-122.08937999999999,47.688855000000004],[-122.08942,47.68758],[-122.08943,47.687279999999994],[-122.08943,47.687205],[-122.08944,47.687068999999994],[-122.089493,47.687068999999994],[-122.08995,47.687072],[-122.09047,47.687079999999995],[-122.09046000000001,47.685750000000006],[-122.09046000000001,47.68571000000001],[-122.09038,47.68571000000001],[-122.09005,47.68571000000001],[-122.08949,47.68571000000001],[-122.089222,47.68571000000001],[-122.08686,47.68571000000001],[-122.08686999999999,47.685597],[-122.08689,47.68529],[-122.08691,47.684684999999995],[-122.08692,47.684419999999996],[-122.08694,47.684052],[-122.08694,47.6839],[-122.08642,47.683910000000004],[-122.08435,47.683918000000006],[-122.08432,47.68438],[-122.08202999999999,47.68438],[-122.081597,47.68439],[-122.08135,47.68438],[-122.08129000000001,47.68438],[-122.08136,47.68433],[-122.08142000000001,47.683183],[-122.07966,47.68321],[-122.07956999999999,47.683045],[-122.07927,47.682539000000006],[-122.07917499999999,47.68233000000001],[-122.07941,47.68228],[-122.08432,47.68224],[-122.08432,47.681963999999994],[-122.08434,47.68052],[-122.08436,47.67944],[-122.08436,47.67882],[-122.08436999999999,47.67862],[-122.08424000000001,47.67862],[-122.08351,47.678625000000004],[-122.08169000000001,47.678629],[-122.08169000000001,47.678233000000006],[-122.08169000000001,47.677724],[-122.08169000000001,47.677579],[-122.08169000000001,47.67739],[-122.08169400000001,47.677170000000004],[-122.08169000000001,47.67682],[-122.08169600000001,47.67616],[-122.0817,47.67590800000001],[-122.0817,47.67550800000001],[-122.0817,47.675450000000005],[-122.0817,47.67511800000001],[-122.08148,47.675084],[-122.07898999999999,47.67508],[-122.07898999999999,47.675000000000004],[-122.07887999999998,47.674997],[-122.07886999999998,47.67372],[-122.07886999999998,47.673245],[-122.07898999999999,47.67325],[-122.07898999999999,47.673190000000005],[-122.08033999999999,47.673190000000005],[-122.08056300000001,47.673190000000005],[-122.08099,47.673190000000005],[-122.081137,47.673190000000005],[-122.08113,47.672875000000005],[-122.08143,47.67288],[-122.08165000000001,47.672874],[-122.08222,47.672872000000005],[-122.08216,47.67255000000001],[-122.08212999999999,47.67237000000001],[-122.08207999999999,47.671330000000005],[-122.08168,47.671330000000005],[-122.08169000000001,47.670410000000004],[-122.08154,47.670058000000004],[-122.08141,47.66978],[-122.08136999999999,47.66967],[-122.08126000000001,47.669430000000006],[-122.08117,47.669230000000006],[-122.08109,47.66904],[-122.08085,47.66854300000001],[-122.08082,47.668470000000006],[-122.08073999999999,47.66830000000001],[-122.08071,47.66825000000001],[-122.08066400000001,47.66811300000001],[-122.08049,47.66767],[-122.08046,47.667629],[-122.08035,47.66743],[-122.08013,47.667062],[-122.08009,47.666990000000006],[-122.07995,47.66677000000001],[-122.07991,47.666714000000006],[-122.07965,47.66630000000001],[-122.0796,47.666230000000006],[-122.07946999999999,47.66604],[-122.07936,47.66571200000001],[-122.07914,47.665400000000005],[-122.07903999999999,47.66510000000001],[-122.07902,47.664730000000006],[-122.07897999999999,47.664468],[-122.07911,47.66418],[-122.07928,47.663970000000006],[-122.07954,47.663857],[-122.07985,47.663768000000005],[-122.08003,47.66372200000001],[-122.08019,47.663683],[-122.08073999999999,47.663689],[-122.0811,47.663644],[-122.08138,47.663590000000006],[-122.08152000000001,47.663509000000005],[-122.08176999999999,47.663334000000006],[-122.08243999999999,47.66316200000001],[-122.08289699999999,47.66316200000001],[-122.08333999999999,47.66302],[-122.08351,47.66301000000001],[-122.083805,47.66297000000001],[-122.08409,47.662909000000006],[-122.08439,47.66277600000001],[-122.08486,47.662440000000004],[-122.08578999999999,47.661950000000004],[-122.08585,47.66188],[-122.08594,47.66178],[-122.08596999999999,47.66165],[-122.08606,47.6614],[-122.08621000000001,47.661223],[-122.08635,47.660940000000004],[-122.086452,47.66070200000001],[-122.08652000000001,47.66033000000001],[-122.08649,47.660120000000006],[-122.086722,47.65983],[-122.08685,47.659403],[-122.08693,47.65922],[-122.08703,47.659008],[-122.08711600000001,47.65882],[-122.08721000000001,47.658581],[-122.08726100000001,47.658274],[-122.08716000000001,47.657979999999995],[-122.08714,47.65773],[-122.08705,47.65751],[-122.08729000000001,47.657453],[-122.08755000000001,47.65740699999999],[-122.08812,47.65748099999999],[-122.08816,47.657489999999996],[-122.08847999999999,47.657199999999996],[-122.08873999999999,47.657058],[-122.08891,47.656977],[-122.08902,47.656917],[-122.08912000000001,47.65683],[-122.08925,47.656672],[-122.08936,47.656531],[-122.08958,47.656079999999996],[-122.08991,47.65564],[-122.09022000000002,47.65514],[-122.09046000000001,47.65472],[-122.09061000000001,47.65447999999999],[-122.0907,47.654363999999994],[-122.09075,47.654319],[-122.09087,47.65424599999999],[-122.09104,47.65417],[-122.09123000000001,47.654114],[-122.091147,47.653986999999994],[-122.09109000000001,47.65391],[-122.09139,47.653816],[-122.09160000000001,47.65375],[-122.09187,47.653659999999995],[-122.092,47.65362],[-122.09203,47.653679999999994],[-122.09210300000001,47.65379],[-122.09216,47.653901],[-122.09219,47.65396],[-122.09222000000001,47.654016],[-122.092276,47.65416],[-122.092325,47.65427999999999],[-122.09235,47.654328],[-122.0924,47.654416],[-122.09246,47.654508],[-122.09251,47.65457],[-122.09253,47.654619999999994],[-122.09261000000001,47.65471],[-122.09272999999999,47.65484099999999],[-122.09275,47.654869999999995],[-122.09279,47.6549],[-122.09284,47.654939999999996],[-122.09286999999999,47.654959999999996],[-122.0929,47.655],[-122.09294,47.655026],[-122.09272,47.65538],[-122.09320000000001,47.655730000000005],[-122.09366000000001,47.655978000000005],[-122.09414000000001,47.656330000000004],[-122.09500799999999,47.657889999999995],[-122.09534,47.65856],[-122.096475,47.659737],[-122.09772000000001,47.659745],[-122.09772000000001,47.65937],[-122.10009,47.65937],[-122.10012,47.66071000000001],[-122.10014,47.66116],[-122.10015,47.66131000000001],[-122.10015,47.661570000000005],[-122.10015,47.661873],[-122.10015,47.66216000000001],[-122.10176,47.662180000000006],[-122.10194,47.66217800000001],[-122.103603,47.662200000000006],[-122.10446999999999,47.662209000000004],[-122.10548999999999,47.662220000000005],[-122.10555,47.662220000000005],[-122.10555,47.66328],[-122.10555,47.663360000000004],[-122.10555,47.66367],[-122.10555,47.663924],[-122.10555,47.664010000000005],[-122.1056,47.664010000000005],[-122.10577999999998,47.664],[-122.10729,47.66402],[-122.10797,47.664029],[-122.10875999999999,47.664037],[-122.10955,47.66405],[-122.11065,47.66406],[-122.11094,47.66406],[-122.11093,47.665281],[-122.11092000000001,47.66622],[-122.11091,47.666740000000004],[-122.11091,47.66709],[-122.11114,47.66705],[-122.11202,47.666889],[-122.1124,47.66687],[-122.12161,47.66702],[-122.12637999999998,47.66677000000001],[-122.12642,47.66662],[-122.12646999999998,47.66637000000001],[-122.12675999999999,47.66617000000001],[-122.12702999999999,47.665243000000004],[-122.12705,47.66513000000001],[-122.127,47.66478],[-122.12701,47.66448],[-122.12697999999999,47.664165000000004],[-122.12692999999999,47.66393000000001],[-122.12673599999998,47.663364],[-122.12597999999998,47.661750000000005],[-122.12476999999998,47.660695000000004],[-122.12438999999999,47.6604],[-122.12321,47.6595],[-122.12116999999999,47.65791],[-122.12007999999999,47.65699],[-122.11886999999999,47.6559],[-122.11871,47.655750000000005],[-122.11538999999999,47.657139],[-122.11505,47.65694],[-122.11389,47.656130000000005],[-122.11344,47.65572],[-122.11308,47.655324],[-122.1128,47.655010000000004],[-122.11224,47.65424099999999],[-122.11199,47.654146],[-122.11146000000001,47.65395],[-122.10909,47.65307],[-122.10763,47.65252],[-122.10703,47.65002],[-122.10614,47.64828],[-122.10609,47.648258000000006],[-122.10602999999999,47.648219000000005],[-122.10596999999999,47.648160000000004],[-122.105944,47.64810000000001],[-122.10589999999999,47.64789],[-122.10587999999998,47.647819999999996],[-122.10579999999999,47.64773],[-122.10569,47.647659999999995],[-122.10556999999999,47.64752],[-122.10536999999998,47.647268],[-122.10526,47.64712],[-122.10516999999999,47.646961],[-122.10498,47.646530000000006],[-122.10489,47.646136000000006],[-122.10479,47.645927],[-122.10479,47.64589],[-122.10481,47.64584],[-122.10481,47.645770000000006],[-122.10480199999999,47.645742000000006],[-122.104769,47.645665],[-122.10472999999999,47.64562],[-122.10463,47.64556],[-122.10456,47.645524],[-122.1045,47.64539200000001],[-122.10436999999999,47.64531600000001],[-122.10417,47.64529],[-122.10392999999999,47.645275000000005],[-122.1039,47.645250000000004],[-122.10356999999999,47.645070000000004],[-122.10341799999999,47.645004],[-122.10336,47.64496],[-122.10329999999999,47.64491],[-122.10316999999999,47.64476],[-122.10292999999999,47.64473],[-122.10286999999998,47.644679999999994],[-122.10282,47.6446],[-122.10266999999999,47.64447],[-122.10256999999999,47.64439],[-122.10246,47.644330000000004],[-122.10236999999998,47.64429],[-122.10230999999999,47.644279999999995],[-122.10226,47.644275],[-122.10217099999998,47.6442],[-122.10206,47.644098],[-122.102019,47.64401],[-122.10199999999999,47.643978000000004],[-122.10191,47.64392],[-122.10186999999999,47.64387],[-122.10186999999999,47.643842],[-122.10185,47.64377],[-122.10182,47.643707],[-122.10176999999999,47.643663999999994],[-122.10164,47.643574],[-122.1015,47.64352],[-122.10141,47.6435],[-122.10136999999999,47.64349],[-122.10132,47.64346],[-122.1013,47.643417],[-122.10127,47.64331000000001],[-122.10124,47.64318],[-122.10125000000001,47.64314],[-122.10128,47.64309],[-122.10134,47.64302],[-122.10142,47.64296],[-122.1015,47.642896],[-122.10155,47.642790000000005],[-122.10131,47.642120000000006],[-122.1012,47.64171],[-122.10109,47.64162699999999],[-122.101,47.64154],[-122.10082999999999,47.641465],[-122.10051,47.641310000000004],[-122.10019,47.64116],[-122.09936,47.64105],[-122.09925000000001,47.64097],[-122.09919000000001,47.640854],[-122.09907,47.640764],[-122.09892,47.64068399999999],[-122.09882999999999,47.64064],[-122.09872999999999,47.64058],[-122.0982,47.640423],[-122.09797,47.640378000000005],[-122.09764000000001,47.640248],[-122.09735,47.640170000000005],[-122.09710000000001,47.64009],[-122.09699,47.640034],[-122.09673,47.639851],[-122.096552,47.639688],[-122.09638,47.639524],[-122.09619,47.639340000000004],[-122.09599,47.639190000000006],[-122.09569,47.638980000000004],[-122.09465000000002,47.63835000000001],[-122.09443,47.63835000000001],[-122.09403,47.63813000000001],[-122.09334,47.63797],[-122.09306000000001,47.637822],[-122.09276,47.637522000000004],[-122.09261000000001,47.637326],[-122.09243,47.636970000000005],[-122.09221000000001,47.63689],[-122.09225,47.63649],[-122.09225,47.63633000000001],[-122.09124900000002,47.63526],[-122.09108,47.63524],[-122.09083,47.635222000000006],[-122.08982999999999,47.635222000000006],[-122.08753,47.633120000000005],[-122.08686,47.63111000000001],[-122.08682999999999,47.63102],[-122.08682999999999,47.630970000000005],[-122.08693,47.62753000000001],[-122.08819,47.62753000000001],[-122.08872999999998,47.62753000000001],[-122.08989,47.62753000000001],[-122.0909,47.62751000000001],[-122.09182000000001,47.627511000000005],[-122.09186000000001,47.62745],[-122.09195000000001,47.627344],[-122.09203,47.62728],[-122.09209,47.627244],[-122.09222000000001,47.62718],[-122.09255,47.62753000000001],[-122.09297,47.62753000000001],[-122.0937,47.62753000000001],[-122.09492000000002,47.62754],[-122.09552000000001,47.62754],[-122.09556,47.62754],[-122.09597,47.627545000000005],[-122.096548,47.627548000000004],[-122.09732000000001,47.627553000000006],[-122.09829,47.62755800000001],[-122.098486,47.627561],[-122.09972,47.62756],[-122.10036,47.627570000000006],[-122.10111,47.627570000000006],[-122.10236999999998,47.62758],[-122.10266,47.62758],[-122.10356999999999,47.62758],[-122.10372,47.62758],[-122.10370999999999,47.627561],[-122.10434,47.62758],[-122.10434,47.627604],[-122.10565,47.627611],[-122.10686,47.62762],[-122.10862,47.627637],[-122.11039,47.62763],[-122.11094,47.627634],[-122.11093,47.62816000000001],[-122.11093,47.628454000000005],[-122.11093,47.62935000000001],[-122.11092000000001,47.63009],[-122.11095,47.630770000000005],[-122.11086,47.63124],[-122.11095,47.632940000000005],[-122.11085,47.633900000000004],[-122.11085,47.634014],[-122.11085,47.63506],[-122.11085,47.635307000000005],[-122.11082999999999,47.635360000000006],[-122.11086999999999,47.63537000000001],[-122.11089,47.63541000000001],[-122.11091,47.635450000000006],[-122.11092000000001,47.635605000000005],[-122.11091,47.63631000000001],[-122.11091,47.636720000000004],[-122.11091,47.637259],[-122.1109,47.638076000000005],[-122.1109,47.638450000000006],[-122.1109,47.638604],[-122.11090300000001,47.638740000000006],[-122.11108,47.638740000000006],[-122.11106000000001,47.63922],[-122.11107,47.639450000000004],[-122.11108,47.640646],[-122.11106000000001,47.64129],[-122.11107,47.64232500000001],[-122.11107,47.642364],[-122.11108300000001,47.643235000000004],[-122.11108,47.64347],[-122.11107,47.643910000000005],[-122.11109,47.644859999999994],[-122.11110000000001,47.64526],[-122.11111500000001,47.64594],[-122.11174,47.64594],[-122.11288799999998,47.64593000000001],[-122.11346999999999,47.645920000000004],[-122.11403,47.64594],[-122.11403,47.645618000000006],[-122.11414,47.645340000000004],[-122.11434,47.645071],[-122.11507999999999,47.64429],[-122.11586199999999,47.64356],[-122.11648,47.643023],[-122.11710000000001,47.64258],[-122.11720000000001,47.642499],[-122.11723,47.64251000000001],[-122.11742000000001,47.64238],[-122.11748,47.64238],[-122.117571,47.64231000000001],[-122.11773,47.64218],[-122.11785,47.642085],[-122.11805,47.641928],[-122.11819,47.64181],[-122.11829999999999,47.64173],[-122.11874999999999,47.641365],[-122.1188,47.64134],[-122.11902,47.64115],[-122.11956,47.64072],[-122.1198,47.64054],[-122.11984,47.640505000000005],[-122.12006999999998,47.64032],[-122.12042,47.64005],[-122.12075499999999,47.639790000000005],[-122.12101,47.639570000000006],[-122.12105,47.6396],[-122.12136999999998,47.63936],[-122.12178999999999,47.639029],[-122.12188799999998,47.638960000000004],[-122.12219999999999,47.638740000000006],[-122.12226999999999,47.638740000000006],[-122.12235999999999,47.638740000000006],[-122.12257999999999,47.638580000000005],[-122.12322,47.63811000000001],[-122.12346999999998,47.63794],[-122.12362999999999,47.63783],[-122.12375999999999,47.63783],[-122.12391,47.637735000000006],[-122.12499999999999,47.637130000000006],[-122.12588999999998,47.6366],[-122.1262,47.63642],[-122.127,47.63597000000001],[-122.127,47.63590000000001],[-122.12729,47.63574200000001],[-122.12754,47.63559000000001],[-122.12777999999999,47.635450000000006],[-122.12821799999999,47.635200000000005],[-122.12836099999998,47.635204],[-122.12898999999999,47.63521000000001],[-122.12966999999999,47.635222000000006],[-122.12966999999999,47.63510000000001],[-122.13037999999999,47.63510000000001],[-122.13165000000001,47.63512000000001],[-122.13234999999999,47.63513700000001],[-122.13234999999999,47.633658000000004],[-122.13252,47.633654],[-122.13252999999999,47.63274500000001],[-122.13253999999999,47.63273000000001],[-122.13256,47.63270800000001],[-122.13257999999999,47.632690000000004],[-122.132612,47.632669],[-122.13272999999998,47.632600000000004],[-122.13286999999998,47.63252000000001],[-122.13336,47.632249],[-122.13347999999999,47.63217300000001],[-122.13365,47.632070000000006],[-122.13376,47.632000000000005],[-122.13385,47.631930000000004],[-122.13398,47.63182],[-122.13414,47.63166],[-122.13419,47.6316],[-122.1342,47.631581],[-122.13427,47.6315],[-122.13412000000001,47.631501],[-122.13415,47.63147],[-122.13425000000001,47.6313],[-122.13432999999999,47.63116],[-122.13439,47.631005],[-122.13441,47.63091000000001],[-122.13452000000001,47.630230000000005],[-122.13458,47.629960000000004],[-122.13463,47.629760000000005],[-122.13465000000001,47.629675000000006],[-122.13476,47.62944],[-122.13493,47.62919000000001],[-122.13501,47.629090000000005],[-122.135179,47.62891000000001],[-122.13528,47.628820000000005],[-122.1355,47.628640000000004],[-122.13561,47.62857000000001],[-122.13586999999998,47.628420000000006],[-122.13621,47.628260000000004],[-122.13652,47.62813000000001],[-122.13677999999999,47.628040000000006],[-122.13727,47.62787],[-122.13772999999999,47.62788],[-122.13773099999999,47.627790000000005],[-122.13808999999999,47.6278],[-122.13892,47.627790000000005],[-122.13978999999999,47.627790000000005],[-122.1409,47.627790000000005],[-122.14124000000001,47.627790000000005],[-122.14145,47.627790000000005],[-122.14157,47.627790000000005],[-122.14169500000001,47.627790000000005],[-122.14174,47.627790000000005],[-122.1418,47.62778],[-122.14183,47.62778],[-122.1424,47.62748],[-122.14311000000001,47.62713000000001],[-122.14309,47.627863],[-122.14309,47.628246000000004],[-122.14304,47.631491],[-122.14302,47.63208],[-122.143,47.63243000000001],[-122.14301,47.63286],[-122.14302,47.63298],[-122.14305,47.63311000000001],[-122.14306,47.63326],[-122.14305,47.633741],[-122.143046,47.634189],[-122.14304,47.63434],[-122.14304,47.63453500000001],[-122.14304,47.634750000000004],[-122.143046,47.63521000000001],[-122.14308199999999,47.635360000000006],[-122.14309,47.63564],[-122.14309,47.63591500000001],[-122.14308,47.63617000000001],[-122.14308,47.636655000000005],[-122.14308199999999,47.63689],[-122.14308,47.63762],[-122.14308,47.637860999999994],[-122.14308,47.63862],[-122.14308199999999,47.63871000000001],[-122.14309,47.638821],[-122.14308,47.64014],[-122.14307,47.64147],[-122.14306,47.642404],[-122.14306,47.64403],[-122.14305,47.64437],[-122.14305,47.64504],[-122.14305,47.645950000000006],[-122.14307799999999,47.646770000000004],[-122.14308,47.646871],[-122.14317,47.648700000000005],[-122.14324,47.650002],[-122.14326200000001,47.65054],[-122.14335,47.65227],[-122.14335,47.65234],[-122.1434,47.653285],[-122.1434,47.653459],[-122.14341,47.65357],[-122.14334,47.65506],[-122.14334,47.65513000000001],[-122.14332999999999,47.657048999999994],[-122.14334,47.65745],[-122.14334,47.657849999999996],[-122.14335,47.658530000000006],[-122.14336,47.659217],[-122.14335,47.660643],[-122.14443,47.66064],[-122.14814199999999,47.660605000000004],[-122.14908,47.6606],[-122.1495,47.660590000000006],[-122.15152,47.66057000000001],[-122.15339999999999,47.660559000000006],[-122.15432,47.66058],[-122.15558999999999,47.66061800000001],[-122.15749,47.660590000000006],[-122.15842999999998,47.66064],[-122.15861,47.66064],[-122.15874999999998,47.660644],[-122.15874999999998,47.66067],[-122.15872999999998,47.66231000000001],[-122.15872999999998,47.66246],[-122.15871999999999,47.66268],[-122.15871599999998,47.66319000000001],[-122.15870199999998,47.66431000000001],[-122.15868999999999,47.66484],[-122.15867999999999,47.66545000000001],[-122.15892,47.66545000000001],[-122.15897999999999,47.66545000000001],[-122.15907999999999,47.66545000000001],[-122.15917999999999,47.66545000000001],[-122.15932999999998,47.66545300000001],[-122.15937999999998,47.665454000000004],[-122.15959,47.665456000000006],[-122.15969,47.665456000000006],[-122.15979099999998,47.66546],[-122.15988999999999,47.66545800000001],[-122.15991,47.66545800000001],[-122.16,47.665459000000006],[-122.1601,47.66546],[-122.16041,47.665462000000005],[-122.1605,47.66546],[-122.16061,47.665464],[-122.16066000000001,47.665465000000005],[-122.16071,47.665465000000005],[-122.16081,47.665470000000006],[-122.16091,47.665467],[-122.16101,47.665467],[-122.16112000000001,47.665468000000004],[-122.16113,47.665468000000004],[-122.16122000000001,47.665470000000006],[-122.16134,47.665470000000006],[-122.16146,47.665470000000006],[-122.1617,47.665470000000006],[-122.1617,47.66553000000001],[-122.16169000000001,47.665820000000004],[-122.16168,47.66646],[-122.16168,47.66649],[-122.16197,47.66649],[-122.162596,47.66649],[-122.16354,47.666500000000006],[-122.16375,47.666500000000006],[-122.16375,47.666610000000006],[-122.16387999999999,47.66662],[-122.16399,47.666650000000004],[-122.16396999999999,47.66801200000001],[-122.163973,47.668380000000006],[-122.16396999999999,47.66891000000001],[-122.16396999999999,47.66917000000001],[-122.16396999999999,47.669404],[-122.16396900000001,47.66964],[-122.16396,47.67016],[-122.16395,47.67082],[-122.16394,47.671682999999994],[-122.16392,47.67368],[-122.163902,47.67531900000001],[-122.16391,47.676725000000005],[-122.16391,47.67721],[-122.16392,47.678990000000006],[-122.163919,47.67949],[-122.16391,47.68065],[-122.16391,47.68074],[-122.16392,47.68163],[-122.16392,47.68185999999999],[-122.163914,47.68234],[-122.16393,47.68253000000001],[-122.16394,47.6826],[-122.16399,47.68307],[-122.16411000000001,47.683782],[-122.16414,47.68397],[-122.16418,47.6842],[-122.16424,47.68459],[-122.16426000000001,47.684748],[-122.16436,47.685383],[-122.16412000000001,47.685410000000005],[-122.16182,47.685570000000006],[-122.16179,47.685386],[-122.16069,47.685770000000005],[-122.16064,47.685784],[-122.16056,47.685810000000004],[-122.16089,47.68625],[-122.16114,47.686524],[-122.16151,47.686949],[-122.16162000000001,47.687059999999995],[-122.16174,47.687169],[-122.16187,47.68727],[-122.162023,47.68736],[-122.16217999999999,47.687439999999995],[-122.162245,47.687462999999994],[-122.16234999999999,47.687508],[-122.16252999999999,47.68757],[-122.16272,47.687619999999995],[-122.16291,47.68765],[-122.163108,47.687678],[-122.16331,47.687689999999996],[-122.16351,47.687690999999994],[-122.16371,47.68767999999999],[-122.163902,47.687659999999994],[-122.16398,47.687642],[-122.16408,47.687619999999995],[-122.16425000000001,47.68758],[-122.16441,47.68753],[-122.16446,47.687514],[-122.16469000000001,47.687419],[-122.16471,47.68755],[-122.16478,47.688],[-122.16478,47.688050000000004],[-122.16479,47.68811900000001],[-122.1649,47.68887],[-122.16498,47.68946],[-122.16498,47.689558000000005],[-122.16498,47.68982]]]},"name":"Redmond"},{"boundary":{"type":"Polygon","coordinates":[[[-122.25443,47.58922],[-122.25432,47.589517],[-122.25426000000002,47.589659999999995],[-122.25422000000002,47.58976],[-122.25420000000001,47.589814],[-122.253195,47.592400000000005],[-122.25233999999999,47.592507000000005],[-122.24972000000001,47.59181],[-122.24662000000002,47.594463],[-122.24683,47.595842000000005],[-122.24683,47.59591000000001],[-122.24634,47.59577000000001],[-122.24346600000001,47.59546],[-122.24307,47.59571400000001],[-122.24286900000001,47.59543000000001],[-122.24186000000002,47.59498],[-122.23773,47.59252000000001],[-122.23508,47.593210000000006],[-122.23474,47.59329],[-122.23193,47.594021],[-122.23113000000001,47.593621],[-122.22882999999999,47.59448],[-122.22872999999998,47.59452],[-122.22802999999999,47.595321000000006],[-122.227134,47.595321000000006],[-122.22653,47.595421],[-122.22693,47.59512000000001],[-122.22443,47.58992],[-122.22425000000001,47.58905],[-122.22403,47.58802],[-122.224734,47.58712],[-122.22463400000001,47.58672],[-122.22457,47.586572000000004],[-122.22443,47.58622],[-122.22262,47.585633],[-122.22072999999999,47.58502],[-122.21931000000001,47.584962],[-122.21823,47.58492],[-122.21572,47.582390000000004],[-122.21532,47.582581],[-122.21523,47.582274],[-122.21226000000001,47.582026],[-122.20949,47.58067],[-122.20920000000001,47.58096],[-122.20920000000001,47.58055],[-122.20745000000001,47.58043],[-122.20678,47.58025],[-122.20568,47.57998],[-122.20542999999999,47.579917],[-122.20303,47.57848],[-122.202904,47.5784],[-122.20262000000001,47.578230000000005],[-122.20245,47.578126000000005],[-122.20242999999999,47.57811200000001],[-122.20232,47.578050000000005],[-122.20223,47.578050000000005],[-122.201997,47.578026],[-122.20196000000001,47.578010000000006],[-122.20194000000001,47.577996],[-122.201907,47.577963999999994],[-122.20190000000001,47.577858],[-122.20192000000002,47.57774],[-122.20188,47.57745],[-122.20174,47.57662],[-122.2026,47.57562],[-122.20354,47.574528],[-122.20332,47.57294],[-122.20303,47.572720000000004],[-122.20352000000001,47.57264],[-122.20401000000001,47.57145],[-122.20391000000001,47.571239999999996],[-122.20422000000002,47.57114],[-122.205633,47.570321],[-122.20693,47.570021],[-122.20693,47.569721],[-122.207333,47.569621],[-122.20742000000001,47.569100000000006],[-122.20769000000001,47.56769],[-122.20780300000001,47.56708],[-122.20783,47.56692],[-122.20933,47.56342],[-122.20934,47.560002000000004],[-122.20934,47.559799],[-122.20933,47.55766299999999],[-122.21006000000001,47.55752],[-122.20938,47.556332000000005],[-122.20926000000001,47.553419999999996],[-122.20924000000001,47.55232],[-122.20924000000001,47.552150000000005],[-122.20920000000001,47.549616],[-122.20919,47.54919],[-122.209182,47.548711000000004],[-122.2091,47.543639999999996],[-122.20907,47.54213000000001],[-122.209047,47.539730000000006],[-122.21051000000001,47.5384],[-122.21379,47.533836],[-122.21619000000001,47.531859999999995],[-122.21946000000001,47.528645000000004],[-122.22373999999999,47.526030000000006],[-122.22489,47.524710000000006],[-122.22523,47.52432],[-122.226167,47.524623],[-122.22645,47.52494],[-122.22715000000001,47.524909],[-122.22728000000001,47.5249],[-122.22754,47.5249],[-122.22830499999999,47.524868],[-122.2284,47.524865],[-122.22909,47.52523800000001],[-122.23391000000001,47.527843999999995],[-122.23442000000001,47.528220000000005],[-122.23505,47.528689],[-122.23624000000001,47.52957000000001],[-122.23638,47.529686],[-122.23669000000001,47.529520000000005],[-122.23686000000001,47.529517000000006],[-122.23697,47.52957000000001],[-122.23706000000001,47.529610000000005],[-122.23724000000001,47.529740000000004],[-122.23734900000001,47.52995000000001],[-122.23741000000001,47.53018],[-122.237395,47.53032],[-122.23739,47.53044],[-122.23816000000001,47.53102],[-122.23861000000001,47.530910000000006],[-122.23881,47.53092],[-122.23912000000001,47.53104],[-122.23931,47.531195000000004],[-122.239315,47.531459999999996],[-122.23926000000002,47.531679],[-122.23923300000001,47.531819999999996],[-122.24015000000001,47.532509000000005],[-122.2403,47.532624],[-122.24164000000002,47.53362],[-122.24209,47.533964],[-122.24296000000001,47.534616],[-122.24403000000001,47.53542],[-122.24411000000002,47.537521],[-122.24412000000002,47.53781],[-122.24413000000001,47.538221],[-122.24409000000001,47.53829],[-122.24394000000001,47.53851300000001],[-122.24380000000001,47.53871000000001],[-122.24269000000001,47.540391],[-122.24213,47.541219999999996],[-122.23872999999999,47.54252],[-122.23849,47.543110000000006],[-122.23745000000001,47.54564],[-122.23731000000001,47.545963],[-122.23594,47.549310000000006],[-122.23582,47.5496],[-122.23548,47.550438],[-122.23402000000002,47.55072],[-122.23499000000001,47.55101],[-122.233308,47.55241],[-122.23341,47.552710000000005],[-122.23309,47.55358],[-122.23298,47.553855],[-122.23272999999999,47.55452],[-122.23097,47.55869],[-122.23051000000001,47.55977],[-122.23039,47.56007],[-122.23031,47.56026],[-122.23022000000002,47.56046],[-122.23286999999999,47.56590800000001],[-122.23316000000001,47.56727],[-122.23333,47.568121000000005],[-122.23394,47.568121000000005],[-122.23376999999999,47.56826],[-122.23358,47.56841000000001],[-122.23503,47.569320000000005],[-122.235634,47.569320000000005],[-122.23523,47.569621],[-122.23713000000001,47.57062],[-122.23743,47.57054],[-122.237435,47.57109],[-122.23804,47.57112],[-122.23794000000001,47.57145],[-122.23834,47.57158],[-122.23894,47.57235000000001],[-122.23954,47.57239200000001],[-122.23954,47.572829],[-122.24032000000001,47.573617],[-122.24075,47.57385],[-122.24494000000001,47.57611000000001],[-122.24821000000001,47.57884],[-122.24853,47.579121],[-122.24923000000001,47.57952],[-122.24973,47.57952],[-122.24953000000001,47.57992],[-122.25193,47.58181999999999],[-122.252,47.58191],[-122.25282999999999,47.583321],[-122.25287999999999,47.583402],[-122.253434,47.58472],[-122.25393,47.584916],[-122.25393,47.585097],[-122.25393,47.587019999999995],[-122.25437,47.58885],[-122.25442000000001,47.58911500000001],[-122.25443,47.58922]]]},"name":"Mercer Island"},{"boundary":{"type":"Polygon","coordinates":[[[-122.26196700000001,47.72617000000001],[-122.26192000000002,47.72618000000001],[-122.26192000000002,47.72627000000001],[-122.26190000000001,47.726279000000005],[-122.26188,47.72633400000001],[-122.26187,47.726400000000005],[-122.26154000000001,47.72641000000001],[-122.25982,47.726400000000005],[-122.25936999999999,47.72639000000001],[-122.25961000000001,47.72619100000001],[-122.25984,47.72596000000001],[-122.25986999999999,47.72590800000001],[-122.25988,47.72589000000001],[-122.25986999999999,47.72570000000001],[-122.25982,47.725660000000005],[-122.2588,47.72565000000001],[-122.25807999999999,47.725646000000005],[-122.25748,47.725640000000006],[-122.25690900000001,47.72563500000001],[-122.25635,47.72563000000001],[-122.25553,47.725620000000006],[-122.25066000000001,47.72557000000001],[-122.25055,47.72557000000001],[-122.25049,47.72597000000001],[-122.25049,47.726020000000005],[-122.25048,47.72619000000001],[-122.25048,47.726237000000005],[-122.2505,47.72632300000001],[-122.25059900000001,47.726760000000006],[-122.25061000000001,47.72684],[-122.25059,47.727109000000006],[-122.25056000000001,47.727230000000006],[-122.25054,47.727292000000006],[-122.25052000000001,47.72733000000001],[-122.25032999999999,47.72766],[-122.25026000000001,47.727768000000005],[-122.25021000000001,47.72782],[-122.25015,47.72787],[-122.25006,47.727925000000006],[-122.24992000000002,47.727984],[-122.24985000000001,47.72800000000001],[-122.24972000000001,47.728027000000004],[-122.24950000000001,47.72803000000001],[-122.24936000000001,47.72802000000001],[-122.24923000000001,47.72800000000001],[-122.24913000000001,47.727970000000006],[-122.24906000000001,47.72795000000001],[-122.24891000000001,47.72787],[-122.24879,47.72777000000001],[-122.248575,47.72762],[-122.24851000000001,47.727590000000006],[-122.24833,47.72750200000001],[-122.24824000000001,47.727470000000004],[-122.24819000000001,47.727455000000006],[-122.24812000000001,47.727450000000005],[-122.247971,47.72744],[-122.24787,47.727450000000005],[-122.24783000000001,47.727457],[-122.24777,47.727470000000004],[-122.24764000000002,47.727520000000005],[-122.24752000000002,47.727590000000006],[-122.24744000000001,47.727650000000004],[-122.24714000000002,47.72819000000001],[-122.24706000000002,47.728330000000014],[-122.24694000000001,47.72845500000001],[-122.24682200000001,47.72854500000001],[-122.24662000000002,47.72858300000001],[-122.24651000000001,47.72859000000001],[-122.24640000000001,47.72859000000001],[-122.24615000000001,47.72855000000001],[-122.2459,47.72843900000001],[-122.24572,47.72836600000001],[-122.24538,47.72824000000001],[-122.24513,47.72816600000001],[-122.24463000000002,47.728061000000004],[-122.24414000000002,47.72803000000001],[-122.24452000000002,47.72935000000001],[-122.24463100000001,47.72972000000001],[-122.24466700000002,47.729850000000006],[-122.24480000000001,47.730320000000006],[-122.24496000000002,47.730900000000005],[-122.24515000000001,47.7316],[-122.24516000000001,47.73163],[-122.24521000000001,47.731770000000004],[-122.24438900000001,47.731885],[-122.24342000000001,47.732020000000006],[-122.24313000000001,47.732046000000004],[-122.24295000000001,47.732054000000005],[-122.2428,47.732054000000005],[-122.24277699999999,47.73209800000001],[-122.24254,47.73237000000001],[-122.24242000000001,47.73252000000001],[-122.24226000000002,47.73277000000001],[-122.24220000000001,47.732836000000006],[-122.24216000000001,47.73288],[-122.24203,47.73299000000001],[-122.24191000000002,47.733070000000005],[-122.24180000000001,47.73312500000001],[-122.24165000000002,47.73319000000001],[-122.24154000000001,47.733225000000004],[-122.24150000000002,47.73324],[-122.24139000000001,47.73326],[-122.24106000000002,47.73334500000001],[-122.240879,47.733380000000004],[-122.24061000000002,47.733410000000006],[-122.24039,47.733410000000006],[-122.23733,47.733380000000004],[-122.23649,47.73337000000001],[-122.23492000000002,47.733360000000005],[-122.23460300000002,47.733360000000005],[-122.23440000000001,47.73337000000001],[-122.23400000000001,47.73337000000001],[-122.23348,47.73337000000001],[-122.23301000000001,47.733360000000005],[-122.23176000000001,47.73333000000001],[-122.23135,47.733320000000006],[-122.22909,47.73330300000001],[-122.2273,47.733267],[-122.22583999999999,47.73324],[-122.22399300000001,47.733213000000006],[-122.22387499999999,47.73321200000001],[-122.22305,47.733200000000004],[-122.222854,47.733200000000004],[-122.22265,47.733200000000004],[-122.22189,47.73319000000001],[-122.22176999999999,47.73319000000001],[-122.22085,47.733177000000005],[-122.21946000000001,47.73317000000001],[-122.21919000000001,47.733160000000005],[-122.2189,47.733160000000005],[-122.2188,47.733160000000005],[-122.21876,47.73317000000001],[-122.218749,47.733177000000005],[-122.21876,47.73330000000001],[-122.2188,47.73431800000001],[-122.218762,47.73428],[-122.21854,47.734094],[-122.21845,47.734030000000004],[-122.21826000000001,47.73391000000001],[-122.21812000000001,47.733830000000005],[-122.21797000000001,47.73375000000001],[-122.21782000000002,47.73368],[-122.21750000000002,47.733564],[-122.21715000000002,47.733450000000005],[-122.21697,47.733410000000006],[-122.21605000000001,47.73321000000001],[-122.21589,47.73317300000001],[-122.21559,47.73311000000001],[-122.21527,47.73304],[-122.21495000000002,47.732966000000005],[-122.21439000000001,47.73281000000001],[-122.21434,47.73279300000001],[-122.21394000000001,47.732659000000005],[-122.21358000000001,47.73252000000001],[-122.21341000000001,47.732445000000006],[-122.21327000000001,47.73237000000001],[-122.21325000000002,47.73257100000001],[-122.21323000000001,47.733002000000006],[-122.21323000000001,47.73308],[-122.20785000000001,47.733008000000005],[-122.20784400000001,47.73308],[-122.20759000000001,47.733081],[-122.20736000000001,47.733083],[-122.20725000000002,47.733084],[-122.20464000000001,47.73310000000001],[-122.20460000000001,47.73310000000001],[-122.20397,47.73310000000001],[-122.20284799999999,47.73310000000001],[-122.20245,47.73310000000001],[-122.20245,47.73313800000001],[-122.20198,47.733140000000006],[-122.20177,47.733140000000006],[-122.20155700000001,47.733140000000006],[-122.20097,47.733140000000006],[-122.20085,47.73315000000001],[-122.20055,47.73315000000001],[-122.20005,47.73315300000001],[-122.19991,47.73315300000001],[-122.19942,47.73315000000001],[-122.199262,47.73315000000001],[-122.19924,47.73315000000001],[-122.19913,47.73315000000001],[-122.19824,47.733160000000005],[-122.19802,47.733160000000005],[-122.197956,47.733160000000005],[-122.19781,47.733160000000005],[-122.19748,47.733160000000005],[-122.19705,47.733160000000005],[-122.196799,47.733160000000005],[-122.19588999999999,47.733160000000005],[-122.19528,47.733160000000005],[-122.19511,47.73315000000001],[-122.1948,47.73312800000001],[-122.19448,47.73312500000001],[-122.19423400000001,47.73312000000001],[-122.19413,47.73312000000001],[-122.19405,47.73312000000001],[-122.19224,47.733126000000006],[-122.19182,47.73313000000001],[-122.19118,47.73312800000001],[-122.19063,47.733129000000005],[-122.19028,47.73313000000001],[-122.189555,47.73312800000001],[-122.18902,47.733129000000005],[-122.18902,47.73310000000001],[-122.18902,47.73306],[-122.18834999999999,47.733049],[-122.18803999999999,47.733045000000004],[-122.18754,47.733047],[-122.18699,47.73650000000001],[-122.18678999999999,47.737766],[-122.18662,47.73888],[-122.18648999999999,47.73888],[-122.1865,47.739430000000006],[-122.18652,47.740169],[-122.186645,47.740169],[-122.18661,47.74078],[-122.18649599999999,47.74074],[-122.18468,47.740117000000005],[-122.18423,47.73996],[-122.18247999999998,47.739360000000005],[-122.18204999999999,47.73922],[-122.17993999999999,47.738504000000006],[-122.17838799999997,47.73800000000001],[-122.17722,47.73762],[-122.17557999999998,47.73708],[-122.17560999999999,47.73669],[-122.17562999999998,47.736380000000004],[-122.17567999999999,47.73601000000001],[-122.17570999999998,47.73554000000001],[-122.17576999999997,47.734370000000006],[-122.17577799999997,47.734255000000005],[-122.17579999999998,47.733920000000005],[-122.17556999999998,47.73392200000001],[-122.17237999999998,47.733906000000005],[-122.17134999999999,47.733900000000006],[-122.169671,47.73391000000001],[-122.16968,47.73397000000001],[-122.16917,47.733962000000005],[-122.16717,47.73395000000001],[-122.1665,47.733956000000006],[-122.164,47.733962000000005],[-122.16402000000001,47.733450000000005],[-122.16402000000001,47.733250000000005],[-122.16403,47.733126000000006],[-122.16403,47.73302],[-122.16402000000001,47.73281000000001],[-122.16402000000001,47.732760000000006],[-122.16402000000001,47.73215000000001],[-122.16406300000001,47.730846],[-122.16407,47.73035000000001],[-122.16407,47.73021000000001],[-122.16406300000001,47.730140000000006],[-122.16404,47.730070000000005],[-122.1639,47.72999000000001],[-122.16314,47.729690000000005],[-122.16252999999999,47.729560000000006],[-122.161988,47.72952000000001],[-122.16108,47.72950000000001],[-122.16023,47.729489],[-122.15933999999999,47.729541000000005],[-122.15912,47.72953400000001],[-122.15925,47.72580000000001],[-122.15772999999999,47.72578000000001],[-122.1571,47.72577300000001],[-122.15662,47.725767000000005],[-122.15592999999998,47.72576000000001],[-122.15594999999999,47.724650000000004],[-122.15596999999998,47.723954000000006],[-122.15325,47.72392000000001],[-122.15321,47.725727000000006],[-122.15449,47.72574000000001],[-122.15467,47.72677100000001],[-122.15317999999999,47.726991000000005],[-122.15238999999998,47.727109000000006],[-122.15237799999997,47.72574000000001],[-122.15216,47.72574000000001],[-122.1495,47.725660000000005],[-122.14935,47.725660000000005],[-122.1494,47.72534000000001],[-122.14943,47.725243000000006],[-122.14958,47.724821],[-122.14986,47.723870000000005],[-122.15008999999999,47.723166000000006],[-122.150264,47.72275000000001],[-122.15042999999999,47.722260000000006],[-122.15051,47.72193000000001],[-122.15095,47.720489],[-122.15125,47.71964],[-122.15132,47.71943],[-122.15156,47.71862],[-122.15216,47.71672],[-122.15254399999999,47.715430000000005],[-122.15294999999999,47.71409],[-122.15375999999999,47.711373],[-122.15397999999999,47.71137],[-122.15416,47.711376],[-122.15426000000001,47.71138],[-122.15423,47.711465],[-122.15482999999999,47.711479999999995],[-122.15530099999998,47.711479999999995],[-122.15570999999998,47.711509],[-122.15614199999999,47.71157],[-122.15665,47.71168399999999],[-122.15714,47.711777],[-122.15738999999999,47.71181],[-122.157543,47.71183],[-122.15793,47.71185],[-122.15813999999999,47.711819999999996],[-122.15856,47.71175],[-122.15926,47.711619999999996],[-122.15984999999999,47.71154],[-122.16046999999999,47.71153],[-122.16169000000001,47.71155],[-122.16317,47.71157],[-122.16317,47.711459999999995],[-122.16322000000001,47.709832000000006],[-122.16314,47.70789],[-122.16376,47.70789],[-122.1643,47.7079],[-122.16429000000001,47.70776],[-122.16428,47.70727],[-122.16425000000001,47.706624],[-122.16424,47.70631000000001],[-122.16425000000001,47.705763000000005],[-122.16426000000001,47.705670000000005],[-122.16424,47.704130000000006],[-122.16427,47.70327],[-122.16428,47.703],[-122.16429000000001,47.70255000000001],[-122.16432,47.702000000000005],[-122.16432999999999,47.70166],[-122.16435,47.70106],[-122.16435,47.70018],[-122.16436,47.69977300000001],[-122.16436,47.69937000000001],[-122.16436,47.699020000000004],[-122.16436999999999,47.69838000000001],[-122.16441,47.697432000000006],[-122.16442,47.696909000000005],[-122.16442,47.69686],[-122.16448,47.69553000000001],[-122.16458,47.693200000000004],[-122.16468,47.69178],[-122.16472999999999,47.69014000000001],[-122.16496000000001,47.69014000000001],[-122.16498,47.68982],[-122.16498,47.689558000000005],[-122.16498,47.68946],[-122.1649,47.68887],[-122.16479,47.68811900000001],[-122.16478,47.688050000000004],[-122.16478,47.688],[-122.16471,47.68755],[-122.16469000000001,47.687419],[-122.16466000000001,47.687279999999994],[-122.16461000000001,47.68695],[-122.16447,47.686037],[-122.16436,47.685383],[-122.16426000000001,47.684748],[-122.16424,47.68459],[-122.16418,47.6842],[-122.16414,47.68397],[-122.16411000000001,47.683782],[-122.16399,47.68307],[-122.16394,47.6826],[-122.16393,47.68253000000001],[-122.163914,47.68234],[-122.16392,47.68185999999999],[-122.16392,47.68163],[-122.16391,47.68074],[-122.16391,47.68065],[-122.163919,47.67949],[-122.16392,47.678990000000006],[-122.16391,47.67721],[-122.16391,47.676725000000005],[-122.163902,47.67531900000001],[-122.16392,47.67368],[-122.16394,47.671682999999994],[-122.16395,47.67082],[-122.16396,47.67016],[-122.16396900000001,47.66964],[-122.16396999999999,47.669404],[-122.16396999999999,47.66917000000001],[-122.16396999999999,47.66891000000001],[-122.163973,47.668380000000006],[-122.16396999999999,47.66801200000001],[-122.16399,47.666650000000004],[-122.16387999999999,47.66662],[-122.16375,47.666610000000006],[-122.16375,47.666500000000006],[-122.16354,47.666500000000006],[-122.162596,47.66649],[-122.16197,47.66649],[-122.16168,47.66649],[-122.16168,47.66646],[-122.16169000000001,47.665820000000004],[-122.1617,47.66553000000001],[-122.1617,47.665470000000006],[-122.16146,47.665470000000006],[-122.16134,47.665470000000006],[-122.16122000000001,47.665470000000006],[-122.16113,47.665468000000004],[-122.16112000000001,47.665468000000004],[-122.16101,47.665467],[-122.16091,47.665467],[-122.16081,47.665470000000006],[-122.16071,47.665465000000005],[-122.16066000000001,47.665465000000005],[-122.16061,47.665464],[-122.1605,47.66546],[-122.16041,47.665462000000005],[-122.1601,47.66546],[-122.16,47.665459000000006],[-122.15991,47.66545800000001],[-122.15988999999999,47.66545800000001],[-122.15979099999998,47.66546],[-122.15969,47.665456000000006],[-122.15959,47.665456000000006],[-122.15937999999998,47.665454000000004],[-122.15932999999998,47.66545300000001],[-122.15917999999999,47.66545000000001],[-122.15907999999999,47.66545000000001],[-122.15897999999999,47.66545000000001],[-122.15892,47.66545000000001],[-122.15867999999999,47.66545000000001],[-122.15868999999999,47.66484],[-122.15870199999998,47.66431000000001],[-122.15871599999998,47.66319000000001],[-122.15871999999999,47.66268],[-122.15872999999998,47.66246],[-122.15872999999998,47.66231000000001],[-122.15874999999998,47.66067],[-122.15886999999998,47.66068],[-122.15937999999998,47.660688],[-122.16005,47.660703000000005],[-122.1638,47.660790000000006],[-122.16407,47.66078],[-122.16427,47.66064],[-122.16619,47.66062],[-122.16942,47.66058],[-122.16951,47.65711],[-122.16976,47.65712],[-122.17083999999998,47.65715],[-122.17466999999999,47.657219999999995],[-122.18021,47.657239999999994],[-122.18016999999999,47.659779],[-122.18016,47.66053000000001],[-122.18015,47.660740000000004],[-122.18015,47.660835000000006],[-122.18159,47.66088],[-122.18263999999999,47.660911000000006],[-122.18292999999998,47.660914000000005],[-122.18387999999999,47.660940000000004],[-122.18544999999999,47.660990000000005],[-122.18545999999999,47.65912],[-122.18549999999999,47.65548],[-122.18551,47.65362699999999],[-122.18542199999999,47.65362399999999],[-122.18285999999999,47.6536],[-122.18026,47.65358],[-122.18027,47.649170000000005],[-122.18022,47.646370000000005],[-122.18554999999999,47.64641],[-122.18682999999999,47.64643],[-122.18716,47.64643],[-122.18765,47.64643],[-122.19085,47.64643],[-122.19525,47.64643],[-122.19592,47.64643],[-122.19629,47.64643],[-122.19629,47.64631500000001],[-122.19629,47.645430000000005],[-122.19625,47.643758000000005],[-122.19625,47.643390000000004],[-122.19617,47.642900000000004],[-122.19628,47.642900000000004],[-122.19628,47.64288],[-122.19628,47.642809],[-122.19662000000001,47.642810000000004],[-122.19685,47.642810000000004],[-122.19703,47.642813000000004],[-122.19711000000001,47.642813000000004],[-122.19753,47.642810000000004],[-122.19753,47.642844],[-122.19806,47.642843],[-122.19846,47.642846],[-122.19846,47.642635000000006],[-122.19845,47.64242],[-122.19981,47.64242],[-122.1999,47.642500000000005],[-122.19995,47.64255000000001],[-122.2,47.6426],[-122.20004,47.64265],[-122.200196,47.642849],[-122.20048,47.64321],[-122.20060000000001,47.64334],[-122.20066200000001,47.643390000000004],[-122.20105000000001,47.643673],[-122.20128000000001,47.6438],[-122.20132000000001,47.64382],[-122.20132000000001,47.64383],[-122.20136400000001,47.643879999999996],[-122.20141000000001,47.643930000000005],[-122.20144,47.64398],[-122.20146000000001,47.644009],[-122.20148,47.64404],[-122.20154000000001,47.644151],[-122.20160000000001,47.644268],[-122.20164000000001,47.64439],[-122.20165000000001,47.64444699999999],[-122.20168000000001,47.64472],[-122.20169000000001,47.644583],[-122.20171,47.644529],[-122.201727,47.644479999999994],[-122.20175,47.64442],[-122.20179,47.64436],[-122.20184,47.6443],[-122.20188,47.644252],[-122.20193,47.644206999999994],[-122.20205,47.644098],[-122.20232999999999,47.64385],[-122.20241,47.64382],[-122.20257,47.6437],[-122.20268,47.643539000000004],[-122.20282999999999,47.643406],[-122.202947,47.64332],[-122.203041,47.643273],[-122.20320000000001,47.64321],[-122.20335,47.643170000000005],[-122.20349,47.643142000000005],[-122.20365000000001,47.64312],[-122.20401000000001,47.64312],[-122.20427000000001,47.643141],[-122.20456000000001,47.64318],[-122.20499000000001,47.643246],[-122.20542999999999,47.64331000000001],[-122.20567,47.643350000000005],[-122.20667,47.643498],[-122.20676,47.643510000000006],[-122.20699,47.643533000000005],[-122.20701000000001,47.643530000000005],[-122.20716000000002,47.64354],[-122.20757,47.64354],[-122.20777,47.64354],[-122.20837999999999,47.64349],[-122.20854,47.64348],[-122.20889,47.643433],[-122.209236,47.643369],[-122.20951000000001,47.64331000000001],[-122.20973,47.64325],[-122.20986,47.64321],[-122.21021600000002,47.643099],[-122.21091000000001,47.642830000000004],[-122.21144000000001,47.64265],[-122.21172000000001,47.64255000000001],[-122.21196000000002,47.64249],[-122.21218,47.64244],[-122.21239,47.642430000000004],[-122.21254,47.642430000000004],[-122.21266000000001,47.642430000000004],[-122.21275,47.64244],[-122.21292000000001,47.64247],[-122.21306000000001,47.642500000000005],[-122.21320000000001,47.642541],[-122.21364000000001,47.64268],[-122.21368000000001,47.64269],[-122.2137,47.642700000000005],[-122.2137,47.64273000000001],[-122.2137,47.642830000000004],[-122.2137,47.64305],[-122.21367000000001,47.644459999999995],[-122.21377,47.644459999999995],[-122.21377,47.64456],[-122.21348,47.64456],[-122.21348,47.64457],[-122.21307,47.64457],[-122.21306000000001,47.645070000000004],[-122.21306000000001,47.6452],[-122.21245,47.6452],[-122.21245,47.645485],[-122.21244,47.646102000000006],[-122.21244,47.646350000000005],[-122.21189000000001,47.64634],[-122.21189000000001,47.646358000000006],[-122.21127000000001,47.64735],[-122.21066000000002,47.648255000000006],[-122.21050000000001,47.648254],[-122.2104,47.648263],[-122.21016000000002,47.648250000000004],[-122.20998,47.648257],[-122.20982000000001,47.648270000000004],[-122.20975,47.64829],[-122.20968,47.64829],[-122.20952000000001,47.648270000000004],[-122.20935,47.64826],[-122.20916000000001,47.64824],[-122.209006,47.648250000000004],[-122.20897,47.648253000000004],[-122.2089,47.64828],[-122.20886999999999,47.64829],[-122.20884,47.64831200000001],[-122.20882,47.648320000000005],[-122.20872,47.64833000000001],[-122.20863,47.648320000000005],[-122.20857,47.64833000000001],[-122.20846,47.64837000000001],[-122.20837999999999,47.648343000000004],[-122.2083,47.64834200000001],[-122.20825,47.648360000000004],[-122.20814,47.648393000000006],[-122.20803,47.648427],[-122.20798,47.648465],[-122.20796000000001,47.648468],[-122.20791000000001,47.64846],[-122.20782000000001,47.648477],[-122.20755000000001,47.648528000000006],[-122.20752000000002,47.64855000000001],[-122.20747,47.64857000000001],[-122.2074,47.6486],[-122.20724000000001,47.64867],[-122.20715000000001,47.648692000000004],[-122.20713,47.648697],[-122.20709000000001,47.64870200000001],[-122.20706000000001,47.64871000000001],[-122.20701000000001,47.648720000000004],[-122.20696000000001,47.648740000000004],[-122.20691000000001,47.64876],[-122.20683,47.6488],[-122.2068,47.648810000000005],[-122.20674,47.648830000000004],[-122.20672,47.64884],[-122.20669000000001,47.64886],[-122.20665000000001,47.648877],[-122.20660000000001,47.648900000000005],[-122.20656000000001,47.648920000000004],[-122.20653,47.64894],[-122.2065,47.64895200000001],[-122.20646,47.648970000000006],[-122.20642000000001,47.648989],[-122.20638,47.649007],[-122.20635,47.64902],[-122.206304,47.64907],[-122.20619,47.64913000000001],[-122.206137,47.64917200000001],[-122.20609,47.649190000000004],[-122.20607,47.649210000000004],[-122.20606000000001,47.64923],[-122.20605,47.64924],[-122.20607,47.649254],[-122.20606000000001,47.64927],[-122.20603,47.64928],[-122.20599,47.649296],[-122.20597,47.64931000000001],[-122.205949,47.64931000000001],[-122.20594,47.649308000000005],[-122.20591,47.64929],[-122.20589,47.64931000000001],[-122.20589,47.649330000000006],[-122.20589,47.64935200000001],[-122.20586999999999,47.64938],[-122.20584,47.64938],[-122.2058,47.649390000000004],[-122.2058,47.6494],[-122.2058,47.64944],[-122.20579,47.64945],[-122.20577999999999,47.649479],[-122.20577999999999,47.649530000000006],[-122.20577999999999,47.64958],[-122.20577999999999,47.64964],[-122.20576999999999,47.649694],[-122.20576999999999,47.64973200000001],[-122.20576,47.64976],[-122.20576,47.64978],[-122.20576,47.649811],[-122.20575,47.64984],[-122.20575,47.649859],[-122.20573999999999,47.649874],[-122.20573999999999,47.649879999999996],[-122.20571,47.6499],[-122.20568,47.64992],[-122.20564,47.64992],[-122.20559,47.64992],[-122.20554,47.64991500000001],[-122.20552,47.64991500000001],[-122.205411,47.649910000000006],[-122.205364,47.64991200000001],[-122.20533999999999,47.649913000000005],[-122.20529,47.649916000000005],[-122.20524,47.64992],[-122.20519,47.64992],[-122.20511,47.649910000000006],[-122.205009,47.6499],[-122.20496000000001,47.649899],[-122.20491900000002,47.649901],[-122.20490000000001,47.64992],[-122.20487,47.649943],[-122.20481000000001,47.64999],[-122.20478,47.65001],[-122.20475,47.65003],[-122.20466000000002,47.65008699999999],[-122.20460000000001,47.650132000000006],[-122.20458,47.65016],[-122.20457,47.65018],[-122.20456000000001,47.6502],[-122.20454000000001,47.65023],[-122.20455000000001,47.650279999999995],[-122.20456000000001,47.650337],[-122.20456000000001,47.650389],[-122.20455000000001,47.65041],[-122.20455000000001,47.650434],[-122.20455000000001,47.650459999999995],[-122.20454000000001,47.650475],[-122.20453,47.650479999999995],[-122.20452000000002,47.65049],[-122.20454000000001,47.65063],[-122.20458,47.650635],[-122.20459000000001,47.650639],[-122.20461000000002,47.650652],[-122.20461000000002,47.650662999999994],[-122.20462000000002,47.65069],[-122.20463000000001,47.650722],[-122.20468000000001,47.65079],[-122.20473,47.65085],[-122.2048,47.650942],[-122.20482000000001,47.650983999999994],[-122.20486000000001,47.651039],[-122.204868,47.65107999999999],[-122.20488,47.6511],[-122.20490000000001,47.651123],[-122.20493,47.65114],[-122.20494000000001,47.65118],[-122.20495000000001,47.65121],[-122.20495000000001,47.65125],[-122.20495000000001,47.65127999999999],[-122.20496000000001,47.651313],[-122.20496000000001,47.651345],[-122.20499000000001,47.65139],[-122.20501,47.65141],[-122.20501,47.65143],[-122.205017,47.65145999999999],[-122.20501,47.651506],[-122.20502,47.651519],[-122.20523,47.651775],[-122.20529,47.65185999999999],[-122.20537999999999,47.651982],[-122.20537999999999,47.652],[-122.20539,47.65202],[-122.2054,47.65204],[-122.205409,47.65206],[-122.20542,47.652108000000005],[-122.20542,47.65218],[-122.20541300000001,47.65228],[-122.2054,47.652300000000004],[-122.20537999999999,47.652324],[-122.20537999999999,47.65237200000001],[-122.20539,47.65242],[-122.20539,47.65244],[-122.20537699999998,47.65244],[-122.20537699999998,47.652480999999995],[-122.20537999999999,47.65252],[-122.20544,47.652530000000006],[-122.20545,47.652547],[-122.20551,47.652547],[-122.20551,47.6526],[-122.20553,47.65262],[-122.20561000000001,47.652685],[-122.20564,47.65276],[-122.20566000000001,47.652769],[-122.20572,47.65283],[-122.20572,47.652848],[-122.20572,47.65296],[-122.205681,47.65296],[-122.20571,47.653060999999994],[-122.20572,47.6531],[-122.20573999999999,47.65318],[-122.20576,47.65325],[-122.20577999999999,47.653330000000004],[-122.20579,47.6534],[-122.2058,47.65347],[-122.2058,47.653506],[-122.20586,47.653506],[-122.20586999999999,47.653510000000004],[-122.20586999999999,47.65354],[-122.20584,47.65357],[-122.20586999999999,47.653642],[-122.2059,47.65372],[-122.20595,47.65379],[-122.20601,47.65383],[-122.20602000000001,47.653839999999995],[-122.20607,47.653839999999995],[-122.20607,47.65378],[-122.20629000000001,47.65378],[-122.20629000000001,47.653856],[-122.20625000000001,47.653859],[-122.20625000000001,47.65388299999999],[-122.20625000000001,47.653999999999996],[-122.20625000000001,47.654114],[-122.20629000000001,47.65413],[-122.20629000000001,47.65436],[-122.20618,47.65436],[-122.20617,47.65445],[-122.20616500000001,47.654489999999996],[-122.20616000000001,47.65454],[-122.20616000000001,47.654619999999994],[-122.20617,47.65467399999999],[-122.20619,47.65472],[-122.20624000000001,47.654779999999995],[-122.20631,47.654838],[-122.20638,47.654892],[-122.20642000000001,47.65493],[-122.20646,47.654959999999996],[-122.20647,47.655010000000004],[-122.20651000000001,47.655103000000004],[-122.20655000000001,47.65518],[-122.20657,47.655225],[-122.20661000000001,47.65529],[-122.20665000000001,47.655330000000006],[-122.2067,47.655367],[-122.20676900000001,47.6554],[-122.20681,47.65543],[-122.20686,47.655463],[-122.20688,47.655491],[-122.20692000000001,47.65551000000001],[-122.20700000000001,47.655570000000004],[-122.20711000000001,47.65564],[-122.20724000000001,47.655730000000005],[-122.20735,47.65582],[-122.20741000000001,47.655879999999996],[-122.20747,47.65592],[-122.20750000000001,47.65596],[-122.20758000000001,47.65605],[-122.20767000000001,47.656151],[-122.20769000000001,47.656194],[-122.20774,47.65621],[-122.2078,47.65625],[-122.20778,47.656259999999996],[-122.20775,47.65629],[-122.20778,47.65631200000001],[-122.207835,47.65635],[-122.20790000000001,47.65643],[-122.20792100000001,47.65647],[-122.20794000000001,47.65655],[-122.20795000000001,47.6566],[-122.20794000000001,47.656639999999996],[-122.20793,47.656676],[-122.20791000000001,47.656717],[-122.20799000000001,47.65673],[-122.20793,47.656819999999996],[-122.20790000000001,47.656859999999995],[-122.20789,47.65687],[-122.20790000000001,47.65691],[-122.20790000000001,47.65692],[-122.207876,47.65696],[-122.20784,47.65698],[-122.20779,47.657022],[-122.20772000000001,47.65707999999999],[-122.20764000000001,47.65716],[-122.20760000000001,47.657219999999995],[-122.20759000000001,47.65727999999999],[-122.20757,47.657379999999996],[-122.20756000000002,47.65743],[-122.20755000000001,47.657469999999996],[-122.20754000000001,47.657498],[-122.20752000000002,47.65755],[-122.20750000000001,47.65759],[-122.20747,47.657639999999994],[-122.20746000000001,47.65767999999999],[-122.20745000000001,47.65771],[-122.20745000000001,47.65772],[-122.20743900000001,47.657759999999996],[-122.20742000000001,47.657799999999995],[-122.20738,47.6579],[-122.20735,47.65797],[-122.20733,47.65804],[-122.20731,47.658094],[-122.20728000000001,47.65817500000001],[-122.20724000000001,47.65828],[-122.20720000000001,47.65842],[-122.20716000000002,47.658533000000006],[-122.20714000000001,47.6586],[-122.20711000000001,47.65865],[-122.20709000000001,47.6587],[-122.20706000000001,47.658746],[-122.20704,47.658770000000004],[-122.20701700000001,47.658770000000004],[-122.20700000000001,47.658792000000005],[-122.20697,47.658826],[-122.20695300000001,47.65889],[-122.20696000000001,47.658909],[-122.20704,47.659150000000004],[-122.20707,47.659150000000004],[-122.20709000000001,47.65916],[-122.20710700000001,47.65916],[-122.20712000000002,47.659171],[-122.20713,47.659181],[-122.20713,47.6592],[-122.20713,47.65921],[-122.20714000000001,47.65922],[-122.20717,47.65924],[-122.20719700000001,47.65925],[-122.20722000000002,47.65927],[-122.20725000000002,47.65929],[-122.20726000000002,47.659304],[-122.20728000000001,47.65932],[-122.20731,47.659344],[-122.20733,47.65937],[-122.20734,47.65938],[-122.20733,47.65941],[-122.20733,47.65943],[-122.20732000000001,47.65945],[-122.20732000000001,47.659479],[-122.20732000000001,47.65949],[-122.20731,47.6595],[-122.20728000000001,47.659510000000004],[-122.20725000000002,47.659510000000004],[-122.20721000000002,47.659510000000004],[-122.20718000000001,47.659510000000004],[-122.20716000000002,47.659510000000004],[-122.20714000000001,47.659514],[-122.20712000000002,47.659510000000004],[-122.20709000000001,47.6595],[-122.20705000000001,47.659527],[-122.20704,47.65954],[-122.20702000000001,47.659566],[-122.20700000000001,47.65959],[-122.20699,47.65961],[-122.20698,47.65963],[-122.20698,47.659639999999996],[-122.206987,47.659655],[-122.20701000000001,47.659679999999994],[-122.20702000000001,47.659698],[-122.20703,47.65972],[-122.20705000000001,47.659743],[-122.20706000000001,47.65976],[-122.20707900000001,47.65979],[-122.20710000000001,47.65981],[-122.20712000000002,47.659822],[-122.20713,47.659836],[-122.20715000000001,47.659859999999995],[-122.20716000000002,47.65987],[-122.20717,47.6599],[-122.20719000000001,47.659909],[-122.20719000000001,47.659924],[-122.20719000000001,47.65994],[-122.20717,47.65995],[-122.20716000000002,47.65997],[-122.20716000000002,47.659994],[-122.20716000000002,47.66002],[-122.20715000000001,47.660050000000005],[-122.20715000000001,47.66008],[-122.20715000000001,47.66011000000001],[-122.20714000000001,47.660140000000006],[-122.20714000000001,47.660168000000006],[-122.20714000000001,47.6602],[-122.20714000000001,47.660222000000005],[-122.20715200000001,47.66024],[-122.20716000000002,47.660270000000004],[-122.20718000000001,47.66029],[-122.20719000000001,47.660320000000006],[-122.20721000000002,47.660340000000005],[-122.20721000000002,47.66037000000001],[-122.20720000000001,47.660410000000006],[-122.20720000000001,47.660439000000004],[-122.20717,47.660450000000004],[-122.20714000000001,47.66046],[-122.20710000000001,47.660475000000005],[-122.20707,47.66049],[-122.20707,47.66051000000001],[-122.20708,47.660540000000005],[-122.207077,47.660561],[-122.20707900000001,47.660610000000005],[-122.20708,47.66066],[-122.20708,47.660688],[-122.20709000000001,47.66071000000001],[-122.20709000000001,47.66076],[-122.20709000000001,47.660810000000005],[-122.20710000000001,47.660835000000006],[-122.20712000000002,47.66088],[-122.20714000000001,47.660920000000004],[-122.20714000000001,47.660940000000004],[-122.20713,47.660970000000006],[-122.20712000000002,47.660990000000005],[-122.20712000000002,47.661014],[-122.20713,47.661100000000005],[-122.20715000000001,47.661100000000005],[-122.20716000000002,47.66111000000001],[-122.20717,47.66114],[-122.20718000000001,47.661190000000005],[-122.20720000000001,47.66124],[-122.20721000000002,47.661262],[-122.20722000000002,47.661286999999994],[-122.20722000000002,47.661308000000005],[-122.20724000000001,47.661370000000005],[-122.20725000000002,47.661390000000004],[-122.20727000000001,47.661390000000004],[-122.20729000000001,47.66144],[-122.20731,47.66149],[-122.20732000000001,47.66151800000001],[-122.20733,47.66154],[-122.20733,47.661556000000004],[-122.20734,47.661566],[-122.207336,47.66158],[-122.20733,47.661606],[-122.20733,47.66163],[-122.207336,47.66166],[-122.20734300000001,47.661680999999994],[-122.20735,47.6617],[-122.20737,47.661729],[-122.20738,47.66176],[-122.20739,47.661769],[-122.20742000000001,47.661771],[-122.20745000000001,47.661774],[-122.20746000000001,47.661783],[-122.20747,47.6618],[-122.20747,47.66183],[-122.20747,47.66185],[-122.207482,47.661901],[-122.20750000000001,47.661923],[-122.20752000000002,47.66196],[-122.20755000000001,47.662003000000006],[-122.20759000000001,47.662045000000006],[-122.20764000000001,47.66208],[-122.20767000000001,47.66214000000001],[-122.20771,47.66217100000001],[-122.20774,47.66219000000001],[-122.20776000000001,47.662214000000006],[-122.20778,47.662240000000004],[-122.207783,47.662259000000006],[-122.20779,47.662293000000005],[-122.20786000000001,47.662289],[-122.20801,47.66239200000001],[-122.20804,47.66253000000001],[-122.20808,47.662600000000005],[-122.20809,47.662620000000004],[-122.20809,47.662647],[-122.20809,47.662670000000006],[-122.20808,47.66270000000001],[-122.20808,47.66274000000001],[-122.20808,47.66283000000001],[-122.20808,47.66286],[-122.20809,47.662870000000005],[-122.208115,47.662890000000004],[-122.208143,47.66290000000001],[-122.20817,47.66291500000001],[-122.20818,47.66293000000001],[-122.20819,47.66295100000001],[-122.2082,47.66297000000001],[-122.20821000000001,47.663000000000004],[-122.20821000000001,47.663030000000006],[-122.20822000000001,47.663070000000005],[-122.20822000000001,47.66310000000001],[-122.20822000000001,47.66313000000001],[-122.20821000000001,47.663160000000005],[-122.20821000000001,47.66319000000001],[-122.20819,47.66322],[-122.20818,47.66326],[-122.2082,47.66326],[-122.2082,47.663288],[-122.2082,47.66333600000001],[-122.2082,47.66337000000001],[-122.20819,47.66344],[-122.20819,47.66346],[-122.20819,47.663590000000006],[-122.20819,47.66366],[-122.20818799999999,47.663723000000005],[-122.20814,47.663720000000005],[-122.2081,47.663720000000005],[-122.20809,47.663728000000006],[-122.20808,47.663741],[-122.20809,47.66376],[-122.20809,47.66377000000001],[-122.20818,47.663776000000006],[-122.20824,47.66378],[-122.20824,47.663823],[-122.20825,47.66388],[-122.20825,47.663920000000005],[-122.20824,47.664010000000005],[-122.20824,47.66406],[-122.20822000000001,47.66411000000001],[-122.20818,47.664117000000005],[-122.208115,47.664122000000006],[-122.20786000000001,47.66413000000001],[-122.20781000000001,47.66413000000001],[-122.20775,47.66414],[-122.20772000000001,47.664190000000005],[-122.20768000000001,47.66426],[-122.20822000000001,47.66426],[-122.20822000000001,47.664501],[-122.20765500000002,47.664500000000004],[-122.20764000000001,47.664604],[-122.20771,47.66469],[-122.20781000000001,47.664727],[-122.20790000000001,47.664729],[-122.20795000000001,47.664774],[-122.20795000000001,47.6648],[-122.20795000000001,47.66486],[-122.20794000000001,47.664950000000005],[-122.20783,47.664950000000005],[-122.20779,47.664950000000005],[-122.20777,47.664988],[-122.20775,47.665040000000005],[-122.20776000000001,47.66510000000001],[-122.207795,47.66519100000001],[-122.20779,47.66527000000001],[-122.20777,47.66535000000001],[-122.20774,47.66548],[-122.20771,47.66554000000001],[-122.20767000000001,47.665621],[-122.20765000000002,47.665666],[-122.20758000000001,47.66575000000001],[-122.20754000000001,47.665808000000006],[-122.20755000000001,47.66586],[-122.20754000000001,47.66592000000001],[-122.20751000000001,47.66597000000001],[-122.20743,47.66612000000001],[-122.20736000000001,47.666257],[-122.20733,47.666360000000005],[-122.20731,47.666491],[-122.20732000000001,47.66669],[-122.20732000000001,47.666830000000004],[-122.20827,47.666830000000004],[-122.20925000000001,47.666830000000004],[-122.20963,47.666830000000004],[-122.20963,47.667570000000005],[-122.20932,47.66756],[-122.2084,47.667530000000006],[-122.20841,47.667626],[-122.20841,47.66765],[-122.2084,47.66843000000001],[-122.20836,47.66843000000001],[-122.20788,47.668440000000004],[-122.207835,47.668440000000004],[-122.2078,47.668441],[-122.2078,47.668451000000005],[-122.20779,47.668470000000006],[-122.20777,47.668493000000005],[-122.20773,47.66851000000001],[-122.20765000000002,47.66854000000001],[-122.20759000000001,47.66857400000001],[-122.20751000000001,47.66863000000001],[-122.20743,47.66870000000001],[-122.20734300000001,47.668760000000006],[-122.20729800000001,47.66881000000001],[-122.20727000000001,47.668848000000004],[-122.20725000000002,47.66890000000001],[-122.20724000000001,47.66896200000001],[-122.20722000000002,47.66903000000001],[-122.20719000000001,47.66912000000001],[-122.20719000000001,47.669160000000005],[-122.20718000000001,47.669228000000004],[-122.20717,47.669290000000004],[-122.20716000000002,47.669380000000004],[-122.20715000000001,47.66945200000001],[-122.20715000000001,47.669520000000006],[-122.20715000000001,47.66957800000001],[-122.20714000000001,47.66961200000001],[-122.20714000000001,47.669624],[-122.20713,47.669658000000005],[-122.20712000000002,47.66968],[-122.20711000000001,47.669727],[-122.20707,47.66978],[-122.20703,47.669843],[-122.20700000000001,47.66988],[-122.20697,47.669900000000005],[-122.20692000000001,47.669970000000006],[-122.206882,47.67001500000001],[-122.20685,47.670061],[-122.20685,47.670091],[-122.20683,47.670137000000004],[-122.206804,47.670181],[-122.20676999999999,47.67022],[-122.20673,47.67026],[-122.2067,47.67028],[-122.20666000000001,47.670311000000005],[-122.20662400000002,47.670350000000006],[-122.20657,47.67038],[-122.20653,47.670410000000004],[-122.20649300000001,47.67045],[-122.20648,47.67046],[-122.206444,47.670500000000004],[-122.20643,47.67052],[-122.20636999999999,47.670590000000004],[-122.20633,47.67066],[-122.20629000000001,47.67072],[-122.20625500000001,47.670770000000005],[-122.20624000000001,47.67081],[-122.20623,47.67086],[-122.20624000000001,47.6709],[-122.20624000000001,47.67094],[-122.20621900000002,47.67099],[-122.20617,47.671039],[-122.2061,47.671110000000006],[-122.20605,47.671171],[-122.205994,47.671213],[-122.20596,47.67124],[-122.20594,47.67126699999999],[-122.20592,47.6713],[-122.205904,47.67136],[-122.2059,47.67142],[-122.20589,47.67147],[-122.20588,47.671527],[-122.2059,47.67157],[-122.20591,47.6716],[-122.20593,47.67164],[-122.20593,47.671656],[-122.20593,47.67167],[-122.20593,47.671707],[-122.20593,47.67176],[-122.20593,47.671834],[-122.20593,47.671875],[-122.20593,47.671957],[-122.20593,47.67199],[-122.20593,47.672039000000005],[-122.20594,47.672129000000005],[-122.20594,47.67215000000001],[-122.20594,47.67219000000001],[-122.20593,47.672230000000006],[-122.20593,47.672270000000005],[-122.20592,47.672346000000005],[-122.20592,47.6724],[-122.20592,47.672450000000005],[-122.20591,47.67248],[-122.20591,47.67251900000001],[-122.20591,47.672563000000004],[-122.2059,47.672601],[-122.2059,47.672637],[-122.20589,47.672650000000004],[-122.20594,47.672650000000004],[-122.20594,47.672720000000005],[-122.20594,47.672850000000004],[-122.20594,47.672871],[-122.20589,47.672872000000005],[-122.20589,47.672940000000004],[-122.20589,47.67295300000001],[-122.20588,47.67297000000001],[-122.20588,47.67302],[-122.20585,47.67302],[-122.20585,47.673030000000004],[-122.20588,47.673030000000004],[-122.20589,47.67307],[-122.2059,47.67313000000001],[-122.20593,47.67317800000001],[-122.20595,47.673230000000004],[-122.20598,47.673273],[-122.20598,47.673320000000004],[-122.20599,47.67333500000001],[-122.20599,47.67336],[-122.20602000000001,47.6734],[-122.20604,47.673437],[-122.20606000000001,47.67346],[-122.20607,47.67347],[-122.206088,47.67349],[-122.20615000000001,47.67353000000001],[-122.20618,47.673562000000004],[-122.20624000000001,47.673604],[-122.20629000000001,47.67366],[-122.20633,47.673730000000006],[-122.20638,47.6738],[-122.20641,47.67382],[-122.20642000000001,47.67384],[-122.20647,47.67385],[-122.2065,47.673857],[-122.20654,47.67386],[-122.20657,47.673863],[-122.20667,47.67385],[-122.20672,47.67385],[-122.20676,47.67385],[-122.20703,47.674433],[-122.20711000000001,47.67456],[-122.20718000000001,47.674645],[-122.20752700000001,47.67444],[-122.2077,47.674344],[-122.20774,47.674341],[-122.20776000000001,47.67434],[-122.20777,47.674352000000006],[-122.20779,47.67437],[-122.20782000000001,47.674394],[-122.20783,47.67441],[-122.20785000000001,47.674425],[-122.20787,47.67444],[-122.20790000000001,47.674459999999996],[-122.20792000000002,47.67448099999999],[-122.20792000000002,47.6745],[-122.20790000000001,47.67451500000001],[-122.20773,47.674609],[-122.20772000000001,47.67462],[-122.20769000000001,47.674659999999996],[-122.20768000000001,47.674682],[-122.20767000000001,47.674714],[-122.20767000000001,47.67476],[-122.20768000000001,47.67479],[-122.20769600000001,47.67481],[-122.2077,47.67483],[-122.2077,47.674855],[-122.207705,47.674865],[-122.20771,47.6749],[-122.2077,47.674910000000004],[-122.20769600000001,47.67493],[-122.20768000000001,47.674955000000004],[-122.20768000000001,47.67497],[-122.20768000000001,47.67498],[-122.2077,47.674997],[-122.20773799999999,47.67502],[-122.20777,47.67503500000001],[-122.20782000000001,47.67506],[-122.20783,47.67507500000001],[-122.20785000000001,47.675086],[-122.20788,47.67510000000001],[-122.20790000000001,47.67511000000001],[-122.20791000000001,47.67512000000001],[-122.20793,47.675121000000004],[-122.20795000000001,47.67512000000001],[-122.20797,47.67511000000001],[-122.20798,47.67510000000001],[-122.208,47.675090000000004],[-122.20802,47.67507500000001],[-122.20803,47.67506],[-122.20805,47.67503800000001],[-122.20806999999999,47.67502],[-122.20809,47.67501000000001],[-122.2081,47.675000000000004],[-122.20813,47.675000000000004],[-122.20815,47.675000000000004],[-122.20818,47.67501000000001],[-122.20819,47.67502],[-122.2082,47.675028000000005],[-122.20822000000001,47.675042000000005],[-122.20824,47.675050000000006],[-122.20826000000001,47.675069],[-122.20828,47.675090000000004],[-122.2083,47.67510000000001],[-122.20832,47.67511700000001],[-122.20833999999999,47.67512000000001],[-122.20839,47.67512000000001],[-122.20841,47.67512000000001],[-122.20844,47.67511000000001],[-122.20849,47.67510000000001],[-122.20866000000001,47.67506],[-122.2087,47.67506],[-122.20872,47.675050000000006],[-122.20881,47.675028000000005],[-122.20882999999999,47.67502],[-122.20893,47.67502],[-122.20896400000001,47.67503000000001],[-122.209,47.675039000000005],[-122.20903,47.675050000000006],[-122.20906000000001,47.67506],[-122.20908,47.675070000000005],[-122.20911000000001,47.675090000000004],[-122.20913,47.67510000000001],[-122.20914,47.67512000000001],[-122.20916000000001,47.675140000000006],[-122.20918,47.67515900000001],[-122.20919,47.67517000000001],[-122.20920000000001,47.67519000000001],[-122.20933,47.67522],[-122.20944,47.67533000000001],[-122.20955000000001,47.675450000000005],[-122.20968,47.675385000000006],[-122.20975,47.67549],[-122.20978,47.67553000000001],[-122.20988,47.675683],[-122.20994,47.675760000000004],[-122.20995,47.675782000000005],[-122.21002000000001,47.675850000000004],[-122.21005000000001,47.675867],[-122.21006000000001,47.675903000000005],[-122.21007,47.67595000000001],[-122.21009000000001,47.67598],[-122.21014000000001,47.676],[-122.21022000000002,47.676023],[-122.21029000000001,47.67606],[-122.21034,47.67611900000001],[-122.21039,47.676170000000006],[-122.21045000000001,47.67622],[-122.21052000000002,47.67628],[-122.210582,47.676336000000006],[-122.21060000000001,47.67636],[-122.21064000000001,47.6764],[-122.21073,47.67647],[-122.21075,47.67649],[-122.21078,47.676520000000004],[-122.21082000000001,47.67655500000001],[-122.21086000000001,47.676586],[-122.21091000000001,47.67662],[-122.21095000000001,47.67666],[-122.21100000000001,47.676700000000004],[-122.21103000000001,47.676727],[-122.21109000000001,47.67676],[-122.21113000000001,47.676790000000004],[-122.21118000000001,47.67683],[-122.21123000000001,47.676866],[-122.21125900000003,47.6769],[-122.21129000000002,47.67693200000001],[-122.21135000000001,47.67698],[-122.21136000000001,47.67699],[-122.21137,47.676995000000005],[-122.21142800000001,47.67703],[-122.21145000000001,47.67705],[-122.21151000000002,47.6771],[-122.21154000000001,47.677122000000004],[-122.21159000000002,47.677170000000004],[-122.21161000000002,47.67718],[-122.21167000000001,47.67722],[-122.21168900000002,47.67724],[-122.21174,47.67729],[-122.21176000000001,47.677310000000006],[-122.21182000000002,47.67736],[-122.211841,47.67738],[-122.21189000000001,47.677419],[-122.21191000000002,47.67743],[-122.21196000000002,47.677479999999996],[-122.21199000000001,47.677509],[-122.21203,47.677554],[-122.21206000000001,47.677585],[-122.2121,47.67762],[-122.21213,47.677659999999996],[-122.21217,47.67769],[-122.21219,47.67772],[-122.21224000000001,47.67776],[-122.21227,47.67779],[-122.2123,47.67783],[-122.21233,47.677859999999995],[-122.21236999999999,47.6779],[-122.212411,47.67794],[-122.21247,47.677988],[-122.2125,47.678019000000006],[-122.21255000000001,47.678061],[-122.212597,47.67811800000001],[-122.21263,47.678160000000005],[-122.21266000000001,47.67822],[-122.21267,47.678247],[-122.2127,47.67831000000001],[-122.21275,47.67839000000001],[-122.21276,47.678408000000005],[-122.21279,47.678450000000005],[-122.21282000000001,47.67850000000001],[-122.21287,47.678560000000004],[-122.2129,47.67859500000001],[-122.21293,47.678627],[-122.21298,47.678670000000004],[-122.212998,47.678700000000006],[-122.21303,47.67873000000001],[-122.21308,47.678790000000006],[-122.21313,47.678830000000005],[-122.21317,47.67886],[-122.21325000000002,47.67891000000001],[-122.21333,47.67895000000001],[-122.21339,47.678971000000004],[-122.21347,47.679010000000005],[-122.21352000000002,47.679030000000004],[-122.213578,47.67904],[-122.21364000000001,47.679061],[-122.2137,47.679072000000005],[-122.21375,47.679100000000005],[-122.21378,47.679124],[-122.2138,47.67915300000001],[-122.213806,47.679169],[-122.21382000000001,47.67919200000001],[-122.21383,47.67922],[-122.21382000000001,47.679300000000005],[-122.2138,47.67934],[-122.21378,47.67938],[-122.21375,47.679451],[-122.21372000000001,47.679497],[-122.21371,47.67953000000001],[-122.21371,47.67956],[-122.21371,47.679584],[-122.213716,47.67964],[-122.21375,47.679700000000004],[-122.213762,47.679730000000006],[-122.21379,47.679798000000005],[-122.21385000000001,47.67991000000001],[-122.21390600000001,47.68001],[-122.213938,47.68006],[-122.21398,47.680130000000005],[-122.214031,47.68021],[-122.21407,47.680277],[-122.21410000000002,47.680324],[-122.21412800000002,47.68038],[-122.21414000000001,47.68041],[-122.21415000000002,47.680479999999996],[-122.21418000000001,47.680541],[-122.21420000000002,47.68057],[-122.21425900000003,47.680628],[-122.21430000000001,47.680676],[-122.21437,47.680730000000004],[-122.21440000000001,47.680758000000004],[-122.21446000000002,47.6808],[-122.21452000000002,47.68085],[-122.21455000000002,47.6809],[-122.21457000000001,47.68098],[-122.21461000000002,47.681104],[-122.21463000000001,47.681182],[-122.21465000000002,47.681235],[-122.21469000000002,47.6813],[-122.21472000000001,47.681356],[-122.21475600000001,47.68141],[-122.21479000000001,47.68147],[-122.21482000000002,47.68152],[-122.21484000000001,47.68157],[-122.21487,47.68165],[-122.214882,47.6817],[-122.21492000000002,47.68180099999999],[-122.214932,47.681869999999996],[-122.21494000000001,47.6819],[-122.21496000000002,47.68199],[-122.21496000000002,47.682010000000005],[-122.21499000000001,47.68207],[-122.21503,47.68213000000001],[-122.21505,47.68215000000001],[-122.2151,47.682226],[-122.215145,47.682311000000006],[-122.21516000000001,47.682347],[-122.21524000000001,47.68245],[-122.21528,47.68251000000001],[-122.21536,47.682590000000005],[-122.21537,47.6826],[-122.2154,47.68263],[-122.21542000000001,47.68268],[-122.21545,47.68272],[-122.21545,47.68273000000001],[-122.21547199999999,47.68275200000001],[-122.21549,47.682798000000005],[-122.21549,47.68282],[-122.21551000000001,47.68282],[-122.21556000000001,47.68281],[-122.21559,47.682874],[-122.21565000000001,47.68303],[-122.21567,47.683059],[-122.21572,47.68318],[-122.21579,47.683330000000005],[-122.2158,47.683355000000006],[-122.21585,47.68347],[-122.2158,47.68348399999999],[-122.21581,47.683510000000005],[-122.21588,47.683668],[-122.21583,47.683679999999995],[-122.21585,47.68376],[-122.21588,47.68382],[-122.21588,47.683837],[-122.21589,47.68387],[-122.21592100000001,47.683913000000004],[-122.21593,47.683999],[-122.21594,47.68401],[-122.21595,47.68405],[-122.21597,47.684095],[-122.21601000000001,47.684137],[-122.21601000000001,47.68415],[-122.21604,47.684216],[-122.21604,47.68422699999999],[-122.21608,47.68429],[-122.21610000000001,47.6843],[-122.21612000000002,47.684346],[-122.21616000000002,47.6844],[-122.21618000000001,47.684432],[-122.21619000000001,47.684459999999994],[-122.21621000000002,47.6845],[-122.21622600000002,47.68455],[-122.21624200000001,47.68459],[-122.21626000000002,47.68463],[-122.21628000000001,47.68467999999999],[-122.21629100000001,47.68472],[-122.216316,47.684776],[-122.21634,47.684839999999994],[-122.21637,47.684911],[-122.21639,47.68493],[-122.21640000000001,47.684956],[-122.21643,47.68502],[-122.21647,47.685065],[-122.21648,47.685086],[-122.21652000000002,47.685137000000005],[-122.21655000000001,47.685209],[-122.21656100000001,47.68524],[-122.21657,47.685276],[-122.21659000000001,47.685309000000004],[-122.21662000000002,47.685383],[-122.21663000000001,47.6854],[-122.21665100000001,47.68546],[-122.21667000000001,47.685500000000005],[-122.2167,47.685559000000005],[-122.21672000000001,47.6856],[-122.21673,47.68565],[-122.21674,47.685700000000004],[-122.21675,47.68572],[-122.21675,47.685745000000004],[-122.21679,47.685786],[-122.2168,47.685825],[-122.2168,47.68585],[-122.21682000000001,47.685877],[-122.21683,47.68589],[-122.21686000000001,47.685930000000006],[-122.21687,47.685953000000005],[-122.21687,47.685974],[-122.21689,47.686003],[-122.21689,47.686034],[-122.21690000000001,47.68607],[-122.21691000000001,47.686110000000006],[-122.21692000000002,47.68614],[-122.21693,47.686170000000004],[-122.21695000000001,47.6862],[-122.21697,47.68622],[-122.21698,47.68623],[-122.21702000000002,47.68628],[-122.21705000000001,47.68634],[-122.21708000000001,47.686458],[-122.21710000000002,47.686530000000005],[-122.21710000000002,47.68659],[-122.21711000000002,47.68664],[-122.21713000000001,47.68669],[-122.21717000000001,47.686741],[-122.21721000000002,47.68678],[-122.21723000000001,47.68682],[-122.21725900000003,47.68687],[-122.21727000000001,47.686910000000005],[-122.21726800000002,47.686994],[-122.21726000000002,47.68709],[-122.21727000000001,47.687163],[-122.21728000000002,47.68721],[-122.21729000000002,47.687252],[-122.21731000000001,47.6873],[-122.21733,47.68735],[-122.21735000000001,47.687376],[-122.21734000000001,47.68742399999999],[-122.21734000000001,47.687472],[-122.21735300000002,47.687515000000005],[-122.21736000000001,47.687565],[-122.21738,47.687619999999995],[-122.21739000000001,47.687639],[-122.21740000000001,47.687659999999994],[-122.21741100000001,47.68767999999999],[-122.21742000000002,47.6877],[-122.21743000000001,47.68776],[-122.21745000000001,47.687799999999996],[-122.217447,47.687839999999994],[-122.21745000000001,47.68787999999999],[-122.21745000000001,47.6879],[-122.21746000000002,47.68793],[-122.21748000000001,47.68798099999999],[-122.21751000000002,47.688050000000004],[-122.21753000000001,47.688120000000005],[-122.21754000000001,47.688167],[-122.21757000000001,47.688250000000004],[-122.21759000000002,47.688331000000005],[-122.21764000000002,47.688430000000004],[-122.21767000000001,47.688469],[-122.21769000000002,47.688520000000004],[-122.21757000000001,47.688520000000004],[-122.21749000000001,47.688520000000004],[-122.217447,47.688520000000004],[-122.21747,47.6886],[-122.21749000000001,47.68865],[-122.217487,47.688686],[-122.21751000000002,47.688719000000006],[-122.21753700000001,47.688790000000004],[-122.21755000000002,47.68884],[-122.21757000000001,47.688901],[-122.21761000000002,47.689025],[-122.21762200000002,47.68911000000001],[-122.21763000000001,47.68918],[-122.21764000000002,47.68926],[-122.21764000000002,47.689370000000004],[-122.21763800000001,47.68944],[-122.21764000000002,47.689479999999996],[-122.21765000000002,47.689554],[-122.21765000000002,47.68962],[-122.21765000000002,47.68967],[-122.21765000000002,47.6897],[-122.21764000000002,47.68977],[-122.21764000000002,47.689851],[-122.21764000000002,47.689879999999995],[-122.21765000000002,47.689932000000006],[-122.21766000000002,47.69004],[-122.21766000000002,47.69008],[-122.21767000000001,47.69014000000001],[-122.21770000000001,47.69024],[-122.21771000000001,47.69033000000001],[-122.21772000000001,47.69039000000001],[-122.21773,47.690470000000005],[-122.21775000000001,47.690560000000005],[-122.21777,47.6906],[-122.21777,47.690650000000005],[-122.21777,47.690723000000006],[-122.21777,47.690763000000004],[-122.21776000000001,47.690805000000005],[-122.21777,47.69084],[-122.21779000000001,47.690891],[-122.217802,47.69095000000001],[-122.21781800000001,47.691],[-122.21784000000001,47.69104],[-122.21787,47.691096],[-122.21789500000001,47.691144],[-122.21789000000001,47.691202000000004],[-122.21788000000001,47.691230000000004],[-122.21788000000001,47.69126],[-122.21788000000001,47.69127],[-122.21788000000001,47.691323000000004],[-122.21789000000001,47.691365000000005],[-122.217892,47.691390000000006],[-122.21789000000001,47.691410000000005],[-122.21789500000001,47.691418000000006],[-122.21789000000001,47.691455000000005],[-122.21789000000001,47.69147],[-122.21789000000001,47.69151000000001],[-122.21787,47.69153000000001],[-122.21782000000002,47.691520000000004],[-122.21778,47.69153000000001],[-122.21774500000001,47.69153300000001],[-122.21771000000001,47.69155000000001],[-122.21771000000001,47.691570000000006],[-122.21770000000001,47.691582000000004],[-122.21769000000002,47.6916],[-122.21765000000002,47.69164],[-122.21760000000002,47.691666],[-122.217577,47.69167],[-122.21758000000001,47.691700000000004],[-122.21760000000002,47.69171000000001],[-122.21760000000002,47.691722000000006],[-122.21762000000003,47.691759000000005],[-122.21760000000002,47.69182],[-122.21760000000002,47.69186],[-122.21760000000002,47.691886],[-122.21759000000002,47.691900000000004],[-122.21759000000002,47.691930000000006],[-122.21757000000001,47.69200000000001],[-122.21757000000001,47.69205000000001],[-122.21756000000002,47.692080000000004],[-122.21755000000002,47.69214100000001],[-122.21754000000001,47.69218000000001],[-122.217532,47.692220000000006],[-122.21753000000001,47.692240000000005],[-122.21751000000002,47.69230000000001],[-122.21750000000002,47.69235000000001],[-122.21750000000002,47.69238500000001],[-122.21750000000002,47.69241200000001],[-122.21749000000001,47.692457000000005],[-122.21748000000001,47.692496000000006],[-122.21745000000001,47.69254000000001],[-122.21744000000001,47.692581000000004],[-122.21741000000002,47.692628000000006],[-122.21740700000001,47.692674000000004],[-122.21740000000001,47.69270900000001],[-122.21739400000001,47.69274000000001],[-122.21737,47.692800000000005],[-122.21735000000001,47.69285500000001],[-122.21733,47.69287500000001],[-122.21731000000001,47.692870000000006],[-122.21726000000002,47.692870000000006],[-122.21723000000001,47.692927000000005],[-122.21719000000002,47.69304],[-122.21728000000002,47.69304],[-122.21726200000002,47.69313000000001],[-122.21724000000002,47.693180000000005],[-122.21722300000003,47.693204],[-122.21721000000002,47.69323500000001],[-122.21718600000001,47.693290000000005],[-122.21718000000001,47.69333000000001],[-122.217172,47.693369000000004],[-122.21716900000003,47.693380000000005],[-122.21716000000002,47.693400000000004],[-122.21714000000001,47.69346],[-122.21712000000002,47.69351000000001],[-122.21711000000002,47.69353400000001],[-122.21710000000002,47.69355000000001],[-122.21707,47.6936],[-122.21706000000002,47.693658000000006],[-122.21705000000001,47.69370000000001],[-122.21704500000001,47.693720000000006],[-122.21703000000001,47.69379000000001],[-122.21700000000001,47.693841],[-122.216998,47.693850000000005],[-122.21698,47.69388],[-122.21697,47.69391000000001],[-122.21696000000001,47.693947],[-122.21694000000001,47.694004],[-122.21693,47.69402],[-122.21692000000002,47.69407],[-122.21692000000002,47.694098000000004],[-122.21690100000001,47.694120000000005],[-122.21689,47.694145000000006],[-122.21688,47.6942],[-122.21686000000001,47.69424],[-122.21685000000001,47.694250000000004],[-122.21685000000001,47.694266],[-122.21685000000001,47.69431900000001],[-122.21686000000001,47.69435000000001],[-122.21688,47.694390000000006],[-122.21689,47.69447],[-122.21692000000002,47.69453300000001],[-122.21692000000002,47.69456],[-122.21691000000001,47.694590000000005],[-122.21690000000001,47.694630000000004],[-122.21685000000001,47.694665],[-122.21683,47.69469],[-122.21681000000001,47.694700000000005],[-122.21678,47.69473000000001],[-122.21676000000001,47.69475200000001],[-122.21672000000001,47.6948],[-122.21669000000001,47.694829],[-122.21668500000001,47.69485],[-122.21667000000001,47.694883],[-122.21664300000002,47.69493000000001],[-122.21661000000002,47.694990000000004],[-122.21660000000001,47.69503000000001],[-122.21659000000001,47.69507000000001],[-122.21656000000002,47.69512000000001],[-122.21657,47.695147000000006],[-122.21656000000002,47.69520000000001],[-122.216548,47.695223000000006],[-122.21654000000001,47.69525000000001],[-122.21653,47.69529000000001],[-122.21650500000001,47.69533000000001],[-122.21647,47.69539500000001],[-122.21646000000001,47.69541600000001],[-122.21645000000001,47.695460000000004],[-122.21642600000001,47.695524000000006],[-122.21640000000001,47.69559000000001],[-122.21639,47.695600000000006],[-122.21638,47.695640000000004],[-122.21636000000001,47.69571000000001],[-122.21632300000002,47.695781000000004],[-122.21631000000001,47.69581000000001],[-122.2163,47.69586],[-122.21626000000002,47.69594000000001],[-122.21622000000002,47.69603000000001],[-122.21620000000001,47.69605500000001],[-122.21617,47.69610000000001],[-122.21611000000001,47.696214000000005],[-122.21608,47.696290000000005],[-122.21605000000001,47.69632000000001],[-122.21604,47.696343000000006],[-122.21603,47.696380000000005],[-122.21603,47.696450000000006],[-122.21602000000001,47.69650000000001],[-122.216008,47.69651800000001],[-122.21596000000001,47.696560000000005],[-122.21595,47.696580000000004],[-122.21592000000001,47.69662],[-122.21587,47.69671000000001],[-122.21584,47.6968],[-122.21581,47.696850000000005],[-122.21579,47.69689],[-122.21576999999999,47.696920000000006],[-122.21572,47.697041],[-122.21571,47.697085],[-122.2157,47.697120000000005],[-122.21567,47.6972],[-122.21565500000001,47.697230000000005],[-122.21564000000001,47.69729],[-122.21564000000001,47.69731000000001],[-122.21557,47.69736],[-122.21556000000001,47.697402000000004],[-122.21554,47.69746],[-122.21552000000001,47.697523000000004],[-122.21544,47.69767],[-122.21541,47.697720000000004],[-122.2154,47.697736000000006],[-122.21537,47.697739000000006],[-122.21521000000001,47.69773000000001],[-122.2151,47.697720000000004],[-122.21493000000001,47.69776],[-122.21483,47.6978],[-122.21469000000002,47.697874],[-122.21458000000001,47.69794],[-122.21452900000003,47.697970000000005],[-122.21448000000001,47.69801000000001],[-122.21443000000001,47.698040000000006],[-122.21434,47.698080000000004],[-122.21424000000002,47.69816000000001],[-122.21412800000002,47.698240000000006],[-122.21399100000001,47.69830700000001],[-122.21383,47.69833900000001],[-122.21372000000001,47.69834600000001],[-122.21365000000002,47.69832000000001],[-122.21364000000001,47.69832000000001],[-122.21360000000001,47.698280000000004],[-122.21359000000001,47.698240000000006],[-122.21361000000002,47.69819000000001],[-122.21365000000002,47.69816000000001],[-122.21369000000001,47.69815000000001],[-122.21374,47.69814000000001],[-122.21378,47.69815000000001],[-122.21379,47.69816000000001],[-122.21381600000001,47.69818000000001],[-122.21385000000001,47.69820000000001],[-122.21389,47.69819000000001],[-122.21395000000001,47.69816000000001],[-122.21405000000001,47.69812000000001],[-122.21409000000001,47.69807000000001],[-122.21412100000002,47.697990000000004],[-122.21412800000002,47.69793000000001],[-122.21413000000001,47.69791000000001],[-122.21407,47.69784],[-122.21400000000001,47.697810000000004],[-122.21393,47.697779000000004],[-122.21386000000001,47.697770000000006],[-122.2138,47.69782],[-122.21375,47.69788],[-122.213721,47.69795800000001],[-122.21366000000002,47.69802000000001],[-122.21360000000001,47.69802200000001],[-122.21353,47.69803200000001],[-122.21346000000001,47.69801000000001],[-122.21342000000001,47.69798],[-122.21342000000001,47.697956000000005],[-122.21346000000001,47.697917000000004],[-122.21355000000001,47.69788],[-122.21357,47.69784],[-122.21358000000001,47.697786],[-122.21361000000002,47.69768],[-122.21360000000001,47.697630000000004],[-122.21356000000002,47.697630000000004],[-122.21348,47.697655000000005],[-122.21342000000001,47.697720000000004],[-122.21334,47.697794],[-122.21325000000002,47.69785],[-122.21316000000002,47.697904],[-122.21311000000001,47.69792],[-122.21301500000001,47.697970000000005],[-122.21292000000001,47.69800600000001],[-122.21276999999999,47.698085000000006],[-122.21262000000002,47.69813600000001],[-122.21248,47.69819000000001],[-122.21238,47.69821000000001],[-122.21225000000001,47.698265000000006],[-122.21214,47.69831000000001],[-122.212,47.69838000000001],[-122.21186000000002,47.698460000000004],[-122.211746,47.69855400000001],[-122.21163000000001,47.698620000000005],[-122.21155000000002,47.69870000000001],[-122.21146000000002,47.698800000000006],[-122.21142000000002,47.698859000000006],[-122.21138,47.69893000000001],[-122.21128000000002,47.69911000000001],[-122.21125000000002,47.699166000000005],[-122.21118000000001,47.699270000000006],[-122.21110000000002,47.699377000000005],[-122.21100000000001,47.69951000000001],[-122.21091000000001,47.69965200000001],[-122.21078,47.69984],[-122.21068000000001,47.700010000000006],[-122.21063000000001,47.70008],[-122.21063000000001,47.70009],[-122.21059000000001,47.70019800000001],[-122.21055000000001,47.700258000000005],[-122.21052000000002,47.70031000000001],[-122.21050000000001,47.70037500000001],[-122.21047,47.700410000000005],[-122.21042000000001,47.70049],[-122.2104,47.70049],[-122.21041000000001,47.70088],[-122.21042000000001,47.701010000000004],[-122.21042000000001,47.70114],[-122.21043,47.7014],[-122.21043,47.701516000000005],[-122.21044,47.70166],[-122.21044,47.7018],[-122.21045000000001,47.70194],[-122.21050000000001,47.70205500000001],[-122.21058000000001,47.70217000000001],[-122.21060000000001,47.702197000000005],[-122.21064000000001,47.702239000000006],[-122.21069000000001,47.702290000000005],[-122.21074,47.70234000000001],[-122.21084,47.70243000000001],[-122.21088,47.70246],[-122.21096000000001,47.70251000000001],[-122.21107,47.70257000000001],[-122.21111000000002,47.70259000000001],[-122.21118000000001,47.702630000000006],[-122.21122000000003,47.70266],[-122.21126000000002,47.70268],[-122.21130000000001,47.70270500000001],[-122.21140000000001,47.70275600000001],[-122.21147,47.702780000000004],[-122.21151000000002,47.702801],[-122.21154000000001,47.70282],[-122.21166000000002,47.70286],[-122.21170000000001,47.70288],[-122.21178,47.70291000000001],[-122.21186000000002,47.70295000000001],[-122.21189000000001,47.702960000000004],[-122.21197000000001,47.703],[-122.21202000000001,47.703029],[-122.21204,47.703030000000005],[-122.2121,47.70306],[-122.21219,47.70309],[-122.21229000000001,47.70313000000001],[-122.21243,47.70318],[-122.21253,47.703230000000005],[-122.21267,47.703286],[-122.21282000000001,47.703340000000004],[-122.21296000000001,47.703390000000006],[-122.21307,47.70344],[-122.21313,47.70347],[-122.213175,47.70348],[-122.21322000000002,47.703494],[-122.21327000000001,47.70349],[-122.21331,47.70346],[-122.21336000000001,47.70342],[-122.21337,47.70341200000001],[-122.21339,47.7034],[-122.21342000000001,47.703390000000006],[-122.21347,47.70338],[-122.21353,47.703409],[-122.21360000000001,47.70344],[-122.21367000000001,47.70348],[-122.2137,47.703509000000004],[-122.21375,47.703520000000005],[-122.21379,47.70353000000001],[-122.21385000000001,47.703539000000006],[-122.21392000000002,47.703554000000004],[-122.21396000000001,47.703570000000006],[-122.21399000000001,47.703582000000004],[-122.21403000000001,47.70359500000001],[-122.21408000000001,47.703610000000005],[-122.21422000000003,47.70365],[-122.21431000000001,47.70368],[-122.21439400000001,47.703700000000005],[-122.21445000000001,47.70371900000001],[-122.21451000000002,47.70374],[-122.21459000000002,47.703770000000006],[-122.21468000000002,47.7038],[-122.21475000000001,47.70382],[-122.21482000000002,47.70383],[-122.214972,47.70387],[-122.21507,47.703897],[-122.21513,47.70391000000001],[-122.21522000000002,47.70393000000001],[-122.21531,47.703949],[-122.21546000000001,47.703970000000005],[-122.21558,47.703990000000005],[-122.2157,47.704010000000004],[-122.21582000000001,47.704026],[-122.21587,47.70403],[-122.21593,47.70404],[-122.21598,47.70404],[-122.216046,47.70405],[-122.21608,47.704053],[-122.21610000000001,47.704055000000004],[-122.21613,47.704057],[-122.21615000000001,47.704059],[-122.21618000000001,47.70406],[-122.21621000000002,47.70406],[-122.21624000000001,47.70406],[-122.21627000000001,47.704062],[-122.2163,47.704062],[-122.21633,47.70406],[-122.21636000000001,47.70406],[-122.21639,47.704059],[-122.21643,47.704057],[-122.21646000000001,47.704054],[-122.21649000000001,47.70405],[-122.216508,47.70405],[-122.21654000000001,47.70405],[-122.21656000000002,47.70404],[-122.21659000000001,47.70404],[-122.21664700000001,47.704024],[-122.2167,47.704010000000004],[-122.21675,47.703990000000005],[-122.21676000000001,47.703720000000004],[-122.21697,47.70379500000001],[-122.217088,47.70384],[-122.21712000000002,47.703851],[-122.21718000000001,47.70387],[-122.21726000000002,47.703900000000004],[-122.21732000000002,47.703924],[-122.21735300000002,47.703934000000004],[-122.21737,47.70394],[-122.21741000000002,47.703950000000006],[-122.21744000000001,47.70396],[-122.21745000000001,47.703969],[-122.21746000000002,47.70398],[-122.21747,47.703990000000005],[-122.21748000000001,47.704],[-122.21749000000001,47.704014],[-122.21749000000001,47.70402],[-122.21750100000001,47.70403],[-122.21752000000002,47.70405],[-122.21754000000001,47.704063],[-122.21757000000001,47.70407],[-122.21760000000002,47.70408],[-122.21767000000001,47.70408],[-122.21768700000001,47.70408],[-122.21772000000001,47.70407],[-122.21774,47.704065],[-122.21775000000001,47.704055000000004],[-122.217757,47.70405],[-122.21777,47.70404],[-122.21778,47.70403],[-122.21780000000001,47.704018000000005],[-122.21781800000001,47.704010000000004],[-122.21784000000001,47.704010000000004],[-122.21786000000002,47.704010000000004],[-122.21787,47.704011],[-122.21790000000001,47.704017],[-122.21791000000002,47.70402],[-122.21793000000001,47.70403],[-122.21795000000002,47.70404],[-122.21799000000001,47.70405],[-122.21801,47.704056],[-122.21802000000001,47.704062],[-122.21808,47.70408],[-122.21812000000001,47.704096],[-122.21814,47.704105000000006],[-122.218171,47.704114000000004],[-122.21822000000002,47.704130000000006],[-122.21826100000001,47.704141],[-122.21831,47.704156000000005],[-122.21833,47.70416],[-122.21835,47.704170000000005],[-122.21838,47.704170000000005],[-122.2184,47.70418],[-122.21845,47.704192000000006],[-122.2185,47.7042],[-122.21865000000001,47.704243],[-122.21871,47.70426],[-122.21876999999999,47.704276],[-122.2188,47.704283],[-122.21885,47.70429],[-122.21891000000001,47.7043],[-122.21897,47.70431000000001],[-122.21900000000001,47.70431000000001],[-122.21902000000001,47.70431500000001],[-122.21904,47.704316000000006],[-122.21905000000001,47.70431000000001],[-122.21908,47.70431000000001],[-122.21914000000001,47.704298],[-122.21916000000002,47.70429],[-122.21918000000001,47.70429],[-122.219198,47.704283999999994],[-122.21921000000002,47.704279],[-122.21924600000001,47.704266999999994],[-122.21926000000002,47.70426],[-122.21942000000001,47.7042],[-122.21958000000001,47.704114000000004],[-122.21986000000001,47.70403],[-122.22014,47.70396],[-122.22015,47.703976000000004],[-122.220325,47.70393800000001],[-122.22043,47.70391000000001],[-122.22054,47.703838000000005],[-122.22058,47.703812000000006],[-122.22075,47.703700000000005],[-122.22089,47.7036],[-122.22111000000001,47.703449],[-122.22129000000001,47.70332200000001],[-122.221483,47.703190000000006],[-122.22176999999999,47.703],[-122.22197,47.702870000000004],[-122.22218,47.702726000000006],[-122.22236999999998,47.702600000000004],[-122.22267,47.702400000000004],[-122.22282999999999,47.702290000000005],[-122.22305,47.70215000000001],[-122.22322000000001,47.702034000000005],[-122.22339,47.70192],[-122.22403,47.701492],[-122.22411000000001,47.70145],[-122.22428000000001,47.701350000000005],[-122.22439,47.70129],[-122.224775,47.701071],[-122.22496000000001,47.700970000000005],[-122.22521,47.70082],[-122.22547999999999,47.70067],[-122.2256,47.7006],[-122.22576,47.70051600000001],[-122.22583999999999,47.700474],[-122.225809,47.700410000000005],[-122.22577999999999,47.70037000000001],[-122.22572999999998,47.700327],[-122.22567,47.70031000000001],[-122.22564,47.700300000000006],[-122.22562500000001,47.70028],[-122.22559,47.700254],[-122.22558,47.700234],[-122.2256,47.700210000000006],[-122.2255,47.70011300000001],[-122.22552,47.70009],[-122.22556999999999,47.700038000000006],[-122.22566,47.699980000000004],[-122.22572,47.69995300000001],[-122.22585,47.699830000000006],[-122.22581,47.699670000000005],[-122.22582,47.69957000000001],[-122.22583999999999,47.69942],[-122.22583999999999,47.69935600000001],[-122.22583999999999,47.69923000000001],[-122.22583999999999,47.69913000000001],[-122.22588599999999,47.699073000000006],[-122.22592999999999,47.69905000000001],[-122.22597599999999,47.699024],[-122.22606,47.69897000000001],[-122.22615,47.69892000000001],[-122.22628,47.69888],[-122.22636,47.698856000000006],[-122.22651,47.69875100000001],[-122.22654,47.69876000000001],[-122.226608,47.698690000000006],[-122.22662000000001,47.698690000000006],[-122.22666000000001,47.69868],[-122.22668,47.69865000000001],[-122.22671,47.69863000000001],[-122.22677999999999,47.69859400000001],[-122.22682,47.69858000000001],[-122.22685,47.69857000000001],[-122.22686999999999,47.69856600000001],[-122.2269,47.69855000000001],[-122.22694,47.69851300000001],[-122.22697,47.698460000000004],[-122.22699,47.698440000000005],[-122.22704,47.69841000000001],[-122.22707,47.69839500000001],[-122.22708,47.69837000000001],[-122.22712000000001,47.69834900000001],[-122.22724600000001,47.69830500000001],[-122.22715000000001,47.69820000000001],[-122.22703,47.69825000000001],[-122.22699,47.698240000000006],[-122.22695,47.698221000000004],[-122.22692,47.69820500000001],[-122.22696,47.69818800000001],[-122.226974,47.69816000000001],[-122.22695,47.69815000000001],[-122.22696,47.69813000000001],[-122.22697,47.698110000000014],[-122.22699,47.69810000000001],[-122.22703,47.69809000000001],[-122.22707,47.698080000000004],[-122.22708,47.698060000000005],[-122.22714,47.69803500000001],[-122.22718,47.69801000000001],[-122.22719000000001,47.69800000000001],[-122.22721000000001,47.697990000000004],[-122.22723,47.697962000000004],[-122.22723,47.69794],[-122.22726000000002,47.697905000000006],[-122.227327,47.69789],[-122.22737599999999,47.69788],[-122.22742000000001,47.697873],[-122.22743,47.69786],[-122.22739,47.69785],[-122.22737,47.69785],[-122.22738,47.69784],[-122.22744,47.69784],[-122.22748,47.69783],[-122.22752000000001,47.697817],[-122.22758,47.697790000000005],[-122.22760000000001,47.697770000000006],[-122.22762000000002,47.69776],[-122.22771,47.697720000000004],[-122.22774,47.69769],[-122.2278,47.69766],[-122.22785,47.697630000000004],[-122.22788,47.69762],[-122.22789,47.6976],[-122.22797,47.69755500000001],[-122.22801,47.69753000000001],[-122.22806,47.69751000000001],[-122.22813,47.697500000000005],[-122.22818,47.697493],[-122.22823,47.697472000000005],[-122.22825,47.69746],[-122.22832,47.69746],[-122.22837999999999,47.697435000000006],[-122.22838999999999,47.697410000000005],[-122.2284,47.697390000000006],[-122.22842999999999,47.69738],[-122.22845,47.6974],[-122.22852,47.69738],[-122.228546,47.69735000000001],[-122.22852999999999,47.697320000000005],[-122.22861,47.69733000000001],[-122.22878999999999,47.69733900000001],[-122.2289,47.697340000000004],[-122.22907,47.697341],[-122.22916000000001,47.697341],[-122.22927,47.69733000000001],[-122.2294,47.697320000000005],[-122.22952000000001,47.697306000000005],[-122.22963,47.69729],[-122.22977999999999,47.69729],[-122.22984,47.697299],[-122.22994,47.69730800000001],[-122.23005,47.69729],[-122.23009,47.69729],[-122.23016000000001,47.69724],[-122.230241,47.69729],[-122.23028000000001,47.69728],[-122.2303,47.69728],[-122.23032,47.697279],[-122.23032,47.697320000000005],[-122.2304,47.69733000000001],[-122.23045,47.69733000000001],[-122.23049,47.69733000000001],[-122.23064000000001,47.69733000000001],[-122.23076999999999,47.697347],[-122.230837,47.697347],[-122.23097,47.69736],[-122.23111000000002,47.69737000000001],[-122.23116000000002,47.69737000000001],[-122.23121000000002,47.69736],[-122.23126000000002,47.697344],[-122.23131000000001,47.69735000000001],[-122.2313,47.697385000000004],[-122.2313,47.6974],[-122.23139,47.697410000000005],[-122.23146000000001,47.697427],[-122.23155000000001,47.697441],[-122.23160000000001,47.69746],[-122.23167000000001,47.697474],[-122.23189,47.697517000000005],[-122.23208,47.69755000000001],[-122.23224,47.697590000000005],[-122.23235,47.6976],[-122.232507,47.697651],[-122.23272999999999,47.69768],[-122.23288,47.69771000000001],[-122.23302000000001,47.697734000000004],[-122.23307,47.69776],[-122.23306000000001,47.69778],[-122.23315000000001,47.6978],[-122.2333,47.69784],[-122.233349,47.69786],[-122.23342000000001,47.69789],[-122.23351000000001,47.697903000000004],[-122.23363,47.697947],[-122.2337,47.697970000000005],[-122.233796,47.697989],[-122.2339,47.69803100000001],[-122.233922,47.69803200000001],[-122.23410000000001,47.69808200000001],[-122.23442000000001,47.69819000000001],[-122.23456700000001,47.69823000000001],[-122.2347,47.698257000000005],[-122.23479,47.698280000000004],[-122.23487,47.698164000000006],[-122.23515,47.698260000000005],[-122.23517,47.69827000000001],[-122.2353,47.69831000000001],[-122.235458,47.69836000000001],[-122.2354,47.698440000000005],[-122.23544,47.69845000000001],[-122.23548,47.69853000000001],[-122.23559,47.69856000000001],[-122.23562000000001,47.69856600000001],[-122.23563,47.69855300000001],[-122.23565,47.69855400000001],[-122.23563,47.69857000000001],[-122.23569,47.69859000000001],[-122.23594,47.69857000000001],[-122.236,47.698600000000006],[-122.23609,47.69863000000001],[-122.236188,47.698660000000004],[-122.23635900000001,47.69871000000001],[-122.23652000000001,47.69874000000001],[-122.23661000000001,47.69876800000001],[-122.2367,47.698814000000006],[-122.23675,47.698840000000004],[-122.236805,47.698856000000006],[-122.23688,47.69887000000001],[-122.23696000000001,47.69888],[-122.23709000000001,47.69892000000001],[-122.23727000000001,47.69895800000001],[-122.23747,47.698980000000006],[-122.23766000000002,47.69899100000001],[-122.23771,47.699000000000005],[-122.23781000000001,47.69903000000001],[-122.23789000000001,47.69905000000001],[-122.23794000000001,47.69906],[-122.23805,47.69906],[-122.23811,47.699070000000006],[-122.238189,47.69907800000001],[-122.23832999999999,47.69911000000001],[-122.23846,47.69914000000001],[-122.23853,47.69915000000001],[-122.23866000000001,47.69916500000001],[-122.238729,47.69917500000001],[-122.23882,47.699200000000005],[-122.23894,47.69924],[-122.23901000000001,47.699251000000004],[-122.23909,47.69925200000001],[-122.23917,47.699270000000006],[-122.23921000000001,47.69928],[-122.239276,47.69931000000001],[-122.23933,47.69932000000001],[-122.23939,47.69931000000001],[-122.23948,47.69932000000001],[-122.23952000000001,47.69932000000001],[-122.23956000000001,47.69934000000001],[-122.239585,47.69935600000001],[-122.23961000000001,47.69937000000001],[-122.23964400000001,47.69938200000001],[-122.23971,47.69939000000001],[-122.23982000000001,47.69939000000001],[-122.23986500000001,47.69941000000001],[-122.23985,47.699467],[-122.24004000000001,47.69950000000001],[-122.24033,47.699560000000005],[-122.24032000000001,47.699580000000005],[-122.24069000000001,47.699630000000006],[-122.24098000000001,47.699689],[-122.240982,47.69970000000001],[-122.24106000000002,47.699720000000006],[-122.24128000000002,47.699780000000004],[-122.24157000000001,47.699869],[-122.24185000000001,47.69997000000001],[-122.24232,47.700190000000006],[-122.2427,47.700303000000005],[-122.24297,47.70035000000001],[-122.24326000000002,47.70050500000001],[-122.24356000000002,47.70066],[-122.24369000000002,47.70062],[-122.24374,47.70067],[-122.24379,47.70071000000001],[-122.24387,47.70074],[-122.24391000000001,47.700770000000006],[-122.24393,47.7008],[-122.24394000000001,47.70085],[-122.24398000000001,47.700891],[-122.24402000000002,47.70092],[-122.24409000000001,47.700948000000004],[-122.24416000000002,47.70096],[-122.24421000000002,47.70098],[-122.244335,47.70106],[-122.24446000000002,47.70112],[-122.24452000000002,47.70116],[-122.24460000000002,47.70121],[-122.24465000000002,47.70128],[-122.24469000000002,47.701329],[-122.24476000000001,47.7014],[-122.24482000000002,47.70145],[-122.24486000000002,47.70149],[-122.24486000000002,47.70154],[-122.24486000000002,47.70169],[-122.24485000000001,47.701761],[-122.24480700000001,47.70184],[-122.24474000000001,47.70196],[-122.24468000000002,47.70212000000001],[-122.24464000000002,47.70228],[-122.24464000000002,47.70239000000001],[-122.24467000000001,47.702459000000005],[-122.24472000000002,47.70253000000001],[-122.24479000000001,47.70259600000001],[-122.24470000000001,47.70263800000001],[-122.24478,47.702830000000006],[-122.24487,47.70302],[-122.24494000000001,47.703199000000005],[-122.24499100000001,47.703300000000006],[-122.24504,47.7034],[-122.24514,47.70353000000001],[-122.24522000000002,47.70366],[-122.24517,47.703677],[-122.24524000000001,47.70383],[-122.24537,47.70393500000001],[-122.24542000000001,47.70398],[-122.2455,47.704053],[-122.245558,47.70411000000001],[-122.24561000000001,47.70418],[-122.24575,47.70438],[-122.24589,47.70454],[-122.24600000000001,47.704663999999994],[-122.24605000000001,47.704705000000004],[-122.24611000000002,47.70479],[-122.24615000000001,47.70487],[-122.24618000000001,47.704893],[-122.24617,47.704917],[-122.24627100000001,47.70499],[-122.24636000000001,47.705059000000006],[-122.24637,47.70510000000001],[-122.24640000000001,47.70514300000001],[-122.24645000000001,47.70517000000001],[-122.24653,47.705207],[-122.24679,47.70535000000001],[-122.24683,47.705380000000005],[-122.24700000000001,47.70545200000001],[-122.24715000000002,47.70552000000001],[-122.24723000000002,47.70559000000001],[-122.24741000000002,47.70559000000001],[-122.24754000000001,47.705740000000006],[-122.24757000000001,47.705780000000004],[-122.24774000000001,47.705886],[-122.24793000000001,47.706019000000005],[-122.24810000000001,47.706120000000006],[-122.24829900000002,47.706278000000005],[-122.248376,47.706320000000005],[-122.24847,47.706430000000005],[-122.24868000000001,47.706615000000006],[-122.24876,47.706714000000005],[-122.24878,47.706790000000005],[-122.24885,47.70682],[-122.24889,47.706810000000004],[-122.2489,47.706837],[-122.24888,47.70684],[-122.24884,47.706841],[-122.24884,47.706889],[-122.24889,47.706900000000005],[-122.24899,47.707099],[-122.24901000000001,47.707150000000006],[-122.24904000000001,47.70717500000001],[-122.24914000000001,47.70747],[-122.24918000000001,47.70764],[-122.24919000000001,47.707659],[-122.24921000000002,47.70769],[-122.24927000000001,47.70774],[-122.249331,47.70776],[-122.24948,47.70781],[-122.24962000000002,47.70786],[-122.24980000000001,47.7079],[-122.24993,47.707963],[-122.25006,47.70803000000001],[-122.25021000000001,47.708041],[-122.25035,47.70803900000001],[-122.25059,47.708020000000005],[-122.25079,47.70805000000001],[-122.25092000000001,47.708144000000004],[-122.25101000000001,47.708290000000005],[-122.25183,47.70933000000001],[-122.25196700000001,47.70961500000001],[-122.25216999999999,47.709998000000006],[-122.25261,47.710223],[-122.25304,47.71051200000001],[-122.25305,47.710530000000006],[-122.25312000000001,47.71063],[-122.253151,47.71067],[-122.25327,47.710770000000004],[-122.25336999999999,47.71082],[-122.25339,47.71085],[-122.2534,47.710879999999996],[-122.25348,47.71094],[-122.25347,47.71096],[-122.25347,47.710986],[-122.25353,47.71104],[-122.25371,47.711216],[-122.2537,47.71124],[-122.25366000000001,47.711279999999995],[-122.25367,47.71129],[-122.25371,47.71132],[-122.25376,47.711330000000004],[-122.25382,47.711330000000004],[-122.25386999999999,47.71136],[-122.25396,47.711420999999994],[-122.25392000000001,47.711439999999996],[-122.25391,47.71146399999999],[-122.25394,47.711479999999995],[-122.25404,47.711510000000004],[-122.25406000000001,47.711518000000005],[-122.254084,47.71155],[-122.25419000000001,47.711479999999995],[-122.25427,47.71158],[-122.25448,47.711723],[-122.2547,47.711839999999995],[-122.254682,47.711858],[-122.25475,47.711853],[-122.25477,47.711859999999994],[-122.2548,47.71186899999999],[-122.25484,47.711879999999994],[-122.25486000000001,47.71189],[-122.25491000000001,47.71194],[-122.25494,47.71198],[-122.25496000000001,47.71201000000001],[-122.25496000000001,47.712029],[-122.25502,47.71210000000001],[-122.255126,47.712202000000005],[-122.25519,47.71228],[-122.25524,47.71235000000001],[-122.25529999999999,47.712381],[-122.25532999999999,47.712430000000005],[-122.25536,47.71248],[-122.25556999999999,47.71266],[-122.25574999999999,47.71284],[-122.25599,47.713026],[-122.25602,47.71309],[-122.25607,47.71313000000001],[-122.25608,47.713170000000005],[-122.25612000000001,47.71322],[-122.25617,47.713288],[-122.25619,47.71331000000001],[-122.25636999999999,47.71348],[-122.25641,47.713530000000006],[-122.25645,47.71356],[-122.25667,47.71368699999999],[-122.257,47.71386],[-122.25707,47.71389],[-122.25712000000001,47.713910000000006],[-122.25717900000001,47.71396],[-122.25719000000001,47.71398],[-122.25719000000001,47.714],[-122.25726000000002,47.71404],[-122.25733,47.714079999999996],[-122.25738,47.7141],[-122.25741900000001,47.714130000000004],[-122.25753,47.71428099999999],[-122.25754,47.7143],[-122.25763,47.71432],[-122.25766000000002,47.71435],[-122.25768000000001,47.7144],[-122.25775,47.714459999999995],[-122.25777,47.714479999999995],[-122.25784,47.71452],[-122.25790300000001,47.71458],[-122.25791000000001,47.71462],[-122.25797,47.714659999999995],[-122.25805,47.714729],[-122.25804,47.714802],[-122.25802999999999,47.71487],[-122.25813,47.71497],[-122.25822000000001,47.71496],[-122.258282,47.715061],[-122.25821,47.715090000000004],[-122.258192,47.715140000000005],[-122.2582,47.715147],[-122.25823,47.715180000000004],[-122.25825,47.715270000000004],[-122.25822000000001,47.715291],[-122.25822000000001,47.715300000000006],[-122.25824,47.715329000000004],[-122.25828,47.71537000000001],[-122.25832,47.7154],[-122.25835,47.7154],[-122.25837999999999,47.715404],[-122.2584,47.715430000000005],[-122.2584,47.71546],[-122.2584,47.71548],[-122.25836999999999,47.715506000000005],[-122.25836,47.71553000000001],[-122.258359,47.7156],[-122.25836,47.71567],[-122.25836999999999,47.715700000000005],[-122.25836999999999,47.71571000000001],[-122.2584,47.71575000000001],[-122.25842999999999,47.71582],[-122.25838999999999,47.71582],[-122.25841,47.71585],[-122.25841,47.71586],[-122.2585,47.715852000000005],[-122.258543,47.71591000000001],[-122.25856,47.71594],[-122.25856999999999,47.715979000000004],[-122.25856,47.71603],[-122.25856999999999,47.71605],[-122.25858,47.71608],[-122.25859,47.716100000000004],[-122.2586,47.716108000000006],[-122.25862000000001,47.716120000000004],[-122.258635,47.71613000000001],[-122.25865,47.71613000000001],[-122.25867,47.716141],[-122.25869,47.716147],[-122.25872,47.71615500000001],[-122.25874999999999,47.716170000000005],[-122.25876999999998,47.716189],[-122.25878999999999,47.716210000000004],[-122.25882,47.716282],[-122.25881,47.71634],[-122.258815,47.71638],[-122.25881,47.716390000000004],[-122.2588,47.71649],[-122.25877999999999,47.71651000000001],[-122.25876999999998,47.716530000000006],[-122.25873999999999,47.716550000000005],[-122.25871,47.71658],[-122.25869,47.7166],[-122.25866,47.71661],[-122.25864,47.71661],[-122.25863,47.71662],[-122.25862000000001,47.716629],[-122.25862000000001,47.71664],[-122.25863,47.71665],[-122.25863,47.71667],[-122.25863,47.71668],[-122.25864,47.71669],[-122.25865,47.716705000000005],[-122.25867,47.716707],[-122.25871,47.716705000000005],[-122.25872999999999,47.716746],[-122.25873999999999,47.716770000000004],[-122.25873999999999,47.716802],[-122.25876999999998,47.71697],[-122.25876,47.71699],[-122.25876999999998,47.71703],[-122.25876999999998,47.71705],[-122.25877999999999,47.71705],[-122.25877999999999,47.71707],[-122.25878999999999,47.717099],[-122.25878999999999,47.71711200000001],[-122.25878999999999,47.717147],[-122.2588,47.71721],[-122.25846999999999,47.71725],[-122.25849,47.71738],[-122.25858,47.71737],[-122.25856,47.717405],[-122.25856,47.71742],[-122.25856,47.717439999999996],[-122.25856999999999,47.71747],[-122.25859,47.717530000000004],[-122.25861,47.717577],[-122.25861,47.717588],[-122.25861,47.71761],[-122.25863,47.717639999999996],[-122.25864,47.717659999999995],[-122.25867,47.717679999999994],[-122.25868,47.71769],[-122.25869,47.717703],[-122.25869,47.717712000000006],[-122.25869999999999,47.71772],[-122.25869999999999,47.71774],[-122.25871,47.717763],[-122.25872,47.71778],[-122.25872999999999,47.717793],[-122.25873999999999,47.717815],[-122.25872999999999,47.717833],[-122.25872,47.71785],[-122.25872,47.71787],[-122.25876999999998,47.717859999999995],[-122.25876,47.71787],[-122.25876,47.71788599999999],[-122.25876999999998,47.7179],[-122.25878999999999,47.7179],[-122.258811,47.71791],[-122.25882999999999,47.71792],[-122.25882999999999,47.717929],[-122.25883999999999,47.71794],[-122.25883999999999,47.71796],[-122.25883999999999,47.71797],[-122.25883999999999,47.71799],[-122.25883999999999,47.718],[-122.25882999999999,47.71801000000001],[-122.25882999999999,47.718030000000006],[-122.25882999999999,47.718043],[-122.25883999999999,47.71806],[-122.25883999999999,47.718070000000004],[-122.25885,47.71808],[-122.25886,47.718097],[-122.25886999999999,47.71811000000001],[-122.25889,47.718179000000006],[-122.25889,47.71819000000001],[-122.25889,47.718210000000006],[-122.25889,47.718221],[-122.25889,47.71823500000001],[-122.25889,47.718250000000005],[-122.2589,47.718270000000004],[-122.25891,47.71828],[-122.25894799999999,47.71833000000001],[-122.25895,47.718340000000005],[-122.25894,47.71835000000001],[-122.25892999999999,47.718368000000005],[-122.25892999999999,47.71838],[-122.25894,47.718396000000006],[-122.25895,47.718413000000005],[-122.25896999999999,47.718444],[-122.25898,47.71848],[-122.25901,47.718491],[-122.25902,47.71853000000001],[-122.25905,47.718574000000004],[-122.25907,47.7186],[-122.25908,47.718610000000005],[-122.25908,47.71862],[-122.25909,47.718630000000005],[-122.259091,47.71864],[-122.25909,47.71866],[-122.25911,47.718671],[-122.25913,47.71868],[-122.25914,47.71869],[-122.25915,47.718699],[-122.259161,47.71871000000001],[-122.25917,47.718720000000005],[-122.25918,47.71875000000001],[-122.25918,47.71876],[-122.25919,47.718770000000006],[-122.25919,47.718790000000006],[-122.25921000000001,47.71885],[-122.2591,47.71886],[-122.25911,47.71891000000001],[-122.25912000000001,47.71894],[-122.259132,47.71907],[-122.25913,47.71911000000001],[-122.259136,47.719141],[-122.259128,47.719228],[-122.25912000000001,47.71924],[-122.25909,47.71926],[-122.25907,47.71927],[-122.25907099999999,47.71928],[-122.25907,47.719307],[-122.259074,47.71933000000001],[-122.25912000000001,47.719404],[-122.25915,47.719448],[-122.259181,47.719485],[-122.25921000000001,47.71952],[-122.25922000000001,47.71953800000001],[-122.25925000000001,47.719550000000005],[-122.25927,47.719550000000005],[-122.259296,47.719569],[-122.25931,47.719590000000004],[-122.25935,47.71963],[-122.2594,47.71967],[-122.25944,47.719711000000004],[-122.25946,47.719730000000006],[-122.25949,47.71975200000001],[-122.259566,47.71979],[-122.25969,47.719860999999995],[-122.25976,47.71989],[-122.2599,47.71996],[-122.26002000000001,47.720000000000006],[-122.26011000000001,47.720027],[-122.26021000000001,47.72007000000001],[-122.26028000000001,47.72012900000001],[-122.2603,47.720183000000006],[-122.26034,47.720223000000004],[-122.2604,47.72026],[-122.26046400000001,47.72031000000001],[-122.26049,47.72034000000001],[-122.26054,47.72034000000001],[-122.26059000000001,47.72039200000001],[-122.26061000000001,47.720420000000004],[-122.26064000000001,47.720470000000006],[-122.26071,47.72064],[-122.26075,47.72073000000001],[-122.26077,47.72082],[-122.26086000000001,47.72093000000001],[-122.26092000000001,47.721000000000004],[-122.26099,47.72124],[-122.26101000000001,47.721340000000005],[-122.26095000000001,47.72149],[-122.26095000000001,47.721520000000005],[-122.26095000000001,47.72155600000001],[-122.26104000000001,47.721747],[-122.26117,47.72189],[-122.26116000000002,47.721920000000004],[-122.26117,47.72202000000001],[-122.26120000000002,47.72207900000001],[-122.26126000000002,47.72217300000001],[-122.26127000000001,47.722240000000006],[-122.26131000000001,47.72239300000001],[-122.26140400000001,47.72254000000001],[-122.261548,47.722681],[-122.26168000000001,47.722681],[-122.26165000000002,47.722820000000006],[-122.26159400000002,47.72285000000001],[-122.26150400000002,47.72289000000001],[-122.26150000000001,47.723020000000005],[-122.26149000000001,47.723060000000004],[-122.26145000000001,47.72319000000001],[-122.26146000000001,47.72327000000001],[-122.26141300000002,47.72327000000001],[-122.26135000000001,47.72330200000001],[-122.26129000000002,47.72336000000001],[-122.26116000000002,47.723490000000005],[-122.26102000000002,47.72366],[-122.26094,47.72377000000001],[-122.26088,47.723864],[-122.260798,47.72397000000001],[-122.26074,47.724213000000006],[-122.26060500000001,47.724472000000006],[-122.26066000000002,47.724472000000006],[-122.26061800000001,47.724590000000006],[-122.26061000000001,47.724740000000004],[-122.26060000000001,47.724740000000004],[-122.26060000000001,47.72481200000001],[-122.26059000000001,47.724899],[-122.26061000000001,47.72496],[-122.26078,47.725130000000014],[-122.26095000000001,47.725310000000015],[-122.26101000000001,47.725310000000015],[-122.26101000000001,47.72537000000001],[-122.261188,47.725510000000014],[-122.26128000000001,47.72558000000001],[-122.26136000000001,47.72564200000001],[-122.26140000000001,47.72567000000001],[-122.26153000000001,47.72567000000001],[-122.26154500000001,47.72569000000001],[-122.2617,47.72587000000001],[-122.26172000000001,47.725880000000004],[-122.26175,47.72592000000001],[-122.261774,47.72595000000001],[-122.26182000000001,47.72595000000001],[-122.26189000000001,47.726040000000005],[-122.26196000000002,47.72615000000001],[-122.26196700000001,47.72617000000001]]]},"name":"Kirkland"},{"boundary":{"type":"Polygon","coordinates":[[[-122.09951000000001,47.593025000000004],[-122.099381,47.59667],[-122.09859,47.599443],[-122.09653,47.60231000000001],[-122.09608,47.602851],[-122.09272999999999,47.60664],[-122.09106000000001,47.608340000000005],[-122.09078,47.60864],[-122.08899,47.610459999999996],[-122.08824,47.61122399999999],[-122.08197,47.61747999999999],[-122.08096,47.61842],[-122.07972999999998,47.621057],[-122.07896,47.62471000000001],[-122.07922,47.62753000000001],[-122.07966,47.630539000000006],[-122.07974999999999,47.631104],[-122.08068,47.63371000000001],[-122.08267,47.635878000000005],[-122.08562,47.63789],[-122.08798,47.639506000000004],[-122.091344,47.64267],[-122.09349,47.64511000000001],[-122.09588,47.64767],[-122.09633199999999,47.64867],[-122.09687,47.649874],[-122.09725000000002,47.650710000000004],[-122.09751000000001,47.651889999999995],[-122.09404,47.652981],[-122.09319,47.65324699999999],[-122.0931,47.65327],[-122.09203,47.65361],[-122.092,47.65362],[-122.09187,47.653659999999995],[-122.09160000000001,47.65375],[-122.09139,47.653816],[-122.09109000000001,47.65391],[-122.091147,47.653986999999994],[-122.09123000000001,47.654114],[-122.09104,47.65417],[-122.09087,47.65424599999999],[-122.09075,47.654319],[-122.0907,47.654363999999994],[-122.09061000000001,47.65447999999999],[-122.09046000000001,47.65472],[-122.09022000000002,47.65514],[-122.08991,47.65564],[-122.08958,47.656079999999996],[-122.08936,47.656531],[-122.08925,47.656672],[-122.08912000000001,47.65683],[-122.08902,47.656917],[-122.08891,47.656977],[-122.08873999999999,47.657058],[-122.08847999999999,47.657199999999996],[-122.08816,47.657489999999996],[-122.08812,47.65748099999999],[-122.08755000000001,47.65740699999999],[-122.08725000000001,47.65737],[-122.08664,47.65727699999999],[-122.08592,47.65714],[-122.08459,47.65685],[-122.08469000000001,47.65647],[-122.08471,47.656345],[-122.0844,47.65637],[-122.08434,47.65638],[-122.08426000000001,47.65638],[-122.08418,47.656368],[-122.08403,47.656330000000004],[-122.08389,47.656279999999995],[-122.08382,47.65624],[-122.08365,47.65612],[-122.082319,47.6549],[-122.0819,47.65447999999999],[-122.08160000000001,47.654219999999995],[-122.08063,47.653496],[-122.08024,47.653259999999996],[-122.08021000000001,47.653233],[-122.08009,47.65318],[-122.07992999999999,47.653119000000004],[-122.07977999999999,47.653079],[-122.07956,47.653033],[-122.07941,47.653016],[-122.07928,47.65301],[-122.07883999999999,47.653],[-122.078859,47.649381],[-122.07746,47.649370000000005],[-122.07441,47.64934],[-122.07135,47.649330000000006],[-122.06737,47.64932],[-122.066596,47.64932],[-122.06648,47.64932],[-122.06613,47.64932],[-122.06621000000001,47.64942],[-122.06622000000002,47.649474],[-122.06633,47.64956],[-122.066411,47.64958],[-122.06644,47.64962],[-122.06646500000001,47.64967],[-122.06644,47.64973500000001],[-122.06649,47.64985],[-122.06653,47.649879999999996],[-122.06642000000001,47.649910000000006],[-122.06623,47.64997],[-122.0663,47.650130000000004],[-122.06636,47.650256],[-122.06636999999999,47.650279999999995],[-122.06645,47.650478],[-122.06622000000002,47.650478],[-122.06620000000001,47.650596],[-122.06616000000001,47.65058],[-122.06609,47.65045],[-122.066,47.65032],[-122.0658,47.650279999999995],[-122.06566000000001,47.65029],[-122.06532,47.650310000000005],[-122.06515,47.650549],[-122.06511,47.65057],[-122.06489,47.65072],[-122.06474,47.65072],[-122.06461000000002,47.650635],[-122.06439900000001,47.6502],[-122.06423000000001,47.649957],[-122.06426000000002,47.64979],[-122.06431300000001,47.64966],[-122.06432000000001,47.64951000000001],[-122.06450000000001,47.64932],[-122.05582,47.649299],[-122.05577999999998,47.649170000000005],[-122.05574999999999,47.649077],[-122.05576999999998,47.6486],[-122.05577599999998,47.648557000000004],[-122.05604,47.64691200000001],[-122.05612,47.64646],[-122.05658,47.644639999999995],[-122.056585,47.644495],[-122.05659,47.6443],[-122.05657699999999,47.64423],[-122.05655,47.644130000000004],[-122.0565,47.644017],[-122.05646,47.64393200000001],[-122.05641,47.64385],[-122.05622000000001,47.643631],[-122.05611,47.643478],[-122.05586999999998,47.64314],[-122.05575999999999,47.642981],[-122.05563,47.642790000000005],[-122.055596,47.64271900000001],[-122.05542999999999,47.642430000000004],[-122.05536,47.64229],[-122.05525,47.64209],[-122.05404,47.64209],[-122.05177599999999,47.64209],[-122.05177099999999,47.64092],[-122.04988,47.64092],[-122.04766000000002,47.638461],[-122.03359,47.638470000000005],[-122.03005,47.63848],[-122.02918,47.638490000000004],[-122.02738,47.63850000000001],[-122.02376,47.63851000000001],[-122.0235,47.63851400000001],[-122.020463,47.63853000000001],[-122.02047999999999,47.63949],[-122.01961000000001,47.63937000000001],[-122.01915000000001,47.63937000000001],[-122.01914000000001,47.63853000000001],[-122.01811000000001,47.63853900000001],[-122.01759000000001,47.638540000000006],[-122.01722000000002,47.638540000000006],[-122.01665000000001,47.638540000000006],[-122.01561000000001,47.638554000000006],[-122.01365000000001,47.63855900000001],[-122.01365000000001,47.63830000000001],[-122.01367,47.63798],[-122.00831,47.63758],[-122.00836,47.6349],[-122.00836999999999,47.634190000000004],[-122.00836999999999,47.633900000000004],[-122.00836,47.63387],[-122.00833999999999,47.63336],[-122.00832999999999,47.632780000000004],[-122.00775,47.63273000000001],[-122.00769000000001,47.63311000000001],[-122.00711000000001,47.63308],[-122.00706000000001,47.63304],[-122.00692000000001,47.632960000000004],[-122.00685,47.63291600000001],[-122.00661000000001,47.632690000000004],[-122.00632999999999,47.632540000000006],[-122.00618,47.63232300000001],[-122.00609,47.63224],[-122.00611,47.631927],[-122.00613,47.631875],[-122.00619,47.631721],[-122.00625000000001,47.63138],[-122.006325,47.631361],[-122.0064,47.631322000000004],[-122.00655,47.6314],[-122.006862,47.631354],[-122.00699,47.631279],[-122.007,47.630893],[-122.00435,47.630711000000005],[-122.00296999999999,47.630632000000006],[-122.00296999999999,47.626982000000005],[-122.00438,47.627075000000005],[-122.00497,47.627114000000006],[-122.00506,47.627120000000005],[-122.00573599999998,47.62717000000001],[-122.00581,47.627171000000004],[-122.0064,47.627210000000005],[-122.00669,47.627230000000004],[-122.00707,47.627257],[-122.00710000000001,47.627258000000005],[-122.0077,47.627297],[-122.00773,47.627299],[-122.00776,47.627300000000005],[-122.00842,47.627340000000004],[-122.00901,47.627382000000004],[-122.00911,47.627390000000005],[-122.00921000000001,47.6274],[-122.00977999999999,47.627430000000004],[-122.01018,47.62746],[-122.01053,47.62748],[-122.01108,47.627520000000004],[-122.01110000000001,47.627520000000004],[-122.01127000000001,47.62753000000001],[-122.01176000000001,47.62756],[-122.01242300000001,47.627610000000004],[-122.01309,47.627649],[-122.0137,47.62769],[-122.01375,47.62769],[-122.01387,47.62769],[-122.01387,47.62765],[-122.01387,47.62679000000001],[-122.013871,47.625870000000006],[-122.01387,47.62534000000001],[-122.013868,47.624050000000004],[-122.01656400000002,47.624002000000004],[-122.01658,47.62535000000001],[-122.01656000000001,47.625840000000004],[-122.01701000000001,47.62583000000001],[-122.021275,47.62577800000001],[-122.02128,47.62211000000001],[-122.02114900000001,47.62211000000001],[-122.01549,47.62220000000001],[-122.01516000000001,47.62220000000001],[-122.01387,47.622223000000005],[-122.01386000000001,47.62113000000001],[-122.01386000000001,47.61952],[-122.01386000000001,47.61851000000001],[-122.01386000000001,47.617193],[-122.013867,47.616726],[-122.01389,47.61645],[-122.0139,47.61609],[-122.01391000000001,47.61585],[-122.013917,47.615010000000005],[-122.01391000000001,47.61461],[-122.01388,47.61405],[-122.01387,47.61363],[-122.013875,47.61322],[-122.01388,47.61306],[-122.01388,47.612970000000004],[-122.0113,47.612826],[-122.010821,47.6128],[-122.01024000000001,47.612770000000005],[-122.0067,47.612590000000004],[-122.00529999999999,47.61252],[-122.00336999999999,47.612423],[-122.00189,47.612350000000006],[-122.00088,47.612299],[-121.998242,47.612167],[-121.99762000000003,47.612140000000004],[-121.99726000000003,47.61212200000001],[-121.99713000000001,47.61215000000001],[-121.99705000000002,47.612170000000006],[-121.996987,47.612190000000005],[-121.99691000000001,47.6122],[-121.99683,47.612210000000005],[-121.99673,47.612230000000004],[-121.9967,47.612230000000004],[-121.99667400000001,47.61294],[-121.99565000000001,47.61289],[-121.99210000000001,47.61272],[-121.99211000000001,47.612120000000004],[-121.99212000000001,47.61194],[-121.99220000000001,47.60828],[-121.995438,47.608288],[-121.99542000000001,47.609076],[-121.99561000000001,47.609089],[-121.99750000000002,47.60922],[-121.99748000000001,47.61032],[-122.00134,47.61049],[-122.00243999999999,47.609950000000005],[-122.00278999999999,47.609826],[-122.00316000000001,47.60971000000001],[-122.00354,47.60964],[-122.00462000000002,47.609493],[-122.00561,47.60654],[-122.00450000000001,47.60549],[-122.00455000000001,47.605286],[-122.00410000000001,47.60474],[-122.00397,47.60438],[-122.00351,47.60401],[-122.00349,47.60392],[-122.00446000000001,47.60396],[-122.00448,47.60389],[-122.00456000000001,47.603719000000005],[-122.00460000000001,47.6036],[-122.00461000000001,47.603453],[-122.00460000000001,47.603366],[-122.00409,47.603190000000005],[-122.00402000000001,47.60149],[-122.00454,47.6015],[-122.00453,47.60136],[-122.00447,47.6012],[-122.004355,47.60105],[-122.00433,47.60103],[-122.00422000000002,47.600930000000005],[-122.00404,47.6008],[-122.00395,47.600688],[-122.00386999999999,47.60058],[-122.00383,47.60045],[-122.00381,47.60031000000001],[-122.00382,47.60028],[-122.00342,47.599990000000005],[-122.00345,47.599410000000006],[-122.00282999999999,47.59873000000001],[-121.99344,47.59861300000001],[-121.99238,47.598600000000005],[-121.99235,47.60136],[-121.98865,47.601330000000004],[-121.98698,47.601310000000005],[-121.98255,47.60127],[-121.97978499999999,47.601265],[-121.975964,47.60119],[-121.97468,47.601174],[-121.97167,47.60114],[-121.97139,47.60114],[-121.97066000000001,47.60114],[-121.97067,47.600348000000004],[-121.97068,47.60023],[-121.97076999999999,47.594758000000006],[-121.97076999999999,47.594546],[-121.97068,47.594546],[-121.97013,47.594550000000005],[-121.96992000000002,47.593329000000004],[-121.96987,47.592483],[-121.96923000000001,47.591726],[-121.96902000000001,47.59111300000001],[-121.96861000000001,47.59011000000001],[-121.96787,47.589513000000004],[-121.96752000000002,47.58902],[-121.96725000000002,47.5888],[-121.96715000000002,47.588519000000005],[-121.96664000000001,47.588170000000005],[-121.96658000000001,47.588150000000006],[-121.96562000000002,47.58791],[-121.96552000000001,47.58791],[-121.96458000000001,47.587559999999996],[-121.96522000000002,47.587179],[-121.965272,47.58711],[-121.96547,47.586832],[-121.96565000000001,47.586565],[-121.96524000000001,47.585307],[-121.96522400000002,47.58481999999999],[-121.96522000000002,47.584649999999996],[-121.96533,47.584669999999996],[-121.96548,47.584695999999994],[-121.96562000000002,47.58471],[-121.96587,47.58472],[-121.96592000000001,47.58472],[-121.96614000000001,47.584711],[-121.96698,47.584599999999995],[-121.96713000000001,47.584419999999994],[-121.96722000000003,47.58427399999999],[-121.96721000000002,47.58411],[-121.96718000000001,47.58403],[-121.96728700000001,47.583932000000004],[-121.96736000000001,47.5838],[-121.96737,47.58374],[-121.96746000000002,47.58359],[-121.96773,47.583582],[-121.96796000000002,47.58365],[-121.96821000000001,47.58367],[-121.96843,47.58357],[-121.96856000000001,47.583317],[-121.96849,47.583186],[-121.96838,47.58305],[-121.9683,47.583013],[-121.96826000000001,47.582978000000004],[-121.96831,47.58287],[-121.96809,47.5826],[-121.96826000000001,47.582501],[-121.96838,47.5825],[-121.96862000000002,47.582417],[-121.9688,47.582370000000004],[-121.96917,47.582273],[-121.96936000000001,47.582066],[-121.96933,47.581768],[-121.96926000000002,47.581619999999994],[-121.96875,47.58147999999999],[-121.96866000000001,47.58135],[-121.96848,47.58107999999999],[-121.96854,47.58083],[-121.96855000000001,47.580597],[-121.96852000000001,47.580479999999994],[-121.9685,47.58041],[-121.96889,47.58015],[-121.96982000000001,47.580158000000004],[-121.96995500000001,47.58016],[-121.97113,47.58017],[-121.971292,47.58017],[-121.97356,47.5802],[-121.97348,47.583922],[-121.97346999999999,47.584419999999994],[-121.97428000000001,47.58436],[-121.97491000000001,47.58431],[-121.97509,47.584289999999996],[-121.97642,47.584182],[-121.97635,47.58755],[-121.98174,47.587619999999994],[-121.98185000000001,47.581759999999996],[-121.98273999999999,47.58115],[-121.98293,47.58101],[-121.98412000000002,47.58017],[-121.98428000000001,47.58005],[-121.98458000000001,47.57983],[-121.98473,47.57971800000001],[-121.98486000000001,47.5796],[-121.98499000000001,47.57947],[-121.98511,47.579342000000004],[-121.98556,47.57875000000001],[-121.98569,47.57858],[-121.98646000000001,47.57756],[-121.98746000000001,47.576190000000004],[-121.98773,47.575823],[-121.98802,47.575423],[-121.9894,47.575655000000005],[-121.99066000000002,47.57586],[-121.99112000000002,47.575945000000004],[-121.99142000000002,47.576010000000004],[-121.99157000000001,47.57605],[-121.99185000000001,47.576150000000005],[-121.99206000000001,47.576236],[-121.99219000000001,47.576296],[-121.99244,47.576426],[-121.99271,47.57662],[-121.99273,47.57664],[-121.99313000000001,47.57701],[-121.99339,47.577211],[-121.99367000000001,47.57741],[-121.99390000000001,47.57754],[-121.99415000000002,47.577659999999995],[-121.99465500000002,47.57784899999999],[-121.99480000000001,47.57789],[-121.995098,47.577954],[-121.995545,47.578033000000005],[-121.99600000000001,47.578100000000006],[-121.99626000000002,47.57813000000001],[-121.99659000000001,47.578165000000006],[-121.99703000000001,47.57822],[-121.99747,47.578298000000004],[-121.99790000000002,47.578390000000006],[-121.99831,47.578499],[-121.99861000000001,47.578590000000005],[-121.99892000000001,47.578700000000005],[-121.99922000000002,47.578810000000004],[-121.99951000000001,47.57893000000001],[-122.00056000000001,47.57931000000001],[-122.00339,47.58029],[-122.00364,47.580374],[-122.00405,47.580479999999994],[-122.00464000000001,47.58057],[-122.00478,47.580582],[-122.00507999999999,47.5806],[-122.00577999999999,47.58061],[-122.00816999999999,47.580639999999995],[-122.01039,47.58067],[-122.01163000000001,47.580679999999994],[-122.01251,47.5807],[-122.01416000000002,47.580711],[-122.01818,47.580754],[-122.02029,47.58078],[-122.02071,47.58079],[-122.02158,47.580799999999996],[-122.02188,47.580805],[-122.02202999999999,47.580802],[-122.0222,47.58079],[-122.02246999999998,47.58076],[-122.02275999999999,47.580714],[-122.02289999999999,47.58068299999999],[-122.02306999999999,47.580636],[-122.02336,47.58053],[-122.0236,47.58043],[-122.023939,47.580275],[-122.02431,47.58012],[-122.024808,47.57994],[-122.02507999999999,47.579846999999994],[-122.02526999999999,47.579796],[-122.02562999999999,47.5797],[-122.02752000000001,47.5793],[-122.02766000000001,47.57927],[-122.02788,47.57915200000001],[-122.02817999999999,47.578933000000006],[-122.0276,47.578634],[-122.02746,47.57856],[-122.02708,47.578340000000004],[-122.02681,47.578165000000006],[-122.02476999999999,47.576730000000005],[-122.02317,47.575610000000005],[-122.02280999999999,47.57536],[-122.02269,47.57527],[-122.02246999999998,47.57508],[-122.02234299999999,47.574948],[-122.02203999999999,47.57452],[-122.0219,47.57418],[-122.02183,47.573792000000005],[-122.02184,47.57338],[-122.0219,47.573086999999994],[-122.02199999999999,47.572810000000004],[-122.02226,47.572278000000004],[-122.02269999999999,47.571459999999995],[-122.02359,47.569855000000004],[-122.02406300000001,47.56901500000001],[-122.02438,47.56842],[-122.02481,47.567634],[-122.02519,47.56692],[-122.02526999999999,47.56669],[-122.02530999999999,47.566520000000004],[-122.02532,47.56636],[-122.02529999999999,47.56615000000001],[-122.02525,47.565898000000004],[-122.02505,47.565187],[-122.02494,47.564710000000005],[-122.02477999999999,47.5642],[-122.02472,47.563950000000006],[-122.02471,47.563778000000006],[-122.02471,47.5636],[-122.02486,47.562630000000006],[-122.02489,47.562441],[-122.02507999999999,47.561370000000004],[-122.02512,47.56109],[-122.02512999999999,47.560914000000004],[-122.0251,47.56073000000001],[-122.025059,47.56057500000001],[-122.02498,47.560410000000005],[-122.02486999999999,47.5602],[-122.02469,47.559922],[-122.0241,47.559013],[-122.02428,47.558972000000004],[-122.02446,47.558959],[-122.02494,47.558966],[-122.02516,47.55897],[-122.0278,47.559],[-122.02829999999999,47.559],[-122.02982999999999,47.559019],[-122.03072,47.55903],[-122.03199000000001,47.559053],[-122.03391,47.55907],[-122.03582,47.55909],[-122.03599,47.55909],[-122.03606,47.559079999999994],[-122.03622000000001,47.55907],[-122.03628,47.559056],[-122.03632999999999,47.55905],[-122.03652000000001,47.559005],[-122.0365,47.559109],[-122.04212000000001,47.559222],[-122.04267,47.55923],[-122.04269000000001,47.561445],[-122.04204,47.562785000000005],[-122.04023000000001,47.5628],[-122.03983099999999,47.5628],[-122.03594,47.562740000000005],[-122.03592,47.56363],[-122.035834,47.56734],[-122.035834,47.56815800000001],[-122.03582,47.56832000000001],[-122.03582,47.56904],[-122.03577999999999,47.56926],[-122.03576,47.56974],[-122.03572,47.572],[-122.03571,47.57226],[-122.035703,47.57378],[-122.03572,47.573859999999996],[-122.03569999999999,47.574889999999996],[-122.03565,47.577334],[-122.04102000000002,47.57737],[-122.04108000000001,47.57372],[-122.0428,47.573738000000006],[-122.04329600000001,47.57374],[-122.04393,47.573747],[-122.04506,47.573750000000004],[-122.04645000000001,47.57377],[-122.04650000000001,47.57084],[-122.04654000000001,47.56850000000001],[-122.04665200000001,47.568560000000005],[-122.04741300000002,47.569016000000005],[-122.04760000000002,47.56915000000001],[-122.04790000000001,47.569359000000006],[-122.04835,47.569720000000004],[-122.04916000000001,47.57042],[-122.04966000000002,47.570679999999996],[-122.05014,47.570836],[-122.05062000000001,47.57088399999999],[-122.05127,47.570859999999996],[-122.05138,47.57085],[-122.05161000000001,47.570802],[-122.0517,47.57078],[-122.05194,47.570709],[-122.05215,47.570622],[-122.05228,47.57056],[-122.05247999999999,47.57043],[-122.05259,47.570350000000005],[-122.05274999999999,47.57021],[-122.057392,47.57024],[-122.0574,47.569922000000005],[-122.05741,47.569390000000006],[-122.05741,47.569265],[-122.05742000000001,47.5692],[-122.05739,47.568470000000005],[-122.05739,47.56839000000001],[-122.05739,47.56831000000001],[-122.05738,47.56823000000001],[-122.05738,47.56812000000001],[-122.05736999999999,47.56798],[-122.05735,47.567377],[-122.057392,47.56665],[-122.06343,47.56655000000001],[-122.07370999999999,47.566382000000004],[-122.07424,47.566373000000006],[-122.07522,47.56752],[-122.07636,47.56891000000001],[-122.07699,47.56968],[-122.078167,47.57094],[-122.07849999999999,47.57129],[-122.08008,47.573],[-122.08212999999999,47.574397],[-122.0848,47.57623],[-122.09011000000001,47.57813000000001],[-122.09038,47.57822],[-122.09575,47.57996],[-122.09817,47.58166799999999],[-122.09859,47.581968999999994],[-122.09862000000001,47.582454],[-122.09863,47.582592000000005],[-122.09866000000001,47.583059],[-122.09895,47.587935],[-122.09933,47.5914],[-122.09946000000001,47.592580000000005],[-122.09951000000001,47.593025000000004]]]},"name":"Sammamish"},{"boundary":{"type":"Polygon","coordinates":[[[-122.19516999999999,47.54483999999999],[-122.19486,47.54483],[-122.19486,47.54568],[-122.19485,47.54582],[-122.19485,47.54583],[-122.194542,47.54582],[-122.19389,47.545795000000005],[-122.19382999999999,47.5458],[-122.19355,47.545798000000005],[-122.1929,47.545792000000006],[-122.19098699999999,47.545798000000005],[-122.1909,47.5458],[-122.1909,47.545662],[-122.1909,47.54491],[-122.1909,47.54357],[-122.19091,47.54299],[-122.19092,47.54242],[-122.1909,47.542333000000006],[-122.19086999999999,47.54227],[-122.19081,47.542212000000006],[-122.19069,47.54216],[-122.19065,47.54215000000001],[-122.19055,47.54214],[-122.18881999999999,47.54213000000001],[-122.18834899999999,47.54213000000001],[-122.18813999999999,47.54213000000001],[-122.18711,47.542120000000004],[-122.18587999999998,47.542100000000005],[-122.18576999999998,47.54209],[-122.18561,47.54205],[-122.18544999999999,47.542010000000005],[-122.18502999999998,47.54183],[-122.18481,47.54176],[-122.18446999999999,47.54165],[-122.184256,47.54160399999999],[-122.18356999999999,47.541489999999996],[-122.1822,47.54127],[-122.18198,47.54124099999999],[-122.18163,47.54119],[-122.18125,47.54115],[-122.18115,47.54114],[-122.18092,47.54113],[-122.17981999999999,47.5411],[-122.17903999999999,47.541078],[-122.17803999999998,47.54105],[-122.17702,47.541025],[-122.17580999999998,47.54099],[-122.1749,47.54096],[-122.17385999999999,47.54093],[-122.17152999999999,47.540868999999994],[-122.17135999999999,47.540855],[-122.17106999999999,47.54081],[-122.17083999999998,47.540756],[-122.17073999999998,47.54072],[-122.170656,47.540696],[-122.17044999999999,47.5406],[-122.17022999999999,47.54044],[-122.16991,47.54014],[-122.16986999999999,47.5401],[-122.16976999999999,47.5401],[-122.16963,47.5401],[-122.169166,47.5401],[-122.16879999999999,47.5401],[-122.16837999999998,47.540088],[-122.16822,47.540085],[-122.16765000000001,47.54007],[-122.16556,47.54001],[-122.16534999999999,47.54002],[-122.16476,47.54132],[-122.16445,47.54208],[-122.164187,47.542727],[-122.16414,47.543071],[-122.16414,47.54338],[-122.16415,47.54369],[-122.16415,47.54399],[-122.16425000000001,47.54431],[-122.16424,47.544672],[-122.16424,47.54548],[-122.1626,47.545463],[-122.16198,47.545455000000004],[-122.15996,47.54543],[-122.15356,47.545370000000005],[-122.15342,47.54538],[-122.15342,47.544560999999995],[-122.15342999999999,47.54175],[-122.14292,47.54167999999999],[-122.14294199999999,47.53936],[-122.14292,47.53936],[-122.14240199999999,47.5392],[-122.14204,47.539104],[-122.14160000000001,47.539006],[-122.14129000000001,47.53896],[-122.14108,47.53893000000001],[-122.13753,47.53848],[-122.13726000000001,47.538430000000005],[-122.13682,47.538340000000005],[-122.136528,47.538250000000005],[-122.13636999999999,47.5382],[-122.13604,47.538070000000005],[-122.13548999999999,47.53783],[-122.13389,47.53712],[-122.13346999999999,47.536930000000005],[-122.13328,47.53681],[-122.133104,47.53672],[-122.133046,47.53668],[-122.13277999999998,47.536485],[-122.13262999999999,47.53636],[-122.13236999999998,47.536120000000004],[-122.13222,47.53598],[-122.13221,47.535613000000005],[-122.13221,47.535320000000006],[-122.13222,47.53489],[-122.13222,47.532590000000006],[-122.13096999999999,47.532590000000006],[-122.13012,47.532588000000004],[-122.12946999999998,47.532587],[-122.12906,47.53178],[-122.12756999999999,47.52884],[-122.12774999999999,47.528670000000005],[-122.12832999999998,47.52803000000001],[-122.12924799999999,47.52706],[-122.13288999999999,47.52707],[-122.13672999999999,47.527074],[-122.14313,47.52711000000001],[-122.143122,47.526830000000004],[-122.14316000000001,47.52539000000001],[-122.143217,47.52347],[-122.13776,47.523616000000004],[-122.13785,47.516346],[-122.13847999999999,47.51634],[-122.13898999999999,47.516343],[-122.13992999999999,47.51635],[-122.14175,47.51636],[-122.142725,47.51636],[-122.14311000000001,47.51652],[-122.14336,47.516635],[-122.14359,47.51675],[-122.14404,47.516903],[-122.14447,47.516999999999996],[-122.14472,47.51705],[-122.14592,47.51714],[-122.14596999999999,47.51715],[-122.14842999999999,47.51732],[-122.14956000000001,47.51743999999999],[-122.14986999999999,47.51747399999999],[-122.15096999999999,47.51761],[-122.15173999999999,47.5177],[-122.15302999999999,47.51789699999999],[-122.15357999999999,47.518],[-122.1536,47.517869999999995],[-122.15638999999999,47.518297],[-122.15912,47.518727],[-122.1592,47.517861999999994],[-122.15929,47.51672],[-122.15926999999999,47.51653],[-122.15925,47.516439999999996],[-122.15923,47.51629],[-122.15915,47.5161],[-122.15936999999998,47.516059999999996],[-122.15952,47.516059999999996],[-122.15957999999999,47.516059999999996],[-122.15964,47.516075],[-122.15970999999999,47.5161],[-122.15979099999998,47.516130000000004],[-122.15982,47.51615],[-122.16031,47.516459999999995],[-122.16099,47.51687],[-122.1622,47.517568999999995],[-122.16233499999998,47.51765999999999],[-122.16237999999998,47.5177],[-122.162433,47.51779],[-122.16244999999999,47.518056],[-122.16247999999999,47.51814],[-122.16251,47.518170000000005],[-122.16253999999999,47.518201],[-122.162579,47.51822],[-122.16264,47.518248],[-122.16272999999998,47.51827],[-122.16323,47.51827],[-122.16346999999999,47.518279],[-122.1645,47.51838],[-122.16481,47.51841],[-122.16524,47.518433],[-122.16535999999999,47.51843],[-122.165714,47.51841],[-122.16588999999999,47.518390000000004],[-122.16801,47.51809],[-122.169084,47.51795],[-122.17067999999999,47.517739999999996],[-122.17087999999998,47.51771],[-122.17142,47.517649999999996],[-122.17266999999998,47.51747999999999],[-122.17274999999998,47.51747099999999],[-122.17547999999998,47.51705],[-122.17604999999999,47.51696],[-122.17712999999999,47.51672],[-122.17734999999999,47.51664399999999],[-122.18032999999998,47.51668299999999],[-122.180403,47.5166],[-122.18047299999999,47.5166],[-122.18148,47.51661],[-122.18361,47.51663],[-122.18406999999999,47.516635],[-122.18416,47.516722],[-122.18404,47.51672],[-122.18408,47.51675],[-122.18502999999998,47.51759],[-122.18553999999999,47.51806],[-122.18574999999998,47.51806],[-122.18577999999998,47.51871200000001],[-122.18573999999998,47.520100000000006],[-122.18570999999999,47.52116],[-122.18566999999999,47.52172],[-122.18566999999999,47.521792000000005],[-122.185656,47.522040000000004],[-122.18567999999999,47.52211000000001],[-122.18581999999999,47.52211000000001],[-122.18597999999999,47.52203000000001],[-122.186013,47.52203000000001],[-122.18607999999999,47.522017000000005],[-122.18656,47.522017000000005],[-122.18702,47.52200800000001],[-122.18741,47.52201000000001],[-122.18741,47.52302],[-122.18787999999999,47.523049],[-122.18794,47.522966000000004],[-122.18800999999999,47.522850000000005],[-122.18802999999998,47.52282],[-122.18804999999999,47.522794000000005],[-122.18807999999999,47.52275900000001],[-122.18811799999999,47.52272200000001],[-122.18816,47.522690000000004],[-122.18818999999999,47.52266],[-122.18824,47.52263000000001],[-122.18827999999999,47.52261000000001],[-122.18830999999999,47.522600000000004],[-122.18834999999999,47.52257000000001],[-122.18842,47.52255000000001],[-122.18846999999998,47.52253000000001],[-122.18852999999999,47.52252000000001],[-122.18858999999999,47.52250000000001],[-122.18863999999999,47.522496000000004],[-122.18867999999999,47.522489],[-122.18873999999998,47.52248],[-122.18877999999998,47.522483],[-122.18881999999999,47.52248],[-122.18888999999999,47.52248],[-122.18896,47.52248],[-122.189026,47.522490000000005],[-122.1891,47.52250000000001],[-122.18918,47.52252000000001],[-122.18923099999999,47.52266],[-122.18937999999999,47.52259000000001],[-122.18957999999999,47.522740000000006],[-122.18978999999999,47.522963000000004],[-122.19019,47.52347],[-122.19042999999999,47.52382],[-122.19106000000001,47.5249],[-122.19106000000001,47.525090000000006],[-122.19094,47.531242],[-122.19324,47.5312],[-122.19358,47.5312],[-122.19359,47.531530000000004],[-122.193602,47.531639999999996],[-122.19363,47.53174],[-122.19368,47.53184399999999],[-122.19373999999999,47.531928],[-122.19373499999999,47.533],[-122.19297999999999,47.533],[-122.19238999999999,47.533],[-122.19236999999998,47.534819999999996],[-122.192519,47.534819999999996],[-122.19284999999999,47.534819999999996],[-122.19305,47.534819999999996],[-122.19306,47.53528],[-122.19237999999999,47.53528],[-122.19238999999999,47.53678],[-122.19239999999999,47.53737],[-122.19239999999999,47.53742],[-122.19239999999999,47.537731],[-122.19287899999999,47.537924],[-122.19284999999999,47.53796],[-122.19274999999999,47.53810000000001],[-122.19256999999999,47.538340000000005],[-122.19251,47.538438000000006],[-122.19409,47.53848],[-122.19426000000001,47.53936],[-122.19460000000001,47.540395000000004],[-122.1948,47.54097],[-122.19496000000001,47.54143],[-122.19506,47.5417],[-122.19512,47.54213000000001],[-122.19516999999999,47.54261],[-122.19515,47.54301],[-122.1951,47.54301],[-122.19511,47.54356],[-122.19511,47.543985],[-122.19517799999998,47.54399],[-122.19516999999999,47.54483999999999]]]},"name":"Newcastle"},{"boundary":{"type":"Polygon","coordinates":[[[-122.10054,47.554199999999994],[-122.1004,47.555676],[-122.10024,47.557379999999995],[-122.10019,47.559225],[-122.09797,47.559228],[-122.0987,47.56058],[-122.09834,47.561879],[-122.09818,47.562475000000006],[-122.09824,47.56270000000001],[-122.09831,47.56297000000001],[-122.09866000000001,47.56442],[-122.09872999999999,47.564710000000005],[-122.09889,47.56525200000001],[-122.09905,47.566234],[-122.09914,47.56669],[-122.09966000000001,47.56777],[-122.09978199999999,47.56812800000001],[-122.0999,47.568450000000006],[-122.09877999999999,47.568830000000005],[-122.09912000000001,47.569334000000005],[-122.09926000000002,47.569285],[-122.09963,47.569762000000004],[-122.0994,47.56992],[-122.09919000000001,47.570009],[-122.09894,47.56987],[-122.09894,47.56982],[-122.09789,47.569810000000004],[-122.09789,47.57052],[-122.09790000000001,47.57157],[-122.09790000000001,47.571878],[-122.09789,47.57204],[-122.09754000000001,47.571979999999996],[-122.0967,47.57181],[-122.09586999999999,47.57139],[-122.095,47.57078],[-122.09463000000001,47.57052],[-122.09232999999999,47.57172],[-122.09173,47.57121],[-122.09168000000001,47.5712],[-122.09161000000002,47.57118],[-122.09159000000001,47.571149],[-122.09157,47.571130000000004],[-122.09155000000001,47.57112],[-122.09153,47.571110000000004],[-122.09151000000001,47.571106],[-122.09144,47.57107],[-122.091389,47.571054],[-122.09137,47.571039999999996],[-122.0913,47.571008],[-122.09127000000001,47.57099],[-122.09119000000001,47.570977],[-122.09115000000001,47.57097],[-122.09112000000002,47.57096],[-122.09109000000001,47.57095],[-122.09105000000001,47.570930000000004],[-122.09103,47.570924],[-122.09101000000001,47.570910000000005],[-122.09099,47.5709],[-122.09098,47.570885],[-122.09096000000001,47.57087],[-122.09091000000001,47.57083],[-122.09086,47.57082],[-122.09084,47.57082],[-122.09079,47.570791],[-122.09079,47.57077],[-122.09069000000001,47.57069],[-122.09063,47.57064],[-122.09059,47.57062],[-122.09055000000001,47.57061],[-122.09054,47.57059],[-122.09055000000001,47.57056],[-122.09061900000002,47.57052],[-122.09059,47.57047],[-122.09056000000001,47.57043],[-122.09054,47.570412000000005],[-122.09052000000001,47.57039],[-122.09047,47.57036],[-122.09042000000001,47.570330000000006],[-122.09038,47.57032],[-122.09033,47.5703],[-122.0903,47.570283999999994],[-122.09027,47.57027],[-122.09023,47.570243],[-122.09020000000001,47.570232000000004],[-122.09015000000001,47.570219],[-122.09012000000001,47.57022],[-122.09002000000001,47.57023],[-122.09001,47.570229],[-122.09001,47.57018],[-122.09,47.570170000000005],[-122.08993,47.570097],[-122.08991,47.57008],[-122.08998,47.569970000000005],[-122.08995,47.569928000000004],[-122.08991,47.569888],[-122.08986999999999,47.56986],[-122.08979,47.56982],[-122.08962500000001,47.56978],[-122.08951,47.569770000000005],[-122.08941,47.569762000000004],[-122.08933999999999,47.56974],[-122.08928,47.56974],[-122.08872999999998,47.56986],[-122.08663,47.570322000000004],[-122.08627,47.570107],[-122.086218,47.570113000000006],[-122.08606,47.57011000000001],[-122.08606,47.57014],[-122.08596999999999,47.570114000000004],[-122.08592,47.570107],[-122.08572999999998,47.57008],[-122.08569999999999,47.57008],[-122.08567,47.57008],[-122.08561,47.570057],[-122.0856,47.57004],[-122.08554,47.569981],[-122.08542999999999,47.56992],[-122.08538999999999,47.569900000000004],[-122.08538999999999,47.56988],[-122.08534999999999,47.56986],[-122.0851,47.56965],[-122.08487,47.56947],[-122.08453,47.56936],[-122.08435,47.56929],[-122.08406000000001,47.569051],[-122.083985,47.568960000000004],[-122.08391,47.56886],[-122.08379199999999,47.568765000000006],[-122.08375,47.56875300000001],[-122.08369,47.56873000000001],[-122.08367,47.56868],[-122.08342999999999,47.568509000000006],[-122.0832,47.56832000000001],[-122.08305,47.568220000000004],[-122.08288999999999,47.56815100000001],[-122.08282,47.56812000000001],[-122.08277999999999,47.56810000000001],[-122.08274999999999,47.568064],[-122.08272199999999,47.56796],[-122.08272,47.567937],[-122.082726,47.56789],[-122.08271599999999,47.567851],[-122.08269999999999,47.5678],[-122.08269,47.567721],[-122.08266,47.56766],[-122.08266,47.56765],[-122.08265,47.56761],[-122.08266,47.56756],[-122.08264,47.567459],[-122.08216999999999,47.566386],[-122.08205,47.566167],[-122.08203999999999,47.56609],[-122.08197,47.566027],[-122.08192000000001,47.56598],[-122.08183,47.565858000000006],[-122.08171300000001,47.56571000000001],[-122.08166800000001,47.565601],[-122.081638,47.565540000000006],[-122.08158,47.56546],[-122.08154,47.565383000000004],[-122.08149,47.565259000000005],[-122.08141,47.56511000000001],[-122.08142000000001,47.56503000000001],[-122.08136,47.56492],[-122.08129000000001,47.564856],[-122.08125000000001,47.5648],[-122.081185,47.564646999999994],[-122.0811,47.564510000000006],[-122.08093,47.56428],[-122.08076999999999,47.56406],[-122.08062000000001,47.56385],[-122.08052,47.563691],[-122.08046,47.563590000000005],[-122.08039,47.563410000000005],[-122.08027,47.563086],[-122.08023,47.563010000000006],[-122.08022000000001,47.56299500000001],[-122.08022000000001,47.562900000000006],[-122.08022000000001,47.562830000000005],[-122.08019,47.56274500000001],[-122.08015,47.562630000000006],[-122.08010900000001,47.56259000000001],[-122.08006999999999,47.56247200000001],[-122.08002400000001,47.562349000000005],[-122.08,47.56225800000001],[-122.07997999999999,47.56221000000001],[-122.07996,47.562180000000005],[-122.07992999999999,47.56211000000001],[-122.07992,47.562020000000004],[-122.07991,47.56184],[-122.07986999999999,47.56175],[-122.07982,47.56154],[-122.07981,47.56146],[-122.07981,47.56138],[-122.07979999999999,47.56132],[-122.07973999999999,47.56114],[-122.07972999999998,47.56108],[-122.07972999999998,47.56106],[-122.07972,47.56103],[-122.07969999999999,47.56096],[-122.07968,47.56088],[-122.07964,47.56072],[-122.07959,47.560615000000006],[-122.0795,47.56051000000001],[-122.0795,47.56047],[-122.0795,47.560340000000004],[-122.0795,47.560306000000004],[-122.0795,47.56026],[-122.0795,47.5602],[-122.07948999999999,47.56017000000001],[-122.07948999999999,47.56011000000001],[-122.07948999999999,47.56009],[-122.07948999999999,47.56006],[-122.0795,47.56002],[-122.07951,47.559916],[-122.07952,47.55985],[-122.07952,47.55972],[-122.07952999999999,47.55967999999999],[-122.07954,47.559585],[-122.0796,47.55912],[-122.0796,47.559059999999995],[-122.0796,47.55903],[-122.07961,47.559014],[-122.07961,47.55901],[-122.07962,47.559],[-122.07962,47.55898],[-122.0796,47.55896],[-122.0796,47.55894],[-122.07959,47.558934],[-122.07959,47.558914],[-122.07959,47.55889],[-122.0796,47.55887],[-122.07961,47.55881],[-122.07962,47.558794],[-122.07962,47.55875],[-122.07961,47.558709],[-122.07952999999999,47.558659],[-122.07903999999999,47.55834],[-122.07831999999999,47.55787999999999],[-122.07822999999999,47.557829999999996],[-122.07800999999999,47.557339999999996],[-122.07772999999999,47.556722],[-122.07763,47.55656],[-122.07713,47.55572],[-122.07623,47.55552],[-122.07593999999999,47.555710000000005],[-122.07562999999999,47.55592],[-122.07493,47.55552],[-122.07463,47.55582],[-122.07482999999999,47.55632],[-122.07322,47.55638],[-122.07311,47.556259999999995],[-122.07287999999998,47.55609],[-122.07298999999999,47.556072],[-122.07309,47.556079999999994],[-122.073116,47.556079999999994],[-122.07312,47.55561],[-122.07279999999999,47.555479999999996],[-122.07076999999998,47.55552],[-122.0702,47.555530000000005],[-122.0682,47.55556],[-122.06822000000001,47.553889999999996],[-122.06823,47.55356],[-122.06823,47.553279999999994],[-122.06825,47.55197999999999],[-122.06825300000001,47.55187999999999],[-122.06812000000001,47.55187099999999],[-122.067938,47.551869999999994],[-122.06773,47.551869999999994],[-122.06635,47.551899999999996],[-122.06497,47.551919999999996],[-122.06042000000001,47.55198599999999],[-122.05969999999999,47.55198699999999],[-122.05945,47.55197],[-122.05927,47.551945999999994],[-122.05914,47.551899999999996],[-122.05869999999999,47.55168399999999],[-122.058563,47.55179],[-122.05841,47.55187099999999],[-122.05822,47.551939999999995],[-122.05803999999999,47.55197999999999],[-122.05785,47.55201],[-122.05766000000001,47.55202],[-122.05682999999999,47.552028],[-122.05424000000001,47.55197],[-122.05208599999999,47.55197],[-122.05202999999999,47.55424599999999],[-122.051861,47.55938],[-122.048589,47.55935],[-122.05063,47.562222000000006],[-122.050767,47.56241000000001],[-122.05112000000001,47.56291000000001],[-122.05277999999998,47.56523000000001],[-122.05326000000001,47.56514000000001],[-122.05401,47.56512000000001],[-122.05493,47.565220000000004],[-122.05552999999999,47.56562],[-122.05565,47.565780000000004],[-122.05569,47.565830000000005],[-122.05573099999998,47.566722000000006],[-122.05735,47.567377],[-122.05736999999999,47.56798],[-122.05738,47.56812000000001],[-122.05738,47.56823000000001],[-122.05739,47.56831000000001],[-122.05739,47.56839000000001],[-122.05739,47.568470000000005],[-122.05742000000001,47.5692],[-122.05741,47.569265],[-122.05741,47.569390000000006],[-122.0574,47.569922000000005],[-122.057392,47.57024],[-122.05274999999999,47.57021],[-122.05259,47.570350000000005],[-122.05247999999999,47.57043],[-122.05228,47.57056],[-122.05215,47.570622],[-122.05194,47.570709],[-122.0517,47.57078],[-122.05161000000001,47.570802],[-122.05138,47.57085],[-122.05127,47.570859999999996],[-122.05062000000001,47.57088399999999],[-122.05014,47.570836],[-122.04966000000002,47.570679999999996],[-122.04916000000001,47.57042],[-122.04835,47.569720000000004],[-122.04790000000001,47.569359000000006],[-122.04760000000002,47.56915000000001],[-122.04741300000002,47.569016000000005],[-122.04665200000001,47.568560000000005],[-122.04654000000001,47.56850000000001],[-122.04650000000001,47.57084],[-122.04645000000001,47.57377],[-122.04506,47.573750000000004],[-122.04393,47.573747],[-122.04329600000001,47.57374],[-122.0428,47.573738000000006],[-122.04108000000001,47.57372],[-122.04102000000002,47.57737],[-122.03565,47.577334],[-122.03569999999999,47.574889999999996],[-122.03572,47.573859999999996],[-122.035703,47.57378],[-122.03571,47.57226],[-122.03572,47.572],[-122.03576,47.56974],[-122.03577999999999,47.56926],[-122.03582,47.56904],[-122.03582,47.56832000000001],[-122.035834,47.56815800000001],[-122.035834,47.56734],[-122.03592,47.56363],[-122.03594,47.562740000000005],[-122.03983099999999,47.5628],[-122.04023000000001,47.5628],[-122.04204,47.562785000000005],[-122.04269000000001,47.561445],[-122.04267,47.55923],[-122.04212000000001,47.559222],[-122.0365,47.559109],[-122.03652000000001,47.559005],[-122.03632999999999,47.55905],[-122.03628,47.559056],[-122.03622000000001,47.55907],[-122.03606,47.559079999999994],[-122.03599,47.55909],[-122.03582,47.55909],[-122.03391,47.55907],[-122.03199000000001,47.559053],[-122.03072,47.55903],[-122.02982999999999,47.559019],[-122.02829999999999,47.559],[-122.0278,47.559],[-122.02516,47.55897],[-122.02494,47.558966],[-122.02446,47.558959],[-122.02428,47.558972000000004],[-122.0241,47.559013],[-122.024,47.55885],[-122.02349,47.558065],[-122.022973,47.55724299999999],[-122.02264,47.556689999999996],[-122.02230999999999,47.5562],[-122.02128400000001,47.55476699999999],[-122.02053,47.555197],[-122.02013,47.55542],[-122.02006,47.55546399999999],[-122.02002,47.555330000000005],[-122.01997,47.55518],[-122.01944,47.55360399999999],[-122.019847,47.553608],[-122.020065,47.55361],[-122.02074999999999,47.553599999999996],[-122.02073999999999,47.553512000000005],[-122.02005,47.55347999999999],[-122.02006,47.55193],[-122.020061,47.55173],[-122.02044,47.55173],[-122.02071,47.551736],[-122.02106,47.55147999999999],[-122.02111000000001,47.55143999999999],[-122.02122000000001,47.55105999999999],[-122.021461,47.55071],[-122.02147,47.55033],[-122.02149,47.550185],[-122.02148,47.550124],[-122.02143,47.550052],[-122.02122000000001,47.54981],[-122.02091,47.549679999999995],[-122.02054,47.54932],[-122.02067,47.54926699999999],[-122.02008,47.54863],[-122.02009,47.548218000000006],[-122.018986,47.54822],[-122.018584,47.548210000000005],[-122.01807,47.5482],[-122.01712000000002,47.548210000000005],[-122.01676,47.54822],[-122.016335,47.548230000000004],[-122.01602000000001,47.54822],[-122.01556000000001,47.548210000000005],[-122.01479,47.54889],[-122.01480000000001,47.54972],[-122.01481000000001,47.551016999999995],[-122.01441000000001,47.55105999999999],[-122.01356000000001,47.55115],[-122.01335,47.55116699999999],[-122.01317,47.551168],[-122.01301000000001,47.551159999999996],[-122.01286999999999,47.55114],[-122.01279,47.551119],[-122.01258,47.55105],[-122.0124,47.55097],[-122.01225000000001,47.55087699999999],[-122.01219,47.550832],[-122.01204,47.5507],[-122.01184,47.550557],[-122.01167000000001,47.55045],[-122.01154000000001,47.550380999999994],[-122.01139,47.55032],[-122.01129000000002,47.550279999999994],[-122.01111000000002,47.550218],[-122.01085,47.55015],[-122.00877999999999,47.54986399999999],[-122.00854,47.549831],[-122.0084,47.5499],[-122.0081,47.549859999999995],[-122.00792000000001,47.549839999999996],[-122.0077,47.54985],[-122.00748,47.549879999999995],[-122.00729000000001,47.54993],[-122.00710000000001,47.55001],[-122.00693,47.550110000000004],[-122.00622000000001,47.550689999999996],[-122.00601,47.55085],[-122.00583199999998,47.550953],[-122.00568,47.55103],[-122.005519,47.551069999999996],[-122.004,47.551469999999995],[-122.004,47.55152],[-122.00375,47.551773],[-122.00371,47.552],[-122.00374,47.552216],[-122.00379,47.552330000000005],[-122.00383,47.55268099999999],[-122.00364,47.55303],[-122.003369,47.553279999999994],[-122.00336,47.553619999999995],[-122.00336,47.553722],[-122.00336,47.5541],[-122.00334,47.555710000000005],[-122.00329,47.555710000000005],[-122.0032,47.555716000000004],[-122.00311,47.555745],[-122.0029,47.5559],[-122.00283999999999,47.55589],[-122.00273999999999,47.555898],[-122.00263,47.55596],[-122.00254,47.556219999999996],[-122.00234999999999,47.55628599999999],[-122.00214,47.55633],[-122.002,47.55641],[-122.00197,47.556419999999996],[-122.00182000000001,47.556493999999994],[-122.001749,47.55658],[-122.00166000000002,47.55656],[-122.00137,47.55659],[-122.00125000000001,47.556675],[-122.00114,47.55695],[-121.99985000000001,47.556819999999995],[-121.99963300000002,47.556802],[-121.99913400000001,47.55631],[-121.99892000000001,47.55645],[-121.99791000000002,47.55707999999999],[-121.99699000000001,47.55643],[-121.99625000000002,47.555910000000004],[-121.99583,47.55562],[-121.99573,47.555479999999996],[-121.99563,47.55536],[-121.99564000000001,47.55529],[-121.99560000000001,47.55521],[-121.99554,47.55518],[-121.995365,47.555130000000005],[-121.99525000000001,47.555113000000006],[-121.99516000000001,47.555130000000005],[-121.99509,47.55518],[-121.99504,47.55526],[-121.995,47.55533500000001],[-121.99498000000001,47.555367],[-121.99502000000001,47.55547],[-121.99524000000001,47.555530000000005],[-121.99528400000001,47.55565],[-121.99368000000001,47.555716000000004],[-121.99369000000002,47.55544],[-121.9937,47.554649999999995],[-121.99335,47.554649999999995],[-121.99226000000002,47.55463999999999],[-121.98883,47.554595],[-121.98817,47.55458699999999],[-121.98803,47.55457],[-121.98779,47.554579999999994],[-121.98773,47.55439],[-121.98773,47.55413],[-121.98794000000001,47.55386099999999],[-121.98796100000001,47.553619999999995],[-121.98812000000001,47.55336],[-121.98811,47.553110000000004],[-121.98826000000001,47.55289],[-121.98834,47.552459999999996],[-121.98829,47.55225],[-121.98872,47.551736],[-121.98899,47.55169899999999],[-121.98907,47.55182299999999],[-121.98929000000001,47.55185999999999],[-121.98943,47.55179],[-121.9895,47.55167999999999],[-121.98964000000001,47.551629999999996],[-121.98986000000001,47.55168699999999],[-121.9899,47.551733],[-121.989939,47.55179],[-121.99014000000001,47.551849999999995],[-121.99049000000001,47.551759999999994],[-121.99050000000001,47.55193],[-121.99063000000001,47.55202],[-121.99088,47.5521],[-121.99096000000002,47.552279999999996],[-121.99105000000002,47.552350000000004],[-121.99135000000001,47.55245],[-121.99152000000002,47.552377],[-121.99153000000001,47.55218],[-121.99160000000002,47.552163],[-121.99166700000002,47.55209],[-121.99187,47.552036],[-121.99208,47.552032000000004],[-121.99233,47.552150000000005],[-121.9924,47.552170000000004],[-121.99313000000001,47.55185999999999],[-121.99337,47.551809999999996],[-121.99374,47.55176899999999],[-121.99394000000001,47.551689999999994],[-121.99428600000002,47.55169599999999],[-121.99445000000001,47.55159],[-121.99445000000001,47.551215],[-121.99408000000001,47.55132],[-121.99352200000001,47.55141999999999],[-121.99314000000001,47.55142699999999],[-121.99282000000001,47.55155],[-121.99243,47.55134399999999],[-121.99247,47.55037],[-121.99244,47.54986399999999],[-121.99243,47.549521],[-121.99257,47.54938],[-121.99260000000001,47.549257],[-121.99265000000001,47.549223],[-121.99276,47.5492],[-121.99300000000001,47.54921],[-121.99315000000001,47.549170000000004],[-121.99321000000002,47.54916],[-121.99360300000002,47.54918],[-121.99384,47.549279999999996],[-121.99414000000002,47.549307],[-121.99439000000001,47.549271],[-121.99443000000001,47.549279999999996],[-121.99442000000002,47.54919],[-121.99440000000001,47.54912],[-121.99437,47.54904],[-121.99433,47.54896],[-121.99425000000002,47.548873],[-121.99400000000001,47.54862],[-121.99387,47.54856],[-121.99352000000002,47.548390000000005],[-121.99281,47.548030000000004],[-121.99263,47.5479],[-121.99222000000002,47.547799999999995],[-121.99185000000001,47.547792],[-121.99157000000001,47.547636999999995],[-121.99146000000002,47.54751],[-121.99132000000002,47.54744099999999],[-121.99097,47.547149],[-121.99091000000001,47.547003999999994],[-121.99071,47.54687],[-121.99058000000001,47.546859999999995],[-121.99046300000002,47.546910000000004],[-121.99015000000001,47.54743],[-121.98997,47.54756],[-121.98996000000001,47.54761],[-121.98987,47.54767999999999],[-121.98987,47.54774],[-121.98996000000001,47.54785],[-121.99014000000001,47.547928],[-121.99026000000002,47.547956],[-121.98978,47.54872],[-121.98934,47.5492],[-121.98899,47.54942],[-121.98876999999999,47.54949],[-121.98865,47.549214],[-121.98856,47.549138000000006],[-121.98768000000001,47.54904],[-121.98749000000001,47.54894],[-121.98732000000001,47.54894],[-121.9865,47.54922],[-121.985762,47.54914],[-121.98572999999999,47.54669],[-121.98635,47.546574],[-121.98655000000001,47.54669],[-121.98676,47.546755000000005],[-121.98682000000001,47.54684399999999],[-121.98703,47.546921],[-121.98728400000002,47.547039999999996],[-121.98736000000001,47.547079999999994],[-121.98743,47.547079999999994],[-121.98755000000001,47.5471],[-121.98764000000001,47.547032],[-121.98767000000001,47.54701],[-121.98767000000001,47.54694],[-121.98767000000001,47.5468],[-121.98745000000001,47.54665],[-121.98727000000001,47.54643],[-121.98723000000001,47.54638],[-121.98720100000001,47.546242],[-121.98729000000002,47.54607],[-121.98754000000001,47.545910000000006],[-121.98779,47.5458],[-121.98806,47.54575200000001],[-121.98866000000001,47.54562],[-121.98931,47.545410000000004],[-121.98977,47.54493],[-121.98985,47.544869999999996],[-121.99015400000002,47.54466599999999],[-121.99063000000001,47.544459999999994],[-121.99072100000001,47.544419999999995],[-121.99084,47.54437],[-121.99111000000002,47.54437],[-121.99122000000003,47.544200999999994],[-121.99169000000002,47.544186999999994],[-121.99170000000001,47.544106],[-121.99177,47.54403],[-121.99191800000001,47.543986],[-121.99204,47.543983],[-121.99277,47.54354],[-121.99325000000002,47.543206],[-121.99339,47.54301],[-121.99359000000001,47.54254],[-121.99340000000001,47.542549],[-121.993108,47.542570000000005],[-121.99302000000002,47.54244],[-121.99258,47.542014],[-121.99253,47.541889999999995],[-121.99239,47.541771],[-121.99215000000001,47.54167999999999],[-121.992085,47.54161],[-121.99206000000001,47.54145],[-121.99209,47.54137],[-121.99204,47.541259999999994],[-121.99187,47.54120399999999],[-121.99172000000002,47.5408],[-121.99185000000001,47.54055],[-121.99190000000002,47.54051200000001],[-121.99218,47.540476],[-121.9924,47.540382],[-121.99252000000001,47.54023],[-121.992537,47.54007],[-121.99266000000001,47.53978],[-121.99289,47.53958],[-121.993171,47.539320000000004],[-121.99333,47.53917200000001],[-121.99334,47.53916],[-121.99343,47.539136000000006],[-121.99356000000002,47.53913300000001],[-121.99371000000001,47.53911000000001],[-121.99371000000001,47.53907],[-121.99778,47.538947],[-121.99797000000001,47.538940000000004],[-121.99865000000001,47.53893000000001],[-122.00123,47.538900000000005],[-122.00123,47.53875000000001],[-122.00411000000001,47.53983],[-122.00507999999999,47.54023],[-122.00499,47.54041],[-122.00492000000001,47.54057],[-122.0049,47.54061],[-122.00486000000001,47.54073],[-122.00465000000001,47.541301],[-122.00413,47.54226],[-122.00399,47.54255500000001],[-122.00382,47.54296],[-122.00375,47.54312],[-122.00349,47.54357],[-122.003316,47.543910000000004],[-122.00322000000001,47.54414],[-122.00301,47.54456],[-122.00356000000001,47.54456],[-122.00384,47.544],[-122.00426300000002,47.544015],[-122.00553,47.54147],[-122.0056,47.54134],[-122.00733,47.541758],[-122.00835,47.541771],[-122.00833999999999,47.541908],[-122.00833999999999,47.54213000000001],[-122.00833999999999,47.543416],[-122.00927,47.543417],[-122.00955,47.542992000000005],[-122.00948,47.54223],[-122.0094,47.54191],[-122.00946,47.54181],[-122.00955,47.54167399999999],[-122.00961000000001,47.54157],[-122.00969,47.541439999999994],[-122.00979,47.54132],[-122.00989,47.54123],[-122.00992000000001,47.541199999999996],[-122.00994,47.54116],[-122.00996,47.54112],[-122.00996,47.541079999999994],[-122.00997,47.540879999999994],[-122.00996,47.540839999999996],[-122.00995,47.5408],[-122.00992400000001,47.54076],[-122.00989,47.540726],[-122.00981,47.540642],[-122.00974,47.54055],[-122.00968,47.54044],[-122.00966000000001,47.540310000000005],[-122.00981,47.54023],[-122.01006000000001,47.54019],[-122.01013,47.54018],[-122.0104,47.540088],[-122.01044,47.540074],[-122.01059000000001,47.540002],[-122.01067,47.53996],[-122.0113,47.539916000000005],[-122.01131000000001,47.54001],[-122.01139,47.54058],[-122.01147,47.541165],[-122.01227,47.541117],[-122.01234,47.541112000000005],[-122.01245,47.540330000000004],[-122.01243,47.5402],[-122.01241,47.54006],[-122.01238,47.53978],[-122.01225000000001,47.53948],[-122.01207,47.53906],[-122.01198000000001,47.53891000000001],[-122.0121,47.53881500000001],[-122.01332000000001,47.538830000000004],[-122.01408,47.53891300000001],[-122.01415000000001,47.538920000000005],[-122.01453000000001,47.538961],[-122.01457,47.538970000000006],[-122.01480000000001,47.539046],[-122.01482000000001,47.53748399999999],[-122.01499700000001,47.537478],[-122.01534799999999,47.53721],[-122.01562000000001,47.53686],[-122.01606000000001,47.53643],[-122.01628000000001,47.53602],[-122.01649,47.5356],[-122.01689,47.535270000000004],[-122.01684,47.53508],[-122.01683,47.534529],[-122.01681,47.53429],[-122.01502,47.53529],[-122.01422700000002,47.535654],[-122.01381,47.53582],[-122.01333,47.53596],[-122.01276,47.536120000000004],[-122.01215,47.536259],[-122.01163000000001,47.536362000000004],[-122.01109000000001,47.536486999999994],[-122.01072,47.536550000000005],[-122.01031,47.536590000000004],[-122.009785,47.536608],[-122.00922000000001,47.536614],[-122.00921000000001,47.53651000000001],[-122.00903,47.53651000000001],[-122.00871,47.536500000000004],[-122.00842999999999,47.536486999999994],[-122.00799,47.536446],[-122.007806,47.53642],[-122.00706000000001,47.53629],[-122.006779,47.536223],[-122.00644,47.536141],[-122.00598,47.536006],[-122.005609,47.535879],[-122.00545,47.53582],[-122.00521,47.535720000000005],[-122.00428600000001,47.53531100000001],[-122.00376999999999,47.53508],[-122.001973,47.534259999999996],[-122.00127,47.533950000000004],[-122.00089,47.53379],[-122.00001,47.53343],[-121.99971000000001,47.533321],[-121.9987,47.53296],[-121.99798000000001,47.532740000000004],[-121.99717000000001,47.532494],[-121.99677,47.53238],[-121.99573199999999,47.532109000000005],[-121.99541,47.532030000000006],[-121.99413000000001,47.531754],[-121.99289900000001,47.531530000000004],[-121.99258,47.531479999999995],[-121.99197000000001,47.53139],[-121.99124000000002,47.531295],[-121.99061000000002,47.531223999999995],[-121.98893,47.531079999999996],[-121.98877999999999,47.53107],[-121.98876999999999,47.531243999999994],[-121.98797,47.531223999999995],[-121.98798000000001,47.531025],[-121.98799000000001,47.530754],[-121.98801,47.529700000000005],[-121.98898,47.52969],[-121.98972,47.52968],[-121.98994,47.52967],[-121.99011000000002,47.52967],[-121.99031000000001,47.52969],[-121.99069000000001,47.52966],[-121.99082000000001,47.52967],[-121.99102000000002,47.52966],[-121.99133,47.529650000000004],[-121.991847,47.529686],[-121.99199100000001,47.52969],[-121.99228000000001,47.52968],[-121.99245,47.52967],[-121.99285,47.529650000000004],[-121.99321000000002,47.529683],[-121.993342,47.52969],[-121.99349000000001,47.52969],[-121.99350000000001,47.529590000000006],[-121.99351000000001,47.529472000000005],[-121.99353,47.529247],[-121.99355000000001,47.52899000000001],[-121.99406000000002,47.52253200000001],[-121.99796000000002,47.522574000000006],[-122.002959,47.52263000000001],[-122.00461000000001,47.522650000000006],[-122.00438,47.52628],[-122.00912000000001,47.526340000000005],[-122.00951,47.526340000000005],[-122.00964,47.52626],[-122.00966000000001,47.525870000000005],[-122.00969,47.52541000000001],[-122.00993,47.52079200000001],[-122.01164000000001,47.520809],[-122.01195000000001,47.520809],[-122.01222000000001,47.520810000000004],[-122.01306300000002,47.52082],[-122.01522000000001,47.520830000000004],[-122.01505,47.52476],[-122.01490700000001,47.52826],[-122.01484,47.529725000000006],[-122.01483,47.52999200000001],[-122.01483,47.53007],[-122.01483,47.530125000000005],[-122.02336999999999,47.529990000000005],[-122.02336,47.52986],[-122.02358,47.52958],[-122.02369,47.529450000000004],[-122.02394,47.52919000000001],[-122.02409,47.529050000000005],[-122.024967,47.528200000000005],[-122.02525,47.52797],[-122.02539999999999,47.527879999999996],[-122.02542,47.52786699999999],[-122.02597999999999,47.5276],[-122.02656999999999,47.52727],[-122.02678999999999,47.52714],[-122.0269,47.52706],[-122.027031,47.526944],[-122.02729000000001,47.52669],[-122.02739,47.52658],[-122.02753,47.526390000000006],[-122.02606999999999,47.52638],[-122.02593999999999,47.526382000000005],[-122.025954,47.52596500000001],[-122.02599,47.524730000000005],[-122.02556999999999,47.524730000000005],[-122.02344,47.526390000000006],[-122.02063,47.52639500000001],[-122.02063,47.52624],[-122.02063,47.52559000000001],[-122.02059,47.524533000000005],[-122.02059,47.524268],[-122.02059,47.52407],[-122.02059799999999,47.523340000000005],[-122.0206,47.522784],[-122.02066,47.52097200000001],[-122.02072,47.519439999999996],[-122.02071,47.519130000000004],[-122.02208999999999,47.519130000000004],[-122.022211,47.51544],[-122.02262,47.51544],[-122.022943,47.51544],[-122.02326000000001,47.51545],[-122.02431,47.51549],[-122.02451,47.51549],[-122.024911,47.51546],[-122.0251,47.51544],[-122.02519199999999,47.51544],[-122.02586,47.51544],[-122.02502999999999,47.514779999999995],[-122.02483,47.51460599999999],[-122.02455,47.51432],[-122.02427,47.51401],[-122.02406,47.51372],[-122.02382,47.51334],[-122.02374599999999,47.5132],[-122.02368,47.51305],[-122.02352,47.512646999999994],[-122.02345,47.51239],[-122.0234,47.51216],[-122.02335,47.511849999999995],[-122.02311,47.509099],[-122.02372999999999,47.50908],[-122.02398,47.50908],[-122.02423,47.50909],[-122.024601,47.509111000000004],[-122.02565,47.50915200000001],[-122.02574999999999,47.509130000000006],[-122.02580999999999,47.509104],[-122.02667,47.50911000000001],[-122.03106000000001,47.50912],[-122.03137,47.50918],[-122.03150000000001,47.51274],[-122.03456000000001,47.51277],[-122.036941,47.512791],[-122.03695,47.515601],[-122.04282,47.51559],[-122.04583,47.515585],[-122.04733,47.51558],[-122.04804,47.51559],[-122.05356,47.51577],[-122.05606,47.51585],[-122.05794,47.515906],[-122.05834999999999,47.51592],[-122.05834099999998,47.516202],[-122.05821,47.51953],[-122.06404,47.51958],[-122.06741000000001,47.51961],[-122.06762000000002,47.51961],[-122.06826000000001,47.519619999999996],[-122.06872999999999,47.519619999999996],[-122.06914,47.51962699999999],[-122.06925000000001,47.519619999999996],[-122.06952500000001,47.519620999999994],[-122.06976,47.51962399999999],[-122.06997,47.519971],[-122.07018,47.520326000000004],[-122.07011,47.52038],[-122.07019,47.52038],[-122.07022,47.52044],[-122.07025,47.52056],[-122.07025,47.52067],[-122.07024,47.520790000000005],[-122.07022,47.52091000000001],[-122.07016999999999,47.52104],[-122.07007999999999,47.521170000000005],[-122.07002,47.52125],[-122.069995,47.52129],[-122.06987,47.5214],[-122.07015,47.5214],[-122.07012999999999,47.522650000000006],[-122.0701,47.52317000000001],[-122.07275999999999,47.52317600000001],[-122.07283999999999,47.51963],[-122.07936999999998,47.519639999999995],[-122.07946999999999,47.519639999999995],[-122.07934999999999,47.525420000000004],[-122.07925,47.529723000000004],[-122.07924,47.53031000000001],[-122.07659,47.53031000000001],[-122.07651,47.533],[-122.07648999999999,47.5334],[-122.07636999999998,47.53755],[-122.07572999999998,47.53755],[-122.07372,47.537566],[-122.07362,47.541304],[-122.07359,47.542100000000005],[-122.07096,47.542100000000005],[-122.07094,47.542550000000006],[-122.07189,47.542550000000006],[-122.07357999999999,47.54255200000001],[-122.0735,47.54481],[-122.06825,47.544805999999994],[-122.06824,47.54544],[-122.06842999999999,47.545550000000006],[-122.06958,47.54625],[-122.06979,47.5464],[-122.06993,47.546510000000005],[-122.07015,47.54669],[-122.07029999999999,47.546839],[-122.07034999999999,47.54688399999999],[-122.07882999999998,47.54683],[-122.07886999999998,47.548266],[-122.08054,47.54828],[-122.08142000000001,47.54829],[-122.08236999999998,47.548300000000005],[-122.08324,47.548304],[-122.08344,47.548306000000004],[-122.08389,47.548311000000005],[-122.08418,47.548311000000005],[-122.08418,47.54847],[-122.084235,47.55179999999999],[-122.08611,47.551829999999995],[-122.09206,47.551939999999995],[-122.09483,47.551989999999996],[-122.0948,47.55014],[-122.09481000000001,47.550079999999994],[-122.0948,47.550018],[-122.09476000000001,47.548446],[-122.09762000000002,47.548483],[-122.09997,47.54849],[-122.10018,47.548493],[-122.10046999999999,47.54849],[-122.10046999999999,47.54858],[-122.10046999999999,47.548925000000004],[-122.10045,47.550059999999995],[-122.10041,47.551035],[-122.10041,47.552865],[-122.10049,47.553716],[-122.10054,47.554199999999994]],[[-121.995455,47.55117],[-121.99512000000001,47.55111],[-121.99490000000002,47.551173],[-121.99469000000002,47.55119],[-121.99469000000002,47.55153],[-121.99480000000001,47.55153],[-121.99543,47.55141],[-121.99553,47.551249999999996],[-121.995455,47.55117]],[[-122.03565,47.52484],[-122.03407,47.524823],[-122.03399,47.52646],[-122.03558,47.52648],[-122.03565,47.52484]],[[-122.02976199999999,47.53442],[-122.02914,47.53403],[-122.02832,47.533530000000006],[-122.02761000000001,47.533120000000004],[-122.02713,47.532862],[-122.027,47.532790000000006],[-122.02672999999999,47.532666],[-122.02656,47.532590000000006],[-122.0264,47.53253000000001],[-122.02624,47.53247],[-122.0261,47.532422000000004],[-122.02596999999999,47.53239000000001],[-122.02578999999999,47.532340000000005],[-122.02526,47.53222],[-122.02521,47.532360000000004],[-122.02507999999999,47.53269],[-122.02485,47.532700000000006],[-122.02485,47.53368],[-122.02575999999999,47.53365],[-122.02577999999998,47.53668],[-122.02578999999999,47.53721],[-122.02579999999999,47.53732],[-122.02798,47.53734],[-122.02968,47.537351],[-122.02969999999999,47.53684],[-122.02972199999999,47.53598],[-122.02972999999999,47.535720000000005],[-122.02974999999999,47.535000000000004],[-122.02976199999999,47.53442]]]},"name":"Issaquah"},{"boundary":{"type":"Polygon","coordinates":[[[-122.45968,47.676199000000004],[-122.4595,47.67762],[-122.45938,47.67871000000001],[-122.4593,47.679770000000005],[-122.45916000000001,47.68064],[-122.45904,47.68178399999999],[-122.4589,47.682320000000004],[-122.45864,47.683110000000006],[-122.45833999999999,47.68377],[-122.45818,47.684079999999994],[-122.45716000000002,47.686063999999995],[-122.45628,47.687642999999994],[-122.4559,47.688246],[-122.45286999999999,47.69389],[-122.450936,47.697500000000005],[-122.44987,47.69950000000001],[-122.44797700000001,47.70271100000001],[-122.44624000000002,47.70568],[-122.44534,47.70691000000001],[-122.44489000000002,47.707228],[-122.44416000000002,47.70784],[-122.44199000000002,47.70946],[-122.44119000000002,47.71007],[-122.43859,47.71196],[-122.43658,47.71453],[-122.43588,47.71747],[-122.43516000000001,47.721540000000005],[-122.43476000000001,47.724920000000004],[-122.43443,47.726366000000006],[-122.43406000000002,47.72796],[-122.43362000000002,47.72945000000001],[-122.43328300000002,47.730581],[-122.4329,47.73128],[-122.43276,47.731590000000004],[-122.43256000000001,47.731924],[-122.43218,47.73255000000001],[-122.432,47.732804],[-122.3812,47.7338],[-122.37494,47.73391900000001],[-122.37437599999998,47.733920000000005],[-122.37241999999999,47.73393000000001],[-122.36195900000001,47.734140000000004],[-122.36093,47.734139000000006],[-122.35916999999999,47.73413600000001],[-122.35556999999999,47.73413000000001],[-122.35426000000001,47.734128000000005],[-122.35304,47.734128000000005],[-122.35176999999999,47.734128000000005],[-122.35051,47.734128000000005],[-122.3478,47.734127],[-122.3463,47.734127],[-122.345211,47.734127],[-122.3451,47.734127],[-122.34499000000001,47.734127],[-122.34400000000001,47.734128000000005],[-122.34342000000001,47.734128000000005],[-122.34239,47.73413000000001],[-122.34134,47.73413000000001],[-122.34103,47.73413000000001],[-122.34074,47.73413000000001],[-122.33969,47.734131000000005],[-122.33863,47.73413000000001],[-122.33807999999999,47.73413000000001],[-122.33698,47.73413300000001],[-122.33592999999999,47.734134000000005],[-122.33555,47.734134000000005],[-122.33532999999998,47.734134000000005],[-122.33428,47.73413000000001],[-122.33375,47.73413000000001],[-122.33303,47.734125000000006],[-122.33158,47.73411000000001],[-122.33023,47.734100000000005],[-122.32887999999998,47.73409],[-122.32637999999999,47.73407],[-122.32622,47.73407],[-122.32565,47.73407],[-122.32531999999999,47.734062],[-122.32525,47.73406],[-122.32498,47.73406],[-122.32473399999999,47.73406],[-122.32452,47.73406],[-122.32446,47.73406],[-122.32359,47.734052000000005],[-122.32222,47.73404],[-122.32079999999999,47.734030000000004],[-122.31812000000001,47.734001],[-122.31676,47.733990000000006],[-122.31544,47.73397000000001],[-122.31275,47.73395000000001],[-122.31005,47.73391900000001],[-122.30869999999999,47.733900000000006],[-122.30803999999999,47.733896],[-122.30733,47.73389],[-122.30617,47.73388],[-122.30599,47.733874],[-122.304844,47.73386],[-122.304574,47.73386],[-122.3036,47.733850000000004],[-122.30195,47.733830000000005],[-122.30059,47.73382],[-122.29923000000001,47.733810000000005],[-122.29788,47.733790000000006],[-122.29652000000002,47.733784],[-122.29531,47.73377000000001],[-122.29516000000001,47.73377000000001],[-122.29469000000002,47.73377000000001],[-122.29381000000001,47.733760000000004],[-122.29243,47.73375000000001],[-122.291098,47.733740000000004],[-122.28975,47.73373000000001],[-122.28842999999999,47.73373000000001],[-122.28705000000001,47.733720000000005],[-122.28671,47.733720000000005],[-122.28632,47.73373000000001],[-122.28596,47.73373000000001],[-122.28586999999999,47.733720000000005],[-122.2858,47.73368],[-122.28489,47.73366],[-122.2848,47.73366],[-122.28461000000001,47.733650000000004],[-122.28447,47.733650000000004],[-122.28353,47.73361200000001],[-122.28195000000001,47.733610000000006],[-122.26981,47.733477],[-122.26974,47.73312000000001],[-122.26859,47.72737000000001],[-122.26844,47.726620000000004],[-122.2684,47.726400000000005],[-122.26719000000001,47.71916],[-122.26714000000001,47.71882],[-122.26114000000001,47.708020000000005],[-122.25974,47.70599000000001],[-122.25874999999999,47.704544],[-122.254136,47.69782],[-122.24393,47.692220000000006],[-122.23183,47.69012000000001],[-122.23058,47.684915000000004],[-122.22623,47.666920000000005],[-122.23143,47.664120000000004],[-122.23803,47.65922],[-122.24026000000002,47.6577],[-122.25572999999999,47.64712],[-122.259087,47.640375000000006],[-122.25912000000001,47.640299],[-122.26005,47.636990000000004],[-122.26142000000002,47.632008000000006],[-122.26353,47.624320000000004],[-122.26419000000001,47.62115000000001],[-122.26572999999999,47.61362],[-122.26763000000001,47.601521],[-122.26784,47.597073],[-122.26813,47.590821],[-122.26815,47.590039000000004],[-122.26815,47.58996],[-122.26815,47.58983],[-122.26816000000001,47.58953],[-122.26814,47.589314],[-122.26574,47.583974],[-122.26475,47.58175],[-122.26213,47.57592],[-122.25450000000001,47.56685],[-122.25202999999999,47.56392],[-122.25003,47.562521000000004],[-122.24403000000001,47.55962099999999],[-122.24093,47.55542],[-122.24150900000002,47.55357],[-122.24283,47.54932],[-122.24528000000001,47.54564],[-122.24882000000001,47.540302000000004],[-122.24973,47.538920000000005],[-122.24971000000001,47.53851300000001],[-122.24969000000002,47.53813900000001],[-122.24965400000002,47.537510000000005],[-122.24933,47.531819999999996],[-122.24073,47.522921000000004],[-122.23807,47.52132],[-122.23323,47.51842],[-122.22603,47.51242],[-122.22443,47.50942],[-122.23529,47.509510000000006],[-122.23623300000001,47.50952],[-122.23705000000001,47.50952],[-122.23819,47.50952],[-122.23822000000001,47.509530000000005],[-122.23832999999999,47.50954],[-122.23842,47.509544],[-122.23881,47.509530000000005],[-122.23892000000001,47.50956],[-122.24115000000002,47.50959],[-122.24156900000003,47.5096],[-122.24303,47.5096],[-122.24329000000002,47.509547],[-122.24331000000001,47.50969],[-122.24373,47.509709],[-122.24425400000003,47.50959],[-122.24504,47.50965],[-122.245387,47.509710000000005],[-122.24559,47.50971800000001],[-122.24579,47.509730000000005],[-122.24712000000002,47.509658],[-122.24694000000001,47.50923],[-122.24694000000001,47.509150000000005],[-122.24690000000001,47.50908],[-122.24683,47.509015000000005],[-122.24674,47.508970000000005],[-122.24697,47.508210000000005],[-122.24611000000002,47.50727],[-122.24604000000001,47.50616],[-122.24614000000001,47.505426],[-122.24629000000002,47.505249],[-122.2455,47.503814],[-122.24555000000001,47.503530000000005],[-122.24563,47.50306],[-122.24721000000002,47.503073],[-122.24802000000001,47.50308],[-122.248,47.503550000000004],[-122.24793900000002,47.50638],[-122.24810000000001,47.50638],[-122.24878,47.50638],[-122.24879,47.506278],[-122.24879,47.50626],[-122.24879,47.506116000000006],[-122.24881,47.50479],[-122.24882000000001,47.50413],[-122.24882000000001,47.504020999999995],[-122.24883,47.503838],[-122.248839,47.503076],[-122.24884,47.502995000000006],[-122.24564400000001,47.502953000000005],[-122.24496000000002,47.502944],[-122.243131,47.50291000000001],[-122.24238,47.502904],[-122.24125000000002,47.50289],[-122.24082000000001,47.50288],[-122.24083,47.502230000000004],[-122.24084,47.50147],[-122.24086000000001,47.49963],[-122.24086000000001,47.499570000000006],[-122.24087,47.49924],[-122.24158000000001,47.49925],[-122.24592000000001,47.499306000000004],[-122.24863,47.49933000000001],[-122.24963000000001,47.499340000000004],[-122.24975,47.499711000000005],[-122.25017,47.5011],[-122.25026000000001,47.5014],[-122.25035,47.5017],[-122.25051,47.502219000000004],[-122.25062000000001,47.50251900000001],[-122.250734,47.502720000000004],[-122.25081,47.50283],[-122.25141,47.5028],[-122.25164000000001,47.50282],[-122.25362000000001,47.50273000000001],[-122.25951,47.50254],[-122.25953,47.501306],[-122.25955,47.500150000000005],[-122.25961000000001,47.497350000000004],[-122.25964,47.495990000000006],[-122.25964,47.4956],[-122.26408,47.495551000000006],[-122.26427000000001,47.49557000000001],[-122.26485000000001,47.495560000000005],[-122.26537799999998,47.495610000000006],[-122.26694,47.495610000000006],[-122.26853,47.4956],[-122.26941000000001,47.49564],[-122.26981900000001,47.49564],[-122.27029999999999,47.495650000000005],[-122.27029999999999,47.496030000000005],[-122.270294,47.49635000000001],[-122.27029,47.496570000000006],[-122.27028,47.497],[-122.27028,47.497059],[-122.27028,47.497327],[-122.27027,47.49758],[-122.27023,47.50028],[-122.27032999999999,47.5003],[-122.27045,47.50027],[-122.27059,47.50028],[-122.270671,47.5003],[-122.27074999999999,47.50081],[-122.27069999999999,47.500826999999994],[-122.27085,47.501459999999994],[-122.27086999999999,47.50155],[-122.27089,47.501613],[-122.27078999999999,47.50159],[-122.27026000000001,47.50147],[-122.2702,47.50263],[-122.27017,47.503177],[-122.27017,47.504475],[-122.27016,47.5049],[-122.27016,47.505100000000006],[-122.27014,47.50609],[-122.27014,47.50658],[-122.27012,47.507025],[-122.27008699999999,47.50878],[-122.27006999999999,47.50954],[-122.270069,47.50966],[-122.27155,47.5097],[-122.27408,47.509750000000004],[-122.27541,47.50978],[-122.27541,47.50963],[-122.27542,47.50893000000001],[-122.27542999999999,47.507142],[-122.27542999999999,47.506930000000004],[-122.27576999999998,47.507006999999994],[-122.27606999999999,47.507130000000004],[-122.276241,47.50723],[-122.27708,47.50777],[-122.27722000000001,47.507839999999995],[-122.27739,47.507892],[-122.27754,47.507936],[-122.2777,47.507966999999994],[-122.27789,47.507992],[-122.27823,47.50799],[-122.27833999999999,47.50799],[-122.27837999999998,47.50887],[-122.27852999999999,47.509577],[-122.27853999999999,47.50981],[-122.28245,47.510023],[-122.28304,47.51004],[-122.28344,47.510055],[-122.28374,47.510059999999996],[-122.28486000000001,47.51015],[-122.28576999999999,47.510220999999994],[-122.28625000000001,47.51022],[-122.28768000000001,47.510193],[-122.29136900000002,47.51015],[-122.29133,47.510838],[-122.29132000000001,47.51162699999999],[-122.29131000000001,47.51341],[-122.29131000000001,47.51359],[-122.2913,47.51367],[-122.2913,47.51374],[-122.2913,47.51387999999999],[-122.29129000000002,47.514889999999994],[-122.29126000000002,47.517936],[-122.29126000000002,47.518510000000006],[-122.29126000000002,47.519259999999996],[-122.29126000000002,47.51996],[-122.29127000000001,47.5214],[-122.29124000000002,47.52149],[-122.291278,47.52156],[-122.29127000000001,47.52290000000001],[-122.29126000000002,47.52411000000001],[-122.29127000000001,47.52438],[-122.29134,47.52438],[-122.29178,47.524394],[-122.29335,47.52442],[-122.29363000000001,47.52442],[-122.29387,47.52442],[-122.29398400000001,47.52442],[-122.29994,47.52456],[-122.30002999999999,47.524577],[-122.3003,47.52458],[-122.30056,47.52458],[-122.30181,47.52459],[-122.30054,47.52512000000001],[-122.30051,47.52517000000001],[-122.30049,47.52521000000001],[-122.30027,47.52541000000001],[-122.30014,47.52577000000001],[-122.30035,47.52653000000001],[-122.30092,47.52769],[-122.30119,47.52875000000001],[-122.30142000000001,47.529385000000005],[-122.30229,47.53005],[-122.30278999999999,47.530225],[-122.303502,47.530530000000006],[-122.30488799999999,47.53118],[-122.304981,47.53127],[-122.30516999999999,47.53132],[-122.30529,47.53141],[-122.30542999999999,47.531530000000004],[-122.305517,47.531715000000005],[-122.30714,47.53173],[-122.30842999999999,47.53173],[-122.30892,47.53174],[-122.30918,47.53174],[-122.31328,47.53177],[-122.31681,47.53177],[-122.317958,47.53177],[-122.31803,47.531765],[-122.31835,47.531766],[-122.31845,47.531762],[-122.31853,47.53176],[-122.31851,47.53114],[-122.31846,47.53047],[-122.318453,47.52977800000001],[-122.31844099999999,47.52939000000001],[-122.31757,47.529410000000006],[-122.31757,47.52917000000001],[-122.31757,47.529026],[-122.31759000000001,47.528825000000005],[-122.31760000000001,47.528549000000005],[-122.31755000000001,47.52821000000001],[-122.31748,47.52817100000001],[-122.31490000000001,47.527370000000005],[-122.31472000000001,47.52732],[-122.31282999999999,47.52682],[-122.31264,47.52678],[-122.311887,47.52658],[-122.31184,47.526557000000004],[-122.31172400000001,47.526485],[-122.31161000000002,47.526360000000004],[-122.31143,47.526182000000006],[-122.31108,47.525760000000005],[-122.31044,47.52533000000001],[-122.30971,47.52429],[-122.30981,47.523950000000006],[-122.3096,47.52329],[-122.309651,47.52308],[-122.30972,47.522403000000004],[-122.30968,47.52218500000001],[-122.30976,47.52217000000001],[-122.31013,47.52214000000001],[-122.31099,47.522146000000006],[-122.31336,47.52213000000001],[-122.313516,47.52215000000001],[-122.31367,47.522183000000005],[-122.31427000000001,47.522183000000005],[-122.31489,47.52219100000001],[-122.31498,47.522197000000006],[-122.31511,47.52221000000001],[-122.31586,47.52221000000001],[-122.31602000000001,47.522220000000004],[-122.31766000000002,47.522222000000006],[-122.31769000000001,47.52131000000001],[-122.31769000000001,47.52102],[-122.3177,47.520627],[-122.31771,47.52048],[-122.31771,47.5202],[-122.31771,47.52006],[-122.31772000000001,47.51987999999999],[-122.31773,47.519151],[-122.31773,47.518754],[-122.31813,47.518727],[-122.318413,47.518724],[-122.3186,47.518722000000004],[-122.32014,47.518710000000006],[-122.320343,47.518710000000006],[-122.32129,47.518716000000005],[-122.32161,47.518710000000006],[-122.32314,47.51871800000001],[-122.32374999999999,47.5187],[-122.32509999999999,47.518674],[-122.32587999999998,47.51869],[-122.32587999999998,47.52023200000001],[-122.32587999999998,47.520920000000004],[-122.3279,47.520921],[-122.32959,47.52091000000001],[-122.330073,47.52091000000001],[-122.3306,47.520970000000005],[-122.33082999999999,47.52098],[-122.33097,47.520990000000005],[-122.32995,47.519552000000004],[-122.32982,47.518892],[-122.32973999999999,47.518508000000004],[-122.32956999999999,47.51811800000001],[-122.32951,47.517979999999994],[-122.3295,47.51763999999999],[-122.3295,47.51755],[-122.329422,47.517498999999994],[-122.32918,47.517219999999995],[-122.32916999999999,47.51715],[-122.32884999999999,47.51675],[-122.32870999999999,47.516593],[-122.32864,47.5165],[-122.32729,47.51393],[-122.32815,47.51393],[-122.32852999999999,47.51393],[-122.33023,47.51393],[-122.33029,47.51403],[-122.33059,47.51454],[-122.33097,47.51494399999999],[-122.33115000000001,47.515121],[-122.3335,47.51469099999999],[-122.33349,47.5145],[-122.33435300000001,47.5145],[-122.33425000000001,47.5139],[-122.33570999999999,47.513923],[-122.33651,47.513914],[-122.336645,47.51391],[-122.33704,47.513889999999996],[-122.33712000000001,47.51502],[-122.337444,47.51701],[-122.33748,47.517258],[-122.33754,47.51725999999999],[-122.33793,47.517258],[-122.33991,47.517269999999996],[-122.340134,47.51727999999999],[-122.34045,47.517239999999994],[-122.34075,47.517219999999995],[-122.34144,47.51727999999999],[-122.34161000000002,47.51727999999999],[-122.34287799999998,47.517289999999996],[-122.34387,47.517289999999996],[-122.34415000000001,47.51729399999999],[-122.34464000000001,47.517298999999994],[-122.34543,47.5173],[-122.3467,47.51731],[-122.347972,47.51732],[-122.348017,47.51732],[-122.34925000000001,47.51732],[-122.35065,47.51733],[-122.35172999999999,47.517339],[-122.35177999999999,47.517339],[-122.35291,47.51736],[-122.3534,47.51737],[-122.35404,47.517374],[-122.35516999999999,47.517379999999996],[-122.35611,47.51739],[-122.35651,47.517382],[-122.35786,47.51736],[-122.35822999999999,47.51735],[-122.35856,47.51735],[-122.35856,47.515530000000005],[-122.35918,47.515530000000005],[-122.36049,47.515530000000005],[-122.36054,47.516819999999996],[-122.36054,47.51736],[-122.36113,47.51736],[-122.36185,47.51736],[-122.36262,47.51736],[-122.36323,47.51736],[-122.36457,47.51736],[-122.36591,47.51736],[-122.36728000000001,47.517379999999996],[-122.36769000000001,47.51738099999999],[-122.36866,47.51739],[-122.3714,47.51742399999999],[-122.37132,47.51665],[-122.37127,47.516076],[-122.37127,47.516023999999994],[-122.37126,47.51574],[-122.37115,47.51445999999999],[-122.3711,47.5137],[-122.37107999999999,47.51333],[-122.37102,47.512550000000005],[-122.371,47.51229],[-122.37097999999999,47.51205],[-122.37088999999999,47.510038],[-122.37086,47.50946],[-122.37087999999999,47.508199000000005],[-122.37086199999999,47.50802],[-122.37070999999999,47.507259999999995],[-122.37052999999999,47.50666],[-122.37046,47.506409],[-122.370464,47.5064],[-122.37038999999999,47.505821],[-122.37039999999999,47.505686],[-122.37044999999999,47.505503000000004],[-122.37046999999998,47.5054],[-122.37053999999999,47.50513000000001],[-122.37055,47.50452],[-122.37056,47.50387],[-122.3706,47.503679999999996],[-122.37069,47.503510000000006],[-122.37092,47.50324],[-122.37141,47.502778000000006],[-122.37204999999999,47.502182000000005],[-122.37226,47.502010000000006],[-122.37312,47.50138],[-122.37379999999999,47.500834],[-122.37392,47.5007],[-122.37396999999999,47.50058],[-122.37406,47.49992],[-122.37413,47.499617],[-122.37427799999999,47.499221],[-122.37485,47.497659],[-122.37492,47.4975],[-122.37501999999999,47.49732],[-122.37506999999998,47.49725],[-122.37521,47.49703],[-122.37531199999998,47.49687],[-122.37565,47.496430000000004],[-122.38013,47.493203],[-122.38181,47.491912000000006],[-122.39924,47.48522],[-122.40884,47.481719999999996],[-122.40968000000001,47.486365],[-122.415,47.496050000000004],[-122.41557,47.497105000000005],[-122.41675000000001,47.499293],[-122.41750000000002,47.50067],[-122.42345,47.50833000000001],[-122.4252,47.51059],[-122.42658,47.512214],[-122.43086000000001,47.516593],[-122.43344,47.519233],[-122.43718000000001,47.52293200000001],[-122.43944,47.52565800000001],[-122.44162000000003,47.529090000000004],[-122.44324000000002,47.53264],[-122.44357000000001,47.533350000000006],[-122.44452300000003,47.53638],[-122.44510000000001,47.539832000000004],[-122.44515000000001,47.541802999999994],[-122.44515000000001,47.54185999999999],[-122.44509000000001,47.544578],[-122.44483000000001,47.54743],[-122.44446600000002,47.551382999999994],[-122.44443000000001,47.55267],[-122.44439000000001,47.554022999999994],[-122.44459000000002,47.55576],[-122.44485000000002,47.55643],[-122.44524000000001,47.55743999999999],[-122.44602000000002,47.55889],[-122.44730400000002,47.56091000000001],[-122.44808,47.56210000000001],[-122.44842000000001,47.56264],[-122.44865000000001,47.56298],[-122.44874,47.563120000000005],[-122.4497,47.56462],[-122.45074,47.56624],[-122.45158,47.5674],[-122.45248,47.568404],[-122.45338,47.56956],[-122.45415000000001,47.571059],[-122.45461000000002,47.572230000000005],[-122.45481000000001,47.57336],[-122.45481000000001,47.57389],[-122.45460000000001,47.57457],[-122.45401000000001,47.576431],[-122.45395,47.576609],[-122.453818,47.57703],[-122.45373,47.577293],[-122.45016000000001,47.588522000000005],[-122.44770000000001,47.595560000000006],[-122.44680000000001,47.59813500000001],[-122.44774000000001,47.614765],[-122.44953000000001,47.61765],[-122.45289,47.622656000000006],[-122.45475,47.626204],[-122.45475,47.62709],[-122.45469000000001,47.627970000000005],[-122.45449,47.62911000000001],[-122.45435,47.629627],[-122.454171,47.630247],[-122.45391000000001,47.63139],[-122.45345,47.632628000000004],[-122.45319500000001,47.63367],[-122.45293,47.634916000000004],[-122.45273999999999,47.636351000000005],[-122.45255,47.63811000000001],[-122.45255,47.63876500000001],[-122.45255,47.639790000000005],[-122.45261,47.64208],[-122.45281,47.64402],[-122.453,47.64555000000001],[-122.45310300000001,47.646268],[-122.45325700000001,47.647310000000004],[-122.45359,47.64924],[-122.45397,47.65082399999999],[-122.45445000000001,47.65265],[-122.45463000000001,47.65349],[-122.45501,47.65461],[-122.45546999999999,47.655836],[-122.455927,47.657148],[-122.45645,47.65841],[-122.45709000000001,47.66001000000001],[-122.4578,47.661970000000004],[-122.45825,47.663343000000005],[-122.45858,47.664381],[-122.45904,47.666470000000004],[-122.459437,47.66848],[-122.45955900000001,47.66953900000001],[-122.45962000000002,47.67112],[-122.45962000000002,47.672697],[-122.4597,47.67427],[-122.45968,47.676199000000004]]]},"name":"Seattle"},{"boundary":{"type":"Polygon","coordinates":[[[-122.17603999999999,47.75708899999999],[-122.17595999999999,47.757345],[-122.17568999999999,47.75738],[-122.17538999999998,47.75732],[-122.17522999999998,47.75725],[-122.17516999999998,47.75721],[-122.17509999999999,47.757176],[-122.17499,47.75712],[-122.17482,47.757085999999994],[-122.17459,47.75707],[-122.17459,47.757306],[-122.17459,47.7575],[-122.17457999999999,47.75788099999999],[-122.17457999999999,47.75808],[-122.17457999999999,47.75817000000001],[-122.17457999999999,47.758320000000005],[-122.1745,47.75831000000001],[-122.17340999999999,47.758160000000004],[-122.17256999999998,47.758030000000005],[-122.17188999999999,47.75795],[-122.17117999999999,47.7579],[-122.16999,47.757799999999996],[-122.16915900000001,47.75776],[-122.167598,47.757833],[-122.16703,47.757915000000004],[-122.16629999999999,47.75811000000001],[-122.16613,47.758190000000006],[-122.16606,47.758190000000006],[-122.16570999999999,47.758190000000006],[-122.16414,47.758230000000005],[-122.16393,47.75829],[-122.16395,47.758230000000005],[-122.1635,47.75824],[-122.16328,47.75824],[-122.16328,47.758320000000005],[-122.16329,47.75851000000001],[-122.16331,47.75888],[-122.163365,47.759930000000004],[-122.1634,47.760644],[-122.16342,47.761161],[-122.16342999999999,47.76131000000001],[-122.16345,47.76167],[-122.1636,47.76167],[-122.16574999999999,47.761688],[-122.16635,47.76169],[-122.166424,47.76529000000001],[-122.16376,47.76527000000001],[-122.16382,47.76539000000001],[-122.16384,47.765440000000005],[-122.16393,47.765589000000006],[-122.16396,47.76563300000001],[-122.16409,47.765800000000006],[-122.16452000000001,47.76634000000001],[-122.16492000000001,47.76683800000001],[-122.16529999999999,47.76733000000001],[-122.1659,47.768080000000005],[-122.16636,47.768668000000005],[-122.16646999999999,47.768890000000006],[-122.16649,47.76900200000001],[-122.16651,47.76919000000001],[-122.16652300000001,47.76935400000001],[-122.16657,47.77039800000001],[-122.16657,47.77046],[-122.16657,47.77064],[-122.16658,47.77074],[-122.16661,47.771468],[-122.16663,47.772090000000006],[-122.16664,47.77251000000001],[-122.16667,47.77328],[-122.16667,47.773360000000004],[-122.16669999999999,47.774370000000005],[-122.16669999999999,47.77468699999999],[-122.16671,47.77510300000001],[-122.16672999999999,47.775766000000004],[-122.16673999999999,47.77593500000001],[-122.16675,47.776249],[-122.1641,47.77622],[-122.164097,47.77622],[-122.16403,47.77622],[-122.16235999999999,47.776208000000004],[-122.16207999999999,47.776210000000006],[-122.16126000000001,47.7762],[-122.16072,47.7762],[-122.15956,47.776204],[-122.15874399999998,47.77622],[-122.15867999999999,47.77622],[-122.1582,47.776210000000006],[-122.15754,47.776210000000006],[-122.15722000000001,47.776210000000006],[-122.15708,47.776210000000006],[-122.15691,47.776208000000004],[-122.15580999999999,47.776210000000006],[-122.15516999999998,47.776210000000006],[-122.15504999999999,47.77622],[-122.15476,47.776163000000004],[-122.154616,47.77613000000001],[-122.15446999999999,47.77610800000001],[-122.1542,47.776050000000005],[-122.15406,47.776024],[-122.15392999999999,47.776019000000005],[-122.15378999999999,47.776024],[-122.15364,47.77602],[-122.15314,47.77602],[-122.15286599999999,47.77602],[-122.15176999999998,47.776019000000005],[-122.14801,47.775977000000005],[-122.14554,47.77595000000001],[-122.14272,47.775920000000006],[-122.13501,47.775830000000006],[-122.13292999999999,47.77581000000001],[-122.13199,47.77579800000001],[-122.13183,47.775800000000004],[-122.13083999999999,47.77579000000001],[-122.12624,47.77573900000001],[-122.12512,47.77572800000001],[-122.12499,47.77573000000001],[-122.12392,47.77572000000001],[-122.12234999999998,47.77570000000001],[-122.12122000000001,47.775690000000004],[-122.12112,47.775690000000004],[-122.118601,47.77566],[-122.11838999999999,47.77566],[-122.11641,47.77566],[-122.11298,47.77566],[-122.11296,47.77566],[-122.11296,47.775461],[-122.11296999999999,47.77497],[-122.11296999999999,47.774194],[-122.11296999999999,47.773270000000004],[-122.11296,47.772169000000005],[-122.11295,47.77145],[-122.112944,47.771025],[-122.11292999999999,47.770390000000006],[-122.112944,47.76977000000001],[-122.11292999999999,47.76873000000001],[-122.11363,47.76873000000001],[-122.11359,47.76868],[-122.113582,47.76850000000001],[-122.11356,47.76840000000001],[-122.1135,47.76825000000001],[-122.11346,47.76817000000001],[-122.11336,47.76802000000001],[-122.11323,47.767828],[-122.11319,47.767720000000004],[-122.113155,47.76756],[-122.11315,47.76747],[-122.11315,47.76718],[-122.11317,47.766980000000004],[-122.11321000000001,47.76662],[-122.11322000000001,47.76661000000001],[-122.11319,47.76599000000001],[-122.113207,47.765600000000006],[-122.11319,47.76510000000001],[-122.11303,47.765110000000014],[-122.11240199999999,47.765113000000014],[-122.111984,47.76510700000001],[-122.11160000000001,47.76510100000001],[-122.11160000000001,47.764812000000006],[-122.11157,47.763721000000004],[-122.11157,47.76291000000001],[-122.11156000000001,47.762841],[-122.11156000000001,47.76283000000001],[-122.11156000000001,47.76281900000001],[-122.11156000000001,47.76280800000001],[-122.11156000000001,47.762800000000006],[-122.11156000000001,47.76279000000001],[-122.11156000000001,47.76278000000001],[-122.11156000000001,47.762766000000006],[-122.11155000000001,47.76275000000001],[-122.11155000000001,47.76274000000001],[-122.11155000000001,47.76273000000001],[-122.11154,47.76272300000001],[-122.11154,47.76271000000001],[-122.11153,47.76270000000001],[-122.11153,47.762690000000006],[-122.11152000000001,47.762682000000005],[-122.11152000000001,47.76267000000001],[-122.11151000000001,47.762660000000004],[-122.11150900000001,47.76265000000001],[-122.1115,47.762640000000005],[-122.1115,47.762631000000006],[-122.11149,47.762620000000005],[-122.11148,47.76261000000001],[-122.11148,47.762600000000006],[-122.11147,47.76259000000001],[-122.11146000000001,47.76258000000001],[-122.11145,47.76257000000001],[-122.11144,47.76256000000001],[-122.11143,47.76256000000001],[-122.11143,47.762547000000005],[-122.11142000000001,47.76254000000001],[-122.11141,47.76253000000001],[-122.1114,47.76252000000001],[-122.11139,47.762512000000015],[-122.11138,47.76250400000001],[-122.11137,47.76250000000001],[-122.11136,47.76249000000001],[-122.11134,47.762480000000004],[-122.11132,47.762465000000006],[-122.1113,47.76245000000001],[-122.11129000000001,47.762440000000005],[-122.11127,47.762440000000005],[-122.11126000000002,47.76243000000001],[-122.11125000000001,47.762423000000005],[-122.11124000000001,47.762417000000006],[-122.11121000000001,47.76241000000001],[-122.11120000000001,47.76240000000001],[-122.11119000000001,47.76239000000001],[-122.11118,47.76238600000001],[-122.11116000000001,47.76238000000001],[-122.11115000000001,47.76237200000001],[-122.11114,47.76236000000001],[-122.11113,47.76236000000001],[-122.11112000000001,47.76235000000001],[-122.11111000000001,47.76234000000001],[-122.11110000000001,47.762332000000015],[-122.11109,47.76232000000001],[-122.11108,47.762310000000014],[-122.11106600000001,47.762310000000014],[-122.11106000000001,47.76229800000001],[-122.11105,47.76229000000001],[-122.11104,47.762281],[-122.11103,47.76227000000001],[-122.11102000000001,47.762260000000005],[-122.11101000000001,47.76225000000001],[-122.111,47.762243000000005],[-122.11099,47.76223000000001],[-122.11099,47.762220000000006],[-122.11098,47.76221000000001],[-122.11097,47.762204000000004],[-122.11097,47.76219400000001],[-122.11096,47.76218000000001],[-122.11095,47.76217000000001],[-122.110948,47.76216300000001],[-122.11094,47.76215300000001],[-122.11094,47.76214300000001],[-122.11093,47.76213000000001],[-122.11093,47.76212200000001],[-122.11092000000001,47.76211100000001],[-122.11092000000001,47.76210000000001],[-122.110916,47.76209000000001],[-122.11091,47.76207900000001],[-122.110858,47.76177800000001],[-122.11088,47.76155500000001],[-122.11089,47.76151000000001],[-122.11092500000001,47.761463],[-122.11167,47.76147],[-122.11243999999999,47.76148],[-122.11543999999999,47.761514000000005],[-122.11555,47.76151000000001],[-122.11715000000001,47.76153000000001],[-122.11716000000001,47.76052000000001],[-122.117177,47.760204],[-122.11721000000001,47.759727],[-122.11722200000001,47.75967],[-122.11729000000001,47.75954],[-122.11743,47.75939],[-122.11752000000001,47.75932],[-122.1178,47.75916],[-122.1182,47.758956000000005],[-122.11894,47.758603],[-122.1194,47.758370000000006],[-122.11982,47.758174000000004],[-122.11995,47.758120000000005],[-122.12006,47.75808],[-122.12017699999998,47.75804],[-122.12036999999998,47.758009],[-122.12078999999999,47.757979999999996],[-122.12098999999999,47.75797],[-122.12105,47.755520000000004],[-122.121069,47.75479],[-122.12106999999999,47.75403],[-122.12105,47.75392],[-122.12096999999999,47.75354],[-122.12293999999999,47.75394],[-122.12429,47.75418],[-122.12452,47.75421],[-122.12468,47.754228],[-122.12545999999999,47.754239999999996],[-122.12725,47.754324],[-122.12833999999998,47.75433],[-122.12883699999998,47.75433],[-122.12944999999999,47.754339],[-122.12966999999999,47.75434],[-122.12993999999999,47.754365],[-122.13012,47.75438],[-122.13029999999999,47.754411],[-122.13058,47.75447],[-122.13076999999998,47.754522],[-122.13123,47.7547],[-122.13154,47.754819999999995],[-122.13169,47.754873999999994],[-122.13188,47.754923],[-122.13195,47.75493],[-122.13202999999999,47.75494],[-122.13211199999999,47.75494],[-122.13215,47.75494],[-122.13219,47.754929],[-122.13228,47.754887999999994],[-122.13234999999999,47.754839],[-122.13237999999998,47.75481],[-122.13248099999998,47.754582],[-122.13262,47.75416],[-122.13270999999999,47.753834],[-122.13274999999999,47.753659999999996],[-122.13277999999998,47.753350000000005],[-122.13279999999999,47.753197],[-122.13282999999998,47.753099],[-122.13286999999998,47.753],[-122.132924,47.75291000000001],[-122.13298999999999,47.75282],[-122.133055,47.75274],[-122.13321,47.752586],[-122.13337999999999,47.75246],[-122.13346999999999,47.7524],[-122.13355,47.75236],[-122.13369,47.75231000000001],[-122.13376999999998,47.75229],[-122.13386,47.752285],[-122.13396,47.75229],[-122.13413,47.75231000000001],[-122.13436,47.75235000000001],[-122.13445,47.75237500000001],[-122.1346,47.752430000000004],[-122.13504999999999,47.75262],[-122.13513999999999,47.75265],[-122.13522999999999,47.752677],[-122.13534999999999,47.752700000000004],[-122.13546999999998,47.752720000000004],[-122.1356,47.75273000000001],[-122.13589999999999,47.75274],[-122.1361,47.75274],[-122.13667,47.75273000000001],[-122.1378,47.75273000000001],[-122.13807999999999,47.75273000000001],[-122.13825,47.752721],[-122.13841,47.752707],[-122.13942999999999,47.752590000000005],[-122.13959,47.752590000000005],[-122.13986,47.7526],[-122.14005,47.75262],[-122.14020000000001,47.75264],[-122.14029000000001,47.75267],[-122.1404,47.75273000000001],[-122.14082,47.752967],[-122.14098,47.75305],[-122.14110000000001,47.75309],[-122.141232,47.75314],[-122.14142000000001,47.753189],[-122.14163,47.75322],[-122.14178,47.75324],[-122.14192000000001,47.75325],[-122.14232999999999,47.75326],[-122.14247999999999,47.75325],[-122.14276,47.753232000000004],[-122.14287999999999,47.75321],[-122.14301,47.753190000000004],[-122.14326000000001,47.75311000000001],[-122.1433,47.753101],[-122.14349,47.753011],[-122.14358,47.75296],[-122.14366000000001,47.75291000000001],[-122.14372999999999,47.75285],[-122.14383,47.75274],[-122.1439,47.752626],[-122.14392400000001,47.752570000000006],[-122.14395,47.752492000000004],[-122.14398,47.75229],[-122.14396,47.751762],[-122.14396900000001,47.751715000000004],[-122.14402000000001,47.751599999999996],[-122.14405900000001,47.751548],[-122.14410000000001,47.7515],[-122.14420700000001,47.75140699999999],[-122.14426000000002,47.751377],[-122.14432000000001,47.751338000000004],[-122.14449,47.75127],[-122.14456000000001,47.75125],[-122.14464000000001,47.75123],[-122.14477,47.751218],[-122.14489,47.75121],[-122.145012,47.75121],[-122.14512,47.751219999999996],[-122.14527199999999,47.751242],[-122.14556,47.751295],[-122.14578999999999,47.75135],[-122.146547,47.751551],[-122.146759,47.75159],[-122.14692000000001,47.751619999999996],[-122.14708,47.751639999999995],[-122.14723000000001,47.75165],[-122.14738,47.75165],[-122.14797,47.75165],[-122.1481,47.751659999999994],[-122.14855,47.75165],[-122.14876999999998,47.75165],[-122.14942,47.75163],[-122.14952000000001,47.751625999999995],[-122.14948,47.751096999999994],[-122.14997699999999,47.751079999999995],[-122.14996000000001,47.750251],[-122.149949,47.749682],[-122.15239999999999,47.74971000000001],[-122.15248699999998,47.749859],[-122.152515,47.74991000000001],[-122.15253999999999,47.74996],[-122.15259999999999,47.750164],[-122.15264099999999,47.750371],[-122.152654,47.750479999999996],[-122.15301,47.7505],[-122.15343999999999,47.750544],[-122.15355,47.750550000000004],[-122.15396999999999,47.75054],[-122.15401,47.751233],[-122.15431,47.751162],[-122.15522,47.750682],[-122.15552,47.750591],[-122.156016,47.7505],[-122.1565,47.750479999999996],[-122.15702999999999,47.75047],[-122.15755,47.75049],[-122.16028,47.7505],[-122.16031,47.747948],[-122.15982999999999,47.747659999999996],[-122.15939999999999,47.747293],[-122.15987999999999,47.74729],[-122.15995,47.747279999999996],[-122.15972999999998,47.74712],[-122.15970999999999,47.747109],[-122.15942999999999,47.74685],[-122.15916,47.746565000000004],[-122.15832999999998,47.745810000000006],[-122.15802999999998,47.745560000000005],[-122.15794,47.74550000000001],[-122.15781,47.74542],[-122.15768,47.745360000000005],[-122.15724,47.745200000000004],[-122.15696,47.74510000000001],[-122.15644999999999,47.744930000000004],[-122.15625,47.744839999999996],[-122.15605,47.74472],[-122.15552999999998,47.744279999999996],[-122.15435,47.74334],[-122.1542,47.7432],[-122.15373999999998,47.74286],[-122.15357999999999,47.742706000000005],[-122.1535,47.742622000000004],[-122.15339999999999,47.742490000000004],[-122.15328,47.74231000000001],[-122.15312,47.742000000000004],[-122.1531,47.741910000000004],[-122.15308999999999,47.74188099999999],[-122.15302999999999,47.741446999999994],[-122.15298999999999,47.741170000000004],[-122.15291699999999,47.74083],[-122.15289999999999,47.740770000000005],[-122.15279999999998,47.740608],[-122.15235999999999,47.740010000000005],[-122.15177999999999,47.739250000000006],[-122.15155,47.73895000000001],[-122.15142999999999,47.738800000000005],[-122.15093999999999,47.73823000000001],[-122.15068,47.737854],[-122.15043999999999,47.73754],[-122.15030399999999,47.73731000000001],[-122.15007999999999,47.737032000000006],[-122.14991,47.736854],[-122.14984,47.7368],[-122.14979,47.73675800000001],[-122.14943,47.736580000000004],[-122.14918,47.73642],[-122.14911000000001,47.736320000000006],[-122.14907,47.736343000000005],[-122.14905,47.73633000000001],[-122.148965,47.736290000000004],[-122.14858,47.73611800000001],[-122.148016,47.73588],[-122.14783,47.73579000000001],[-122.14696,47.73536500000001],[-122.14676,47.73528],[-122.1466,47.73520200000001],[-122.14647,47.73512100000001],[-122.14630799999999,47.734994],[-122.14612000000001,47.73482],[-122.14609,47.734786],[-122.14591,47.734657],[-122.14589,47.73464],[-122.14583999999999,47.734590000000004],[-122.14576,47.734482],[-122.14551,47.734100000000005],[-122.14546999999999,47.73402],[-122.14542,47.733900000000006],[-122.14536,47.733657],[-122.14533999999999,47.733560000000004],[-122.14532,47.733320000000006],[-122.14531,47.73311000000001],[-122.14535,47.73303000000001],[-122.14537999999999,47.73297000000001],[-122.14472,47.73295900000001],[-122.14403,47.732940000000006],[-122.14385,47.732940000000006],[-122.14381,47.733340000000005],[-122.14377999999999,47.734123000000004],[-122.14222000000001,47.734127],[-122.1422,47.734500000000004],[-122.1422,47.73466],[-122.14111000000001,47.73465],[-122.14096,47.734654],[-122.141,47.733670000000004],[-122.14019,47.733670000000004],[-122.140196,47.73281000000001],[-122.14028,47.732797000000005],[-122.14048,47.732760000000006],[-122.14058,47.732760000000006],[-122.14074,47.73275000000001],[-122.13986999999999,47.73187],[-122.14073799999998,47.731527],[-122.14036,47.73107],[-122.13994,47.73055000000001],[-122.1395,47.730021],[-122.13922000000001,47.729690000000005],[-122.14092000000001,47.72905000000001],[-122.14105,47.72901000000001],[-122.141411,47.72887800000001],[-122.14206999999999,47.72863000000001],[-122.14218,47.72860000000001],[-122.14229999999999,47.72858300000001],[-122.14232,47.72858000000001],[-122.14249,47.72857000000001],[-122.14273999999999,47.728581000000005],[-122.14285,47.72858900000001],[-122.14292,47.72859000000001],[-122.142903,47.728710000000014],[-122.14289699999999,47.72874300000001],[-122.14285,47.72889000000001],[-122.14283999999999,47.72898000000001],[-122.14281,47.729447],[-122.14304,47.729704000000005],[-122.14307,47.72971800000001],[-122.143091,47.72974000000001],[-122.14314,47.72986],[-122.14319,47.729960000000005],[-122.14329000000001,47.730098000000005],[-122.14336,47.730180000000004],[-122.14341,47.730239000000005],[-122.14357,47.73042],[-122.144011,47.730810000000005],[-122.14493,47.7316],[-122.14502999999999,47.73169],[-122.14511,47.731790000000004],[-122.14525,47.73198],[-122.14529,47.732040000000005],[-122.14533999999999,47.73217800000001],[-122.14536999999999,47.73232000000001],[-122.14537999999999,47.732380000000006],[-122.1454,47.73259000000001],[-122.14542300000001,47.73268],[-122.14566,47.73268],[-122.1488,47.73275000000001],[-122.14985,47.73277000000001],[-122.14989,47.73277000000001],[-122.15001,47.73277000000001],[-122.14992000000001,47.732670000000006],[-122.14893,47.7314],[-122.14862000000001,47.730661],[-122.14849,47.73024],[-122.148427,47.729580000000006],[-122.14846,47.72910000000001],[-122.1485,47.72891000000001],[-122.148545,47.72870000000001],[-122.14871,47.72810600000001],[-122.14922600000001,47.72652000000001],[-122.1495,47.725660000000005],[-122.15216,47.72574000000001],[-122.15237799999997,47.72574000000001],[-122.15238999999998,47.727109000000006],[-122.15317999999999,47.726991000000005],[-122.15467,47.72677100000001],[-122.15449,47.72574000000001],[-122.15321,47.725727000000006],[-122.15325,47.72392000000001],[-122.15596999999998,47.723954000000006],[-122.15594999999999,47.724650000000004],[-122.15592999999998,47.72576000000001],[-122.15662,47.725767000000005],[-122.1571,47.72577300000001],[-122.15772999999999,47.72578000000001],[-122.15925,47.72580000000001],[-122.15912,47.72953400000001],[-122.15933999999999,47.729541000000005],[-122.16023,47.729489],[-122.16108,47.72950000000001],[-122.161988,47.72952000000001],[-122.16252999999999,47.729560000000006],[-122.16314,47.729690000000005],[-122.1639,47.72999000000001],[-122.16404,47.730070000000005],[-122.16406300000001,47.730140000000006],[-122.16407,47.73021000000001],[-122.16407,47.73035000000001],[-122.16406300000001,47.730846],[-122.16402000000001,47.73215000000001],[-122.16402000000001,47.732760000000006],[-122.16402000000001,47.73281000000001],[-122.16403,47.73302],[-122.16403,47.733126000000006],[-122.16402000000001,47.733250000000005],[-122.16402000000001,47.733450000000005],[-122.164,47.733962000000005],[-122.1665,47.733956000000006],[-122.16717,47.73395000000001],[-122.16917,47.733962000000005],[-122.16968,47.73397000000001],[-122.169671,47.73391000000001],[-122.17134999999999,47.733900000000006],[-122.17237999999998,47.733906000000005],[-122.17556999999998,47.73392200000001],[-122.17579999999998,47.733920000000005],[-122.17577799999997,47.734255000000005],[-122.17576999999997,47.734370000000006],[-122.17570999999998,47.73554000000001],[-122.17567999999999,47.73601000000001],[-122.17562999999998,47.736380000000004],[-122.17560999999999,47.73669],[-122.17557999999998,47.73708],[-122.17557999999998,47.737162000000005],[-122.17556999999998,47.73731000000001],[-122.17556999999998,47.737743],[-122.17536699999998,47.74027],[-122.17533999999998,47.740990000000004],[-122.17529999999998,47.741625],[-122.17512999999998,47.74348],[-122.17503999999998,47.74524],[-122.17503999999998,47.745256000000005],[-122.17502999999998,47.74541000000001],[-122.17501999999999,47.745580000000004],[-122.17492999999999,47.745580000000004],[-122.17492999999999,47.745608000000004],[-122.1749,47.746050000000004],[-122.17486999999998,47.746570000000006],[-122.17483999999999,47.74702],[-122.17486,47.74702],[-122.17486,47.747130000000006],[-122.17483999999999,47.747386],[-122.17466999999999,47.74739],[-122.17466999999999,47.74747],[-122.174654,47.747734],[-122.17465,47.747777],[-122.17464199999999,47.747928],[-122.17463,47.74807800000001],[-122.17463,47.748127000000004],[-122.17446699999999,47.748126000000006],[-122.17443999999999,47.748450000000005],[-122.17436999999998,47.749340000000004],[-122.17428,47.750350000000005],[-122.17428,47.750383],[-122.17428,47.75041],[-122.17415,47.750959],[-122.1742,47.75096],[-122.17426,47.75096],[-122.174654,47.75096],[-122.17463,47.751852],[-122.17462,47.75263],[-122.17466999999999,47.75271000000001],[-122.17497699999998,47.75314],[-122.17499999999998,47.753170000000004],[-122.17500999999999,47.75321],[-122.17501999999999,47.75324],[-122.17502999999998,47.753276],[-122.17502999999998,47.753310000000006],[-122.17502999999998,47.75334],[-122.17502999999998,47.75338],[-122.17496999999999,47.753619],[-122.17492999999999,47.753764],[-122.17493199999998,47.75389],[-122.17492999999999,47.75413],[-122.17571999999998,47.75414],[-122.17572999999997,47.75454],[-122.17586299999999,47.75454],[-122.17546999999998,47.755488],[-122.17533999999998,47.755825],[-122.17532999999997,47.75586],[-122.17554999999999,47.755930000000006],[-122.17632999999998,47.756218000000004],[-122.17603999999999,47.75708899999999]]]},"name":"Woodinville"},{"boundary":{"type":"Polygon","coordinates":[[[-122.27096,47.77702],[-122.26831,47.77702],[-122.26705000000001,47.77702],[-122.26683799999999,47.77702],[-122.26557,47.77694],[-122.26457,47.77703],[-122.26445000000001,47.77704],[-122.26360000000001,47.77707],[-122.26333699999999,47.777065],[-122.26083,47.776921],[-122.26073,47.776921],[-122.26050000000001,47.776920000000004],[-122.25784,47.776920000000004],[-122.25391,47.776920000000004],[-122.25311500000001,47.776920000000004],[-122.24993,47.77682],[-122.24914000000001,47.776810000000005],[-122.24888,47.776810000000005],[-122.24743000000001,47.77684],[-122.24386000000001,47.776891],[-122.24276,47.77697500000001],[-122.24260000000001,47.776970000000006],[-122.24258,47.776966],[-122.24222000000002,47.77696],[-122.24204,47.77696],[-122.24193000000001,47.77695000000001],[-122.24184000000001,47.77695000000001],[-122.24170000000001,47.77695000000001],[-122.24162000000003,47.77695000000001],[-122.24144000000001,47.77695000000001],[-122.24131000000001,47.77695000000001],[-122.24106000000002,47.776942000000005],[-122.24093300000001,47.77694],[-122.24082000000001,47.77693800000001],[-122.24073,47.77695000000001],[-122.23954,47.776924],[-122.23917,47.77691000000001],[-122.23909,47.77691000000001],[-122.23863,47.776904],[-122.23836999999999,47.776900000000005],[-122.23821000000001,47.776891],[-122.2381,47.77689],[-122.23771,47.77687],[-122.23717,47.77686],[-122.2365,47.77685],[-122.23594,47.776848],[-122.23568,47.77684],[-122.23489000000001,47.77684],[-122.23411000000002,47.77682],[-122.23383,47.77681200000001],[-122.23304,47.77682],[-122.23292000000001,47.77682],[-122.23183,47.7768],[-122.22761000000001,47.776740000000004],[-122.22766000000001,47.77493200000001],[-122.2277,47.774034],[-122.22775,47.772580000000005],[-122.22778,47.77205000000001],[-122.22787,47.76951000000001],[-122.22788,47.76932000000001],[-122.22797,47.768420000000006],[-122.228,47.76800000000001],[-122.22792000000001,47.767990000000005],[-122.22793,47.767783],[-122.22794,47.767300000000006],[-122.22797,47.76657000000001],[-122.22809,47.76657000000001],[-122.22901,47.766571000000006],[-122.22908,47.76593800000001],[-122.22887999999999,47.76594000000001],[-122.22881799999999,47.76594000000001],[-122.228822,47.76554000000001],[-122.228822,47.765440000000005],[-122.22807999999999,47.765420000000006],[-122.22801,47.76541400000001],[-122.22804,47.76462],[-122.22806,47.764070000000004],[-122.22806,47.763870000000004],[-122.22811,47.762690000000006],[-122.22812,47.76227000000001],[-122.22812,47.76223000000001],[-122.22813,47.76200000000001],[-122.22813,47.761790000000005],[-122.22813699999999,47.76174],[-122.22814,47.761598000000006],[-122.22816,47.761029],[-122.22816999999999,47.76068],[-122.22818,47.760298000000006],[-122.22819,47.75997],[-122.2282,47.75956],[-122.22823,47.758745000000005],[-122.228231,47.75864],[-122.22824,47.75845],[-122.22824,47.75831000000001],[-122.22824,47.758250000000004],[-122.22825,47.75811300000001],[-122.22825,47.75799],[-122.22825,47.7579],[-122.228267,47.757479999999994],[-122.22827,47.757235],[-122.22832,47.755590000000005],[-122.22836,47.754577],[-122.22836999999998,47.754310000000004],[-122.22837999999999,47.75414],[-122.22837999999999,47.754109],[-122.22837999999999,47.75399],[-122.22838999999999,47.7539],[-122.22832999999999,47.75388099999999],[-122.22774,47.75369],[-122.227686,47.753675],[-122.22714,47.753510000000006],[-122.226278,47.753243],[-122.22594,47.75314],[-122.22586,47.75312],[-122.22576999999998,47.75309],[-122.22546999999999,47.753021],[-122.22525,47.752973000000004],[-122.22501,47.752930000000006],[-122.22468500000001,47.752879],[-122.22426000000002,47.75283],[-122.22327,47.752790000000005],[-122.22214,47.75276],[-122.221807,47.752750000000006],[-122.22138,47.75273000000001],[-122.22115000000001,47.75271000000001],[-122.22098,47.752700000000004],[-122.22079,47.752679],[-122.22079,47.752629],[-122.22079,47.75258],[-122.22079,47.75253000000001],[-122.22079,47.75248],[-122.22075,47.75247],[-122.22073999999999,47.752413000000004],[-122.22072999999999,47.75235500000001],[-122.22072,47.752300000000005],[-122.22082,47.751980999999994],[-122.22086999999999,47.751819999999995],[-122.22091,47.7517],[-122.22095300000001,47.75155],[-122.22102000000001,47.75145],[-122.22113,47.75139],[-122.22121000000001,47.751376],[-122.22166000000001,47.751369],[-122.22302,47.7514],[-122.22376999999999,47.75138],[-122.22389,47.75138],[-122.22395,47.750510000000006],[-122.22397,47.750150000000005],[-122.22415000000001,47.74777],[-122.22372999999999,47.747769],[-122.21929000000002,47.747737],[-122.21926000000002,47.747031],[-122.21919000000001,47.745601],[-122.21913,47.744217],[-122.21910000000001,47.743730000000006],[-122.21900600000001,47.74161],[-122.21895,47.740448],[-122.21887,47.738620000000004],[-122.21906400000002,47.738620000000004],[-122.22015,47.73866],[-122.22092,47.738679000000005],[-122.22202,47.73865000000001],[-122.22228,47.73866],[-122.22282999999999,47.73870000000001],[-122.222462,47.73830600000001],[-122.22236999999998,47.73820800000001],[-122.22141,47.73718],[-122.22076,47.736467],[-122.21913,47.73466],[-122.21898,47.734500000000004],[-122.21894,47.734456],[-122.2188,47.73431800000001],[-122.21876,47.73330000000001],[-122.218749,47.733177000000005],[-122.21876,47.73317000000001],[-122.2188,47.733160000000005],[-122.2189,47.733160000000005],[-122.21919000000001,47.733160000000005],[-122.21946000000001,47.73317000000001],[-122.22085,47.733177000000005],[-122.22176999999999,47.73319000000001],[-122.22189,47.73319000000001],[-122.22265,47.733200000000004],[-122.222854,47.733200000000004],[-122.22305,47.733200000000004],[-122.22387499999999,47.73321200000001],[-122.22399300000001,47.733213000000006],[-122.22583999999999,47.73324],[-122.2273,47.733267],[-122.22909,47.73330300000001],[-122.23135,47.733320000000006],[-122.23176000000001,47.73333000000001],[-122.23301000000001,47.733360000000005],[-122.23348,47.73337000000001],[-122.23400000000001,47.73337000000001],[-122.23440000000001,47.73337000000001],[-122.23460300000002,47.733360000000005],[-122.23492000000002,47.733360000000005],[-122.23649,47.73337000000001],[-122.23733,47.733380000000004],[-122.24039,47.733410000000006],[-122.24061000000002,47.733410000000006],[-122.240879,47.733380000000004],[-122.24106000000002,47.73334500000001],[-122.24139000000001,47.73326],[-122.24150000000002,47.73324],[-122.24154000000001,47.733225000000004],[-122.24165000000002,47.73319000000001],[-122.24180000000001,47.73312500000001],[-122.24191000000002,47.733070000000005],[-122.24203,47.73299000000001],[-122.24216000000001,47.73288],[-122.24220000000001,47.732836000000006],[-122.24226000000002,47.73277000000001],[-122.24242000000001,47.73252000000001],[-122.24254,47.73237000000001],[-122.24277699999999,47.73209800000001],[-122.2428,47.732054000000005],[-122.24295000000001,47.732054000000005],[-122.24313000000001,47.732046000000004],[-122.24342000000001,47.732020000000006],[-122.24438900000001,47.731885],[-122.24521000000001,47.731770000000004],[-122.24516000000001,47.73163],[-122.24515000000001,47.7316],[-122.24496000000002,47.730900000000005],[-122.24480000000001,47.730320000000006],[-122.24466700000002,47.729850000000006],[-122.24463100000001,47.72972000000001],[-122.24452000000002,47.72935000000001],[-122.24414000000002,47.72803000000001],[-122.24463000000002,47.728061000000004],[-122.24513,47.72816600000001],[-122.24538,47.72824000000001],[-122.24572,47.72836600000001],[-122.2459,47.72843900000001],[-122.24615000000001,47.72855000000001],[-122.24640000000001,47.72859000000001],[-122.24651000000001,47.72859000000001],[-122.24662000000002,47.72858300000001],[-122.24682200000001,47.72854500000001],[-122.24694000000001,47.72845500000001],[-122.24706000000002,47.728330000000014],[-122.24714000000002,47.72819000000001],[-122.24744000000001,47.727650000000004],[-122.24752000000002,47.727590000000006],[-122.24764000000002,47.727520000000005],[-122.24777,47.727470000000004],[-122.24783000000001,47.727457],[-122.24787,47.727450000000005],[-122.247971,47.72744],[-122.24812000000001,47.727450000000005],[-122.24819000000001,47.727455000000006],[-122.24824000000001,47.727470000000004],[-122.24833,47.72750200000001],[-122.24851000000001,47.727590000000006],[-122.248575,47.72762],[-122.24879,47.72777000000001],[-122.24891000000001,47.72787],[-122.24906000000001,47.72795000000001],[-122.24913000000001,47.727970000000006],[-122.24923000000001,47.72800000000001],[-122.24936000000001,47.72802000000001],[-122.24950000000001,47.72803000000001],[-122.24972000000001,47.728027000000004],[-122.24985000000001,47.72800000000001],[-122.24992000000002,47.727984],[-122.25006,47.727925000000006],[-122.25015,47.72787],[-122.25021000000001,47.72782],[-122.25026000000001,47.727768000000005],[-122.25032999999999,47.72766],[-122.25052000000001,47.72733000000001],[-122.25054,47.727292000000006],[-122.25056000000001,47.727230000000006],[-122.25059,47.727109000000006],[-122.25061000000001,47.72684],[-122.25059900000001,47.726760000000006],[-122.2505,47.72632300000001],[-122.25048,47.726237000000005],[-122.25048,47.72619000000001],[-122.25049,47.726020000000005],[-122.25049,47.72597000000001],[-122.25055,47.72557000000001],[-122.25066000000001,47.72557000000001],[-122.25553,47.725620000000006],[-122.25635,47.72563000000001],[-122.25690900000001,47.72563500000001],[-122.25748,47.725640000000006],[-122.25807999999999,47.725646000000005],[-122.2588,47.72565000000001],[-122.25982,47.725660000000005],[-122.25986999999999,47.72570000000001],[-122.25988,47.72589000000001],[-122.25986999999999,47.72590800000001],[-122.25984,47.72596000000001],[-122.25961000000001,47.72619100000001],[-122.25936999999999,47.72639000000001],[-122.25982,47.726400000000005],[-122.26154000000001,47.72641000000001],[-122.26187,47.726400000000005],[-122.26185000000001,47.726470000000006],[-122.26174,47.726560000000006],[-122.26161000000002,47.72665000000001],[-122.26164000000001,47.72672000000001],[-122.26354,47.72932000000001],[-122.26384,47.73152],[-122.26449000000001,47.732997000000005],[-122.26459000000001,47.73321000000001],[-122.26459000000001,47.733250000000005],[-122.26460000000002,47.73328],[-122.26460000000002,47.73331100000001],[-122.26460000000002,47.73337000000001],[-122.26459000000001,47.73339000000001],[-122.264598,47.733410000000006],[-122.26460500000002,47.733433000000005],[-122.26461000000002,47.73346],[-122.26461000000002,47.73348],[-122.26461000000002,47.73351000000001],[-122.26462000000002,47.733523000000005],[-122.26463000000001,47.733540000000005],[-122.26464000000001,47.73357000000001],[-122.26465000000002,47.73358],[-122.26465000000002,47.733610000000006],[-122.26465000000002,47.733630000000005],[-122.26465000000002,47.73364],[-122.26465000000002,47.73368],[-122.26473,47.733747],[-122.26476000000001,47.733790000000006],[-122.26478,47.733850000000004],[-122.26479,47.73389],[-122.26482000000001,47.733940000000004],[-122.26486000000001,47.734010000000005],[-122.26491000000001,47.734088],[-122.26494000000001,47.734122000000006],[-122.26495000000001,47.73413600000001],[-122.26498000000001,47.734190000000005],[-122.265,47.734218000000006],[-122.26502,47.734254],[-122.26504,47.73428],[-122.26506,47.734320000000004],[-122.26508,47.734370000000006],[-122.2651,47.734428],[-122.26511,47.73449],[-122.26511,47.73454],[-122.26512000000001,47.734569],[-122.26511,47.7346],[-122.26512000000001,47.73463],[-122.26512000000001,47.73466],[-122.26512000000001,47.734691],[-122.26512000000001,47.73472],[-122.265102,47.734787],[-122.265095,47.73482],[-122.2651,47.73484],[-122.2651,47.734863],[-122.26509,47.73488],[-122.26509,47.7349],[-122.26508,47.734930000000006],[-122.26507,47.73496],[-122.26507,47.73498],[-122.26507,47.73501000000001],[-122.26507,47.735037000000005],[-122.265057,47.735060000000004],[-122.26504,47.73509000000001],[-122.26504,47.73511000000001],[-122.26504,47.73513000000001],[-122.26504,47.73514000000001],[-122.26504,47.73516000000001],[-122.26503,47.73518000000001],[-122.26503,47.73520500000001],[-122.26502,47.735220000000005],[-122.265012,47.735254000000005],[-122.26501,47.735290000000006],[-122.26501,47.73534900000001],[-122.26501,47.735400000000006],[-122.26502,47.73545000000001],[-122.26503,47.73550000000001],[-122.265049,47.73555000000001],[-122.26506,47.735600000000005],[-122.26507,47.73563000000001],[-122.265091,47.73566],[-122.26511,47.735696000000004],[-122.26512000000001,47.73572000000001],[-122.26513,47.73573100000001],[-122.265139,47.735760000000006],[-122.26514900000001,47.735780000000005],[-122.26517199999999,47.735814000000005],[-122.26520000000001,47.73586],[-122.26522000000001,47.73588],[-122.26524,47.735890000000005],[-122.265262,47.73591000000001],[-122.26529000000001,47.73593000000001],[-122.26532999999999,47.735949000000005],[-122.26536,47.73597000000001],[-122.2654,47.736000000000004],[-122.26544,47.73603000000001],[-122.26547,47.73606],[-122.26551,47.736090000000004],[-122.26556000000001,47.736126000000006],[-122.26561000000001,47.73617300000001],[-122.26566700000001,47.73622],[-122.26571,47.73626],[-122.26575,47.73630000000001],[-122.26579,47.73633500000001],[-122.26583,47.73637000000001],[-122.26585,47.73641000000001],[-122.26586999999999,47.73644],[-122.2659,47.73648],[-122.26593,47.73651800000001],[-122.26596,47.736548000000006],[-122.26597,47.736580000000004],[-122.26601000000001,47.73662],[-122.26603,47.736643],[-122.26605,47.736643],[-122.26609,47.736694],[-122.26610000000001,47.736700000000006],[-122.26613,47.736720000000005],[-122.26616000000001,47.73675000000001],[-122.26620000000001,47.7368],[-122.26622800000001,47.736830000000005],[-122.26625000000001,47.73686],[-122.26627,47.736900000000006],[-122.26629000000001,47.736920000000005],[-122.26632000000001,47.73695000000001],[-122.26634,47.736987],[-122.26635,47.737],[-122.26636300000001,47.73702],[-122.26638,47.737041],[-122.266395,47.73706],[-122.26642000000001,47.73708],[-122.26643,47.737100000000005],[-122.26644,47.73711000000001],[-122.26646000000001,47.73713800000001],[-122.26647,47.73716],[-122.266485,47.73718],[-122.26650000000001,47.73722],[-122.26652000000001,47.73724],[-122.26653,47.737251],[-122.26653900000001,47.73727],[-122.26654,47.73728],[-122.26655000000001,47.737294],[-122.26656000000001,47.73731000000001],[-122.26656000000001,47.737320000000004],[-122.26658,47.737334000000004],[-122.26659000000001,47.737344],[-122.26662000000002,47.73736],[-122.26665000000001,47.737366],[-122.26668000000001,47.737369],[-122.2667,47.737373000000005],[-122.26672900000001,47.737387],[-122.26674799999999,47.7374],[-122.26677,47.737410000000004],[-122.2668,47.737418000000005],[-122.26683,47.73743],[-122.26686000000001,47.73745],[-122.26687,47.737458000000004],[-122.26691000000001,47.73748],[-122.26693,47.73749],[-122.26695000000001,47.73749],[-122.26698,47.737517000000004],[-122.26699900000001,47.73752],[-122.26702000000002,47.73753000000001],[-122.26705000000001,47.73756],[-122.26707,47.73758],[-122.26710000000001,47.737593000000004],[-122.26712000000002,47.737603],[-122.26714000000001,47.737610000000004],[-122.26717000000001,47.73763],[-122.26719000000001,47.73764],[-122.26722000000002,47.73766],[-122.26724000000002,47.737679],[-122.26725000000002,47.737691],[-122.26727000000001,47.737700000000004],[-122.2673,47.737716000000006],[-122.26731000000001,47.737730000000006],[-122.26734,47.73774],[-122.26735000000001,47.737750000000005],[-122.26737,47.737750000000005],[-122.26740000000001,47.737770000000005],[-122.26743,47.737790000000004],[-122.26741000000001,47.737904],[-122.26734,47.73832000000001],[-122.26633,47.73866],[-122.26620000000001,47.73865000000001],[-122.26606000000001,47.738607],[-122.26589,47.738580000000006],[-122.26572999999999,47.73859100000001],[-122.26558,47.738645000000005],[-122.26545,47.73871000000001],[-122.26546,47.73874000000001],[-122.26546,47.73877000000001],[-122.26547,47.73879000000001],[-122.26548,47.73883000000001],[-122.26549,47.73886],[-122.26549,47.738886],[-122.2655,47.73891000000001],[-122.2655,47.73893100000001],[-122.265496,47.73895000000001],[-122.26549,47.738980000000005],[-122.26549,47.73901000000001],[-122.26548,47.739050000000006],[-122.26547,47.73908],[-122.265468,47.73911100000001],[-122.265455,47.739160000000005],[-122.265451,47.73919000000001],[-122.26545,47.73922],[-122.26545,47.739250000000006],[-122.26545,47.739277],[-122.26544,47.73931000000001],[-122.265442,47.739340000000006],[-122.26544,47.739377000000005],[-122.26544,47.73941000000001],[-122.26544,47.73944],[-122.26544,47.73946],[-122.26543,47.73948],[-122.26544,47.73951000000001],[-122.26544,47.73953000000001],[-122.26544,47.739560000000004],[-122.265455,47.73959500000001],[-122.26546400000001,47.739626],[-122.26547,47.739650000000005],[-122.26548,47.739683],[-122.265487,47.739700000000006],[-122.26549,47.73973000000001],[-122.26549,47.73975000000001],[-122.26549,47.73978],[-122.26548,47.739790000000006],[-122.26547,47.739810000000006],[-122.26546,47.739830000000005],[-122.265454,47.739846],[-122.26545,47.73987],[-122.265442,47.739900000000006],[-122.26544,47.73993000000001],[-122.26543,47.73997000000001],[-122.26543,47.74],[-122.26542,47.74004],[-122.26541,47.740057],[-122.2654,47.74009],[-122.26539,47.740100000000005],[-122.265374,47.74013000000001],[-122.26536999999999,47.740145000000005],[-122.26536,47.740170000000006],[-122.26535,47.74018],[-122.26534,47.740190000000005],[-122.26532,47.74022],[-122.26530699999999,47.74024],[-122.26529000000001,47.740274],[-122.26527,47.74031000000001],[-122.26526000000001,47.74033000000001],[-122.26526000000001,47.74034],[-122.26525000000001,47.74036],[-122.26525000000001,47.74038],[-122.26524,47.7404],[-122.26522000000001,47.740414],[-122.26521000000001,47.74042],[-122.26519,47.74043],[-122.26518,47.740442],[-122.26516000000001,47.740458000000004],[-122.26515,47.74047],[-122.26512000000001,47.740493],[-122.2651,47.740520000000004],[-122.26508,47.74053500000001],[-122.26506,47.74056],[-122.26505,47.740570000000005],[-122.26504,47.740610000000004],[-122.26503,47.740628],[-122.26502,47.74065],[-122.265,47.74067],[-122.26498000000001,47.740704],[-122.26496000000002,47.74074],[-122.26494000000001,47.740766],[-122.26490000000001,47.740770000000005],[-122.26482000000001,47.740770000000005],[-122.26481000000001,47.740790000000004],[-122.26480000000001,47.740809],[-122.26479,47.740837],[-122.26478,47.74086],[-122.26477,47.74088],[-122.26476000000001,47.7409],[-122.26476000000001,47.74091000000001],[-122.26475,47.74094],[-122.26474,47.74096],[-122.26472000000001,47.741],[-122.26466000000002,47.74109],[-122.26465000000002,47.74112],[-122.26464000000001,47.741130000000005],[-122.26461800000001,47.741170000000004],[-122.26460000000002,47.74121],[-122.26458000000001,47.74126],[-122.26457,47.74129],[-122.26456000000002,47.741321],[-122.26455300000002,47.74134],[-122.26455000000001,47.74137],[-122.26455000000001,47.7414],[-122.26455600000001,47.74143],[-122.26455300000002,47.74145],[-122.26455000000001,47.741479999999996],[-122.26456000000002,47.741537],[-122.26456000000002,47.74156],[-122.26457,47.7416],[-122.26458000000001,47.74163],[-122.26459000000001,47.741668],[-122.26460000000002,47.741730000000004],[-122.26460700000001,47.74178],[-122.26462000000002,47.741879999999995],[-122.26463000000001,47.742007],[-122.26463000000001,47.742019000000006],[-122.26464000000001,47.74204],[-122.26464000000001,47.742070000000005],[-122.26464000000001,47.742098000000006],[-122.26463000000001,47.74213000000001],[-122.26462000000002,47.74215000000001],[-122.26462000000002,47.742180000000005],[-122.26460000000002,47.742200000000004],[-122.26459000000001,47.74222],[-122.26459000000001,47.74224],[-122.26458000000001,47.742284],[-122.26457300000001,47.74233000000001],[-122.26457,47.742380000000004],[-122.26456000000002,47.7424],[-122.26454000000001,47.742430000000006],[-122.26454000000001,47.74246],[-122.26453000000001,47.742489],[-122.26453000000001,47.74251000000001],[-122.26453000000001,47.74253600000001],[-122.26452000000002,47.74255000000001],[-122.26451000000002,47.742580000000004],[-122.26450000000001,47.7426],[-122.26448,47.742630000000005],[-122.26446000000001,47.742650000000005],[-122.26445000000001,47.742670000000004],[-122.264438,47.74269],[-122.26443,47.742700000000006],[-122.26441000000001,47.742720000000006],[-122.26439,47.74275000000001],[-122.26436000000001,47.74277500000001],[-122.26432000000001,47.742810000000006],[-122.26428000000001,47.742850000000004],[-122.26424100000001,47.742883],[-122.26421000000002,47.74291300000001],[-122.26418100000001,47.74295000000001],[-122.26416800000001,47.742968000000005],[-122.264148,47.742990000000006],[-122.26411000000002,47.743030000000005],[-122.26410000000001,47.74304],[-122.26406000000001,47.74308],[-122.26403,47.743106000000004],[-122.26400000000001,47.743137000000004],[-122.26397,47.743170000000006],[-122.26394,47.743193000000005],[-122.26392000000001,47.74322],[-122.2639,47.74325],[-122.26389,47.743279],[-122.26386000000001,47.74331000000001],[-122.26384,47.74334],[-122.26382000000001,47.743370000000006],[-122.2638,47.7434],[-122.26378,47.74342],[-122.26377,47.743448],[-122.26376,47.74347],[-122.26372,47.743520000000004],[-122.26368000000001,47.743579000000004],[-122.26367,47.743590000000005],[-122.26365000000001,47.743618000000005],[-122.26363,47.74364],[-122.26361000000001,47.743659],[-122.26359000000001,47.74368],[-122.26357,47.74371300000001],[-122.26355000000001,47.74374],[-122.26353,47.743770000000005],[-122.26351000000001,47.743790000000004],[-122.26350000000001,47.743801],[-122.26348,47.74382],[-122.26342000000001,47.74389],[-122.26338,47.743950000000005],[-122.26335,47.744008],[-122.26333,47.744046],[-122.26332000000001,47.74409],[-122.263309,47.744130000000006],[-122.26331,47.744144],[-122.26331,47.74416],[-122.2633,47.744170000000004],[-122.26329000000001,47.74418],[-122.26328000000001,47.7442],[-122.26327,47.74421],[-122.26325900000002,47.744226],[-122.26325000000001,47.74424],[-122.26325000000001,47.74425],[-122.26324000000001,47.744276],[-122.26323000000001,47.74429],[-122.26322000000002,47.74431200000001],[-122.26320000000001,47.744337],[-122.26317900000001,47.74436],[-122.26316000000001,47.744382],[-122.26314,47.74442],[-122.26312000000001,47.74446],[-122.26333,47.74445],[-122.26336,47.74457],[-122.26339,47.744679999999995],[-122.2634,47.7448],[-122.26342000000001,47.74487],[-122.26346000000001,47.74506],[-122.26351000000001,47.745297],[-122.26343,47.745380000000004],[-122.26326000000002,47.74559000000001],[-122.262817,47.746100000000006],[-122.26279,47.746182000000005],[-122.26045,47.748253000000005],[-122.25824,47.75022],[-122.25832999999999,47.75155],[-122.25842999999999,47.751673],[-122.25837999999999,47.751717],[-122.25790300000001,47.752120000000005],[-122.25758,47.752410000000005],[-122.25758,47.75291000000001],[-122.25758,47.7533],[-122.25758,47.753325000000004],[-122.25758,47.753530000000005],[-122.25758,47.753710000000005],[-122.25758,47.75407],[-122.25758,47.75437],[-122.25757,47.755229],[-122.25757,47.75536],[-122.25768000000001,47.75535800000001],[-122.25907799999999,47.75545],[-122.26035,47.75553000000001],[-122.26033,47.756310000000006],[-122.26051000000001,47.75632],[-122.26164400000002,47.75642],[-122.26238,47.7565],[-122.26265000000001,47.756510000000006],[-122.26274,47.756510000000006],[-122.26321000000002,47.756550000000004],[-122.26347,47.75658],[-122.26392000000001,47.756616],[-122.26531,47.75672],[-122.26723000000001,47.755708000000006],[-122.26835,47.755720000000004],[-122.268682,47.756550000000004],[-122.26908,47.75735],[-122.26927,47.75732],[-122.26944,47.757279999999994],[-122.26959000000001,47.757239999999996],[-122.26977,47.75719],[-122.26986000000001,47.75715],[-122.27005,47.757079999999995],[-122.27024,47.756997],[-122.27042,47.7569],[-122.27053,47.75684],[-122.27064,47.75677],[-122.27072999999999,47.756709],[-122.27071099999999,47.7571],[-122.27065,47.75831000000001],[-122.27059,47.75932],[-122.27055,47.76011500000001],[-122.27053,47.76055000000001],[-122.27049,47.761161],[-122.27029999999999,47.761189],[-122.27022000000001,47.760940000000005],[-122.26941000000001,47.76112800000001],[-122.26954,47.76137000000001],[-122.26962000000002,47.7614],[-122.27002999999999,47.76153000000001],[-122.26996000000001,47.761596000000004],[-122.27046999999999,47.76173000000001],[-122.27047999999999,47.76265000000001],[-122.27047999999999,47.76275000000001],[-122.27048699999999,47.764022000000004],[-122.270496,47.76534000000001],[-122.2705,47.76578000000001],[-122.2705,47.766225000000006],[-122.2705,47.76650800000001],[-122.27052,47.76855000000001],[-122.26852000000001,47.76851000000001],[-122.26749000000001,47.76850900000001],[-122.26756000000002,47.76852000000001],[-122.26787,47.76857000000001],[-122.26805,47.76861500000001],[-122.26818,47.768660000000004],[-122.26848,47.76878000000001],[-122.26863,47.76885000000001],[-122.26877999999999,47.76892000000001],[-122.26891,47.76900500000001],[-122.26908,47.76912000000001],[-122.26917,47.76919000000001],[-122.269315,47.76933000000001],[-122.26939,47.769420000000004],[-122.26945,47.76950000000001],[-122.26954,47.76964],[-122.26962000000002,47.769821],[-122.26966000000002,47.76995000000001],[-122.26969000000001,47.77006],[-122.26972,47.770250000000004],[-122.26971,47.770482],[-122.26968000000001,47.770919000000006],[-122.26967,47.770961],[-122.26967,47.770996000000004],[-122.26962000000002,47.771510000000006],[-122.26962000000002,47.77156],[-122.26959000000001,47.771879999999996],[-122.26956000000001,47.772124000000005],[-122.26955000000001,47.77228],[-122.26952000000001,47.772648000000004],[-122.26951000000001,47.77271000000001],[-122.26949,47.77294500000001],[-122.26948,47.77311000000001],[-122.26947,47.77318],[-122.26945,47.77348],[-122.26945,47.773725000000006],[-122.26947,47.773950000000006],[-122.26951000000001,47.77408],[-122.26956000000001,47.77424],[-122.26961000000001,47.77436],[-122.26966000000002,47.774473],[-122.26985,47.774910000000006],[-122.26998,47.775180000000006],[-122.27008,47.77544],[-122.27019,47.775760000000005],[-122.27027,47.77599000000001],[-122.27029,47.776033000000005],[-122.27039599999999,47.77635000000001],[-122.27046,47.776495000000004],[-122.27055,47.77664],[-122.27066,47.776770000000006],[-122.27076999999998,47.77688],[-122.27096,47.77702]]]},"name":"Kenmore"},{"boundary":{"type":"Polygon","coordinates":[[[-122.25488,47.479163],[-122.25398,47.479639999999996],[-122.25372,47.4795],[-122.25337999999999,47.4794],[-122.25337999999999,47.47937],[-122.25242999999999,47.479248],[-122.25167,47.47942],[-122.24971000000001,47.47987],[-122.24822000000002,47.47989],[-122.24582000000001,47.479879999999994],[-122.24579,47.481089999999995],[-122.24558,47.481089999999995],[-122.24559,47.48206],[-122.24559900000001,47.48223],[-122.24509,47.482079999999996],[-122.24400000000001,47.48179999999999],[-122.24316000000002,47.48155],[-122.24245,47.481438999999995],[-122.24170400000001,47.481378],[-122.24074,47.481328],[-122.23991600000001,47.481359999999995],[-122.23893,47.481415],[-122.238,47.481449999999995],[-122.23703400000001,47.481415],[-122.23616000000001,47.48123999999999],[-122.2353,47.48107999999999],[-122.23453,47.48083],[-122.23403,47.480599999999995],[-122.23366000000001,47.480439999999994],[-122.23361000000001,47.480489999999996],[-122.23345,47.480619999999995],[-122.23341,47.48065],[-122.23335,47.48071],[-122.23317,47.48065999999999],[-122.23261000000001,47.48054],[-122.23239,47.4805],[-122.23234,47.480489999999996],[-122.23228,47.48047],[-122.23226000000001,47.48047999999999],[-122.23221000000001,47.48046699999999],[-122.23215,47.48047999999999],[-122.23216000000001,47.480489999999996],[-122.23215,47.48057],[-122.23211,47.480669999999996],[-122.23144,47.4821],[-122.23121000000002,47.4826],[-122.23117,47.482710000000004],[-122.23091000000001,47.48267],[-122.23072,47.48265],[-122.23102000000002,47.48287],[-122.23150500000001,47.483259999999994],[-122.23163000000001,47.48336],[-122.23236999999999,47.48395],[-122.23262900000002,47.484140999999994],[-122.23295,47.484399999999994],[-122.23296,47.484652999999994],[-122.23295,47.48644099999999],[-122.23109000000001,47.48641],[-122.2304,47.48641],[-122.229991,47.48641],[-122.22788,47.48637],[-122.22756000000001,47.486362],[-122.22756000000001,47.486576],[-122.22755000000001,47.48693],[-122.22755000000001,47.48701],[-122.22733,47.48701],[-122.22614300000001,47.487018],[-122.22614,47.48719],[-122.22556999999999,47.48719],[-122.22556999999999,47.48783999999999],[-122.22606999999999,47.48783999999999],[-122.22734,47.48783999999999],[-122.22734,47.487939999999995],[-122.22734,47.48805],[-122.22735,47.48816],[-122.22576999999998,47.488169],[-122.22532,47.488171],[-122.22532,47.48841],[-122.22532,47.48848399999999],[-122.22532,47.48858],[-122.22532,47.48889],[-122.22645,47.4889],[-122.22643,47.48936],[-122.22645,47.489391],[-122.22681,47.489386999999994],[-122.227,47.48939],[-122.22736,47.489382],[-122.22756500000001,47.48938],[-122.22757,47.489502],[-122.22757,47.48959],[-122.22757,47.48997],[-122.22759,47.490832000000005],[-122.22759,47.49088],[-122.22744,47.490880999999995],[-122.22623,47.49092],[-122.22606,47.490930000000006],[-122.22555,47.49092],[-122.22447,47.490926],[-122.22420000000001,47.49092],[-122.22407,47.49091500000001],[-122.22301,47.49089],[-122.22292999999999,47.49088],[-122.22292999999999,47.49124],[-122.22292999999999,47.4915],[-122.22292999999999,47.491679999999995],[-122.222927,47.49179],[-122.22292999999999,47.491937],[-122.22292999999999,47.492470000000004],[-122.22292999999999,47.49315800000001],[-122.222927,47.493486999999995],[-122.22236999999998,47.49347],[-122.2221,47.49347],[-122.21995900000002,47.49342],[-122.21989,47.493424],[-122.21989,47.493520000000004],[-122.21989,47.493590000000005],[-122.21989,47.49374],[-122.21989,47.49389],[-122.21997,47.49389],[-122.21997,47.494275],[-122.21997,47.494330000000005],[-122.22005,47.494330000000005],[-122.22005,47.49452],[-122.22017,47.49452],[-122.22017,47.4947],[-122.21997,47.4947],[-122.21986900000002,47.49469],[-122.21949000000001,47.49469],[-122.21947,47.49469],[-122.21945000000001,47.49468099999999],[-122.21951000000001,47.4949],[-122.21962000000002,47.495250000000006],[-122.21987,47.49526],[-122.22043,47.495270000000005],[-122.22197,47.49531000000001],[-122.22197,47.49539000000001],[-122.22196000000001,47.49566],[-122.22236,47.495672000000006],[-122.22234999999999,47.495844],[-122.22234399999999,47.496317000000005],[-122.22233599999998,47.496659],[-122.22231,47.496659],[-122.22229999999999,47.49689],[-122.22166000000001,47.49691000000001],[-122.22166000000001,47.496990000000004],[-122.22167,47.49708],[-122.22162000000002,47.49708],[-122.22157,47.497080999999994],[-122.22148,47.49708],[-122.22145,47.49708],[-122.22132,47.49707],[-122.22120000000001,47.49707],[-122.22120100000001,47.49727],[-122.22120000000001,47.49743],[-122.22105,47.49743],[-122.22104,47.49764],[-122.22105,47.49778],[-122.22092,47.49778],[-122.22013,47.497710000000005],[-122.21994000000001,47.497730000000004],[-122.21995500000001,47.49777],[-122.21986000000001,47.4978],[-122.21993,47.49795],[-122.21987,47.49796],[-122.21988,47.49801600000001],[-122.21981000000001,47.498020000000004],[-122.21983300000001,47.498097],[-122.21984,47.49813700000001],[-122.21986000000001,47.498180000000005],[-122.21974,47.49817000000001],[-122.21975,47.49833000000001],[-122.21981000000001,47.49833000000001],[-122.21986500000001,47.498489],[-122.21954000000001,47.498520000000006],[-122.21950000000001,47.49870000000001],[-122.21935,47.49924],[-122.21929000000002,47.499370000000006],[-122.21924000000001,47.49945],[-122.21918000000001,47.499531000000005],[-122.21909000000001,47.499612000000006],[-122.21902000000001,47.499655000000004],[-122.21888,47.49971000000001],[-122.21886,47.499749],[-122.218852,47.49976],[-122.21885,47.4998],[-122.21887,47.499990000000004],[-122.218897,47.500056],[-122.21892000000001,47.500083999999994],[-122.219018,47.50016],[-122.21906400000002,47.500222],[-122.21917,47.500392000000005],[-122.21921200000001,47.500571],[-122.21863,47.50032],[-122.21673,47.50082],[-122.21623000000001,47.50032],[-122.21103000000001,47.50092],[-122.20503,47.50422],[-122.20477,47.50427],[-122.20399,47.5044],[-122.2028,47.50461],[-122.20239,47.505230000000005],[-122.20333,47.508520000000004],[-122.20663,47.51422099999999],[-122.2097,47.51661],[-122.21203,47.51842],[-122.21090000000001,47.520050000000005],[-122.21085000000001,47.52013000000001],[-122.21078,47.520244],[-122.21069000000001,47.52037500000001],[-122.21064000000001,47.520455000000005],[-122.21058000000001,47.520540000000004],[-122.21053,47.520623],[-122.21048,47.520700000000005],[-122.21043,47.52078],[-122.21038,47.52086],[-122.21031500000001,47.52096],[-122.21027000000001,47.52103],[-122.21022000000002,47.52111000000001],[-122.21016000000002,47.521193000000004],[-122.21011300000002,47.521273],[-122.21006000000001,47.521358000000006],[-122.21001000000001,47.52144],[-122.20995,47.52152],[-122.2099,47.521602],[-122.20985,47.521679999999996],[-122.2098,47.521770000000004],[-122.20969000000001,47.521930000000005],[-122.20964000000001,47.52201000000001],[-122.20958,47.52209500000001],[-122.20953,47.52217000000001],[-122.20948,47.52226],[-122.20943,47.52234000000001],[-122.2094,47.522380000000005],[-122.20938,47.522420000000004],[-122.20932,47.522501000000005],[-122.20926900000002,47.52258500000001],[-122.20922000000002,47.52266],[-122.20916000000001,47.522749000000005],[-122.20911000000001,47.522830000000006],[-122.20906000000001,47.52291000000001],[-122.20901,47.52299000000001],[-122.20895900000001,47.523070000000004],[-122.20893,47.52310000000001],[-122.2089,47.52315000000001],[-122.20885,47.52324],[-122.2088,47.523306000000005],[-122.20873999999999,47.523404],[-122.20869,47.52348],[-122.20863,47.52357000000001],[-122.20858,47.52365],[-122.20853,47.52373000000001],[-122.20848,47.5238],[-122.20846999999999,47.52382],[-122.20844,47.523900000000005],[-122.20857,47.523900000000005],[-122.20852000000001,47.52396],[-122.20848,47.524004],[-122.20844,47.52407],[-122.2084,47.52413000000001],[-122.20836,47.52418],[-122.20832,47.52424],[-122.20826000000001,47.52431000000001],[-122.2082,47.524404],[-122.20812000000001,47.52451000000001],[-122.20804,47.52463],[-122.208,47.52468],[-122.20796300000002,47.524737],[-122.20792500000002,47.52479],[-122.20785000000001,47.5249],[-122.20781000000001,47.524954],[-122.20777,47.525009000000004],[-122.207745,47.525040000000004],[-122.20771,47.525093000000005],[-122.20767000000001,47.52514000000001],[-122.20763000000001,47.525200000000005],[-122.20752000000002,47.525360000000006],[-122.2074,47.52553000000001],[-122.20732000000001,47.52564],[-122.20725000000002,47.52574200000001],[-122.20714000000001,47.52590000000001],[-122.20704,47.52604],[-122.20698,47.526126000000005],[-122.2069,47.52624],[-122.20683,47.526346000000004],[-122.20671,47.52651000000001],[-122.20651000000001,47.526790000000005],[-122.206002,47.52754],[-122.20592,47.52766],[-122.20566000000001,47.52805000000001],[-122.20558,47.528161000000004],[-122.20551,47.52828],[-122.20552,47.52833000000001],[-122.205486,47.52838200000001],[-122.20539,47.52845000000001],[-122.20528,47.52853000000001],[-122.20479,47.528780000000005],[-122.20499000000001,47.52929],[-122.20501,47.52966],[-122.20512000000001,47.52966],[-122.20515,47.529830000000004],[-122.20515,47.530010000000004],[-122.205143,47.530390000000004],[-122.20516,47.5308],[-122.20516,47.530986],[-122.20517,47.53112],[-122.20516,47.531149],[-122.20514,47.53117],[-122.20511,47.531194],[-122.20509,47.53121],[-122.20506,47.53123],[-122.20503599999999,47.531242],[-122.20501,47.531259999999996],[-122.20499000000001,47.531268999999995],[-122.204972,47.531275],[-122.20495000000001,47.531282],[-122.20493,47.531292],[-122.20492000000002,47.5313],[-122.20491000000001,47.53132],[-122.20491000000001,47.531337],[-122.20489,47.53136],[-122.20488,47.53139],[-122.204874,47.5314],[-122.20486000000001,47.53142],[-122.20485000000001,47.531439999999996],[-122.20484,47.53145],[-122.20483,47.531459999999996],[-122.20481000000001,47.53147],[-122.20478,47.5315],[-122.20468000000001,47.53158],[-122.20465000000002,47.53161],[-122.20463000000001,47.53163],[-122.20459000000001,47.531659999999995],[-122.20457,47.53168399999999],[-122.20452700000001,47.53172],[-122.20448,47.53175],[-122.20446000000001,47.53177],[-122.2044,47.531819999999996],[-122.20438,47.53185],[-122.20435,47.53187],[-122.20422000000002,47.53199],[-122.20421000000002,47.532000000000004],[-122.20358,47.532149000000004],[-122.20352000000001,47.532209],[-122.20336,47.53226],[-122.20332,47.53237000000001],[-122.20333,47.5326],[-122.20329000000001,47.532630000000005],[-122.20323,47.53268],[-122.20320000000001,47.532700000000006],[-122.20316000000001,47.532725000000006],[-122.20313,47.53275000000001],[-122.20311000000001,47.532761],[-122.20309,47.53278],[-122.20305,47.532796000000005],[-122.20304,47.532810000000005],[-122.20302000000001,47.53282],[-122.20301,47.532837],[-122.20301,47.53286],[-122.203,47.53287],[-122.20299,47.532891],[-122.20297,47.53291000000001],[-122.20294,47.53294],[-122.20292,47.53296],[-122.2029,47.532990000000005],[-122.20289,47.533009],[-122.20288,47.533026],[-122.20288,47.53304],[-122.20286,47.53306],[-122.20284,47.53311000000001],[-122.202816,47.533148000000004],[-122.202803,47.53318],[-122.20279599999999,47.533210000000004],[-122.20279,47.53324],[-122.20276999999999,47.533288],[-122.20275,47.533350000000006],[-122.20272,47.53342],[-122.20270599999999,47.533449],[-122.20269,47.533483999999994],[-122.20268,47.53351000000001],[-122.20269,47.533529],[-122.20269,47.533550000000005],[-122.20269,47.53357200000001],[-122.20268,47.5336],[-122.20268,47.533631],[-122.202403,47.533879],[-122.20237999999999,47.533880999999994],[-122.20233999999999,47.533879999999996],[-122.20227,47.533879],[-122.20224,47.533879999999996],[-122.20223,47.533882],[-122.20211,47.533891],[-122.2021,47.53389],[-122.20206,47.5339],[-122.20204199999999,47.53389],[-122.20195000000001,47.5339],[-122.20193,47.533910000000006],[-122.20190000000001,47.53392],[-122.20188,47.533927],[-122.20186000000001,47.533930000000005],[-122.201818,47.533950000000004],[-122.2018,47.53396],[-122.20178,47.533970000000004],[-122.20172000000001,47.53402],[-122.20171,47.53404],[-122.2017,47.53406699999999],[-122.20169000000001,47.534104],[-122.20167000000001,47.53414],[-122.201638,47.53424],[-122.20163000000001,47.53435],[-122.20155700000001,47.53441],[-122.20145000000001,47.534485999999994],[-122.2014,47.53452],[-122.20134,47.53452],[-122.20123000000001,47.53452],[-122.20116000000002,47.534510000000004],[-122.20111000000001,47.5345],[-122.20107,47.534499],[-122.20103,47.534499],[-122.20101000000001,47.5345],[-122.20096000000001,47.534501],[-122.20092500000001,47.534510000000004],[-122.20091000000001,47.534510000000004],[-122.20089,47.534510000000004],[-122.20086,47.534535000000005],[-122.20086,47.53455],[-122.20087,47.53457],[-122.20088,47.534582],[-122.20091000000001,47.53459],[-122.20094,47.5346],[-122.20098,47.53461],[-122.20103,47.53461],[-122.20113,47.53461],[-122.20122000000002,47.53461],[-122.20133,47.53462],[-122.20139,47.534639999999996],[-122.20144,47.53465],[-122.20147,47.53466699999999],[-122.20149,47.534679999999994],[-122.20126000000002,47.534879999999994],[-122.20122000000002,47.534893],[-122.20119100000001,47.5349],[-122.20116000000002,47.53491],[-122.20113,47.53492],[-122.20109000000001,47.53493],[-122.20106000000001,47.53495],[-122.20104,47.534971],[-122.20102000000001,47.53501000000001],[-122.20099,47.535030000000006],[-122.20096000000001,47.53504],[-122.20091000000001,47.53505200000001],[-122.20088,47.535050000000005],[-122.20083,47.53506],[-122.20076999999999,47.53505800000001],[-122.20072,47.535064],[-122.2007,47.535070000000005],[-122.20069000000001,47.535070000000005],[-122.20066000000001,47.53506],[-122.20064,47.53505800000001],[-122.20058,47.535091],[-122.20058,47.53511000000001],[-122.20058,47.53513000000001],[-122.20058,47.535140000000006],[-122.20059,47.5352],[-122.20061000000001,47.535250000000005],[-122.20061000000001,47.53530000000001],[-122.20057,47.53533000000001],[-122.20048,47.53539800000001],[-122.200287,47.535500000000006],[-122.2001,47.535624],[-122.20006000000001,47.53566],[-122.20002600000001,47.53568],[-122.2,47.53569],[-122.19997099999999,47.53571200000001],[-122.19985,47.5358],[-122.19982,47.53582],[-122.19979,47.53584],[-122.19939,47.53609],[-122.19936,47.536100000000005],[-122.19933999999999,47.53611000000001],[-122.19931,47.53614],[-122.19929,47.53616],[-122.19927,47.536176000000005],[-122.19911,47.53626],[-122.19904,47.536307],[-122.19891,47.536410000000004],[-122.19886999999999,47.536437],[-122.19877999999999,47.536500000000004],[-122.19872,47.536550000000005],[-122.19865,47.536614],[-122.19854,47.5367],[-122.19839999999999,47.53682],[-122.19834999999999,47.53685],[-122.19827,47.53692],[-122.19821,47.536970000000004],[-122.19809,47.53705],[-122.19807999999999,47.53706],[-122.19803999999999,47.537092],[-122.19801,47.537110000000006],[-122.19799,47.537130000000005],[-122.19798,47.537144],[-122.19795,47.537165],[-122.19791900000001,47.5372],[-122.19791000000001,47.53721],[-122.19789,47.53722],[-122.19786,47.537255],[-122.197816,47.537279999999996],[-122.19778,47.537310000000005],[-122.19772,47.53735],[-122.19768,47.53737],[-122.19766000000001,47.537388],[-122.197632,47.5374],[-122.19758,47.537445],[-122.19756000000001,47.537459999999996],[-122.19752000000001,47.53749],[-122.1975,47.5375],[-122.19748,47.53752],[-122.19746,47.53754],[-122.19741,47.53758],[-122.1974,47.537603],[-122.19736999999999,47.53763],[-122.19735,47.537652],[-122.19734,47.537659999999995],[-122.197328,47.53767],[-122.1973,47.53769],[-122.19728,47.537701],[-122.19726000000001,47.537710000000004],[-122.19723,47.53772],[-122.19720000000001,47.53772],[-122.19715000000001,47.53773],[-122.1971,47.537741],[-122.19709,47.53775],[-122.197055,47.537746],[-122.19703,47.53773],[-122.19702000000001,47.53772],[-122.19699,47.537706],[-122.19694,47.53767],[-122.19693,47.537659999999995],[-122.19686999999999,47.53761],[-122.196833,47.537575000000004],[-122.19678499999999,47.537532000000006],[-122.19676,47.5375],[-122.19675,47.53749],[-122.19668,47.53747],[-122.19658,47.53745],[-122.19654,47.53745],[-122.19652,47.537459999999996],[-122.19648,47.53748099999999],[-122.19646,47.537488999999994],[-122.19644,47.53749],[-122.19641,47.537478],[-122.1964,47.53747],[-122.19637999999999,47.537475],[-122.19636999999999,47.5375],[-122.19636,47.53752],[-122.19636,47.537527],[-122.19636,47.537545],[-122.19637699999998,47.537569],[-122.19641,47.537577],[-122.196439,47.53758],[-122.19646,47.537603999999995],[-122.19646999999999,47.53762],[-122.19649,47.53763],[-122.19651,47.53764399999999],[-122.19653,47.53765],[-122.19655,47.537659999999995],[-122.19658,47.53767],[-122.1966,47.537692],[-122.19661,47.537703],[-122.19663,47.53772],[-122.19665,47.537734],[-122.19667,47.537745],[-122.19669,47.537756],[-122.19671,47.537773],[-122.19672999999999,47.537788],[-122.19674499999999,47.53779],[-122.19676,47.53781],[-122.19678599999999,47.53783],[-122.1968,47.537839999999996],[-122.19682,47.537859999999995],[-122.19685,47.53787],[-122.19686999999999,47.53789],[-122.19691,47.537909],[-122.19692,47.53793],[-122.19693,47.537952000000004],[-122.19694,47.537969],[-122.19694,47.53798],[-122.19691,47.53799],[-122.19688,47.538000000000004],[-122.19685,47.538011000000004],[-122.19677999999999,47.53801000000001],[-122.19676999999999,47.53801000000001],[-122.19672999999999,47.538005000000005],[-122.19665,47.538004],[-122.19661,47.53801000000001],[-122.19657,47.538011000000004],[-122.196512,47.538007],[-122.196439,47.53801000000001],[-122.1964,47.53801000000001],[-122.19636999999999,47.53801500000001],[-122.19636,47.53801000000001],[-122.19633499999999,47.53802],[-122.1963,47.538030000000006],[-122.19627,47.538030000000006],[-122.19623,47.538039000000005],[-122.19619,47.538047],[-122.19614,47.538050000000005],[-122.19609,47.53806],[-122.19606,47.53806],[-122.19604,47.53808],[-122.19603,47.538090000000004],[-122.19603,47.53811000000001],[-122.19603,47.538123000000006],[-122.19605,47.53813000000001],[-122.19608,47.53813900000001],[-122.1961,47.53815000000001],[-122.19612000000001,47.53815000000001],[-122.19614,47.538160000000005],[-122.19616,47.53817000000001],[-122.19618,47.53817000000001],[-122.1962,47.53817000000001],[-122.19623,47.538177000000005],[-122.19625,47.53819000000001],[-122.19628,47.53819500000001],[-122.19631,47.5382],[-122.19633999999999,47.5382],[-122.19636,47.53821000000001],[-122.19637999999999,47.538221],[-122.1964,47.538222000000005],[-122.196426,47.538230000000006],[-122.19644,47.53824],[-122.19646999999999,47.538250000000005],[-122.19649,47.538256000000004],[-122.1965,47.538270000000004],[-122.19649,47.53828],[-122.19649,47.53829],[-122.19646999999999,47.53830800000001],[-122.19644,47.538320000000006],[-122.19642,47.53833000000001],[-122.19642,47.538340000000005],[-122.19641,47.538354000000005],[-122.196394,47.53837000000001],[-122.19636999999999,47.538394000000004],[-122.19635,47.538410000000006],[-122.19626000000001,47.53848],[-122.19623,47.53851900000001],[-122.19621000000001,47.538529000000004],[-122.19621000000001,47.538540000000005],[-122.19618,47.53855000000001],[-122.19617,47.53857000000001],[-122.19614,47.53858],[-122.19611,47.53862],[-122.19606999999999,47.538654],[-122.19605,47.53868],[-122.19604,47.53871000000001],[-122.19603,47.53873600000001],[-122.19602,47.53876],[-122.19601,47.538790000000006],[-122.196,47.538817],[-122.19599,47.538848],[-122.19597999999999,47.53887],[-122.195983,47.53888],[-122.19597999999999,47.538900000000005],[-122.19597999999999,47.538908000000006],[-122.19597399999999,47.538920000000005],[-122.19596999999999,47.538940000000004],[-122.19596,47.538961],[-122.19596,47.53898],[-122.19595,47.539010000000005],[-122.19595,47.53902],[-122.19595,47.539038000000005],[-122.19595,47.539049],[-122.19595,47.53908],[-122.19595,47.539094],[-122.19595,47.539131000000005],[-122.19596,47.539173000000005],[-122.19596,47.539190000000005],[-122.19596999999999,47.539206],[-122.19596999999999,47.53922],[-122.19596999999999,47.53923],[-122.19596999999999,47.53924],[-122.19596999999999,47.53928],[-122.19597999999999,47.539307],[-122.19597999999999,47.53933000000001],[-122.19597999999999,47.539336000000006],[-122.19556,47.53934],[-122.195405,47.53934],[-122.19512999999999,47.53933800000001],[-122.1949,47.53936],[-122.19467,47.53936],[-122.19426000000001,47.53936],[-122.19409,47.53848],[-122.19251,47.538438000000006],[-122.19256999999999,47.538340000000005],[-122.19274999999999,47.53810000000001],[-122.19284999999999,47.53796],[-122.19287899999999,47.537924],[-122.19239999999999,47.537731],[-122.19239999999999,47.53742],[-122.19239999999999,47.53737],[-122.19238999999999,47.53678],[-122.19237999999999,47.53528],[-122.19306,47.53528],[-122.19305,47.534819999999996],[-122.19284999999999,47.534819999999996],[-122.192519,47.534819999999996],[-122.19236999999998,47.534819999999996],[-122.19238999999999,47.533],[-122.19297999999999,47.533],[-122.19373499999999,47.533],[-122.19373999999999,47.531928],[-122.19368,47.53184399999999],[-122.19363,47.53174],[-122.193602,47.531639999999996],[-122.19359,47.531530000000004],[-122.19358,47.5312],[-122.19324,47.5312],[-122.19094,47.531242],[-122.19106000000001,47.525090000000006],[-122.19106000000001,47.5249],[-122.19042999999999,47.52382],[-122.19019,47.52347],[-122.18978999999999,47.522963000000004],[-122.18957999999999,47.522740000000006],[-122.18937999999999,47.52259000000001],[-122.18923099999999,47.52266],[-122.18918,47.52252000000001],[-122.1891,47.52250000000001],[-122.189026,47.522490000000005],[-122.18896,47.52248],[-122.18888999999999,47.52248],[-122.18881999999999,47.52248],[-122.18877999999998,47.522483],[-122.18873999999998,47.52248],[-122.18867999999999,47.522489],[-122.18863999999999,47.522496000000004],[-122.18858999999999,47.52250000000001],[-122.18852999999999,47.52252000000001],[-122.18846999999998,47.52253000000001],[-122.18842,47.52255000000001],[-122.18834999999999,47.52257000000001],[-122.18830999999999,47.522600000000004],[-122.18827999999999,47.52261000000001],[-122.18824,47.52263000000001],[-122.18818999999999,47.52266],[-122.18816,47.522690000000004],[-122.18811799999999,47.52272200000001],[-122.18807999999999,47.52275900000001],[-122.18804999999999,47.522794000000005],[-122.18802999999998,47.52282],[-122.18800999999999,47.522850000000005],[-122.18794,47.522966000000004],[-122.18787999999999,47.523049],[-122.18741,47.52302],[-122.18741,47.52201000000001],[-122.18702,47.52200800000001],[-122.18656,47.522017000000005],[-122.18607999999999,47.522017000000005],[-122.186013,47.52203000000001],[-122.18597999999999,47.52203000000001],[-122.18581999999999,47.52211000000001],[-122.18567999999999,47.52211000000001],[-122.185656,47.522040000000004],[-122.18566999999999,47.521792000000005],[-122.18566999999999,47.52172],[-122.18570999999999,47.52116],[-122.18573999999998,47.520100000000006],[-122.18577999999998,47.51871200000001],[-122.18574999999998,47.51806],[-122.18553999999999,47.51806],[-122.18502999999998,47.51759],[-122.18408,47.51675],[-122.18404,47.51672],[-122.18416,47.516722],[-122.18406999999999,47.516635],[-122.18361,47.51663],[-122.18148,47.51661],[-122.18047299999999,47.5166],[-122.180403,47.5166],[-122.17969,47.516597],[-122.17969,47.516462],[-122.17969,47.5161],[-122.17969999999998,47.51594],[-122.17969999999998,47.51574],[-122.17969999999998,47.51552],[-122.17732,47.515479],[-122.17732999999998,47.515434],[-122.17661,47.51543],[-122.1766,47.51493],[-122.17661,47.514745],[-122.17661,47.514419999999994],[-122.17607999999998,47.514419999999994],[-122.175643,47.51441],[-122.17534999999998,47.51441],[-122.17520999999999,47.51441],[-122.17522,47.51378],[-122.17522,47.51367],[-122.174915,47.51367],[-122.17469999999999,47.51359],[-122.17318999999999,47.513574],[-122.17294999999999,47.513571],[-122.17229999999998,47.51122099999999],[-122.17226699999999,47.51112],[-122.17272999999997,47.511058],[-122.17253699999998,47.510393],[-122.17262,47.51027],[-122.17262,47.509242],[-122.17264999999999,47.508430000000004],[-122.17136999999998,47.508446],[-122.17108999999999,47.50844],[-122.1711,47.50851000000001],[-122.17124,47.50851000000001],[-122.17124,47.50887],[-122.17121900000001,47.508973000000005],[-122.17042999999998,47.50896],[-122.17069,47.510079999999995],[-122.16996,47.51007],[-122.16995,47.51021],[-122.16982,47.51021],[-122.16982,47.51103],[-122.16982,47.51163],[-122.1698,47.51186799999999],[-122.16994,47.51187099999999],[-122.17005999999999,47.511869999999995],[-122.17004999999999,47.512170000000005],[-122.17092,47.512181],[-122.17116,47.51301],[-122.17057999999999,47.51354],[-122.17070999999999,47.51355],[-122.17074999999998,47.51355],[-122.17080999999999,47.513553],[-122.16986999999999,47.514419999999994],[-122.16987999999999,47.515169],[-122.16986,47.516518000000005],[-122.16902999999999,47.51652],[-122.16891,47.516510000000004],[-122.16471,47.516479999999994],[-122.16454,47.516479999999994],[-122.16031,47.516459999999995],[-122.15982,47.51615],[-122.15979099999998,47.516130000000004],[-122.15970999999999,47.5161],[-122.15964,47.516075],[-122.15957999999999,47.516059999999996],[-122.15952,47.516059999999996],[-122.15936999999998,47.516059999999996],[-122.15915,47.5161],[-122.15923,47.51629],[-122.15925,47.516439999999996],[-122.15926999999999,47.51653],[-122.15929,47.51672],[-122.1592,47.517861999999994],[-122.15912,47.518727],[-122.15638999999999,47.518297],[-122.1536,47.517869999999995],[-122.15357999999999,47.518],[-122.15302999999999,47.51789699999999],[-122.15173999999999,47.5177],[-122.15096999999999,47.51761],[-122.14986999999999,47.51747399999999],[-122.14956000000001,47.51743999999999],[-122.14842999999999,47.51732],[-122.14596999999999,47.51715],[-122.14592,47.51714],[-122.14472,47.51705],[-122.14447,47.516999999999996],[-122.14404,47.516903],[-122.14359,47.51675],[-122.14336,47.516635],[-122.14311000000001,47.51652],[-122.14319,47.51645],[-122.14318,47.51528],[-122.14318,47.51506],[-122.14321000000001,47.514359999999996],[-122.14321300000002,47.514289999999995],[-122.143217,47.514179999999996],[-122.14324,47.513514],[-122.14325000000001,47.51345],[-122.14325000000001,47.513239999999996],[-122.14328,47.512170000000005],[-122.14429300000002,47.512176000000004],[-122.14434,47.512170000000005],[-122.144391,47.512170000000005],[-122.14529999999999,47.51208],[-122.14533999999999,47.51207],[-122.14533999999999,47.512015000000005],[-122.14533999999999,47.51197],[-122.14536999999999,47.50992],[-122.14536999999999,47.509761],[-122.14582999999999,47.509764],[-122.14669,47.509794],[-122.14846,47.509855],[-122.14856999999999,47.509859999999996],[-122.14859,47.508770000000005],[-122.14502,47.508720000000004],[-122.14441000000001,47.508720000000004],[-122.1443,47.508720000000004],[-122.14382,47.508721],[-122.14332999999999,47.508711000000005],[-122.14332999999999,47.50856],[-122.14332,47.50802],[-122.14332,47.507259999999995],[-122.14332,47.506840999999994],[-122.14332,47.506479999999996],[-122.14332999999999,47.505589],[-122.14332999999999,47.505385000000004],[-122.14332,47.504163],[-122.14332,47.50378],[-122.14331,47.502810000000004],[-122.14864,47.502873],[-122.148635,47.501965],[-122.14742000000001,47.501953],[-122.1474,47.50105],[-122.14635,47.50103],[-122.1458,47.50102],[-122.14558,47.50103],[-122.14352000000001,47.50099],[-122.14328,47.50098],[-122.14327,47.50072],[-122.14324,47.49922],[-122.14321000000001,47.49828],[-122.14319,47.497411],[-122.14319,47.49718],[-122.14315,47.49575000000001],[-122.14315,47.495551000000006],[-122.14252,47.495551000000006],[-122.14175,47.495543000000005],[-122.14062000000001,47.495520000000006],[-122.13969,47.495498000000005],[-122.13808999999999,47.495470000000005],[-122.13802999999999,47.49546],[-122.13798,47.495430000000006],[-122.13782,47.495537000000006],[-122.1352,47.495464],[-122.13513999999999,47.49233000000001],[-122.13506,47.48832],[-122.13493,47.48832],[-122.13439,47.48832],[-122.13306,47.488310000000006],[-122.13242,47.4883],[-122.13095,47.488268],[-122.12982,47.48824],[-122.12982,47.48759999999999],[-122.12982,47.487339999999996],[-122.13111,47.48735],[-122.13242,47.487362],[-122.13239999999999,47.486833],[-122.13238999999999,47.48566699999999],[-122.13277599999998,47.485658],[-122.133297,47.48566099999999],[-122.133873,47.48566699999999],[-122.13465000000001,47.48567],[-122.135253,47.485679999999995],[-122.13526999999999,47.48512],[-122.13526900000001,47.48491],[-122.135273,47.48468999999999],[-122.13696,47.4847],[-122.13762000000001,47.48467099999999],[-122.13759,47.48343],[-122.13759900000001,47.48335],[-122.13570999999999,47.483359],[-122.13235999999999,47.48327999999999],[-122.13113,47.48327],[-122.130221,47.48325],[-122.12973999999998,47.483236],[-122.12973999999998,47.48331],[-122.12973999999998,47.483376],[-122.12975999999999,47.484016],[-122.12976999999998,47.48418399999999],[-122.12899999999999,47.48417],[-122.12715,47.48415],[-122.1265,47.48413],[-122.12651,47.484592],[-122.12636999999998,47.484579999999994],[-122.12628,47.484579999999994],[-122.1262,47.48457],[-122.12612999999999,47.484559999999995],[-122.12601,47.48453],[-122.12553999999999,47.48459],[-122.12458,47.484575],[-122.12222,47.484536],[-122.12212999999998,47.48455],[-122.12207999999998,47.48457],[-122.120944,47.48448799999999],[-122.12093399999999,47.48402099999999],[-122.12062,47.484019999999994],[-122.12030999999999,47.484012],[-122.12029,47.483537],[-122.12056,47.483545],[-122.12069,47.483533],[-122.12199,47.48355],[-122.12237199999997,47.48356],[-122.12437999999999,47.483599999999996],[-122.12436999999998,47.482679999999995],[-122.12454,47.482682],[-122.124618,47.482710000000004],[-122.1248,47.482730000000004],[-122.12608999999999,47.48275],[-122.12707999999999,47.48275],[-122.12706999999999,47.48234],[-122.12706999999999,47.48189099999999],[-122.12706,47.481609999999996],[-122.12706,47.48143999999999],[-122.12706,47.480996],[-122.12499999999999,47.480996],[-122.12473999999999,47.480996],[-122.1245,47.480996],[-122.12436999999998,47.48092],[-122.12442999999999,47.48105999999999],[-122.12445,47.481227999999994],[-122.12446999999999,47.48185399999999],[-122.12432999999999,47.48187999999999],[-122.12316,47.481869999999994],[-122.12292999999998,47.48186199999999],[-122.121974,47.48183999999999],[-122.1218,47.48180399999999],[-122.12174999999999,47.48168999999999],[-122.12169999999999,47.48123999999999],[-122.12174999999999,47.48107699999999],[-122.12177999999999,47.48097],[-122.12172999999999,47.478878],[-122.12166,47.47533000000001],[-122.12154,47.47534],[-122.12138999999999,47.47524],[-122.1214,47.475197],[-122.1215,47.475186],[-122.12154,47.47516],[-122.12156999999999,47.475150000000006],[-122.12162000000001,47.475100000000005],[-122.12163,47.47495],[-122.12164,47.47432],[-122.12162000000001,47.473725],[-122.12292999999998,47.47374],[-122.12393999999999,47.473745],[-122.12438999999999,47.47375],[-122.12443999999999,47.47556],[-122.12467,47.475563],[-122.12693999999999,47.4756],[-122.12692999999999,47.47528],[-122.12692999999999,47.475120000000004],[-122.12762000000001,47.475120000000004],[-122.12781,47.47513000000001],[-122.12795,47.47513000000001],[-122.12922,47.47514],[-122.12978999999999,47.475145000000005],[-122.13016,47.475148000000004],[-122.13226999999999,47.475166],[-122.13226,47.47544],[-122.13226,47.47562],[-122.13226,47.47581],[-122.13224,47.47589],[-122.13224,47.475970000000004],[-122.13229,47.47783999999999],[-122.13229,47.47834],[-122.13428,47.47836],[-122.13501,47.478363],[-122.13502,47.478556000000005],[-122.13502999999999,47.47892],[-122.13504999999999,47.47927],[-122.13576799999998,47.479279999999996],[-122.13759900000001,47.479310000000005],[-122.13760300000001,47.4794],[-122.13761000000001,47.47956],[-122.13762000000001,47.47964699999999],[-122.13763,47.480019999999996],[-122.13763,47.48031],[-122.13761000000001,47.48083999999999],[-122.13759,47.480959999999996],[-122.13759,47.481139999999996],[-122.13767,47.481139999999996],[-122.14034,47.48111],[-122.14286999999999,47.481159999999996],[-122.14475,47.48119],[-122.14553,47.48121],[-122.14567,47.48121999999999],[-122.1458,47.48121999999999],[-122.14585,47.48121999999999],[-122.14653,47.48123],[-122.14668,47.48123],[-122.14822000000001,47.48121999999999],[-122.14954,47.48121999999999],[-122.149502,47.47957],[-122.1495,47.4794],[-122.151168,47.47941],[-122.15344999999999,47.479422],[-122.15359,47.47943],[-122.1536,47.479997],[-122.15361,47.48125999999999],[-122.153626,47.48125999999999],[-122.15415,47.481249999999996],[-122.15446999999999,47.48124599999999],[-122.15487999999999,47.481249999999996],[-122.15592,47.481272999999995],[-122.15601,47.48127999999999],[-122.15644999999999,47.48127999999999],[-122.15642999999999,47.47986399999999],[-122.15606999999999,47.479253],[-122.156421,47.478956000000004],[-122.15639999999999,47.477639999999994],[-122.15738999999999,47.477639999999994],[-122.16415,47.47771],[-122.16415,47.47723],[-122.16415,47.476355000000005],[-122.16194,47.476330000000004],[-122.16151,47.476330000000004],[-122.16151,47.475744],[-122.16151,47.475590000000004],[-122.1615,47.47406099999999],[-122.16121000000001,47.474059],[-122.16086,47.474056],[-122.15616999999999,47.474018],[-122.15485,47.47398],[-122.15442999999999,47.47399],[-122.15432,47.473977],[-122.15416,47.47397],[-122.15386999999998,47.47396],[-122.15352,47.47396],[-122.15352,47.473819999999996],[-122.15353999999999,47.472753000000004],[-122.15356999999999,47.471233],[-122.15355,47.47094],[-122.15355,47.47093],[-122.15355,47.47085],[-122.15355,47.470679999999994],[-122.15353199999998,47.47068099999999],[-122.15348999999999,47.470679999999994],[-122.15346,47.470675],[-122.15342,47.47067],[-122.15335999999999,47.470676],[-122.15333999999999,47.470676],[-122.15328,47.470679],[-122.15325,47.470679999999994],[-122.15323,47.47068399999999],[-122.15321,47.470679999999994],[-122.1532,47.47068399999999],[-122.15316999999999,47.470679999999994],[-122.15315,47.470679999999994],[-122.15311,47.470659999999995],[-122.15307999999999,47.47065],[-122.15305,47.470638],[-122.15302,47.47063],[-122.15298999999999,47.47062],[-122.15296999999998,47.47061],[-122.15293999999999,47.470597],[-122.15290999999999,47.47058],[-122.15284999999999,47.470544],[-122.15279999999998,47.470510000000004],[-122.15132999999999,47.47052],[-122.14693,47.470452],[-122.146849,47.470479999999995],[-122.146804,47.47049],[-122.14677999999999,47.4705],[-122.14672,47.47052],[-122.14663,47.47054],[-122.14655,47.47056],[-122.14651,47.47057],[-122.14643099999999,47.470589],[-122.14639,47.470596],[-122.14634,47.4706],[-122.1463,47.47061],[-122.146251,47.47062],[-122.14620000000001,47.47063],[-122.14616000000001,47.470634],[-122.14611000000001,47.470639999999996],[-122.146083,47.470639999999996],[-122.14602000000001,47.470639999999996],[-122.14595,47.470639999999996],[-122.1459,47.47065],[-122.14582999999999,47.470648999999995],[-122.14573999999999,47.47065],[-122.14562000000001,47.47065],[-122.14552,47.47065],[-122.14541,47.47065],[-122.14533999999999,47.47065],[-122.145305,47.470639999999996],[-122.14525,47.470642],[-122.14523,47.470639999999996],[-122.1452,47.470638],[-122.14518199999999,47.47063],[-122.14513,47.47063],[-122.1451,47.47062],[-122.14505,47.47061],[-122.14501,47.470596],[-122.14498,47.470591],[-122.14491000000001,47.47058],[-122.14486000000001,47.47056],[-122.144822,47.47055],[-122.14477,47.470538000000005],[-122.14472,47.47052],[-122.14469000000001,47.470510000000004],[-122.14465000000001,47.47049],[-122.14460000000001,47.47047],[-122.14457,47.470462],[-122.14455000000001,47.47045],[-122.14451000000001,47.470439999999996],[-122.14444,47.470417],[-122.14433,47.470374],[-122.14428000000001,47.47035],[-122.14422000000002,47.47032],[-122.14419000000001,47.470310000000005],[-122.14414000000001,47.47029],[-122.144068,47.470259999999996],[-122.14398,47.47022],[-122.14397,47.47022],[-122.143941,47.470206],[-122.1439,47.47019],[-122.14386,47.47017],[-122.14382,47.470151],[-122.143789,47.47014],[-122.14372999999999,47.470105000000004],[-122.14369,47.470079999999996],[-122.14365000000001,47.470058],[-122.14361000000001,47.470033],[-122.14358,47.47001],[-122.14355,47.46998],[-122.1435,47.469950000000004],[-122.14347,47.469930000000005],[-122.14343,47.469910000000006],[-122.14338,47.46989],[-122.143307,47.46987],[-122.1434,47.46947],[-122.14358,47.468830000000004],[-122.14315,47.46878],[-122.14362000000001,47.467439999999996],[-122.14236,47.467223999999995],[-122.14273999999999,47.466294],[-122.14267,47.46627],[-122.14254,47.46624],[-122.142455,47.466221],[-122.14236999999999,47.466207],[-122.14224,47.466194],[-122.14194,47.466150000000006],[-122.14089,47.466],[-122.13996,47.465830000000004],[-122.13813999999999,47.46558],[-122.13752000000001,47.46546],[-122.13746,47.46544],[-122.13696999999999,47.465348000000006],[-122.13649,47.46528],[-122.13624,47.46524],[-122.13264,47.464639999999996],[-122.13076999999998,47.46432],[-122.12885999999999,47.46403],[-122.12691,47.463798000000004],[-122.12586999999998,47.463710000000006],[-122.12447999999999,47.46359],[-122.12386999999998,47.463561],[-122.12262,47.46349],[-122.12167,47.46343],[-122.12168,47.46327],[-122.12121,47.46325],[-122.12086999999998,47.46324],[-122.12091,47.46204],[-122.12091,47.461859999999994],[-122.12168,47.461859999999994],[-122.12174999999999,47.461859999999994],[-122.12312999999999,47.46202],[-122.12312999999999,47.462160000000004],[-122.123415,47.462194000000004],[-122.12392,47.462250000000004],[-122.12733999999999,47.461879999999994],[-122.1274,47.46187],[-122.12892999999998,47.461493],[-122.12928699999999,47.46142],[-122.13165000000001,47.46142],[-122.13234999999999,47.46134],[-122.13235999999999,47.460350000000005],[-122.13235999999999,47.460100000000004],[-122.13236999999998,47.45947999999999],[-122.13842,47.45957],[-122.14292,47.45963999999999],[-122.14292,47.45980599999999],[-122.14289699999999,47.460533000000005],[-122.142815,47.46328],[-122.14459000000001,47.463274],[-122.14462000000002,47.463370000000005],[-122.14482000000001,47.463344],[-122.14508,47.463370000000005],[-122.14529999999999,47.463491],[-122.14554,47.463738000000006],[-122.14564,47.46376],[-122.14587999999999,47.46364],[-122.14618,47.463617],[-122.14646,47.463730000000005],[-122.14663,47.463730000000005],[-122.14665600000001,47.46361],[-122.14659,47.46347],[-122.14671,47.463266],[-122.14779,47.46326],[-122.14788,47.463259],[-122.14792000000001,47.46329],[-122.14806,47.46336],[-122.14816,47.463419],[-122.1482,47.463442],[-122.14818,47.464679999999994],[-122.14816,47.465406],[-122.14876999999998,47.4654],[-122.14878999999999,47.465354000000005],[-122.14882999999999,47.465309000000005],[-122.14894,47.465266],[-122.14907,47.46524],[-122.14917,47.465250000000005],[-122.149271,47.46528],[-122.149365,47.46531000000001],[-122.14959,47.46531200000001],[-122.14974,47.46526],[-122.14981,47.4652],[-122.14993,47.465160000000004],[-122.14999,47.465164],[-122.15001,47.465165000000006],[-122.15011,47.465171000000005],[-122.1502,47.465210000000006],[-122.15024,47.465270000000004],[-122.15024,47.465340000000005],[-122.1502,47.465390000000006],[-122.1502,47.465430000000005],[-122.15033999999999,47.46551300000001],[-122.15047999999999,47.465720000000005],[-122.15059,47.46573000000001],[-122.15069999999999,47.465769],[-122.15074999999999,47.465832000000006],[-122.15079999999999,47.466],[-122.15102999999999,47.466001],[-122.15102999999999,47.465875000000004],[-122.15146,47.465920000000004],[-122.151655,47.46588],[-122.15165,47.46629],[-122.1518,47.46638],[-122.15196999999999,47.46662],[-122.15204999999999,47.46655200000001],[-122.15194,47.466522000000005],[-122.15192,47.466474],[-122.15189,47.466344],[-122.15192,47.46628],[-122.15185,47.466249],[-122.15186,47.465657],[-122.1531,47.465590000000006],[-122.15323,47.465610000000005],[-122.15330999999999,47.46567],[-122.15326999999999,47.465540000000004],[-122.15353499999999,47.46553000000001],[-122.15412,47.46551200000001],[-122.15415,47.46562],[-122.15431,47.46558],[-122.15456999999999,47.46551900000001],[-122.15433999999999,47.465410000000006],[-122.15351,47.465078000000005],[-122.15315,47.464917],[-122.15302999999999,47.464859999999994],[-122.15268999999999,47.464639999999996],[-122.15222999999999,47.46436],[-122.15186999999999,47.46416],[-122.151611,47.464],[-122.15135,47.46386699999999],[-122.15116,47.463777],[-122.15086999999998,47.46367],[-122.150314,47.46353500000001],[-122.14982,47.46342],[-122.14954,47.46336],[-122.14872,47.463163],[-122.14836999999999,47.46306],[-122.148065,47.462928000000005],[-122.14771,47.46271000000001],[-122.14736,47.46246],[-122.14717,47.46228],[-122.14695,47.46201800000001],[-122.146817,47.46178],[-122.14671,47.461452],[-122.14667,47.461017],[-122.14671,47.46074],[-122.146755,47.46058],[-122.146808,47.46044],[-122.1469,47.46026],[-122.14702000000001,47.460059],[-122.14713,47.45992],[-122.14722000000002,47.45981],[-122.14736,47.45967999999999],[-122.14744,47.459619999999994],[-122.1511,47.459599999999995],[-122.15112,47.45903],[-122.15352,47.459022],[-122.15366999999999,47.45903],[-122.15366,47.45918399999999],[-122.15365,47.45958099999999],[-122.15386999999998,47.459582],[-122.15575999999999,47.459593],[-122.1561,47.45959],[-122.15636999999998,47.459592],[-122.15596,47.45991],[-122.155429,47.46045],[-122.15548999999999,47.46074],[-122.15520199999999,47.46114],[-122.15478399999999,47.46209],[-122.15456999999999,47.462922000000006],[-122.15476,47.46324],[-122.15674999999999,47.46324],[-122.15889999999999,47.465410000000006],[-122.15892,47.467037],[-122.15957999999999,47.466930000000005],[-122.16013,47.46685],[-122.16026000000001,47.466710000000006],[-122.160185,47.466549],[-122.16052,47.46667],[-122.1609,47.46684],[-122.161257,47.46618],[-122.16144,47.46602],[-122.16184,47.46576],[-122.16212999999999,47.46567],[-122.16270999999999,47.46566],[-122.16291,47.465658000000005],[-122.16413,47.46602],[-122.16425000000001,47.46607],[-122.16424,47.465810000000005],[-122.16425000000001,47.464150000000004],[-122.16425000000001,47.463217],[-122.16426000000001,47.46121],[-122.16426000000001,47.46107],[-122.16427,47.460761],[-122.16427,47.460417],[-122.16427,47.46022],[-122.16427,47.46003],[-122.16427,47.45985999999999],[-122.16428,47.459593],[-122.16429000000001,47.459205],[-122.16429000000001,47.458999999999996],[-122.16429000000001,47.45879],[-122.1643,47.458588],[-122.1643,47.45838],[-122.16431,47.45818],[-122.16431,47.457984999999994],[-122.16432,47.457699999999996],[-122.16432,47.457635999999994],[-122.16414,47.457609999999995],[-122.16396,47.45757],[-122.16385,47.457525999999994],[-122.16367,47.457449999999994],[-122.16356999999999,47.457387999999995],[-122.16353,47.45735],[-122.16345,47.45725999999999],[-122.16308,47.456717],[-122.16322000000001,47.45664299999999],[-122.16331,47.456579999999995],[-122.16332999999999,47.456559999999996],[-122.16344,47.45643],[-122.16356999999999,47.45629399999999],[-122.16363,47.456219999999995],[-122.16368,47.456163999999994],[-122.16372999999999,47.4561],[-122.16378999999999,47.456019999999995],[-122.16384,47.455909],[-122.16412000000001,47.455908],[-122.16439,47.45591],[-122.16439,47.455839999999995],[-122.16442,47.45307],[-122.16445,47.452228],[-122.16446,47.45187999999999],[-122.16396,47.451792],[-122.16344,47.45216],[-122.16315300000001,47.45202],[-122.16308,47.45201],[-122.16336,47.45161999999999],[-122.16237999999998,47.451409999999996],[-122.16184,47.451429999999995],[-122.16166000000001,47.451449999999994],[-122.16149,47.45140599999999],[-122.16124,47.45178099999999],[-122.1611,47.45171],[-122.16103,47.45166499999999],[-122.16099,47.451629999999994],[-122.16087999999999,47.451499999999996],[-122.16053,47.45078899999999],[-122.16042,47.450572],[-122.16033999999999,47.450469999999996],[-122.16023,47.45037],[-122.1606,47.45011],[-122.160369,47.44937],[-122.1616,47.44925],[-122.16153,47.4489],[-122.16176999999999,47.448875],[-122.16178,47.4491],[-122.16187,47.449534],[-122.16261,47.449459999999995],[-122.1626,47.44912],[-122.16217999999999,47.44916],[-122.16223,47.448758000000005],[-122.16223,47.44839],[-122.16206999999999,47.44783999999999],[-122.16202999999999,47.447559999999996],[-122.16206999999999,47.44740099999999],[-122.16155,47.4473],[-122.16161000000001,47.447219999999994],[-122.16165000000001,47.447145],[-122.16165000000001,47.44705],[-122.16162000000001,47.44683],[-122.16175,47.446819999999995],[-122.16201,47.44678],[-122.162293,47.44674],[-122.16257999999999,47.446687999999995],[-122.16287999999999,47.44662099999999],[-122.1647,47.446142],[-122.16586,47.44584],[-122.16629999999999,47.44574],[-122.16657,47.44569],[-122.16687999999999,47.44567],[-122.16714,47.44566],[-122.16745,47.44566],[-122.16758,47.445671],[-122.16798,47.445723],[-122.16876999999998,47.445858],[-122.17011,47.446079999999995],[-122.17012999999999,47.444979999999994],[-122.17014999999999,47.44405999999999],[-122.17014999999999,47.443813],[-122.17018999999999,47.441902],[-122.1702,47.441627999999994],[-122.1702,47.441379999999995],[-122.1702,47.441359999999996],[-122.17004999999999,47.441359999999996],[-122.16942999999999,47.441351],[-122.16699,47.439609],[-122.16727,47.43942],[-122.16855,47.438550000000006],[-122.16865,47.438570000000006],[-122.16996999999999,47.43772],[-122.17216999999998,47.437742],[-122.17275999999998,47.43629],[-122.17317999999999,47.43526],[-122.17342999999998,47.43465],[-122.17367999999999,47.434039999999996],[-122.17369,47.43379],[-122.17369999999998,47.433710000000005],[-122.17369599999999,47.43365],[-122.17369599999999,47.433591],[-122.17369599999999,47.43358],[-122.17370999999999,47.43323],[-122.17392999999998,47.43323],[-122.174202,47.43323],[-122.17451,47.43323],[-122.17446,47.432950000000005],[-122.17433999999999,47.432370000000006],[-122.17407999999999,47.431115000000005],[-122.17411,47.43029],[-122.17481,47.43029],[-122.17579999999998,47.430279999999996],[-122.17609999999999,47.430279999999996],[-122.17666,47.43027],[-122.17721,47.43027],[-122.17897999999998,47.43026],[-122.17916999999998,47.430257],[-122.18114,47.430246],[-122.18358699999999,47.43023],[-122.18446,47.43023],[-122.18646,47.430217],[-122.18782999999999,47.430215000000004],[-122.18966,47.43022],[-122.190951,47.43023],[-122.19129000000001,47.43023],[-122.19171,47.43023],[-122.19246999999999,47.43023],[-122.19384,47.43023],[-122.19556,47.43023],[-122.19709,47.43023],[-122.19708,47.42850000000001],[-122.19708,47.42669],[-122.19708,47.42582],[-122.19706000000001,47.42404],[-122.19706000000001,47.423100000000005],[-122.197944,47.42310200000001],[-122.19877999999999,47.42310500000001],[-122.19969,47.42311000000001],[-122.19988,47.42311000000001],[-122.20099,47.42311000000001],[-122.2018,47.42311300000001],[-122.20232999999999,47.42311000000001],[-122.20262000000001,47.423120000000004],[-122.20301,47.423120000000004],[-122.20396000000001,47.423120000000004],[-122.20432000000001,47.423120000000004],[-122.20443,47.42313000000001],[-122.20453,47.42313000000001],[-122.20465000000002,47.42313000000001],[-122.20503,47.42313000000001],[-122.20559,47.42313000000001],[-122.20611000000001,47.42313000000001],[-122.20757,47.42313000000001],[-122.20894,47.423120000000004],[-122.20995300000001,47.42311300000001],[-122.21151000000002,47.423097],[-122.21239,47.42309],[-122.21273,47.42308],[-122.21343,47.423076],[-122.21469000000002,47.42306],[-122.21485000000001,47.423058000000005],[-122.21626000000002,47.42304],[-122.21755000000002,47.42302],[-122.21790000000001,47.423],[-122.21797000000001,47.422984],[-122.21811000000001,47.423634],[-122.21812000000001,47.42422],[-122.21812000000001,47.42434],[-122.21813,47.42456],[-122.21809,47.425188000000006],[-122.2181,47.42533000000001],[-122.21811000000001,47.42598],[-122.21812000000001,47.42624],[-122.21812000000001,47.42646],[-122.21818,47.42749],[-122.21821600000001,47.429750000000006],[-122.21822000000002,47.429786],[-122.21822000000002,47.43007],[-122.21821000000001,47.430246],[-122.21837,47.43025],[-122.21847,47.430251],[-122.21896000000001,47.43024],[-122.21928000000001,47.43022],[-122.21976000000001,47.43018],[-122.21994000000001,47.43019],[-122.21988,47.43039],[-122.21895,47.43403],[-122.21829000000001,47.436623],[-122.21819,47.43699],[-122.21806000000001,47.4375],[-122.21805,47.43754],[-122.21798000000001,47.437619999999995],[-122.21786000000002,47.43776],[-122.21746000000002,47.438229],[-122.21731000000001,47.438406],[-122.21702000000002,47.43874],[-122.21691000000001,47.439],[-122.216856,47.43911000000001],[-122.21683,47.439170000000004],[-122.21664000000001,47.439574],[-122.21657,47.43964],[-122.21633,47.43984],[-122.21620000000001,47.43996],[-122.21605000000001,47.440082],[-122.21594,47.44017],[-122.21569000000001,47.440391],[-122.21566000000001,47.440419999999996],[-122.21562000000002,47.44060399999999],[-122.21561200000001,47.440625999999995],[-122.21558,47.44077],[-122.21554,47.44097],[-122.21553,47.441019999999995],[-122.2155,47.44114],[-122.21584,47.44115],[-122.21649900000001,47.44117],[-122.21746000000002,47.44117],[-122.21759000000002,47.44117],[-122.21772000000001,47.44116399999999],[-122.21989,47.441122],[-122.22146000000001,47.441123],[-122.22382,47.44113],[-122.22395,47.441136],[-122.22703,47.44115],[-122.22779,47.44115],[-122.22976999999999,47.441158],[-122.23289,47.441168],[-122.2351,47.441174],[-122.23525000000001,47.441175],[-122.23648,47.441178],[-122.23883,47.441179999999996],[-122.239,47.441179999999996],[-122.23908,47.441176],[-122.24098000000001,47.441199999999995],[-122.24096000000002,47.44155],[-122.24096000000002,47.441955],[-122.24093,47.44274],[-122.24084,47.44464399999999],[-122.24078,47.44643],[-122.24077,47.44824],[-122.24074,47.449639999999995],[-122.2407,47.450669999999995],[-122.24069000000001,47.45122899999999],[-122.24063000000001,47.453239999999994],[-122.24065000000002,47.45383999999999],[-122.24064000000001,47.454390999999994],[-122.24056400000002,47.45643999999999],[-122.24055000000001,47.45705999999999],[-122.24054000000001,47.45765999999999],[-122.24049000000001,47.458331],[-122.24046000000001,47.459931],[-122.24041000000001,47.461189],[-122.24036000000001,47.462576000000006],[-122.24036000000001,47.463208],[-122.24041000000001,47.46359],[-122.24049000000001,47.463923],[-122.24058000000001,47.46418],[-122.24073,47.46454],[-122.24089900000001,47.46487],[-122.24112100000002,47.465140000000005],[-122.24121000000002,47.46528],[-122.24133,47.46544],[-122.24171000000001,47.46586],[-122.24218,47.466329],[-122.24308,47.46718],[-122.24379,47.46789],[-122.24415000000002,47.468230000000005],[-122.245841,47.469910000000006],[-122.24675,47.47077],[-122.24745000000001,47.471481999999995],[-122.24843,47.472417],[-122.24916200000001,47.47317],[-122.24960000000002,47.47363],[-122.25026000000001,47.47425],[-122.25091,47.474913],[-122.25206,47.47602],[-122.25269999999999,47.476639999999996],[-122.2536,47.47754],[-122.25407,47.47814],[-122.25488,47.479163]],[[-122.14863,47.504279999999994],[-122.14854,47.504213],[-122.14845,47.504159],[-122.14826000000001,47.504079],[-122.14811,47.50403],[-122.148,47.504],[-122.14783,47.50397],[-122.14776,47.503954],[-122.14767,47.503943],[-122.1474,47.503930000000004],[-122.14728000000001,47.503930000000004],[-122.14713,47.50394],[-122.14689,47.50398],[-122.14676999999999,47.50401],[-122.14668,47.504039],[-122.146579,47.504079],[-122.14648,47.50412],[-122.14596,47.50436],[-122.14596,47.50445],[-122.14596,47.50472],[-122.14596,47.50477],[-122.14595,47.505370000000006],[-122.145952,47.505508000000006],[-122.14595,47.505817],[-122.14594,47.50627],[-122.14594799999999,47.50633200000001],[-122.14596,47.506459],[-122.14618,47.50642],[-122.14683,47.50629],[-122.14707,47.50629],[-122.14826000000001,47.50627],[-122.1486,47.50627],[-122.1486,47.50601],[-122.14861,47.50545],[-122.14862000000001,47.504937],[-122.14863,47.504279999999994]]]},"name":"Renton"},{"boundary":{"type":"Polygon","coordinates":[[[-122.24927000000001,47.802440999999995],[-122.24878,47.80243],[-122.24847,47.80243],[-122.24837,47.802426999999994],[-122.24706000000002,47.80241],[-122.24615000000001,47.80274],[-122.245571,47.80293],[-122.24557,47.8029],[-122.24557,47.802679999999995],[-122.24557,47.80247],[-122.24499000000002,47.802457],[-122.24446000000002,47.80245],[-122.24395000000001,47.80244],[-122.24294,47.80243],[-122.24036000000001,47.802382],[-122.24005000000001,47.802371],[-122.238434,47.802330000000005],[-122.23834,47.802327],[-122.23806,47.802327],[-122.23786000000001,47.802324],[-122.23603,47.8023],[-122.23537999999999,47.8023],[-122.23465000000002,47.802288],[-122.23301000000001,47.80227],[-122.23265,47.80226],[-122.23262000000001,47.80227],[-122.232597,47.802278],[-122.23258,47.8023],[-122.23257,47.80232],[-122.23257,47.80238],[-122.23258,47.80261],[-122.23258,47.802839],[-122.23258,47.802893],[-122.23258,47.80296],[-122.23258,47.80314],[-122.23258,47.80321],[-122.23258,47.80344099999999],[-122.23259,47.804579999999994],[-122.23259,47.804649999999995],[-122.23259,47.804919999999996],[-122.23255,47.80492699999999],[-122.23241,47.804959999999994],[-122.232355,47.804972],[-122.23222000000001,47.805008],[-122.23218,47.80502],[-122.23217,47.80504],[-122.23206,47.80507],[-122.23198000000001,47.805109],[-122.23193,47.80514],[-122.23184,47.8052],[-122.23181000000001,47.805234],[-122.23176000000001,47.805279999999996],[-122.23171,47.805354],[-122.23168000000001,47.805403],[-122.23166000000002,47.80545],[-122.23164000000001,47.805479999999996],[-122.23151000000001,47.805786],[-122.23144,47.805785],[-122.2313,47.805783],[-122.23023,47.80577],[-122.22832999999999,47.80574],[-122.228366,47.805879],[-122.22868,47.80651],[-122.22917,47.80745999999999],[-122.22927,47.80768799999999],[-122.22944,47.80806],[-122.23009,47.809487999999995],[-122.2297,47.80949],[-122.22875499999999,47.80947999999999],[-122.22796000000001,47.809487999999995],[-122.2279,47.80937],[-122.22763,47.80936],[-122.22761000000001,47.8094],[-122.22614,47.8094],[-122.2261,47.80937],[-122.22515,47.809383],[-122.22358,47.8094],[-122.22358,47.80958],[-122.22358,47.809653],[-122.22358,47.80971],[-122.22356,47.80971],[-122.2235,47.809689999999996],[-122.22346999999999,47.80967999999999],[-122.22344,47.80967999999999],[-122.22337999999999,47.809659999999994],[-122.22332,47.80964899999999],[-122.22319,47.809619999999995],[-122.22313,47.80961],[-122.22306999999999,47.809599],[-122.223,47.80959],[-122.22294,47.80958],[-122.22287999999999,47.80957],[-122.22281,47.809562],[-122.22274999999999,47.809554],[-122.22268,47.809548],[-122.22262,47.80954],[-122.22255,47.80954],[-122.22249,47.80953],[-122.22241,47.80953],[-122.22141,47.80953],[-122.22072,47.80954],[-122.22062000000001,47.80954],[-122.22021000000001,47.80954],[-122.21990000000001,47.80954],[-122.21942600000001,47.80954],[-122.21914000000001,47.80954],[-122.21867,47.80954],[-122.21834,47.80954],[-122.21803,47.80954],[-122.21774,47.80955],[-122.21747,47.80955],[-122.21649000000001,47.809553],[-122.21628000000001,47.80955],[-122.21576999999999,47.80955],[-122.21548,47.809556],[-122.215171,47.809557],[-122.21497000000001,47.809565],[-122.21476000000001,47.809559],[-122.21437,47.80956],[-122.21381000000001,47.809563],[-122.21360000000001,47.809565],[-122.21335,47.809566],[-122.21281,47.80957],[-122.21274,47.809565],[-122.21256100000001,47.80957],[-122.21219,47.80957],[-122.21208,47.80957],[-122.21176000000001,47.80957],[-122.21141000000001,47.80958],[-122.21138,47.80958],[-122.20914,47.809580999999994],[-122.20914,47.809594],[-122.20904,47.809594],[-122.208107,47.809599999999996],[-122.2078,47.809596],[-122.20768000000001,47.809594],[-122.20753,47.80959],[-122.20735,47.80959],[-122.20684,47.80958],[-122.20485000000001,47.80957],[-122.20198,47.8097],[-122.20083,47.810513],[-122.19997,47.811319999999995],[-122.19966000000001,47.81155999999999],[-122.19958,47.811609999999995],[-122.1995,47.81165999999999],[-122.19941,47.811699999999995],[-122.19932999999999,47.81173999999999],[-122.19924,47.81177999999999],[-122.19915,47.81181999999999],[-122.19906,47.81185599999999],[-122.19896999999999,47.81188899999999],[-122.19887999999999,47.81191999999999],[-122.19872999999998,47.81195999999999],[-122.19863,47.81198799999999],[-122.19854,47.81201],[-122.19843999999999,47.81203],[-122.19832999999998,47.81205],[-122.19823,47.81206699999999],[-122.19812999999999,47.812079999999995],[-122.19802999999999,47.81209],[-122.19792000000001,47.8121],[-122.197818,47.812107],[-122.19766000000001,47.812112000000006],[-122.19756000000001,47.812112000000006],[-122.19735,47.8121],[-122.19724000000001,47.8121],[-122.19709,47.812079999999995],[-122.19698,47.81207],[-122.19686999999999,47.81205],[-122.19686999999999,47.812110000000004],[-122.19669,47.812079999999995],[-122.19651,47.812036],[-122.19506999999999,47.811683999999985],[-122.195,47.81166999999999],[-122.19493,47.81165999999999],[-122.19487,47.81164999999999],[-122.1948,47.81164999999999],[-122.19472999999999,47.81164499999999],[-122.19466000000001,47.81164999999999],[-122.19460000000001,47.81164999999999],[-122.19453,47.81165999999999],[-122.19447,47.81166999999999],[-122.1944,47.81168999999999],[-122.19434,47.811702999999994],[-122.19427900000001,47.81172399999999],[-122.19422000000002,47.811749999999996],[-122.19411000000001,47.81179999999999],[-122.193996,47.81186999999999],[-122.1932,47.8124],[-122.1925,47.812867999999995],[-122.19232,47.81299],[-122.19199400000001,47.81320099999999],[-122.19196000000001,47.81315],[-122.19172,47.813319],[-122.19149,47.813469999999995],[-122.19153,47.81352],[-122.19149,47.813551],[-122.19126400000002,47.81367999999999],[-122.19101,47.813855],[-122.19046,47.814209999999996],[-122.19036999999999,47.81427099999999],[-122.19027,47.81432399999999],[-122.19018,47.81437],[-122.19009,47.814409999999995],[-122.18991,47.81447999999999],[-122.18975999999999,47.81453],[-122.189681,47.81455],[-122.18948999999999,47.81459999999999],[-122.18938999999999,47.81462299999999],[-122.18929,47.81463999999999],[-122.18918599999999,47.81464999999999],[-122.18907999999999,47.814666999999986],[-122.18897999999999,47.814674999999994],[-122.18886999999998,47.81467999999999],[-122.18875999999999,47.81467999999999],[-122.18866,47.81467999999999],[-122.18854999999999,47.81467999999999],[-122.18843999999999,47.81466999999999],[-122.18832999999998,47.81466499999999],[-122.18822999999999,47.81464999999999],[-122.18811699999999,47.81463999999999],[-122.18802,47.81461899999999],[-122.18789,47.81459099999999],[-122.18782,47.814575],[-122.1876,47.814519999999995],[-122.18739,47.814474999999995],[-122.18717099999999,47.81441999999999],[-122.18695,47.814373999999994],[-122.18668,47.81431],[-122.18612,47.81417999999999],[-122.18611,47.81403999999999],[-122.18612999999999,47.80951],[-122.18612999999999,47.80943],[-122.18614,47.80721],[-122.18614,47.8055],[-122.18616999999999,47.80522],[-122.18616,47.804829999999995],[-122.18618,47.80433],[-122.18621,47.804053999999994],[-122.18622,47.80367],[-122.18624,47.80323],[-122.18621,47.802730000000004],[-122.18622,47.802485999999995],[-122.18622,47.8024],[-122.18623,47.8021],[-122.18623,47.801989999999996],[-122.186234,47.8013],[-122.18626,47.80009],[-122.18623,47.799634000000005],[-122.1862,47.799060000000004],[-122.18622,47.798310000000015],[-122.18622,47.79827000000001],[-122.18633999999999,47.79827000000001],[-122.18636999999998,47.797630000000005],[-122.18638999999999,47.797000000000004],[-122.18641,47.796490000000006],[-122.18643999999999,47.79560000000001],[-122.1865,47.794250000000005],[-122.18651,47.79381000000001],[-122.18652999999999,47.79335700000001],[-122.18655,47.79291000000001],[-122.18657999999999,47.79223000000001],[-122.18657999999999,47.79203000000001],[-122.18658599999999,47.79197200000001],[-122.18662,47.791137000000006],[-122.18656,47.791137000000006],[-122.18654,47.791137000000006],[-122.18645,47.790470000000006],[-122.18645,47.790440000000004],[-122.18643999999999,47.79023300000001],[-122.18641199999999,47.789885],[-122.18637999999999,47.78946],[-122.18634999999999,47.788990000000005],[-122.18633999999999,47.788830000000004],[-122.18629999999999,47.788204],[-122.18628,47.78793],[-122.18627,47.78778],[-122.18624,47.78744],[-122.18473999999999,47.787413],[-122.18366999999999,47.78739],[-122.18285999999999,47.787382],[-122.1822,47.787371],[-122.18102999999999,47.78735],[-122.18073999999999,47.78735],[-122.17963999999999,47.787329],[-122.17828999999999,47.787310000000005],[-122.17696,47.78729],[-122.17588999999998,47.78727],[-122.17559999999999,47.787259999999996],[-122.17556999999998,47.78683],[-122.17554999999999,47.78662],[-122.17553999999998,47.78636],[-122.17550599999998,47.78589],[-122.17546999999998,47.78544],[-122.17544999999998,47.78513000000001],[-122.17542999999998,47.78483],[-122.17540999999999,47.784530000000004],[-122.17537999999998,47.78407],[-122.17534999999998,47.783614],[-122.17531999999999,47.783150000000006],[-122.17528999999999,47.782700000000006],[-122.17526,47.782230000000006],[-122.17522999999998,47.7818],[-122.17519999999999,47.781355000000005],[-122.17516999999998,47.780885],[-122.17513999999998,47.780482],[-122.17511999999999,47.78004],[-122.17242999999998,47.78004],[-122.17241999999999,47.779934000000004],[-122.17240999999999,47.77986],[-122.17234999999998,47.77895000000001],[-122.17232999999997,47.778650000000006],[-122.17230899999998,47.77834000000001],[-122.17228999999999,47.778147000000004],[-122.17228999999999,47.77812000000001],[-122.17222999999998,47.77811000000001],[-122.17208999999998,47.77811000000001],[-122.17210999999999,47.77763],[-122.17133999999999,47.777628],[-122.17133999999999,47.77743],[-122.17133999999999,47.777346],[-122.17134999999999,47.777190000000004],[-122.17067999999999,47.777190000000004],[-122.17066999999999,47.776770000000006],[-122.16944,47.776770000000006],[-122.16944,47.776682],[-122.16944,47.77626],[-122.16944,47.77558500000001],[-122.16944,47.77511000000001],[-122.16941,47.77406],[-122.16937999999999,47.773297],[-122.16929,47.77042],[-122.16929,47.770351000000005],[-122.16886,47.770360000000004],[-122.16657,47.77039800000001],[-122.16652300000001,47.76935400000001],[-122.16651,47.76919000000001],[-122.16649,47.76900200000001],[-122.16646999999999,47.768890000000006],[-122.16636,47.768668000000005],[-122.1659,47.768080000000005],[-122.16529999999999,47.76733000000001],[-122.16492000000001,47.76683800000001],[-122.16452000000001,47.76634000000001],[-122.16409,47.765800000000006],[-122.16396,47.76563300000001],[-122.16393,47.765589000000006],[-122.16384,47.765440000000005],[-122.16382,47.76539000000001],[-122.16376,47.76527000000001],[-122.166424,47.76529000000001],[-122.16635,47.76169],[-122.16574999999999,47.761688],[-122.1636,47.76167],[-122.16345,47.76167],[-122.16342999999999,47.76131000000001],[-122.16342,47.761161],[-122.1634,47.760644],[-122.163365,47.759930000000004],[-122.16331,47.75888],[-122.16329,47.75851000000001],[-122.16328,47.758320000000005],[-122.16328,47.75824],[-122.1635,47.75824],[-122.16395,47.758230000000005],[-122.16393,47.75829],[-122.16414,47.758230000000005],[-122.16570999999999,47.758190000000006],[-122.16606,47.758190000000006],[-122.16613,47.758190000000006],[-122.16629999999999,47.75811000000001],[-122.16703,47.757915000000004],[-122.167598,47.757833],[-122.16915900000001,47.75776],[-122.16999,47.757799999999996],[-122.17117999999999,47.7579],[-122.17188999999999,47.75795],[-122.17256999999998,47.758030000000005],[-122.17340999999999,47.758160000000004],[-122.1745,47.75831000000001],[-122.17457999999999,47.758320000000005],[-122.17457999999999,47.75817000000001],[-122.17457999999999,47.75808],[-122.17457999999999,47.75788099999999],[-122.17459,47.7575],[-122.17459,47.757306],[-122.17459,47.75707],[-122.17482,47.757085999999994],[-122.17499,47.75712],[-122.17509999999999,47.757176],[-122.17516999999998,47.75721],[-122.17522999999998,47.75725],[-122.17538999999998,47.75732],[-122.17568999999999,47.75738],[-122.17595999999999,47.757345],[-122.17603999999999,47.75708899999999],[-122.17632999999998,47.756218000000004],[-122.17554999999999,47.755930000000006],[-122.17532999999997,47.75586],[-122.17533999999998,47.755825],[-122.17546999999998,47.755488],[-122.17586299999999,47.75454],[-122.17572999999997,47.75454],[-122.17571999999998,47.75414],[-122.17492999999999,47.75413],[-122.17493199999998,47.75389],[-122.17492999999999,47.753764],[-122.17496999999999,47.753619],[-122.17502999999998,47.75338],[-122.17502999999998,47.75334],[-122.17502999999998,47.753310000000006],[-122.17502999999998,47.753276],[-122.17501999999999,47.75324],[-122.17500999999999,47.75321],[-122.17499999999998,47.753170000000004],[-122.17497699999998,47.75314],[-122.17466999999999,47.75271000000001],[-122.17462,47.75263],[-122.17463,47.751852],[-122.174654,47.75096],[-122.17426,47.75096],[-122.1742,47.75096],[-122.17415,47.750959],[-122.17428,47.75041],[-122.17428,47.750383],[-122.17428,47.750350000000005],[-122.17436999999998,47.749340000000004],[-122.17443999999999,47.748450000000005],[-122.17446699999999,47.748126000000006],[-122.17463,47.748127000000004],[-122.17484999999999,47.74811800000001],[-122.17602999999998,47.74811000000001],[-122.17602999999998,47.747910000000005],[-122.17602999999998,47.747385],[-122.17491,47.747386],[-122.17483999999999,47.747386],[-122.17486,47.747130000000006],[-122.17486,47.74702],[-122.17483999999999,47.74702],[-122.17486999999998,47.746570000000006],[-122.1749,47.746050000000004],[-122.17492999999999,47.745608000000004],[-122.17492999999999,47.745580000000004],[-122.17501999999999,47.745580000000004],[-122.17726,47.745580000000004],[-122.17722,47.746320000000004],[-122.17721,47.74647],[-122.17810799999998,47.746475000000004],[-122.17992,47.746475000000004],[-122.18045,47.746472000000004],[-122.18042,47.74701],[-122.180403,47.74738],[-122.18135,47.747377],[-122.18327,47.74738],[-122.18355,47.74738],[-122.18612,47.747370000000004],[-122.18619,47.746030000000005],[-122.18612,47.745874],[-122.18616,47.745160000000006],[-122.18634999999999,47.745160000000006],[-122.18669,47.74516800000001],[-122.18692999999999,47.745171000000006],[-122.18721000000001,47.74517200000001],[-122.18745,47.74517300000001],[-122.18848999999999,47.74517900000001],[-122.18887999999998,47.744917],[-122.18912999999999,47.74492],[-122.18914099999999,47.7446],[-122.19155,47.74462],[-122.19153,47.745042000000005],[-122.19152000000001,47.745360000000005],[-122.19151000000001,47.74564],[-122.19169000000001,47.74564],[-122.19278599999998,47.74564],[-122.19251,47.74613300000001],[-122.19264,47.747],[-122.19275999999999,47.74703],[-122.192921,47.74705],[-122.19291,47.747458],[-122.19183,47.747443999999994],[-122.19144,47.747439],[-122.19056,47.74743],[-122.18769,47.74739],[-122.18763,47.747389],[-122.18758,47.749731000000004],[-122.1875,47.750678],[-122.18746999999999,47.751],[-122.19042,47.751025],[-122.19325,47.751059999999995],[-122.196602,47.75109],[-122.19667,47.749300000000005],[-122.19959,47.74933000000001],[-122.19986999999999,47.749328000000006],[-122.19999,47.74936],[-122.20008,47.749384],[-122.20017,47.749390000000005],[-122.20032,47.7494],[-122.20061000000001,47.749410000000005],[-122.20085,47.74942],[-122.20114600000001,47.749423],[-122.20114000000001,47.7498],[-122.20161000000002,47.749809],[-122.20192000000002,47.749810000000004],[-122.20188,47.74922],[-122.20190000000001,47.74906],[-122.20190000000001,47.74904],[-122.2018,47.749041],[-122.20138,47.749033000000004],[-122.20139,47.748720000000006],[-122.20051000000001,47.74872200000001],[-122.200518,47.748349000000005],[-122.20052000000001,47.74833000000001],[-122.20052300000002,47.74800200000001],[-122.20103,47.74801000000001],[-122.20105000000001,47.747557],[-122.20054,47.747550000000004],[-122.19988099999999,47.74754],[-122.19958199999999,47.74754],[-122.19961,47.74663],[-122.19988699999999,47.746643],[-122.19986999999999,47.746010000000005],[-122.19986,47.745746000000004],[-122.20043,47.745737000000005],[-122.20091000000001,47.745740000000005],[-122.20136000000001,47.74575000000001],[-122.20211,47.74577000000001],[-122.20211,47.745720000000006],[-122.20212000000001,47.74551000000001],[-122.20213,47.74521000000001],[-122.20213,47.745056000000005],[-122.20214,47.74485],[-122.20236999999999,47.74485],[-122.20322000000002,47.74485],[-122.20324000000001,47.744276],[-122.20325000000001,47.74394],[-122.20214,47.743930000000006],[-122.19682,47.743877],[-122.196833,47.74311000000001],[-122.1969,47.74025],[-122.20088,47.740277],[-122.20088,47.740170000000006],[-122.20087,47.740140000000004],[-122.20086,47.739920000000005],[-122.20084,47.739810000000006],[-122.20076999999999,47.739290000000004],[-122.20073599999999,47.73883000000001],[-122.20065000000001,47.73817000000001],[-122.20063,47.738020000000006],[-122.20082000000001,47.73792],[-122.20124000000001,47.737700000000004],[-122.20164300000002,47.73758],[-122.20202,47.73708],[-122.20235799999999,47.73666],[-122.20237999999999,47.73593000000001],[-122.202405,47.73484],[-122.20431,47.7348],[-122.20441000000001,47.7348],[-122.20471,47.734790000000004],[-122.20669000000001,47.73483],[-122.20746000000001,47.73483],[-122.20779,47.73482],[-122.2078,47.73466],[-122.20782000000001,47.734100000000005],[-122.20784400000001,47.73308],[-122.20785000000001,47.733008000000005],[-122.21323000000001,47.73308],[-122.21323000000001,47.733002000000006],[-122.21325000000002,47.73257100000001],[-122.21327000000001,47.73237000000001],[-122.21341000000001,47.732445000000006],[-122.21358000000001,47.73252000000001],[-122.21394000000001,47.732659000000005],[-122.21434,47.73279300000001],[-122.21439000000001,47.73281000000001],[-122.21495000000002,47.732966000000005],[-122.21527,47.73304],[-122.21559,47.73311000000001],[-122.21589,47.73317300000001],[-122.21605000000001,47.73321000000001],[-122.21697,47.733410000000006],[-122.21715000000002,47.733450000000005],[-122.21750000000002,47.733564],[-122.21782000000002,47.73368],[-122.21797000000001,47.73375000000001],[-122.21812000000001,47.733830000000005],[-122.21826000000001,47.73391000000001],[-122.21845,47.734030000000004],[-122.21854,47.734094],[-122.218762,47.73428],[-122.2188,47.73431800000001],[-122.21894,47.734456],[-122.21898,47.734500000000004],[-122.21913,47.73466],[-122.22076,47.736467],[-122.22141,47.73718],[-122.22236999999998,47.73820800000001],[-122.222462,47.73830600000001],[-122.22282999999999,47.73870000000001],[-122.22228,47.73866],[-122.22202,47.73865000000001],[-122.22092,47.738679000000005],[-122.22015,47.73866],[-122.21906400000002,47.738620000000004],[-122.21887,47.738620000000004],[-122.21895,47.740448],[-122.21900600000001,47.74161],[-122.21910000000001,47.743730000000006],[-122.21913,47.744217],[-122.21919000000001,47.745601],[-122.21926000000002,47.747031],[-122.21929000000002,47.747737],[-122.22372999999999,47.747769],[-122.22415000000001,47.74777],[-122.22397,47.750150000000005],[-122.22395,47.750510000000006],[-122.22389,47.75138],[-122.22376999999999,47.75138],[-122.22302,47.7514],[-122.22166000000001,47.751369],[-122.22121000000001,47.751376],[-122.22113,47.75139],[-122.22102000000001,47.75145],[-122.22095300000001,47.75155],[-122.22091,47.7517],[-122.22086999999999,47.751819999999995],[-122.22082,47.751980999999994],[-122.22072,47.752300000000005],[-122.22072999999999,47.75235500000001],[-122.22062000000001,47.75233000000001],[-122.21891000000001,47.75196],[-122.2188,47.751898],[-122.21878,47.752010000000006],[-122.21876,47.752050000000004],[-122.21878,47.75206],[-122.21876,47.752210000000005],[-122.21902000000001,47.75229],[-122.21959000000001,47.75244],[-122.22018,47.75255000000001],[-122.22076,47.752627],[-122.22079,47.752629],[-122.22079,47.752679],[-122.22075,47.752809],[-122.22073999999999,47.752843],[-122.22073999999999,47.75285],[-122.22048,47.75282],[-122.21994000000001,47.75273000000001],[-122.21993,47.752750000000006],[-122.21954000000001,47.752666],[-122.21912000000002,47.75256],[-122.2187,47.75244],[-122.21864000000001,47.75326],[-122.21393,47.75325],[-122.21392900000002,47.75383],[-122.21392000000002,47.75409],[-122.21565500000001,47.75412],[-122.21563,47.755210000000005],[-122.21565000000001,47.755210000000005],[-122.2157,47.755210000000005],[-122.21675,47.75522],[-122.21686000000001,47.755224],[-122.21695000000001,47.755224],[-122.21742000000002,47.755221],[-122.217398,47.75629],[-122.21689,47.75628],[-122.21470000000001,47.756259],[-122.21471000000001,47.75604],[-122.21471500000001,47.75573000000001],[-122.21388,47.755720000000004],[-122.21387,47.75586],[-122.21385000000001,47.75622],[-122.21385000000001,47.756301],[-122.21394000000001,47.756313000000006],[-122.21392000000002,47.756924],[-122.21391000000001,47.75707],[-122.21398,47.75707],[-122.21615000000001,47.757079999999995],[-122.21634,47.757082999999994],[-122.21804,47.757093],[-122.21823,47.75712],[-122.21831,47.757138000000005],[-122.21999000000001,47.75716],[-122.22043,47.75717],[-122.22082,47.757176],[-122.22086,47.757176],[-122.22088,47.756954],[-122.2213,47.757279999999994],[-122.221393,47.757355000000004],[-122.22151000000001,47.75745],[-122.22155000000001,47.75747],[-122.22169000000001,47.75759],[-122.22193,47.75777],[-122.22234399999999,47.758097],[-122.22264,47.758100000000006],[-122.2234,47.758123000000005],[-122.2234,47.758209],[-122.22339,47.75851000000001],[-122.22344,47.758569],[-122.22339,47.759394],[-122.22334,47.76021000000001],[-122.22331,47.760689],[-122.2233,47.760850000000005],[-122.22323,47.762167000000005],[-122.22323,47.76238000000001],[-122.22322000000001,47.76305000000001],[-122.22322000000001,47.763960000000004],[-122.22321000000001,47.76487],[-122.22321000000001,47.76579500000001],[-122.2232,47.767931000000004],[-122.22558,47.767969],[-122.22672999999999,47.76798],[-122.22703,47.76798],[-122.22792000000001,47.767990000000005],[-122.228,47.76800000000001],[-122.22797,47.768420000000006],[-122.22788,47.76932000000001],[-122.22787,47.76951000000001],[-122.22778,47.77205000000001],[-122.22319,47.77196],[-122.22319,47.77215000000001],[-122.22046999999999,47.77211700000001],[-122.22046999999999,47.773010000000006],[-122.22319,47.77306],[-122.22319,47.773230000000005],[-122.22319,47.773500000000006],[-122.22319,47.77396],[-122.22046999999999,47.773920000000004],[-122.22046,47.77462],[-122.2205,47.775281],[-122.22046999999999,47.776648],[-122.2232,47.77669],[-122.22615,47.77673000000001],[-122.22727,47.776740000000004],[-122.22761000000001,47.776740000000004],[-122.23183,47.7768],[-122.23292000000001,47.77682],[-122.23304,47.77682],[-122.23383,47.77681200000001],[-122.23411000000002,47.77682],[-122.23489000000001,47.77684],[-122.23568,47.77684],[-122.23594,47.776848],[-122.2365,47.77685],[-122.23717,47.77686],[-122.23771,47.77687],[-122.2381,47.77689],[-122.23821000000001,47.776891],[-122.23836999999999,47.776900000000005],[-122.23863,47.776904],[-122.23909,47.77691000000001],[-122.23917,47.77691000000001],[-122.23954,47.776924],[-122.24073,47.77695000000001],[-122.24082000000001,47.77693800000001],[-122.24093300000001,47.77694],[-122.24106000000002,47.776942000000005],[-122.24131000000001,47.77695000000001],[-122.24144000000001,47.77695000000001],[-122.24162000000003,47.77695000000001],[-122.24170000000001,47.77695000000001],[-122.24184000000001,47.77695000000001],[-122.24193000000001,47.77695000000001],[-122.24204,47.77696],[-122.24222000000002,47.77696],[-122.24258,47.776966],[-122.24260000000001,47.776970000000006],[-122.24276,47.77697500000001],[-122.24386000000001,47.776891],[-122.24385000000001,47.77764],[-122.24382000000001,47.779900000000005],[-122.24380000000001,47.780656],[-122.24380000000001,47.780678],[-122.24292000000001,47.78067],[-122.24242300000002,47.78066],[-122.24243,47.781279999999995],[-122.24243,47.784209],[-122.24377,47.78423],[-122.24377,47.784352000000005],[-122.24377,47.785090000000004],[-122.24376000000001,47.78737],[-122.24376000000001,47.78986],[-122.24377,47.791500000000006],[-122.24379,47.79512300000001],[-122.24380000000001,47.795530000000014],[-122.24382000000001,47.79873000000001],[-122.24922000000002,47.79881500000001],[-122.24923000000001,47.80016],[-122.24923000000001,47.80075],[-122.249232,47.80173],[-122.24927000000001,47.802440999999995]],[[-122.21351000000001,47.76422],[-122.21351000000001,47.76314000000001],[-122.21253,47.76313000000001],[-122.21242000000001,47.76313000000001],[-122.21228900000001,47.76313000000001],[-122.2123,47.764230000000005],[-122.21242000000001,47.764230000000005],[-122.21254,47.764230000000005],[-122.21351000000001,47.764244],[-122.21351000000001,47.76422]],[[-122.20964000000001,47.768046000000005],[-122.20754000000001,47.76802000000001],[-122.20734,47.76802000000001],[-122.20705000000001,47.76802000000001],[-122.20694400000001,47.76801700000001],[-122.20694400000001,47.76834000000001],[-122.20710700000001,47.76834000000001],[-122.20778,47.76835000000001],[-122.20776000000001,47.76876000000001],[-122.20776000000001,47.76877000000001],[-122.20722000000002,47.76876000000001],[-122.20707,47.76876000000001],[-122.20707,47.76879500000001],[-122.20788,47.768820000000005],[-122.20829,47.768820000000005],[-122.20828,47.768921000000006],[-122.20828,47.769270000000006],[-122.20963,47.76928],[-122.20963,47.76887000000001],[-122.20964000000001,47.768046000000005]],[[-122.21755000000002,47.76465],[-122.21702000000002,47.76466],[-122.21702000000002,47.764430000000004],[-122.21651000000001,47.764430000000004],[-122.21376000000001,47.764430000000004],[-122.21376000000001,47.76482],[-122.21516000000001,47.764848],[-122.21534,47.76484],[-122.21574,47.76483],[-122.21575,47.765260000000005],[-122.21565000000001,47.765260000000005],[-122.21565000000001,47.765690000000006],[-122.21756000000002,47.76571000000001],[-122.21755000000002,47.76465]],[[-122.21752000000002,47.762800000000006],[-122.21560000000001,47.76279000000001],[-122.21558,47.763560000000005],[-122.21497000000001,47.76351000000001],[-122.21375,47.763490000000004],[-122.21376000000001,47.764230000000005],[-122.21682000000001,47.76426],[-122.21681000000001,47.763723000000006],[-122.21625000000002,47.763720000000006],[-122.21624000000001,47.76341300000001],[-122.21752000000002,47.76341000000001],[-122.21752000000002,47.762800000000006]]]},"name":"Bothell"},{"boundary":{"type":"Polygon","coordinates":[[[-122.313422,47.77015000000001],[-122.313,47.770343000000004],[-122.31179,47.77078],[-122.31152000000002,47.770874],[-122.31131,47.770951000000004],[-122.31058,47.771190000000004],[-122.31053,47.7712],[-122.31019,47.771341],[-122.31,47.77143],[-122.30982999999999,47.771350000000005],[-122.30971,47.771300000000004],[-122.30941,47.7712],[-122.309236,47.771146],[-122.308602,47.77094],[-122.30823,47.77075000000001],[-122.30805,47.770630000000004],[-122.30725000000001,47.77062],[-122.30725000000001,47.77082],[-122.30725000000001,47.77106],[-122.30726000000001,47.77154],[-122.30636999999999,47.77154],[-122.30636,47.771100000000004],[-122.30604699999999,47.771094],[-122.30604,47.77089],[-122.30566999999999,47.77088],[-122.30547999999999,47.77088],[-122.30547999999999,47.77068],[-122.30546199999999,47.77013000000001],[-122.30281,47.770120000000006],[-122.30188,47.77011000000001],[-122.30128,47.77011000000001],[-122.30009,47.77011000000001],[-122.29950000000001,47.77011000000001],[-122.29742000000002,47.770100000000006],[-122.297437,47.77062],[-122.29745000000001,47.771091],[-122.29746000000002,47.77146],[-122.29746000000002,47.771510000000006],[-122.297478,47.772449],[-122.29750000000001,47.773230000000005],[-122.29751000000002,47.773782000000004],[-122.29753000000001,47.774719000000005],[-122.297531,47.7748],[-122.29754000000001,47.77531000000001],[-122.29755000000002,47.775600000000004],[-122.29757000000001,47.77653900000001],[-122.29759000000001,47.77742],[-122.29621000000002,47.777408],[-122.296037,47.777406],[-122.29592000000001,47.777404],[-122.29575,47.777403],[-122.29391000000001,47.777390000000004],[-122.29378,47.77738],[-122.29367,47.77738],[-122.29249,47.777370000000005],[-122.29242,47.777370000000005],[-122.29232999999999,47.77737200000001],[-122.29222800000001,47.777370000000005],[-122.29176000000001,47.777367],[-122.29163000000001,47.777366],[-122.29104000000001,47.777367],[-122.290932,47.777367],[-122.29052000000001,47.777359000000004],[-122.29036,47.777359000000004],[-122.29009,47.777328000000004],[-122.28997,47.777300000000004],[-122.28995,47.777300000000004],[-122.28982500000001,47.77729],[-122.28846999999999,47.77723],[-122.28824,47.77724],[-122.2881,47.777237],[-122.28806999999999,47.777235000000005],[-122.288,47.77723],[-122.28762000000002,47.7772],[-122.28758,47.77722],[-122.28757,47.777231],[-122.28755000000001,47.777234],[-122.28751000000001,47.77724],[-122.28739,47.77724],[-122.28716000000001,47.777242],[-122.28704,47.777242],[-122.28686,47.777243],[-122.28645,47.77724],[-122.28433,47.77726],[-122.28425000000001,47.777271],[-122.28381,47.777277],[-122.281806,47.77727],[-122.2817,47.77727],[-122.27985,47.77702],[-122.27978999999999,47.77702],[-122.2796,47.77702],[-122.27954,47.77702],[-122.27935,47.77702],[-122.27878999999999,47.77702],[-122.2786,47.77702],[-122.27856,47.77702],[-122.27836999999998,47.77702],[-122.27767,47.77702],[-122.27744,47.77702],[-122.27736999999999,47.77702],[-122.27717,47.77702],[-122.27711000000001,47.77702],[-122.2738,47.77702],[-122.27096,47.77702],[-122.27076999999998,47.77688],[-122.27066,47.776770000000006],[-122.27055,47.77664],[-122.27046,47.776495000000004],[-122.27039599999999,47.77635000000001],[-122.27029,47.776033000000005],[-122.27027,47.77599000000001],[-122.27019,47.775760000000005],[-122.27008,47.77544],[-122.26998,47.775180000000006],[-122.26985,47.774910000000006],[-122.26966000000002,47.774473],[-122.26961000000001,47.77436],[-122.26956000000001,47.77424],[-122.26951000000001,47.77408],[-122.26947,47.773950000000006],[-122.26945,47.773725000000006],[-122.26945,47.77348],[-122.26947,47.77318],[-122.26948,47.77311000000001],[-122.26949,47.77294500000001],[-122.26951000000001,47.77271000000001],[-122.26952000000001,47.772648000000004],[-122.26955000000001,47.77228],[-122.26956000000001,47.772124000000005],[-122.26959000000001,47.771879999999996],[-122.26962000000002,47.77156],[-122.26962000000002,47.771510000000006],[-122.26967,47.770996000000004],[-122.26967,47.770961],[-122.26968000000001,47.770919000000006],[-122.26971,47.770482],[-122.26972,47.770250000000004],[-122.26969000000001,47.77006],[-122.26966000000002,47.76995000000001],[-122.26962000000002,47.769821],[-122.26954,47.76964],[-122.26945,47.76950000000001],[-122.26939,47.769420000000004],[-122.269315,47.76933000000001],[-122.26917,47.76919000000001],[-122.26908,47.76912000000001],[-122.26891,47.76900500000001],[-122.26877999999999,47.76892000000001],[-122.26863,47.76885000000001],[-122.26848,47.76878000000001],[-122.26818,47.768660000000004],[-122.26805,47.76861500000001],[-122.26787,47.76857000000001],[-122.26756000000002,47.76852000000001],[-122.26749000000001,47.76850900000001],[-122.26852000000001,47.76851000000001],[-122.27052,47.76855000000001],[-122.2705,47.76650800000001],[-122.2705,47.766225000000006],[-122.2705,47.76578000000001],[-122.270496,47.76534000000001],[-122.27048699999999,47.764022000000004],[-122.27047999999999,47.76275000000001],[-122.27047999999999,47.76265000000001],[-122.27046999999999,47.76173000000001],[-122.26996000000001,47.761596000000004],[-122.27002999999999,47.76153000000001],[-122.26962000000002,47.7614],[-122.26954,47.76137000000001],[-122.26941000000001,47.76112800000001],[-122.27022000000001,47.760940000000005],[-122.27029999999999,47.761189],[-122.27049,47.761161],[-122.27053,47.76055000000001],[-122.27055,47.76011500000001],[-122.27059,47.75932],[-122.27065,47.75831000000001],[-122.27071099999999,47.7571],[-122.27072999999999,47.756709],[-122.27064,47.75677],[-122.27053,47.75684],[-122.27042,47.7569],[-122.27024,47.756997],[-122.27005,47.757079999999995],[-122.26986000000001,47.75715],[-122.26977,47.75719],[-122.26959000000001,47.757239999999996],[-122.26944,47.757279999999994],[-122.26927,47.75732],[-122.26908,47.75735],[-122.268682,47.756550000000004],[-122.26835,47.755720000000004],[-122.26819,47.75535000000001],[-122.27063,47.753707],[-122.27324,47.751982],[-122.27474,47.75096],[-122.27532999999998,47.750555000000006],[-122.27532,47.750116000000006],[-122.27754,47.749050000000004],[-122.2817,47.74707],[-122.28231,47.74456],[-122.28305,47.741530000000004],[-122.28416000000001,47.736940000000004],[-122.28312000000001,47.73611000000001],[-122.28195000000001,47.733610000000006],[-122.28353,47.73361200000001],[-122.28447,47.733650000000004],[-122.28461000000001,47.733650000000004],[-122.2848,47.73366],[-122.28489,47.73366],[-122.2858,47.73368],[-122.28586999999999,47.733720000000005],[-122.28596,47.73373000000001],[-122.28632,47.73373000000001],[-122.28671,47.733720000000005],[-122.28705000000001,47.733720000000005],[-122.28842999999999,47.73373000000001],[-122.28975,47.73373000000001],[-122.291098,47.733740000000004],[-122.29243,47.73375000000001],[-122.29246,47.735290000000006],[-122.29243,47.73554000000001],[-122.29236999999999,47.735800000000005],[-122.29219,47.73631000000001],[-122.29276,47.7368],[-122.2929,47.73688],[-122.29312000000002,47.73693000000001],[-122.2938,47.736940000000004],[-122.29389,47.73693900000001],[-122.29390000000001,47.737369],[-122.29798000000001,47.73736],[-122.29919000000001,47.737390000000005],[-122.29929000000001,47.737410000000004],[-122.29931,47.73922],[-122.29933,47.74102],[-122.298595,47.74103],[-122.29663000000001,47.741046999999995],[-122.29532999999999,47.74106],[-122.295,47.74106],[-122.29468000000001,47.74106],[-122.29472000000001,47.74279800000001],[-122.29501,47.742802000000005],[-122.29536999999999,47.742810000000006],[-122.29593,47.742810000000006],[-122.29603,47.742810000000006],[-122.29602000000001,47.74313600000001],[-122.29604,47.74426],[-122.29669000000001,47.74429],[-122.2967,47.74464],[-122.29715000000002,47.74465],[-122.2973,47.74465],[-122.297334,47.74673000000001],[-122.29734,47.748298000000005],[-122.29904,47.74831000000001],[-122.29904,47.748760000000004],[-122.29906000000001,47.74904],[-122.29894,47.7494],[-122.29895,47.74955500000001],[-122.29898,47.749700000000004],[-122.29911000000001,47.7498],[-122.29923400000001,47.74982],[-122.29988,47.74982],[-122.300354,47.74958],[-122.30053,47.749750000000006],[-122.30069,47.74968],[-122.30096,47.749610000000004],[-122.30105,47.7496],[-122.30115,47.74959500000001],[-122.30134199999999,47.749598000000006],[-122.30153,47.74962],[-122.30171,47.74967],[-122.30217999999999,47.74985],[-122.303,47.750158000000006],[-122.30302999999999,47.75107],[-122.30262,47.751979],[-122.30332,47.75265],[-122.30238999999999,47.753102000000005],[-122.30205,47.754138000000005],[-122.30206999999999,47.75488599999999],[-122.30211,47.755614],[-122.30232099999999,47.756997],[-122.30239999999999,47.757183],[-122.3025,47.757309],[-122.30263,47.757433],[-122.30284999999999,47.75757],[-122.30348,47.75787],[-122.30407,47.75815800000001],[-122.30419,47.75829],[-122.30424000000001,47.758390000000006],[-122.30398,47.7584],[-122.30372999999999,47.758387],[-122.30355,47.75867],[-122.30355,47.75871000000001],[-122.30354,47.758773000000005],[-122.3036,47.75922],[-122.30364,47.75936],[-122.303724,47.75949],[-122.30385,47.75958],[-122.30452000000001,47.759949],[-122.30499999999999,47.76021300000001],[-122.30577999999998,47.760642000000004],[-122.30658,47.76106],[-122.30699,47.76128],[-122.30734,47.761465],[-122.30753,47.761842],[-122.30764,47.762071000000006],[-122.30772,47.76223000000001],[-122.30808999999999,47.76301000000001],[-122.30646999999999,47.762907000000006],[-122.30627,47.76290000000001],[-122.30624,47.76290000000001],[-122.30624,47.763180000000006],[-122.30624,47.763326000000006],[-122.306244,47.76431000000001],[-122.30627,47.764320000000005],[-122.30645,47.764340000000004],[-122.30672,47.764390000000006],[-122.30673999999999,47.76519000000001],[-122.30676,47.76661300000001],[-122.30718,47.766600000000004],[-122.307587,47.76661500000001],[-122.30821,47.766625000000005],[-122.30814,47.76668],[-122.30814,47.766799000000006],[-122.30812999999999,47.767],[-122.30924,47.767004],[-122.30924,47.76755000000001],[-122.30935,47.768084],[-122.30949,47.76878800000001],[-122.30954,47.769020000000005],[-122.30954799999999,47.76906],[-122.30958,47.769200000000005],[-122.30976,47.769200000000005],[-122.31021000000001,47.769200000000005],[-122.31033,47.769200000000005],[-122.310328,47.76964],[-122.31033,47.769760000000005],[-122.31114400000001,47.769783000000004],[-122.31118000000001,47.769920000000006],[-122.31214,47.769923000000006],[-122.31215,47.76988],[-122.31222000000001,47.76953000000001],[-122.31394,47.76953100000001],[-122.313422,47.77015000000001]]]},"name":"Lake Forest Park"},{"boundary":{"type":"Polygon","coordinates":[[[-122.31803,47.531765],[-122.317958,47.53177],[-122.31681,47.53177],[-122.31328,47.53177],[-122.30918,47.53174],[-122.30892,47.53174],[-122.30842999999999,47.53173],[-122.30714,47.53173],[-122.305517,47.531715000000005],[-122.30542999999999,47.531530000000004],[-122.30529,47.53141],[-122.30516999999999,47.53132],[-122.304981,47.53127],[-122.30488799999999,47.53118],[-122.303502,47.530530000000006],[-122.30278999999999,47.530225],[-122.30229,47.53005],[-122.30142000000001,47.529385000000005],[-122.30119,47.52875000000001],[-122.30092,47.52769],[-122.30035,47.52653000000001],[-122.30014,47.52577000000001],[-122.30027,47.52541000000001],[-122.30049,47.52521000000001],[-122.30051,47.52517000000001],[-122.30054,47.52512000000001],[-122.30181,47.52459],[-122.30056,47.52458],[-122.3003,47.52458],[-122.30002999999999,47.524577],[-122.29994,47.52456],[-122.29398400000001,47.52442],[-122.29387,47.52442],[-122.29363000000001,47.52442],[-122.29339,47.523829],[-122.29225000000001,47.521388],[-122.29175000000001,47.52031000000001],[-122.29126000000002,47.519259999999996],[-122.29126000000002,47.518510000000006],[-122.29126000000002,47.517936],[-122.29129000000002,47.514889999999994],[-122.2913,47.51387999999999],[-122.2913,47.51374],[-122.2913,47.51367],[-122.29131000000001,47.51359],[-122.29131000000001,47.51341],[-122.29132000000001,47.51162699999999],[-122.29133,47.510838],[-122.29136900000002,47.51015],[-122.28768000000001,47.510193],[-122.28625000000001,47.51022],[-122.28576999999999,47.510220999999994],[-122.28486000000001,47.51015],[-122.28374,47.510059999999996],[-122.28344,47.510055],[-122.28304,47.51004],[-122.28245,47.510023],[-122.27853999999999,47.50981],[-122.27852999999999,47.509577],[-122.27837999999998,47.50887],[-122.27833999999999,47.50799],[-122.27823,47.50799],[-122.27789,47.507992],[-122.2777,47.507966999999994],[-122.27754,47.507936],[-122.27739,47.507892],[-122.27722000000001,47.507839999999995],[-122.27708,47.50777],[-122.276241,47.50723],[-122.27606999999999,47.507130000000004],[-122.27576999999998,47.507006999999994],[-122.27542999999999,47.506930000000004],[-122.27542999999999,47.507142],[-122.27542,47.50893000000001],[-122.27541,47.50963],[-122.27541,47.50978],[-122.27408,47.509750000000004],[-122.27155,47.5097],[-122.270069,47.50966],[-122.27006999999999,47.50954],[-122.27008699999999,47.50878],[-122.27012,47.507025],[-122.27014,47.50658],[-122.27014,47.50609],[-122.27016,47.505100000000006],[-122.27016,47.5049],[-122.27017,47.504475],[-122.27017,47.503177],[-122.2702,47.50263],[-122.27026000000001,47.50147],[-122.27078999999999,47.50159],[-122.27089,47.501613],[-122.27086999999999,47.50155],[-122.27085,47.501459999999994],[-122.27069999999999,47.500826999999994],[-122.27074999999999,47.50081],[-122.270671,47.5003],[-122.27059,47.50028],[-122.27045,47.50027],[-122.27032999999999,47.5003],[-122.27023,47.50028],[-122.27027,47.49758],[-122.27028,47.497327],[-122.27028,47.497059],[-122.27028,47.497],[-122.27029,47.496570000000006],[-122.270294,47.49635000000001],[-122.27029999999999,47.496030000000005],[-122.27029999999999,47.495650000000005],[-122.26981900000001,47.49564],[-122.26941000000001,47.49564],[-122.26853,47.4956],[-122.26448,47.492382000000006],[-122.26399,47.491988],[-122.26397,47.49136],[-122.26396000000001,47.49109],[-122.26396000000001,47.49042],[-122.26395000000001,47.48958],[-122.26409000000001,47.48907],[-122.26415000000001,47.488873],[-122.26425000000002,47.48864],[-122.26416000000002,47.48859],[-122.26377,47.488110000000006],[-122.26269,47.48741],[-122.26212000000001,47.48703999999999],[-122.26140000000001,47.48643],[-122.26077,47.48606099999999],[-122.2597,47.4853],[-122.25862000000001,47.484629999999996],[-122.25784,47.484182999999994],[-122.25778,47.484148],[-122.25823,47.484154],[-122.25747,47.483599999999996],[-122.25707,47.48323],[-122.25651,47.48257],[-122.2559,47.48176399999999],[-122.25542999999999,47.48113],[-122.25453,47.47993],[-122.25434,47.47993],[-122.25426000000002,47.479832],[-122.25398,47.479639999999996],[-122.25488,47.479163],[-122.25407,47.47814],[-122.2536,47.47754],[-122.25269999999999,47.476639999999996],[-122.25206,47.47602],[-122.25091,47.474913],[-122.25026000000001,47.47425],[-122.24960000000002,47.47363],[-122.24916200000001,47.47317],[-122.24843,47.472417],[-122.24745000000001,47.471481999999995],[-122.24675,47.47077],[-122.245841,47.469910000000006],[-122.24415000000002,47.468230000000005],[-122.24379,47.46789],[-122.24308,47.46718],[-122.24218,47.466329],[-122.24171000000001,47.46586],[-122.24133,47.46544],[-122.24121000000002,47.46528],[-122.24112100000002,47.465140000000005],[-122.24089900000001,47.46487],[-122.24073,47.46454],[-122.24058000000001,47.46418],[-122.24049000000001,47.463923],[-122.24041000000001,47.46359],[-122.24036000000001,47.463208],[-122.24036000000001,47.462576000000006],[-122.24041000000001,47.461189],[-122.24046000000001,47.459931],[-122.24049000000001,47.458331],[-122.24054000000001,47.45765999999999],[-122.24055000000001,47.45705999999999],[-122.24056400000002,47.45643999999999],[-122.24064000000001,47.454390999999994],[-122.24065000000002,47.45383999999999],[-122.24063000000001,47.453239999999994],[-122.24069000000001,47.45122899999999],[-122.2407,47.450669999999995],[-122.24074,47.449639999999995],[-122.24077,47.44824],[-122.24078,47.44643],[-122.24084,47.44464399999999],[-122.24093,47.44274],[-122.24096000000002,47.441955],[-122.24096000000002,47.44155],[-122.24098000000001,47.441199999999995],[-122.24143000000001,47.441199999999995],[-122.24176000000001,47.441199999999995],[-122.24229000000001,47.44120699999999],[-122.24333,47.44121],[-122.24369000000002,47.441216],[-122.24442000000002,47.441219999999994],[-122.24563,47.44123],[-122.24546000000001,47.440433],[-122.24535,47.43992],[-122.245336,47.43979],[-122.24535,47.4396],[-122.24538,47.43941],[-122.24545,47.439226],[-122.24551000000001,47.4391],[-122.24563,47.43894],[-122.24566000000002,47.43889],[-122.24587,47.438657],[-122.24616000000002,47.43844],[-122.24657,47.4382],[-122.24677,47.43806],[-122.24697,47.4379],[-122.24714000000002,47.43773],[-122.24729000000002,47.43755],[-122.24740000000001,47.437355000000004],[-122.24752000000002,47.437053],[-122.24779000000001,47.43603],[-122.24820000000001,47.43452],[-122.2484,47.43379],[-122.2485,47.43343],[-122.2548,47.433506],[-122.25593699999999,47.43352],[-122.25628,47.43352],[-122.25645,47.43352],[-122.25685,47.43332],[-122.25701000000001,47.433288],[-122.2573,47.43323],[-122.25787,47.43327],[-122.25846999999999,47.433530000000005],[-122.25927,47.43414],[-122.25954,47.43414],[-122.25995,47.43414],[-122.26085,47.434154],[-122.26172000000001,47.43416],[-122.26208,47.43416],[-122.26229000000001,47.43417],[-122.2625,47.43417],[-122.26288,47.43417],[-122.26295,47.434101],[-122.26301000000001,47.43402699999999],[-122.26307,47.43395],[-122.26311000000001,47.43387],[-122.26315000000001,47.43379],[-122.26318,47.4337],[-122.26321000000002,47.43362],[-122.26322000000002,47.433530000000005],[-122.26323000000001,47.433443999999994],[-122.26322000000002,47.433350000000004],[-122.26321000000002,47.43327],[-122.26319000000001,47.43318],[-122.26313,47.433032000000004],[-122.26286999999999,47.432900000000004],[-122.26245,47.43269],[-122.26184,47.43253500000001],[-122.26075,47.43227],[-122.2597,47.432010000000005],[-122.25899,47.43174],[-122.25845,47.43135],[-122.25823199999999,47.430566],[-122.25825,47.43049],[-122.25829999999999,47.430330000000005],[-122.25832,47.430248],[-122.25863,47.429811],[-122.25903,47.42958],[-122.25979099999999,47.429435000000005],[-122.26262900000002,47.429410000000004],[-122.26352000000001,47.42931000000001],[-122.26418000000001,47.42918],[-122.26493,47.42888],[-122.26532999999999,47.42866],[-122.26576999999999,47.42812000000001],[-122.26621000000002,47.42694],[-122.26722000000002,47.425540000000005],[-122.26725800000001,47.425233000000006],[-122.26706000000001,47.42489],[-122.26597,47.42383],[-122.26558,47.423300000000005],[-122.26544,47.42322],[-122.26536999999999,47.423054],[-122.26521000000001,47.42266],[-122.26525000000001,47.42182],[-122.26548,47.421330000000005],[-122.2664,47.42036],[-122.26718000000001,47.419399999999996],[-122.26734,47.419395],[-122.26767000000001,47.419399999999996],[-122.27076999999998,47.41937],[-122.27312,47.419332000000004],[-122.27436,47.41931],[-122.27624,47.41929],[-122.27661,47.41928299999999],[-122.27717,47.41927],[-122.27729000000001,47.41927],[-122.27739,47.41927999999999],[-122.27746,47.419293999999994],[-122.27751,47.41932],[-122.27756000000001,47.41935],[-122.2776,47.419399999999996],[-122.277628,47.41943],[-122.27765000000001,47.41947999999999],[-122.27765000000001,47.41954],[-122.27765000000001,47.41965],[-122.277671,47.419689999999996],[-122.27772,47.41973],[-122.277761,47.41976],[-122.277803,47.419765],[-122.27785,47.41977],[-122.27791300000001,47.41976],[-122.27798,47.41973],[-122.27876999999998,47.41931],[-122.27891,47.419259999999994],[-122.27904,47.41923],[-122.27921300000001,47.419219999999996],[-122.27942999999999,47.41923],[-122.27995,47.419219999999996],[-122.28020000000001,47.419219999999996],[-122.28028,47.41923],[-122.28036999999999,47.41925],[-122.28045,47.4193],[-122.28052000000001,47.41934],[-122.28044,47.41939],[-122.27824,47.420910000000006],[-122.27787,47.421310000000005],[-122.277575,47.42178],[-122.27736999999999,47.42231000000001],[-122.27726900000002,47.42296],[-122.27729000000001,47.423373000000005],[-122.27728,47.423669],[-122.27726000000001,47.42382],[-122.277218,47.42402],[-122.27714,47.42424],[-122.27705,47.42442],[-122.27695,47.42458],[-122.27676999999998,47.42481],[-122.27548999999999,47.42648],[-122.27539999999999,47.42658],[-122.27532999999998,47.42667],[-122.27512,47.42691000000001],[-122.27486,47.42716],[-122.27436,47.42758],[-122.27362000000001,47.42819000000001],[-122.27251,47.429100000000005],[-122.27132999999999,47.42994],[-122.27071,47.430383],[-122.27049,47.43054],[-122.27036,47.430640999999994],[-122.27029999999999,47.43068699999999],[-122.27019,47.43079],[-122.27015,47.430930000000004],[-122.27017,47.43103],[-122.26993,47.43109],[-122.26981,47.431154],[-122.26971,47.43127],[-122.26964000000001,47.431425],[-122.26963,47.431475],[-122.26961000000001,47.4317],[-122.26963,47.43207],[-122.26969000000001,47.432327],[-122.26971,47.43253000000001],[-122.26968000000001,47.43273000000001],[-122.26969000000001,47.43283],[-122.26968000000001,47.432900000000004],[-122.26993,47.432897],[-122.27025,47.43289],[-122.27085,47.432894],[-122.27105,47.432897],[-122.27096,47.433805],[-122.27089,47.4344],[-122.27052,47.434689999999996],[-122.27005,47.43519200000001],[-122.26957,47.435656],[-122.26943,47.43583],[-122.269367,47.43589],[-122.26865000000001,47.43682],[-122.26814,47.437148],[-122.26687,47.43775],[-122.26544,47.438431],[-122.26522900000002,47.43873000000001],[-122.2651,47.44294],[-122.26558,47.44308699999999],[-122.26581,47.44315],[-122.26706000000001,47.44356],[-122.26700000000001,47.443799999999996],[-122.26668000000001,47.445121],[-122.26562000000001,47.44511000000001],[-122.265319,47.44618],[-122.26512000000001,47.446819999999995],[-122.26506,47.446999999999996],[-122.26507,47.447542],[-122.26507,47.44780599999999],[-122.26563,47.44780899999999],[-122.26565000000001,47.44780899999999],[-122.26650000000001,47.44780299999999],[-122.26705000000001,47.447799999999994],[-122.26715000000002,47.447799999999994],[-122.26809,47.44779],[-122.26874,47.44779],[-122.26886,47.447779999999995],[-122.26888,47.449130000000004],[-122.26730300000001,47.449110000000005],[-122.26729500000002,47.449130000000004],[-122.26726000000002,47.44918],[-122.26723000000001,47.44922],[-122.26714000000001,47.44934],[-122.26709000000001,47.449419999999996],[-122.26702000000002,47.44956],[-122.26700000000001,47.449639999999995],[-122.26701000000001,47.44993],[-122.26702000000002,47.45062099999999],[-122.26704000000001,47.45113],[-122.26791900000002,47.451132],[-122.26793500000001,47.451719999999995],[-122.26889,47.45173],[-122.26891,47.452259],[-122.26822000000001,47.45225],[-122.26784,47.45225],[-122.26783,47.45233],[-122.26781000000001,47.45392],[-122.26780000000001,47.454179999999994],[-122.26778,47.45448999999999],[-122.27051,47.454499999999996],[-122.27132999999999,47.454499999999996],[-122.27141,47.456253999999994],[-122.27205,47.456255],[-122.27286999999998,47.456253999999994],[-122.27323,47.456253],[-122.27349,47.45625999999999],[-122.27385,47.45625999999999],[-122.27444,47.456253999999994],[-122.274928,47.45625999999999],[-122.27525,47.45625999999999],[-122.27615,47.45625999999999],[-122.2771,47.45625999999999],[-122.277399,47.456269999999996],[-122.27748,47.456267999999994],[-122.27806,47.456269999999996],[-122.27830999999999,47.45627999999999],[-122.27892,47.45627999999999],[-122.27956,47.45627999999999],[-122.28124000000001,47.456269999999996],[-122.28119000000001,47.45637],[-122.28119000000001,47.45643999999999],[-122.28118,47.456513],[-122.28117,47.45706299999999],[-122.28117,47.457469999999994],[-122.28117,47.457939999999994],[-122.28118,47.45963999999999],[-122.28128000000001,47.459635],[-122.28216,47.45963999999999],[-122.28277999999999,47.459638],[-122.28327,47.45963999999999],[-122.28565,47.459649999999996],[-122.28577999999999,47.45963],[-122.28586,47.459599999999995],[-122.28595,47.459559999999996],[-122.28604,47.459495],[-122.28617,47.459536],[-122.28632999999999,47.459575],[-122.28643799999999,47.459599999999995],[-122.28658,47.459619999999994],[-122.28672999999999,47.45963999999999],[-122.28703,47.45963999999999],[-122.28826000000001,47.459649999999996],[-122.289,47.459649999999996],[-122.29150000000001,47.459649999999996],[-122.29158100000001,47.459649999999996],[-122.29173,47.45965999999999],[-122.29183,47.45965999999999],[-122.29121000000002,47.460910000000005],[-122.29090000000001,47.46153],[-122.29067,47.46201000000001],[-122.29016000000001,47.46294],[-122.28997,47.463298],[-122.28989,47.46346],[-122.28983,47.463567],[-122.28976,47.46369],[-122.28974,47.463730000000005],[-122.28944,47.464310000000005],[-122.28902000000001,47.465140000000005],[-122.28882999999999,47.465540000000004],[-122.28875,47.465700000000005],[-122.288506,47.466170000000005],[-122.28811,47.46696],[-122.28878999999999,47.46696],[-122.2889,47.46724],[-122.28896,47.467452],[-122.28909,47.46815600000001],[-122.28919,47.4688],[-122.2894,47.470234],[-122.28946,47.470639999999996],[-122.28965000000001,47.47205],[-122.28967,47.472120000000004],[-122.2897,47.47225],[-122.28976999999999,47.47247],[-122.289795,47.472530000000006],[-122.28991500000001,47.472730000000006],[-122.29100000000001,47.47434],[-122.29150000000001,47.47508],[-122.29171000000001,47.475397],[-122.29316000000001,47.477519],[-122.29343,47.477985999999994],[-122.29422000000002,47.47936],[-122.29445000000001,47.47976],[-122.29464000000002,47.480117],[-122.29471000000001,47.48031],[-122.29497,47.481553],[-122.29514,47.48242],[-122.29528,47.48296],[-122.2954,47.48338],[-122.29566000000001,47.484199999999994],[-122.29587,47.484899999999996],[-122.29606000000001,47.485510000000005],[-122.29609,47.4856],[-122.29613,47.485730000000004],[-122.29624000000001,47.486095],[-122.29629000000001,47.48625],[-122.29637,47.48649699999999],[-122.29643,47.486639999999994],[-122.29667300000001,47.48732],[-122.29691000000001,47.48796399999999],[-122.29718000000001,47.48862],[-122.29723000000001,47.488730000000004],[-122.29706000000002,47.488695],[-122.29681000000001,47.488679999999995],[-122.29626000000002,47.488668999999994],[-122.29616000000001,47.48867],[-122.29604,47.488665],[-122.29545,47.488679999999995],[-122.29479,47.48869],[-122.29469000000002,47.488710000000005],[-122.29460000000002,47.48876],[-122.29424000000002,47.48876],[-122.29225000000001,47.48878],[-122.29256000000001,47.489459999999994],[-122.29281,47.490140000000004],[-122.29429200000001,47.490094],[-122.29432000000001,47.490625],[-122.29435000000001,47.491425],[-122.29442000000002,47.49142],[-122.29437,47.49231000000001],[-122.294075,47.49230000000001],[-122.29443,47.49284],[-122.29609,47.49535000000001],[-122.29641000000001,47.495830000000005],[-122.29641000000001,47.495837],[-122.29635,47.49586],[-122.29634,47.49629],[-122.29662000000002,47.497009],[-122.29676,47.497350000000004],[-122.29654000000001,47.497350000000004],[-122.29633,47.497350000000004],[-122.29631,47.497665],[-122.29641000000001,47.497679999999995],[-122.29645900000001,47.4977],[-122.29659000000001,47.49774],[-122.29672000000001,47.49781],[-122.29681000000001,47.497893],[-122.29686000000001,47.49794],[-122.29703500000001,47.498160000000006],[-122.29723000000001,47.49848],[-122.29744000000001,47.49882],[-122.29752000000002,47.498926000000004],[-122.29723000000001,47.499010000000006],[-122.29692000000001,47.499099],[-122.2973,47.499700000000004],[-122.29754000000001,47.5002],[-122.29775000000001,47.500710000000005],[-122.29782000000002,47.50095],[-122.29885,47.502916000000006],[-122.2989,47.50304],[-122.2994,47.504202],[-122.30035,47.50645],[-122.30036999999999,47.50649],[-122.30070699999999,47.507112000000006],[-122.300806,47.50729],[-122.30104,47.507639999999995],[-122.30182,47.50864],[-122.30214099999999,47.508976000000004],[-122.30216999999999,47.509],[-122.30257999999999,47.509409],[-122.30272,47.509530000000005],[-122.30274999999999,47.50956],[-122.30312,47.509888999999994],[-122.303679,47.510323],[-122.30372,47.510351],[-122.30404,47.51057],[-122.304843,47.51113],[-122.30497,47.51122099999999],[-122.30726000000001,47.512828],[-122.30689,47.51283],[-122.30669999999999,47.51283],[-122.30588999999999,47.51283],[-122.304041,47.512836],[-122.30395,47.512837],[-122.3043,47.51371],[-122.306,47.51783],[-122.30636,47.518710000000006],[-122.30726000000001,47.520891],[-122.30778,47.52215000000001],[-122.30848999999999,47.52428],[-122.30872999999998,47.524999],[-122.31049,47.527],[-122.31221900000001,47.52819000000001],[-122.31405000000001,47.529450000000004],[-122.314682,47.52984],[-122.31495000000001,47.529970000000006],[-122.31506999999999,47.53004],[-122.31801,47.531585],[-122.31835,47.531766],[-122.31803,47.531765]]]},"name":"Tukwila"},{"boundary":{"type":"Polygon","coordinates":[[[-121.99732000000002,47.73071000000001],[-121.99682000000001,47.730810000000005],[-121.99677,47.730810000000005],[-121.99564000000001,47.730888],[-121.99520000000001,47.730971000000004],[-121.99462000000003,47.73108],[-121.99455000000002,47.731170000000006],[-121.99415000000002,47.73129],[-121.99341000000001,47.731880999999994],[-121.99293,47.73254000000001],[-121.99278,47.73275000000001],[-121.99223300000001,47.73515000000001],[-121.99217,47.735431000000005],[-121.99162200000002,47.73651400000001],[-121.99152000000002,47.73706],[-121.99116000000002,47.73801000000001],[-121.99129000000002,47.73812100000001],[-121.99121000000002,47.73832000000001],[-121.99148000000001,47.738988000000006],[-121.99222000000002,47.739976000000006],[-121.99238,47.74051000000001],[-121.99216000000001,47.74078],[-121.99185000000001,47.740950000000005],[-121.99128000000002,47.74106],[-121.99074,47.74094],[-121.989759,47.74082],[-121.9893,47.74091200000001],[-121.989,47.74112],[-121.98895,47.74121],[-121.98836999999999,47.742143000000006],[-121.98831,47.742354000000006],[-121.98817,47.74286],[-121.98796000000002,47.74329],[-121.98778,47.74365],[-121.98766000000002,47.74416],[-121.98688,47.746006],[-121.98686000000001,47.746252000000005],[-121.98683,47.746693],[-121.98712000000002,47.7478],[-121.98713000000001,47.74797],[-121.98678699999999,47.74798],[-121.98616000000001,47.747999],[-121.98595,47.746300000000005],[-121.98566300000002,47.745540000000005],[-121.98546999999999,47.745020000000004],[-121.98542,47.74519000000001],[-121.9854,47.745470000000005],[-121.98537999999999,47.74597000000001],[-121.98539,47.74636],[-121.98539,47.746562000000004],[-121.98536999999999,47.74673000000001],[-121.98531,47.747004],[-121.98529,47.74707],[-121.98519,47.747222],[-121.98509,47.747330000000005],[-121.98504,47.747370000000004],[-121.98498900000001,47.7474],[-121.98502,47.747896999999995],[-121.985573,47.747868],[-121.98558,47.74819000000001],[-121.985983,47.74816200000001],[-121.98602000000001,47.74851000000001],[-121.98603,47.74868],[-121.98602000000001,47.74888],[-121.986,47.749077],[-121.98597,47.74926],[-121.98592900000001,47.749457],[-121.98584,47.74974],[-121.98577999999999,47.749891],[-121.98564,47.75016],[-121.98556,47.750288],[-121.985355,47.75058],[-121.98514,47.75082],[-121.98496000000002,47.75101],[-121.98482000000001,47.75113],[-121.9847,47.75123],[-121.98109000000001,47.751218],[-121.98108,47.75109],[-121.98079,47.7488],[-121.98065000000001,47.747710000000005],[-121.98063,47.747710000000005],[-121.98062700000001,47.747656],[-121.98062700000001,47.74762],[-121.98063,47.747550000000004],[-121.97923,47.74754],[-121.97911,47.74754],[-121.978204,47.74754],[-121.97778,47.74754],[-121.97761000000001,47.74754],[-121.97751000000001,47.747550000000004],[-121.97741,47.747566],[-121.97725000000001,47.747609],[-121.97724000000001,47.74761],[-121.97720000000001,47.74756],[-121.9754,47.747558000000005],[-121.975051,47.74756],[-121.97501,47.74568],[-121.97498,47.743770000000005],[-121.97495,47.742160000000005],[-121.97493,47.740950000000005],[-121.97143,47.74092],[-121.97141,47.74082],[-121.9714,47.74069],[-121.97141,47.74047],[-121.97142000000001,47.73997000000001],[-121.97141500000001,47.73975000000001],[-121.97145,47.739560000000004],[-121.97147,47.73944],[-121.97148,47.73919000000001],[-121.97148,47.739000000000004],[-121.97147,47.738850000000006],[-121.97145,47.73875000000001],[-121.97141,47.73857000000001],[-121.97142000000001,47.73841000000001],[-121.97138,47.73774],[-121.97113,47.73774],[-121.97052000000001,47.737790000000004],[-121.96947,47.73788],[-121.96947,47.743747],[-121.96946000000001,47.747479999999996],[-121.96483300000001,47.746997],[-121.96495000000002,47.74311000000001],[-121.96008,47.742747],[-121.95962000000002,47.74270800000001],[-121.95952000000001,47.7409],[-121.95926000000001,47.740866999999994],[-121.95898799999999,47.74083],[-121.95865,47.740804],[-121.95214,47.740237],[-121.95022000000002,47.74008],[-121.94926000000002,47.73998],[-121.94933,47.7419],[-121.94904000000001,47.7419],[-121.94800000000001,47.741865999999995],[-121.94399000000001,47.74176],[-121.94390000000001,47.738124000000006],[-121.94664000000002,47.73818000000001],[-121.94664000000002,47.73771000000001],[-121.94663000000001,47.737168000000004],[-121.94659000000001,47.736850000000004],[-121.94658500000001,47.73671000000001],[-121.94655000000002,47.736201],[-121.94723000000002,47.736230000000006],[-121.94788000000001,47.73626],[-121.94774000000001,47.7344],[-121.94861000000002,47.734410000000004],[-121.94903000000001,47.734410000000004],[-121.94934,47.73443],[-121.94944000000001,47.734435000000005],[-121.95153,47.734609],[-121.95318,47.734750000000005],[-121.95542,47.73494],[-121.95656300000002,47.73503200000001],[-121.9567,47.735043000000005],[-121.95669000000001,47.73485],[-121.95667,47.73452],[-121.95665000000001,47.734100000000005],[-121.95924000000001,47.734300000000005],[-121.959218,47.73388],[-121.95921000000001,47.733647],[-121.95920000000001,47.73337000000001],[-121.95915000000001,47.73243000000001],[-121.95915000000001,47.73232000000001],[-121.95913,47.731957],[-121.9591,47.73152],[-121.9591,47.73098],[-121.95911000000001,47.730790000000006],[-121.95909,47.73059000000001],[-121.95907,47.730449],[-121.95904,47.73031700000001],[-121.95901,47.730197000000004],[-121.9589,47.72995000000001],[-121.95869,47.729586000000005],[-121.95811,47.72892500000001],[-121.95795000000001,47.728767000000005],[-121.95782700000001,47.728660000000005],[-121.95756000000002,47.728480000000005],[-121.95687,47.72802000000001],[-121.95664000000001,47.727854],[-121.95519,47.72683000000001],[-121.95441000000001,47.726282000000005],[-121.95421000000002,47.72614000000001],[-121.95475,47.72590000000001],[-121.95596,47.72540000000001],[-121.9563,47.72525800000001],[-121.95732000000001,47.72476],[-121.957232,47.72467],[-121.9567,47.72410000000001],[-121.9565,47.72390000000001],[-121.9564,47.723800000000004],[-121.95687,47.72359000000001],[-121.95786000000001,47.72315100000001],[-121.9588,47.72276000000001],[-121.95964000000001,47.72243800000001],[-121.95907,47.72164],[-121.95891,47.721430000000005],[-121.95882,47.72133000000001],[-121.95539,47.72272000000001],[-121.95449,47.721742000000006],[-121.95546999999999,47.72134200000001],[-121.95818,47.720240000000004],[-121.9583,47.72018500000001],[-121.95837999999999,47.720304000000006],[-121.95904,47.72119000000001],[-121.95912000000001,47.72129],[-121.95927,47.721500000000006],[-121.95917,47.721590000000006],[-121.959754,47.72239500000001],[-121.95999,47.72272000000001],[-121.96001000000001,47.72275000000001],[-121.96015400000002,47.72294600000001],[-121.96022000000002,47.723060000000004],[-121.96032000000001,47.723247],[-121.96035,47.72334000000001],[-121.96042000000001,47.72355500000001],[-121.96060000000001,47.72415000000001],[-121.96073,47.72442],[-121.96082900000002,47.72457000000001],[-121.96090000000001,47.724646],[-121.96094000000001,47.72469],[-121.96110000000002,47.724790000000006],[-121.96129000000002,47.72488],[-121.96153000000001,47.72500000000001],[-121.96180000000001,47.725077000000006],[-121.9621,47.72511700000001],[-121.96225000000001,47.725130000000014],[-121.96244,47.725130000000014],[-121.96271,47.72510000000001],[-121.96309000000001,47.72502600000001],[-121.96347,47.724894],[-121.96374,47.724790000000006],[-121.96403000000001,47.724700000000006],[-121.96431000000001,47.7246],[-121.96465000000002,47.72437000000001],[-121.96523,47.723670000000006],[-121.96525000000001,47.72338200000001],[-121.96692000000002,47.723380000000006],[-121.96688,47.72289000000001],[-121.96687,47.72275000000001],[-121.96819900000001,47.72275000000001],[-121.96822000000002,47.72466],[-121.96819900000001,47.724810000000005],[-121.968334,47.724824],[-121.96932000000001,47.72488],[-121.96958000000001,47.72489],[-121.96985000000001,47.72491000000001],[-121.970445,47.72491000000001],[-121.97101,47.724908000000006],[-121.971334,47.72490500000001],[-121.97168,47.724899],[-121.97332,47.72487],[-121.97351,47.72487],[-121.97555,47.72484],[-121.97616000000001,47.72484],[-121.9768,47.724830000000004],[-121.97832,47.72487],[-121.97846999999999,47.72488],[-121.97863,47.724900000000005],[-121.97874999999999,47.724920000000004],[-121.97892999999999,47.724970000000006],[-121.97907,47.72502000000001],[-121.97926000000001,47.725113000000015],[-121.97974099999999,47.72545000000001],[-121.98,47.72559700000001],[-121.98011000000001,47.72564500000001],[-121.98020000000001,47.725680000000004],[-121.98024000000001,47.72569000000001],[-121.98048,47.72572500000001],[-121.98061000000001,47.72573000000001],[-121.98068,47.72574000000001],[-121.98086,47.72574000000001],[-121.98093,47.72574000000001],[-121.98421000000002,47.72570000000001],[-121.98472000000001,47.72569000000001],[-121.9854,47.72567000000001],[-121.98565,47.725660000000005],[-121.98572999999999,47.725660000000005],[-121.98635,47.72563100000001],[-121.98659,47.725620000000006],[-121.986815,47.72557000000001],[-121.98684,47.72583000000001],[-121.98700000000001,47.72751000000001],[-121.98704000000001,47.727889],[-121.98709000000001,47.72839000000001],[-121.98710700000001,47.72853000000001],[-121.98715000000001,47.72896000000001],[-121.98723900000002,47.72896000000001],[-121.98751000000001,47.72895000000001],[-121.98791000000001,47.72896000000001],[-121.98788,47.72855000000001],[-121.99057,47.72860000000001],[-121.99056000000002,47.72862000000001],[-121.99101000000002,47.728640000000006],[-121.99144000000001,47.72863500000001],[-121.99682000000001,47.728640000000006],[-121.99728400000002,47.728640000000006],[-121.99730000000001,47.72966],[-121.99731000000001,47.73019600000001],[-121.99732000000002,47.730489],[-121.99732000000002,47.73071000000001]]]},"name":"Duvall"},{"boundary":{"type":"Polygon","coordinates":[[[-121.92587999999999,47.6443],[-121.924407,47.646349],[-121.92429000000001,47.64701],[-121.92403,47.647701],[-121.92408,47.648631],[-121.92416000000001,47.648691],[-121.92398,47.649210000000004],[-121.924,47.649353000000005],[-121.924046,47.649770000000004],[-121.92378,47.650459999999995],[-121.92385,47.65063],[-121.9238,47.650904],[-121.92360000000001,47.65155],[-121.92303,47.651543999999994],[-121.91747000000001,47.65153],[-121.91711000000002,47.65153],[-121.91482000000002,47.65145],[-121.91475000000001,47.65146299999999],[-121.91451000000002,47.65145],[-121.91404000000001,47.65145],[-121.91329000000002,47.65145999999999],[-121.91281000000001,47.65145],[-121.91267,47.65145],[-121.91194000000002,47.651439999999994],[-121.91188000000001,47.65179],[-121.91075000000001,47.65182399999999],[-121.9107,47.652034],[-121.91062000000002,47.65285],[-121.90749000000001,47.652879999999996],[-121.90749000000001,47.653324],[-121.90728300000002,47.653332000000006],[-121.90708000000001,47.653330000000004],[-121.90688,47.653330000000004],[-121.90451000000002,47.653310000000005],[-121.90235,47.65329],[-121.89822000000001,47.653321],[-121.89615,47.653326],[-121.89604,47.651513],[-121.89645,47.651506],[-121.90149000000001,47.651425999999994],[-121.90147,47.65131],[-121.90144000000001,47.649710000000006],[-121.90141000000001,47.648083],[-121.89923,47.648084],[-121.89722000000002,47.648700000000005],[-121.89681,47.648830000000004],[-121.89681,47.64893000000001],[-121.89681,47.64906],[-121.89554,47.64906],[-121.89556,47.64819000000001],[-121.89556999999999,47.647872],[-121.89549,47.647859999999994],[-121.8954,47.647833],[-121.89484,47.647679999999994],[-121.89429000000001,47.64754],[-121.89327,47.647279999999995],[-121.89246,47.647079999999995],[-121.89067,47.646657],[-121.89068,47.645900000000005],[-121.89065000000001,47.6452],[-121.89059,47.6449],[-121.8906,47.644819999999996],[-121.89061000000001,47.6448],[-121.89066000000001,47.644707],[-121.89068,47.64467],[-121.89066000000001,47.64445],[-121.89063,47.64421],[-121.89125000000001,47.64421],[-121.893,47.64422],[-121.89356000000001,47.644220999999995],[-121.894,47.64422],[-121.8961,47.64423],[-121.89611000000001,47.644631],[-121.89609,47.6449],[-121.89766000000002,47.644619999999996],[-121.89765000000001,47.644237],[-121.89762000000002,47.643737],[-121.89761000000001,47.64189],[-121.897681,47.64188599999999],[-121.89824,47.64189699999999],[-121.89842,47.6419],[-121.8986,47.64191],[-121.89885,47.641937],[-121.89917,47.641945],[-121.89961000000001,47.641980999999994],[-121.9,47.641988],[-121.90050000000001,47.642019000000005],[-121.90056000000001,47.642022000000004],[-121.90101000000001,47.642069],[-121.90148,47.642106000000005],[-121.90148,47.642010000000006],[-121.90148,47.6419],[-121.90148,47.64181],[-121.90147,47.640862],[-121.90147,47.64084],[-121.90146800000001,47.64045],[-121.90143,47.639764],[-121.90145000000001,47.63942],[-121.90143,47.63938],[-121.90141000000001,47.63936],[-121.901374,47.63927],[-121.90137,47.63906],[-121.90137,47.639030000000005],[-121.90142000000002,47.638940000000005],[-121.90145500000001,47.63890000000001],[-121.90153000000001,47.63884],[-121.90167000000001,47.63877900000001],[-121.90180000000001,47.63875000000001],[-121.90198000000001,47.638740000000006],[-121.90213,47.638740000000006],[-121.90291,47.638740000000006],[-121.90416000000002,47.638780000000004],[-121.90436000000001,47.63879000000001],[-121.904368,47.63897000000001],[-121.90444000000001,47.64008],[-121.90443,47.64036],[-121.90442000000002,47.640390000000004],[-121.90439,47.640423],[-121.90434,47.640454],[-121.90432000000001,47.641408],[-121.90432000000001,47.64153],[-121.905043,47.641408],[-121.90643,47.640910000000005],[-121.90694300000001,47.64082],[-121.90712000000002,47.640859999999996],[-121.90729000000002,47.64083],[-121.90738,47.64081],[-121.908461,47.639963],[-121.90868,47.63969],[-121.9087,47.63893900000001],[-121.90879,47.63862],[-121.90908,47.63826],[-121.9093,47.63811000000001],[-121.90978,47.637910000000005],[-121.91019000000001,47.637750000000004],[-121.91087,47.63766],[-121.91100000000002,47.637530000000005],[-121.91167000000002,47.63762],[-121.91415000000002,47.638044],[-121.91519000000001,47.637879999999996],[-121.91542000000001,47.63791500000001],[-121.9163,47.637856],[-121.9163,47.637879999999996],[-121.9163,47.638020000000004],[-121.91631000000001,47.638040000000004],[-121.91634,47.63888],[-121.91636000000001,47.63924],[-121.91636000000001,47.639509000000004],[-121.91635000000001,47.639583],[-121.91632000000001,47.63984],[-121.91628000000001,47.64002],[-121.91622100000002,47.64022],[-121.91616000000002,47.640387],[-121.91568000000001,47.641639999999995],[-121.91565000000001,47.64171],[-121.91547,47.64218],[-121.91525000000001,47.642830000000004],[-121.91522000000002,47.64294],[-121.91521000000002,47.643015000000005],[-121.91521000000002,47.643130000000006],[-121.91522000000002,47.6433],[-121.91542000000001,47.64394],[-121.91680000000001,47.643910000000005],[-121.91678,47.64417],[-121.91678,47.64427],[-121.91826000000002,47.64425],[-121.92049,47.644259999999996],[-121.921135,47.644259999999996],[-121.92173,47.644259999999996],[-121.92276,47.644259999999996],[-121.92456000000001,47.64426699999999],[-121.92536,47.64429],[-121.92587999999999,47.6443]]]},"name":"Carnation"},{"boundary":{"type":"Polygon","coordinates":[[[-122.39454300000001,47.77792],[-122.39332999999999,47.777930000000005],[-122.39319400000001,47.777929],[-122.39198,47.777930000000005],[-122.39013,47.777910000000006],[-122.38981,47.77789],[-122.38963,47.77789],[-122.38944,47.777896],[-122.38855,47.7779],[-122.38826999999999,47.777910000000006],[-122.38826,47.777910000000006],[-122.3882,47.777910000000006],[-122.38696,47.77792],[-122.38287999999999,47.77787],[-122.38273999999998,47.77787],[-122.38019,47.77784],[-122.38002999999999,47.777843],[-122.38001,47.777843],[-122.3791,47.77786],[-122.37893999999999,47.77786],[-122.37809999999999,47.77785],[-122.37747999999999,47.77785],[-122.37722000000001,47.777846],[-122.37554099999998,47.77783],[-122.37544999999999,47.77783],[-122.374413,47.77782],[-122.37429,47.77782],[-122.37424,47.77782],[-122.37312,47.77781],[-122.37212999999998,47.777801],[-122.37207999999998,47.777801],[-122.37058999999999,47.77783],[-122.37033999999998,47.77784],[-122.37003999999999,47.7779],[-122.37003999999999,47.77788699999999],[-122.37003999999999,47.77787],[-122.37001,47.77783],[-122.36998,47.777801],[-122.36994,47.77778],[-122.36989,47.777761],[-122.369841,47.77775200000001],[-122.36971,47.777753000000004],[-122.36958,47.777755000000006],[-122.36921000000001,47.777750000000005],[-122.36891,47.777764],[-122.36846999999999,47.777794],[-122.36822000000001,47.777798000000004],[-122.36799,47.777795000000005],[-122.367089,47.777750000000005],[-122.36691400000001,47.777750000000005],[-122.366685,47.77774],[-122.36519,47.77774],[-122.36496000000001,47.777730000000005],[-122.36462000000002,47.777716000000005],[-122.36439,47.777716000000005],[-122.36427,47.777721],[-122.36421400000002,47.777722000000004],[-122.36401000000001,47.77772],[-122.3631,47.777730000000005],[-122.36298,47.77774],[-122.36289,47.777750000000005],[-122.36162000000002,47.77778],[-122.36133,47.777764],[-122.36065,47.777767],[-122.35887999999998,47.777766],[-122.35866999999999,47.777766],[-122.358111,47.777766],[-122.35803999999999,47.777766],[-122.35652,47.777766],[-122.35646999999999,47.777766],[-122.356209,47.777766],[-122.35594999999999,47.777766],[-122.35548999999999,47.777770000000004],[-122.35542,47.777770000000004],[-122.35501,47.777770000000004],[-122.35495,47.777770000000004],[-122.35494,47.777770000000004],[-122.35486,47.777770000000004],[-122.35401,47.777770000000004],[-122.35367,47.777770000000004],[-122.35271999999999,47.77778],[-122.35265,47.77778],[-122.35262999999999,47.77778],[-122.35234999999999,47.77778],[-122.35181,47.77778],[-122.35149,47.77778],[-122.35091,47.77778],[-122.34994,47.777785],[-122.34986,47.777785],[-122.34778,47.77779],[-122.34771,47.77779],[-122.34764000000001,47.77779],[-122.34633,47.77779],[-122.34631,47.777794],[-122.34629000000001,47.777794],[-122.34622000000002,47.777794],[-122.34615000000001,47.777794],[-122.34189,47.77779],[-122.34183,47.77779],[-122.34176000000001,47.77779],[-122.34094,47.77779],[-122.34089,47.777785],[-122.34084,47.777785],[-122.34036,47.777785],[-122.340317,47.77778],[-122.3397,47.77778],[-122.33964,47.77778],[-122.33879999999999,47.77778],[-122.33824,47.77778],[-122.33823,47.77778],[-122.33815,47.77778],[-122.33784,47.77778],[-122.33760000000001,47.77778],[-122.337539,47.77778],[-122.33736,47.77778],[-122.3373,47.77778],[-122.33539999999999,47.777770000000004],[-122.33536,47.777770000000004],[-122.33532,47.777770000000004],[-122.33355,47.77767],[-122.33239999999999,47.77764],[-122.33,47.77762],[-122.32995,47.77762],[-122.32994,47.77762],[-122.32832999999998,47.777590000000004],[-122.32763,47.777632000000004],[-122.327334,47.77765],[-122.327304,47.77765],[-122.32683999999999,47.777679],[-122.3266,47.77768],[-122.32654,47.77768],[-122.32628,47.77769],[-122.32469999999999,47.777665],[-122.32463,47.777663999999994],[-122.324554,47.777663],[-122.32309,47.77765],[-122.32229999999998,47.77765],[-122.32185,47.77764],[-122.3214,47.77764],[-122.32128,47.77764],[-122.32121000000001,47.77764],[-122.31968,47.777631],[-122.31944,47.77763],[-122.31865,47.777625],[-122.31826000000001,47.777623],[-122.318,47.777622],[-122.31796000000001,47.777622],[-122.31790000000001,47.77762],[-122.31787,47.77762],[-122.31781000000001,47.77762],[-122.31765000000001,47.77762],[-122.31756000000001,47.77762],[-122.31746000000001,47.77762],[-122.31731,47.77762],[-122.31709900000001,47.77762],[-122.316887,47.77762],[-122.3168,47.77762],[-122.31669000000001,47.77762],[-122.31665000000001,47.77762],[-122.31578999999999,47.77762],[-122.31568,47.77762],[-122.31525,47.777619],[-122.31509,47.77761],[-122.31488,47.7776],[-122.31388,47.77758],[-122.313422,47.777570000000004],[-122.313328,47.777570000000004],[-122.31314,47.777570000000004],[-122.31313,47.777570000000004],[-122.313,47.77756],[-122.31267,47.77756],[-122.31265,47.77756],[-122.31232999999999,47.77756],[-122.31229,47.77756],[-122.31192000000001,47.777557],[-122.31190000000001,47.77756],[-122.31156000000001,47.777550000000005],[-122.31093,47.777546],[-122.31071,47.77754],[-122.31048,47.77754],[-122.30982999999999,47.77754],[-122.30955,47.777542000000004],[-122.30929,47.77754],[-122.30923,47.77754],[-122.30904,47.777539000000004],[-122.30896,47.77753800000001],[-122.30882999999999,47.77753500000001],[-122.30836,47.777533000000005],[-122.3081,47.777530000000006],[-122.30795,47.77752],[-122.30758,47.77751000000001],[-122.30669999999999,47.77751000000001],[-122.30632999999999,47.7775],[-122.30566999999999,47.777497],[-122.30523,47.77749],[-122.30512,47.77749],[-122.30498,47.777491],[-122.30421300000002,47.77748],[-122.30322000000001,47.77747],[-122.30301,47.77747],[-122.30297999999999,47.77747],[-122.30194,47.777463],[-122.30176,47.77746],[-122.30155,47.777459],[-122.301482,47.77746],[-122.30136,47.777456],[-122.3013,47.777456],[-122.301298,47.777456],[-122.29974,47.77744],[-122.29956000000001,47.77744],[-122.29938,47.77744],[-122.29934,47.77744],[-122.29916000000001,47.77743],[-122.29821000000001,47.77743],[-122.29812000000001,47.77742],[-122.29803,47.77742],[-122.29759000000001,47.77742],[-122.29757000000001,47.77653900000001],[-122.29755000000002,47.775600000000004],[-122.29754000000001,47.77531000000001],[-122.297531,47.7748],[-122.29753000000001,47.774719000000005],[-122.29751000000002,47.773782000000004],[-122.29750000000001,47.773230000000005],[-122.297478,47.772449],[-122.29746000000002,47.771510000000006],[-122.29746000000002,47.77146],[-122.29745000000001,47.771091],[-122.297437,47.77062],[-122.29742000000002,47.770100000000006],[-122.29950000000001,47.77011000000001],[-122.30009,47.77011000000001],[-122.30128,47.77011000000001],[-122.30188,47.77011000000001],[-122.30281,47.770120000000006],[-122.30546199999999,47.77013000000001],[-122.30547999999999,47.77068],[-122.30547999999999,47.77088],[-122.30566999999999,47.77088],[-122.30604,47.77089],[-122.30604699999999,47.771094],[-122.30636,47.771100000000004],[-122.30636999999999,47.77154],[-122.30726000000001,47.77154],[-122.30725000000001,47.77106],[-122.30725000000001,47.77082],[-122.30725000000001,47.77062],[-122.30805,47.770630000000004],[-122.30823,47.77075000000001],[-122.308602,47.77094],[-122.309236,47.771146],[-122.30941,47.7712],[-122.30971,47.771300000000004],[-122.30982999999999,47.771350000000005],[-122.31,47.77143],[-122.31019,47.771341],[-122.31053,47.7712],[-122.31058,47.771190000000004],[-122.31131,47.770951000000004],[-122.31152000000002,47.770874],[-122.31179,47.77078],[-122.313,47.770343000000004],[-122.313422,47.77015000000001],[-122.31394,47.76953100000001],[-122.31222000000001,47.76953000000001],[-122.31215,47.76988],[-122.31214,47.769923000000006],[-122.31118000000001,47.769920000000006],[-122.31114400000001,47.769783000000004],[-122.31033,47.769760000000005],[-122.310328,47.76964],[-122.31033,47.769200000000005],[-122.31021000000001,47.769200000000005],[-122.30976,47.769200000000005],[-122.30958,47.769200000000005],[-122.30954799999999,47.76906],[-122.30954,47.769020000000005],[-122.30949,47.76878800000001],[-122.30935,47.768084],[-122.30924,47.76755000000001],[-122.30924,47.767004],[-122.30812999999999,47.767],[-122.30814,47.766799000000006],[-122.30814,47.76668],[-122.30821,47.766625000000005],[-122.307587,47.76661500000001],[-122.30718,47.766600000000004],[-122.30676,47.76661300000001],[-122.30673999999999,47.76519000000001],[-122.30672,47.764390000000006],[-122.30645,47.764340000000004],[-122.30627,47.764320000000005],[-122.306244,47.76431000000001],[-122.30624,47.763326000000006],[-122.30624,47.763180000000006],[-122.30624,47.76290000000001],[-122.30627,47.76290000000001],[-122.30646999999999,47.762907000000006],[-122.30808999999999,47.76301000000001],[-122.30772,47.76223000000001],[-122.30764,47.762071000000006],[-122.30753,47.761842],[-122.30734,47.761465],[-122.30699,47.76128],[-122.30658,47.76106],[-122.30577999999998,47.760642000000004],[-122.30499999999999,47.76021300000001],[-122.30452000000001,47.759949],[-122.30385,47.75958],[-122.303724,47.75949],[-122.30364,47.75936],[-122.3036,47.75922],[-122.30354,47.758773000000005],[-122.30355,47.75871000000001],[-122.30355,47.75867],[-122.30372999999999,47.758387],[-122.30398,47.7584],[-122.30424000000001,47.758390000000006],[-122.30419,47.75829],[-122.30407,47.75815800000001],[-122.30348,47.75787],[-122.30284999999999,47.75757],[-122.30263,47.757433],[-122.3025,47.757309],[-122.30239999999999,47.757183],[-122.30232099999999,47.756997],[-122.30211,47.755614],[-122.30206999999999,47.75488599999999],[-122.30205,47.754138000000005],[-122.30238999999999,47.753102000000005],[-122.30332,47.75265],[-122.30262,47.751979],[-122.30302999999999,47.75107],[-122.303,47.750158000000006],[-122.30217999999999,47.74985],[-122.30171,47.74967],[-122.30153,47.74962],[-122.30134199999999,47.749598000000006],[-122.30115,47.74959500000001],[-122.30105,47.7496],[-122.30096,47.749610000000004],[-122.30069,47.74968],[-122.30053,47.749750000000006],[-122.300354,47.74958],[-122.29988,47.74982],[-122.29923400000001,47.74982],[-122.29911000000001,47.7498],[-122.29898,47.749700000000004],[-122.29895,47.74955500000001],[-122.29894,47.7494],[-122.29906000000001,47.74904],[-122.29904,47.748760000000004],[-122.29904,47.74831000000001],[-122.29734,47.748298000000005],[-122.297334,47.74673000000001],[-122.2973,47.74465],[-122.29715000000002,47.74465],[-122.2967,47.74464],[-122.29669000000001,47.74429],[-122.29604,47.74426],[-122.29602000000001,47.74313600000001],[-122.29603,47.742810000000006],[-122.29593,47.742810000000006],[-122.29536999999999,47.742810000000006],[-122.29501,47.742802000000005],[-122.29472000000001,47.74279800000001],[-122.29468000000001,47.74106],[-122.295,47.74106],[-122.29532999999999,47.74106],[-122.29663000000001,47.741046999999995],[-122.298595,47.74103],[-122.29933,47.74102],[-122.29931,47.73922],[-122.29929000000001,47.737410000000004],[-122.29919000000001,47.737390000000005],[-122.29798000000001,47.73736],[-122.29390000000001,47.737369],[-122.29389,47.73693900000001],[-122.2938,47.736940000000004],[-122.29312000000002,47.73693000000001],[-122.2929,47.73688],[-122.29276,47.7368],[-122.29219,47.73631000000001],[-122.29236999999999,47.735800000000005],[-122.29243,47.73554000000001],[-122.29246,47.735290000000006],[-122.29243,47.73375000000001],[-122.29381000000001,47.733760000000004],[-122.29469000000002,47.73377000000001],[-122.29516000000001,47.73377000000001],[-122.29531,47.73377000000001],[-122.29652000000002,47.733784],[-122.29788,47.733790000000006],[-122.29923000000001,47.733810000000005],[-122.30059,47.73382],[-122.30195,47.733830000000005],[-122.3036,47.733850000000004],[-122.304574,47.73386],[-122.304844,47.73386],[-122.30599,47.733874],[-122.30617,47.73388],[-122.30733,47.73389],[-122.30803999999999,47.733896],[-122.30869999999999,47.733900000000006],[-122.31005,47.73391900000001],[-122.31275,47.73395000000001],[-122.31544,47.73397000000001],[-122.31676,47.733990000000006],[-122.31812000000001,47.734001],[-122.32079999999999,47.734030000000004],[-122.32222,47.73404],[-122.32359,47.734052000000005],[-122.32446,47.73406],[-122.32452,47.73406],[-122.32473399999999,47.73406],[-122.32498,47.73406],[-122.32525,47.73406],[-122.32531999999999,47.734062],[-122.32565,47.73407],[-122.32622,47.73407],[-122.32637999999999,47.73407],[-122.32887999999998,47.73409],[-122.33023,47.734100000000005],[-122.33158,47.73411000000001],[-122.33303,47.734125000000006],[-122.33375,47.73413000000001],[-122.33428,47.73413000000001],[-122.33532999999998,47.734134000000005],[-122.33555,47.734134000000005],[-122.33592999999999,47.734134000000005],[-122.33698,47.73413300000001],[-122.33807999999999,47.73413000000001],[-122.33863,47.73413000000001],[-122.33969,47.734131000000005],[-122.34074,47.73413000000001],[-122.34103,47.73413000000001],[-122.34134,47.73413000000001],[-122.34239,47.73413000000001],[-122.34342000000001,47.734128000000005],[-122.34400000000001,47.734128000000005],[-122.34499000000001,47.734127],[-122.3451,47.734127],[-122.345211,47.734127],[-122.3463,47.734127],[-122.3478,47.734127],[-122.35051,47.734128000000005],[-122.35176999999999,47.734128000000005],[-122.35304,47.734128000000005],[-122.35426000000001,47.734128000000005],[-122.35556999999999,47.73413000000001],[-122.35916999999999,47.73413600000001],[-122.36093,47.734139000000006],[-122.36195900000001,47.734140000000004],[-122.37241999999999,47.73393000000001],[-122.37437599999998,47.733920000000005],[-122.37494,47.73391900000001],[-122.37768,47.74006],[-122.37848999999999,47.74147],[-122.38072999999999,47.744521],[-122.38266999999999,47.74783],[-122.38264,47.74911900000001],[-122.38168,47.7532],[-122.38073999999999,47.75531900000001],[-122.38024,47.75851900000001],[-122.38642,47.763324000000004],[-122.386541,47.763419000000006],[-122.38774,47.764520000000005],[-122.38744,47.76522000000001],[-122.38893999999999,47.767120000000006],[-122.39107,47.76910000000001],[-122.39166000000002,47.769650000000006],[-122.39175,47.769740000000006],[-122.39371,47.77154],[-122.394442,47.77221900000001],[-122.39354,47.77351900000001],[-122.39454300000001,47.77792]]]},"name":"Shoreline"},{"boundary":{"type":"Polygon","coordinates":[[[-122.37902999999999,47.452679999999994],[-122.37235999999999,47.45579],[-122.371815,47.456123],[-122.37158,47.456292],[-122.36993,47.457409999999996],[-122.36869,47.458310000000004],[-122.36864,47.45832],[-122.36859,47.45839],[-122.36804,47.459219999999995],[-122.36944,47.46412],[-122.36883999999999,47.465720000000005],[-122.36887999999999,47.465728000000006],[-122.36898,47.465945000000005],[-122.36905,47.46611000000001],[-122.36918,47.466330000000006],[-122.36916000000001,47.466345000000004],[-122.369237,47.466550000000005],[-122.3693,47.46667],[-122.36938099999999,47.46682],[-122.36944,47.466910000000006],[-122.36958,47.467168],[-122.36961000000001,47.467256],[-122.36966000000001,47.467382],[-122.36972,47.467510000000004],[-122.36972999999999,47.46758],[-122.36972999999999,47.46762],[-122.36972999999999,47.4677],[-122.36972999999999,47.467822],[-122.36972,47.46793],[-122.36971,47.46804],[-122.36967,47.468210000000006],[-122.36974,47.468421],[-122.36962000000001,47.46887],[-122.369369,47.46988699999999],[-122.36914,47.470819999999996],[-122.36809,47.472442],[-122.36667,47.474658],[-122.36644,47.47502],[-122.36382,47.477489999999996],[-122.36334,47.478221],[-122.36153,47.481108],[-122.36134,47.48142099999999],[-122.36329,47.484922],[-122.36524,47.48842],[-122.36556,47.48867],[-122.37443999999999,47.495430000000006],[-122.37565,47.496430000000004],[-122.37531199999998,47.49687],[-122.37521,47.49703],[-122.37506999999998,47.49725],[-122.37501999999999,47.49732],[-122.37492,47.4975],[-122.37485,47.497659],[-122.37427799999999,47.499221],[-122.37413,47.499617],[-122.37406,47.49992],[-122.37396999999999,47.50058],[-122.37392,47.5007],[-122.37379999999999,47.500834],[-122.37312,47.50138],[-122.37226,47.502010000000006],[-122.37204999999999,47.502182000000005],[-122.37141,47.502778000000006],[-122.37056,47.5028],[-122.37008999999999,47.5028],[-122.36834999999999,47.5028],[-122.36726000000002,47.502790000000005],[-122.36576,47.502794],[-122.36423,47.50278],[-122.36385,47.502790000000005],[-122.36228,47.502790000000005],[-122.36221,47.502787],[-122.36159,47.502790000000005],[-122.36045,47.502790000000005],[-122.35916,47.502786],[-122.35839999999999,47.50278],[-122.35802999999999,47.502784],[-122.35780199999999,47.502784],[-122.35647999999999,47.50278],[-122.35513999999999,47.50278],[-122.35378999999999,47.5028],[-122.35382999999999,47.50098],[-122.35247999999999,47.501006999999994],[-122.35076,47.50103],[-122.34979,47.501059999999995],[-122.34846,47.50108399999999],[-122.34711000000001,47.5011],[-122.34711000000001,47.50095],[-122.34710000000001,47.500150000000005],[-122.34713,47.499274],[-122.34443,47.499320000000004],[-122.34311000000001,47.499340000000004],[-122.3429,47.49933800000001],[-122.34171,47.49935500000001],[-122.33913,47.499390000000005],[-122.339065,47.499390000000005],[-122.33582,47.499449],[-122.33559,47.49945],[-122.33546,47.49946],[-122.33474,47.49947],[-122.33447,47.49947],[-122.3337,47.499488],[-122.33237999999999,47.499479],[-122.32974999999999,47.49947],[-122.32830999999999,47.49947],[-122.32652,47.49947],[-122.32534999999999,47.49946],[-122.32493,47.49947],[-122.32479,47.49947],[-122.32445,47.49946],[-122.32444,47.49954],[-122.32433999999999,47.49954],[-122.32433599999999,47.50028],[-122.32423,47.50028],[-122.32423,47.50057],[-122.32406999999999,47.50058],[-122.32392,47.500609],[-122.32377999999999,47.50065],[-122.32364,47.500706],[-122.32359,47.500659999999996],[-122.32346999999999,47.500730000000004],[-122.32342,47.50076],[-122.32336999999998,47.5008],[-122.323293,47.50089],[-122.32328,47.50167999999999],[-122.32333799999998,47.50167],[-122.32345,47.50165],[-122.32372,47.50216],[-122.3239,47.502500000000005],[-122.32394,47.50264],[-122.32386999999999,47.502790000000005],[-122.32368,47.50284],[-122.32332999999998,47.50298],[-122.3232,47.503035000000004],[-122.32315,47.503049],[-122.32266999999999,47.503045],[-122.32131,47.503035000000004],[-122.32054,47.50303],[-122.31789,47.50301],[-122.31708,47.503004],[-122.31666000000001,47.502953000000005],[-122.31654,47.502930000000006],[-122.31634,47.503001],[-122.31527,47.502998000000005],[-122.31335,47.502990000000004],[-122.31269999999999,47.502970000000005],[-122.31264,47.502970000000005],[-122.3126,47.50709],[-122.30995,47.50707],[-122.30864,47.507059],[-122.30736,47.50705],[-122.30736,47.5069],[-122.30736999999999,47.506730000000005],[-122.30734,47.50666],[-122.30729000000001,47.50662],[-122.30719,47.50661],[-122.30714,47.50661],[-122.305617,47.506591],[-122.30412000000001,47.506585],[-122.304041,47.50658],[-122.30402000000001,47.506530000000005],[-122.30316,47.506513000000005],[-122.30309,47.506513000000005],[-122.30301,47.506510000000006],[-122.30292,47.506510000000006],[-122.30283999999999,47.50651200000001],[-122.30276999999998,47.506508000000004],[-122.30266999999999,47.5065],[-122.30259,47.506504],[-122.30252,47.5065],[-122.30243999999999,47.50649],[-122.30236999999998,47.50649],[-122.302292,47.50649],[-122.30222,47.506496],[-122.30215,47.506509],[-122.30206,47.5065],[-122.30087999999999,47.506479999999996],[-122.30078999999999,47.50649],[-122.30076999999999,47.506408],[-122.30069999999999,47.50601],[-122.30052,47.505983],[-122.30029,47.50544],[-122.30017,47.505140000000004],[-122.300046,47.504839999999994],[-122.29992000000001,47.50454],[-122.29986000000001,47.50439],[-122.29978,47.504208],[-122.29972000000001,47.504039999999996],[-122.29969000000001,47.504039999999996],[-122.29962800000001,47.50381],[-122.299586,47.503643999999994],[-122.29954000000001,47.503479999999996],[-122.29947,47.50316],[-122.29944,47.50304],[-122.29913,47.50304],[-122.29874,47.502250000000004],[-122.29819,47.50123],[-122.29819,47.50107],[-122.29819,47.500952000000005],[-122.29809,47.500685999999995],[-122.29805,47.50058],[-122.29795000000001,47.5004],[-122.29723000000001,47.499010000000006],[-122.29752000000002,47.498926000000004],[-122.29744000000001,47.49882],[-122.29723000000001,47.49848],[-122.29703500000001,47.498160000000006],[-122.29686000000001,47.49794],[-122.29681000000001,47.497893],[-122.29672000000001,47.49781],[-122.29659000000001,47.49774],[-122.29645900000001,47.4977],[-122.29641000000001,47.497679999999995],[-122.29631,47.497665],[-122.29633,47.497350000000004],[-122.29654000000001,47.497350000000004],[-122.29676,47.497350000000004],[-122.29662000000002,47.497009],[-122.29634,47.49629],[-122.29635,47.49586],[-122.29641000000001,47.495837],[-122.29641000000001,47.495830000000005],[-122.29609,47.49535000000001],[-122.29443,47.49284],[-122.294075,47.49230000000001],[-122.29437,47.49231000000001],[-122.29442000000002,47.49142],[-122.29435000000001,47.491425],[-122.29432000000001,47.490625],[-122.29429200000001,47.490094],[-122.29281,47.490140000000004],[-122.29256000000001,47.489459999999994],[-122.29225000000001,47.48878],[-122.29424000000002,47.48876],[-122.29460000000002,47.48876],[-122.29469000000002,47.488710000000005],[-122.29479,47.48869],[-122.29545,47.488679999999995],[-122.29604,47.488665],[-122.29616000000001,47.48867],[-122.29626000000002,47.488668999999994],[-122.29681000000001,47.488679999999995],[-122.29706000000002,47.488695],[-122.29723000000001,47.488730000000004],[-122.297431,47.488734],[-122.29824,47.488730000000004],[-122.29996000000001,47.488710000000005],[-122.30211,47.48869],[-122.30342,47.488679999999995],[-122.30357,47.48867],[-122.304804,47.488659999999996],[-122.30612,47.48864],[-122.30745,47.48862],[-122.30845,47.488611],[-122.30870999999999,47.48861],[-122.31063,47.48858],[-122.31136000000001,47.488572000000005],[-122.31158,47.488569],[-122.31165000000001,47.488431],[-122.31201,47.487759999999994],[-122.3122,47.48741],[-122.3125,47.486836999999994],[-122.31302000000001,47.485859999999995],[-122.31303,47.485836],[-122.31316000000001,47.48555],[-122.31338,47.48495],[-122.313466,47.484649999999995],[-122.31358,47.484049999999996],[-122.31375,47.48312],[-122.31409000000001,47.481339999999996],[-122.314407,47.47963],[-122.31476,47.477726999999994],[-122.31512000000001,47.47576],[-122.31516,47.47552],[-122.31521000000001,47.475356000000005],[-122.31526600000001,47.475001],[-122.31532999999999,47.474639999999994],[-122.3154,47.47416],[-122.31551,47.4737],[-122.31559,47.4735],[-122.31573999999999,47.473197],[-122.31587999999999,47.472975000000005],[-122.31603,47.47281],[-122.31624000000001,47.472590000000004],[-122.31764000000001,47.471259999999994],[-122.31790000000001,47.471025],[-122.31811,47.47083],[-122.3188,47.470202],[-122.31892,47.47009],[-122.31944,47.4696],[-122.31964,47.46943],[-122.319722,47.469350000000006],[-122.31982,47.46926],[-122.31991000000001,47.469170000000005],[-122.31993,47.469156000000005],[-122.32234999999999,47.46692],[-122.323,47.46632],[-122.32321,47.46607],[-122.32329,47.46603],[-122.32342999999999,47.466010000000004],[-122.32343999999999,47.465092000000006],[-122.32343699999998,47.46459],[-122.32342999999999,47.46329],[-122.32342,47.46185],[-122.32342,47.46097],[-122.32341,47.460570000000004],[-122.32346,47.460243],[-122.32354,47.46003],[-122.32361,47.45985999999999],[-122.32377999999999,47.459649999999996],[-122.324028,47.45935],[-122.324484,47.458819999999996],[-122.32456,47.45872],[-122.32465,47.45858],[-122.32476,47.458379],[-122.32486999999999,47.458079999999995],[-122.32494,47.45784199999999],[-122.32518999999999,47.45703999999999],[-122.32525,47.45683999999999],[-122.32547999999998,47.456089999999996],[-122.32606,47.454118],[-122.32611,47.45392],[-122.32524,47.45243],[-122.32451,47.45119999999999],[-122.32342799999999,47.44933],[-122.32318,47.448932000000006],[-122.32236999999998,47.447575],[-122.32172,47.44647],[-122.321324,47.44574],[-122.32111,47.445330000000006],[-122.32104,47.445190000000004],[-122.32070999999999,47.444399999999995],[-122.32056999999999,47.443943],[-122.32055,47.44383],[-122.32054,47.44357],[-122.3205,47.443208],[-122.3205,47.443059999999996],[-122.3205,47.44301],[-122.3205,47.442862],[-122.32054,47.44247],[-122.32056,47.442383],[-122.320662,47.441869999999994],[-122.32073999999999,47.44159],[-122.32087999999999,47.4413],[-122.32099,47.4411],[-122.32112000000001,47.44093],[-122.32141,47.44058],[-122.32173999999999,47.440177],[-122.32207999999999,47.4398],[-122.32242999999998,47.439357],[-122.32245999999999,47.43932],[-122.32252999999999,47.43929],[-122.32258999999999,47.439271],[-122.32279999999999,47.43922],[-122.3236,47.43964],[-122.32409,47.43989],[-122.324107,47.43984],[-122.32414,47.439710000000005],[-122.32439,47.437219999999996],[-122.32445,47.43661],[-122.32446999999999,47.436445],[-122.32456,47.435566],[-122.32467,47.434259999999995],[-122.32476999999999,47.4334],[-122.32485,47.432500000000005],[-122.32489,47.43209],[-122.32497,47.43123],[-122.325193,47.43123],[-122.3261,47.43123],[-122.32718,47.43123],[-122.32847999999998,47.431239999999995],[-122.32977999999999,47.43124099999999],[-122.330362,47.431239999999995],[-122.33132,47.431248999999994],[-122.332467,47.431256],[-122.33371799999999,47.431259999999995],[-122.33451000000001,47.431259999999995],[-122.33579999999999,47.43127],[-122.33578999999999,47.43155],[-122.33563,47.432750000000006],[-122.33551,47.433710000000005],[-122.33546999999999,47.433977],[-122.33545,47.434146],[-122.33534699999998,47.43467],[-122.33532,47.434926],[-122.335244,47.435550000000006],[-122.33519,47.43593800000001],[-122.33512999999999,47.436350000000004],[-122.33512,47.43646],[-122.33496000000001,47.43767],[-122.334889,47.4382],[-122.33482000000001,47.43871000000001],[-122.33458,47.44045],[-122.33451000000001,47.44096],[-122.33442000000001,47.44163999999999],[-122.33418,47.443439999999995],[-122.33417,47.44354],[-122.33408,47.444208999999994],[-122.33401,47.44472],[-122.33398,47.444975],[-122.33396,47.445243],[-122.33396,47.447449999999996],[-122.33396,47.447489999999995],[-122.33397,47.44861],[-122.33392,47.449679999999994],[-122.33394,47.450289999999995],[-122.33393,47.45105999999999],[-122.33393,47.452110000000005],[-122.33393,47.452436],[-122.33393,47.453289999999996],[-122.33392,47.45381],[-122.33392,47.454215],[-122.33391,47.454699999999995],[-122.33391,47.454750999999995],[-122.333908,47.45541],[-122.33388,47.45716699999999],[-122.33388,47.457339],[-122.33646999999999,47.457339],[-122.33646,47.45635],[-122.33645,47.456098999999995],[-122.33760000000001,47.456089999999996],[-122.33931,47.45607999999999],[-122.33931,47.455999999999996],[-122.33933999999999,47.454829999999994],[-122.33936999999999,47.453738],[-122.33939,47.45292],[-122.33941,47.45238],[-122.3399,47.45239],[-122.34094,47.45239],[-122.34100000000001,47.45242],[-122.34101000000001,47.45242699999999],[-122.34209,47.45241],[-122.34351600000001,47.45238],[-122.34435,47.45237],[-122.34462000000002,47.45237],[-122.34481000000001,47.45238],[-122.34561000000001,47.452386],[-122.34609,47.45239],[-122.346396,47.452397],[-122.34665000000001,47.452382],[-122.34736000000001,47.452439999999996],[-122.34836999999999,47.452428],[-122.35005,47.45241],[-122.35042999999999,47.452402],[-122.35166000000001,47.452399],[-122.35271999999999,47.452393],[-122.35405,47.452391],[-122.35502999999999,47.45238],[-122.35529999999999,47.452373],[-122.35544999999999,47.45237],[-122.3579,47.452346],[-122.358449,47.452342],[-122.35844999999999,47.45207],[-122.35846,47.45166999999999],[-122.35849999999999,47.45063],[-122.35866,47.45063],[-122.35906999999999,47.45063],[-122.35978999999999,47.45062299999999],[-122.36004,47.45061],[-122.3602,47.45059],[-122.36031,47.45056699999999],[-122.36048,47.45051],[-122.36051,47.4505],[-122.36055,47.45048799999999],[-122.36067,47.450478],[-122.36106000000001,47.4505],[-122.36118,47.45048599999999],[-122.36125900000002,47.45045999999999],[-122.36137,47.450419999999994],[-122.36148,47.450356],[-122.36171,47.45019],[-122.36181,47.450136],[-122.36191000000001,47.45007999999999],[-122.36205,47.45004399999999],[-122.36223,47.450019999999995],[-122.36246,47.450019999999995],[-122.36232999999999,47.449614],[-122.36213,47.449614],[-122.36134,47.44874],[-122.35919,47.44874],[-122.35665,47.44874],[-122.35665,47.448310000000006],[-122.35595099999999,47.44839],[-122.35567999999999,47.448479999999996],[-122.35556999999999,47.448834],[-122.35544999999999,47.44883],[-122.35548999999999,47.44796899999999],[-122.35548999999999,47.447869999999995],[-122.35552,47.447089999999996],[-122.35555,47.446239999999996],[-122.35556999999999,47.445555000000006],[-122.355644,47.44547],[-122.35565,47.445370000000004],[-122.35566999999999,47.44522],[-122.35566999999999,47.445201],[-122.35571999999999,47.44512],[-122.35589999999999,47.44511000000001],[-122.35619,47.445121],[-122.35621,47.445114000000004],[-122.35745,47.445150000000005],[-122.35934999999999,47.445163],[-122.36015,47.44518],[-122.36184,47.44522],[-122.367036,47.44762099999999],[-122.37432,47.448932000000006],[-122.38314,47.45052],[-122.37902999999999,47.452679999999994]]]},"name":"Burien"},{"boundary":{"type":"Polygon","coordinates":[[[-122.28698,47.780730000000005],[-122.28696000000001,47.781839999999995],[-122.28694,47.78291900000001],[-122.28691,47.78437],[-122.28685,47.787819999999996],[-122.28684,47.78819000000001],[-122.28684,47.78882],[-122.28688,47.789536000000005],[-122.28693,47.79051400000001],[-122.28695,47.79090000000001],[-122.28632,47.79090000000001],[-122.28634,47.79155000000001],[-122.28622000000001,47.791843],[-122.28598,47.791830000000004],[-122.28584,47.79182],[-122.28576,47.79182],[-122.28527,47.79182],[-122.28524,47.79182],[-122.28502999999999,47.791810000000005],[-122.28476,47.791810000000005],[-122.28447,47.791810000000005],[-122.28420000000001,47.791810000000005],[-122.28412000000002,47.791810000000005],[-122.28413,47.792269000000005],[-122.28413,47.79255000000001],[-122.28416000000001,47.79364],[-122.28303,47.79363000000001],[-122.28225400000001,47.793623000000004],[-122.28146000000001,47.793617000000005],[-122.28148,47.794940000000004],[-122.28148,47.79550000000001],[-122.28150000000001,47.79586200000001],[-122.28150000000001,47.796850000000006],[-122.28151000000001,47.7978],[-122.28152000000001,47.798820000000006],[-122.28153,47.79916600000001],[-122.28324,47.79916600000001],[-122.28423000000001,47.79916600000001],[-122.2861,47.79916600000001],[-122.28611000000001,47.80006899999999],[-122.28513199999999,47.80006699999999],[-122.28516,47.80277],[-122.28241,47.80276],[-122.28156000000001,47.80275],[-122.28156000000001,47.802837],[-122.28157,47.80305],[-122.28158,47.80374],[-122.28158,47.803799999999995],[-122.28157,47.80412],[-122.28197,47.80415],[-122.28221,47.80419],[-122.28309,47.804306999999994],[-122.2833,47.80433],[-122.28351,47.804339999999996],[-122.28372,47.804339999999996],[-122.28413,47.80432],[-122.28423000000001,47.804322],[-122.284774,47.804289999999995],[-122.28489,47.80427999999999],[-122.28522000000001,47.80426799999999],[-122.28533999999999,47.80426299999999],[-122.28553,47.80426799999999],[-122.28556,47.80426899999999],[-122.28576999999999,47.804289999999995],[-122.28606,47.80433],[-122.28609,47.804339999999996],[-122.28616000000001,47.804355],[-122.28627,47.80439],[-122.28645,47.80441999999999],[-122.28647799999999,47.80441999999999],[-122.28667,47.804503999999994],[-122.28691,47.80455],[-122.286975,47.804559999999995],[-122.286971,47.80639],[-122.28544,47.80638],[-122.28502,47.80638],[-122.28412000000002,47.80637],[-122.28325000000001,47.80636],[-122.282656,47.806359],[-122.28208,47.806354],[-122.28092000000001,47.806345],[-122.28058,47.80635],[-122.28028,47.80636],[-122.28007,47.80636],[-122.27916,47.806385],[-122.27876999999998,47.80637],[-122.27825,47.80637],[-122.27812,47.80636],[-122.27654,47.806343],[-122.27632,47.80634],[-122.274309,47.806312000000005],[-122.27426000000001,47.806312000000005],[-122.27391,47.80631],[-122.27282999999998,47.80631],[-122.27086,47.80632],[-122.26939,47.80632],[-122.26938,47.80654],[-122.26981,47.80658],[-122.26979,47.806616],[-122.26938,47.806599999999996],[-122.26937,47.80695],[-122.26936,47.80703],[-122.26936,47.8071],[-122.26936,47.80723999999999],[-122.26946000000001,47.807649999999995],[-122.26957,47.80779999999999],[-122.26943,47.80797],[-122.26955000000001,47.808019],[-122.2698,47.80812],[-122.26978,47.80814],[-122.26953,47.80805],[-122.2694,47.808],[-122.2693,47.808082],[-122.26909,47.80824],[-122.268875,47.80846],[-122.26934,47.808819],[-122.26935,47.808997],[-122.26892000000001,47.809],[-122.26819,47.80901],[-122.26714000000001,47.80902],[-122.266436,47.80902],[-122.26638,47.8063],[-122.26463000000001,47.8063],[-122.26303,47.8063],[-122.26122000000002,47.8063],[-122.26017,47.806301],[-122.26015000000001,47.80496899999999],[-122.26013,47.80377],[-122.26012000000001,47.80347999999999],[-122.26012000000001,47.80312],[-122.26011300000002,47.80292],[-122.26011000000001,47.8027],[-122.26010000000001,47.802065],[-122.26010000000001,47.80181999999999],[-122.26010000000001,47.80152],[-122.26010000000001,47.801339999999996],[-122.26009,47.80074],[-122.26008,47.800508],[-122.26010000000001,47.80014],[-122.26007,47.799490000000006],[-122.26005,47.79850000000001],[-122.26005,47.7978],[-122.25988,47.79778],[-122.25985,47.79778],[-122.25976,47.797768000000005],[-122.25974,47.797765000000005],[-122.25941,47.79773000000001],[-122.2594,47.797731000000006],[-122.25852,47.79766],[-122.25837999999999,47.79764],[-122.25836,47.797638000000006],[-122.25802999999999,47.797604],[-122.25821,47.797540000000005],[-122.25846999999999,47.797450000000005],[-122.258547,47.7974],[-122.25872999999999,47.797294],[-122.2589,47.797200000000004],[-122.25906,47.797090000000004],[-122.25909,47.79706],[-122.25921000000001,47.796960000000006],[-122.25928,47.79690000000001],[-122.25934,47.796828000000005],[-122.25938,47.79675000000001],[-122.25942,47.796670000000006],[-122.25946,47.79651000000001],[-122.25945,47.796490000000006],[-122.25945,47.79635000000001],[-122.25943,47.796265000000005],[-122.25941,47.79612100000001],[-122.25938,47.79601000000001],[-122.2593,47.79565000000001],[-122.25925400000001,47.79550000000001],[-122.25919,47.79534800000001],[-122.25918,47.795330000000014],[-122.25914,47.79527000000001],[-122.25898799999999,47.79505200000001],[-122.25881,47.794850000000004],[-122.25856,47.79467],[-122.25849,47.79462],[-122.25826,47.79444],[-122.25778,47.79410000000001],[-122.25755000000001,47.79392000000001],[-122.25732,47.79373500000001],[-122.25720000000001,47.793620000000004],[-122.25678699999999,47.793226000000004],[-122.25663,47.793060000000004],[-122.25653,47.79295000000001],[-122.25628,47.79270000000001],[-122.2562,47.79261000000001],[-122.25617,47.792575000000014],[-122.25602,47.792404000000005],[-122.255933,47.79229000000001],[-122.2559,47.79225000000001],[-122.25578999999999,47.792110000000015],[-122.25574999999999,47.792046000000006],[-122.25572,47.791976000000005],[-122.25559,47.791742000000006],[-122.25556999999999,47.79171000000001],[-122.25562000000001,47.79171100000001],[-122.25754,47.79175000000001],[-122.25925000000001,47.79178],[-122.26012000000001,47.791801],[-122.26018,47.791801],[-122.26089,47.791830000000004],[-122.26144000000001,47.791830000000004],[-122.26356200000001,47.791877],[-122.26394,47.791889],[-122.26454000000001,47.791900000000005],[-122.26452000000002,47.791850000000004],[-122.26421000000002,47.79093800000001],[-122.26435000000001,47.79093800000001],[-122.26410000000001,47.790200000000006],[-122.26393,47.790200000000006],[-122.26382000000001,47.78989],[-122.26372,47.78974],[-122.26352000000001,47.789550000000006],[-122.26333,47.78943],[-122.26307,47.78931600000001],[-122.26262000000001,47.78918],[-122.26232999999999,47.789030000000004],[-122.26149000000001,47.78826],[-122.26126000000002,47.788090000000004],[-122.26149000000001,47.788090000000004],[-122.26157,47.788091],[-122.26187,47.788090000000004],[-122.2624,47.78810000000001],[-122.26458000000001,47.78813000000001],[-122.26520000000001,47.788140000000006],[-122.2653,47.788140000000006],[-122.2653,47.788500000000006],[-122.26662900000002,47.788491],[-122.26681,47.78849],[-122.26699,47.78849],[-122.26737,47.78848],[-122.26738,47.788681],[-122.26738,47.78873000000001],[-122.26663,47.788720000000005],[-122.26664000000001,47.78877000000001],[-122.26664000000001,47.788790000000006],[-122.26664000000001,47.78884],[-122.26664000000001,47.788889],[-122.26650000000001,47.788886],[-122.26619000000001,47.78889],[-122.26572999999999,47.788888],[-122.26524,47.788891],[-122.26524,47.788920000000005],[-122.265235,47.78909],[-122.26523,47.789317000000004],[-122.26523,47.789448],[-122.26523,47.789574],[-122.26523,47.789863999999994],[-122.26522900000002,47.789950000000005],[-122.26523,47.79008],[-122.26522600000001,47.79017000000001],[-122.26522000000001,47.790406000000004],[-122.26667,47.79041000000001],[-122.26667,47.79049500000001],[-122.26667,47.790580000000006],[-122.266676,47.790690000000005],[-122.26625000000001,47.79070300000001],[-122.26591,47.79071300000001],[-122.26592000000001,47.79091000000001],[-122.26591,47.79101000000001],[-122.26668000000001,47.79099000000001],[-122.26668000000001,47.79122],[-122.26669000000001,47.791290000000004],[-122.266395,47.791284],[-122.26596,47.791269],[-122.26552000000001,47.791267],[-122.26523,47.791266],[-122.26523,47.79139000000001],[-122.26523,47.79177000000001],[-122.26522900000002,47.791900000000005],[-122.26552000000001,47.79191000000001],[-122.26592000000001,47.791928000000006],[-122.2664,47.791940000000004],[-122.26655000000001,47.791940000000004],[-122.2667,47.79193000000001],[-122.26686000000001,47.79191600000001],[-122.26718000000001,47.791882],[-122.26723000000001,47.79188],[-122.26743,47.79188],[-122.26847,47.791900000000005],[-122.26884,47.791920000000005],[-122.26894,47.791934000000005],[-122.26936,47.79202000000001],[-122.26949,47.79205100000001],[-122.26960000000001,47.792060000000006],[-122.26961000000001,47.79205800000001],[-122.269856,47.79205700000001],[-122.27037999999999,47.79207000000001],[-122.27064,47.79207000000001],[-122.27064,47.79195000000001],[-122.27064,47.79170500000001],[-122.27029,47.791700000000006],[-122.26984,47.79170500000001],[-122.2694,47.79170500000001],[-122.2694,47.791567],[-122.26941000000001,47.79148],[-122.269405,47.791450000000005],[-122.2694,47.7912],[-122.26938,47.790622000000006],[-122.26937,47.79051000000001],[-122.26976,47.79050000000001],[-122.27029,47.79049800000001],[-122.27067,47.79050000000001],[-122.27067,47.790448000000005],[-122.27068,47.79019800000001],[-122.27032999999999,47.790200000000006],[-122.26971,47.79019200000001],[-122.269367,47.79019000000001],[-122.26936,47.79012000000001],[-122.26936,47.790090000000006],[-122.26936,47.789910000000006],[-122.26936,47.78984],[-122.26936,47.78982],[-122.26936,47.789767],[-122.26936,47.789749],[-122.26936,47.78961],[-122.26935,47.789390000000004],[-122.26935,47.78931000000001],[-122.27024,47.789300000000004],[-122.27022000000001,47.78871000000001],[-122.27015,47.78866],[-122.27006,47.788588000000004],[-122.27023,47.788485],[-122.26935,47.788494],[-122.26934,47.78819000000001],[-122.268,47.78817000000001],[-122.268,47.78627],[-122.26744000000001,47.78627],[-122.26531,47.78625],[-122.26531,47.785551000000005],[-122.26483,47.78555000000001],[-122.26483,47.785180000000004],[-122.26482000000001,47.78486399999999],[-122.26483,47.784292],[-122.26488,47.784292],[-122.26494000000001,47.784293],[-122.26496700000001,47.784293],[-122.26506,47.78429],[-122.26531,47.784298],[-122.26530699999999,47.78385],[-122.2653,47.783370000000005],[-122.2653,47.78293000000001],[-122.26531,47.78249],[-122.26469000000002,47.78249],[-122.26469700000001,47.78219000000001],[-122.26531,47.7822],[-122.26530699999999,47.780730000000005],[-122.26543,47.780730000000005],[-122.26542,47.77991900000001],[-122.26585,47.779621],[-122.26584,47.779070000000004],[-122.26617,47.779070000000004],[-122.26641000000001,47.779070000000004],[-122.26708,47.77906],[-122.26705000000001,47.77702],[-122.26831,47.77702],[-122.27096,47.77702],[-122.2738,47.77702],[-122.27711000000001,47.77702],[-122.27717,47.77702],[-122.27736999999999,47.77702],[-122.27744,47.77702],[-122.27767,47.77702],[-122.27836999999998,47.77702],[-122.27856,47.77702],[-122.2786,47.77702],[-122.27878999999999,47.77702],[-122.27935,47.77702],[-122.27954,47.77702],[-122.2796,47.77702],[-122.27978999999999,47.77702],[-122.27985,47.77702],[-122.2817,47.77727],[-122.281806,47.77727],[-122.28381,47.777277],[-122.28425000000001,47.777271],[-122.28433,47.77726],[-122.28645,47.77724],[-122.28686,47.777243],[-122.28704,47.777242],[-122.28698,47.780730000000005]]]},"name":"Brier"},{"boundary":{"type":"Polygon","coordinates":[[[-122.33339,47.78589],[-122.33339,47.785924],[-122.33336999999999,47.786100000000005],[-122.33336,47.78627],[-122.33333999999999,47.78652],[-122.33332999999999,47.78714],[-122.3333,47.78757],[-122.33327,47.788140000000006],[-122.3332,47.788520000000005],[-122.33318,47.788638000000006],[-122.33308,47.788979000000005],[-122.332964,47.789320000000004],[-122.332827,47.78964],[-122.33281699999999,47.78966],[-122.33266,47.78999],[-122.33246,47.790470000000006],[-122.33188,47.79191900000001],[-122.33184,47.79201800000001],[-122.33156000000001,47.79232000000001],[-122.33165000000001,47.792330000000014],[-122.33179,47.792330000000014],[-122.33191000000001,47.792330000000014],[-122.33199,47.79232000000001],[-122.33218,47.792330000000014],[-122.33272799999999,47.792330000000014],[-122.33279999999999,47.792330000000014],[-122.33282,47.79274000000001],[-122.33283999999999,47.794160000000005],[-122.33259,47.794160000000005],[-122.33232,47.79415000000001],[-122.33215,47.794160000000005],[-122.33189,47.79415000000001],[-122.33141,47.794140000000006],[-122.33119,47.794140000000006],[-122.33105,47.794140000000006],[-122.33067199999999,47.79413500000001],[-122.330574,47.79413400000001],[-122.33042,47.794547],[-122.33025,47.79502000000001],[-122.33015,47.79555000000001],[-122.33015,47.795660000000005],[-122.33014,47.79597000000001],[-122.33012000000001,47.79630000000001],[-122.330122,47.796890000000005],[-122.33013,47.79802000000001],[-122.33013,47.79857000000001],[-122.33014,47.79910000000001],[-122.33014,47.799627],[-122.33025,47.799628000000006],[-122.33036999999999,47.79963000000001],[-122.33051,47.799620000000004],[-122.33077999999999,47.79963000000001],[-122.33139,47.79965000000001],[-122.33161000000001,47.79965200000001],[-122.33173,47.79965000000001],[-122.32986999999999,47.80237],[-122.32972999999998,47.80232],[-122.32956,47.802274],[-122.32887999999998,47.80207],[-122.32874099999998,47.80222],[-122.3282,47.802412000000004],[-122.32657999999999,47.80299],[-122.32603999999999,47.803188],[-122.32574999999999,47.80332],[-122.32486999999999,47.80373],[-122.32458,47.803869999999996],[-122.32435,47.80395],[-122.323662,47.80418399999999],[-122.32342999999999,47.80425999999999],[-122.32312999999999,47.80437],[-122.322224,47.8047],[-122.32192,47.804809999999996],[-122.32129,47.805051],[-122.31939,47.80577],[-122.31876,47.80601],[-122.31842,47.80615],[-122.31741000000001,47.80655],[-122.31708,47.80667999999999],[-122.31683,47.80667999999999],[-122.316793,47.80667999999999],[-122.31629000000001,47.80667],[-122.31595,47.80667],[-122.31566600000001,47.80666399999999],[-122.31536999999999,47.806659999999994],[-122.3153,47.806658],[-122.31514,47.806656],[-122.31486000000001,47.80665],[-122.31466000000002,47.806653],[-122.31439,47.80667],[-122.31414000000001,47.80671],[-122.31399,47.806737],[-122.31385,47.806776],[-122.31364,47.80685],[-122.3134,47.80693],[-122.313,47.807089999999995],[-122.31286,47.80714],[-122.31271,47.80718099999999],[-122.31256,47.807219999999994],[-122.3124,47.807244999999995],[-122.31231,47.807255],[-122.31209,47.80727999999999],[-122.31176,47.807289999999995],[-122.31169000000001,47.80727999999999],[-122.31146000000001,47.807249999999996],[-122.31139,47.80723999999999],[-122.31132000000001,47.80723],[-122.31107,47.807178],[-122.31082,47.80709699999999],[-122.31044,47.806959],[-122.31018,47.80686299999999],[-122.30968,47.80671],[-122.30925,47.80663],[-122.30893999999999,47.80659],[-122.30852,47.80658],[-122.30822,47.806562],[-122.30753,47.80656],[-122.30654,47.80655],[-122.30579699999998,47.80653],[-122.30559,47.80654],[-122.30526,47.80654],[-122.30475,47.80654],[-122.30366000000001,47.80653],[-122.30321,47.80654],[-122.30276999999998,47.806529],[-122.30148,47.80651],[-122.30145,47.80651],[-122.30101,47.8065],[-122.30089,47.8065],[-122.30054,47.8065],[-122.30042999999999,47.8065],[-122.30031,47.8065],[-122.29996000000001,47.80649],[-122.29984,47.80649],[-122.29943,47.80649],[-122.29921000000002,47.80648699999999],[-122.298688,47.8065],[-122.29820000000001,47.80649],[-122.29779300000001,47.80649],[-122.29743,47.8065],[-122.29726000000002,47.80649],[-122.29690000000001,47.80649],[-122.29593,47.80649],[-122.29565000000001,47.80647999999999],[-122.29557,47.806472],[-122.29512000000001,47.806459999999994],[-122.29493000000001,47.80645],[-122.29488,47.80645],[-122.2947,47.80645],[-122.29344400000001,47.806442],[-122.29303,47.806439999999995],[-122.29289,47.806439],[-122.29247,47.806436],[-122.29234,47.806436],[-122.29234,47.80679],[-122.29234,47.80681],[-122.29232,47.80735],[-122.29231,47.807849999999995],[-122.29231,47.8082],[-122.29227,47.80824],[-122.29147,47.80823],[-122.28966000000001,47.80823],[-122.28967,47.80686899999999],[-122.28731,47.80685],[-122.28712000000002,47.80685],[-122.28698,47.806850999999995],[-122.28698,47.80654],[-122.286971,47.80639],[-122.286975,47.804559999999995],[-122.28696000000001,47.80440299999999],[-122.28689,47.804392],[-122.28689,47.80366099999999],[-122.286,47.803672],[-122.28555,47.80367999999999],[-122.28556,47.80426899999999],[-122.28553,47.80426799999999],[-122.28533999999999,47.80426299999999],[-122.28522000000001,47.80426799999999],[-122.28489,47.80427999999999],[-122.284774,47.804289999999995],[-122.28423000000001,47.804322],[-122.28413,47.80432],[-122.28372,47.804339999999996],[-122.28351,47.804339999999996],[-122.2833,47.80433],[-122.28309,47.804306999999994],[-122.28221,47.80419],[-122.28197,47.80415],[-122.28157,47.80412],[-122.28158,47.803799999999995],[-122.28158,47.80374],[-122.28157,47.80305],[-122.28156000000001,47.802837],[-122.28156000000001,47.80275],[-122.28241,47.80276],[-122.28516,47.80277],[-122.28513199999999,47.80006699999999],[-122.28611000000001,47.80006899999999],[-122.2861,47.79916600000001],[-122.28423000000001,47.79916600000001],[-122.28324,47.79916600000001],[-122.28153,47.79916600000001],[-122.28152000000001,47.798820000000006],[-122.28151000000001,47.7978],[-122.28150000000001,47.796850000000006],[-122.28150000000001,47.79586200000001],[-122.28148,47.79550000000001],[-122.28148,47.794940000000004],[-122.28146000000001,47.793617000000005],[-122.28225400000001,47.793623000000004],[-122.28303,47.79363000000001],[-122.28416000000001,47.79364],[-122.28413,47.79255000000001],[-122.28413,47.792269000000005],[-122.28412000000002,47.791810000000005],[-122.28420000000001,47.791810000000005],[-122.28447,47.791810000000005],[-122.28476,47.791810000000005],[-122.28502999999999,47.791810000000005],[-122.28524,47.79182],[-122.28527,47.79182],[-122.28576,47.79182],[-122.28584,47.79182],[-122.28598,47.791830000000004],[-122.28622000000001,47.791843],[-122.28634,47.79155000000001],[-122.28632,47.79090000000001],[-122.28695,47.79090000000001],[-122.28693,47.79051400000001],[-122.28688,47.789536000000005],[-122.28684,47.78882],[-122.28684,47.78819000000001],[-122.28685,47.787819999999996],[-122.28691,47.78437],[-122.28694,47.78291900000001],[-122.28696000000001,47.781839999999995],[-122.28698,47.780730000000005],[-122.28827,47.780957],[-122.28826400000001,47.7808],[-122.28838999999999,47.78068],[-122.28872,47.78028],[-122.28900300000001,47.78008],[-122.28902000000001,47.779969],[-122.28944,47.779976000000005],[-122.289849,47.779990000000005],[-122.289851,47.77991000000001],[-122.28985,47.77982],[-122.28986,47.77968],[-122.28986,47.77948],[-122.28986,47.779250000000005],[-122.28986,47.77910000000001],[-122.289892,47.778760000000005],[-122.2899,47.77855000000001],[-122.28992000000001,47.77830000000001],[-122.28993,47.77826],[-122.28971,47.77825000000001],[-122.28923,47.77825000000001],[-122.28915,47.77825000000001],[-122.28889,47.77825000000001],[-122.28894,47.777930000000005],[-122.288864,47.777930000000005],[-122.28826400000001,47.777933000000004],[-122.28824,47.77734],[-122.29009,47.77736],[-122.29013,47.77736],[-122.29036,47.777359000000004],[-122.29052000000001,47.777359000000004],[-122.290932,47.777367],[-122.29104000000001,47.777367],[-122.29163000000001,47.777366],[-122.29176000000001,47.777367],[-122.29222800000001,47.777370000000005],[-122.29232999999999,47.77737200000001],[-122.29242,47.777370000000005],[-122.29249,47.777370000000005],[-122.29367,47.77738],[-122.29378,47.77738],[-122.29391000000001,47.777390000000004],[-122.29575,47.777403],[-122.29592000000001,47.777404],[-122.296037,47.777406],[-122.29621000000002,47.777408],[-122.29759000000001,47.77742],[-122.29803,47.77742],[-122.29812000000001,47.77742],[-122.29821000000001,47.77743],[-122.29916000000001,47.77743],[-122.29934,47.77744],[-122.29938,47.77744],[-122.29956000000001,47.77744],[-122.29974,47.77744],[-122.301298,47.777456],[-122.3013,47.777456],[-122.30136,47.777456],[-122.301482,47.77746],[-122.30155,47.777459],[-122.30176,47.77746],[-122.30194,47.777463],[-122.30297999999999,47.77747],[-122.30301,47.77747],[-122.30322000000001,47.77747],[-122.30421300000002,47.77748],[-122.30498,47.777491],[-122.30512,47.77749],[-122.30523,47.77749],[-122.30566999999999,47.777497],[-122.30632999999999,47.7775],[-122.30669999999999,47.77751000000001],[-122.30758,47.77751000000001],[-122.30795,47.77752],[-122.3081,47.777530000000006],[-122.30836,47.777533000000005],[-122.30882999999999,47.77753500000001],[-122.30896,47.77753800000001],[-122.30904,47.777539000000004],[-122.30923,47.77754],[-122.30929,47.77754],[-122.30955,47.777542000000004],[-122.30982999999999,47.77754],[-122.31048,47.77754],[-122.31071,47.77754],[-122.31093,47.777546],[-122.31156000000001,47.777550000000005],[-122.31190000000001,47.77756],[-122.31192000000001,47.777557],[-122.31229,47.77756],[-122.31232999999999,47.77756],[-122.31265,47.77756],[-122.31267,47.77756],[-122.313,47.77756],[-122.31313,47.777570000000004],[-122.31314,47.777570000000004],[-122.313328,47.777570000000004],[-122.313422,47.777570000000004],[-122.31388,47.77758],[-122.31488,47.7776],[-122.31509,47.77761],[-122.31525,47.777619],[-122.31568,47.77762],[-122.31578999999999,47.77762],[-122.31665000000001,47.77762],[-122.31669000000001,47.77762],[-122.3168,47.77762],[-122.316887,47.77762],[-122.31709900000001,47.77762],[-122.31731,47.77762],[-122.31746000000001,47.77762],[-122.31756000000001,47.77762],[-122.31765000000001,47.77762],[-122.31781000000001,47.77762],[-122.31787,47.77762],[-122.31790000000001,47.77762],[-122.31796000000001,47.777622],[-122.318,47.777622],[-122.31826000000001,47.777623],[-122.31865,47.777625],[-122.31944,47.77763],[-122.31968,47.777631],[-122.32121000000001,47.77764],[-122.32128,47.77764],[-122.3214,47.77764],[-122.32185,47.77764],[-122.32229999999998,47.77765],[-122.32309,47.77765],[-122.324554,47.777663],[-122.32463,47.777663999999994],[-122.32469999999999,47.777665],[-122.32628,47.77769],[-122.32654,47.77768],[-122.3266,47.77768],[-122.32683999999999,47.777679],[-122.327304,47.77765],[-122.32694,47.77807000000001],[-122.32746999999999,47.778676000000004],[-122.32791,47.77919000000001],[-122.32797,47.77926],[-122.32802999999998,47.77933000000001],[-122.32858999999999,47.77998],[-122.32914,47.78062],[-122.32924,47.780743],[-122.32969,47.781259999999996],[-122.33028,47.78138],[-122.33072,47.78147],[-122.33116000000001,47.781703],[-122.331691,47.7822],[-122.33187099999999,47.78284],[-122.33183,47.78327],[-122.33165000000001,47.78354],[-122.331441,47.78372],[-122.33129300000002,47.78381],[-122.33116000000001,47.7839],[-122.33128,47.784150000000004],[-122.33142000000001,47.78447],[-122.33176,47.78522],[-122.33198,47.785700000000006],[-122.33243999999999,47.785700000000006],[-122.33341,47.78571000000001],[-122.33339,47.78589]],[[-122.29760400000002,47.77819500000001],[-122.29708000000001,47.77819500000001],[-122.29653,47.77819100000001],[-122.29654000000001,47.77839000000001],[-122.29712000000002,47.778400000000005],[-122.29760000000002,47.77840500000001],[-122.29760000000002,47.77833000000001],[-122.29760400000002,47.778225000000006],[-122.29760400000002,47.77819500000001]],[[-122.30372999999999,47.78053500000001],[-122.30335,47.780530000000006],[-122.30312,47.780530000000006],[-122.303,47.780525000000004],[-122.30301,47.78069],[-122.30301,47.78079],[-122.303007,47.78085],[-122.30315,47.78085],[-122.30372999999999,47.78086],[-122.30372999999999,47.780550000000005],[-122.30372999999999,47.78053500000001]],[[-122.29705000000001,47.781392000000004],[-122.29704000000001,47.781279999999995],[-122.29703,47.78106],[-122.29698,47.78105],[-122.29687,47.781042],[-122.29667,47.78104],[-122.29650400000001,47.78104],[-122.29649,47.781535000000005],[-122.29705000000001,47.78155],[-122.29705000000001,47.781392000000004]],[[-122.32994,47.794689],[-122.32936,47.794682],[-122.32894399999999,47.79468],[-122.32878999999998,47.79467],[-122.32878999999998,47.79478],[-122.32879999999999,47.79502000000001],[-122.32879999999999,47.795086000000005],[-122.32893999999999,47.79508800000001],[-122.32906999999999,47.79508800000001],[-122.32907999999999,47.795089000000004],[-122.32912999999999,47.79509000000001],[-122.32982999999999,47.79510000000001],[-122.32985,47.794961],[-122.32994,47.794689]]]},"name":"Mountlake Terrace"},{"boundary":{"type":"Polygon","coordinates":[[[-122.32606,47.454118],[-122.32547999999998,47.456089999999996],[-122.32525,47.45683999999999],[-122.32518999999999,47.45703999999999],[-122.32494,47.45784199999999],[-122.32486999999999,47.458079999999995],[-122.32476,47.458379],[-122.32465,47.45858],[-122.32456,47.45872],[-122.324484,47.458819999999996],[-122.324028,47.45935],[-122.32377999999999,47.459649999999996],[-122.32361,47.45985999999999],[-122.32354,47.46003],[-122.32346,47.460243],[-122.32341,47.460570000000004],[-122.32342,47.46097],[-122.32342,47.46185],[-122.32342999999999,47.46329],[-122.32343699999998,47.46459],[-122.32343999999999,47.465092000000006],[-122.32342999999999,47.466010000000004],[-122.32329,47.46603],[-122.32321,47.46607],[-122.323,47.46632],[-122.32234999999999,47.46692],[-122.31993,47.469156000000005],[-122.31991000000001,47.469170000000005],[-122.31982,47.46926],[-122.319722,47.469350000000006],[-122.31964,47.46943],[-122.31944,47.4696],[-122.31892,47.47009],[-122.3188,47.470202],[-122.31811,47.47083],[-122.31790000000001,47.471025],[-122.31764000000001,47.471259999999994],[-122.31624000000001,47.472590000000004],[-122.31603,47.47281],[-122.31587999999999,47.472975000000005],[-122.31573999999999,47.473197],[-122.31559,47.4735],[-122.31551,47.4737],[-122.3154,47.47416],[-122.31532999999999,47.474639999999994],[-122.31526600000001,47.475001],[-122.31521000000001,47.475356000000005],[-122.31516,47.47552],[-122.31512000000001,47.47576],[-122.31476,47.477726999999994],[-122.314407,47.47963],[-122.31409000000001,47.481339999999996],[-122.31375,47.48312],[-122.31358,47.484049999999996],[-122.313466,47.484649999999995],[-122.31338,47.48495],[-122.31316000000001,47.48555],[-122.31303,47.485836],[-122.31302000000001,47.485859999999995],[-122.3125,47.486836999999994],[-122.3122,47.48741],[-122.31201,47.487759999999994],[-122.31165000000001,47.488431],[-122.31158,47.488569],[-122.31136000000001,47.488572000000005],[-122.31063,47.48858],[-122.30870999999999,47.48861],[-122.30845,47.488611],[-122.30745,47.48862],[-122.30612,47.48864],[-122.304804,47.488659999999996],[-122.30357,47.48867],[-122.30342,47.488679999999995],[-122.30211,47.48869],[-122.29996000000001,47.488710000000005],[-122.29824,47.488730000000004],[-122.297431,47.488734],[-122.29723000000001,47.488730000000004],[-122.29718000000001,47.48862],[-122.29691000000001,47.48796399999999],[-122.29667300000001,47.48732],[-122.29643,47.486639999999994],[-122.29637,47.48649699999999],[-122.29629000000001,47.48625],[-122.29624000000001,47.486095],[-122.29613,47.485730000000004],[-122.29609,47.4856],[-122.29606000000001,47.485510000000005],[-122.29587,47.484899999999996],[-122.29566000000001,47.484199999999994],[-122.2954,47.48338],[-122.29528,47.48296],[-122.29514,47.48242],[-122.29497,47.481553],[-122.29471000000001,47.48031],[-122.29464000000002,47.480117],[-122.29445000000001,47.47976],[-122.29422000000002,47.47936],[-122.29343,47.477985999999994],[-122.29316000000001,47.477519],[-122.29171000000001,47.475397],[-122.29150000000001,47.47508],[-122.29100000000001,47.47434],[-122.28991500000001,47.472730000000006],[-122.289795,47.472530000000006],[-122.28976999999999,47.47247],[-122.2897,47.47225],[-122.28967,47.472120000000004],[-122.28965000000001,47.47205],[-122.28946,47.470639999999996],[-122.2894,47.470234],[-122.28919,47.4688],[-122.28909,47.46815600000001],[-122.28896,47.467452],[-122.2889,47.46724],[-122.28878999999999,47.46696],[-122.28811,47.46696],[-122.288506,47.466170000000005],[-122.28875,47.465700000000005],[-122.28882999999999,47.465540000000004],[-122.28902000000001,47.465140000000005],[-122.28944,47.464310000000005],[-122.28974,47.463730000000005],[-122.28976,47.46369],[-122.28983,47.463567],[-122.28989,47.46346],[-122.28997,47.463298],[-122.29016000000001,47.46294],[-122.29067,47.46201000000001],[-122.29090000000001,47.46153],[-122.29121000000002,47.460910000000005],[-122.29183,47.45965999999999],[-122.29173,47.45965999999999],[-122.29158100000001,47.459649999999996],[-122.29150000000001,47.459649999999996],[-122.289,47.459649999999996],[-122.28826000000001,47.459649999999996],[-122.28703,47.45963999999999],[-122.28672999999999,47.45963999999999],[-122.28658,47.459619999999994],[-122.28643799999999,47.459599999999995],[-122.28632999999999,47.459575],[-122.28617,47.459536],[-122.28604,47.459495],[-122.28595,47.459559999999996],[-122.28586,47.459599999999995],[-122.28577999999999,47.45963],[-122.28565,47.459649999999996],[-122.28327,47.45963999999999],[-122.28277999999999,47.459638],[-122.28216,47.45963999999999],[-122.28128000000001,47.459635],[-122.28118,47.45963999999999],[-122.28117,47.457939999999994],[-122.28117,47.457469999999994],[-122.28117,47.45706299999999],[-122.28118,47.456513],[-122.28119000000001,47.45643999999999],[-122.28119000000001,47.45637],[-122.28124000000001,47.456269999999996],[-122.27956,47.45627999999999],[-122.27892,47.45627999999999],[-122.27830999999999,47.45627999999999],[-122.27806,47.456269999999996],[-122.27748,47.456267999999994],[-122.277399,47.456269999999996],[-122.2771,47.45625999999999],[-122.27615,47.45625999999999],[-122.27525,47.45625999999999],[-122.274928,47.45625999999999],[-122.27444,47.456253999999994],[-122.27385,47.45625999999999],[-122.27349,47.45625999999999],[-122.27323,47.456253],[-122.27286999999998,47.456253999999994],[-122.27205,47.456255],[-122.27141,47.456253999999994],[-122.27132999999999,47.454499999999996],[-122.27051,47.454499999999996],[-122.26778,47.45448999999999],[-122.26780000000001,47.454179999999994],[-122.26781000000001,47.45392],[-122.26783,47.45233],[-122.26784,47.45225],[-122.26822000000001,47.45225],[-122.26891,47.452259],[-122.26889,47.45173],[-122.26793500000001,47.451719999999995],[-122.26791900000002,47.451132],[-122.26704000000001,47.45113],[-122.26702000000002,47.45062099999999],[-122.26701000000001,47.44993],[-122.26700000000001,47.449639999999995],[-122.26702000000002,47.44956],[-122.26709000000001,47.449419999999996],[-122.26714000000001,47.44934],[-122.26723000000001,47.44922],[-122.26726000000002,47.44918],[-122.26729500000002,47.449130000000004],[-122.26730300000001,47.449110000000005],[-122.26888,47.449130000000004],[-122.26886,47.447779999999995],[-122.26874,47.44779],[-122.26809,47.44779],[-122.26715000000002,47.447799999999994],[-122.26705000000001,47.447799999999994],[-122.26650000000001,47.44780299999999],[-122.26565000000001,47.44780899999999],[-122.26563,47.44780899999999],[-122.26507,47.44780599999999],[-122.26507,47.447542],[-122.26506,47.446999999999996],[-122.26512000000001,47.446819999999995],[-122.265319,47.44618],[-122.26562000000001,47.44511000000001],[-122.26668000000001,47.445121],[-122.26700000000001,47.443799999999996],[-122.26706000000001,47.44356],[-122.26581,47.44315],[-122.26558,47.44308699999999],[-122.2651,47.44294],[-122.26522900000002,47.43873000000001],[-122.26544,47.438431],[-122.26687,47.43775],[-122.26814,47.437148],[-122.26865000000001,47.43682],[-122.269367,47.43589],[-122.26943,47.43583],[-122.26957,47.435656],[-122.27005,47.43519200000001],[-122.27052,47.434689999999996],[-122.27089,47.4344],[-122.27096,47.433805],[-122.27105,47.432897],[-122.27085,47.432894],[-122.27025,47.43289],[-122.26993,47.432897],[-122.26968000000001,47.432900000000004],[-122.26969000000001,47.43283],[-122.26968000000001,47.43273000000001],[-122.26971,47.43253000000001],[-122.26969000000001,47.432327],[-122.26963,47.43207],[-122.26961000000001,47.4317],[-122.26963,47.431475],[-122.26964000000001,47.431425],[-122.26971,47.43127],[-122.26981,47.431154],[-122.26993,47.43109],[-122.27017,47.43103],[-122.27015,47.430930000000004],[-122.27019,47.43079],[-122.27029999999999,47.43068699999999],[-122.27036,47.430640999999994],[-122.27049,47.43054],[-122.27071,47.430383],[-122.27132999999999,47.42994],[-122.27251,47.429100000000005],[-122.27362000000001,47.42819000000001],[-122.27436,47.42758],[-122.27486,47.42716],[-122.27512,47.42691000000001],[-122.27532999999998,47.42667],[-122.27539999999999,47.42658],[-122.27574999999999,47.42684],[-122.27829,47.425070000000005],[-122.27846,47.425140000000006],[-122.28096000000001,47.423373000000005],[-122.28087,47.42331000000001],[-122.28120000000001,47.42309],[-122.28157,47.42282],[-122.28156000000001,47.422368000000006],[-122.28225400000001,47.42194],[-122.28237999999999,47.42185],[-122.28281,47.421503],[-122.28366000000001,47.422067],[-122.28417,47.42171200000001],[-122.28410600000001,47.4199],[-122.28408,47.41914],[-122.28225,47.419163],[-122.281451,47.41918],[-122.28076,47.419196],[-122.28086,47.41911],[-122.28095,47.41903],[-122.28111000000001,47.418839999999996],[-122.28125000000001,47.418651],[-122.28141000000001,47.41829],[-122.281496,47.418082],[-122.28179,47.41738699999999],[-122.28212,47.416602],[-122.28223,47.416354],[-122.28226000000001,47.41627999999999],[-122.28229,47.41607],[-122.28232999999999,47.4158],[-122.28236,47.415572000000004],[-122.28235,47.415517],[-122.28226000000001,47.41517],[-122.28215,47.414739999999995],[-122.28182000000001,47.4141],[-122.28154,47.41356],[-122.28098,47.41285],[-122.28093,47.412802],[-122.28082300000001,47.412718000000005],[-122.28081,47.4127],[-122.28093,47.412631],[-122.28099,47.41256],[-122.28101000000001,47.41247],[-122.28105000000001,47.412236],[-122.28105000000001,47.41216],[-122.28115000000001,47.411716],[-122.281316,47.41098099999999],[-122.28134,47.410758],[-122.28137,47.410371],[-122.28138,47.40925],[-122.28136,47.40894],[-122.28135,47.40886],[-122.281318,47.408761],[-122.28123000000001,47.408550000000005],[-122.28128000000001,47.408530000000006],[-122.28133,47.40851000000001],[-122.28136,47.40848],[-122.28138,47.40844],[-122.28138,47.4084],[-122.28137,47.40838],[-122.28163,47.40832],[-122.2818,47.40827],[-122.28187,47.40823],[-122.28198,47.40815200000001],[-122.28275,47.407502],[-122.28289,47.407392],[-122.28304,47.407301],[-122.28315,47.40724899999999],[-122.28331,47.40719],[-122.28346,47.407162],[-122.28355,47.40715],[-122.28376999999999,47.40714],[-122.28391,47.40714],[-122.28403,47.40716],[-122.28413,47.40718],[-122.28423000000001,47.407208],[-122.2844,47.40727],[-122.28446000000001,47.4073],[-122.28456000000001,47.40736],[-122.28463,47.40741],[-122.28475,47.407526999999995],[-122.28486000000001,47.40767999999999],[-122.28488,47.40771],[-122.28502,47.40792],[-122.285255,47.40826],[-122.28565,47.408254],[-122.28615,47.408249],[-122.286581,47.408243],[-122.28656000000001,47.40381],[-122.28656000000001,47.40374],[-122.28684,47.40373],[-122.28852,47.40367],[-122.28877999999999,47.403659999999995],[-122.288765,47.403459999999995],[-122.28875,47.40336],[-122.288714,47.403259],[-122.28846999999999,47.40291800000001],[-122.28846,47.40287],[-122.28847999999999,47.40284],[-122.28838999999999,47.402615000000004],[-122.28836999999999,47.40241],[-122.28833999999999,47.402131000000004],[-122.29009,47.402133000000006],[-122.29017,47.402141],[-122.29017,47.402100000000004],[-122.29017,47.40183],[-122.29018,47.40166299999999],[-122.29018,47.401316],[-122.29018,47.401019],[-122.29019000000001,47.400968],[-122.28655,47.40103],[-122.28563,47.40104699999999],[-122.28398,47.40107],[-122.28394,47.39925],[-122.28276999999999,47.39927],[-122.28276,47.39745],[-122.282945,47.397452],[-122.28347,47.397026],[-122.283466,47.396771],[-122.28412000000002,47.39664],[-122.28407,47.396556000000004],[-122.286568,47.39647],[-122.28655,47.39569],[-122.287315,47.395686],[-122.28732000000001,47.395848],[-122.289305,47.395810000000004],[-122.28934,47.39588],[-122.28993,47.395857],[-122.29027,47.395851],[-122.29035,47.396076],[-122.29132800000001,47.396065],[-122.29173,47.396065],[-122.29196000000002,47.39759],[-122.29208,47.39844],[-122.29225000000001,47.39959],[-122.292455,47.40094],[-122.29253,47.40145],[-122.29254,47.401605999999994],[-122.29256000000001,47.40177],[-122.29260000000001,47.402256],[-122.29266000000001,47.403568],[-122.29266000000001,47.40363],[-122.29266000000001,47.40376],[-122.29265000000001,47.404562],[-122.29265000000001,47.404588999999994],[-122.29261000000001,47.405283999999995],[-122.29255,47.405992000000005],[-122.29246,47.406645],[-122.29244,47.40687],[-122.292367,47.4073],[-122.29218300000001,47.408190000000005],[-122.29369000000001,47.408194],[-122.29452000000002,47.4082],[-122.29486000000001,47.408203],[-122.29518,47.408206],[-122.29602000000001,47.408210000000004],[-122.29657,47.408210000000004],[-122.29721000000002,47.40822],[-122.29813,47.40823],[-122.29821000000001,47.40823],[-122.29832,47.40823],[-122.29831,47.408390000000004],[-122.29803,47.410379999999996],[-122.29782900000002,47.41179999999999],[-122.30248999999999,47.41187999999999],[-122.30247999999999,47.413689999999995],[-122.30248999999999,47.41409899999999],[-122.3025,47.41493],[-122.30248999999999,47.41545],[-122.30248999999999,47.41552],[-122.302555,47.415527],[-122.30371,47.41554],[-122.30414,47.41554],[-122.30464,47.41554],[-122.30512999999999,47.41554],[-122.30604,47.415530000000004],[-122.30676999999999,47.415529],[-122.30711000000001,47.415527],[-122.30865,47.41552],[-122.3092,47.415510000000005],[-122.3093,47.415516000000004],[-122.30963799999999,47.41552],[-122.31048,47.415530000000004],[-122.31189,47.415561],[-122.312084,47.41556],[-122.31231,47.41554],[-122.31275,47.415530000000004],[-122.31309,47.41555],[-122.31389,47.41558],[-122.31444,47.4156],[-122.31557,47.41563],[-122.31659,47.41567],[-122.31821000000001,47.41575],[-122.31869,47.415773],[-122.31881,47.41578],[-122.318816,47.41585],[-122.31881,47.41599],[-122.31882999999999,47.416076999999994],[-122.3191,47.41607],[-122.320257,47.416038],[-122.32022,47.41617],[-122.32019,47.416349],[-122.32018,47.416489999999996],[-122.32016999999999,47.416802999999994],[-122.32019,47.41733],[-122.32022,47.41855],[-122.32022,47.41859],[-122.32024,47.41916],[-122.32025,47.419869999999996],[-122.32028,47.421116000000005],[-122.32029999999999,47.42163],[-122.32029,47.42184099999999],[-122.32027,47.421974],[-122.32019,47.422371000000005],[-122.32006,47.42293900000001],[-122.31983,47.423849],[-122.31978,47.424],[-122.31964,47.42439],[-122.31899,47.42589],[-122.31882999999999,47.42625],[-122.31852,47.426950000000005],[-122.31839,47.427337],[-122.31836,47.427478],[-122.31833999999999,47.42764],[-122.31831,47.42792],[-122.3183,47.42844],[-122.32006999999999,47.42846],[-122.321146,47.42848],[-122.32166000000001,47.428490000000004],[-122.32213099999998,47.42850000000001],[-122.32319,47.42851000000001],[-122.32491,47.42855000000001],[-122.32492,47.429002000000004],[-122.32493,47.429387],[-122.32494,47.42989],[-122.32496,47.43078],[-122.32497,47.43102],[-122.32497,47.43123],[-122.32489,47.43209],[-122.32485,47.432500000000005],[-122.32476999999999,47.4334],[-122.32467,47.434259999999995],[-122.32456,47.435566],[-122.32446999999999,47.436445],[-122.32445,47.43661],[-122.32439,47.437219999999996],[-122.32414,47.439710000000005],[-122.324107,47.43984],[-122.32409,47.43989],[-122.3236,47.43964],[-122.32279999999999,47.43922],[-122.32258999999999,47.439271],[-122.32252999999999,47.43929],[-122.32245999999999,47.43932],[-122.32242999999998,47.439357],[-122.32207999999999,47.4398],[-122.32173999999999,47.440177],[-122.32141,47.44058],[-122.32112000000001,47.44093],[-122.32099,47.4411],[-122.32087999999999,47.4413],[-122.32073999999999,47.44159],[-122.320662,47.441869999999994],[-122.32056,47.442383],[-122.32054,47.44247],[-122.3205,47.442862],[-122.3205,47.44301],[-122.3205,47.443059999999996],[-122.3205,47.443208],[-122.32054,47.44357],[-122.32055,47.44383],[-122.32056999999999,47.443943],[-122.32070999999999,47.444399999999995],[-122.32104,47.445190000000004],[-122.32111,47.445330000000006],[-122.321324,47.44574],[-122.32172,47.44647],[-122.32236999999998,47.447575],[-122.32318,47.448932000000006],[-122.32342799999999,47.44933],[-122.32451,47.45119999999999],[-122.32524,47.45243],[-122.32611,47.45392],[-122.32606,47.454118]]]},"name":"SeaTac"},{"boundary":{"type":"Polygon","coordinates":[[[-122.36246,47.450019999999995],[-122.36223,47.450019999999995],[-122.36205,47.45004399999999],[-122.36191000000001,47.45007999999999],[-122.36181,47.450136],[-122.36171,47.45019],[-122.36148,47.450356],[-122.36137,47.450419999999994],[-122.36125900000002,47.45045999999999],[-122.36118,47.45048599999999],[-122.36106000000001,47.4505],[-122.36067,47.450478],[-122.36055,47.45048799999999],[-122.36051,47.4505],[-122.36048,47.45051],[-122.36031,47.45056699999999],[-122.3602,47.45059],[-122.36004,47.45061],[-122.35978999999999,47.45062299999999],[-122.35906999999999,47.45063],[-122.35866,47.45063],[-122.35849999999999,47.45063],[-122.35846,47.45166999999999],[-122.35844999999999,47.45207],[-122.358449,47.452342],[-122.3579,47.452346],[-122.35544999999999,47.45237],[-122.35529999999999,47.452373],[-122.35502999999999,47.45238],[-122.35405,47.452391],[-122.35271999999999,47.452393],[-122.35166000000001,47.452399],[-122.35042999999999,47.452402],[-122.35005,47.45241],[-122.34836999999999,47.452428],[-122.34736000000001,47.452439999999996],[-122.34665000000001,47.452382],[-122.346396,47.452397],[-122.34609,47.45239],[-122.34561000000001,47.452386],[-122.34481000000001,47.45238],[-122.34462000000002,47.45237],[-122.34435,47.45237],[-122.34351600000001,47.45238],[-122.34209,47.45241],[-122.34101000000001,47.45242699999999],[-122.34100000000001,47.45242],[-122.34094,47.45239],[-122.3399,47.45239],[-122.33941,47.45238],[-122.33939,47.45292],[-122.33936999999999,47.453738],[-122.33933999999999,47.454829999999994],[-122.33931,47.455999999999996],[-122.33931,47.45607999999999],[-122.33760000000001,47.456089999999996],[-122.33645,47.456098999999995],[-122.33646,47.45635],[-122.33646999999999,47.457339],[-122.33388,47.457339],[-122.33388,47.45716699999999],[-122.333908,47.45541],[-122.33391,47.454750999999995],[-122.33391,47.454699999999995],[-122.33392,47.454215],[-122.33392,47.45381],[-122.33393,47.453289999999996],[-122.33393,47.452436],[-122.33393,47.452110000000005],[-122.33393,47.45105999999999],[-122.33394,47.450289999999995],[-122.33392,47.449679999999994],[-122.33397,47.44861],[-122.33396,47.447489999999995],[-122.33396,47.447449999999996],[-122.33396,47.445243],[-122.33398,47.444975],[-122.33401,47.44472],[-122.33408,47.444208999999994],[-122.33417,47.44354],[-122.33418,47.443439999999995],[-122.33442000000001,47.44163999999999],[-122.33451000000001,47.44096],[-122.33458,47.44045],[-122.33482000000001,47.43871000000001],[-122.334889,47.4382],[-122.33496000000001,47.43767],[-122.33512,47.43646],[-122.33512999999999,47.436350000000004],[-122.33519,47.43593800000001],[-122.335244,47.435550000000006],[-122.33532,47.434926],[-122.33534699999998,47.43467],[-122.33545,47.434146],[-122.33546999999999,47.433977],[-122.33551,47.433710000000005],[-122.33563,47.432750000000006],[-122.33578999999999,47.43155],[-122.33579999999999,47.43127],[-122.33579999999999,47.43113],[-122.33579999999999,47.431059999999995],[-122.33578999999999,47.430896999999995],[-122.33562,47.428630000000005],[-122.33559,47.428230000000006],[-122.33558,47.42803000000001],[-122.33556,47.4278],[-122.33552900000001,47.42732],[-122.33545,47.42634],[-122.33539199999998,47.4256],[-122.33536999999998,47.42531800000001],[-122.33536,47.42526],[-122.33534999999999,47.42517000000001],[-122.33529999999999,47.424510000000005],[-122.33526,47.42396],[-122.335212,47.42327],[-122.335204,47.42309],[-122.33524,47.421510000000005],[-122.33525,47.42109],[-122.33525300000001,47.420950000000005],[-122.33526,47.42046],[-122.33527,47.420183],[-122.33527,47.419819999999994],[-122.33527,47.41918],[-122.33527,47.418727],[-122.33527,47.41858],[-122.33527,47.417362999999995],[-122.33528,47.41659],[-122.33525,47.416039999999995],[-122.3352,47.41558],[-122.33481,47.413419999999995],[-122.33468,47.41273],[-122.33458,47.41217],[-122.33447,47.411579999999994],[-122.33441,47.41141999999999],[-122.334349,47.4113],[-122.33421000000001,47.411111],[-122.3341,47.41099],[-122.33403,47.410933],[-122.33361000000001,47.410639999999994],[-122.33352000000001,47.41057],[-122.33344,47.4105],[-122.33336999999999,47.41042099999999],[-122.33331,47.41034],[-122.33325,47.410259999999994],[-122.33321000000001,47.41017],[-122.33315,47.410015],[-122.33313,47.40992],[-122.33308,47.409648999999995],[-122.33291,47.40882],[-122.33286999999999,47.408730000000006],[-122.33282999999999,47.40866],[-122.33278199999998,47.40858],[-122.33268199999999,47.408462],[-122.3326,47.408390000000004],[-122.33251,47.40832],[-122.332422,47.40826],[-122.33241,47.408252000000005],[-122.33224,47.40816],[-122.33205099999999,47.40809],[-122.33185,47.408038000000005],[-122.33164000000001,47.408],[-122.331428,47.40799],[-122.33124000000001,47.40799],[-122.331,47.408027],[-122.33079,47.408072000000004],[-122.32976999999998,47.408324],[-122.32946999999999,47.408391],[-122.32929999999999,47.40844],[-122.32911,47.40847],[-122.32771,47.40856],[-122.3276,47.408570000000005],[-122.32753,47.408570000000005],[-122.32746,47.408570000000005],[-122.32725,47.408570000000005],[-122.32706,47.408570000000005],[-122.32691,47.408541],[-122.326893,47.40815200000001],[-122.32682,47.407948],[-122.32685,47.407669999999996],[-122.32708,47.40739],[-122.32743099999999,47.407301],[-122.32749,47.40728599999999],[-122.32748,47.40717],[-122.32742,47.40718],[-122.32741,47.40696],[-122.32826,47.406936],[-122.32822999999999,47.406388],[-122.32892,47.40637],[-122.32885999999999,47.405330000000006],[-122.32954799999999,47.40531000000001],[-122.32951,47.40455],[-122.32951,47.40439],[-122.32968,47.404388],[-122.33065,47.404379999999996],[-122.33097,47.40477],[-122.33136,47.404619999999994],[-122.33141,47.40461],[-122.33157,47.404556],[-122.33171,47.404959999999996],[-122.33173,47.40502],[-122.3319,47.405190000000005],[-122.33233999999999,47.40561],[-122.33369,47.40692],[-122.33523,47.408421],[-122.3365,47.409164],[-122.34026000000001,47.411359999999995],[-122.34349,47.413256999999994],[-122.34663,47.415099],[-122.34789,47.415839999999996],[-122.34803,47.415921],[-122.34892,47.41793],[-122.34952000000001,47.419373],[-122.349835,47.420120000000004],[-122.35072999999998,47.42322],[-122.35145,47.426770000000005],[-122.35195,47.429190000000006],[-122.35237999999998,47.43131],[-122.35323,47.435520000000004],[-122.3543,47.43912],[-122.35436999999999,47.43934],[-122.35512999999999,47.441919999999996],[-122.35585999999999,47.442302000000005],[-122.35704,47.44292],[-122.35837999999998,47.44356],[-122.35933999999999,47.44402699999999],[-122.36184,47.44522],[-122.36015,47.44518],[-122.35934999999999,47.445163],[-122.35745,47.445150000000005],[-122.35621,47.445114000000004],[-122.35619,47.445121],[-122.35589999999999,47.44511000000001],[-122.35571999999999,47.44512],[-122.35566999999999,47.445201],[-122.35566999999999,47.44522],[-122.35565,47.445370000000004],[-122.355644,47.44547],[-122.35556999999999,47.445555000000006],[-122.35555,47.446239999999996],[-122.35552,47.447089999999996],[-122.35548999999999,47.447869999999995],[-122.35548999999999,47.44796899999999],[-122.35544999999999,47.44883],[-122.35556999999999,47.448834],[-122.35567999999999,47.448479999999996],[-122.35595099999999,47.44839],[-122.35665,47.448310000000006],[-122.35665,47.44874],[-122.35919,47.44874],[-122.36134,47.44874],[-122.36213,47.449614],[-122.36232999999999,47.449614],[-122.36246,47.450019999999995]]]},"name":"Normandy Park"},{"boundary":{"type":"Polygon","coordinates":[[[-122.33776,47.831540999999994],[-122.33760000000001,47.831489999999995],[-122.337489,47.831469999999996],[-122.33718,47.83140099999999],[-122.33685799999999,47.83134],[-122.33676,47.831308],[-122.33668,47.831289999999996],[-122.3365,47.831253999999994],[-122.33641,47.83123],[-122.33621000000001,47.831179999999996],[-122.33609,47.83116],[-122.33595,47.83115],[-122.33586,47.831143],[-122.33556,47.831139],[-122.3355,47.83114],[-122.335443,47.83114],[-122.33518,47.83114],[-122.33512999999999,47.83114],[-122.33481,47.83113],[-122.3345,47.83107999999999],[-122.33429000000001,47.83103],[-122.33418,47.83101],[-122.334,47.83095],[-122.3339,47.830912000000005],[-122.333769,47.83085],[-122.33322000000001,47.83058],[-122.33297199999998,47.83045],[-122.33283999999999,47.8304],[-122.33274999999999,47.83036],[-122.33266,47.830330000000004],[-122.33242,47.830276],[-122.33232999999998,47.83026699999999],[-122.33223,47.830258],[-122.33212999999999,47.830258],[-122.33202999999999,47.830265],[-122.33195,47.83027],[-122.33186,47.83029],[-122.331799,47.8303],[-122.33163,47.83034],[-122.33161300000002,47.830345],[-122.33155000000001,47.83036],[-122.33153,47.83037],[-122.33145,47.830402],[-122.331351,47.83044099999999],[-122.33120600000001,47.830510000000004],[-122.33115000000001,47.83055],[-122.33106000000001,47.83061],[-122.33104,47.830619999999996],[-122.33095,47.830690999999995],[-122.33094,47.830706],[-122.33081,47.830839999999995],[-122.33068,47.83099],[-122.33059,47.831087999999994],[-122.33042,47.83132],[-122.33024,47.831559999999996],[-122.32997999999999,47.831919],[-122.32963,47.83238],[-122.32941,47.832653],[-122.329227,47.83285],[-122.32912999999999,47.832950000000004],[-122.32902999999999,47.83305],[-122.32869,47.83335],[-122.32857999999999,47.833439999999996],[-122.32852999999999,47.833479999999994],[-122.32829,47.83367],[-122.32802,47.83385],[-122.32796,47.83389],[-122.32785,47.83396],[-122.32762000000001,47.83411],[-122.32728,47.83429699999999],[-122.32725,47.83431],[-122.32697999999999,47.83445],[-122.32652,47.8347],[-122.32618,47.83487999999999],[-122.32616,47.8349],[-122.32588999999999,47.83505],[-122.32566,47.83522],[-122.32556,47.835300000000004],[-122.325514,47.835342000000004],[-122.32539999999999,47.835474],[-122.32529,47.83561],[-122.32516999999999,47.83583],[-122.32513999999999,47.835937],[-122.32512999999999,47.83597],[-122.32508999999999,47.836259999999996],[-122.32507999999999,47.836368],[-122.32506999999998,47.83665],[-122.32502999999998,47.837162],[-122.32500499999999,47.837455],[-122.32499999999999,47.83752],[-122.32498,47.83767999999999],[-122.324968,47.837979999999995],[-122.3249,47.83879],[-122.32487799999998,47.83896],[-122.32482999999999,47.839237],[-122.32464,47.839633],[-122.32454,47.83979],[-122.32425,47.840272],[-122.32403,47.84062899999999],[-122.32394,47.84080099999999],[-122.323924,47.840819999999994],[-122.32388999999999,47.84088899999999],[-122.32386999999999,47.84091],[-122.32377999999999,47.84105999999999],[-122.32369,47.84119999999999],[-122.32359,47.841319999999996],[-122.32354,47.841379999999994],[-122.32343699999998,47.841469999999994],[-122.32329999999999,47.84159],[-122.32306999999999,47.841792],[-122.32301,47.84184199999999],[-122.32292,47.84193],[-122.32279999999999,47.84205],[-122.32217899999999,47.842639999999996],[-122.32206999999998,47.842742],[-122.3219,47.8429],[-122.32163,47.84314],[-122.321495,47.843239999999994],[-122.32146999999999,47.843256999999994],[-122.32135,47.84333],[-122.32121000000001,47.843399999999995],[-122.32100799999999,47.843489999999996],[-122.32066999999999,47.843619999999994],[-122.32043999999999,47.84371],[-122.32028,47.84379],[-122.3202,47.84383],[-122.32006999999999,47.843914],[-122.32005,47.84393],[-122.31991000000001,47.844035],[-122.31983,47.8441],[-122.31968,47.844269999999995],[-122.31967,47.844289999999994],[-122.31962800000001,47.84435],[-122.31961500000001,47.844379999999994],[-122.31948,47.84459],[-122.31936,47.844759999999994],[-122.31967,47.844739999999994],[-122.32006,47.84475],[-122.32117,47.84475],[-122.32376999999998,47.84473],[-122.32485,47.844728999999994],[-122.32493,47.844742999999994],[-122.32524,47.844753999999995],[-122.32571999999999,47.84477],[-122.32646,47.844789999999996],[-122.32798,47.844832],[-122.328694,47.84483999999999],[-122.33044,47.84487999999999],[-122.33044,47.84516],[-122.33041,47.84647999999999],[-122.33041,47.84654],[-122.33048,47.84692],[-122.33046999999999,47.84715],[-122.33048,47.847289999999994],[-122.33046,47.84753],[-122.33049,47.847669999999994],[-122.33046999999999,47.847739999999995],[-122.33046999999999,47.847804999999994],[-122.33046999999999,47.847919999999995],[-122.33046999999999,47.84793],[-122.33046999999999,47.84797],[-122.33046999999999,47.84797999999999],[-122.33046999999999,47.848],[-122.33046999999999,47.848079999999996],[-122.33046999999999,47.848109],[-122.33046999999999,47.848279999999995],[-122.33046999999999,47.848372000000005],[-122.32766000000001,47.84834],[-122.32763,47.84923],[-122.32759,47.84985999999999],[-122.32758,47.84983],[-122.32756,47.84977],[-122.32755,47.84975],[-122.32754,47.84972],[-122.32751,47.849669999999996],[-122.32749,47.849633],[-122.32746999999999,47.849599999999995],[-122.32742,47.84954],[-122.32735,47.849489999999996],[-122.32726000000001,47.849439999999994],[-122.32717099999999,47.849399999999996],[-122.32706999999999,47.849379],[-122.32684799999998,47.849329],[-122.32663,47.84927999999999],[-122.32632999999998,47.849219999999995],[-122.32623,47.849193],[-122.32587999999998,47.84912],[-122.32580999999999,47.84911],[-122.32554999999999,47.849059999999994],[-122.32540999999999,47.849025],[-122.32513999999999,47.848966999999995],[-122.32497,47.848943],[-122.32482999999999,47.84892],[-122.32482,47.8491],[-122.3248,47.849619999999994],[-122.3248,47.84979],[-122.32479,47.849869999999996],[-122.32477999999999,47.850089999999994],[-122.32477999999999,47.850159999999995],[-122.32479,47.85021],[-122.32479,47.850339999999996],[-122.3248,47.85039],[-122.3248,47.85048999999999],[-122.32481,47.85059999999999],[-122.32482,47.850789999999996],[-122.324833,47.85089399999999],[-122.32484,47.850939999999994],[-122.32485,47.85108999999999],[-122.32485,47.85114299999999],[-122.32486,47.85123299999999],[-122.32488,47.85133999999999],[-122.32489,47.85150399999999],[-122.3249,47.851589999999995],[-122.32492,47.85184799999999],[-122.32492,47.85192099999999],[-122.32202,47.851989999999994],[-122.32217999999999,47.853829999999995],[-122.31976,47.853829999999995],[-122.31854,47.853838999999994],[-122.31552,47.85386999999999],[-122.31552,47.853899999999996],[-122.31441000000001,47.85391],[-122.31441600000001,47.853899999999996],[-122.31435,47.853899999999996],[-122.31435,47.853719999999996],[-122.31435,47.853469999999994],[-122.31435,47.85312],[-122.31434,47.85193399999999],[-122.3143,47.85193399999999],[-122.31429000000001,47.85171999999999],[-122.31429000000001,47.850752],[-122.31428500000001,47.850339999999996],[-122.31428000000001,47.85021999999999],[-122.31351000000001,47.85021],[-122.31171,47.850192],[-122.3117,47.850319999999996],[-122.31141000000001,47.850316],[-122.31111000000001,47.85036099999999],[-122.30902,47.85031],[-122.30904,47.849219999999995],[-122.30902999999999,47.84914],[-122.30902999999999,47.84901],[-122.30902999999999,47.84875],[-122.30904,47.84868099999999],[-122.30904,47.84865],[-122.30904,47.848551],[-122.30904,47.84852],[-122.30904,47.8484],[-122.30633999999999,47.84841],[-122.303627,47.8484],[-122.30352,47.8484],[-122.30352,47.84843],[-122.29812000000001,47.84839],[-122.29811400000001,47.848279999999995],[-122.29811000000001,47.848150000000004],[-122.298106,47.84794599999999],[-122.29809,47.847559999999994],[-122.29808,47.84743099999999],[-122.29808,47.84739999999999],[-122.29808,47.847319999999996],[-122.29808,47.84724299999999],[-122.29618900000001,47.84724799999999],[-122.29578,47.84724899999999],[-122.29542000000001,47.84779999999999],[-122.29493000000001,47.847812],[-122.29439,47.84781999999999],[-122.29351000000001,47.850089999999994],[-122.29346000000001,47.850179999999995],[-122.29343,47.850249999999996],[-122.29317,47.85031],[-122.29312000000002,47.850319999999996],[-122.29294,47.850359999999995],[-122.29288,47.850320999999994],[-122.29271,47.85023399999999],[-122.29232999999999,47.85003],[-122.29221000000001,47.849968999999994],[-122.29245,47.849779999999996],[-122.29245,47.8493],[-122.29086000000001,47.849725],[-122.29056600000001,47.849799999999995],[-122.29046000000001,47.84983],[-122.29037,47.849869999999996],[-122.29027,47.84991],[-122.29004,47.85003999999999],[-122.28935,47.850429999999996],[-122.28895,47.85065999999999],[-122.28887999999999,47.850699999999996],[-122.28876999999999,47.85075],[-122.28872999999999,47.85076699999999],[-122.28864,47.85079699999999],[-122.28853,47.850829999999995],[-122.28801,47.85098099999999],[-122.28774,47.851029999999994],[-122.287476,47.850899999999996],[-122.28731,47.850809999999996],[-122.28721000000002,47.850756],[-122.28710600000001,47.850699999999996],[-122.28675,47.85049399999999],[-122.28678,47.85043999999999],[-122.28655,47.850339999999996],[-122.28646,47.8503],[-122.28620000000001,47.85021],[-122.28612000000001,47.850179999999995],[-122.28586999999999,47.850179999999995],[-122.28524,47.85019],[-122.28488,47.85019],[-122.2847,47.850179999999995],[-122.28471,47.850049999999996],[-122.28474,47.84985999999999],[-122.28475,47.849819999999994],[-122.28478,47.849596],[-122.28481000000001,47.849399999999996],[-122.28485,47.849219999999995],[-122.28486000000001,47.84913],[-122.28410000000001,47.84913],[-122.28304,47.84913],[-122.28189,47.84914],[-122.28190000000001,47.848910000000004],[-122.28190000000001,47.848879999999994],[-122.28190000000001,47.84881],[-122.28190000000001,47.84878],[-122.28189,47.84856],[-122.28188,47.84805],[-122.28188,47.84791],[-122.28189,47.84768999999999],[-122.28165000000001,47.847699999999996],[-122.28154,47.847699999999996],[-122.28143,47.847699999999996],[-122.28122400000002,47.84767999999999],[-122.28106000000001,47.84768399999999],[-122.28095,47.84767599999999],[-122.28085,47.84765999999999],[-122.28075,47.84761999999999],[-122.28067,47.847579999999994],[-122.28062000000001,47.847539999999995],[-122.28054,47.84748999999999],[-122.28045,47.847449999999995],[-122.28038,47.84743999999999],[-122.28025000000001,47.84742599999999],[-122.28020000000001,47.84742599999999],[-122.27971,47.847429999999996],[-122.27932999999999,47.84741999999999],[-122.27906999999999,47.847424999999994],[-122.27896,47.84742099999999],[-122.27793,47.847429999999996],[-122.27788,47.847427999999994],[-122.27782,47.847429999999996],[-122.27774,47.84743099999999],[-122.27758,47.847429999999996],[-122.277588,47.847542999999995],[-122.27736999999999,47.84754399999999],[-122.27736999999999,47.847089999999994],[-122.27656,47.84653],[-122.276468,47.846526999999995],[-122.27495,47.84653],[-122.27495,47.84639],[-122.27507999999999,47.84639],[-122.27506,47.845710000000004],[-122.27506,47.84565],[-122.27506,47.8456],[-122.27506,47.84486399999999],[-122.27499,47.84486499999999],[-122.27484,47.84486999999999],[-122.274843,47.84459699999999],[-122.27484,47.844139999999996],[-122.2748,47.84307999999999],[-122.27457,47.84307999999999],[-122.27453,47.84277],[-122.27447,47.84234],[-122.27439,47.84212],[-122.27425000000001,47.84173],[-122.27406,47.84122899999999],[-122.27383999999999,47.84081],[-122.27385,47.84049699999999],[-122.27383999999999,47.84026899999999],[-122.27383999999999,47.84012],[-122.27383999999999,47.839999999999996],[-122.27383999999999,47.83992],[-122.27385,47.83929],[-122.2741,47.838879],[-122.273682,47.83806],[-122.27327,47.837661999999995],[-122.273196,47.837378],[-122.27299599999999,47.83665],[-122.27266,47.83676],[-122.27230999999999,47.836879999999994],[-122.27247999999999,47.83717],[-122.27262400000001,47.83753],[-122.27229,47.83767999999999],[-122.27134,47.83717],[-122.271292,47.83713],[-122.27086999999999,47.83685],[-122.27082,47.83680699999999],[-122.27072999999999,47.83672],[-122.27029999999999,47.836332000000006],[-122.27016,47.836202],[-122.27006,47.836116000000004],[-122.26977,47.83586],[-122.26967,47.835770000000004],[-122.26945,47.835636],[-122.2693,47.83554],[-122.26819,47.83483999999999],[-122.26782000000001,47.834599999999995],[-122.2677,47.834560999999994],[-122.26755000000001,47.83447999999999],[-122.26736000000001,47.83436],[-122.26616000000001,47.833619999999996],[-122.26512000000001,47.83297],[-122.26467000000001,47.83268699999999],[-122.26424000000002,47.832139000000005],[-122.26427000000001,47.831619999999994],[-122.26432000000001,47.83098],[-122.26519,47.830304],[-122.26624000000001,47.828990000000005],[-122.26666000000002,47.82848],[-122.26687,47.828210000000006],[-122.26699,47.828030000000005],[-122.26794000000001,47.82752],[-122.26807,47.827448],[-122.26838,47.82729],[-122.26836999999999,47.826923],[-122.26836,47.826501],[-122.26835,47.82574],[-122.26832,47.824459999999995],[-122.26835,47.824458],[-122.268324,47.82389],[-122.26832999999999,47.823543],[-122.26835,47.823543],[-122.26835,47.82262],[-122.26819,47.822614],[-122.26702000000002,47.822601],[-122.26702000000002,47.822164],[-122.26702700000001,47.822036000000004],[-122.267031,47.82135],[-122.26703,47.821303],[-122.26657,47.82129],[-122.26572999999999,47.82127],[-122.26572999999999,47.82123],[-122.26573099999999,47.821219],[-122.26572,47.82087],[-122.26572,47.820750000000004],[-122.2651,47.820729],[-122.26502,47.820730000000005],[-122.26494000000001,47.820727],[-122.26479,47.820730000000005],[-122.26447,47.82072],[-122.26423000000001,47.82072],[-122.26389,47.820710000000005],[-122.26294,47.820695],[-122.2627,47.820692],[-122.26251,47.82068399999999],[-122.2625,47.82041],[-122.262492,47.82007],[-122.26190000000001,47.82005],[-122.26187300000001,47.81883],[-122.26207,47.818833],[-122.26232,47.818839999999994],[-122.26304,47.81885],[-122.263031,47.817969999999995],[-122.26325000000001,47.817949999999996],[-122.26373,47.81795999999999],[-122.26411000000002,47.817972],[-122.26463000000001,47.81797999999999],[-122.26489000000001,47.817989999999995],[-122.26522000000001,47.817989999999995],[-122.26547,47.818],[-122.26571,47.817995999999994],[-122.26571,47.818059999999996],[-122.26572,47.818259999999995],[-122.26572,47.81833],[-122.26572,47.81835],[-122.26572,47.8184],[-122.26572,47.818419999999996],[-122.26572,47.81859],[-122.26572,47.81911],[-122.26572999999999,47.81927999999999],[-122.26573099999999,47.81945999999999],[-122.26574,47.81981],[-122.26677,47.819849999999995],[-122.26698,47.819849999999995],[-122.26785000000001,47.819872999999994],[-122.26835,47.819889999999994],[-122.269102,47.81991],[-122.27091,47.81995],[-122.27089,47.81983099999999],[-122.270879,47.81963],[-122.27087999999999,47.819531],[-122.27086999999999,47.819419999999994],[-122.27087999999999,47.819019999999995],[-122.27085,47.81903],[-122.27085,47.818963999999994],[-122.2709,47.818963999999994],[-122.27102000000001,47.818956],[-122.27199,47.81896],[-122.27215,47.81887],[-122.27216,47.818690999999994],[-122.27216999999999,47.818391],[-122.27226,47.818391],[-122.27256999999999,47.81839],[-122.27279999999999,47.818394],[-122.27302999999999,47.8184],[-122.27361,47.81841],[-122.27438,47.818419999999996],[-122.27485,47.818431],[-122.27484,47.81722599999999],[-122.27537999999998,47.817229999999995],[-122.27591,47.817229999999995],[-122.27591,47.817355],[-122.27619,47.81741999999999],[-122.27631,47.81755999999999],[-122.27685699999999,47.81756299999999],[-122.27686,47.81741999999999],[-122.27725000000001,47.81741999999999],[-122.27816999999999,47.81741999999999],[-122.278262,47.817449999999994],[-122.27835999999999,47.817486999999986],[-122.27879999999999,47.81785999999999],[-122.27923,47.81823],[-122.27931,47.818301],[-122.27937999999999,47.818259999999995],[-122.2803,47.81905999999999],[-122.28053,47.81922699999999],[-122.28079,47.819267999999994],[-122.28081,47.819269999999996],[-122.28116600000001,47.819199999999995],[-122.28149,47.81905999999999],[-122.28164000000001,47.819008],[-122.28183,47.81895],[-122.28202,47.81881],[-122.28276999999999,47.818239999999996],[-122.28371,47.81783999999999],[-122.283785,47.817809999999994],[-122.28451000000001,47.81741999999999],[-122.28404,47.81701999999999],[-122.28352000000001,47.816579999999995],[-122.28313,47.81625],[-122.28343,47.816089999999996],[-122.28371,47.81594],[-122.28423000000001,47.815656999999995],[-122.28472500000001,47.815396],[-122.2847,47.81362699999999],[-122.284817,47.813629999999996],[-122.28528,47.81363999999999],[-122.28546999999999,47.81363999999999],[-122.28571,47.81365999999999],[-122.28614,47.81367399999999],[-122.286246,47.813669999999995],[-122.28693,47.81368299999999],[-122.2885,47.81367999999999],[-122.28856999999999,47.81367999999999],[-122.28934,47.813689999999994],[-122.2897,47.8137],[-122.289712,47.8137],[-122.29029000000001,47.8137],[-122.29083,47.8137],[-122.29087,47.8137],[-122.29098,47.813689999999994],[-122.29120000000002,47.81365999999999],[-122.29148,47.81353],[-122.29155000000002,47.81347999999999],[-122.29161000000002,47.81343999999999],[-122.29167000000001,47.813379999999995],[-122.29174,47.813281999999994],[-122.29178,47.813179999999996],[-122.29180000000001,47.813039999999994],[-122.29180000000001,47.812928],[-122.29178,47.812719],[-122.291774,47.81257],[-122.29180000000001,47.81251],[-122.29185000000001,47.81246599999999],[-122.29189000000001,47.81245],[-122.29191000000002,47.812439999999995],[-122.29200300000001,47.81241],[-122.29212000000001,47.8124],[-122.29227,47.81243],[-122.29228,47.8123],[-122.2923,47.81212],[-122.292314,47.812039999999996],[-122.29232999999999,47.81193699999999],[-122.29232999999999,47.81191],[-122.29232999999999,47.81185999999999],[-122.29232999999999,47.81177999999999],[-122.29232999999999,47.81175699999999],[-122.29232999999999,47.81168999999999],[-122.29232999999999,47.811671999999994],[-122.29232,47.81147999999999],[-122.29232999999999,47.81134099999999],[-122.29232999999999,47.81124199999999],[-122.29232,47.810629999999996],[-122.29232,47.81035],[-122.29232,47.810019999999994],[-122.29229000000001,47.809659999999994],[-122.29224,47.80918],[-122.29226000000001,47.80859],[-122.29227,47.80824],[-122.29231,47.8082],[-122.29231,47.807849999999995],[-122.29232,47.80735],[-122.29234,47.80681],[-122.29234,47.80679],[-122.29234,47.806436],[-122.29247,47.806436],[-122.29289,47.806439],[-122.29303,47.806439999999995],[-122.29344400000001,47.806442],[-122.2947,47.80645],[-122.29488,47.80645],[-122.29493000000001,47.80645],[-122.29512000000001,47.806459999999994],[-122.29557,47.806472],[-122.29565000000001,47.80647999999999],[-122.29593,47.80649],[-122.29690000000001,47.80649],[-122.29726000000002,47.80649],[-122.29743,47.8065],[-122.29779300000001,47.80649],[-122.29820000000001,47.80649],[-122.298688,47.8065],[-122.29921000000002,47.80648699999999],[-122.29943,47.80649],[-122.29984,47.80649],[-122.29996000000001,47.80649],[-122.30031,47.8065],[-122.30042999999999,47.8065],[-122.30054,47.8065],[-122.30089,47.8065],[-122.30101,47.8065],[-122.30145,47.80651],[-122.30148,47.80651],[-122.30276999999998,47.806529],[-122.30321,47.80654],[-122.30366000000001,47.80653],[-122.30475,47.80654],[-122.30526,47.80654],[-122.30559,47.80654],[-122.30579699999998,47.80653],[-122.30654,47.80655],[-122.30753,47.80656],[-122.30822,47.806562],[-122.30852,47.80658],[-122.30893999999999,47.80659],[-122.30925,47.80663],[-122.30968,47.80671],[-122.31018,47.80686299999999],[-122.31044,47.806959],[-122.31082,47.80709699999999],[-122.31107,47.807178],[-122.31132000000001,47.80723],[-122.31139,47.80723999999999],[-122.31146000000001,47.807249999999996],[-122.31169000000001,47.80727999999999],[-122.31176,47.807289999999995],[-122.31209,47.80727999999999],[-122.31231,47.807255],[-122.3124,47.807244999999995],[-122.31256,47.807219999999994],[-122.31271,47.80718099999999],[-122.31286,47.80714],[-122.313,47.807089999999995],[-122.3134,47.80693],[-122.31364,47.80685],[-122.31385,47.806776],[-122.31399,47.806737],[-122.31414000000001,47.80671],[-122.31439,47.80667],[-122.31466000000002,47.806653],[-122.31486000000001,47.80665],[-122.31514,47.806656],[-122.3153,47.806658],[-122.31536999999999,47.806659999999994],[-122.31566600000001,47.80666399999999],[-122.31595,47.80667],[-122.31629000000001,47.80667],[-122.316793,47.80667999999999],[-122.31683,47.80667999999999],[-122.31708,47.80667999999999],[-122.31741000000001,47.80655],[-122.31842,47.80615],[-122.31876,47.80601],[-122.31939,47.80577],[-122.32129,47.805051],[-122.32192,47.804809999999996],[-122.322224,47.8047],[-122.32312999999999,47.80437],[-122.32342999999999,47.80425999999999],[-122.323662,47.80418399999999],[-122.32435,47.80395],[-122.32458,47.803869999999996],[-122.32486999999999,47.80373],[-122.32574999999999,47.80332],[-122.32603999999999,47.803188],[-122.32657999999999,47.80299],[-122.3282,47.802412000000004],[-122.32874099999998,47.80222],[-122.32887999999998,47.80207],[-122.32956,47.802274],[-122.32972999999998,47.80232],[-122.32986999999999,47.80237],[-122.32972999999998,47.802578000000004],[-122.32982999999999,47.80279],[-122.32926,47.80321],[-122.32909,47.803459999999994],[-122.32873999999998,47.80394],[-122.32717,47.80612],[-122.32665,47.806839999999994],[-122.326454,47.80712],[-122.326,47.80775],[-122.32585999999999,47.807939999999995],[-122.32566,47.808215000000004],[-122.32552999999999,47.808398000000004],[-122.32643999999999,47.80843],[-122.32643999999999,47.80912],[-122.32645,47.809419999999996],[-122.32669,47.809418],[-122.32716,47.809419],[-122.32745,47.809439999999995],[-122.32745,47.809239999999996],[-122.32744,47.80914],[-122.32744,47.80905],[-122.32742999999999,47.80878],[-122.32742999999999,47.80869],[-122.32762000000001,47.808688999999994],[-122.32800999999999,47.808685],[-122.32818999999999,47.80869],[-122.32828699999999,47.80869],[-122.32837999999998,47.808695],[-122.32845999999999,47.808695],[-122.32866999999999,47.808696],[-122.32874999999999,47.8087],[-122.32878399999998,47.80936],[-122.32879999999999,47.80959],[-122.32885999999999,47.80959],[-122.32922,47.809593],[-122.32922,47.80968599999999],[-122.32926,47.810539999999996],[-122.32934999999999,47.810539999999996],[-122.32961,47.810539999999996],[-122.32986999999999,47.810539999999996],[-122.329955,47.810539999999996],[-122.33021000000001,47.81053],[-122.33039,47.810539999999996],[-122.33045,47.810539999999996],[-122.33117,47.810545],[-122.33141,47.81054699999999],[-122.33159,47.81055],[-122.33212999999999,47.810555],[-122.33229999999999,47.810559999999995],[-122.33245,47.810558],[-122.33286999999999,47.81056099999999],[-122.33301,47.810562],[-122.33357,47.810562],[-122.333912,47.810559999999995],[-122.33426000000001,47.81057],[-122.33481,47.810579999999995],[-122.33518,47.81057],[-122.33523,47.81057],[-122.33578999999999,47.81057],[-122.33578999999999,47.81093],[-122.33578999999999,47.811152],[-122.33578999999999,47.811418999999994],[-122.33579999999999,47.81163299999999],[-122.33579999999999,47.812],[-122.33579999999999,47.812365],[-122.33581,47.81265],[-122.33581,47.81274],[-122.33581,47.813179999999996],[-122.33582,47.81353],[-122.335822,47.813869999999994],[-122.33582,47.814249999999994],[-122.33582,47.81435999999999],[-122.33582,47.81439999999999],[-122.33582999999999,47.814699999999995],[-122.33583999999999,47.814809999999994],[-122.33583999999999,47.81501],[-122.33585,47.815599999999996],[-122.33585,47.815799999999996],[-122.33585,47.815836],[-122.33585,47.81595],[-122.33585,47.81599],[-122.33585,47.81603],[-122.33585,47.816145],[-122.33585,47.816179999999996],[-122.33585,47.81634],[-122.33583999999999,47.816689999999994],[-122.33585,47.81681999999999],[-122.33586,47.816979999999994],[-122.33586,47.81704499999999],[-122.33586,47.81722599999999],[-122.33586,47.81728999999999],[-122.33586,47.81739699999999],[-122.33586999999999,47.81773],[-122.33586999999999,47.81783999999999],[-122.33586,47.81788999999999],[-122.33586,47.81807],[-122.33585,47.818130000000004],[-122.33586,47.81825],[-122.33586999999999,47.81861],[-122.33587999999999,47.81873],[-122.33613,47.81873],[-122.33633999999999,47.818734],[-122.33686,47.81873],[-122.33689,47.81873],[-122.33714,47.818734],[-122.33714,47.81963],[-122.33723,47.81963],[-122.33725000000001,47.821110000000004],[-122.33725000000001,47.82134],[-122.33729000000001,47.821472],[-122.33729000000001,47.82181],[-122.3359,47.821799999999996],[-122.3359,47.82185],[-122.3359,47.822072000000006],[-122.3359,47.82215000000001],[-122.33588999999999,47.82228],[-122.3359,47.82245],[-122.3359,47.822694],[-122.3359,47.82283],[-122.3359,47.823],[-122.3359,47.82305],[-122.3359,47.82349],[-122.3359,47.82366],[-122.3359,47.82396],[-122.3359,47.824],[-122.3359,47.82487],[-122.3359,47.825026],[-122.3359,47.82518],[-122.3359,47.8254],[-122.33591,47.82578],[-122.335912,47.82585],[-122.33592999999999,47.82592],[-122.33597999999999,47.82604],[-122.33599,47.82606],[-122.33605,47.826170000000005],[-122.3361,47.82625],[-122.33639,47.826496],[-122.3368,47.82677],[-122.33694,47.826859999999996],[-122.33711000000001,47.827],[-122.33717,47.82705],[-122.33724000000001,47.827101],[-122.33741,47.827296999999994],[-122.33749,47.82743],[-122.33759,47.82766099999999],[-122.33761200000001,47.82776],[-122.33765000000001,47.828100000000006],[-122.33769000000001,47.828450000000004],[-122.337711,47.82870200000001],[-122.337719,47.828798000000006],[-122.33773,47.829059],[-122.33773,47.829150000000006],[-122.33773,47.82932],[-122.33773,47.829934],[-122.33773,47.83002],[-122.33774,47.8301],[-122.33774,47.830255],[-122.33774,47.83038],[-122.33774,47.83056],[-122.33775,47.830738000000004],[-122.33774,47.831219],[-122.33774,47.83125],[-122.33776,47.831540999999994]]]},"name":"Lynnwood"},{"boundary":{"type":"Polygon","coordinates":[[[-122.30952,47.35794299999999],[-122.30909,47.35875],[-122.30892999999999,47.35903999999999],[-122.308602,47.35965999999999],[-122.30829,47.36026],[-122.30807999999999,47.36069],[-122.30779,47.36123],[-122.30761000000001,47.361537],[-122.30699,47.362730000000006],[-122.30566999999999,47.365259],[-122.30538999999999,47.3658],[-122.30506999999999,47.366398000000004],[-122.30486,47.36685],[-122.30475,47.36705],[-122.30467,47.36718],[-122.30451000000001,47.36743],[-122.30422000000002,47.368001],[-122.30385,47.368700000000004],[-122.30332,47.36977],[-122.3031,47.37017],[-122.30266999999999,47.37096],[-122.30232,47.371649999999995],[-122.30199,47.372280999999994],[-122.30163,47.37295],[-122.30138,47.37345],[-122.30107199999999,47.374013],[-122.30075,47.374635],[-122.30068,47.374779999999994],[-122.30066000000001,47.37481],[-122.30116000000001,47.37481999999999],[-122.30162000000001,47.374821999999995],[-122.30199,47.374829999999996],[-122.302369,47.374829999999996],[-122.30245,47.37483399999999],[-122.30256,47.374835],[-122.30256,47.375],[-122.30256,47.375149],[-122.30256,47.3752],[-122.30256,47.37535200000001],[-122.30256,47.37538],[-122.30256,47.37541],[-122.30256,47.375544],[-122.30256,47.3759],[-122.30273999999999,47.3759],[-122.30282999999999,47.3759],[-122.30337999999999,47.375910000000005],[-122.30469000000001,47.375930000000004],[-122.30574999999999,47.37595],[-122.30681,47.375965],[-122.30782,47.37598],[-122.30782,47.376079999999995],[-122.30786,47.377779999999994],[-122.3079,47.37956],[-122.30718,47.37955],[-122.30672,47.37955],[-122.30609,47.37953],[-122.30493,47.3795],[-122.3048,47.3795],[-122.30382999999999,47.37949],[-122.30376999999999,47.37948399999999],[-122.30372999999999,47.37947],[-122.30212,47.37943],[-122.30196000000001,47.37945],[-122.301826,47.379459999999995],[-122.30062000000001,47.37945],[-122.30053,47.37945],[-122.30054,47.380339],[-122.30053,47.381099999999996],[-122.29962000000002,47.381142999999994],[-122.29871,47.38115],[-122.29868,47.382166],[-122.29867,47.38259],[-122.29751000000002,47.38259],[-122.29743,47.382889999999996],[-122.29710000000001,47.384229999999995],[-122.29769000000002,47.38425999999999],[-122.29769000000002,47.384401999999994],[-122.29769000000002,47.38464999999999],[-122.29866000000001,47.38465999999999],[-122.29865000000001,47.38494399999999],[-122.29871,47.38623],[-122.29872999999999,47.38652],[-122.29863,47.38652],[-122.29816000000001,47.38652],[-122.29772000000001,47.38652],[-122.29729000000002,47.38653],[-122.29671,47.38652],[-122.29654000000001,47.38652],[-122.29648,47.386779999999995],[-122.29642000000001,47.387049999999995],[-122.29633,47.38737],[-122.29639,47.38737999999999],[-122.29724400000002,47.38737999999999],[-122.29723000000001,47.38838],[-122.29722000000002,47.38903],[-122.29592000000001,47.38901],[-122.29579,47.389576],[-122.29558,47.390403],[-122.29581,47.390432000000004],[-122.29720000000002,47.39043],[-122.29720000000002,47.39096],[-122.29627,47.390964],[-122.29553,47.390965],[-122.29544,47.390965],[-122.29536,47.391345],[-122.29519,47.392030000000005],[-122.29511000000001,47.392437],[-122.29521000000001,47.39244],[-122.29719000000001,47.39246],[-122.29719000000001,47.39372],[-122.29756000000002,47.393724],[-122.29775000000001,47.393724],[-122.29879,47.39374],[-122.29885,47.39553000000001],[-122.29853,47.39548],[-122.29788,47.39537800000001],[-122.29762000000002,47.395328000000006],[-122.297437,47.395286],[-122.29716000000002,47.395208000000004],[-122.29700000000001,47.395157000000005],[-122.29683,47.39509],[-122.29664000000001,47.395010000000006],[-122.29651000000001,47.394954],[-122.29624000000001,47.39481],[-122.29610000000001,47.394723],[-122.29596000000001,47.39463],[-122.29592000000001,47.394594],[-122.29548,47.39422],[-122.2954,47.394059999999996],[-122.29493000000001,47.39365],[-122.294739,47.39348],[-122.29389,47.392790000000005],[-122.29333,47.39246],[-122.292806,47.39221800000001],[-122.29264,47.392160000000004],[-122.292589,47.39227],[-122.29203,47.39363],[-122.29198000000001,47.393750000000004],[-122.29186000000001,47.394031],[-122.292,47.39497],[-122.29212000000001,47.396069],[-122.29186000000001,47.396066],[-122.29173,47.396065],[-122.29132800000001,47.396065],[-122.29035,47.396076],[-122.29027,47.395851],[-122.28993,47.395857],[-122.28934,47.39588],[-122.289305,47.395810000000004],[-122.28732000000001,47.395848],[-122.287315,47.395686],[-122.28655,47.39569],[-122.286568,47.39647],[-122.28407,47.396556000000004],[-122.28412000000002,47.39664],[-122.283466,47.396771],[-122.28347,47.397026],[-122.282945,47.397452],[-122.28276,47.39745],[-122.28276999999999,47.39927],[-122.28394,47.39925],[-122.28398,47.40107],[-122.28563,47.40104699999999],[-122.28655,47.40103],[-122.29019000000001,47.400968],[-122.29018,47.401019],[-122.29018,47.401316],[-122.29018,47.40166299999999],[-122.29017,47.40183],[-122.29017,47.402100000000004],[-122.29017,47.402141],[-122.29009,47.402133000000006],[-122.28833999999999,47.402131000000004],[-122.28836999999999,47.40241],[-122.28838999999999,47.402615000000004],[-122.28847999999999,47.40284],[-122.28846,47.40287],[-122.28846999999999,47.40291800000001],[-122.288714,47.403259],[-122.28875,47.40336],[-122.288765,47.403459999999995],[-122.28877999999999,47.403659999999995],[-122.28852,47.40367],[-122.28684,47.40373],[-122.28656000000001,47.40374],[-122.28656000000001,47.40381],[-122.286581,47.408243],[-122.28615,47.408249],[-122.28565,47.408254],[-122.285255,47.40826],[-122.28502,47.40792],[-122.28488,47.40771],[-122.28486000000001,47.40767999999999],[-122.28475,47.407526999999995],[-122.28463,47.40741],[-122.28456000000001,47.40736],[-122.28446000000001,47.4073],[-122.2844,47.40727],[-122.28423000000001,47.407208],[-122.28413,47.40718],[-122.28403,47.40716],[-122.28391,47.40714],[-122.28376999999999,47.40714],[-122.28355,47.40715],[-122.28346,47.407162],[-122.28331,47.40719],[-122.28315,47.40724899999999],[-122.28304,47.407301],[-122.28289,47.407392],[-122.28275,47.407502],[-122.28198,47.40815200000001],[-122.28187,47.40823],[-122.2818,47.40827],[-122.28163,47.40832],[-122.28137,47.40838],[-122.28138,47.4084],[-122.28138,47.40844],[-122.28136,47.40848],[-122.28133,47.40851000000001],[-122.28128000000001,47.408530000000006],[-122.28123000000001,47.408550000000005],[-122.281318,47.408761],[-122.28135,47.40886],[-122.28136,47.40894],[-122.28138,47.40925],[-122.28137,47.410371],[-122.28134,47.410758],[-122.281316,47.41098099999999],[-122.28115000000001,47.411716],[-122.28105000000001,47.41216],[-122.28105000000001,47.412236],[-122.28101000000001,47.41247],[-122.28099,47.41256],[-122.28093,47.412631],[-122.28081,47.4127],[-122.28082300000001,47.412718000000005],[-122.28093,47.412802],[-122.28098,47.41285],[-122.28154,47.41356],[-122.28182000000001,47.4141],[-122.28215,47.414739999999995],[-122.28226000000001,47.41517],[-122.28235,47.415517],[-122.28217,47.415516000000004],[-122.28133,47.415526],[-122.27956,47.41555],[-122.27661,47.41928299999999],[-122.27624,47.41929],[-122.27436,47.41931],[-122.27312,47.419332000000004],[-122.27076999999998,47.41937],[-122.26767000000001,47.419399999999996],[-122.26734,47.419395],[-122.26718000000001,47.419399999999996],[-122.2664,47.42036],[-122.26548,47.421330000000005],[-122.26525000000001,47.42182],[-122.26521000000001,47.42266],[-122.26536999999999,47.423054],[-122.26544,47.42322],[-122.26558,47.423300000000005],[-122.26597,47.42383],[-122.26706000000001,47.42489],[-122.26725800000001,47.425233000000006],[-122.26722000000002,47.425540000000005],[-122.26621000000002,47.42694],[-122.26576999999999,47.42812000000001],[-122.26532999999999,47.42866],[-122.26493,47.42888],[-122.26418000000001,47.42918],[-122.26352000000001,47.42931000000001],[-122.26262900000002,47.429410000000004],[-122.25979099999999,47.429435000000005],[-122.25903,47.42958],[-122.25863,47.429811],[-122.25832,47.430248],[-122.25829999999999,47.430330000000005],[-122.25825,47.43049],[-122.25823199999999,47.430566],[-122.25845,47.43135],[-122.25899,47.43174],[-122.2597,47.432010000000005],[-122.26075,47.43227],[-122.26184,47.43253500000001],[-122.26245,47.43269],[-122.26286999999999,47.432900000000004],[-122.26313,47.433032000000004],[-122.26319000000001,47.43318],[-122.26321000000002,47.43327],[-122.26322000000002,47.433350000000004],[-122.26323000000001,47.433443999999994],[-122.26322000000002,47.433530000000005],[-122.26321000000002,47.43362],[-122.26318,47.4337],[-122.26315000000001,47.43379],[-122.26311000000001,47.43387],[-122.26307,47.43395],[-122.26301000000001,47.43402699999999],[-122.26295,47.434101],[-122.26288,47.43417],[-122.2625,47.43417],[-122.26229000000001,47.43417],[-122.26208,47.43416],[-122.26172000000001,47.43416],[-122.26085,47.434154],[-122.25995,47.43414],[-122.25954,47.43414],[-122.25927,47.43414],[-122.25846999999999,47.433530000000005],[-122.25787,47.43327],[-122.2573,47.43323],[-122.25701000000001,47.433288],[-122.25685,47.43332],[-122.25645,47.43352],[-122.25628,47.43352],[-122.25593699999999,47.43352],[-122.2548,47.433506],[-122.2485,47.43343],[-122.2484,47.43379],[-122.24820000000001,47.43452],[-122.24779000000001,47.43603],[-122.24752000000002,47.437053],[-122.24740000000001,47.437355000000004],[-122.24729000000002,47.43755],[-122.24714000000002,47.43773],[-122.24697,47.4379],[-122.24677,47.43806],[-122.24657,47.4382],[-122.24616000000002,47.43844],[-122.24587,47.438657],[-122.24566000000002,47.43889],[-122.24563,47.43894],[-122.24551000000001,47.4391],[-122.24545,47.439226],[-122.24538,47.43941],[-122.24535,47.4396],[-122.245336,47.43979],[-122.24535,47.43992],[-122.24546000000001,47.440433],[-122.24563,47.44123],[-122.24442000000002,47.441219999999994],[-122.24369000000002,47.441216],[-122.24333,47.44121],[-122.24229000000001,47.44120699999999],[-122.24176000000001,47.441199999999995],[-122.24143000000001,47.441199999999995],[-122.24098000000001,47.441199999999995],[-122.23908,47.441176],[-122.239,47.441179999999996],[-122.23883,47.441179999999996],[-122.23648,47.441178],[-122.23525000000001,47.441175],[-122.2351,47.441174],[-122.23289,47.441168],[-122.22976999999999,47.441158],[-122.22779,47.44115],[-122.22703,47.44115],[-122.22395,47.441136],[-122.22382,47.44113],[-122.22146000000001,47.441123],[-122.21989,47.441122],[-122.21772000000001,47.44116399999999],[-122.21759000000002,47.44117],[-122.21746000000002,47.44117],[-122.21649900000001,47.44117],[-122.21584,47.44115],[-122.2155,47.44114],[-122.21553,47.441019999999995],[-122.21554,47.44097],[-122.21558,47.44077],[-122.21561200000001,47.440625999999995],[-122.21562000000002,47.44060399999999],[-122.21566000000001,47.440419999999996],[-122.21569000000001,47.440391],[-122.21594,47.44017],[-122.21605000000001,47.440082],[-122.21620000000001,47.43996],[-122.21633,47.43984],[-122.21657,47.43964],[-122.21664000000001,47.439574],[-122.21683,47.439170000000004],[-122.216856,47.43911000000001],[-122.21691000000001,47.439],[-122.21702000000002,47.43874],[-122.21731000000001,47.438406],[-122.21746000000002,47.438229],[-122.21786000000002,47.43776],[-122.21798000000001,47.437619999999995],[-122.21805,47.43754],[-122.21806000000001,47.4375],[-122.21819,47.43699],[-122.21829000000001,47.436623],[-122.21895,47.43403],[-122.21988,47.43039],[-122.21994000000001,47.43019],[-122.21976000000001,47.43018],[-122.21928000000001,47.43022],[-122.21896000000001,47.43024],[-122.21847,47.430251],[-122.21837,47.43025],[-122.21821000000001,47.430246],[-122.21822000000002,47.43007],[-122.21822000000002,47.429786],[-122.21821600000001,47.429750000000006],[-122.21818,47.42749],[-122.21812000000001,47.42646],[-122.21812000000001,47.42624],[-122.21811000000001,47.42598],[-122.2181,47.42533000000001],[-122.21809,47.425188000000006],[-122.21813,47.42456],[-122.21812000000001,47.42434],[-122.21812000000001,47.42422],[-122.21811000000001,47.423634],[-122.21797000000001,47.422984],[-122.21790000000001,47.423],[-122.21755000000002,47.42302],[-122.21626000000002,47.42304],[-122.21485000000001,47.423058000000005],[-122.21469000000002,47.42306],[-122.21343,47.423076],[-122.21273,47.42308],[-122.21239,47.42309],[-122.21151000000002,47.423097],[-122.20995300000001,47.42311300000001],[-122.20894,47.423120000000004],[-122.20757,47.42313000000001],[-122.20611000000001,47.42313000000001],[-122.20559,47.42313000000001],[-122.20503,47.42313000000001],[-122.20465000000002,47.42313000000001],[-122.20453,47.42313000000001],[-122.20443,47.42313000000001],[-122.20432000000001,47.423120000000004],[-122.20396000000001,47.423120000000004],[-122.20301,47.423120000000004],[-122.20262000000001,47.423120000000004],[-122.20232999999999,47.42311000000001],[-122.2018,47.42311300000001],[-122.20099,47.42311000000001],[-122.19988,47.42311000000001],[-122.19969,47.42311000000001],[-122.19877999999999,47.42310500000001],[-122.197944,47.42310200000001],[-122.19706000000001,47.423100000000005],[-122.19706000000001,47.42404],[-122.19708,47.42582],[-122.19708,47.42669],[-122.19708,47.42850000000001],[-122.19709,47.43023],[-122.19556,47.43023],[-122.19384,47.43023],[-122.19246999999999,47.43023],[-122.19171,47.43023],[-122.19129000000001,47.43023],[-122.190951,47.43023],[-122.18966,47.43022],[-122.18782999999999,47.430215000000004],[-122.18646,47.430217],[-122.18446,47.43023],[-122.18358699999999,47.43023],[-122.18114,47.430246],[-122.17916999999998,47.430257],[-122.17897999999998,47.43026],[-122.17721,47.43027],[-122.17666,47.43027],[-122.17609999999999,47.430279999999996],[-122.17579999999998,47.430279999999996],[-122.17580999999998,47.42938],[-122.17568299999999,47.42938],[-122.17472,47.429386],[-122.17457999999999,47.42906],[-122.17434999999999,47.428490000000004],[-122.174251,47.42825500000001],[-122.17397499999998,47.42759],[-122.17344999999999,47.426314000000005],[-122.17336999999998,47.42613000000001],[-122.17321,47.425740000000005],[-122.17282999999998,47.42482],[-122.17269999999998,47.42452],[-122.17267999999999,47.42447],[-122.17266999999998,47.42444],[-122.17262,47.424310000000006],[-122.17257999999998,47.424213],[-122.17256999999998,47.424197],[-122.17247999999998,47.42398],[-122.17237999999998,47.42399],[-122.17236999999997,47.423970000000004],[-122.17236999999997,47.42391000000001],[-122.17237099999997,47.42378],[-122.17236999999997,47.423730000000006],[-122.17237999999998,47.423362000000004],[-122.17237999999998,47.42313000000001],[-122.17237999999998,47.42308],[-122.17218999999999,47.42309],[-122.17210999999999,47.42309],[-122.17202999999998,47.42309],[-122.17183999999999,47.42309],[-122.170553,47.42309],[-122.17056,47.42269],[-122.17049999999999,47.42271100000001],[-122.17021,47.42271100000001],[-122.16993,47.42269],[-122.169667,47.42268],[-122.16924,47.422498000000004],[-122.16874999999999,47.422287],[-122.16816,47.42203000000001],[-122.16807999999999,47.42195],[-122.16802999999999,47.421910000000004],[-122.16802,47.42189],[-122.16799999999999,47.42188599999999],[-122.16785,47.42181],[-122.16782,47.42142],[-122.16781,47.421303],[-122.1664,47.42134],[-122.16529999999999,47.42136],[-122.165225,47.421363],[-122.16516999999999,47.421016],[-122.16499999999999,47.42096],[-122.16478,47.42087],[-122.164598,47.420676],[-122.16398,47.41999],[-122.16329999999999,47.41924099999999],[-122.16291,47.41881],[-122.16286999999998,47.41882],[-122.16266,47.41889],[-122.16195,47.41912],[-122.1619,47.41914],[-122.1619,47.418986999999994],[-122.1619,47.418839999999996],[-122.1614,47.41861],[-122.16121000000001,47.418521],[-122.161174,47.418503],[-122.16102000000001,47.41843],[-122.16093,47.418386],[-122.160904,47.418375000000005],[-122.16076999999999,47.418310000000005],[-122.16058,47.41822],[-122.16058799999999,47.418130000000005],[-122.16062000000001,47.41727999999999],[-122.16041,47.41727999999999],[-122.15983999999999,47.41727999999999],[-122.15991,47.41589],[-122.15875999999999,47.4159],[-122.15872999999998,47.414913],[-122.15859999999999,47.41491],[-122.15859999999999,47.414069999999995],[-122.15948999999999,47.41405999999999],[-122.1595,47.41352],[-122.15977999999998,47.41352],[-122.1599,47.41352],[-122.1599,47.413289999999996],[-122.15988999999999,47.41288599999999],[-122.15983999999999,47.41147999999999],[-122.16035,47.41147999999999],[-122.160369,47.408947],[-122.16036,47.40865],[-122.16012,47.40865],[-122.16008599999999,47.40865],[-122.16002999999999,47.40865],[-122.16006,47.408570000000005],[-122.16009,47.40851000000001],[-122.16011,47.40847],[-122.16022000000001,47.408210000000004],[-122.16017,47.40783999999999],[-122.16012,47.40751],[-122.16006,47.407],[-122.16008599999999,47.406639],[-122.15996999999999,47.40632],[-122.15993999999999,47.40623],[-122.15979999999999,47.40586],[-122.15962,47.40514],[-122.15965,47.40511000000001],[-122.15979999999999,47.40502],[-122.15983999999999,47.40502],[-122.15997999999999,47.40502],[-122.15997999999999,47.404889999999995],[-122.15999,47.40285],[-122.16,47.40173],[-122.15999,47.401669999999996],[-122.15999,47.401622999999994],[-122.15997999999999,47.401615],[-122.15993999999999,47.40159],[-122.15983999999999,47.40155],[-122.15983999999999,47.401525],[-122.15986099999999,47.401379999999996],[-122.15906999999999,47.401379999999996],[-122.15902,47.401379999999996],[-122.15868999999999,47.40137],[-122.15863999999999,47.40137],[-122.15863999999999,47.40123],[-122.15863999999999,47.401025999999995],[-122.158654,47.399414],[-122.158613,47.39777],[-122.15728,47.397768],[-122.15607999999999,47.39605],[-122.15586799999998,47.39574],[-122.15494,47.39441],[-122.15469,47.39405],[-122.15469,47.3937],[-122.15471,47.392300000000006],[-122.15467,47.3922],[-122.15465,47.392100000000006],[-122.15464,47.392],[-122.15302,47.391965],[-122.15298999999999,47.391110000000005],[-122.15296599999999,47.39053500000001],[-122.15230999999999,47.389489999999995],[-122.15142,47.389199999999995],[-122.15117,47.388510000000004],[-122.15036999999998,47.38843],[-122.15004799999998,47.3882],[-122.14938,47.38802],[-122.14941,47.3869],[-122.14792000000001,47.38693],[-122.1478,47.386919999999996],[-122.14768000000001,47.38691],[-122.14759000000001,47.38688799999999],[-122.14750000000001,47.386869999999995],[-122.1473,47.38681999999999],[-122.14720000000001,47.386779999999995],[-122.14709,47.38673],[-122.14699,47.38667999999999],[-122.14625000000001,47.38628799999999],[-122.14616000000001,47.38625],[-122.14603,47.386199999999995],[-122.14561,47.38612],[-122.14502,47.386039999999994],[-122.14452000000001,47.385932000000004],[-122.14411000000001,47.385757],[-122.14371,47.385585],[-122.14341,47.385417],[-122.14292,47.38479699999999],[-122.14264,47.38448999999999],[-122.14245,47.38405999999999],[-122.14238999999999,47.38385999999999],[-122.14227,47.38361],[-122.14209,47.383372],[-122.14216,47.383159],[-122.14234799999998,47.3827],[-122.14283999999999,47.38191],[-122.14325000000001,47.38131],[-122.14379,47.38041],[-122.14392000000001,47.380233999999994],[-122.144,47.38011],[-122.14402000000001,47.37958],[-122.14402000000001,47.37881],[-122.14403,47.37572],[-122.14403,47.37406299999999],[-122.14402000000001,47.37238],[-122.14403,47.372260999999995],[-122.144,47.37021],[-122.14399,47.369338000000006],[-122.1439,47.369110000000006],[-122.14376999999999,47.36876],[-122.14368,47.368524],[-122.14342,47.36786699999999],[-122.14306,47.366999],[-122.14256,47.367],[-122.14157,47.367003],[-122.14150000000001,47.365217],[-122.14111000000001,47.36522],[-122.13996999999999,47.365210000000005],[-122.13830999999999,47.365210000000005],[-122.13735,47.365221],[-122.13699,47.365223],[-122.13652400000001,47.365224],[-122.13628,47.365226],[-122.13628,47.36507],[-122.13628,47.36459],[-122.13628,47.364239999999995],[-122.13627,47.36413],[-122.13627,47.36395],[-122.13626000000001,47.362210000000005],[-122.136258,47.361978],[-122.13626000000001,47.36159],[-122.13429000000001,47.36155],[-122.13284999999999,47.361599999999996],[-122.13257999999999,47.36161],[-122.13256,47.36156],[-122.13255,47.361506],[-122.13253999999999,47.36148899999999],[-122.13252999999999,47.361458],[-122.13251,47.361418],[-122.13246999999998,47.36138],[-122.13243999999999,47.36135],[-122.13238999999999,47.3613],[-122.13234999999999,47.36127],[-122.13232999999998,47.36124099999999],[-122.13230999999999,47.3612],[-122.13229,47.36116],[-122.13228,47.361146],[-122.13222,47.36112],[-122.13206,47.36099],[-122.13197,47.36092],[-122.131948,47.360910000000004],[-122.13179,47.36077],[-122.13171,47.3607],[-122.13095,47.360710000000005],[-122.13095,47.35987999999999],[-122.13095,47.35892],[-122.12921,47.35893],[-122.12825799999999,47.35894],[-122.12822,47.35886399999999],[-122.12818999999999,47.35875],[-122.12816099999999,47.358639999999994],[-122.12813999999999,47.358517],[-122.12813999999999,47.358475],[-122.12812,47.358213],[-122.12913999999999,47.35818],[-122.12921,47.35809],[-122.12925,47.35801],[-122.12929999999999,47.35788999999999],[-122.12942,47.35775999999999],[-122.12943599999998,47.357749999999996],[-122.12957999999999,47.35762999999999],[-122.12982,47.35741699999999],[-122.12988999999999,47.35726999999999],[-122.12991,47.357139999999994],[-122.12992,47.35703999999999],[-122.12992999999999,47.3567],[-122.12996,47.35664799999999],[-122.12997999999999,47.356399999999994],[-122.13002,47.35627999999999],[-122.13002999999999,47.356199999999994],[-122.13071,47.35619],[-122.13113,47.356179999999995],[-122.13113,47.355906],[-122.13113,47.35579],[-122.13113,47.355308],[-122.1317,47.355301],[-122.1317,47.354989999999994],[-122.13055,47.354989999999994],[-122.13031099999999,47.35499399999999],[-122.130053,47.355],[-122.13006,47.35490599999999],[-122.130102,47.35457999999999],[-122.13012,47.354569999999995],[-122.13014,47.35441999999999],[-122.13006999999999,47.354409999999994],[-122.12931999999999,47.35441999999999],[-122.12830999999998,47.354429999999994],[-122.12831999999999,47.353955],[-122.12972999999998,47.353176],[-122.12986,47.35311],[-122.13280199999998,47.35153999999999],[-122.13287999999999,47.351589999999995],[-122.13316999999999,47.35161599999999],[-122.1332,47.35159999999999],[-122.13359,47.351409999999994],[-122.133697,47.35145999999999],[-122.13456000000001,47.350989999999996],[-122.13457,47.35084499999999],[-122.13472999999999,47.350609999999996],[-122.13454,47.35039999999999],[-122.13485,47.350238],[-122.13882999999998,47.348079999999996],[-122.14318,47.34572],[-122.14362000000001,47.345458],[-122.14386999999999,47.345293],[-122.14423000000001,47.34504],[-122.14458,47.344759999999994],[-122.14477,47.34459999999999],[-122.14495000000001,47.34443999999999],[-122.14525,47.344159999999995],[-122.14542999999999,47.343959],[-122.14559,47.343785],[-122.1458,47.34353],[-122.14626700000001,47.34353],[-122.14639,47.343516],[-122.14691,47.3435],[-122.14956000000001,47.343489999999996],[-122.15092,47.343489999999996],[-122.15342999999999,47.343489999999996],[-122.15485,47.34347999999999],[-122.15688999999999,47.343472],[-122.15737999999999,47.343472],[-122.15837999999998,47.343469999999996],[-122.15876999999998,47.343467999999994],[-122.1601,47.34345],[-122.16022000000001,47.34345],[-122.16071,47.34345999999999],[-122.16252999999999,47.343450999999995],[-122.1655,47.343439999999994],[-122.1655,47.344123999999994],[-122.1655,47.346163],[-122.16552999999999,47.34844],[-122.16554,47.34893],[-122.16838999999999,47.34892],[-122.171234,47.34883],[-122.17613799999998,47.348819999999996],[-122.17613799999998,47.34895],[-122.17685999999999,47.34894],[-122.17796999999999,47.34894],[-122.17860499999999,47.34894],[-122.17866999999998,47.34894],[-122.17939999999999,47.348929],[-122.17957999999999,47.348926],[-122.18077999999998,47.348908],[-122.18077999999998,47.34899],[-122.18078999999999,47.34961],[-122.18083999999999,47.34961],[-122.18091,47.34974],[-122.18099,47.34981],[-122.18145,47.34981],[-122.18145,47.350269999999995],[-122.18376999999998,47.35025999999999],[-122.18413,47.35025999999999],[-122.18454,47.35025999999999],[-122.18677299999999,47.35025999999999],[-122.18677299999999,47.350715],[-122.18838999999998,47.35073],[-122.1921,47.35077],[-122.19435,47.35081999999999],[-122.1952,47.35079999999999],[-122.19711000000001,47.35081999999999],[-122.20236,47.350829999999995],[-122.20239,47.34609],[-122.20416700000001,47.3461],[-122.20414000000001,47.35085999999999],[-122.208,47.35091],[-122.208549,47.350919999999995],[-122.20915400000001,47.350935],[-122.20903,47.35104699999999],[-122.20893,47.35108899999999],[-122.20869400000001,47.35115999999999],[-122.20859,47.351229999999994],[-122.20855,47.351313],[-122.20852000000001,47.35148999999999],[-122.20855,47.351609999999994],[-122.20846,47.35183399999999],[-122.20839,47.352],[-122.20837999999999,47.352139],[-122.20842,47.35238],[-122.20845,47.352639999999994],[-122.20845,47.353019999999994],[-122.20862000000001,47.353444999999994],[-122.20896,47.35371],[-122.209452,47.35409899999999],[-122.2095,47.35414099999999],[-122.21037,47.35464999999999],[-122.21071300000001,47.35486999999999],[-122.21060000000001,47.354949999999995],[-122.21041000000001,47.35508399999999],[-122.21033,47.355137],[-122.20985,47.35518],[-122.209,47.355258],[-122.20833999999999,47.35532],[-122.20746000000001,47.35493999999999],[-122.20742000000001,47.3563],[-122.2074,47.35685999999999],[-122.20735,47.35847999999999],[-122.20733,47.36075],[-122.20733,47.361272],[-122.20732000000001,47.361456],[-122.20732000000001,47.36167],[-122.21266000000001,47.36165],[-122.21276999999999,47.36752],[-122.212786,47.36799],[-122.21539,47.36799],[-122.21539,47.36889],[-122.21759100000001,47.36889],[-122.21806000000001,47.36888],[-122.21806000000001,47.36979],[-122.22113900000001,47.36979],[-122.22202999999999,47.36979],[-122.22202999999999,47.3694],[-122.22202999999999,47.36923],[-122.22192000000001,47.36811000000001],[-122.22191000000001,47.367948],[-122.22269,47.36824],[-122.22286,47.368500000000004],[-122.22331,47.36868],[-122.22349,47.36871000000001],[-122.22409,47.36883],[-122.22574999999999,47.36941],[-122.22627,47.36934],[-122.22668,47.369150000000005],[-122.22708,47.36892],[-122.22733,47.368611],[-122.22733,47.3682],[-122.22718,47.367850999999995],[-122.226608,47.367512000000005],[-122.22559,47.3671],[-122.22497,47.36685],[-122.22486,47.366783],[-122.22474,47.366710000000005],[-122.22436,47.36638],[-122.223642,47.36576],[-122.22346,47.365410000000004],[-122.22337999999999,47.36524],[-122.22368,47.364658],[-122.22481,47.36316],[-122.22568,47.36246],[-122.22699,47.36159],[-122.22775,47.36149399999999],[-122.22796000000001,47.36147],[-122.22843999999999,47.361470999999995],[-122.22852999999999,47.361439999999995],[-122.22876,47.36144699999999],[-122.22882999999999,47.361419999999995],[-122.22892999999999,47.361412],[-122.22908,47.361425999999994],[-122.22967,47.361278],[-122.22986,47.36123],[-122.230976,47.36098],[-122.23141000000001,47.360972000000004],[-122.232,47.36105],[-122.23268,47.36114],[-122.23277999999999,47.36116],[-122.23360000000001,47.361373],[-122.23392000000001,47.36135],[-122.23471,47.36167999999999],[-122.23568,47.36191],[-122.23582999999999,47.36196699999999],[-122.23646000000001,47.362210000000005],[-122.23703,47.36266],[-122.23714000000001,47.36294],[-122.23725900000002,47.36322],[-122.23718000000001,47.36447999999999],[-122.23735,47.36516],[-122.23721000000002,47.365750000000006],[-122.23709000000001,47.365997],[-122.23691000000001,47.36622],[-122.23658,47.36662],[-122.23589,47.367322],[-122.235068,47.36797],[-122.23444,47.368468],[-122.23435,47.368637],[-122.23437,47.369085],[-122.23447,47.369330000000005],[-122.23465700000001,47.36951800000001],[-122.23528,47.3697],[-122.23585,47.36967],[-122.23585,47.369738000000005],[-122.23585,47.37005],[-122.23697,47.37001],[-122.23759000000001,47.36998],[-122.23832,47.3699],[-122.23851,47.369898],[-122.23928000000001,47.36992],[-122.2397,47.369941],[-122.24001000000001,47.36996],[-122.239948,47.36952],[-122.23993,47.36932],[-122.23993,47.3693],[-122.23991000000001,47.369150000000005],[-122.23989,47.369037],[-122.23987,47.36889],[-122.23971,47.36795],[-122.23960000000001,47.3672],[-122.23950500000001,47.36632],[-122.239406,47.365370000000006],[-122.23928000000001,47.36456],[-122.23895,47.362331000000005],[-122.23881,47.361259999999994],[-122.23877999999999,47.35981999999999],[-122.23877999999999,47.35794599999999],[-122.23879,47.35746799999999],[-122.2388,47.356562999999994],[-122.23876999999999,47.353652],[-122.23903,47.35365099999999],[-122.23910000000001,47.35365699999999],[-122.23925000000001,47.35365699999999],[-122.23991000000001,47.353652999999994],[-122.24152000000002,47.353652999999994],[-122.24317,47.353652],[-122.24344,47.35365099999999],[-122.24461000000002,47.353649999999995],[-122.24487,47.353649999999995],[-122.24600000000001,47.353649999999995],[-122.24640000000001,47.353649999999995],[-122.24644,47.353649999999995],[-122.24784000000001,47.353652],[-122.24948,47.353652999999994],[-122.25153,47.353655999999994],[-122.25278999999999,47.35365999999999],[-122.25367,47.35365899999999],[-122.25351,47.35690699999999],[-122.25348,47.35803],[-122.25274999999999,47.35803],[-122.25211,47.35804099999999],[-122.25162900000002,47.35805],[-122.24931000000001,47.358079999999994],[-122.24922000000002,47.361065999999994],[-122.24920000000002,47.362927],[-122.24918000000001,47.36347],[-122.24916000000002,47.363837],[-122.24920000000002,47.3643],[-122.24940000000001,47.365431],[-122.24942000000001,47.365550000000006],[-122.24945000000001,47.36598],[-122.24933,47.36708699999999],[-122.24932000000001,47.36715],[-122.24922000000002,47.36771],[-122.24917,47.36794],[-122.24899,47.369150000000005],[-122.24886000000001,47.37015],[-122.24885,47.370219999999996],[-122.24884,47.37027],[-122.24920700000001,47.37115],[-122.24921000000002,47.371326999999994],[-122.24920000000002,47.37197],[-122.24919900000002,47.37222],[-122.24920000000002,47.37239],[-122.24920000000002,47.37249],[-122.24920000000002,47.372761],[-122.24920000000002,47.373025],[-122.24920300000002,47.373279999999994],[-122.24921000000002,47.373659999999994],[-122.24921000000002,47.373913],[-122.24921000000002,47.37396],[-122.24921000000002,47.37454399999999],[-122.24922000000002,47.376058],[-122.24921000000002,47.37614],[-122.24922000000002,47.376318000000005],[-122.24923000000001,47.37643],[-122.24953000000001,47.376495],[-122.249739,47.37654],[-122.25126000000002,47.37677],[-122.25273999999999,47.37652],[-122.25325400000001,47.376306],[-122.25355,47.376098],[-122.2538,47.375785],[-122.25412000000001,47.37508],[-122.25409,47.375],[-122.25422600000002,47.37440699999999],[-122.25432900000001,47.37396],[-122.25436,47.373676999999994],[-122.25445,47.37292],[-122.25458,47.3725],[-122.25461000000001,47.3724],[-122.25505,47.37185999999999],[-122.255449,47.37163999999999],[-122.25609,47.371469999999995],[-122.256607,47.37152],[-122.25676,47.371596],[-122.25729000000001,47.37183999999999],[-122.25750000000001,47.3721],[-122.25775,47.372710000000005],[-122.2578,47.37283],[-122.25766000000002,47.37354],[-122.25747,47.37387999999999],[-122.25741000000001,47.37407999999999],[-122.25731,47.37443],[-122.25742000000001,47.37481],[-122.25747,47.375],[-122.25749,47.375706],[-122.25743,47.375848],[-122.25686999999999,47.37715],[-122.25684,47.37725],[-122.25686,47.37748499999999],[-122.25702500000001,47.37802],[-122.25728400000001,47.37838],[-122.25746000000001,47.378530000000005],[-122.25764000000001,47.378596],[-122.25816,47.37877],[-122.25869,47.37874],[-122.259402,47.37861],[-122.25968,47.378478],[-122.25981,47.37845],[-122.26241,47.377939999999995],[-122.26304,47.37774699999999],[-122.26378,47.377413999999995],[-122.26403,47.377219999999994],[-122.26503,47.37672],[-122.26516000000001,47.376689999999996],[-122.26516000000001,47.37656],[-122.26516000000001,47.376276],[-122.26517,47.375823999999994],[-122.26553,47.37582],[-122.26576,47.37582],[-122.26599,47.37582],[-122.26851,47.375930000000004],[-122.26856000000001,47.37582],[-122.27037999999999,47.37582],[-122.27042999999999,47.37572],[-122.27059,47.37276],[-122.27063,47.372171],[-122.27052,47.372170000000004],[-122.26651000000001,47.37216],[-122.26613,47.37216],[-122.26518,47.372153000000004],[-122.265184,47.37127999999999],[-122.26519,47.37035],[-122.265198,47.365120000000005],[-122.26625000000001,47.36511000000001],[-122.267739,47.365099],[-122.26777,47.365749],[-122.26779,47.36664],[-122.26780000000001,47.36687],[-122.26942000000001,47.366859999999996],[-122.27041,47.36685],[-122.27056999999999,47.366852],[-122.27076999999998,47.36685],[-122.27076999999998,47.366668999999995],[-122.27076,47.36508],[-122.27125000000001,47.36508],[-122.27241,47.365086],[-122.27235999999999,47.36501200000001],[-122.27230999999999,47.3649],[-122.27226999999999,47.364802],[-122.27226,47.36477],[-122.272241,47.36463],[-122.27197,47.362610000000004],[-122.27193,47.36247],[-122.27185,47.361689999999996],[-122.27186,47.36155],[-122.27189,47.36131],[-122.27206999999999,47.36083],[-122.2721,47.360636],[-122.27211,47.36044],[-122.27208999999999,47.360246999999994],[-122.27203999999999,47.360059],[-122.27196,47.35976899999999],[-122.27146,47.35864599999999],[-122.27144,47.35857],[-122.27143,47.35846699999999],[-122.27143,47.35837],[-122.27145,47.358255],[-122.27147,47.358169],[-122.2716,47.35790699999999],[-122.27166000000001,47.357789999999994],[-122.273183,47.35778299999999],[-122.27377999999999,47.35777999999999],[-122.27398,47.357789999999994],[-122.27465000000001,47.357789999999994],[-122.27483,47.357789999999994],[-122.27597999999999,47.35779999999999],[-122.27642999999999,47.35779999999999],[-122.27651,47.35779999999999],[-122.27659,47.35779999999999],[-122.27783,47.35780799999999],[-122.27830999999999,47.35780999999999],[-122.27848999999999,47.35780999999999],[-122.28120000000001,47.35782999999999],[-122.28192000000001,47.35782999999999],[-122.28293,47.35782999999999],[-122.28388,47.35780999999999],[-122.28436,47.35780799999999],[-122.28452000000001,47.35780999999999],[-122.28601,47.35781099999999],[-122.28609,47.35781099999999],[-122.287,47.35779999999999],[-122.28789,47.357789999999994],[-122.288453,47.357789999999994],[-122.28858,47.357789999999994],[-122.29005000000001,47.357789999999994],[-122.29067,47.357789999999994],[-122.29142000000002,47.357789999999994],[-122.29209,47.35777999999999],[-122.29283,47.35779999999999],[-122.29318,47.35779999999999],[-122.29418000000001,47.35781599999999],[-122.29459000000001,47.35782099999999],[-122.29624000000001,47.35783999999999],[-122.29673,47.35783999999999],[-122.29763000000001,47.35786999999999],[-122.29771000000001,47.35786999999999],[-122.29798000000001,47.35786999999999],[-122.29865000000001,47.35787999999999],[-122.29977,47.357899999999994],[-122.30096999999999,47.35791999999999],[-122.3017,47.357929999999996],[-122.30256,47.357929999999996],[-122.304713,47.357941999999994],[-122.30639,47.357944999999994],[-122.30725000000001,47.35793999999999],[-122.30874999999999,47.35793999999999],[-122.30931,47.35794099999999],[-122.30942,47.357941999999994],[-122.30952,47.35794299999999]],[[-122.28651,47.38661],[-122.28467,47.38661],[-122.283826,47.38661],[-122.28379,47.38658099999999],[-122.28313,47.38625],[-122.28307,47.386316],[-122.28267,47.38667999999999],[-122.28217,47.387139999999995],[-122.28211,47.38721999999999],[-122.28206999999999,47.38732099999999],[-122.28206,47.38737],[-122.28206,47.388],[-122.28206,47.3882],[-122.28206,47.38839],[-122.28101000000001,47.388403],[-122.28102000000001,47.38786999999999],[-122.28102000000001,47.38743999999999],[-122.28020000000001,47.38741999999999],[-122.28022000000001,47.387359999999994],[-122.28036,47.386889999999994],[-122.2805,47.38645999999999],[-122.28054,47.38636699999999],[-122.28057,47.38633],[-122.280637,47.38625999999999],[-122.28074,47.386193],[-122.28084,47.38615],[-122.28086,47.38614],[-122.281,47.38612],[-122.28114000000001,47.3861],[-122.28116000000001,47.386102],[-122.28134,47.386109],[-122.28149,47.38613],[-122.28165000000001,47.386179999999996],[-122.28190000000001,47.385765],[-122.28232999999999,47.385859999999994],[-122.28231,47.385496999999994],[-122.282309,47.385445999999995],[-122.28241,47.385445999999995],[-122.28247999999999,47.385439999999996],[-122.28245,47.38535],[-122.28242999999999,47.385279999999995],[-122.28242,47.38503],[-122.28227,47.38503],[-122.28136900000001,47.38504],[-122.28137,47.38481999999999],[-122.28137,47.38475],[-122.28136,47.384299999999996],[-122.28135,47.38371],[-122.281349,47.383039999999994],[-122.280241,47.38305],[-122.27776,47.38305],[-122.27704,47.38305999999999],[-122.27722000000001,47.383799999999994],[-122.27742,47.384949999999996],[-122.27772999999999,47.38673],[-122.27792000000001,47.387359999999994],[-122.27814,47.388110000000005],[-122.27833999999999,47.388510000000004],[-122.27842,47.388510000000004],[-122.279863,47.388535000000005],[-122.281,47.38856],[-122.28094,47.390948],[-122.28160000000001,47.391059999999996],[-122.28202,47.39112],[-122.28246,47.39115],[-122.28309,47.39115],[-122.28365000000001,47.39107],[-122.28420000000001,47.39097],[-122.284952,47.3908],[-122.28569999999999,47.390659],[-122.2865,47.390550000000005],[-122.28649,47.39046],[-122.28648,47.39008],[-122.28651,47.388537],[-122.28651,47.38792399999999],[-122.28651,47.38661]]]},"name":"Kent"},{"boundary":{"type":"Polygon","coordinates":[[[-121.89368,47.543631],[-121.88731,47.54374],[-121.88736,47.547305],[-121.88696,47.5473],[-121.88677999999999,47.5473],[-121.88569,47.54729],[-121.88411,47.54727999999999],[-121.88193,47.547259999999994],[-121.88108,47.54725],[-121.87984999999999,47.547239],[-121.87830999999998,47.54723],[-121.87796999999999,47.54722399999999],[-121.87672999999998,47.54721],[-121.87666999999999,47.547219999999996],[-121.87638999999999,47.54721],[-121.86636999999999,47.54712],[-121.86556999999999,47.547122],[-121.86546999999999,47.547122],[-121.86546999999999,47.547104],[-121.86547999999999,47.543659999999996],[-121.86538999999999,47.54365],[-121.86451000000001,47.543633],[-121.86451000000001,47.54365],[-121.86452000000001,47.54377],[-121.86449,47.54387],[-121.86452000000001,47.54413],[-121.86463,47.544366999999994],[-121.8647,47.544599999999996],[-121.86461000000001,47.54475],[-121.86437,47.54479],[-121.86415000000001,47.54471],[-121.86405,47.54479],[-121.86398,47.544760999999994],[-121.864,47.54465],[-121.86376999999999,47.54445],[-121.86353,47.544419999999995],[-121.86329300000001,47.544545],[-121.86305,47.544439999999994],[-121.86278099999998,47.54443],[-121.86268,47.54453],[-121.86273899999999,47.544672],[-121.86292999999999,47.544819999999994],[-121.86286,47.54494],[-121.863,47.54508],[-121.86319,47.54509],[-121.8632,47.54527],[-121.86323,47.545243],[-121.86363,47.545350000000006],[-121.86377999999999,47.54548],[-121.86381,47.545770000000005],[-121.86319900000001,47.54596],[-121.862964,47.545788],[-121.86263,47.545628],[-121.8619,47.545320000000004],[-121.86172,47.54518],[-121.8615,47.545072000000005],[-121.86152000000001,47.545],[-121.8614,47.544979],[-121.86139,47.545026],[-121.86124000000001,47.545],[-121.86104,47.544934],[-121.860856,47.54483],[-121.86068,47.54474],[-121.8605,47.54461],[-121.86037999999999,47.54447],[-121.86021000000001,47.54436],[-121.86001,47.54421],[-121.85956,47.544019999999996],[-121.85923,47.54395],[-121.85916999999999,47.54394],[-121.85896999999999,47.54392],[-121.85882999999998,47.5439],[-121.85876999999998,47.543934],[-121.85866999999999,47.54396],[-121.85849999999999,47.544039999999995],[-121.85828,47.54409],[-121.85812,47.54405],[-121.85802,47.544013],[-121.8579,47.543974],[-121.85786,47.54387],[-121.85776999999999,47.54374],[-121.85764,47.54369],[-121.85752000000001,47.543679999999995],[-121.85737999999999,47.543636],[-121.8573,47.54352],[-121.85732999999999,47.54345],[-121.85484,47.54339],[-121.85111,47.54337],[-121.85082,47.543372000000005],[-121.85051,47.54287],[-121.8505,47.542814],[-121.85049,47.5428],[-121.85055,47.54107],[-121.85062300000001,47.539030000000004],[-121.84885,47.539030000000004],[-121.848642,47.539030000000004],[-121.84617,47.53906],[-121.84586,47.53906],[-121.84564,47.53906],[-121.845597,47.539059],[-121.84423000000001,47.53907],[-121.84419000000001,47.540253],[-121.84415000000001,47.541242999999994],[-121.84411100000001,47.542320000000004],[-121.84408,47.543350000000004],[-121.84401000000001,47.546],[-121.84383,47.54787999999999],[-121.843578,47.54791],[-121.84344,47.54791],[-121.84339,47.54792],[-121.84293,47.547926],[-121.8429,47.54772],[-121.84289,47.547079999999994],[-121.83975199999999,47.54703],[-121.8371,47.54699],[-121.83686,47.54699],[-121.83613,47.54698],[-121.83339,47.546959],[-121.83316,47.54696],[-121.83062000000001,47.54695],[-121.82862999999999,47.54694],[-121.82871999999999,47.54745],[-121.82880999999999,47.54809],[-121.82880999999999,47.54818],[-121.82880999999999,47.54829],[-121.82878699999998,47.5484],[-121.82875999999999,47.54848],[-121.82869999999998,47.548614],[-121.82864,47.54871000000001],[-121.828604,47.548750000000005],[-121.82840999999999,47.54866],[-121.82835999999999,47.54871000000001],[-121.8282,47.548639],[-121.82804099999998,47.548570000000005],[-121.82777099999998,47.54845],[-121.8275,47.54834],[-121.82728,47.54826],[-121.82705,47.548176000000005],[-121.82682,47.548097],[-121.82501599999999,47.5475],[-121.825013,47.547419999999995],[-121.82492,47.543198000000004],[-121.82328,47.54319],[-121.81846,47.5433],[-121.81793400000001,47.543310000000005],[-121.81785,47.543310000000005],[-121.81768000000001,47.543310000000005],[-121.81309,47.54336],[-121.8123,47.543365],[-121.81038,47.54338],[-121.81038,47.54316],[-121.81033199999999,47.54209],[-121.81031,47.541988999999994],[-121.810242,47.5417],[-121.81015000000001,47.541439999999994],[-121.81002000000001,47.54119],[-121.80909,47.53942],[-121.80906999999999,47.53936],[-121.80906999999999,47.539303000000004],[-121.80906999999999,47.53924],[-121.80908,47.539190000000005],[-121.80912000000001,47.53909],[-121.80916,47.539030000000004],[-121.80921000000001,47.538970000000006],[-121.80937999999999,47.53888],[-121.80961,47.53877000000001],[-121.80982999999999,47.53867],[-121.80987999999999,47.538630000000005],[-121.80996,47.538560000000004],[-121.81,47.53849],[-121.81003,47.538430000000005],[-121.81007,47.538086],[-121.81009,47.5379],[-121.81009,47.537559],[-121.81006000000001,47.537279999999996],[-121.8099,47.536621],[-121.80973999999999,47.535990000000005],[-121.80972,47.53593000000001],[-121.80955,47.53535000000001],[-121.80948,47.535120000000006],[-121.80957,47.53511000000001],[-121.810235,47.53511000000001],[-121.810292,47.53511000000001],[-121.81043,47.53510000000001],[-121.81072,47.53511000000001],[-121.809073,47.532920000000004],[-121.80896,47.532770000000006],[-121.80870999999999,47.53242],[-121.80845,47.532043],[-121.80822,47.5317],[-121.80733,47.53041],[-121.80722000000002,47.53023],[-121.80693,47.52985],[-121.80669999999999,47.529554000000005],[-121.80663,47.529461],[-121.80658,47.52947],[-121.80615,47.529450000000004],[-121.80608,47.52935000000001],[-121.80595,47.529180000000004],[-121.80582999999999,47.52901200000001],[-121.80574999999999,47.52895000000001],[-121.80568,47.528771000000006],[-121.80526,47.528774000000006],[-121.80503999999999,47.52877600000001],[-121.80498,47.528603000000004],[-121.80478,47.528020000000005],[-121.80472999999999,47.52787],[-121.8047,47.52784],[-121.80454,47.52768],[-121.80431,47.52724],[-121.80393,47.52686],[-121.80363,47.526651],[-121.80172,47.526],[-121.8013,47.52563000000001],[-121.80066000000001,47.525264],[-121.8002,47.52482],[-121.79975,47.524648],[-121.79876999999999,47.524798000000004],[-121.79773,47.52533000000001],[-121.79696000000001,47.525481],[-121.79624000000001,47.52533000000001],[-121.79601000000001,47.525290000000005],[-121.79535,47.52541000000001],[-121.79481000000001,47.525704000000005],[-121.79460000000002,47.52577900000001],[-121.79414000000001,47.525940000000006],[-121.79317,47.526129000000005],[-121.79213,47.526250000000005],[-121.79081000000001,47.52624],[-121.78936999999999,47.526070000000004],[-121.78676999999999,47.52547200000001],[-121.78607,47.52523000000001],[-121.78413,47.52489],[-121.78374,47.524736000000004],[-121.78356400000001,47.524581],[-121.783292,47.52444],[-121.78286999999999,47.524225],[-121.78253,47.523390000000006],[-121.78216,47.52295000000001],[-121.78228,47.522830000000006],[-121.78254,47.52273000000001],[-121.78273999999999,47.52261000000001],[-121.7829,47.52246],[-121.783076,47.522240000000004],[-121.78317,47.52203000000001],[-121.78321500000001,47.52187],[-121.78332,47.5214],[-121.78341,47.521235000000004],[-121.7836,47.52088],[-121.78370199999999,47.520700000000005],[-121.78382,47.52058],[-121.78391500000001,47.520500000000006],[-121.78407,47.520323000000005],[-121.78418,47.520154000000005],[-121.78421000000002,47.51999],[-121.78411000000001,47.51978],[-121.78401000000001,47.51956],[-121.78397,47.51935],[-121.783975,47.51917],[-121.78403,47.51897],[-121.78409,47.51882],[-121.78419000000001,47.51871200000001],[-121.78437,47.518585],[-121.78462000000002,47.518508000000004],[-121.78489,47.51848],[-121.78502999999999,47.518495],[-121.7852,47.518541],[-121.78535,47.51861],[-121.78568,47.51883],[-121.78582999999999,47.51896],[-121.78589,47.51897],[-121.785945,47.51898],[-121.78605,47.51899],[-121.78613,47.519],[-121.78616000000001,47.51901],[-121.78622000000001,47.519016],[-121.78636,47.519026],[-121.78643,47.51881],[-121.78664,47.51843],[-121.78671,47.5183],[-121.78738,47.517502],[-121.78776,47.516563],[-121.7882,47.516292],[-121.78854,47.51578],[-121.78856999999999,47.51532],[-121.78814,47.51438699999999],[-121.78827,47.514019999999995],[-121.78852,47.51371],[-121.78863,47.51343],[-121.7885,47.513110000000005],[-121.78764100000001,47.512750000000004],[-121.78758,47.51261],[-121.78794,47.51228],[-121.78961000000001,47.51192699999999],[-121.789855,47.51173],[-121.78977799999998,47.511399999999995],[-121.78984,47.51128099999999],[-121.78969000000001,47.511199999999995],[-121.7895,47.510856999999994],[-121.78924,47.510756],[-121.78889,47.510508],[-121.78912000000001,47.5105],[-121.789232,47.5105],[-121.79174400000001,47.510459999999995],[-121.79262000000001,47.51045],[-121.79414000000001,47.512510000000006],[-121.79418000000001,47.51256],[-121.795,47.512510000000006],[-121.79700500000001,47.512370000000004],[-121.79861000000001,47.512273],[-121.80694,47.511739999999996],[-121.80738,47.51173],[-121.8092,47.51127999999999],[-121.81024000000001,47.511015],[-121.80848999999999,47.5099],[-121.80771,47.50996],[-121.80686,47.510310000000004],[-121.80563,47.510058],[-121.80516,47.50926],[-121.80523,47.509170000000005],[-121.80532999999998,47.50905],[-121.80537999999999,47.508970000000005],[-121.805579,47.50888],[-121.80568,47.508700000000005],[-121.80564,47.508590000000005],[-121.80573999999999,47.5084],[-121.80605,47.508449],[-121.80686999999999,47.50818],[-121.80726000000001,47.50810800000001],[-121.80762000000001,47.507988],[-121.80833999999999,47.50787],[-121.80896,47.50811100000001],[-121.80946999999999,47.50752],[-121.80957,47.507259999999995],[-121.80935,47.506895],[-121.80954,47.5069],[-121.809658,47.506910000000005],[-121.80988099999999,47.506892],[-121.80995,47.506979],[-121.81028300000001,47.507425],[-121.81131,47.50882],[-121.81258,47.510510000000004],[-121.81265,47.5106],[-121.81285,47.5106],[-121.81301,47.51081],[-121.81333,47.51123],[-121.81424400000002,47.5124],[-121.81435,47.5124],[-121.8177,47.5124],[-121.82016,47.5124],[-121.82136999999999,47.512406],[-121.82301,47.51241],[-121.82305,47.51241],[-121.82305,47.512510000000006],[-121.82306,47.512605],[-121.82306,47.512710000000006],[-121.82306,47.512747],[-121.82307999999999,47.512879999999996],[-121.82309,47.512930000000004],[-121.82324,47.51289],[-121.82352,47.512834],[-121.82369,47.51281],[-121.82381,47.5128],[-121.82395,47.512786],[-121.82411,47.51278],[-121.82444,47.51279],[-121.82476,47.512819],[-121.82492,47.51284],[-121.82510599999999,47.51287],[-121.82529999999998,47.512916000000004],[-121.82557999999999,47.51299],[-121.82623,47.51314],[-121.82637999999999,47.513174],[-121.82656,47.51319],[-121.82667,47.51319],[-121.82677999999999,47.513169],[-121.82692,47.513131],[-121.82733999999999,47.51315],[-121.82816999999999,47.513175000000004],[-121.82829,47.51358],[-121.82836999999998,47.513693999999994],[-121.82840999999999,47.51387],[-121.82842999999998,47.514489999999995],[-121.82842999999998,47.515010000000004],[-121.82844099999998,47.5158],[-121.82844999999999,47.516023999999994],[-121.82846999999998,47.516514],[-121.82844999999999,47.516999],[-121.82844999999999,47.51723],[-121.82843999999999,47.517599],[-121.82842999999998,47.5177],[-121.82845999999999,47.51814],[-121.82851,47.518910000000005],[-121.828523,47.51969],[-121.82853099999998,47.519798],[-121.82856999999998,47.52291000000001],[-121.82856999999998,47.523590000000006],[-121.82858999999999,47.52434],[-121.82858999999999,47.524389],[-121.82857199999998,47.525000000000006],[-121.82854999999999,47.525649],[-121.82853999999999,47.526610000000005],[-121.82854999999999,47.52664],[-121.82853999999999,47.526685],[-121.82852999999999,47.526724],[-121.82851,47.52675000000001],[-121.82848999999999,47.527513000000006],[-121.82847999999998,47.52815000000001],[-121.82914,47.52814800000001],[-121.82941,47.52815000000001],[-121.82941,47.527992000000005],[-121.83066000000001,47.527997],[-121.83067,47.52837000000001],[-121.83067,47.52854000000001],[-121.83067,47.52873500000001],[-121.83073999999999,47.52873500000001],[-121.83093,47.52873800000001],[-121.83159,47.528740000000006],[-121.83233399999999,47.528740000000006],[-121.83236,47.528830000000006],[-121.83234999999999,47.529767],[-121.83233999999999,47.529849],[-121.83233599999998,47.529894],[-121.83232999999998,47.53],[-121.83233599999998,47.530074],[-121.83233999999999,47.53026],[-121.83233799999998,47.530330000000006],[-121.83233799999998,47.530733000000005],[-121.83283099999998,47.5309],[-121.83286,47.530910000000006],[-121.83324,47.531033],[-121.83359,47.53117],[-121.83389,47.531296],[-121.83441,47.531479999999995],[-121.83460000000001,47.531544],[-121.83476999999999,47.53159],[-121.83536,47.5317],[-121.83545,47.53172],[-121.83562,47.53176],[-121.83564,47.53177],[-121.83622000000001,47.53229],[-121.83639,47.532288],[-121.836554,47.532286],[-121.83667,47.53228],[-121.83756000000001,47.532270000000004],[-121.83765000000001,47.532271],[-121.83773,47.532271],[-121.83789,47.532270000000004],[-121.83799,47.532270000000004],[-121.83913,47.532250000000005],[-121.84011000000001,47.53223800000001],[-121.84061000000001,47.532230000000006],[-121.84165000000002,47.53222],[-121.84327,47.53219000000001],[-121.84359,47.532180000000004],[-121.84436000000001,47.53217000000001],[-121.84436000000001,47.532140000000005],[-121.84436000000001,47.53204],[-121.84437,47.531723],[-121.84437,47.53162],[-121.84437,47.531596],[-121.84437,47.531468],[-121.844377,47.53106],[-121.84439,47.53014],[-121.84441000000001,47.528620000000004],[-121.84637,47.52861800000001],[-121.84653,47.52864],[-121.84668,47.528670000000005],[-121.8468,47.528687],[-121.84697,47.52869200000001],[-121.84756000000002,47.52868],[-121.84762000000002,47.528690000000005],[-121.84767000000001,47.52870000000001],[-121.84854,47.528740000000006],[-121.85018,47.528800000000004],[-121.85106,47.52882],[-121.85172,47.528830000000006],[-121.85282999999998,47.52885500000001],[-121.85409,47.528890000000004],[-121.85504999999999,47.52891000000001],[-121.85756,47.52897000000001],[-121.85806999999998,47.52897000000001],[-121.85832999999998,47.528980000000004],[-121.85884999999999,47.52899000000001],[-121.85976,47.528946000000005],[-121.86027,47.528960000000005],[-121.86222000000001,47.529],[-121.86249,47.529],[-121.86259,47.529],[-121.86273999999999,47.52901000000001],[-121.86292,47.52901200000001],[-121.86296999999999,47.52901000000001],[-121.86465000000001,47.529050000000005],[-121.86491000000001,47.529050000000005],[-121.86496000000001,47.529050000000005],[-121.86509,47.52906],[-121.86525,47.52906],[-121.86556,47.529066],[-121.86556999999999,47.529050000000005],[-121.86556999999999,47.528984],[-121.865567,47.52897000000001],[-121.86556999999999,47.52884],[-121.86563,47.52631500000001],[-121.86512,47.526300000000006],[-121.86333599999999,47.52628],[-121.86296,47.526270000000004],[-121.86298,47.52534000000001],[-121.86227,47.52533000000001],[-121.86031,47.52531000000001],[-121.86026000000001,47.52404],[-121.8615,47.524179000000004],[-121.86241,47.52417500000001],[-121.86285,47.52416],[-121.86348,47.52411000000001],[-121.86362000000001,47.524100000000004],[-121.86432,47.52404],[-121.86507999999999,47.52382],[-121.86524,47.52375000000001],[-121.86552,47.523631],[-121.865519,47.52358],[-121.86569,47.523590000000006],[-121.86569999999999,47.5232],[-121.86570799999998,47.522670000000005],[-121.86572999999999,47.521770000000004],[-121.86572,47.5204],[-121.86572999999999,47.519659999999995],[-121.86569,47.51945],[-121.86569,47.51942],[-121.86569,47.51935],[-121.86575599999999,47.51781999999999],[-121.86576999999998,47.51747999999999],[-121.86577999999999,47.516855],[-121.86577999999999,47.516735000000004],[-121.86577999999999,47.516619999999996],[-121.86576999999998,47.51632],[-121.86576,47.51618],[-121.86566,47.51549],[-121.86564,47.51445],[-121.86612000000001,47.51445999999999],[-121.86622000000001,47.51445999999999],[-121.86725000000001,47.514469999999996],[-121.86819,47.514467999999994],[-121.86909,47.514469999999996],[-121.87070999999999,47.514489999999995],[-121.87231999999999,47.5145],[-121.87719,47.514517],[-121.87829999999998,47.51453],[-121.87953999999999,47.51454],[-121.87982,47.514559999999996],[-121.88007999999999,47.51460399999999],[-121.88044,47.51472],[-121.88081,47.51487399999999],[-121.88095,47.51473],[-121.8812,47.51447999999999],[-121.88235999999999,47.513259999999995],[-121.88251,47.513059999999996],[-121.88269999999999,47.51277],[-121.88278999999999,47.51254],[-121.88284999999999,47.51231800000001],[-121.88291,47.512042],[-121.88322000000001,47.51208],[-121.88336999999999,47.512086999999994],[-121.88353,47.51208],[-121.88382,47.51206],[-121.88398,47.51203],[-121.88404,47.51202],[-121.88434,47.511922],[-121.88482,47.51177],[-121.88492000000001,47.51174699999999],[-121.88512999999999,47.51171],[-121.88721000000001,47.511658],[-121.88718,47.513177],[-121.88718,47.514579999999995],[-121.88719,47.518170000000005],[-121.8872,47.52176],[-121.8873,47.529090000000004],[-121.88671,47.52902],[-121.88653,47.52901000000001],[-121.88588999999999,47.528980000000004],[-121.88560199999999,47.528980000000004],[-121.884173,47.528987],[-121.88367,47.52897000000001],[-121.88291,47.528967],[-121.88273999999998,47.52895200000001],[-121.88237999999998,47.52888],[-121.882239,47.528870000000005],[-121.88202999999999,47.528870000000005],[-121.88181,47.528870000000005],[-121.88187599999999,47.529547],[-121.8819,47.532862],[-121.88193,47.536370000000005],[-121.88230999999999,47.53638],[-121.88292999999999,47.53638],[-121.88416000000001,47.53638],[-121.88596999999999,47.53638],[-121.88743,47.53638],[-121.88866,47.53638],[-121.89012000000001,47.536353000000005],[-121.89026000000001,47.53636],[-121.8907,47.53635200000001],[-121.89072,47.536479],[-121.89072999999999,47.53656],[-121.89076,47.536798000000005],[-121.89077999999999,47.53691500000001],[-121.89081,47.536970000000004],[-121.890997,47.537219],[-121.89131,47.537527],[-121.89133,47.53755],[-121.89175,47.53793],[-121.89183,47.538042000000004],[-121.89195000000001,47.53833300000001],[-121.892,47.538520000000005],[-121.89206,47.538903000000005],[-121.89206,47.53915000000001],[-121.89202,47.539636],[-121.892,47.5401],[-121.89202,47.540695],[-121.8921,47.541551],[-121.89215,47.541819],[-121.89219,47.54197],[-121.892303,47.54218],[-121.89238999999999,47.54231000000001],[-121.89271,47.542645],[-121.89276999999998,47.54274],[-121.8929,47.542936000000005],[-121.89309,47.54314],[-121.89368,47.543631]]]},"name":"Snoqualmie"},{"boundary":{"type":"Polygon","coordinates":[[[-122.60343999999999,47.66764],[-122.60338999999999,47.667930000000005],[-122.60318,47.66831900000001],[-122.60175,47.67103],[-122.59904,47.673170000000006],[-122.59708,47.67472],[-122.59336,47.67656],[-122.58702000000001,47.679111000000006],[-122.58319,47.68159],[-122.58049,47.684689999999996],[-122.58,47.68524],[-122.57769,47.689750000000004],[-122.57711,47.69088],[-122.57598999999999,47.69621000000001],[-122.57401,47.70233000000001],[-122.57305,47.70403],[-122.57156,47.706790000000005],[-122.5688,47.70984],[-122.56754000000001,47.7109],[-122.566,47.7122],[-122.5658,47.71237000000001],[-122.56569999999999,47.712451],[-122.55942,47.71774],[-122.55667,47.72008],[-122.55542,47.721120000000006],[-122.55425000000001,47.722110000000015],[-122.55207999999999,47.72392000000001],[-122.55186,47.724070000000005],[-122.55115,47.72453000000001],[-122.55067,47.72478],[-122.55002,47.725110000000015],[-122.549068,47.72553000000001],[-122.54867300000001,47.725660000000005],[-122.54811000000001,47.725847],[-122.54716000000002,47.72610600000001],[-122.54664300000002,47.726237000000005],[-122.54536,47.72646],[-122.54385,47.72659600000001],[-122.53058,47.72654800000001],[-122.52901,47.726541000000005],[-122.51584,47.726490000000005],[-122.50388,47.72646],[-122.49713000000001,47.726440000000004],[-122.47735,47.72641600000001],[-122.44569000000001,47.726380000000006],[-122.43443,47.726366000000006],[-122.43476000000001,47.724920000000004],[-122.43516000000001,47.721540000000005],[-122.43588,47.71747],[-122.43658,47.71453],[-122.43859,47.71196],[-122.44119000000002,47.71007],[-122.44199000000002,47.70946],[-122.44416000000002,47.70784],[-122.44489000000002,47.707228],[-122.44534,47.70691000000001],[-122.44624000000002,47.70568],[-122.44797700000001,47.70271100000001],[-122.44987,47.69950000000001],[-122.450936,47.697500000000005],[-122.45286999999999,47.69389],[-122.4559,47.688246],[-122.45628,47.687642999999994],[-122.45716000000002,47.686063999999995],[-122.45818,47.684079999999994],[-122.45833999999999,47.68377],[-122.45864,47.683110000000006],[-122.4589,47.682320000000004],[-122.45904,47.68178399999999],[-122.45916000000001,47.68064],[-122.4593,47.679770000000005],[-122.45938,47.67871000000001],[-122.4595,47.67762],[-122.45968,47.676199000000004],[-122.4597,47.67427],[-122.45962000000002,47.672697],[-122.45962000000002,47.67112],[-122.45955900000001,47.66953900000001],[-122.459437,47.66848],[-122.45904,47.666470000000004],[-122.45858,47.664381],[-122.45825,47.663343000000005],[-122.4578,47.661970000000004],[-122.45709000000001,47.66001000000001],[-122.45645,47.65841],[-122.455927,47.657148],[-122.45546999999999,47.655836],[-122.45501,47.65461],[-122.45463000000001,47.65349],[-122.45445000000001,47.65265],[-122.45397,47.65082399999999],[-122.45359,47.64924],[-122.45325700000001,47.647310000000004],[-122.45310300000001,47.646268],[-122.453,47.64555000000001],[-122.45281,47.64402],[-122.45261,47.64208],[-122.45255,47.639790000000005],[-122.45255,47.63876500000001],[-122.45255,47.63811000000001],[-122.45273999999999,47.636351000000005],[-122.45293,47.634916000000004],[-122.45319500000001,47.63367],[-122.45345,47.632628000000004],[-122.45391000000001,47.63139],[-122.454171,47.630247],[-122.45435,47.629627],[-122.45449,47.62911000000001],[-122.45469000000001,47.627970000000005],[-122.45475,47.62709],[-122.45475,47.626204],[-122.45289,47.622656000000006],[-122.44953000000001,47.61765],[-122.44774000000001,47.614765],[-122.44680000000001,47.59813500000001],[-122.44770000000001,47.595560000000006],[-122.45016000000001,47.588522000000005],[-122.45373,47.577293],[-122.453818,47.57703],[-122.45395,47.576609],[-122.45667,47.575216000000005],[-122.46066000000002,47.57325],[-122.46474,47.57144099999999],[-122.47162000000002,47.56857000000001],[-122.47734,47.566500000000005],[-122.48476000000001,47.56398],[-122.48775,47.563052000000006],[-122.48913,47.562630000000006],[-122.49219000000001,47.561930000000004],[-122.49614700000001,47.561323],[-122.50166000000002,47.56102],[-122.50425000000001,47.560990000000004],[-122.50816999999999,47.56124],[-122.5126,47.56189],[-122.51473,47.562476000000004],[-122.51701000000001,47.563100000000006],[-122.52163,47.564703],[-122.5279,47.56739],[-122.52794,47.567411],[-122.52874999999999,47.56783],[-122.53036999999999,47.568678000000006],[-122.53122800000001,47.56913000000001],[-122.53162000000002,47.5694],[-122.53406000000001,47.57107],[-122.53462000000002,47.57157],[-122.5356,47.57247],[-122.53728000000001,47.574525],[-122.53829999999999,47.57631000000001],[-122.53921000000001,47.578851],[-122.53975,47.58043],[-122.54007,47.58136],[-122.5408,47.583679999999994],[-122.54165000000002,47.585695],[-122.54313,47.58845],[-122.54463000000001,47.59114],[-122.544977,47.59161],[-122.54555,47.59239000000001],[-122.54738,47.59363200000001],[-122.548568,47.59429],[-122.55086999999999,47.594590000000004],[-122.55178,47.594530000000006],[-122.553889,47.59438],[-122.55793,47.59277000000001],[-122.56126000000002,47.59118],[-122.56368,47.58992],[-122.56427000000001,47.58965],[-122.56598,47.58885],[-122.56776,47.58818],[-122.5684,47.58795],[-122.56976,47.587745],[-122.57045,47.58786599999999],[-122.5716,47.58807],[-122.57345,47.588645],[-122.57576999999998,47.58957],[-122.57589999999999,47.58963],[-122.57718,47.59025200000001],[-122.5782,47.59088],[-122.57957999999999,47.59174],[-122.58106000000001,47.59290000000001],[-122.58243499999999,47.59422],[-122.583516,47.595529000000006],[-122.5847,47.59746],[-122.58514,47.59851000000001],[-122.58542,47.599224],[-122.58586,47.601419],[-122.58679599999999,47.60781],[-122.58629,47.615950000000005],[-122.58593499999999,47.62148],[-122.58592999999999,47.62151000000001],[-122.58572999999998,47.6246],[-122.58565,47.625490000000006],[-122.58529,47.62771600000001],[-122.58528,47.62863000000001],[-122.58526,47.631295],[-122.58525,47.63236800000001],[-122.58512,47.635780000000004],[-122.585094,47.636410000000005],[-122.58506,47.637010000000004],[-122.58541,47.638250000000006],[-122.58586,47.63938],[-122.58663,47.64083],[-122.58874999999999,47.64237500000001],[-122.59169800000001,47.64448399999999],[-122.59206999999999,47.644748],[-122.593,47.64562],[-122.59405000000001,47.646612000000005],[-122.59432000000001,47.647009],[-122.59556,47.6488],[-122.59788,47.652190000000004],[-122.59836,47.65289],[-122.5988,47.65352],[-122.59975,47.65526],[-122.601749,47.658919000000004],[-122.60279999999999,47.66084],[-122.60372799999999,47.664550000000006],[-122.60343999999999,47.66764]]]},"name":"Bainbridge Island"},{"boundary":{"type":"Polygon","coordinates":[[[-122.44151000000002,47.79321600000001],[-122.44099000000001,47.79855000000001],[-122.44054000000001,47.80312],[-122.432311,47.803154],[-122.40761000000002,47.803259999999995],[-122.39938,47.8033],[-122.39849,47.803276999999994],[-122.39582,47.80321],[-122.39494,47.803191],[-122.39484,47.803197],[-122.39457,47.803215],[-122.39448,47.803219999999996],[-122.39396,47.80322399999999],[-122.39241,47.80323],[-122.39189,47.803232],[-122.39169900000002,47.803231],[-122.39161000000001,47.803228],[-122.39150000000001,47.80323],[-122.39138,47.80323],[-122.39120000000001,47.803225],[-122.39110000000001,47.80322699999999],[-122.39077999999999,47.803219999999996],[-122.3906,47.80323],[-122.39054,47.80322099999999],[-122.3905,47.803194],[-122.38982999999999,47.80321],[-122.38781,47.80325],[-122.38726000000001,47.80327],[-122.38715,47.80329],[-122.38692,47.80329],[-122.38677999999999,47.80329],[-122.38626000000001,47.80329],[-122.38604,47.803290999999994],[-122.38582,47.80329],[-122.38570999999999,47.80329],[-122.38555,47.80329],[-122.38539999999999,47.80329],[-122.38519,47.803279999999994],[-122.38472999999999,47.80328099999999],[-122.38442300000001,47.80327],[-122.3841,47.803276],[-122.38395,47.803276999999994],[-122.38382999999999,47.803273],[-122.38361,47.803276],[-122.38356999999999,47.803276999999994],[-122.38351,47.803276],[-122.38332999999999,47.803273],[-122.38327,47.803272],[-122.38292999999999,47.80327],[-122.38292999999999,47.80252],[-122.38292999999999,47.8021],[-122.38292,47.79984],[-122.38292,47.79966],[-122.38155,47.79965200000001],[-122.38149,47.79963000000001],[-122.38143,47.799620000000004],[-122.38132999999999,47.799620000000004],[-122.38129,47.799624],[-122.38125000000001,47.79963000000001],[-122.38054,47.79963000000001],[-122.3805,47.79963000000001],[-122.38023,47.79966],[-122.37995,47.799670000000006],[-122.37978999999999,47.799670000000006],[-122.37947999999999,47.799679000000005],[-122.37933999999998,47.799673000000006],[-122.3791,47.79968],[-122.37852,47.79967200000001],[-122.37827099999998,47.799670000000006],[-122.37805999999999,47.799670000000006],[-122.37774999999999,47.799670000000006],[-122.37753,47.79966],[-122.37753,47.79953000000001],[-122.37753,47.79951300000001],[-122.37753,47.799465000000005],[-122.37753,47.79945000000001],[-122.37752,47.79913000000001],[-122.37752,47.79854600000001],[-122.37753,47.79818300000001],[-122.37755,47.79787],[-122.37753,47.79569000000001],[-122.37752,47.79500200000001],[-122.37751,47.794050000000006],[-122.37745,47.79410000000001],[-122.37737999999999,47.794140000000006],[-122.37729999999999,47.794160000000005],[-122.37711300000001,47.794168000000006],[-122.37684999999999,47.794160000000005],[-122.37674999999999,47.794160000000005],[-122.37612,47.794160000000005],[-122.37590999999999,47.794160000000005],[-122.37537999999998,47.794160000000005],[-122.37485,47.794160000000005],[-122.37485,47.793788000000006],[-122.37482999999999,47.792680000000004],[-122.37482999999999,47.79231100000001],[-122.37504999999999,47.792310000000015],[-122.37565,47.792310000000015],[-122.37571999999999,47.79231100000001],[-122.37580999999999,47.792330000000014],[-122.37587999999998,47.792330000000014],[-122.37593999999999,47.79230800000001],[-122.37626,47.792330000000014],[-122.37722000000001,47.79238000000001],[-122.37754,47.79240000000001],[-122.37751,47.79223400000001],[-122.37751,47.792138000000016],[-122.3775,47.79207000000001],[-122.37749,47.791940000000004],[-122.37749,47.79175000000001],[-122.3775,47.791470000000004],[-122.37752,47.791340000000005],[-122.37752,47.79133000000001],[-122.37756,47.79123800000001],[-122.3776,47.791187],[-122.37766,47.79112000000001],[-122.37763,47.79070000000001],[-122.37755,47.7896],[-122.37754,47.789452000000004],[-122.37751,47.78904],[-122.3775,47.788340000000005],[-122.377466,47.78626],[-122.37745,47.785561],[-122.37745,47.78502],[-122.37743999999999,47.783398000000005],[-122.37743999999999,47.78286],[-122.37743999999999,47.781347],[-122.37747999999999,47.77785],[-122.37809999999999,47.77785],[-122.37893999999999,47.77786],[-122.3791,47.77786],[-122.38001,47.777843],[-122.38002999999999,47.777843],[-122.38019,47.77784],[-122.38273999999998,47.77787],[-122.38287999999999,47.77787],[-122.38696,47.77792],[-122.3882,47.777910000000006],[-122.38826,47.777910000000006],[-122.38826999999999,47.777910000000006],[-122.38855,47.7779],[-122.38944,47.777896],[-122.38963,47.77789],[-122.38981,47.77789],[-122.39013,47.777910000000006],[-122.39198,47.777930000000005],[-122.39319400000001,47.777929],[-122.39332999999999,47.777930000000005],[-122.39334,47.77801900000001],[-122.39347,47.77870000000001],[-122.393198,47.77870000000001],[-122.39321000000001,47.77877000000001],[-122.39287999999999,47.778802000000006],[-122.39292999999999,47.779452000000006],[-122.390494,47.77947],[-122.39047,47.78072],[-122.38826999999999,47.78069],[-122.38826999999999,47.782120000000006],[-122.38826999999999,47.7848],[-122.38826999999999,47.785216000000005],[-122.39079,47.785230000000006],[-122.39246,47.785243],[-122.39968,47.7854],[-122.40216000000001,47.78546],[-122.41159600000002,47.785500000000006],[-122.43222000000002,47.78558],[-122.44224000000001,47.78562],[-122.44151000000002,47.79321600000001]]]},"name":"Woodway"},{"boundary":{"type":"Polygon","coordinates":[[[-122.22796000000001,47.866730000000004],[-122.22795,47.867428999999994],[-122.22695,47.867439999999995],[-122.22698,47.867819999999995],[-122.22654,47.867819999999995],[-122.22653,47.868218000000006],[-122.22653,47.86834],[-122.22642,47.86833800000001],[-122.22642,47.868651],[-122.22657,47.868657],[-122.22656,47.869279999999996],[-122.22653,47.871039999999994],[-122.22375,47.871019999999994],[-122.22314,47.87101],[-122.22313,47.87193],[-122.22312000000001,47.87363],[-122.22326000000001,47.87363],[-122.22324,47.87431],[-122.22323,47.87463999999999],[-122.223107,47.87464099999999],[-122.22306999999999,47.878271],[-122.22287999999999,47.878268],[-122.21936000000001,47.878229],[-122.21922000000002,47.87823],[-122.21925000000002,47.878370000000004],[-122.21929000000002,47.878479999999996],[-122.21934,47.8786],[-122.21939,47.878660999999994],[-122.21946000000001,47.878730000000004],[-122.219874,47.87907],[-122.22019,47.879348],[-122.22027,47.879439999999995],[-122.22032,47.87949],[-122.22032999999999,47.879566],[-122.22032999999999,47.87963],[-122.220325,47.879690999999994],[-122.22031,47.87976],[-122.22027,47.879819999999995],[-122.22024,47.87987999999999],[-122.22017,47.87995],[-122.22009,47.88001],[-122.220017,47.88005999999999],[-122.21968000000001,47.88032],[-122.21966000000002,47.88032],[-122.21891000000001,47.879799999999996],[-122.21851000000001,47.87951],[-122.21803,47.87917],[-122.21781000000001,47.879014],[-122.21762000000003,47.878885],[-122.21752000000002,47.87883],[-122.21737,47.878749],[-122.21729000000002,47.878706],[-122.21716000000002,47.87863],[-122.21710000000002,47.878612000000004],[-122.21703000000001,47.87858],[-122.21685000000001,47.878510000000006],[-122.21665000000002,47.878448],[-122.21636000000001,47.87836],[-122.21604,47.8783],[-122.21583,47.87826],[-122.21558,47.87822],[-122.21511000000001,47.878189],[-122.21509,47.878190000000004],[-122.21321000000002,47.878181],[-122.21294,47.878181],[-122.21221000000001,47.878181],[-122.21174,47.878181],[-122.21101000000002,47.878181],[-122.21033,47.878181],[-122.20986,47.878181],[-122.20956000000001,47.87818],[-122.20746000000001,47.87821],[-122.20686,47.878178000000005],[-122.20681,47.878178000000005],[-122.20667,47.878170000000004],[-122.206,47.87816],[-122.20452000000002,47.878142000000004],[-122.20418000000001,47.878141],[-122.20398,47.87814],[-122.20351000000001,47.87813200000001],[-122.20339,47.878130000000006],[-122.20305,47.878126],[-122.20293,47.87812],[-122.20293,47.87828],[-122.19984,47.878277],[-122.19883999999999,47.878231],[-122.19881,47.87823],[-122.19779,47.8782],[-122.19681,47.87818],[-122.19572999999998,47.878190000000004],[-122.19537999999999,47.878183],[-122.19344,47.878150000000005],[-122.19336999999999,47.878150000000005],[-122.19269999999999,47.878150000000005],[-122.19198,47.87814],[-122.19172999999999,47.87814],[-122.18532999999998,47.878150000000005],[-122.18125,47.87797],[-122.18006,47.877979999999994],[-122.17874999999998,47.877976],[-122.17656999999998,47.87796099999999],[-122.17524999999999,47.877939999999995],[-122.17463,47.87795],[-122.17456999999999,47.87795],[-122.17326,47.87795],[-122.17320099999999,47.87795],[-122.17062999999999,47.87795],[-122.16951,47.877869999999994],[-122.16928,47.87791],[-122.16605,47.877889999999994],[-122.16596999999999,47.877758],[-122.16608,47.87743999999999],[-122.16614,47.87723],[-122.166174,47.877159999999996],[-122.16621,47.877098999999994],[-122.16631,47.876973],[-122.16642999999999,47.87685999999999],[-122.16651,47.87679],[-122.16659,47.876718000000004],[-122.16675,47.876615],[-122.16699,47.876532000000005],[-122.16712000000001,47.8765],[-122.16719,47.876479999999994],[-122.16758,47.87639],[-122.16768,47.87637],[-122.16791,47.876310000000004],[-122.16799999999999,47.876276],[-122.16808999999999,47.876242],[-122.1682,47.876191],[-122.16822,47.87617],[-122.16829,47.87613],[-122.16842999999999,47.876062],[-122.16856,47.87599],[-122.168641,47.87594],[-122.16896999999999,47.8757],[-122.16919,47.875530000000005],[-122.16946999999999,47.875319000000005],[-122.17005999999999,47.874869999999994],[-122.17030999999999,47.8747],[-122.17032999999998,47.87468299999999],[-122.17067999999999,47.87445999999999],[-122.17081999999999,47.874359999999996],[-122.17105099999999,47.874195],[-122.17174999999999,47.873753],[-122.17199699999999,47.87357],[-122.17227999999999,47.87341],[-122.17258499999998,47.87321],[-122.17286999999997,47.87302],[-122.17289999999998,47.873],[-122.17300999999999,47.872910000000005],[-122.17313999999999,47.8728],[-122.17349999999999,47.87245],[-122.17375999999999,47.872203],[-122.17396,47.87202],[-122.17414,47.871849999999995],[-122.17442,47.871635],[-122.17466,47.87145999999999],[-122.17469999999999,47.87143],[-122.17505999999999,47.871117],[-122.17522,47.87093],[-122.17526999999998,47.87085999999999],[-122.17533999999998,47.87075],[-122.17546099999998,47.87043],[-122.17550999999999,47.870262],[-122.17558999999999,47.86985],[-122.17566,47.869510000000005],[-122.17569999999998,47.86924],[-122.17579999999998,47.868900000000004],[-122.17586299999999,47.868730000000006],[-122.17592999999998,47.868549],[-122.17608999999999,47.868210000000005],[-122.17621,47.868010000000005],[-122.17629999999998,47.867889999999996],[-122.17647999999998,47.86767999999999],[-122.17678999999998,47.86734],[-122.17692999999998,47.86716],[-122.17703999999999,47.867011],[-122.17711,47.8669],[-122.17722,47.86676],[-122.17734999999999,47.866572000000005],[-122.17754,47.86661],[-122.17862999999998,47.86472],[-122.17907999999998,47.86416],[-122.17948999999999,47.86387],[-122.18083999999999,47.862750000000005],[-122.18092,47.86264],[-122.18122000000001,47.862170000000006],[-122.18154,47.86197],[-122.18408,47.86135],[-122.185159,47.86097],[-122.18556,47.860774],[-122.18579499999998,47.8607],[-122.18606999999999,47.860626999999994],[-122.186045,47.86044],[-122.18618,47.85998399999999],[-122.18625,47.859812],[-122.18632999999998,47.859629999999996],[-122.18647999999999,47.859303],[-122.18662,47.858959999999996],[-122.18676999999998,47.85863],[-122.18699,47.858121],[-122.18702,47.85805],[-122.18705,47.85793999999999],[-122.18708,47.85778499999999],[-122.18708,47.85762999999999],[-122.18705,47.857319999999994],[-122.18703,47.857189999999996],[-122.18701,47.856919999999995],[-122.18699,47.85633],[-122.18696999999999,47.85605999999999],[-122.18696999999999,47.85595],[-122.18696999999999,47.855799999999995],[-122.18699,47.855639999999994],[-122.18701,47.8555],[-122.18706,47.855239999999995],[-122.187101,47.85503],[-122.18711,47.85499899999999],[-122.18711,47.854969999999994],[-122.1872,47.854589999999995],[-122.18725,47.85433],[-122.18732,47.853939999999994],[-122.18742999999999,47.853429999999996],[-122.18752,47.853049999999996],[-122.187585,47.85273],[-122.1876,47.85259],[-122.18761,47.85255],[-122.18762000000001,47.85251],[-122.18763,47.85245],[-122.18773999999999,47.85193099999999],[-122.18778999999999,47.851769999999995],[-122.18778999999999,47.85161999999999],[-122.187799,47.85145999999999],[-122.1878,47.85115],[-122.18777999999999,47.85105599999999],[-122.18775,47.85091],[-122.18765,47.85057],[-122.18757,47.85035],[-122.1875,47.850199999999994],[-122.18742999999999,47.850049999999996],[-122.187216,47.84967999999999],[-122.187,47.849325],[-122.18691,47.84917],[-122.18682999999999,47.84901],[-122.19041,47.84916],[-122.19321000000001,47.84928599999999],[-122.1939,47.84931],[-122.194173,47.84931],[-122.19606,47.849399999999996],[-122.19655,47.84942399999999],[-122.19739,47.84943],[-122.19794,47.849439999999994],[-122.199,47.84945],[-122.19922000000001,47.84945],[-122.19936,47.84945],[-122.200112,47.84945],[-122.20045,47.849502],[-122.20067,47.849593],[-122.20089,47.849554],[-122.20194000000001,47.84937],[-122.20292,47.849399999999996],[-122.20332,47.84945999999999],[-122.20421200000001,47.84946099999999],[-122.20417,47.84794899999999],[-122.20416000000002,47.84779999999999],[-122.20411000000001,47.84572],[-122.20729000000001,47.845710000000004],[-122.20723000000001,47.843759999999996],[-122.20783,47.843759999999996],[-122.20785000000001,47.84415],[-122.20892,47.844139999999996],[-122.209,47.84516],[-122.20943,47.84535],[-122.20951000000001,47.845388],[-122.20962000000002,47.84543],[-122.20941,47.84554],[-122.20935,47.845566],[-122.20926000000001,47.84561],[-122.20923,47.84562],[-122.20915000000001,47.845659999999995],[-122.20913,47.84567],[-122.20933,47.84572],[-122.21088,47.846599999999995],[-122.21190000000001,47.84646699999999],[-122.21256000000001,47.84646399999999],[-122.21254,47.845599],[-122.21545,47.84568099999999],[-122.21557,47.845679999999994],[-122.21592000000001,47.84568699999999],[-122.21604,47.84568899999999],[-122.21603,47.84562],[-122.21600400000001,47.845425],[-122.21600000000001,47.84536],[-122.21597,47.845150000000004],[-122.21589,47.844539999999995],[-122.21587,47.844339999999995],[-122.21576,47.8435],[-122.21573,47.84319],[-122.2155,47.84112],[-122.21535,47.83994],[-122.21533,47.839859999999994],[-122.2153,47.839756],[-122.21528900000001,47.839712000000006],[-122.21521000000001,47.839479999999995],[-122.21514,47.839324],[-122.21506000000001,47.83917],[-122.21492300000003,47.838950000000004],[-122.21477,47.83874],[-122.21454000000001,47.838451],[-122.21442000000002,47.838330000000006],[-122.21439000000001,47.838300000000004],[-122.220818,47.83831800000001],[-122.22296999999999,47.838327],[-122.22296999999999,47.8387],[-122.22296999999999,47.83896],[-122.22296999999999,47.83902],[-122.22299,47.83999],[-122.22299,47.840259999999994],[-122.22299,47.84032],[-122.22306,47.84155],[-122.22306999999999,47.84163999999999],[-122.223158,47.84315],[-122.22317,47.84653],[-122.22317,47.847505],[-122.22264,47.847519999999996],[-122.22236999999998,47.847519999999996],[-122.22203999999999,47.847516],[-122.22206,47.847553],[-122.22209,47.847590999999994],[-122.22218,47.847739999999995],[-122.22221,47.84777999999999],[-122.22224,47.84785699999999],[-122.22229999999999,47.847987999999994],[-122.22229999999999,47.848479999999995],[-122.22227,47.84877],[-122.22221,47.848910000000004],[-122.22216,47.84901],[-122.22209,47.849148],[-122.22207999999999,47.84931],[-122.22206,47.84935],[-122.22205,47.84939],[-122.222394,47.849376],[-122.22243999999999,47.84937],[-122.22304,47.84936],[-122.2232,47.84936],[-122.22342400000001,47.84936],[-122.22376799999999,47.84935],[-122.22394,47.84935],[-122.22403,47.84935],[-122.22402000000001,47.85266699999999],[-122.22402000000001,47.852979999999995],[-122.22551,47.852959999999996],[-122.227835,47.852919],[-122.22784,47.852965],[-122.22782000000001,47.85318399999999],[-122.22782000000001,47.85325999999999],[-122.22785400000001,47.85388399999999],[-122.22786,47.85415999999999],[-122.22786,47.85423999999999],[-122.22559,47.854299999999995],[-122.22551,47.854299999999995],[-122.22502,47.854318],[-122.22502999999999,47.85522099999999],[-122.22552,47.855215],[-122.22561,47.85521],[-122.22787,47.85519],[-122.22787,47.85537],[-122.22787,47.855577],[-122.22795900000001,47.85603],[-122.22795,47.85621],[-122.22795,47.85637],[-122.22794,47.856519],[-122.22794,47.85656399999999],[-122.22794,47.85668799999999],[-122.22794,47.85719999999999],[-122.22794,47.857369999999996],[-122.22794,47.85775999999999],[-122.22795,47.858953],[-122.22795,47.85935],[-122.22795,47.86023],[-122.22796000000001,47.862885],[-122.22796000000001,47.86377],[-122.22796000000001,47.865063],[-122.22796000000001,47.866730000000004]]]},"name":"Mill Creek"},{"boundary":{"type":"Polygon","coordinates":[[[-122.42952000000001,47.82761],[-122.42295,47.83852],[-122.41205000000001,47.85061999999999],[-122.39845,47.86132],[-122.39805,47.861619999999995],[-122.38991,47.86132],[-122.36551,47.86042],[-122.35736999999999,47.860121],[-122.35336999999998,47.85997],[-122.34137,47.859532],[-122.33936999999999,47.85945999999999],[-122.33738,47.859379999999994],[-122.33701,47.85937],[-122.33591,47.859331],[-122.33554,47.859318],[-122.33534999999999,47.859318],[-122.33476999999999,47.859318],[-122.33457,47.85932],[-122.33384,47.859318],[-122.33382999999999,47.85932],[-122.33159,47.85923999999999],[-122.33084,47.85921999999999],[-122.32970999999999,47.85919],[-122.32704,47.85912],[-122.32638999999999,47.85876],[-122.32614,47.858619999999995],[-122.32553999999999,47.858019999999996],[-122.32543999999999,47.857699999999994],[-122.32524,47.857118],[-122.32527599999999,47.85673],[-122.32529999999998,47.856399999999994],[-122.32529,47.8563],[-122.32526999999999,47.856019999999994],[-122.32526,47.85592],[-122.32525,47.855869999999996],[-122.32524,47.855799999999995],[-122.32522999999999,47.855705],[-122.32522,47.85552],[-122.32521,47.85541],[-122.32518999999999,47.855308],[-122.325193,47.85527999999999],[-122.32518999999999,47.855228],[-122.32517999999999,47.855079999999994],[-122.32517999999999,47.85503],[-122.32516,47.85475999999999],[-122.32513999999999,47.85448499999999],[-122.32512,47.854209999999995],[-122.32509999999999,47.85399999999999],[-122.32507999999999,47.85374399999999],[-122.32506,47.853429999999996],[-122.32504999999999,47.853289999999994],[-122.32502,47.853049999999996],[-122.32499,47.852605999999994],[-122.32498,47.852528],[-122.32496,47.8523],[-122.32492,47.85192099999999],[-122.32492,47.85184799999999],[-122.3249,47.851589999999995],[-122.32489,47.85150399999999],[-122.32488,47.85133999999999],[-122.32486,47.85123299999999],[-122.32485,47.85114299999999],[-122.32485,47.85108999999999],[-122.32484,47.850939999999994],[-122.324833,47.85089399999999],[-122.32482,47.850789999999996],[-122.32481,47.85059999999999],[-122.3248,47.85048999999999],[-122.3248,47.85039],[-122.32479,47.850339999999996],[-122.32479,47.85021],[-122.32477999999999,47.850159999999995],[-122.32477999999999,47.850089999999994],[-122.32479,47.849869999999996],[-122.3248,47.84979],[-122.3248,47.849619999999994],[-122.32482,47.8491],[-122.32482999999999,47.84892],[-122.32497,47.848943],[-122.32513999999999,47.848966999999995],[-122.32540999999999,47.849025],[-122.32554999999999,47.849059999999994],[-122.32580999999999,47.84911],[-122.32587999999998,47.84912],[-122.32623,47.849193],[-122.32632999999998,47.849219999999995],[-122.32663,47.84927999999999],[-122.32684799999998,47.849329],[-122.32706999999999,47.849379],[-122.32717099999999,47.849399999999996],[-122.32726000000001,47.849439999999994],[-122.32735,47.849489999999996],[-122.32742,47.84954],[-122.32746999999999,47.849599999999995],[-122.32749,47.849633],[-122.32751,47.849669999999996],[-122.32754,47.84972],[-122.32755,47.84975],[-122.32756,47.84977],[-122.32758,47.84983],[-122.32759,47.84985999999999],[-122.32763,47.84923],[-122.32766000000001,47.84834],[-122.33046999999999,47.848372000000005],[-122.33046999999999,47.848279999999995],[-122.33046999999999,47.848109],[-122.33046999999999,47.848079999999996],[-122.33046999999999,47.848],[-122.33046999999999,47.84797999999999],[-122.33046999999999,47.84797],[-122.33046999999999,47.84793],[-122.33046999999999,47.847919999999995],[-122.33046999999999,47.847804999999994],[-122.33046999999999,47.847739999999995],[-122.33049,47.847669999999994],[-122.33046,47.84753],[-122.33048,47.847289999999994],[-122.33046999999999,47.84715],[-122.33048,47.84692],[-122.33041,47.84654],[-122.33041,47.84647999999999],[-122.33044,47.84516],[-122.33044,47.84487999999999],[-122.328694,47.84483999999999],[-122.32798,47.844832],[-122.32646,47.844789999999996],[-122.32571999999999,47.84477],[-122.32524,47.844753999999995],[-122.32493,47.844742999999994],[-122.32485,47.844728999999994],[-122.32376999999998,47.84473],[-122.32117,47.84475],[-122.32006,47.84475],[-122.31967,47.844739999999994],[-122.31936,47.844759999999994],[-122.31948,47.84459],[-122.31961500000001,47.844379999999994],[-122.31962800000001,47.84435],[-122.31967,47.844289999999994],[-122.31968,47.844269999999995],[-122.31983,47.8441],[-122.31991000000001,47.844035],[-122.32005,47.84393],[-122.32006999999999,47.843914],[-122.3202,47.84383],[-122.32028,47.84379],[-122.32043999999999,47.84371],[-122.32066999999999,47.843619999999994],[-122.32100799999999,47.843489999999996],[-122.32121000000001,47.843399999999995],[-122.32135,47.84333],[-122.32146999999999,47.843256999999994],[-122.321495,47.843239999999994],[-122.32163,47.84314],[-122.3219,47.8429],[-122.32206999999998,47.842742],[-122.32217899999999,47.842639999999996],[-122.32279999999999,47.84205],[-122.32292,47.84193],[-122.32301,47.84184199999999],[-122.32306999999999,47.841792],[-122.32329999999999,47.84159],[-122.32343699999998,47.841469999999994],[-122.32354,47.841379999999994],[-122.32359,47.841319999999996],[-122.32369,47.84119999999999],[-122.32377999999999,47.84105999999999],[-122.32386999999999,47.84091],[-122.32388999999999,47.84088899999999],[-122.323924,47.840819999999994],[-122.32394,47.84080099999999],[-122.32403,47.84062899999999],[-122.32425,47.840272],[-122.32454,47.83979],[-122.32464,47.839633],[-122.32482999999999,47.839237],[-122.32487799999998,47.83896],[-122.3249,47.83879],[-122.324968,47.837979999999995],[-122.32498,47.83767999999999],[-122.32499999999999,47.83752],[-122.32500499999999,47.837455],[-122.32502999999998,47.837162],[-122.32506999999998,47.83665],[-122.32507999999999,47.836368],[-122.32508999999999,47.836259999999996],[-122.32512999999999,47.83597],[-122.32513999999999,47.835937],[-122.32516999999999,47.83583],[-122.32529,47.83561],[-122.32539999999999,47.835474],[-122.325514,47.835342000000004],[-122.32556,47.835300000000004],[-122.32566,47.83522],[-122.32588999999999,47.83505],[-122.32616,47.8349],[-122.32618,47.83487999999999],[-122.32652,47.8347],[-122.32697999999999,47.83445],[-122.32725,47.83431],[-122.32728,47.83429699999999],[-122.32762000000001,47.83411],[-122.32785,47.83396],[-122.32796,47.83389],[-122.32802,47.83385],[-122.32829,47.83367],[-122.32852999999999,47.833479999999994],[-122.32857999999999,47.833439999999996],[-122.32869,47.83335],[-122.32902999999999,47.83305],[-122.32912999999999,47.832950000000004],[-122.329227,47.83285],[-122.32941,47.832653],[-122.32963,47.83238],[-122.32997999999999,47.831919],[-122.33024,47.831559999999996],[-122.33042,47.83132],[-122.33059,47.831087999999994],[-122.33068,47.83099],[-122.33081,47.830839999999995],[-122.33094,47.830706],[-122.33095,47.830690999999995],[-122.33104,47.830619999999996],[-122.33106000000001,47.83061],[-122.33115000000001,47.83055],[-122.33120600000001,47.830510000000004],[-122.331351,47.83044099999999],[-122.33145,47.830402],[-122.33153,47.83037],[-122.33155000000001,47.83036],[-122.33161300000002,47.830345],[-122.33163,47.83034],[-122.331799,47.8303],[-122.33186,47.83029],[-122.33195,47.83027],[-122.33202999999999,47.830265],[-122.33212999999999,47.830258],[-122.33223,47.830258],[-122.33232999999998,47.83026699999999],[-122.33242,47.830276],[-122.33266,47.830330000000004],[-122.33274999999999,47.83036],[-122.33283999999999,47.8304],[-122.33297199999998,47.83045],[-122.33322000000001,47.83058],[-122.333769,47.83085],[-122.3339,47.830912000000005],[-122.334,47.83095],[-122.33418,47.83101],[-122.33429000000001,47.83103],[-122.3345,47.83107999999999],[-122.33481,47.83113],[-122.33512999999999,47.83114],[-122.33518,47.83114],[-122.335443,47.83114],[-122.3355,47.83114],[-122.33556,47.831139],[-122.33586,47.831143],[-122.33595,47.83115],[-122.33609,47.83116],[-122.33621000000001,47.831179999999996],[-122.33641,47.83123],[-122.3365,47.831253999999994],[-122.33668,47.831289999999996],[-122.33676,47.831308],[-122.33685799999999,47.83134],[-122.33718,47.83140099999999],[-122.337489,47.831469999999996],[-122.33760000000001,47.831489999999995],[-122.33776,47.831540999999994],[-122.33774,47.83125],[-122.33774,47.831219],[-122.33775,47.830738000000004],[-122.33774,47.83056],[-122.33774,47.83038],[-122.33774,47.830255],[-122.33774,47.8301],[-122.33773,47.83002],[-122.33773,47.829934],[-122.33773,47.82932],[-122.33773,47.829150000000006],[-122.33773,47.829059],[-122.337719,47.828798000000006],[-122.337711,47.82870200000001],[-122.33769000000001,47.828450000000004],[-122.33765000000001,47.828100000000006],[-122.33761200000001,47.82776],[-122.33759,47.82766099999999],[-122.33749,47.82743],[-122.33741,47.827296999999994],[-122.33724000000001,47.827101],[-122.33717,47.82705],[-122.33711000000001,47.827],[-122.33694,47.826859999999996],[-122.3368,47.82677],[-122.33639,47.826496],[-122.3361,47.82625],[-122.33605,47.826170000000005],[-122.33599,47.82606],[-122.33597999999999,47.82604],[-122.33592999999999,47.82592],[-122.335912,47.82585],[-122.33591,47.82578],[-122.3359,47.8254],[-122.3359,47.82518],[-122.3359,47.825026],[-122.3359,47.82487],[-122.3359,47.824],[-122.3359,47.82396],[-122.3359,47.82366],[-122.3359,47.82349],[-122.3359,47.82305],[-122.3359,47.823],[-122.3359,47.82283],[-122.3359,47.822694],[-122.3359,47.82245],[-122.33588999999999,47.82228],[-122.3359,47.82215000000001],[-122.3359,47.822072000000006],[-122.3359,47.82185],[-122.3359,47.821799999999996],[-122.33729000000001,47.82181],[-122.33729000000001,47.821472],[-122.33725000000001,47.82134],[-122.33725000000001,47.821110000000004],[-122.33723,47.81963],[-122.33714,47.81963],[-122.33714,47.818734],[-122.33689,47.81873],[-122.33686,47.81873],[-122.33633999999999,47.818734],[-122.33613,47.81873],[-122.33587999999999,47.81873],[-122.33586999999999,47.81861],[-122.33586,47.81825],[-122.33585,47.818130000000004],[-122.33586,47.81807],[-122.33586,47.81788999999999],[-122.33586999999999,47.81783999999999],[-122.33586999999999,47.81773],[-122.33586,47.81739699999999],[-122.33586,47.81728999999999],[-122.33586,47.81722599999999],[-122.33586,47.81704499999999],[-122.33586,47.816979999999994],[-122.33585,47.81681999999999],[-122.33583999999999,47.816689999999994],[-122.33585,47.81634],[-122.33585,47.816179999999996],[-122.33585,47.816145],[-122.33585,47.81603],[-122.33585,47.81599],[-122.33585,47.81595],[-122.33585,47.815836],[-122.33585,47.815799999999996],[-122.33585,47.815599999999996],[-122.33583999999999,47.81501],[-122.33583999999999,47.814809999999994],[-122.33582999999999,47.814699999999995],[-122.33582,47.81439999999999],[-122.33582,47.81435999999999],[-122.33582,47.814249999999994],[-122.335822,47.813869999999994],[-122.33582,47.81353],[-122.33581,47.813179999999996],[-122.33581,47.81274],[-122.33581,47.81265],[-122.33579999999999,47.812365],[-122.33579999999999,47.812],[-122.33579999999999,47.81163299999999],[-122.33578999999999,47.811418999999994],[-122.33578999999999,47.811152],[-122.33578999999999,47.81093],[-122.33578999999999,47.81057],[-122.33523,47.81057],[-122.33518,47.81057],[-122.33481,47.810579999999995],[-122.33426000000001,47.81057],[-122.333912,47.810559999999995],[-122.33357,47.810562],[-122.33301,47.810562],[-122.33286999999999,47.81056099999999],[-122.33245,47.810558],[-122.33229999999999,47.810559999999995],[-122.33212999999999,47.810555],[-122.33159,47.81055],[-122.33141,47.81054699999999],[-122.33117,47.810545],[-122.33045,47.810539999999996],[-122.33039,47.810539999999996],[-122.33021000000001,47.81053],[-122.329955,47.810539999999996],[-122.32986999999999,47.810539999999996],[-122.32961,47.810539999999996],[-122.32934999999999,47.810539999999996],[-122.32926,47.810539999999996],[-122.32922,47.80968599999999],[-122.32922,47.809593],[-122.32885999999999,47.80959],[-122.32879999999999,47.80959],[-122.32878399999998,47.80936],[-122.32874999999999,47.8087],[-122.32866999999999,47.808696],[-122.32845999999999,47.808695],[-122.32837999999998,47.808695],[-122.32828699999999,47.80869],[-122.32818999999999,47.80869],[-122.32800999999999,47.808685],[-122.32762000000001,47.808688999999994],[-122.32742999999999,47.80869],[-122.32742999999999,47.80878],[-122.32744,47.80905],[-122.32744,47.80914],[-122.32745,47.809239999999996],[-122.32745,47.809439999999995],[-122.32716,47.809419],[-122.32669,47.809418],[-122.32645,47.809419999999996],[-122.32643999999999,47.80912],[-122.32643999999999,47.80843],[-122.32552999999999,47.808398000000004],[-122.32566,47.808215000000004],[-122.32585999999999,47.807939999999995],[-122.326,47.80775],[-122.326454,47.80712],[-122.32665,47.806839999999994],[-122.32717,47.80612],[-122.32873999999998,47.80394],[-122.32909,47.803459999999994],[-122.32926,47.80321],[-122.32982999999999,47.80279],[-122.32972999999998,47.802578000000004],[-122.32986999999999,47.80237],[-122.33173,47.79965000000001],[-122.33161000000001,47.79965200000001],[-122.33139,47.79965000000001],[-122.33077999999999,47.79963000000001],[-122.33051,47.799620000000004],[-122.33036999999999,47.79963000000001],[-122.33025,47.799628000000006],[-122.33014,47.799627],[-122.33014,47.79910000000001],[-122.33013,47.79857000000001],[-122.33013,47.79802000000001],[-122.330122,47.796890000000005],[-122.33012000000001,47.79630000000001],[-122.33014,47.79597000000001],[-122.33015,47.795660000000005],[-122.33015,47.79555000000001],[-122.33025,47.79502000000001],[-122.33042,47.794547],[-122.330574,47.79413400000001],[-122.33067199999999,47.79413500000001],[-122.33105,47.794140000000006],[-122.33119,47.794140000000006],[-122.33141,47.794140000000006],[-122.33189,47.79415000000001],[-122.33215,47.794160000000005],[-122.33232,47.79415000000001],[-122.33259,47.794160000000005],[-122.33283999999999,47.794160000000005],[-122.33282,47.79274000000001],[-122.33279999999999,47.792330000000014],[-122.33272799999999,47.792330000000014],[-122.33218,47.792330000000014],[-122.33199,47.79232000000001],[-122.33191000000001,47.792330000000014],[-122.33179,47.792330000000014],[-122.33165000000001,47.792330000000014],[-122.33156000000001,47.79232000000001],[-122.33184,47.79201800000001],[-122.33188,47.79191900000001],[-122.33246,47.790470000000006],[-122.33266,47.78999],[-122.33281699999999,47.78966],[-122.332827,47.78964],[-122.332964,47.789320000000004],[-122.33308,47.788979000000005],[-122.33318,47.788638000000006],[-122.3332,47.788520000000005],[-122.33327,47.788140000000006],[-122.3333,47.78757],[-122.33332999999999,47.78714],[-122.33333999999999,47.78652],[-122.33336,47.78627],[-122.33336999999999,47.786100000000005],[-122.33339,47.785924],[-122.33339,47.78589],[-122.33341,47.78571000000001],[-122.33243999999999,47.785700000000006],[-122.33198,47.785700000000006],[-122.33176,47.78522],[-122.33142000000001,47.78447],[-122.33128,47.784150000000004],[-122.33116000000001,47.7839],[-122.33129300000002,47.78381],[-122.331441,47.78372],[-122.33165000000001,47.78354],[-122.33183,47.78327],[-122.33187099999999,47.78284],[-122.331691,47.7822],[-122.33116000000001,47.781703],[-122.33072,47.78147],[-122.33028,47.78138],[-122.32969,47.781259999999996],[-122.32924,47.780743],[-122.32914,47.78062],[-122.32858999999999,47.77998],[-122.32802999999998,47.77933000000001],[-122.32797,47.77926],[-122.32791,47.77919000000001],[-122.32746999999999,47.778676000000004],[-122.32694,47.77807000000001],[-122.327304,47.77765],[-122.327334,47.77765],[-122.32763,47.777632000000004],[-122.32832999999998,47.777590000000004],[-122.32994,47.77762],[-122.32995,47.77762],[-122.33,47.77762],[-122.33239999999999,47.77764],[-122.33355,47.77767],[-122.33532,47.777770000000004],[-122.33536,47.777770000000004],[-122.33539999999999,47.777770000000004],[-122.3373,47.77778],[-122.33736,47.77778],[-122.337539,47.77778],[-122.33760000000001,47.77778],[-122.33784,47.77778],[-122.33815,47.77778],[-122.33823,47.77778],[-122.33824,47.77778],[-122.33879999999999,47.77778],[-122.33964,47.77778],[-122.3397,47.77778],[-122.340317,47.77778],[-122.34036,47.777785],[-122.34084,47.777785],[-122.34089,47.777785],[-122.34094,47.77779],[-122.34176000000001,47.77779],[-122.34183,47.77779],[-122.34189,47.77779],[-122.34615000000001,47.777794],[-122.34622000000002,47.777794],[-122.34629000000001,47.777794],[-122.34631,47.777794],[-122.34633,47.77779],[-122.34764000000001,47.77779],[-122.34771,47.77779],[-122.34778,47.77779],[-122.34986,47.777785],[-122.34994,47.777785],[-122.35091,47.77778],[-122.35149,47.77778],[-122.35181,47.77778],[-122.35234999999999,47.77778],[-122.35262999999999,47.77778],[-122.35265,47.77778],[-122.35271999999999,47.77778],[-122.35367,47.777770000000004],[-122.35401,47.777770000000004],[-122.35486,47.777770000000004],[-122.35494,47.777770000000004],[-122.35495,47.777770000000004],[-122.35501,47.777770000000004],[-122.35542,47.777770000000004],[-122.35548999999999,47.777770000000004],[-122.35594999999999,47.777766],[-122.356209,47.777766],[-122.35646999999999,47.777766],[-122.35652,47.777766],[-122.35803999999999,47.777766],[-122.358111,47.777766],[-122.35866999999999,47.777766],[-122.35887999999998,47.777766],[-122.36065,47.777767],[-122.36133,47.777764],[-122.36162000000002,47.77778],[-122.36289,47.777750000000005],[-122.36298,47.77774],[-122.3631,47.777730000000005],[-122.36401000000001,47.77772],[-122.36421400000002,47.777722000000004],[-122.36427,47.777721],[-122.36439,47.777716000000005],[-122.36462000000002,47.777716000000005],[-122.36496000000001,47.777730000000005],[-122.36519,47.77774],[-122.366685,47.77774],[-122.36691400000001,47.777750000000005],[-122.367089,47.777750000000005],[-122.36799,47.777795000000005],[-122.36822000000001,47.777798000000004],[-122.36846999999999,47.777794],[-122.36891,47.777764],[-122.36921000000001,47.777750000000005],[-122.36958,47.777755000000006],[-122.36971,47.777753000000004],[-122.369841,47.77775200000001],[-122.36989,47.777761],[-122.36994,47.77778],[-122.36998,47.777801],[-122.37001,47.77783],[-122.37003999999999,47.77787],[-122.37003999999999,47.77788699999999],[-122.37003999999999,47.7779],[-122.37033999999998,47.77784],[-122.37058999999999,47.77783],[-122.37207999999998,47.777801],[-122.37212999999998,47.777801],[-122.37312,47.77781],[-122.37424,47.77782],[-122.37429,47.77782],[-122.374413,47.77782],[-122.37544999999999,47.77783],[-122.37554099999998,47.77783],[-122.37722000000001,47.777846],[-122.37747999999999,47.77785],[-122.37743999999999,47.781347],[-122.37743999999999,47.78286],[-122.37743999999999,47.783398000000005],[-122.37745,47.78502],[-122.37745,47.785561],[-122.377466,47.78626],[-122.3775,47.788340000000005],[-122.37751,47.78904],[-122.37754,47.789452000000004],[-122.37755,47.7896],[-122.37763,47.79070000000001],[-122.37766,47.79112000000001],[-122.3776,47.791187],[-122.37756,47.79123800000001],[-122.37752,47.79133000000001],[-122.37752,47.791340000000005],[-122.3775,47.791470000000004],[-122.37749,47.79175000000001],[-122.37749,47.791940000000004],[-122.3775,47.79207000000001],[-122.37751,47.792138000000016],[-122.37751,47.79223400000001],[-122.37754,47.79240000000001],[-122.37722000000001,47.79238000000001],[-122.37626,47.792330000000014],[-122.37593999999999,47.79230800000001],[-122.37587999999998,47.792330000000014],[-122.37580999999999,47.792330000000014],[-122.37571999999999,47.79231100000001],[-122.37565,47.792310000000015],[-122.37504999999999,47.792310000000015],[-122.37482999999999,47.79231100000001],[-122.37482999999999,47.792680000000004],[-122.37485,47.793788000000006],[-122.37485,47.794160000000005],[-122.37537999999998,47.794160000000005],[-122.37590999999999,47.794160000000005],[-122.37612,47.794160000000005],[-122.37674999999999,47.794160000000005],[-122.37684999999999,47.794160000000005],[-122.37711300000001,47.794168000000006],[-122.37729999999999,47.794160000000005],[-122.37737999999999,47.794140000000006],[-122.37745,47.79410000000001],[-122.37751,47.794050000000006],[-122.37752,47.79500200000001],[-122.37753,47.79569000000001],[-122.37755,47.79787],[-122.37753,47.79818300000001],[-122.37752,47.79854600000001],[-122.37752,47.79913000000001],[-122.37753,47.79945000000001],[-122.37753,47.799465000000005],[-122.37753,47.79951300000001],[-122.37753,47.79953000000001],[-122.37753,47.79966],[-122.37774999999999,47.799670000000006],[-122.37805999999999,47.799670000000006],[-122.37827099999998,47.799670000000006],[-122.37852,47.79967200000001],[-122.3791,47.79968],[-122.37933999999998,47.799673000000006],[-122.37947999999999,47.799679000000005],[-122.37978999999999,47.799670000000006],[-122.37995,47.799670000000006],[-122.38023,47.79966],[-122.3805,47.79963000000001],[-122.38054,47.79963000000001],[-122.38125000000001,47.79963000000001],[-122.38129,47.799624],[-122.38132999999999,47.799620000000004],[-122.38143,47.799620000000004],[-122.38149,47.79963000000001],[-122.38155,47.79965200000001],[-122.38292,47.79966],[-122.38292,47.79984],[-122.38292999999999,47.8021],[-122.38292999999999,47.80252],[-122.38292999999999,47.80327],[-122.38327,47.803272],[-122.38332999999999,47.803273],[-122.38351,47.803276],[-122.38356999999999,47.803276999999994],[-122.38361,47.803276],[-122.38382999999999,47.803273],[-122.38395,47.803276999999994],[-122.3841,47.803276],[-122.38442300000001,47.80327],[-122.38472999999999,47.80328099999999],[-122.38519,47.803279999999994],[-122.38539999999999,47.80329],[-122.38555,47.80329],[-122.38570999999999,47.80329],[-122.38582,47.80329],[-122.38604,47.803290999999994],[-122.38626000000001,47.80329],[-122.38677999999999,47.80329],[-122.38692,47.80329],[-122.38715,47.80329],[-122.38726000000001,47.80327],[-122.38781,47.80325],[-122.38982999999999,47.80321],[-122.3905,47.803194],[-122.39054,47.80322099999999],[-122.3906,47.80323],[-122.39077999999999,47.803219999999996],[-122.39110000000001,47.80322699999999],[-122.39120000000001,47.803225],[-122.39138,47.80323],[-122.39150000000001,47.80323],[-122.39161000000001,47.803228],[-122.39169900000002,47.803231],[-122.39189,47.803232],[-122.39241,47.80323],[-122.39396,47.80322399999999],[-122.39448,47.803219999999996],[-122.39457,47.803215],[-122.39484,47.803197],[-122.39494,47.803191],[-122.39582,47.80321],[-122.39849,47.803276999999994],[-122.39938,47.8033],[-122.39869,47.803999999999995],[-122.39663,47.806110000000004],[-122.39594,47.806818],[-122.39415000000001,47.808458],[-122.39001,47.812239999999996],[-122.38876999999998,47.813379999999995],[-122.38698,47.81502],[-122.38641,47.81554],[-122.38471,47.817099999999996],[-122.38414,47.81761999999999],[-122.38542,47.817612],[-122.38926000000001,47.81759999999999],[-122.39054,47.817589999999996],[-122.39287999999999,47.81757999999999],[-122.39991,47.81755],[-122.40225000000001,47.81755],[-122.40867,47.817519999999995],[-122.42793,47.81744299999999],[-122.43435000000001,47.81741999999999],[-122.42952000000001,47.82761]],[[-122.34156000000002,47.84667999999999],[-122.34111000000001,47.846669999999996],[-122.34094,47.84665999999999],[-122.34073,47.84665999999999],[-122.34132000000001,47.84612],[-122.34132000000001,47.845819],[-122.34132000000001,47.84525],[-122.34110000000001,47.84543],[-122.34088,47.8456],[-122.34069000000001,47.84561],[-122.34044,47.845777],[-122.34002000000001,47.84623],[-122.3399,47.84623],[-122.33932,47.84623],[-122.33891,47.845904],[-122.33803999999999,47.845901],[-122.338029,47.845608],[-122.33802,47.84532],[-122.33802,47.845256],[-122.33802,47.8452],[-122.33802,47.84516],[-122.33735,47.84516],[-122.33715000000001,47.845166],[-122.33697,47.845168],[-122.33693,47.845123],[-122.336822,47.84501],[-122.33631799999999,47.844829999999995],[-122.33592,47.844677999999995],[-122.33592,47.84475],[-122.33592,47.844789999999996],[-122.33592,47.84479999999999],[-122.33671,47.8451],[-122.33677999999999,47.845164],[-122.33685,47.845259999999996],[-122.33693,47.84536],[-122.33697,47.84545],[-122.33701,47.845530000000004],[-122.33703,47.845605],[-122.33705,47.84567],[-122.33706000000001,47.84574],[-122.33706000000001,47.845879999999994],[-122.33704,47.845948],[-122.33702000000001,47.846],[-122.33702000000001,47.846059999999994],[-122.33703,47.84612],[-122.33704,47.846171],[-122.33707,47.84623],[-122.336965,47.84623],[-122.33744,47.84664399999999],[-122.33784,47.84664699999999],[-122.33927,47.846652],[-122.33919,47.846726999999994],[-122.33905,47.84685999999999],[-122.33901,47.84691],[-122.33941,47.84692],[-122.33976999999999,47.84692],[-122.34133,47.84693],[-122.34156000000002,47.84667999999999]],[[-122.3562,47.79936000000001],[-122.3562,47.79909000000001],[-122.35619,47.79861000000001],[-122.35619,47.79836000000001],[-122.35618199999999,47.79814000000001],[-122.35618099999999,47.79787],[-122.35618099999999,47.79751800000001],[-122.35618199999999,47.79708],[-122.35616999999999,47.79656000000001],[-122.35616999999999,47.796400000000006],[-122.35616999999999,47.79591000000001],[-122.35618,47.795564000000006],[-122.35616999999999,47.79534200000001],[-122.35616,47.79503500000001],[-122.35616,47.7944],[-122.35615,47.793980000000005],[-122.35615,47.793870000000005],[-122.35614,47.79377000000001],[-122.35614,47.79364],[-122.35614,47.79335500000001],[-122.35613,47.79307000000001],[-122.356128,47.79292600000001],[-122.35612,47.792680000000004],[-122.35612,47.792480000000005],[-122.35613,47.79234000000001],[-122.35612,47.79219000000001],[-122.35611,47.791940000000004],[-122.35612,47.791810000000005],[-122.35611,47.79177200000001],[-122.35608599999999,47.791630000000005],[-122.35606,47.79121000000001],[-122.35597999999999,47.78999],[-122.35596999999999,47.78974],[-122.35513999999999,47.78904],[-122.35497,47.78887],[-122.35482,47.78873000000001],[-122.3543,47.78828],[-122.35387999999999,47.78778],[-122.35379999999999,47.787665999999994],[-122.35367,47.78741],[-122.35358,47.787130000000005],[-122.35333999999999,47.78584],[-122.35324,47.785070000000005],[-122.35318,47.785075000000006],[-122.35312,47.785077],[-122.35292,47.78508],[-122.35272099999999,47.78508],[-122.35252,47.78508],[-122.35230999999999,47.785077],[-122.35211,47.785078000000006],[-122.35199999999999,47.78508],[-122.35167,47.785070000000005],[-122.35155,47.785070000000005],[-122.35158,47.785291],[-122.35159,47.785340000000005],[-122.35161000000001,47.785638000000006],[-122.35162000000001,47.785816000000004],[-122.3516,47.78616],[-122.35159,47.78644],[-122.35158,47.786619],[-122.35157,47.78701],[-122.35158,47.78716],[-122.35158,47.78734],[-122.35111,47.78735],[-122.350522,47.78735],[-122.35006999999999,47.78735],[-122.34851,47.78734],[-122.34735,47.78735],[-122.34693,47.78735],[-122.34666000000001,47.78734],[-122.346292,47.787341],[-122.34629000000001,47.787251],[-122.34629000000001,47.78698],[-122.34629000000001,47.786893],[-122.34612000000001,47.7869],[-122.346036,47.786902000000005],[-122.34535,47.7869],[-122.34527,47.786898],[-122.34502,47.786895],[-122.34489,47.786896],[-122.34478,47.786898],[-122.34451000000001,47.78688],[-122.34439,47.78689],[-122.34414000000001,47.786893],[-122.34407,47.786892],[-122.34386,47.78689],[-122.34367,47.7869],[-122.34309,47.7869],[-122.34276,47.7869],[-122.34269,47.786902000000005],[-122.34246999999999,47.7869],[-122.3424,47.7869],[-122.342349,47.786899],[-122.34224,47.786899],[-122.34224,47.787710000000004],[-122.34225900000001,47.78871300000001],[-122.34108,47.78871000000001],[-122.33956,47.788700000000006],[-122.33952000000001,47.78875000000001],[-122.33913,47.789288],[-122.33856,47.79008],[-122.33855,47.790090000000006],[-122.33825,47.79055000000001],[-122.337998,47.79091000000001],[-122.33788,47.79108],[-122.33759,47.79148],[-122.33724000000001,47.791990000000006],[-122.33699,47.792355000000015],[-122.33735,47.79236100000001],[-122.33739,47.79236200000001],[-122.33745,47.79235600000001],[-122.33843499999999,47.792352000000015],[-122.33847999999999,47.792352000000015],[-122.33879999999999,47.79236000000001],[-122.33911,47.79235000000001],[-122.33923,47.79235000000001],[-122.34055000000001,47.792352000000015],[-122.34099,47.79235300000001],[-122.34098,47.79248200000001],[-122.34096000000001,47.79269000000001],[-122.34097,47.792871000000005],[-122.34097,47.793001000000004],[-122.340728,47.79316000000001],[-122.34051000000001,47.79330300000001],[-122.34043,47.79335000000001],[-122.34035,47.793394000000006],[-122.34026000000001,47.79343000000001],[-122.34016000000001,47.79346],[-122.34006400000001,47.793485000000004],[-122.33993,47.79351000000001],[-122.33991,47.79351000000001],[-122.33964,47.79353000000001],[-122.33946999999999,47.79353500000001],[-122.33909,47.79355000000001],[-122.33896999999999,47.79355000000001],[-122.33881,47.79356000000001],[-122.33872999999998,47.793569000000005],[-122.33864,47.793580000000006],[-122.33855,47.793607],[-122.3385,47.793620000000004],[-122.33847999999999,47.79363000000001],[-122.33842999999999,47.793670000000006],[-122.33836,47.79377000000001],[-122.33834699999998,47.79384],[-122.33833999999999,47.79388],[-122.33832999999998,47.79399000000001],[-122.33832,47.794160000000005],[-122.33832,47.794430000000006],[-122.33832999999998,47.794630000000005],[-122.33832999999998,47.794909000000004],[-122.33832999999998,47.794923000000004],[-122.33832,47.795110000000015],[-122.33694,47.79510000000001],[-122.33559,47.795094000000006],[-122.33559,47.79513900000001],[-122.33559,47.79520000000001],[-122.33559,47.79555000000001],[-122.3356,47.79580000000001],[-122.33561,47.79601000000001],[-122.335606,47.796084],[-122.3356,47.796290000000006],[-122.3356,47.79636000000001],[-122.33659,47.796347000000004],[-122.33776999999999,47.79633000000001],[-122.33782000000001,47.79690600000001],[-122.3366,47.796940000000006],[-122.33561,47.796960000000006],[-122.33561,47.797140000000006],[-122.33561,47.79719000000001],[-122.33562,47.797360000000005],[-122.33561,47.797540000000005],[-122.33562,47.797670000000004],[-122.33562,47.797854],[-122.33562,47.79800000000001],[-122.33563,47.79844000000001],[-122.33563,47.798510000000014],[-122.33564,47.79859300000001],[-122.33564,47.79881000000001],[-122.33566,47.79931000000001],[-122.33566,47.799462000000005],[-122.33566,47.79968],[-122.33587999999999,47.799682000000004],[-122.33617,47.799685000000004],[-122.33642400000001,47.79968],[-122.33654,47.79968],[-122.33676,47.79967500000001],[-122.33686,47.799669],[-122.33697,47.799670000000006],[-122.33720000000001,47.79967200000001],[-122.33761000000001,47.799670000000006],[-122.33782000000001,47.79966],[-122.33814,47.79966],[-122.33828,47.79966],[-122.33851,47.79966],[-122.33908,47.79966],[-122.33939,47.79966],[-122.33972,47.79966],[-122.3398,47.79966],[-122.34033,47.79966],[-122.34069000000001,47.79966],[-122.34102000000001,47.79966],[-122.34143,47.79966],[-122.34156000000002,47.79966],[-122.34196000000001,47.79965000000001],[-122.34319900000001,47.79965000000001],[-122.34343,47.79965000000001],[-122.34374,47.799645000000005],[-122.34386,47.79965000000001],[-122.34423000000001,47.79965000000001],[-122.34435,47.79965000000001],[-122.34450000000001,47.79965000000001],[-122.34496000000001,47.799639000000006],[-122.34512000000001,47.799637000000004],[-122.34515,47.799640000000004],[-122.34525000000001,47.799640000000004],[-122.34528,47.799645000000005],[-122.34552000000001,47.799639000000006],[-122.3457,47.79963000000001],[-122.34622000000002,47.799640000000004],[-122.34647,47.799634000000005],[-122.34681,47.799640000000004],[-122.34693,47.799637000000004],[-122.347328,47.79963000000001],[-122.34791000000001,47.79963000000001],[-122.34821000000001,47.799620000000004],[-122.3483,47.799620000000004],[-122.34876,47.79963000000001],[-122.34897,47.799628000000006],[-122.34921000000001,47.79963000000001],[-122.34962000000002,47.799624],[-122.34984,47.799624],[-122.35025,47.799620000000004],[-122.35054,47.799620000000004],[-122.35112000000001,47.799620000000004],[-122.35148,47.79961000000001],[-122.35189,47.799600000000005],[-122.35206,47.799600000000005],[-122.35247999999999,47.799603000000005],[-122.35256999999999,47.79959900000001],[-122.35262999999999,47.799600000000005],[-122.35273999999998,47.799600000000005],[-122.35278999999998,47.799600000000005],[-122.35294999999999,47.799597000000006],[-122.35301,47.799600000000005],[-122.35311,47.799600000000005],[-122.35382,47.799594000000006],[-122.35409,47.79959000000001],[-122.35444,47.799600000000005],[-122.35451,47.799600000000005],[-122.3549,47.799600000000005],[-122.355053,47.799600000000005],[-122.35552999999999,47.799600000000005],[-122.35578999999998,47.799600000000005],[-122.35621,47.799600000000005],[-122.3562,47.79936000000001]]]},"name":"Edmonds"},{"boundary":{"type":"Polygon","coordinates":[[[-122.33579999999999,47.43127],[-122.33451000000001,47.431259999999995],[-122.33371799999999,47.431259999999995],[-122.332467,47.431256],[-122.33132,47.431248999999994],[-122.330362,47.431239999999995],[-122.32977999999999,47.43124099999999],[-122.32847999999998,47.431239999999995],[-122.32718,47.43123],[-122.3261,47.43123],[-122.325193,47.43123],[-122.32497,47.43123],[-122.32497,47.43102],[-122.32496,47.43078],[-122.32494,47.42989],[-122.32493,47.429387],[-122.32492,47.429002000000004],[-122.32491,47.42855000000001],[-122.32319,47.42851000000001],[-122.32213099999998,47.42850000000001],[-122.32166000000001,47.428490000000004],[-122.321146,47.42848],[-122.32006999999999,47.42846],[-122.3183,47.42844],[-122.31831,47.42792],[-122.31833999999999,47.42764],[-122.31836,47.427478],[-122.31839,47.427337],[-122.31852,47.426950000000005],[-122.31882999999999,47.42625],[-122.31899,47.42589],[-122.31964,47.42439],[-122.31978,47.424],[-122.31983,47.423849],[-122.32006,47.42293900000001],[-122.32019,47.422371000000005],[-122.32027,47.421974],[-122.32029,47.42184099999999],[-122.32029999999999,47.42163],[-122.32028,47.421116000000005],[-122.32025,47.419869999999996],[-122.32024,47.41916],[-122.32022,47.41859],[-122.32022,47.41855],[-122.32019,47.41733],[-122.32016999999999,47.416802999999994],[-122.32018,47.416489999999996],[-122.32019,47.416349],[-122.32022,47.41617],[-122.320257,47.416038],[-122.3191,47.41607],[-122.31882999999999,47.416076999999994],[-122.31881,47.41599],[-122.318816,47.41585],[-122.31881,47.41578],[-122.31869,47.415773],[-122.31821000000001,47.41575],[-122.31659,47.41567],[-122.31557,47.41563],[-122.31444,47.4156],[-122.31389,47.41558],[-122.31309,47.41555],[-122.31275,47.415530000000004],[-122.31231,47.41554],[-122.312084,47.41556],[-122.31189,47.415561],[-122.31048,47.415530000000004],[-122.30963799999999,47.41552],[-122.3093,47.415516000000004],[-122.3092,47.415510000000005],[-122.30865,47.41552],[-122.30711000000001,47.415527],[-122.30676999999999,47.415529],[-122.30604,47.415530000000004],[-122.30512999999999,47.41554],[-122.30464,47.41554],[-122.30414,47.41554],[-122.30371,47.41554],[-122.302555,47.415527],[-122.30248999999999,47.41552],[-122.30248999999999,47.41545],[-122.3025,47.41493],[-122.30248999999999,47.41409899999999],[-122.30247999999999,47.413689999999995],[-122.30248999999999,47.41187999999999],[-122.29782900000002,47.41179999999999],[-122.29803,47.410379999999996],[-122.29831,47.408390000000004],[-122.29832,47.40823],[-122.29821000000001,47.40823],[-122.29813,47.40823],[-122.29721000000002,47.40822],[-122.29657,47.408210000000004],[-122.29602000000001,47.408210000000004],[-122.29518,47.408206],[-122.29486000000001,47.408203],[-122.29452000000002,47.4082],[-122.29369000000001,47.408194],[-122.29218300000001,47.408190000000005],[-122.292367,47.4073],[-122.29244,47.40687],[-122.29246,47.406645],[-122.29255,47.405992000000005],[-122.29261000000001,47.405283999999995],[-122.29265000000001,47.404588999999994],[-122.29265000000001,47.404562],[-122.29266000000001,47.40376],[-122.29266000000001,47.40363],[-122.29266000000001,47.403568],[-122.29260000000001,47.402256],[-122.29256000000001,47.40177],[-122.29254,47.401605999999994],[-122.29253,47.40145],[-122.292455,47.40094],[-122.29225000000001,47.39959],[-122.29208,47.39844],[-122.29196000000002,47.39759],[-122.29173,47.396065],[-122.29186000000001,47.396066],[-122.29212000000001,47.396069],[-122.292,47.39497],[-122.29186000000001,47.394031],[-122.29198000000001,47.393750000000004],[-122.29203,47.39363],[-122.292589,47.39227],[-122.29264,47.392160000000004],[-122.292806,47.39221800000001],[-122.29333,47.39246],[-122.29389,47.392790000000005],[-122.294739,47.39348],[-122.29493000000001,47.39365],[-122.2954,47.394059999999996],[-122.29548,47.39422],[-122.29592000000001,47.394594],[-122.29596000000001,47.39463],[-122.29610000000001,47.394723],[-122.29624000000001,47.39481],[-122.29651000000001,47.394954],[-122.29664000000001,47.395010000000006],[-122.29683,47.39509],[-122.29700000000001,47.395157000000005],[-122.29716000000002,47.395208000000004],[-122.297437,47.395286],[-122.29762000000002,47.395328000000006],[-122.29788,47.39537800000001],[-122.29853,47.39548],[-122.29885,47.39553000000001],[-122.29879,47.39374],[-122.29775000000001,47.393724],[-122.29756000000002,47.393724],[-122.29719000000001,47.39372],[-122.29719000000001,47.39246],[-122.29521000000001,47.39244],[-122.29511000000001,47.392437],[-122.29519,47.392030000000005],[-122.29536,47.391345],[-122.29544,47.390965],[-122.29553,47.390965],[-122.29627,47.390964],[-122.29720000000002,47.39096],[-122.29720000000002,47.39043],[-122.29581,47.390432000000004],[-122.29558,47.390403],[-122.29579,47.389576],[-122.29592000000001,47.38901],[-122.29722000000002,47.38903],[-122.29723000000001,47.38838],[-122.29724400000002,47.38737999999999],[-122.29639,47.38737999999999],[-122.29633,47.38737],[-122.29642000000001,47.387049999999995],[-122.29648,47.386779999999995],[-122.29654000000001,47.38652],[-122.29671,47.38652],[-122.29729000000002,47.38653],[-122.29772000000001,47.38652],[-122.29816000000001,47.38652],[-122.29863,47.38652],[-122.29872999999999,47.38652],[-122.29871,47.38623],[-122.29865000000001,47.38494399999999],[-122.29866000000001,47.38465999999999],[-122.29769000000002,47.38464999999999],[-122.29769000000002,47.384401999999994],[-122.29769000000002,47.38425999999999],[-122.29710000000001,47.384229999999995],[-122.29743,47.382889999999996],[-122.29751000000002,47.38259],[-122.29867,47.38259],[-122.29868,47.382166],[-122.29871,47.38115],[-122.29962000000002,47.381142999999994],[-122.30053,47.381099999999996],[-122.30054,47.380339],[-122.30053,47.37945],[-122.30062000000001,47.37945],[-122.301826,47.379459999999995],[-122.30196000000001,47.37945],[-122.30212,47.37943],[-122.30372999999999,47.37947],[-122.30376999999999,47.37948399999999],[-122.30382999999999,47.37949],[-122.3048,47.3795],[-122.30493,47.3795],[-122.30609,47.37953],[-122.30672,47.37955],[-122.30718,47.37955],[-122.3079,47.37956],[-122.30786,47.377779999999994],[-122.30782,47.376079999999995],[-122.30782,47.37598],[-122.30681,47.375965],[-122.30574999999999,47.37595],[-122.30469000000001,47.375930000000004],[-122.30337999999999,47.375910000000005],[-122.30282999999999,47.3759],[-122.30273999999999,47.3759],[-122.30256,47.3759],[-122.30256,47.375544],[-122.30256,47.37541],[-122.30256,47.37538],[-122.30256,47.37535200000001],[-122.30256,47.3752],[-122.30256,47.375149],[-122.30256,47.375],[-122.30256,47.374835],[-122.30245,47.37483399999999],[-122.302369,47.374829999999996],[-122.30199,47.374829999999996],[-122.30162000000001,47.374821999999995],[-122.30116000000001,47.37481999999999],[-122.30066000000001,47.37481],[-122.30068,47.374779999999994],[-122.30075,47.374635],[-122.30107199999999,47.374013],[-122.30138,47.37345],[-122.30163,47.37295],[-122.30199,47.372280999999994],[-122.30232,47.371649999999995],[-122.30266999999999,47.37096],[-122.3031,47.37017],[-122.30332,47.36977],[-122.30385,47.368700000000004],[-122.30422000000002,47.368001],[-122.30451000000001,47.36743],[-122.30467,47.36718],[-122.30475,47.36705],[-122.30486,47.36685],[-122.30506999999999,47.366398000000004],[-122.30538999999999,47.3658],[-122.30566999999999,47.365259],[-122.30699,47.362730000000006],[-122.30761000000001,47.361537],[-122.30779,47.36123],[-122.30807999999999,47.36069],[-122.30829,47.36026],[-122.308602,47.35965999999999],[-122.30892999999999,47.35903999999999],[-122.30909,47.35875],[-122.30952,47.35794299999999],[-122.31048,47.35795099999999],[-122.31178,47.35795999999999],[-122.3123,47.35795999999999],[-122.31323,47.35794599999999],[-122.31323,47.357499999999995],[-122.31325000000001,47.35686499999999],[-122.31325000000001,47.35631],[-122.31324000000001,47.3553],[-122.31326000000001,47.354319999999994],[-122.31325500000001,47.353708],[-122.31325000000001,47.35344599999999],[-122.313241,47.35332],[-122.31322000000002,47.353199999999994],[-122.31318,47.35307999999999],[-122.31313,47.352958],[-122.31307,47.35283999999999],[-122.31303,47.35278699999999],[-122.31292,47.352636999999994],[-122.31284,47.35255],[-122.31277999999999,47.3525],[-122.31269,47.35239],[-122.31267,47.35236],[-122.31264,47.35232],[-122.31262000000001,47.352289999999996],[-122.3126,47.35227],[-122.31257,47.35223],[-122.31255,47.352199999999996],[-122.31253,47.35215],[-122.31248,47.35207],[-122.31244,47.351989999999994],[-122.31241,47.35189999999999],[-122.31239199999999,47.35185999999999],[-122.3124,47.35184999999999],[-122.31242,47.35184199999999],[-122.31244,47.35181999999999],[-122.31246999999999,47.35179999999999],[-122.3125,47.35178699999999],[-122.31231,47.35175399999999],[-122.31246,47.35174599999999],[-122.31253,47.351729999999996],[-122.31257,47.351729999999996],[-122.312656,47.351715],[-122.31286,47.35166999999999],[-122.31299,47.35162199999999],[-122.31317,47.351589999999995],[-122.31321000000001,47.351589999999995],[-122.3133,47.35158199999999],[-122.31338,47.35158199999999],[-122.31345,47.35158199999999],[-122.31344,47.35068999999999],[-122.31332,47.35067999999999],[-122.31327,47.34972],[-122.31328,47.34967999999999],[-122.31331,47.349599999999995],[-122.31336999999999,47.349533],[-122.31344,47.34945999999999],[-122.31352000000001,47.349408],[-122.31359,47.34936],[-122.31366000000001,47.349289999999996],[-122.31372,47.349219999999995],[-122.31374,47.349108],[-122.31376,47.34887],[-122.31585,47.34887],[-122.31584799999999,47.34875],[-122.31585,47.3484],[-122.31587999999999,47.347049999999996],[-122.31608,47.347049999999996],[-122.316705,47.347032],[-122.31771,47.34701],[-122.31774,47.34701],[-122.31782000000001,47.34701999999999],[-122.31851,47.34701999999999],[-122.31851,47.34668599999999],[-122.31861,47.34353],[-122.318726,47.34354],[-122.31886999999999,47.34354],[-122.318951,47.34397],[-122.31901,47.344199999999994],[-122.319484,47.345389],[-122.3197,47.345382],[-122.32030999999999,47.34537],[-122.32122000000001,47.345341],[-122.32121000000001,47.345659999999995],[-122.32157,47.3461],[-122.32179,47.34664699999999],[-122.32186999999999,47.34683999999999],[-122.32222999999999,47.346819999999994],[-122.32242,47.346816],[-122.32254999999999,47.346689999999995],[-122.32328,47.346858],[-122.3235,47.34665999999999],[-122.32355,47.346259999999994],[-122.32359,47.34613],[-122.32379999999999,47.34586699999999],[-122.32463,47.34619],[-122.32468,47.34615],[-122.32605,47.344719999999995],[-122.32629,47.34457],[-122.32621,47.3445],[-122.32601,47.34437],[-122.32687999999999,47.343849999999996],[-122.32827999999999,47.343598],[-122.32865,47.34337],[-122.33018,47.34339],[-122.33028,47.34315],[-122.33042999999999,47.34282399999999],[-122.33052,47.34252],[-122.33086,47.342085],[-122.33016,47.341939999999994],[-122.32969,47.34155],[-122.32952,47.34125999999999],[-122.32942999999999,47.34111],[-122.32918199999999,47.341103],[-122.32918,47.340399999999995],[-122.331801,47.340402],[-122.33414,47.34040699999999],[-122.33449,47.34041],[-122.3345,47.34063],[-122.3345,47.341525],[-122.33452000000001,47.34236],[-122.33458,47.342428],[-122.33448,47.34248399999999],[-122.334407,47.34241],[-122.33441,47.34297],[-122.33441,47.343059999999994],[-122.33416000000001,47.34314],[-122.33212999999999,47.34382099999999],[-122.324833,47.34852],[-122.32481,47.349183999999994],[-122.32457,47.35771999999999],[-122.32453,47.35892],[-122.325234,47.35972099999999],[-122.32512999999999,47.360321],[-122.32482,47.36139],[-122.325289,47.36421],[-122.32582999999998,47.36472],[-122.32572999999998,47.365100000000005],[-122.325694,47.36524],[-122.32482999999999,47.36842],[-122.32533399999998,47.368321],[-122.32682999999999,47.37202],[-122.32687999999999,47.372530000000005],[-122.32692999999999,47.373219999999996],[-122.325234,47.373819999999995],[-122.32527999999999,47.37572],[-122.32527999999999,47.37589],[-122.32533399999998,47.37812],[-122.32632999999998,47.38313],[-122.32666,47.38483999999999],[-122.32705,47.38677],[-122.32723,47.387719999999995],[-122.32724,47.38784299999999],[-122.32723,47.38802],[-122.32606999999999,47.39078],[-122.32596,47.39102],[-122.32576999999998,47.391239999999996],[-122.32574999999999,47.391373],[-122.32572999999998,47.391521],[-122.32732,47.395632000000006],[-122.32742999999999,47.395920000000004],[-122.32793,47.39792],[-122.32842999999998,47.400620999999994],[-122.33063,47.402921],[-122.331334,47.404019999999996],[-122.33152000000001,47.40441],[-122.33157,47.404556],[-122.33141,47.40461],[-122.33136,47.404619999999994],[-122.33097,47.40477],[-122.33065,47.404379999999996],[-122.32968,47.404388],[-122.32951,47.40439],[-122.32951,47.40455],[-122.32954799999999,47.40531000000001],[-122.32885999999999,47.405330000000006],[-122.32892,47.40637],[-122.32822999999999,47.406388],[-122.32826,47.406936],[-122.32741,47.40696],[-122.32742,47.40718],[-122.32748,47.40717],[-122.32749,47.40728599999999],[-122.32743099999999,47.407301],[-122.32708,47.40739],[-122.32685,47.407669999999996],[-122.32682,47.407948],[-122.326893,47.40815200000001],[-122.32691,47.408541],[-122.32706,47.408570000000005],[-122.32725,47.408570000000005],[-122.32746,47.408570000000005],[-122.32753,47.408570000000005],[-122.3276,47.408570000000005],[-122.32771,47.40856],[-122.32911,47.40847],[-122.32929999999999,47.40844],[-122.32946999999999,47.408391],[-122.32976999999998,47.408324],[-122.33079,47.408072000000004],[-122.331,47.408027],[-122.33124000000001,47.40799],[-122.331428,47.40799],[-122.33164000000001,47.408],[-122.33185,47.408038000000005],[-122.33205099999999,47.40809],[-122.33224,47.40816],[-122.33241,47.408252000000005],[-122.332422,47.40826],[-122.33251,47.40832],[-122.3326,47.408390000000004],[-122.33268199999999,47.408462],[-122.33278199999998,47.40858],[-122.33282999999999,47.40866],[-122.33286999999999,47.408730000000006],[-122.33291,47.40882],[-122.33308,47.409648999999995],[-122.33313,47.40992],[-122.33315,47.410015],[-122.33321000000001,47.41017],[-122.33325,47.410259999999994],[-122.33331,47.41034],[-122.33336999999999,47.41042099999999],[-122.33344,47.4105],[-122.33352000000001,47.41057],[-122.33361000000001,47.410639999999994],[-122.33403,47.410933],[-122.3341,47.41099],[-122.33421000000001,47.411111],[-122.334349,47.4113],[-122.33441,47.41141999999999],[-122.33447,47.411579999999994],[-122.33458,47.41217],[-122.33468,47.41273],[-122.33481,47.413419999999995],[-122.3352,47.41558],[-122.33525,47.416039999999995],[-122.33528,47.41659],[-122.33527,47.417362999999995],[-122.33527,47.41858],[-122.33527,47.418727],[-122.33527,47.41918],[-122.33527,47.419819999999994],[-122.33527,47.420183],[-122.33526,47.42046],[-122.33525300000001,47.420950000000005],[-122.33525,47.42109],[-122.33524,47.421510000000005],[-122.335204,47.42309],[-122.335212,47.42327],[-122.33526,47.42396],[-122.33529999999999,47.424510000000005],[-122.33534999999999,47.42517000000001],[-122.33536,47.42526],[-122.33536999999998,47.42531800000001],[-122.33539199999998,47.4256],[-122.33545,47.42634],[-122.33552900000001,47.42732],[-122.33556,47.4278],[-122.33558,47.42803000000001],[-122.33559,47.428230000000006],[-122.33562,47.428630000000005],[-122.33578999999999,47.430896999999995],[-122.33579999999999,47.431059999999995],[-122.33579999999999,47.43113],[-122.33579999999999,47.43127]]]},"name":"Des Moines"}]; +}); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-1009-promise-async.js b/example/assets/scripts/controllers/issue-1009-promise-async.js new file mode 100644 index 000000000..48cbbe891 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1009-promise-async.js @@ -0,0 +1,73 @@ +// Code goes here + +angular.module('app', [ + "uiGmapgoogle-maps" +]) +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ +// key: 'your api key', + v: '3.16', + libraries: '' + }); +}]). +controller("controller", ["$scope", function($scope) { + var lastId = 1; + + $scope.searchResults = { + results: [] + }; + + $scope.map = { + control: {}, + center: { + latitude: 40.74349, + longitude: -73.990822 + }, + zoom: 12, + dragging: false, + bounds: {}, + markers: [], + events: { + idle: function (map) { + + }, + dragend: function(map) { + var bounds = map.getBounds(); + var ne = bounds.getNorthEast(); + var sw = bounds.getSouthWest(); + } + } + }; + + + + $scope.addMarkers = function(num) { + markers = [] + for (i = 0; i < num; i++) { + coords = chance.coordinates().split(','); + if(markers.length < 100){ + markers.push({ + 'coords': { + 'latitude': coords[0], + 'longitude': coords[1] + }, + 'key': 'someKey-'+lastId + }); + lastId++; + } + } + + $scope.searchResults = { + results: markers + }; + } + + $scope.reset = function() { + lastId = 1; + $scope.searchResults = { + results: [] + }; + }; + + } +]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-1021-spiderfier-rerender.js b/example/assets/scripts/controllers/issue-1021-spiderfier-rerender.js new file mode 100644 index 000000000..ee734f3a0 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1021-spiderfier-rerender.js @@ -0,0 +1,79 @@ +angular.module('app', ['uiGmapgoogle-maps', 'ui-rangeSlider']) +.controller('MapCtrl', function ($scope, $http, $timeout, uiGmapIsReady, $log) { + + console.log("MapCtrl called"); + $scope.spiderEvents = { + click: function(){ + $log.debug("clicked: args: " + arguments.length); + }, + spiderfy: function(gMarkers, models, crap){ + $log.debug("spiderfy: args: " + JSON.stringify(models)); + }, + unspiderfy: function(gMarkers, models){ + $log.debug("unspiderfy: args: " + JSON.stringify(models)); + } + }; + $scope.project = {}; + $scope.project.locations = []; + $scope.project.filtered_locations = []; + + //set up map starting from whole world in view + $scope.project.map = { + center: { + latitude: 0, + longitude: 0 + }, + zoom: 1 + }; + + //set map options + $scope.map_options = { + // scrollwheel : false + }; + + $http.get('assets/json/1028-locations.json'). + success(function (data, status, headers, config) { + console.log(data); + + //on map ready, add locations to scope to be rendered + uiGmapIsReady.promise(1).then(function (instances) { + + $scope.project.locations = data; + $scope.project.filtered_locations = data; + + // default the user's values to the available range + $scope.minIndex = 0; + $scope.maxIndex = data.length; + + console.log('maxIndex' + $scope.maxIndex); + + $scope.userMinIndex = $scope.minIndex; + $scope.userMaxIndex = $scope.maxIndex; + + var delay = 500; + var promise; + + $scope.$watch("userMaxIndex", function (newValue, oldValue) { + + var locations = []; + + $timeout.cancel(promise); + promise = $timeout(function () { + + console.log("slider changed"); + + locations = $scope.project.locations.slice($scope.userMinIndex, $scope.userMaxIndex); + + $scope.project.filtered_locations = locations; + $scope.$apply(); + console.log("Locations on map are: " + $scope.project.filtered_locations.length); + + }, delay); + }); + }); + }). + error(function (data, status, headers, config) { + // called asynchronously if an error occurs + // or server returns response with an error status. + }); +}); diff --git a/example/assets/scripts/controllers/issue-1027-markers-clustering-ngif.js b/example/assets/scripts/controllers/issue-1027-markers-clustering-ngif.js new file mode 100644 index 000000000..6c844ec06 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1027-markers-clustering-ngif.js @@ -0,0 +1,77 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + + .controller("mapCtrl", ["$scope", "uiGmapLogger", function ($scope, logger) { + logger.doLog = true; + logger.currentLevel = logger.LEVELS.debug; + var lastId = 1; + var clusterThresh = 6; + + $scope.map = { + actualZoom: null, + showMarkers: true, + doCluster: true, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 18, + minZoom: 3 + }, + events: { + idle: function (map) { + $scope.map.actualZoom = map.getZoom(); + if ($scope.addMarkers) + $scope.addMarkers(1000); + } + }, + center: { + latitude: 0, + longitude: 0 + }, + //clusterOptions: {title: 'Hi I am a Cluster!', gridSize: 60, ignoreHidden: true, minimumClusterSize: 2, + // imageExtension: 'png', imagePath: 'assets/images/cluster', imageSizes: [72] + //}, + clusterOptions: {}, + zoom: 0 + }; + + $scope.searchResults = { + results: [] + }; + +// $scope.$watch( 'zoom', function (newValue, oldValue){ +// if (newValue == oldValue) +// return null; +// +// }); + + + $scope.addMarkers = _.once(function (num) { + var markers = []; + var i = 0; + + for (i = 0; i < num; i++) { + var cords = chance.coordinates().split(','); +// if(markers.length < 100){ + markers.push({ + 'coords': { + 'latitude': cords[0], + 'longitude': cords[1] + }, + 'key': 'someKey-' + lastId + }); + lastId++; +// } + } + lastId = 1;//reset + $scope.searchResults.results = markers; + }); + + $scope.reset = function () { + //lastId = 1; + //$scope.searchResults = { + // results: [] + //}; + }; + + } + ]); diff --git a/example/assets/scripts/controllers/issue-1028-clusterer-rerender.js b/example/assets/scripts/controllers/issue-1028-clusterer-rerender.js new file mode 100644 index 000000000..353bc0090 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1028-clusterer-rerender.js @@ -0,0 +1,69 @@ +angular.module('app', ['uiGmapgoogle-maps', 'ui-rangeSlider']) +.controller('MapCtrl', function ($scope, $http, $timeout, uiGmapIsReady) { + + console.log("MapCtrl called"); + + $scope.project = {}; + $scope.project.locations = []; + $scope.project.filtered_locations = []; + + //set up map starting from whole world in view + $scope.project.map = { + center: { + latitude: 0, + longitude: 0 + }, + zoom: 1 + }; + + //set map options + $scope.map_options = { + // scrollwheel : false + }; + + $http.get('assets/json/1028-locations.json'). + success(function (data, status, headers, config) { + console.log(data); + + //on map ready, add locations to scope to be rendered + uiGmapIsReady.promise(1).then(function (instances) { + + $scope.project.locations = data; + $scope.project.filtered_locations = data; + + // default the user's values to the available range + $scope.minIndex = 0; + $scope.maxIndex = data.length; + + console.log('maxIndex' + $scope.maxIndex); + + $scope.userMinIndex = $scope.minIndex; + $scope.userMaxIndex = $scope.maxIndex; + + var delay = 500; + var promise; + + $scope.$watch("userMaxIndex", function (newValue, oldValue) { + + var locations = []; + + $timeout.cancel(promise); + promise = $timeout(function () { + + console.log("slider changed"); + + locations = $scope.project.locations.slice($scope.userMinIndex, $scope.userMaxIndex); + + $scope.project.filtered_locations = locations; + $scope.$apply(); + console.log("Locations on map are: " + $scope.project.filtered_locations.length); + + }, delay); + }); + }); + }). + error(function (data, status, headers, config) { + // called asynchronously if an error occurs + // or server returns response with an error status. + }); +}); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-1059-polylines-visibility.js b/example/assets/scripts/controllers/issue-1059-polylines-visibility.js new file mode 100644 index 000000000..8325a96b8 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1059-polylines-visibility.js @@ -0,0 +1,39 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + .controller('mainCtrl', function () { + this.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4, bounds: {}}; + this.polylines = [ + { + id: 1, + path: [ + { latitude: 45, longitude: -74 }, + { latitude: 30, longitude: -89 }, + { latitude: 37, longitude: -122 }, + { latitude: 60, longitude: -95 } + ] + }, + { + id: 2, + path: [ + { latitude: 47, longitude: -74 }, + { latitude: 32, longitude: -89 }, + { latitude: 39, longitude: -122 }, + { latitude: 62, longitude: -95 } + ] + } + ].map(function(poly){ + poly.stroke= { color: '#6060FB', weight: 3 }; + poly.editable= false; + poly.draggable= true; + poly.geodesic= true; + poly.visible= true; + return poly; + }); + + this.toggleLine = function(index){ + this.polylines[index].visible = !this.polylines[index].visible; + } + this.toggleEditable = function(index){ + this.polylines[index].editable = !this.polylines[index].editable; + } + + }); diff --git a/example/assets/scripts/controllers/issue-1068-circle-events-doubled.js b/example/assets/scripts/controllers/issue-1068-circle-events-doubled.js new file mode 100644 index 000000000..5dd628001 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1068-circle-events-doubled.js @@ -0,0 +1,50 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .controller('MapsCtrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", + function ($scope, $log, GoogleMapApi) { + $log.currentLevel = $log.LEVELS.debug; + var center= { + latitude: 26.153215225012733, + longitude: -81.80121597097774 + }; + + $scope.map = { + center: center, + pan: true, + zoom: 16, + refresh: false, + events: {}, + bounds: {} + }; + + $scope.map.circle = { + id: 1, + center: center, + radius: 500, + stroke: { + color: '#08B21F', + weight: 2, + opacity: 1 + }, + fill: { + color: '#08B21F', + opacity: 0.5 + }, + geodesic: true, // optional: defaults to false + draggable: true, // optional: defaults to false + clickable: true, // optional: defaults to true + editable: true, // optional: defaults to false + visible: true, // optional: defaults to true + events:{ + dblclick: function(){ + $log.debug("circle dblclick"); + }, + radius_changed: function(gObject){ + var radius = gObject.getRadius(); + $log.debug("circle radius radius_changed " + radius); + } + } + } + }]); + +})(window, angular); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-1075-markers-icon-change.js b/example/assets/scripts/controllers/issue-1075-markers-icon-change.js new file mode 100644 index 000000000..1f1e2c9a0 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1075-markers-icon-change.js @@ -0,0 +1,73 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + .controller('mapIconChangeCtrl', mapController); + +mapController.$inject = ['uiGmapGoogleMapApi']; + +function mapController(GoogleMapApi) { + GoogleMapApi.then(function(maps) { + maps.visualRefresh=true + }); + + var viewmodel = this; + + var blueicon = 'http://maps.google.com/mapfiles/ms/icons/blue-dot.png'; + var redicon = 'http://maps.google.com/mapfiles/ms/icons/red-dot.png'; + var testlocation = { + id: 'abc123', + name: 'CN Tower', + latitude: 43.642496, + longitude: -79.386954 + } + + viewmodel.changeIcon = changeIcon; + viewmodel.changeObject = changeObject; + + viewmodel.markerControl = {} + + viewmodel.map = { + center: { + latitude: 43.642496, + longitude: -79.386954 + }, + zoom: 12, + markers: [ + { + location: testlocation, + id: 'abc123', + icon: 'http://maps.google.com/mapfiles/ms/icons/blue-dot.png' + } + ] + }; + + function changeIcon() { + var newicon = redicon; + if (viewmodel.map.markers[0].icon === redicon) { + newicon = blueicon; + } + + console.log('changing the icon property from ' + + viewmodel.map.markers[0].icon + ' to ' + newicon); + + viewmodel.map.markers[0].icon = newicon; + } + + function changeObject() { + var newicon = redicon; + if (viewmodel.map.markers[0].icon === redicon) { + newicon = blueicon; + } + + var newMarker = { + location: testlocation, + id: 'abc123', + icon: newicon + }; + + console.log('changing the marker object from one with icon ' + + viewmodel.map.markers[0].icon + ' to an object with icon ' + newicon); + var childMarker = viewmodel.markerControl.getChildMarkers().get('abc123') + childMarker.updateModel(newMarker) + viewmodel.map.markers[0] = childMarker.model + + } +} diff --git a/example/assets/scripts/controllers/issue-1075-plurals-updates-other-than-coords.js b/example/assets/scripts/controllers/issue-1075-plurals-updates-other-than-coords.js new file mode 100644 index 000000000..daa1da179 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1075-plurals-updates-other-than-coords.js @@ -0,0 +1,128 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']).controller('mapCtrl', mapController); + +mapController.$inject = ['uiGmapGoogleMapApi']; + +function mapController(GoogleMapApi) { + GoogleMapApi.then(function (maps) { + maps.visualRefresh = true + }); + + var viewmodel = this; + + var blueicon = 'http://maps.google.com/mapfiles/ms/icons/blue-dot.png'; + var redicon = 'http://maps.google.com/mapfiles/ms/icons/red-dot.png'; + var testlocation = { + id: 'abc123', + name: 'CN Tower', + latitude: 43.642496, + longitude: -79.386954 + }; + + viewmodel.changeIcon = changeIcon; + viewmodel.changeObject = changeObject; + viewmodel.changeOptionsToLabel= changeOptionsToLabel; + viewmodel.changeOptionsToNotLabel= changeOptionsToNotLabel; + viewmodel.changePath= changePath; + viewmodel.changeFill= changeFill; + viewmodel.changeStroke= changeStroke; + viewmodel.markerControl = {} + + + viewmodel.map = { + center: { + latitude: 43.642496, + longitude: -79.386954 + }, + zoom: 12, + markers: [ + { + location: testlocation, + id: 'abc123', + icon: 'http://maps.google.com/mapfiles/ms/icons/blue-dot.png' + } + ], + polygons: [ + { + id: 1, + path: [ + { + latitude: 45, + longitude: -74 + }, + { + latitude: 30, + longitude: -89 + }, + { + latitude: 37, + longitude: -122 + }, + { + latitude: 60, + longitude: -95 + } + ], + stroke: { + color: '#ff6262', + weight: 5 + }, + fill:{ color: '#2c8aa7', opacity: '0.3' }, + editable: true, + draggable: true, + geodesic: true, + visible: true + } + ] + }; + + function changeIcon() { + var newicon = redicon; + if (viewmodel.map.markers[0].icon === redicon) { + newicon = blueicon; + } + + console.log('changing the icon property from ' + + viewmodel.map.markers[0].icon + ' to ' + newicon); + viewmodel.map.markers[0].icon = newicon; + } + + function changeObject() { + var newicon = redicon; + if (viewmodel.map.markers[0].icon === redicon) { + newicon = blueicon; + } + + var newMarker = { + location: testlocation, + id: 'abc123', + icon: newicon + }; + + console.log('changing the marker object from one with icon ' + + viewmodel.map.markers[0].icon + ' to an object with icon ' + newicon); + var childMarker = viewmodel.markerControl.getChildMarkers().get('abc123'); + childMarker.updateModel(newMarker); + viewmodel.map.markers[0] = childMarker.model; + } + + function changeOptionsToLabel(){ + viewmodel.map.markers[0].options = { + labelContent: "I'm now a Marker Label!", + labelAnchor: "5 0", + labelClass: "marker-labels" + }; + } + function changeOptionsToNotLabel(){ + viewmodel.map.markers[0].options = {}; + } + + function changePath(){ + viewmodel.map.polygons[0].path[0].latitude += 5; + } + function changeFill(){ + viewmodel.map.polygons[0].fill.color = '#ec19d0'; + } + function changeStroke(){ + viewmodel.map.polygons[0].stroke.color = '#ec19d0'; + } +} diff --git a/example/assets/scripts/controllers/issue-1114-map-distorted.js b/example/assets/scripts/controllers/issue-1114-map-distorted.js new file mode 100644 index 000000000..37a70f1d5 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1114-map-distorted.js @@ -0,0 +1,24 @@ +angular.module('app', ['uiGmapgoogle-maps']) +.controller('MapsCtrl', ['$timeout','$scope', "uiGmapLogger", "uiGmapGoogleMapApi", + function ($timeout, $scope, $log, GoogleMapApi) { + $log.currentLevel = $log.LEVELS.debug; + $scope.refresh = function(){ + if ($scope.map.control.refresh) + $scope.map.control.refresh(); + }; + + $scope.map = { + show: false, + center: { + latitude: 26.153215225012733, + longitude: -81.80121597097774 + }, + control: {}, + pan: true, + zoom: 16, + refresh: false, + events: {}, + bounds: {} + }; + + }]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-1129-cluster-events-trigger-lazy.js b/example/assets/scripts/controllers/issue-1129-cluster-events-trigger-lazy.js new file mode 100644 index 000000000..56e87ef36 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1129-cluster-events-trigger-lazy.js @@ -0,0 +1,45 @@ +angular.module('app', ['uiGmapgoogle-maps']) + .controller('MapCtrl', function ($scope, $timeout) { + $scope.map = { + center: { + latitude: 50.087743, + longitude: 14.478982 + }, + zoom: 8, + options: { + scrollwheel: true + }, + clusterEvents: { + click: function (cluster, clusterModels) { + console.log("click cluster"); + }, + mouseout: function () { + console.log("mouseout cluster"); + } + }, + markers: [] + }; + + $scope.find = function () { + $scope.map.markers = []; + $scope.map.markers.push({ + id: "neco1", + coordinates: { + latitude: 50.087743, + longitude: 14.478982 + } + }); + $scope.map.markers.push({ + id: "neco2", + coordinates: { + latitude: 50.087743, + longitude: 14.478982 + } + }); + }; +// $scope.find(); + $timeout(function(){ + $scope.find(); + }, 2000); + + }); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-1136-markers-cluster-linger.js b/example/assets/scripts/controllers/issue-1136-markers-cluster-linger.js new file mode 100644 index 000000000..2898a99a3 --- /dev/null +++ b/example/assets/scripts/controllers/issue-1136-markers-cluster-linger.js @@ -0,0 +1,72 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + + .controller("mapCtrl", ["$scope", "uiGmapLogger", function ($scope, logger) { + logger.doLog = true; + logger.currentLevel = logger.LEVELS.debug; + var lastId = 1; + var clusterThresh = 6; + + $scope.map = { + actualZoom: null, + showMarkers: true, + doCluster: true, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 18, + minZoom: 3 + }, + markerControl: {}, + events: { + idle: function (map) { + $scope.map.actualZoom = map.getZoom(); + if ($scope.addMarkers) + $scope.addMarkers(1000); + } + }, + center: { + latitude: 0, + longitude: 0 + }, + clusterOptions: {}, + zoom: 0 + }; + + $scope.searchResults = { + results: [] + }; + + + $scope.addMarkers = function (num) { + var markers = []; + var i = 0; + + for (i = 0; i < num; i++) { + var cords = chance.coordinates().split(','); + markers.push({ + 'coords': { + 'latitude': cords[0], + 'longitude': cords[1] + }, + 'key': 'someKey-' + lastId + }); + lastId++; + } + $scope.searchResults.results = $scope.searchResults.results.concat(markers); + }; + + $scope.forceClusterDraw = function(){ + $scope.map.markerControl.managerDraw(); + }; + + + $scope.reset = function () { + lastId = 1; + $scope.searchResults.results.length = 0; +// $scope.searchResults = { +// results: [] +// }; + }; + + } + ]); diff --git a/example/assets/scripts/controllers/issue-1169-windows-update.js b/example/assets/scripts/controllers/issue-1169-windows-update.js new file mode 100644 index 000000000..128fc74ce --- /dev/null +++ b/example/assets/scripts/controllers/issue-1169-windows-update.js @@ -0,0 +1,198 @@ +(function () { + angular.module('appMaps', ['uiGmapgoogle-maps']) + .config(function(uiGmapGoogleMapApiProvider) { + uiGmapGoogleMapApiProvider.configure({ + v: '3.17' + }); + }) + .controller('MapCtrl', ['$scope', 'uiGmapGoogleMapApi', 'MapFactory', '$interval', + function ($scope, uiGmapGoogleMapApi, MapFactory, $interval) { + console.log('MapCtrl Instantiating.'); + + this.map = {}; + var self = this; + + var updateMarker = function (marker) { + var marker = marker; + uiGmapGoogleMapApi.then(function (maps) { + self.map.markers = [marker]; + + console.log('self.map.markers[0].miles is ' + self.map.markers[0].miles); + + var onMarkerClicked = function (marker) { + marker.showWindow = true; + $scope.$apply(); + }; + + var onClickedFunction = function () { + onMarkerClicked(marker); + }; + + for (var i = 0; i < self.map.markers.length; i++) { + marker = self.map.markers[i]; + + marker.onClicked = onClickedFunction; + + var anchor = marker.icon.anchor; + marker.icon.anchor = + new google.maps.Point(anchor[0], anchor[1]); + } + }); + }; + + var currentSeq = 0; + var replay = function () { + console.log('replaying.'); + + updateMarker(MapFactory.updateMarkersModel(currentSeq)); + + if (6 - currentSeq - 1 > 0) { + currentSeq++; + } else { + console.log('No more sequences to replay. ' + + 'Stopping replay.'); + currentSeq = 0; + $interval.cancel(interval); + } + }; + + var startReplay = function () { + console.log('Starting replay.'); + // set everything to zero right away + if (currentSeq === 0) { + replay(); + } + + interval = $interval(replay, 2000); + }; + + uiGmapGoogleMapApi.then(function (maps) { + self.map.display = MapFactory.display; + self.map.polys = MapFactory.polys; + self.original = MapFactory.original; + startReplay(); + }); + } + ]).factory('MapFactory', function() { + var display = { + center: { + latitude: 42.194576, + longitude: -122.709477 + }, + zoom: 13, + control: {} + }; + + var polys = new Array({ + id: 1, + path: [{ + "latitude": 42.194603, + "longitude": -122.710070 + }, { + "latitude": 42.195239, + "longitude": -122.711154 + }, { + "latitude": 42.195931, + "longitude": -122.712366 + }, { + "latitude": 42.196741, + "longitude": -122.713889 + }, { + "latitude": 42.196988, + "longitude": -122.714426 + }, { + "latitude": 42.197091, + "longitude": -122.714447 + }, { + "latitude": 42.197703, + "longitude": -122.714179 + }, { + "latitude": 42.198538, + "longitude": -122.713729 + }, { + "latitude": 42.199913, + "longitude": -122.712902 + }, { + "latitude": 42.200143, + "longitude": -122.712731 + }, { + "latitude": 42.201454, + "longitude": -122.710982 + }], + stroke: { + color: '#0000FF', + weight: 5, + opacity: 0.5 + }, + editable: false, + draggable: false, + geodesic: true, + fit: true, + visible: true + }); + + + var updateMarkersModel = function(seq) { + console.log('seq: ' + seq); + var testData = [{ + "bib": 1, + "miles": 0, + "latitude": 42.194603, + "longitude": -122.710070 + }, { + "bib": 1, + "miles": 3.5, + "latitude": 42.195415, + "longitude": -122.711459 + }, { + "bib": 1, + "place": 2, + "miles": 6.5, + "lap": 1, + "latitude": 42.196624, + "longitude": -122.713841 + }, { + "bib": 1, + "miles": 10, + "latitude": 42.200232, + "longitude": -122.712511 + }, { + "bib": 1, + "miles": 14, + "latitude": 42.204412, + "longitude": -122.709829 + }, { + "bib": 1, + "miles": 15.6, + "latitude": 42.207607, + "longitude": -122.709399 + }]; + + //make a marker for each runner in the supplied list. + // either all, favorites, leaders, keymatchups. + var marker, runner, profile; + runner = testData[seq]; + + marker = { + id: 1, + latitude: runner.latitude, + longitude: runner.longitude, + icon: { + url: 'http://upload.wikimedia.org/wikipedia/commons/1/1d/Smile_icon_32x32.png', + anchor: [0, 32] + }, + bib: 1, + miles: runner.miles, + showWindow: false + }; + + return marker; + }; + + return { + display: display, + polys: polys, + updateMarkersModel: updateMarkersModel + }; + }); +})(); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-1170-map-center.js b/example/assets/scripts/controllers/issue-1170-map-center.js new file mode 100644 index 000000000..86fa992bf --- /dev/null +++ b/example/assets/scripts/controllers/issue-1170-map-center.js @@ -0,0 +1,36 @@ +(function () { + angular.module('appMaps', ['uiGmapgoogle-maps']) + .config(function (uiGmapGoogleMapApiProvider) { + uiGmapGoogleMapApiProvider.configure({ + v: '3.18' + }); + }) + .controller('MapCtrl', ['$scope', 'uiGmapGoogleMapApi', + '$interval', '$timeout', 'uiGmapGmapUtil', + function ($scope, uiGmapGoogleMapApi, $interval, $timeout, uiGmapGmapUtil) { + this.map = {}; + var self = this; + uiGmapGoogleMapApi.then(function (maps) { + angular.extend(self.map, { + center: { + latitude: 42.194576, + longitude: -122.709477 + }, + zoom: 13, + control: {} + }); + + $timeout(function () { + var map = self.map.control.getGMap(); + var maps = google.maps; + + map.fitBounds(new maps.LatLngBounds( + new maps.LatLng(43.194576, + -123.709477 + ), new maps.LatLng(42.194576, + -122.709477 + ))); + }, 2000); + }); + }]) +})(); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-1170-markers-fit.js b/example/assets/scripts/controllers/issue-1170-markers-fit.js new file mode 100644 index 000000000..1dca6995d --- /dev/null +++ b/example/assets/scripts/controllers/issue-1170-markers-fit.js @@ -0,0 +1,96 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']) +.controller("controller", function ($scope, $timeout, $log, $http) { + + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + $scope.removeMarkers = function () { + $log.info("Clearing markers. They should disappear from the map now"); + $scope.map.markers.length = 0; + $scope.map.markers2.length = 0; + $scope.map.dynamicMarkers.length = 0; + $scope.map.randomMarkers.length = 0; + $scope.map.mexiMarkers.length = 0; + $scope.map.polylines.length = 0; + $scope.map.clickedMarker = null; + $scope.searchLocationMarker = null; + $scope.map.infoWindow.show = false; + $scope.map.templatedInfoWindow.show = false; + // $scope.map.infoWindow.coords = null; + }; + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + + var markerToClose = null; + + $scope.onInsideWindowClick = function(){ + alert("Window hit!"); + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-1218-window-windows-open-close.js b/example/assets/scripts/controllers/issue-1218-window-windows-open-close.js new file mode 100644 index 000000000..d2b8fe31d --- /dev/null +++ b/example/assets/scripts/controllers/issue-1218-window-windows-open-close.js @@ -0,0 +1,125 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']) +.controller("controller", function ($scope, $timeout, $log, $http) { + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/angular-ui/angular-google-maps/2.0.X/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {} + , + virginia:{ + id:0, + latitude: 38.766933, + longitude: -78.156738 + }, + southCarolina:{ + id:0, + doShow:false, + latitude: 33.774581, + longitude: -80.661621 + }, + texases:[ + {id:0, + latitude: 35.115415, + longitude: -101.535645 + }, + {id:1, + latitude: 31.704803, + longitude: -95.207520 + }, + {id:2, + latitude: 29.969212, + longitude: -101.140137 + } + ], + californias:[ + {id:0, doShow:false, + latitude: 41.290190, + longitude: -121.706543}, + {id:1,doShow:false, + latitude: 37.662081, + longitude: -118.937988}, + {id:2,doShow:false, + latitude: 33.371825, + longitude: -116.257324} + ], + canadas:[ + {id:0, + latitude: 53.130294, + longitude: -118.410645 + }, + {id:1, + latitude: 53.288205, + longitude: -103.425293 + }, + {id:2, + latitude: 50.159305, + longitude: -80.441895 + } + ], + openedCanadaWindows:{}, + onWindowCloseClick: function(gMarker, eventName, model){ + if(model.dowShow !== null && model.dowShow !== undefined) + return model.doShow = false; + + }, + markerEvents: { + click:function(gMarker, eventName, model){ + model.doShow = true; + //if($scope.map.openedCanadaWindows.indexOf(model) < 0) + $scope.map.openedCanadaWindows = model; + //$scope.$evalAsync(); + //} + } + }} + }); + + $scope.map.canadas.forEach(function(model){ + model.closeClick = function(){ + model.doShow = false; + }; + }); + + var applyHandleCloseWShow = function (array){ + if(!array) return; + array.forEach(function(model){ + //slap on additional common functions + model.onWindowCloseClick = $scope.map.onWindowCloseClick; + }); + }; + + if(!$scope.map.windowsWShow) + $scope.map.windowsWShow = []; + + applyHandleCloseWShow($scope.map.californias); + //applyHandleCloseWShow($scope.map.texases, true); + + + var allDoShowModels = $scope.map.californias.concat([$scope.map.southCarolina]); + //delay show all show state windows + $timeout(function(){ + allDoShowModels.forEach(function(model){ + if(!model) return; + model.doShow = true; + $scope.$evalAsync(); + }); + },3000); +}); diff --git a/example/assets/scripts/controllers/issue-147-ng-show-map-refresh.js b/example/assets/scripts/controllers/issue-147-ng-show-map-refresh.js new file mode 100644 index 000000000..f3aea6cba --- /dev/null +++ b/example/assets/scripts/controllers/issue-147-ng-show-map-refresh.js @@ -0,0 +1,15 @@ +/** + * Created by Maamar Yacine MEDDAH on 14/08/2015. + */ +'use strict' +var app = angular.module('ngMap', ['uiGmapgoogle-maps']); +app.controller('gMapCtrl', ['$scope','uiGmapIsReady', function($scope, IsReady){ + $scope.map = { center: { latitude: 45, longitude: -73 }, zoom: 8 }; + $scope.displayed = false; + $scope.showMap = function(){ + $scope.displayed = true; + IsReady.promise().then(function (maps) { + google.maps.event.trigger(maps[0].map, 'resize'); + }); + } +}]); diff --git a/example/assets/scripts/controllers/issue-1485-doRebuildAll.js b/example/assets/scripts/controllers/issue-1485-doRebuildAll.js new file mode 100644 index 000000000..90557a4dd --- /dev/null +++ b/example/assets/scripts/controllers/issue-1485-doRebuildAll.js @@ -0,0 +1,82 @@ +angular.module('testApp', ['uiGmapgoogle-maps']) +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApiProvider) { + GoogleMapApiProvider.configure({ + // key: 'your api key', + v: '3.17', + libraries: 'weather,geometry,visualization,places' + }); +}]) +.controller('TestController', ['$scope','uiGmapGoogleMapApi', function ($scope,GoogleMapApi) { + + $scope.map = { + center: { + latitude: 33.7550, + longitude: -84.3900 + }, + zoom: 14, + options: { + scrollwheel: false, + panControl: false, + scaleControl: false, + draggable: true, + doRebuildAll: false, + maxZoom: 22, + minZoom: 0 + }, + clusterOptions: { + averageCenter: true, + minimumClusterSize: 10, + zoomOnClick: true + }, + clusterEvents: {}, + refresh : false, + bounds: {}, + events: { + idle: function() { + console.log('idle'); + } + }, + }; + + $scope.addMarker = function(){ + var marker = buildMarker(); + $scope.markers.push(marker); + } + + buildMarker = function(){ + var randomLat = getRandomInt(336550, 338550) / 10000; + var randomLng = getRandomInt(-843900,-843700) / 10000; + return { + id: nextId(), + coords: { + latitude: randomLat, + longitude: randomLng, + }, + options: $scope.markerOptions + } + } + + nextId = function() { + return $scope.markers.length + 1; + } + + getRandomInt = function(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; + } + + $scope.markers = []; + + GoogleMapApi.then(function(maps) { + console.log('start'); + $scope.maps = maps; + $scope.markerOptions = { + animation: $scope.maps.Animation.DROP, + visible: true + } + $scope.addMarker(); + $scope.addMarker(); + $scope.addMarker(); + $scope.doRebuildAll = false; + }); + +}]); diff --git a/example/assets/scripts/controllers/issue-154-marker-fit.js b/example/assets/scripts/controllers/issue-154-marker-fit.js new file mode 100644 index 000000000..ac24772ff --- /dev/null +++ b/example/assets/scripts/controllers/issue-154-marker-fit.js @@ -0,0 +1,174 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id:1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Marker 2' + }, + { + id:2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id:3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ], + markers2: [ + { + id: 1, + latitude: 46, + longitude: -77, + title: '[46,-77]' + }, + { + id: 2, + latitude: 33, + longitude: -77, + title: '[33,-77]' + }, + { + id:3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -125, + title: '[35,-125]' + } + ], + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + +// _.each($scope.map.markers, function (marker) { +// marker.closeClick = function () { +// marker.showWindow = false; +// $scope.$apply(); +// }; +// marker.onClicked = function () { +// $scope.onMarkerClicked(marker); +// }; +// }); +// +// _.each($scope.map.markers2, function (marker) { +// marker.closeClick = function () { +// marker.showWindow = false; +// $scope.$apply(); +// }; +// marker.onClicked = function () { +// $scope.onMarkerClicked(marker); +// }; +// }); + + $scope.removeMarkers = function () { + $log.info("Clearing markers. They should disappear from the map now"); + $scope.map.markers.length = 0; + $scope.map.markers2.length = 0; + $scope.map.dynamicMarkers.length = 0; + $scope.map.randomMarkers.length = 0; + $scope.map.mexiMarkers.length = 0; + $scope.map.polylines.length = 0; + $scope.map.clickedMarker = null; + $scope.searchLocationMarker = null; + $scope.map.infoWindow.show = false; + $scope.map.templatedInfoWindow.show = false; + // $scope.map.infoWindow.coords = null; + }; + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + + var markerToClose = null; + + $scope.onMarkerClicked = function (marker) { +// if (markerToClose) { +// markerToClose.showWindow = false; +// } + markerToClose = marker; // for next go around + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }; + + $scope.onInsideWindowClick = function(){ + alert("Window hit!"); + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-157-ng-click.js b/example/assets/scripts/controllers/issue-157-ng-click.js new file mode 100644 index 000000000..ac24772ff --- /dev/null +++ b/example/assets/scripts/controllers/issue-157-ng-click.js @@ -0,0 +1,174 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id:1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Marker 2' + }, + { + id:2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id:3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ], + markers2: [ + { + id: 1, + latitude: 46, + longitude: -77, + title: '[46,-77]' + }, + { + id: 2, + latitude: 33, + longitude: -77, + title: '[33,-77]' + }, + { + id:3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -125, + title: '[35,-125]' + } + ], + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + +// _.each($scope.map.markers, function (marker) { +// marker.closeClick = function () { +// marker.showWindow = false; +// $scope.$apply(); +// }; +// marker.onClicked = function () { +// $scope.onMarkerClicked(marker); +// }; +// }); +// +// _.each($scope.map.markers2, function (marker) { +// marker.closeClick = function () { +// marker.showWindow = false; +// $scope.$apply(); +// }; +// marker.onClicked = function () { +// $scope.onMarkerClicked(marker); +// }; +// }); + + $scope.removeMarkers = function () { + $log.info("Clearing markers. They should disappear from the map now"); + $scope.map.markers.length = 0; + $scope.map.markers2.length = 0; + $scope.map.dynamicMarkers.length = 0; + $scope.map.randomMarkers.length = 0; + $scope.map.mexiMarkers.length = 0; + $scope.map.polylines.length = 0; + $scope.map.clickedMarker = null; + $scope.searchLocationMarker = null; + $scope.map.infoWindow.show = false; + $scope.map.templatedInfoWindow.show = false; + // $scope.map.infoWindow.coords = null; + }; + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + + var markerToClose = null; + + $scope.onMarkerClicked = function (marker) { +// if (markerToClose) { +// markerToClose.showWindow = false; +// } + markerToClose = marker; // for next go around + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }; + + $scope.onInsideWindowClick = function(){ + alert("Window hit!"); + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-322.js b/example/assets/scripts/controllers/issue-322.js new file mode 100644 index 000000000..65250d2e4 --- /dev/null +++ b/example/assets/scripts/controllers/issue-322.js @@ -0,0 +1,170 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id:1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Marker 2' + }, + { + id:2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id:3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ], + markers2: [ + { + id: 1, + latitude: 46, + longitude: -77, + title: '[46,-77]' + }, + { + id: 2, + latitude: 33, + longitude: -77, + title: '[33,-77]' + }, + { + id:3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -125, + title: '[35,-125]' + } + ], + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + + _.each($scope.map.markers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + + _.each($scope.map.markers2, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + + $scope.removeMarkers = function () { + $log.info("Clearing markers. They should disappear from the map now"); + $scope.map.markers.length = 0; + $scope.map.markers2.length = 0; + $scope.map.dynamicMarkers.length = 0; + $scope.map.randomMarkers.length = 0; + $scope.map.mexiMarkers.length = 0; + $scope.map.polylines.length = 0; + $scope.map.clickedMarker = null; + $scope.searchLocationMarker = null; + $scope.map.infoWindow.show = false; + $scope.map.templatedInfoWindow.show = false; + // $scope.map.infoWindow.coords = null; + }; + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + + var markerToClose = null; + + $scope.onMarkerClicked = function (marker) { + if (markerToClose) { + markerToClose.showWindow = false; + } + markerToClose = marker; // for next go around + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-354-window-windows-rerender-content.js b/example/assets/scripts/controllers/issue-354-window-windows-rerender-content.js new file mode 100644 index 000000000..80678f5a8 --- /dev/null +++ b/example/assets/scripts/controllers/issue-354-window-windows-rerender-content.js @@ -0,0 +1,44 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']) +.value("rndAddToLatLon", function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}) +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.16', + libraries: 'weather,geometry,visualization' + }); +}]) + +.controller( + "controller", ['$rootScope', '$scope', '$location', '$http','uiGmapGoogleMapApi', + function ($rootScope, $scope, $location, $http, GoogleMapApi) { + $scope.map = { + center: { + latitude: 51.219053, + longitude: 4.404418 + }, + zoom: 15 + }; + + $scope.test = {}; + $scope.test.name = true; + $scope.windowOptions = { + boxClass:"custom-info-window", + disableAutoPan : true + }; + $scope.windows = [{ + id: 1, + latitude: 51.229053, + longitude: 4.404418, + show:true, + options: { + boxClass:"custom-info-window", + disableAutoPan : true + } + }]; + + GoogleMapApi.then(function(maps) { + + }); + }]); diff --git a/example/assets/scripts/controllers/issue-371-polygon-ng-repeat.js b/example/assets/scripts/controllers/issue-371-polygon-ng-repeat.js new file mode 100644 index 000000000..651cc6b23 --- /dev/null +++ b/example/assets/scripts/controllers/issue-371-polygon-ng-repeat.js @@ -0,0 +1,85 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", ['$rootScope', '$scope', '$location', '$http', function ($rootScope, $scope, $location, $http) { + $scope.map = { + center: { + latitude: -22.912122112782, longitude: -43.233883213252 + }, + options: { + disableDefaultUI: false, + panControl: true, + navigationControl: true, + scrollwheel: true, + scaleControl: false + }, + zoom: 15, + polygons: [] + }; + + $scope.polys = [ + { + id: 1, + clickable: true, + draggable: false, + editable: false, + visible: true, + geodesic: false, + stroke: {weight: 1, color: "#000080", opacity: 1}, + fill: {color: "#FFCE00", opacity: 1}, + path: [ + {latitude: -22.840109991554, longitude: -43.604843616486}, + {latitude: -22.895785581504, longitude: -43.660461902618}, + {latitude: -22.923614814482, longitude: -43.480560779572} + ] + }, + { id: 2, + clickable: true, + draggable: false, + editable: false, + visible: true, + geodesic: false, + stroke: {weight: 1, color: "black", opacity: 1}, + fill: {color: "#FFCE00", opacity: "0.3"}, + path: [ + {latitude: -22.220105243267, longitude: -42.533525750041}, + {latitude: -22.221535457024, longitude: -42.510480210185}, + {latitude: -22.241159694484, longitude: -42.517046257854}, + {latitude: -22.237336361699, longitude: -42.531315609813}, + {latitude: -22.227633565887, longitude: -42.534770295024} + ] + }, + { id: 3, + clickable: true, + draggable: false, + editable: false, + visible: true, + geodesic: true, + stroke: {weight: 1, color: "red", opacity: 1}, + fill: {color: "#0A67A3", opacity: "0.3"}, + path: [ + {latitude: -22.912122112782, longitude: -43.233883213252}, + {latitude: -22.912658229953, longitude: -43.233333360404}, + {latitude: -22.913135051277, longitude: -43.232568930835}, + {latitude: -22.914049160006, longitude: -43.231040071696}, + {latitude: -22.915007732268, longitude: -43.229344915599}, + {latitude: -22.915096671619, longitude: -43.229065965861}, + {latitude: -22.914958321493, longitude: -43.228862117976}, + {latitude: -22.91306587523, longitude: -43.227215241641}, + {latitude: -22.911054813301, longitude: -43.225868772715}, + {latitude: -22.910516219169, longitude: -43.230718206614}, + {latitude: -22.910317334098, longitude: -43.231544326991}, + {latitude: -22.910335246119, longitude: -43.231946658343}, + {latitude: -22.910432218057, longitude: -43.2324991934}, + {latitude: -22.9106644563, longitude: -43.233437966555}, + {latitude: -22.910508807309, longitude: -43.233000766486}, + {latitude: -22.9113932865, longitude: -43.2337786071} + ] + } + ]; + + setTimeout(function () { + $scope.map.polygons = $scope.polys; + console.log('plota poly'); + $scope.$apply(); + }, 3600); + }]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-382-window-windows-ng-show.js b/example/assets/scripts/controllers/issue-382-window-windows-ng-show.js new file mode 100644 index 000000000..65689cfc5 --- /dev/null +++ b/example/assets/scripts/controllers/issue-382-window-windows-ng-show.js @@ -0,0 +1,38 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + $scope.map = { + center: { + latitude: 51.219053, + longitude: 4.404418 + }, + zoom: 15 + }; + + $scope.markersClick = function (m) { + + }; + $scope.map.markers = [ + { + wonkyId:0, + longitude: 4.404418, + latitude: 51.219053 + } + ]; +}) +.controller('winCtrl', ['$rootScope', '$scope', '$location', '$http', + function ($rootScope, $scope, $location, $http) { + $scope.showSpan = true; + }]); diff --git a/example/assets/scripts/controllers/issue-393-cluster-events-mapped.js b/example/assets/scripts/controllers/issue-393-cluster-events-mapped.js new file mode 100644 index 000000000..0a40f558f --- /dev/null +++ b/example/assets/scripts/controllers/issue-393-cluster-events-mapped.js @@ -0,0 +1,146 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Marker 2' + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ], + markers2: [ + { + id: 1, + latitude: 46, + longitude: -77, + title: '[46,-77]' + }, + { + id: 2, + latitude: 48, + longitude: -79, + title: '[33,-77]' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 47, + longitude: -78, + title: '[35,-125]' + } + ], + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + + $scope.clusterEvents = { + click: function (cluster, clusterModels) { + alert("Cluster Models: clusterModels: " + JSON.stringify(clusterModels)); + } + }; + + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + + var markerToClose = null; + + $scope.onMarkerClicked = function (marker) { +// if (markerToClose) { +// markerToClose.showWindow = false; +// } + markerToClose = marker; // for next go around + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }; + + $scope.onInsideWindowClick = function () { + alert("Window hit!"); + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-432-markers-fit-clustering.js b/example/assets/scripts/controllers/issue-432-markers-fit-clustering.js new file mode 100644 index 000000000..abc389dc9 --- /dev/null +++ b/example/assets/scripts/controllers/issue-432-markers-fit-clustering.js @@ -0,0 +1,152 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Marker 2' + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ], + markers2: [ + { + id: 1, + latitude: 46, + longitude: -77, + title: '[46,-77]' + }, + { + id: 2, + latitude: 48, + longitude: -79, + title: '[33,-77]' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 47, + longitude: -78, + title: '[35,-125]' + } + ], + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + + $scope.clusterEvents = { + click: function (cluster, clusterModels) { + alert("Cluster Models: clusterModels: " + JSON.stringify(clusterModels)); + } + }; + + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + + var markerToClose = null; + + $scope.onMarkerClicked = function (marker) { +// if (markerToClose) { +// markerToClose.showWindow = false; +// } + markerToClose = marker; // for next go around + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }; + + $scope.onInsideWindowClick = function () { + alert("Window hit!"); + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + }, + { + id: 4, + icon: 'assets/images/plane.png', + latitude: 35.2, + longitude: -127.1 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-482-markers-animation-clustering.js b/example/assets/scripts/controllers/issue-482-markers-animation-clustering.js new file mode 100644 index 000000000..4108439fe --- /dev/null +++ b/example/assets/scripts/controllers/issue-482-markers-animation-clustering.js @@ -0,0 +1,105 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + +// var oldMarker = null; + $scope.onMarkerClicked = function (marker) { +// if(oldMarker){ +//// oldMarker.options = {animation:google.maps.Animation.DROP}; // or 2 +// oldMarker.options = {animation:0}; //or null +// } + marker.showWindow = false; + if(marker.options) + marker.options = null; + else + marker.options = {animation:google.maps.Animation.BOUNCE}; //or 1 +// oldMarker = marker; + $scope.$apply(); + }; + + $scope.onInsideWindowClick = function () { + alert("Window hit!"); + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + }, + { + id: 4, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -128, + title: '[35,-125]' + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-482-markers-animation.js b/example/assets/scripts/controllers/issue-482-markers-animation.js new file mode 100644 index 000000000..9dca59e24 --- /dev/null +++ b/example/assets/scripts/controllers/issue-482-markers-animation.js @@ -0,0 +1,143 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Marker 2' + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ], + markers2: [ + { + id: 1, + latitude: 46, + longitude: -77, + title: '[46,-77]' + }, + { + id: 2, + latitude: 48, + longitude: -79, + title: '[33,-77]' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 47, + longitude: -78, + title: '[35,-125]' + } + ], + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + +// var oldMarker = null; + $scope.onMarkerClicked = function (marker) { +// if(oldMarker){ +//// oldMarker.options = {animation:google.maps.Animation.DROP}; // or 2 +// oldMarker.options = {animation:0}; //or null +// } + marker.showWindow = false; + if(marker.options) + marker.options = null; + else + marker.options = {animation:google.maps.Animation.BOUNCE}; //or 1 +// oldMarker = marker; + $scope.$apply(); + }; + + $scope.onInsideWindowClick = function () { + alert("Window hit!"); + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-484-markers-self.js b/example/assets/scripts/controllers/issue-484-markers-self.js new file mode 100644 index 000000000..8b79d4544 --- /dev/null +++ b/example/assets/scripts/controllers/issue-484-markers-self.js @@ -0,0 +1,109 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + + markers: [ + { + division: "US", + type: "US", + // coords:{ + latitude: 41.169444444444444, + longitude: -75.87777777777778, + driverCode: "GRIP", + trailer: " 5555", + status: "D", + orderNumber: "9999999", + destinationCityCode: "MT", + destinationStateCode: "PA", + contactCityCode: "PICK", + contactStateCode: "ON", + icon: undefined, + id: "7" + }, + { + division: "US", + type: "US", + // coords:{ + latitude: 43.169444444444444, + longitude: -75.87777777777778, + driverCode: "GRIP", + trailer: " 5555", + status: "D", + orderNumber: "9999999", + destinationCityCode: "MT", + destinationStateCode: "PA", + contactCityCode: "PICK", + contactStateCode: "ON", + icon: undefined, + id: "10" + } + ] + , + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + + $log.info("Markers: " + $scope.map.markers); + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-495-polyline-fit.js b/example/assets/scripts/controllers/issue-495-polyline-fit.js new file mode 100644 index 000000000..b4d5a45f5 --- /dev/null +++ b/example/assets/scripts/controllers/issue-495-polyline-fit.js @@ -0,0 +1,71 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1); +}).controller("controller", ['$rootScope', '$scope', '$location', '$http', function ($rootScope, $scope, $location, $http) { + $scope.map = { + // http://angular-google-maps.org/use + center: { + latitude: 17.38504400000000, + longitude: 78.48667100000000 + }, + zoom: 9, + lineStyle: { + color: '#333', + weight: 5, + opacity: 0.7 + } + }; + $scope.locations = [ + { + "createdAt": { + "date": "2014-06-13 15:00:33", + "timezone_type": 3, + "timezone": "Asia\/Kolkata" + }, + "source": "121", + "source_type": "entry_created", + "latitude": 17.485044, + "longitude": 79.386671, + "location": "Unknown", + "title": "1) Created entry on: One AAA at 2014-06-13 15:00:33 (Unknown)" + }, + { + "createdAt": { + "date": "2014-06-14 08:21:05", + "timezone_type": 3, + "timezone": "Asia\/Kolkata" + }, + "source": null, + "source_type": "login", + "latitude": 17.685044, + "longitude": 78.586671, + "location": "Unknown", + "title": "2) Login at 2014-06-14 08:21:05 (Unknown)" + }, + { + "createdAt": { + "date": "2014-06-14 08:30:30", + "timezone_type": 3, + "timezone": "Asia\/Kolkata" + }, + "source": null, + "source_type": "logout", + "latitude": 18.385044, + "longitude": 78.986671, + "location": "Unknown", + "title": "3) Logout at 2014-06-14 08:30:30 (Unknown)" + }, + { + "createdAt": { + "date": "2014-06-15 00:16:36", + "timezone_type": 3, + "timezone": "Asia\/Kolkata" + }, + "source": null, + "source_type": "login", + "latitude": 17.885044, + "longitude": 78.986671, + "location": "Unknown", + "title": "4) Login at 2014-06-15 00:16:36 (Unknown)" + } + ]; +}]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-498-marker-move-loaded.js b/example/assets/scripts/controllers/issue-498-marker-move-loaded.js new file mode 100644 index 000000000..9ae00b501 --- /dev/null +++ b/example/assets/scripts/controllers/issue-498-marker-move-loaded.js @@ -0,0 +1,60 @@ +angular.module('testApp', ['uiGmapgoogle-maps']).controller('TestController', ['$scope', function ($scope) { + $scope.map = { + center: { + latitude: 45, + longitude: -73 + }, + zoom: 3, + events: { + tilesloaded: function (map, eventName, originalEventArgs) { + //map is trueley ready then this callback is hit + }, + click: function (mapModel, eventName, originalEventArgs) { + var e = originalEventArgs[0]; + var lat = e.latLng.lat(), + lon = e.latLng.lng(); + $scope.map.clickedMarker = { + id:0, + title: 'You clicked here ' + 'lat: ' + lat + ' lon: ' + lon, + latitude: lat, + longitude: lon + }; + //scope apply required because this event handler is outside of the angular domain + $scope.$apply(); + } + }, + markers: [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Markers: 1' + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Markers: 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Markers: 3' + } + ], + clickedMarker: { + id:0, + title: '' + }, + onMarkerClicked: function (marker) { + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + } + }; +}]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-504-markers-flash.js b/example/assets/scripts/controllers/issue-504-markers-flash.js new file mode 100644 index 000000000..6bea0d23e --- /dev/null +++ b/example/assets/scripts/controllers/issue-504-markers-flash.js @@ -0,0 +1,25 @@ +angular.module('testApp', ['uiGmapgoogle-maps']).controller('TestController', ['$scope', function ($scope) { + $scope.map = { + center: { + latitude: 45, + longitude: -73 + }, + zoom: 3 + }; + var ICONS = { + test: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Go-home.svg/48px-Go-home.svg.png', + test1: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Go-up.svg/48px-Go-up.svg.png' + }; + $scope.sites = [ + {coords: {longitude: 25, latitude: -25}, site_id: 0, icon: ICONS['test']}, + {coords: {longitude: 25, latitude: 25}, site_id: 1, icon: ICONS['test']}, + {coords: {longitude: -25, latitude: -25}, site_id: 2, icon: ICONS['test']}, + {coords: {longitude: -25, latitude: 25}, site_id: 3, icon: ICONS['test']} + ]; + + $scope.clickMarker = function (gMarker, eventName, model) { + model.icon = ICONS['test1']; + $scope.$apply(); + }; + +}]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-507-windows-show-w-marker-broken.js b/example/assets/scripts/controllers/issue-507-windows-show-w-marker-broken.js new file mode 100644 index 000000000..4da4b6cb1 --- /dev/null +++ b/example/assets/scripts/controllers/issue-507-windows-show-w-marker-broken.js @@ -0,0 +1,43 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + .controller('mainCtrl', function($scope) { + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4, bounds: {}}; + $scope.options = {scrollwheel: false}; + var createRandomMarker = function (i, bounds, idKey) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (idKey == null) { + idKey = "id"; + } + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + latitude: latitude, + longitude: longitude, + title: 'm' + i, + show: false + }; + ret.onClick = function() { + console.log("Clicked!"); + ret.show = !ret.show; +// $scope.$apply(); + }; + ret[idKey] = i; + return ret; + }; + $scope.randomMarkers = []; + // Get the bounds from the map once it's loaded + $scope.$watch(function() { return $scope.map.bounds; }, function(nv, ov) { + // Only need to regenerate once + if (!ov.southwest && nv.southwest) { + var markers = []; + for (var i = 0; i < 50; i++) { + markers.push(createRandomMarker(i, $scope.map.bounds)) + } + $scope.randomMarkers = markers; + } + }, true); + }); diff --git a/example/assets/scripts/controllers/issue-522-polyline-no-paths.js b/example/assets/scripts/controllers/issue-522-polyline-no-paths.js new file mode 100644 index 000000000..bb2e629ce --- /dev/null +++ b/example/assets/scripts/controllers/issue-522-polyline-no-paths.js @@ -0,0 +1,175 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .factory('channel', function () { + return function () { + var callbacks = []; + this.add = function (cb) { + callbacks.push(cb); + }; + this.invoke = function () { + callbacks.forEach(function (cb) { + cb(); + }); + }; + return this; + }; + }) + .service('polyChannel', ['channel', function (channel) { + return new channel() + }]) + .service('clearChannel', ['channel', function (channel) { + return new channel() + }]) + .controller('mapWidgetCtrl', ['$scope', 'polyChannel', 'clearChannel', + function ($scope, polyChannel, clearChannel) { + $scope.polyButton = { + controlText: 'make polys', + controlClick: function () { + polyChannel.invoke() + } + }; + $scope.clearWidget = { + controlText: 'clear', + controlClick: function () { + clearChannel.invoke() + } + }; + }]) + .config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.17', + libraries: 'geometry' + }); + }]) + .controller('ctrl', ['$rootScope', '$scope', "uiGmapLogger", 'polyChannel', 'clearChannel', + function ($rootScope, $scope, $log, polyChannel, clearChannel) { + $scope.map = { + center: { + latitude: 45, + longitude: -73 + }, + pan: true, + zoom: 4, + refresh: false, + options: { + disableDefaultUI: true + }, + events: {}, + bounds: {}, + polys: [], + polyEvents: { + click: function (gPoly, eventName, polyModel) { + window.alert("Poly Clicked: id:" + polyModel.$id + ' ' + JSON.stringify(polyModel.path)); + } + }, + draw: undefined + }; + var createPolys = function () { + $log.info('polys should be injected'); + $scope.map.polys = [ + { + id: 1, + path: [ + { + latitude: 45, + longitude: -74 + }, + { + latitude: 30, + longitude: -89 + }, + { + latitude: 37, + longitude: -122 + }, + { + latitude: 60, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true, + icons: [ + { + icon: { + path: google.maps.SymbolPath.BACKWARD_OPEN_ARROW + }, + offset: '25px', + repeat: '50px' + } + ] + }, + { + id: 2, + path: [ + { + latitude: 47, + longitude: -74 + }, + { + latitude: 32, + longitude: -89 + }, + { + latitude: 39, + longitude: -122 + }, + { + latitude: 62, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true, + icons: [ + { + icon: { + path: google.maps.SymbolPath.BACKWARD_OPEN_ARROW + }, + offset: '25px', + repeat: '50px' + } + ] + }, + { + id: 3, + path: google.maps.geometry.encoding.decodePath("uowfHnzb}Uyll@i|i@syAcx}Cpj[_wXpd}AhhCxu[ria@_{AznyCnt^|re@nt~B?m|Awn`G?vk`RzyD}nr@uhjHuqGrf^ren@"), + stroke: { + color: '#4EAE47', + weight: 3 + }, + editable: false, + draggable: false, + geodesic: false, + visible: true + } + ] + }; + //add beginDraw as a subscriber to be invoked by the channel, allows controller to controller coms + polyChannel.add(createPolys); + clearChannel.add(function () { + $scope.map.polys = []; + }); + }]) + .run(['$templateCache', 'uiGmapLogger',function ($templateCache, Logger) { + Logger.doLog = true; + Logger.info('polyButton.tpl.html should be in cache'); + $templateCache.put('polyButton.tpl.html', + ''); + $templateCache.put('clear.tpl.html', + ''); + }]); +})(window, angular); diff --git a/example/assets/scripts/controllers/issue-534-markers-child-destroy.js b/example/assets/scripts/controllers/issue-534-markers-child-destroy.js new file mode 100644 index 000000000..4ee28cb87 --- /dev/null +++ b/example/assets/scripts/controllers/issue-534-markers-child-destroy.js @@ -0,0 +1,106 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: true, + title: 'Marker 2' + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ], + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + +// var oldMarker = null; + $scope.onMarkerClicked = function (model) { + //model.showWindow = true; + //$scope.$apply(); + }; + + $scope.onInsideWindowClick = function () { + alert("Window hit!"); + }; + + $timeout(function () { + var markers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(markers, function (marker) { + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.markers = markers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-538-window-plus1.js b/example/assets/scripts/controllers/issue-538-window-plus1.js new file mode 100644 index 000000000..0f4be179b --- /dev/null +++ b/example/assets/scripts/controllers/issue-538-window-plus1.js @@ -0,0 +1,23 @@ +// Code goes here + +angular.module('app', ['uiGmapgoogle-maps']) + .controller('mainCtrl', ['$scope', function($scope) { + $scope.number = 0; + $scope.map = { + center: { + latitude: 40.1451, + longitude: -99.6680 + }, + zoom: 4, + marker: { + id:0, + coords: { + latitude: 40.1451, + longitude: -99.6680 + } + } + }; + $scope.click = function() { + $scope.number += 1; + } + }]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-545-marker-flash.js b/example/assets/scripts/controllers/issue-545-marker-flash.js new file mode 100644 index 000000000..91711a9dd --- /dev/null +++ b/example/assets/scripts/controllers/issue-545-marker-flash.js @@ -0,0 +1,162 @@ +/* + * ############################################################################# + * ## EZ Tween ################################################################# + * ############################################################################# + */ +(function(window, undefined) { + window.EZ = window.EZ || {}; + window.EZ.Easing = { + Linear: function(percentComplete) { + return percentComplete; + } + }; + var Tween = function(from) { + if ( typeof from !== 'number' && Object.prototype.toString.call(from) !== '[object Object]' ) { + throw 'from value must be an object or an integer'; + } + this.from = from; + this.to = from; + this.duration = 0; + this.interval = 10; + this.tweenFn = EZ.Easing.Linear; + }; + Tween.prototype.setTo = function(to) { + if ( (typeof to) !== (typeof this.from) ) { + throw 'to value must be the same type as from value'; + } + this.to = to; + return this; + }; + Tween.prototype.setDuration = function(duration) { + this.duration = duration; + return this; + }; + Tween.prototype.setInterval = function(interval) { + this.interval = interval; + return this; + }; + Tween.prototype.setTweenFn = function(tweenFn) { + this.tweenFn = tweenFn; + return this; + }; + Tween.prototype.start = function(stepCallback, completeCallback) { + var timeElapsed = 0; + var duration = parseInt(this.duration, 10); + var interval = parseInt(this.interval, 10); + if ( typeof this.tweenFn !== 'function' ) { + throw 'tweenFn must be a function'; + } + if ( isNaN(interval) || interval <= 0 ) { + throw 'Interval must be a positive integer'; + } + if ( isNaN(duration) || duration <= 0 ) { + throw 'Duration must be a positive integer'; + } + if ( interval > duration ) { + duration = interval; + } + interval = makeIntervalFullyDivisible(interval, duration); + + var _self = this; + var currentValue; + var eLoop = window.setInterval(function() { + timeElapsed += interval; + if ( typeof _self.from === 'number' ) { + currentValue = tweenNumeric(_self.from, _self.to - _self.from, _self.tweenFn(timeElapsed / duration)); + } else { + currentValue = clone(_self.from); + for ( var k in _self.to ) { + if ( typeof _self.from[k] !== 'number' || typeof _self.to[k] !== 'number' ) { + continue; + } + currentValue[k] = tweenNumeric(_self.from[k], _self.to[k] - _self.from[k], _self.tweenFn(timeElapsed / duration)); + } + } + if ( typeof stepCallback === 'function' ) { + stepCallback.call(this, currentValue); + } + if ( timeElapsed >= duration ) { + if ( typeof completeCallback === 'function' ) { + completeCallback.call(this, currentValue); + } + window.clearInterval(eLoop); + } + }, interval); + return this; + }; + window.EZ.Tween = Tween; + function tweenNumeric(from, valueDiff, percentComplete) { + var result = from + (valueDiff * percentComplete); + if ( result > from + valueDiff) { + result = from + valueDiff; + } + return result; + } + function makeIntervalFullyDivisible(interval, duration) { + return duration / Math.ceil(duration / interval); + } + function clone(obj) { + if (null === obj || "object" != typeof obj) return obj; + var copy = obj.constructor(); + for (var attr in obj) { + if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; + } + return copy; + } +})(window); + +/* + * ############################################################################# + * ## TRACKING CTRL ############################################################ + * ############################################################################# + */ +(function(window, ng, undefined) { + var app = ng.module('app', ['uiGmapgoogle-maps']); + app.controller('TrackingCtrl', ['$rootScope', '$scope', '$timeout', '$log', function($rootScope, $scope, $timeout, $log) { + $scope.map = { + center: { + latitude: 53.406754, + longitude: -2.158843 + }, + pan: true, + zoom: 14, + refresh: false, + options: { + disableDefaultUI: true + }, + events: {}, + bounds: {}, + markers: [{ + id: 1, + location: { + latitude: 53.406754, + longitude: -2.158843 + }, + options: { + title: 'Marker' + }, + showWindow: false, + moveTo: function(location, duration) { + var _self = this; + if ( typeof duration === 'undefined' ) { + duration = 1; + } + (new EZ.Tween(_self.location)) + .setTo(location) + .setDuration(duration) + .setInterval(13) + .start(function(location) { + $scope.$apply(function() { + _self.location = location; + }); + }); + return this; + } + }] + }; + $scope.map.markers[0].moveTo({ + latitude: 53.416754, + longitude: -2.148843 + }, 1000); + }]); +})(window, angular); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-621-owl-w-window.js b/example/assets/scripts/controllers/issue-621-owl-w-window.js new file mode 100644 index 000000000..abbf47197 --- /dev/null +++ b/example/assets/scripts/controllers/issue-621-owl-w-window.js @@ -0,0 +1,55 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + v: '3.17', + libraries: '' + }); +}]) + +.controller('mainCtrl', function ($scope) { + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4, bounds: {}}; + $scope.options = {scrollwheel: false}; + $scope.showPinkMarkers = true; + + var createRandomMarker = function (i, bounds, idKey, icon) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (idKey === null) { + idKey = "id"; + } + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + latitude: latitude, + longitude: longitude, + title: 'm' + i + }; + if (icon !== null) { + ret.icon = icon; + } + ret[idKey] = i; + ret.show= true; + return ret; + }; + $scope.randomMarkers = []; + $scope.pinkRandomMarkers = []; + // Get the bounds from the map once it's loaded + $scope.$watch(function () { + return $scope.map.bounds; + }, function (nv, ov) { + if (!ov.southwest && nv.southwest) { + var markers = []; + var pinkRandomMarkers = []; + for (var i = 0; i < 100; i++) { + markers.push(createRandomMarker(i, $scope.map.bounds, null, 'http://www.ozmorris.com/images/owl5.png')); + pinkRandomMarkers.push(createRandomMarker(i + 100, $scope.map.bounds, null, 'http://www.ozmorris.com/images/owl16.png')); + } + $scope.randomMarkers = markers; + $scope.pinkRandomMarkers = pinkRandomMarkers; + } + }, true); +}); diff --git a/example/assets/scripts/controllers/issue-621-owl.js b/example/assets/scripts/controllers/issue-621-owl.js new file mode 100644 index 000000000..eaeea237b --- /dev/null +++ b/example/assets/scripts/controllers/issue-621-owl.js @@ -0,0 +1,63 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + v: '3.17', + libraries: '' + }); +}]) + +.controller('mainCtrl', function ($scope, $timeout, uiGmapLogger) { + var $log = uiGmapLogger; + $log.currentLevel = $log.LEVELS.debug; + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4, bounds: {}}; + $scope.options = {scrollwheel: false}; + $scope.showPinkMarkers = true; + + var createRandomMarker = function (i, bounds, idKey, icon) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (idKey === null) { + idKey = "id"; + } + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + latitude: latitude, + longitude: longitude, + title: 'm' + i + }; + if (icon !== null) { + ret.icon = icon; + } + ret[idKey] = i; + ret.show= true; + return ret; + }; + $scope.randomMarkers = []; + $scope.pinkRandomMarkers = []; + + var createMarkers = function(){ + var markers = []; + var pinkRandomMarkers = []; + for (var i = 0; i < 250; i++) { + markers.push(createRandomMarker(i, $scope.map.bounds, null, 'http://www.ozmorris.com/images/owl5.png')); + pinkRandomMarkers.push(createRandomMarker(i + 100, $scope.map.bounds, null, 'http://www.ozmorris.com/images/owl16.png')); + } + $scope.randomMarkers = markers; + $scope.pinkRandomMarkers = pinkRandomMarkers; + }; + // Get the bounds from the map once it's loaded + $scope.$watch(function () { + return $scope.map.bounds; + }, function (nv, ov) { + if (!ov.southwest && nv.southwest) { + createMarkers(); + } + }, true); + +// $timeout(createMarkers,1000); +}); diff --git a/example/assets/scripts/controllers/issue-622-many-markers-destroy.js b/example/assets/scripts/controllers/issue-622-many-markers-destroy.js new file mode 100644 index 000000000..6116978cf --- /dev/null +++ b/example/assets/scripts/controllers/issue-622-many-markers-destroy.js @@ -0,0 +1,188 @@ +// +angular.module("app", ['uiGmapgoogle-maps']) + +.value("rndAddToLatLon", function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1); +}) + +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.16', + libraries: 'weather,geometry,visualization' + }); +}]) + +.run(['$templateCache', function ($templateCache) { + $templateCache.put('genMarkersInput.tpl.html', + '
' + + '' + + '
' + + '' + + '
' + + '
{{checked ? "overwrite" : "Dont overwrite"}}'+ + '
' + ); + + $templateCache.put('clearMarkers.tpl.html', + ''); +}]) + +.factory('channel', function(){ + return function () { + var callbacks = []; + this.add = function (cb) { + callbacks.push(cb); + }; + this.invoke = function () { + var args = arguments; + callbacks.forEach(function (cb) { + cb.apply(undefined,args); + }); + }; + return this; + }; +}) +.service('genMarkersChannel',['channel',function(channel){ + return new channel() +}]) +.service('clearMarkersChannel',['channel',function(channel){ + return new channel() +}]) + +.controller('controlCtrl', ['$scope','clearMarkersChannel','genMarkersChannel', +function ($scope, clearMarkersChannel,genMarkersChannel) { + angular.extend($scope, { + clearClick: function () { + clearMarkersChannel.invoke(); + }, + genClick: function () { + genMarkersChannel.invoke(parseInt($scope.numOfMarkers.val),$scope.checked); + }, + numOfMarkers: {val: 0} + }); +}]) + +.controller("mainCtrl",[ +'$scope', '$timeout', 'uiGmapLogger', +'$http', 'rndAddToLatLon','uiGmapGoogleMapApi', +'clearMarkersChannel','genMarkersChannel', function ( + $scope, $timeout, $log, + $http, rndAddToLatLon,GoogleMapApi, + clearMarkersChannel,genMarkersChannel) { + var staticMarkers = [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Marker 2', + options: { + animation: 1 + } + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ]; + + genMarkersChannel.add(function(numOfMarkers, overwriteWStatic){ + $timeout(function(){ + $scope.map.markers = $scope.genRandomMarkers(numOfMarkers); + if(overwriteWStatic){ + $scope.map.markers = staticMarkers; + } + },0); + }); + clearMarkersChannel.add(function(){ + $scope.map.markers = [] + }); + + $log.doLog = true + + GoogleMapApi.then(function(maps) { + + }); + + var versionUrl = (window.location.host === "rawgithub.com" || window.location.host === "rawgit.com") ? + "http://rawgit.com/angular-ui/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data){ + console.error("no version object found!!"); + $scope.version = data.version; + } + }); + + var createRandomMarker = function (i, bounds, idKey) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (idKey == null) + idKey = "id"; + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + latitude: latitude, + longitude: longitude, + title: 'm' + i + }; + ret[idKey] = i; + return ret; + }; + + var genRandomMarkers = function (numberOfMarkers, scope) { + var markers = []; + for (var i = 0; i < numberOfMarkers; i++) { + markers.push(createRandomMarker(i, scope.map.bounds)) + } + return markers; + }; + + angular.extend($scope, { + map: { + control: {}, + version: "uknown", + heatLayerCallback: function (layer) { + //set the heat layers backend data + var mockHeatLayer = new MockHeatLayer(layer); + }, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: staticMarkers + } + }); + + $scope.genRandomMarkers = function (numberOfMarkers) { + return genRandomMarkers(numberOfMarkers, $scope); + }; + + }]); diff --git a/example/assets/scripts/controllers/issue-624-drawing-manager.js b/example/assets/scripts/controllers/issue-624-drawing-manager.js new file mode 100644 index 000000000..46afb430b --- /dev/null +++ b/example/assets/scripts/controllers/issue-624-drawing-manager.js @@ -0,0 +1,48 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + .controller('mainCtrl', function($scope) { + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4, bounds: {}}; + $scope.options = {scrollwheel: false}; + $scope.drawingManagerOptions = { + drawingMode: google.maps.drawing.OverlayType.MARKER, + drawingControl: true, + drawingControlOptions: { + position: google.maps.ControlPosition.TOP_CENTER, + drawingModes: [ + google.maps.drawing.OverlayType.MARKER, + google.maps.drawing.OverlayType.CIRCLE, + google.maps.drawing.OverlayType.POLYGON, + google.maps.drawing.OverlayType.POLYLINE, + google.maps.drawing.OverlayType.RECTANGLE + ] + }, + circleOptions: { + fillColor: '#ffff00', + fillOpacity: 1, + strokeWeight: 5, + clickable: false, + editable: true, + zIndex: 1 + } + }; + $scope.eventHandler = { + overlaycomplete: function (dm, name, scope, objs) { + console.log("You successfully placed a %s", dm.drawingMode); + }, + polylinecomplete: function (dm, name, scope, objs) { + console.log("You finished drawing polyline to [%s]", objs[0].getPath().getArray().join(",")); + } + }; + $scope.markersAndCircleFlag = true; + $scope.drawingManagerControl = {}; + $scope.$watch('markersAndCircleFlag', function() { + if (!$scope.drawingManagerControl.getDrawingManager) { + return; + } + var controlOptions = angular.copy($scope.drawingManagerOptions); + if (!$scope.markersAndCircleFlag) { + controlOptions.drawingControlOptions.drawingModes.shift(); + controlOptions.drawingControlOptions.drawingModes.shift(); + } + $scope.drawingManagerControl.getDrawingManager().setOptions(controlOptions); + }); + }); diff --git a/example/assets/scripts/controllers/issue-654-marker-events-break-after-added.js b/example/assets/scripts/controllers/issue-654-marker-events-break-after-added.js new file mode 100644 index 000000000..ac0d78be3 --- /dev/null +++ b/example/assets/scripts/controllers/issue-654-marker-events-break-after-added.js @@ -0,0 +1,65 @@ +var app = angular.module('app', ['uiGmapgoogle-maps']); +app.controller('TrackingCtrl', ['$rootScope', '$scope', '$timeout', '$log', 'uiGmapGoogleMapApi', + function ($rootScope, $scope, $timeout, $log, GoogleMapApi) { + $scope.map = { + center: { + latitude: 53.406754, + longitude: -2.158843 + }, + pan: true, + zoom: 5, + refresh: false, + events: {}, + bounds: {} + }; + //when the API is really ready and loaded play w/ the scope + GoogleMapApi.then(function (map) { + $scope.map.markers = [ + { + id: 1, + location: { + latitude: 53.406754, + longitude: -2.158843 + }, + options: { + title: 'Marker1' + }, + showWindow: false + } + ]; + $scope.map.markerEvents = { + dblclick: function (gMarker, eventName, model, latLngArgs) { + var id = model.idKey || model.id; + alert("Marker double clicked! Model: " + id); + } + } + $timeout(function () { + $scope.map.markers[0].latitude = 53.416754; + $scope.map.markers[0].longitude = -2.148843; + + _.range(10).forEach(function (i) { + $scope.map.markers.push({ + id: i + 1, + location: { + latitude: $scope.map.markers[0].latitude + 1 * i, + longitude: $scope.map.markers[0].longitude + 1 * i + }, + options: { + title: 'Marker2' + }, + showWindow: false + }) + }); + }, 1000); + }); +}]) +. +config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ +// key: 'your api key', + v: '3.16', + libraries: 'weather,geometry,visualization' + }); +}]) + +; diff --git a/example/assets/scripts/controllers/issue-663-marker-events-once.js b/example/assets/scripts/controllers/issue-663-marker-events-once.js new file mode 100644 index 000000000..64ea0a9c8 --- /dev/null +++ b/example/assets/scripts/controllers/issue-663-marker-events-once.js @@ -0,0 +1,92 @@ +angular.module('app', ['uiGmapgoogle-maps']) + .controller('ctrl', ['$scope', function ($scope) { + $scope.map = { + center: { + latitude: 45, + longitude: -73 + }, + zoom: 3, + events: { + tilesloaded: function (map, eventName, originalEventArgs) { + //map is trueley ready then this callback is hit + }, + click: function (mapModel, eventName, originalEventArgs) { + var e = originalEventArgs[0]; + var lat = e.latLng.lat(), + lon = e.latLng.lng(); + $scope.map.clickedMarker = { + id: 0, + title: 'You clicked here ' + 'lat: ' + lat + ' lon: ' + lon, + latitude: lat, + longitude: lon + }; + //scope apply required because this event handler is outside of the angular domain + $scope.$apply(); + } + }, + markers: [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Markers: 1' + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Markers: 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Markers: 3' + } + ], + markers2: [ + { + id: 1, + latitude: 49, + longitude: -74, + showWindow: false, + title: 'Markers: 1' + }, + { + id: 2, + latitude: 19, + longitude: 30, + showWindow: false, + title: 'Markers: 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 41, + longitude: -122, + showWindow: false, + title: 'Markers: 3' + } + ], + clickedMarker: { + id: 0, + title: '' + }, + marker: { + events: { + click: function (marker) { + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }, + dblclick: function (marker) { + alert("Double Clicked!"); + } + } + } + }; + }]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-686-window-options.js b/example/assets/scripts/controllers/issue-686-window-options.js new file mode 100644 index 000000000..5afceb569 --- /dev/null +++ b/example/assets/scripts/controllers/issue-686-window-options.js @@ -0,0 +1,29 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + .controller('mainCtrl', function($scope) { + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4, bounds: {}}; + $scope.options = {scrollwheel: false}; + $scope.onClick = function() { + console.log("Clicking"); + $scope.windowoptions.visible = !$scope.windowoptions.visible; + }; + + $scope.closeClick = function() { + $scope.windowoptions.visible = false; + }; + + $scope.marker = { + id: 0, + latitude: 40.1451, + longitude: -99.6680, + events: { + 'click': $scope.onClick + } + }; + $scope.title = 'marker 1'; + + $scope.windowoptions = { + pixelOffset: new google.maps.Size(-1, -250, 'px', 'px'), + visible: false + }; + + }); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-725-polyline-dupes.js b/example/assets/scripts/controllers/issue-725-polyline-dupes.js new file mode 100644 index 000000000..7f7e837da --- /dev/null +++ b/example/assets/scripts/controllers/issue-725-polyline-dupes.js @@ -0,0 +1,120 @@ +var myapp = angular.module('app', [ + 'uiGmapgoogle-maps' +]) + +myapp.controller('TestingCtrl', function ($scope) { + + + $scope.trailExists = false; + + $scope.map = { + + centerProperty: { + latitude: 38.23818, + longitude: -96.328125 + }, + + zoomProperty: 4, + + waterfall: { + latitude: 35, + longitude: -90, + opts: { + draggable: true + }, + events: { + dragend: function (marker) { + $scope.$apply(function () { + $scope.map.waterfall.latitude = marker.getPosition().lat().toFixed(5); + $scope.map.waterfall.longitude = marker.getPosition().lng().toFixed(5); + }); + + } + } + }, + + parking: { + latitude: 40, + longitude: -95, + opts: { + draggable: true + }, + events: { + dragend: function (marker) { + $scope.$apply(function () { + $scope.map.parking.latitude = marker.getPosition().lat().toFixed(5); + $scope.map.parking.longitude = marker.getPosition().lng().toFixed(5); + }); + } + } + }, + + trails: { + id: $scope.trailID, + path: [ + { + latitude: -100, + longitude: -100 + }, + { + latitude: -100, + longitude: -100 + } + ], + stroke: { + color: '#328ecc', + weight: 3 + }, + editable: true, + draggable: false, + geodesic: false, + visible: false + } + + }; //scope map + + $scope.drawTrail = function () { + if (!$scope.trailExists) { + if (($scope.map.waterfall.latitude != '-100') && ($scope.map.parking.latitude != '-100')) { + var trail = {}; + $scope.trailExists = true; + trail = { + id: $scope.trailID, + path: [ + { + latitude: $scope.map.waterfall.latitude, + longitude: $scope.map.waterfall.longitude + }, + { + latitude: $scope.map.parking.latitude, + longitude: $scope.map.parking.longitude + } + ], + stroke: { + color: '#328ecc', + weight: 3 + }, + editable: true, + draggable: false, + geodesic: false, + visible: true + }; + + $scope.map.trails = trail; + } else { + messageService.newMessage('Please include waterfall and parking coordinates before attempting to add the trail.', 'error', 5); + } + } else { + messageService.newMessage('There is already a trail on the map.', 'error', 5); + } + }; + + $scope.removeTrail = function () { + console.log('Destroying trailID: ' + $scope.trailID); + $scope.map.trails.path = []; + delete $scope.map.trails[$scope.trailID]; + $scope.trailExists = false; + $scope.trailID++; + }; + +}); diff --git a/example/assets/scripts/controllers/issue-728-windows-angular-1_3.js b/example/assets/scripts/controllers/issue-728-windows-angular-1_3.js new file mode 100644 index 000000000..fa7e2ecad --- /dev/null +++ b/example/assets/scripts/controllers/issue-728-windows-angular-1_3.js @@ -0,0 +1,48 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + .controller('mainCtrl', function ($scope) { + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4, bounds: {}}; + $scope.options = {scrollwheel: false}; + $scope.showPinkMarkers = true; + + var createRandomMarker = function (i, bounds, idKey, icon) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (idKey === null) { + idKey = "id"; + } + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + latitude: latitude, + longitude: longitude, + title: 'm' + i + }; + if (icon !== null) { + ret.icon = icon; + } + ret[idKey] = i; + ret.show= true; + return ret; + }; + $scope.randomMarkers = []; + $scope.pinkRandomMarkers = []; + // Get the bounds from the map once it's loaded + $scope.$watch(function () { + return $scope.map.bounds; + }, function (nv, ov) { + if (!ov.southwest && nv.southwest) { + var markers = []; + var pinkRandomMarkers = []; + for (var i = 0; i < 250; i++) { + markers.push(createRandomMarker(i, $scope.map.bounds, null, 'http://www.ozmorris.com/images/owl5.png')); + pinkRandomMarkers.push(createRandomMarker(i + 100, $scope.map.bounds, null, 'http://www.ozmorris.com/images/owl16.png')); + } + $scope.randomMarkers = markers; + $scope.pinkRandomMarkers = pinkRandomMarkers; + } + }, true); + }); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-74-markers-events.js b/example/assets/scripts/controllers/issue-74-markers-events.js new file mode 100644 index 000000000..9ea2c1277 --- /dev/null +++ b/example/assets/scripts/controllers/issue-74-markers-events.js @@ -0,0 +1,149 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", function ($scope, $timeout, $log, $http, rndAddToLatLon) { + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + markers: [ + { + id: 1, + latitude: 45, + longitude: -74, + showWindow: false, + title: 'Marker 2' + }, + { + id: 2, + latitude: 15, + longitude: 30, + showWindow: false, + title: 'Marker 2' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 37, + longitude: -122, + showWindow: false, + title: 'Plane' + } + ], + markers2: [ + { + id: 1, + latitude: 46, + longitude: -77, + title: '[46,-77]' + }, + { + id: 2, + latitude: 48, + longitude: -79, + title: '[33,-77]' + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 47, + longitude: -78, + title: '[35,-125]' + } + ], + dynamicMarkers: [], + refresh: function () { + $scope.map.control.refresh(origCenter); + } + } + }); + + $scope.markersEvents = { + click: function (gMarker, eventName, model) { + if(model.$id){ + model = model.coords;//use scope portion then + } + alert("Model: event:" + eventName + " " + JSON.stringify(model)); + } + }; + + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + }; + + var markerToClose = null; + + $scope.onMarkerClicked = function (marker) { +// if (markerToClose) { +// markerToClose.showWindow = false; +// } + markerToClose = marker; // for next go around + marker.showWindow = true; + $scope.$apply(); + //window.alert("Marker: lat: " + marker.latitude + ", lon: " + marker.longitude + " clicked!!") + }; + + $scope.onInsideWindowClick = function () { + alert("Window hit!"); + }; + + $timeout(function () { + var dynamicMarkers = [ + { id: 1, + latitude: 46, + longitude: -79 + }, + { + id: 2, + latitude: 33, + longitude: -79 + }, + { + id: 3, + icon: 'assets/images/plane.png', + latitude: 35, + longitude: -127 + } + ]; + _.each(dynamicMarkers, function (marker) { + marker.closeClick = function () { + marker.showWindow = false; + $scope.$apply(); + }; + marker.onClicked = function () { + $scope.onMarkerClicked(marker); + }; + }); + $scope.map.dynamicMarkers = dynamicMarkers; + }, 2000); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; +}); diff --git a/example/assets/scripts/controllers/issue-751-783-marker-coords-undefined-dragg.js b/example/assets/scripts/controllers/issue-751-783-marker-coords-undefined-dragg.js new file mode 100644 index 000000000..8e3ca046e --- /dev/null +++ b/example/assets/scripts/controllers/issue-751-783-marker-coords-undefined-dragg.js @@ -0,0 +1,96 @@ +angular.module('app', ['uiGmapgoogle-maps']) +.controller('ctrl', [ '$scope', 'uiGmapLogger','$timeout', +function ($scope, $log, $timeout) { + $log.doLog = true; + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4 } + $scope.options = {scrollwheel: false}; + $scope.coordsUpdates = 0; + $scope.dynamicMoveCtr = 0; + $scope.marker = { + id: 0, + icon:"assets/images/blue_marker.png", + coords: { + latitude: 40.1451, + longitude: -99.6680 + }, + options: { draggable: true }, + events: { + dragend: function (marker, eventName, args) { + $log.log('marker dragend'); + var lat = marker.getPosition().lat(); + var lon = marker.getPosition().lng(); + $log.log(lat); + $log.log(lon); + + $scope.marker.options = { + draggable: true, + labelContent: "lat: " + $scope.marker.coords.latitude + ' ' + 'lon: ' + $scope.marker.coords.longitude, + labelAnchor: "100 0", + labelClass: "marker-labels" + }; + $scope.$apply(); + $log.log('$apply()'); + } + } + }; + + $scope.markers = [ + { + id: 0, + coords: { + latitude: 37.1451, + longitude: -80.6680 + }, + options: { draggable: true }, + }, + { + id: 1, + coords: { + latitude: 36.1451, + longitude: -85.6680 + }, + show:true, + options: { draggable: true, + labelContent: "Drag Me", + labelAnchor: "20 -10", + labelClass: "marker-labels" + }, + } + ]; + + $scope.$watchCollection("marker.coords",function(newVal,oldVal){ + if(_.isEqual(newVal,oldVal)) + return; + $scope.coordsUpdates++; + }); + $timeout(function(){ + $scope.marker.coords = { + latitude: 42.1451, + longitude: -100.6680 + }; + $scope.dynamicMoveCtr++; + + $scope.markers.push( { + id: 3, + coords: { + latitude: 50.1451, + longitude: -85.6680 + }, + show:true, + options: { draggable: true, + labelContent: "Drag Me 3", + labelAnchor: "20 -10", + labelClass: "marker-labels" + }, + }); + + $timeout(function(){ + $scope.marker.coords = { + latitude: 43.1451, + longitude: -102.6680 + }; + $scope.dynamicMoveCtr++; + },2000); + },1000); + } + ]); diff --git a/example/assets/scripts/controllers/issue-753-marker-not-watched.js b/example/assets/scripts/controllers/issue-753-marker-not-watched.js new file mode 100644 index 000000000..1eb3ab63a --- /dev/null +++ b/example/assets/scripts/controllers/issue-753-marker-not-watched.js @@ -0,0 +1,49 @@ +angular.module("markerCoordsTest", ['uiGmapgoogle-maps']) + +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + v: '3.17', + libraries: '' + }); +}]) + +.controller("TestController", function($scope, $interval) { + var coords = { + latitude: 45.0, + longitude: 11.0 + }; + + icon = undefined; + + $scope.map = { + title: "A test map", + center: {latitude: 45.0,longitude: 11.0}, + zoom: 15 + }; + + $scope.marker = { + id: "myMarker", + coords: coords, + icon: 'assets/images/blue_marker.png', + options:{ + draggable: true, + labelContent: "lat: " + coords.latitude + ' ' + 'lon: ' + coords.longitude, + labelAnchor: "5 0", + labelClass: "marker-labels" + } + }; + + $scope.markers = [ + $scope.marker + ]; + + $interval(function() { + if($scope.marker.icon) + $scope.marker.icon = undefined; + else + $scope.marker.icon = 'assets/images/blue_marker.png'; + coords.latitude = coords.latitude + 0.0001; + coords.longitude = coords.longitude + 0.0001; + $scope.marker.options.labelContent = "lat: " + coords.latitude + ' ' + 'lon: ' + coords.longitude; + }, 1500); +}); diff --git a/example/assets/scripts/controllers/issue-755-ng-router.js b/example/assets/scripts/controllers/issue-755-ng-router.js new file mode 100644 index 000000000..5f587c759 --- /dev/null +++ b/example/assets/scripts/controllers/issue-755-ng-router.js @@ -0,0 +1,54 @@ +angular.module("markerCoordsTest", ['ngRoute','uiGmapgoogle-maps']) + +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + v: '3.17', + libraries: '' + }); +}]) + +.config(['$routeProvider', +function($routeProvider) { + return $routeProvider + .when('/map', { + templateUrl: 'assets/templates/issue-755-ng-router.html', + controller: 'TestController' + }).when('/msgs', { + template: '
HI!
', + }); + } +]) + +.controller("TestController", function($scope, $interval) { + var coords = { + latitude: 45.0, + longitude: 11.0 + }; + + icon = undefined; + + $scope.map = { + title: "A test map", + center: coords, + zoom: 15, + }; + + $scope.marker = { + id: "myMarker", + coords: coords, + icon: 'assets/images/blue_marker.png' + }; + + $scope.markers = [ + $scope.marker + ]; + + $interval(function() { + if($scope.marker.icon) + $scope.marker.icon = undefined; + else + $scope.marker.icon = 'assets/images/blue_marker.png'; + coords.latitude = coords.latitude + 0.0001; + coords.longitude = coords.longitude + 0.0001; + }, 1500); +}); diff --git a/example/assets/scripts/controllers/issue-772-info-window-show-state.js b/example/assets/scripts/controllers/issue-772-info-window-show-state.js new file mode 100644 index 000000000..89dc0695a --- /dev/null +++ b/example/assets/scripts/controllers/issue-772-info-window-show-state.js @@ -0,0 +1,67 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + +.controller('mainCtrl', function($scope) { + $scope.map = { + center: { type: "Point", coordinates: [-122.377827, 45.619988] }, + zoom: 4, + bounds: {} + }; + $scope.options = {scrollwheel: false, draggable: true}; + var createRandomMarker = function (i, bounds, idKey) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (idKey == null) { + idKey = "id"; + } + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + latitude: latitude, + longitude: longitude, + title: 'm' + i, + text: "This is a test Tweet!", + show: false + }; + ret.onClick = function() { + console.log("Clicked!"); + ret.show = !ret.show; + $scope.$apply(); + }; + // ret.closeClick = function(){ + // ret.show = false; + // }; + ret[idKey] = i; + return ret; + }; + $scope.randomMarkers = []; + // Get the bounds from the map once it's loaded + $scope.$watch(function() { return $scope.map.bounds; }, function(nv, ov) { + // Only need to regenerate once + if (!ov.southwest && nv.southwest) { + var markers = []; + for (var i = 0; i < 10; i++) { + markers.push(createRandomMarker(i, $scope.map.bounds)) + } + $scope.randomMarkers = markers; + } + }, true); + + $scope.markersEvents = { + mouseover: function (gMarker, eventName, model) { + console.debug('mouseover'); + model.show = true; +// $scope.$apply(); + } + }; + + $scope.shownMarkers = function(){ + return _.filter($scope.randomMarkers, function(m){ + return m.show; + }).length; + }; + +}); diff --git a/example/assets/scripts/controllers/issue-798-markerclusterer-perf.js b/example/assets/scripts/controllers/issue-798-markerclusterer-perf.js new file mode 100644 index 000000000..12f17f855 --- /dev/null +++ b/example/assets/scripts/controllers/issue-798-markerclusterer-perf.js @@ -0,0 +1,55 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + +.controller("mapCtrl", ["$scope","uiGmapLogger", function($scope, logger) { + logger.doLog = true; + var lastId = 1; + + $scope.map = { + options:{ + streetViewControl: false, + panControl: false, + maxZoom: 18, + minZoom: 3 + }, + center: { + latitude: 0, + longitude: 0 + }, + zoom: 0 + }; + + $scope.searchResults = { + results: [] + }; + + + $scope.addMarkers = function(num) { + var markers = []; + var i = 0; + + for (i = 0; i < num; i++) { + var cords = chance.coordinates().split(','); + if(markers.length < num){ + markers.push({ + 'coords': { + 'latitude': cords[0], + 'longitude': cords[1] + }, + 'key': 'someKey-'+lastId + }); + lastId++; + } + } +// lastId = 1;//reset + $scope.searchResults.results = markers; + }; + + $scope.reset = function() { + lastId = 1; + $scope.searchResults = { + results: [] + }; + }; + +} +]); diff --git a/example/assets/scripts/controllers/issue-816-multiple-maps-marker.js b/example/assets/scripts/controllers/issue-816-multiple-maps-marker.js new file mode 100644 index 000000000..f49ff16d4 --- /dev/null +++ b/example/assets/scripts/controllers/issue-816-multiple-maps-marker.js @@ -0,0 +1,8 @@ +// Code goes here +angular.module('appMaps', ['uiGmapgoogle-maps']) + .controller('mainCtrl', function ($scope, $log, $timeout) { + $scope.map1 = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4 }; + $scope.map2 = {center: {latitude: 42.1451, longitude: -97.6680 }, zoom: 4 }; + $scope.map3 = {center: {latitude: 45.1451, longitude: -92.6680 }, zoom: 4 }; + + }); diff --git a/example/assets/scripts/controllers/issue-904-markers-race.js b/example/assets/scripts/controllers/issue-904-markers-race.js new file mode 100644 index 000000000..f234f23f5 --- /dev/null +++ b/example/assets/scripts/controllers/issue-904-markers-race.js @@ -0,0 +1,85 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + + .controller("mapCtrl", ["$scope", "uiGmapLogger", function ($scope, logger) { + logger.doLog = true; + logger.currentLevel = logger.LEVELS.debug; + var lastId = 1; + var clusterThresh = 6; + + $scope.map = { + doCluster: true, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 18, + minZoom: 3 + }, + events: { + idle: function () { + if ($scope.map.zoom <= clusterThresh) { + if (!$scope.map.doCluster) { + $scope.map.doCluster = true; + $scope.searchResults.results = []; + } + } + else { + if ($scope.map.doCluster) { + $scope.map.doCluster = false; + $scope.searchResults.results = []; + } + } + $scope.addMarkers(1000); + } + }, + center: { + latitude: 0, + longitude: 0 + }, + //clusterOptions: {title: 'Hi I am a Cluster!', gridSize: 60, ignoreHidden: true, minimumClusterSize: 2, + // imageExtension: 'png', imagePath: 'assets/images/cluster', imageSizes: [72] + //}, + clusterOptions: {}, + zoom: 0 + }; + + $scope.searchResults = { + results: [] + }; + +// $scope.$watch( 'zoom', function (newValue, oldValue){ +// if (newValue == oldValue) +// return null; +// +// }); + + + $scope.addMarkers = function (num) { + var markers = []; + var i = 0; + + for (i = 0; i < num; i++) { + var cords = chance.coordinates().split(','); +// if(markers.length < 100){ + markers.push({ + 'coords': { + 'latitude': cords[0], + 'longitude': cords[1] + }, + 'key': 'someKey-' + lastId + }); + lastId++; +// } + } + lastId = 1;//reset + $scope.searchResults.results = markers; + }; + + $scope.reset = function () { + lastId = 1; + $scope.searchResults = { + results: [] + }; + }; + + } + ]); diff --git a/example/assets/scripts/controllers/issue-930-polylines-updates.js b/example/assets/scripts/controllers/issue-930-polylines-updates.js new file mode 100644 index 000000000..6d2bcbd30 --- /dev/null +++ b/example/assets/scripts/controllers/issue-930-polylines-updates.js @@ -0,0 +1,144 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .config([ + "$provide", function ($provide) { + return $provide.decorator("$rootScope", [ + "$delegate", function ($delegate) { + Object.defineProperty($delegate.constructor.prototype, "$onRootScope", { + value: function (name, listener) { + var unsubscribe; + unsubscribe = $delegate.$on(name, listener); + this.$on("$destroy", unsubscribe); + return unsubscribe; + }, + enumerable: false + }); + return $delegate; + } + ]); + } + ]) + .controller('mapWidgetCtrl', ['$scope', '$rootScope', function ($scope, $rootScope) { + $scope.make = { + controlText: 'make polys', + controlClick: function () { + $rootScope.$emit("polyButtonClicked"); + } + }; + $scope.add = { + controlText: 'add', + controlClick: function () { + $rootScope.$emit("addClicked"); + } + }; + $scope.clear = { + controlText: 'clear', + controlClick: function () { + $rootScope.$emit("clearButtonClicked"); + } + }; + }]) + .config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.17', + libraries: 'geometry' + }); + }]) + .controller('ctrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", "$http", + function ($scope, $log, uiGmapGoogleMapApi, $http) { + $scope.map = { + center: { + latitude: 45, + longitude: -73 + }, + pan: true, + zoom: 4, + refresh: false, + options: { + disableDefaultUI: true + }, + events: {}, + bounds: {}, + polys: [], + polyEvents: { + click: function (gPoly, eventName, polyModel) { + window.alert("Poly Clicked: id:" + polyModel.$id + ' ' + JSON.stringify(polyModel.path)); + } + }, + draw: undefined + }; + uiGmapGoogleMapApi.then(function () { + }); + + var createPolys = function () { + return [ + { + id: 1, + path: [ + { + latitude: 45, + longitude: -74 + }, + { + latitude: 30, + longitude: -89 + }, + { + latitude: 37, + longitude: -122 + }, + { + latitude: 60, + longitude: -95 + } + ], + stroke: { + color: '#ff6262', + weight: 5 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true, + icons: [ + { + icon: { + path: google.maps.SymbolPath.BACKWARD_OPEN_ARROW + }, + offset: '25px', + repeat: '50px' + } + ] + } + ]; + }; + $scope.$onRootScope("polyButtonClicked", function () { + $scope.map.polys = createPolys(); + }); + $scope.$onRootScope("addClicked", function () { + if (!$scope.map.polys || !$scope.map.polys.length > 0) + return; + var last = JSON.parse(JSON.stringify(_.last($scope.map.polys))); + last.id += 1; + last.path = last.path.map(function (p) { + p.longitude += 2; + return p; + }); + $scope.map.polys.push(last); + }); + $scope.$onRootScope("clearButtonClicked", function () { + $scope.map.polys = []; + }); + //add beginDraw as a subscriber to be invoked by the channel, allows controller to controller coms + + }]) + .run(['$templateCache', 'uiGmapLogger', function ($templateCache, Logger) { + $templateCache.put('widgets.tpl.html', + '
' + + '' + + '' + + '' + + '
'); + }]); +})(window, angular); diff --git a/example/assets/scripts/controllers/issue-946-markers-update.js b/example/assets/scripts/controllers/issue-946-markers-update.js new file mode 100644 index 000000000..10b289f41 --- /dev/null +++ b/example/assets/scripts/controllers/issue-946-markers-update.js @@ -0,0 +1,60 @@ +angular.module('app', ['uiGmapgoogle-maps']) +.controller('mainCtrl', function($scope, uiGmapIsReady) { + $scope.map = { + center: { + latitude: 40.1451, + longitude: -99.6680 + }, + zoom: 4, + bounds: {} + }; + $scope.options = { + scrollwheel: false + }; + var createRandomMarker = function(i, bounds, idKey) { + var lat_min = bounds.southwest.latitude, + lat_range = bounds.northeast.latitude - lat_min, + lng_min = bounds.southwest.longitude, + lng_range = bounds.northeast.longitude - lng_min; + + if (idKey == null) { + idKey = "id"; + } + + var latitude = lat_min + (Math.random() * lat_range); + var longitude = lng_min + (Math.random() * lng_range); + var ret = { + latitude: latitude, + longitude: longitude, + title: 'm' + i + }; + ret[idKey] = i; + return ret; + }; + $scope.randomMarkers = []; + // Get the bounds from the map once it's loaded + + $scope.$watch(function() { + return $scope.map.bounds; + }, function(nv, ov) { + // Only need to regenerate once + if (!ov.southwest && nv.southwest) { + var markers = []; + for (var i = 0; i < 50; i++) { + markers.push(createRandomMarker(i, $scope.map.bounds)) + } + _.defer(function(){ + $scope.randomMarkers = markers; + }); + + } + }, true); + + $scope.move = function() { + console.log('moving'); + var marker = $scope.randomMarkers[0]; + var newPosition = createRandomMarker(0, $scope.map.bounds) + marker.latitude = newPosition.latitude; + marker.longitude = newPosition.longitude; + } +}); diff --git a/example/assets/scripts/controllers/issue-975.markerwlabel-customcoords.js b/example/assets/scripts/controllers/issue-975.markerwlabel-customcoords.js new file mode 100644 index 000000000..8d83ff2a8 --- /dev/null +++ b/example/assets/scripts/controllers/issue-975.markerwlabel-customcoords.js @@ -0,0 +1,78 @@ +angular.module("markerCoordsTest", ['uiGmapgoogle-maps']) + + .config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + v: '3.17', + libraries: '' + }); + }]) + + .controller("TestController", function($scope, $interval) { + + icon = undefined; + + $scope.map = { + title: "A test map", + center: {latitude: 45.0,longitude: 11.0}, + zoom: 15 + }; + + //Markers with label updating OK with default 'coords' property + $scope.markersLabelOK = [ + { + id: "myMarker", + //"default" coords + coords: { + latitude: 45.0, + longitude: 11.0 + }, + options:{ + labelContent: "markerLabel with default 'coords'", + labelAnchor: "5 0", + labelClass: "marker-labels" + } + } + ]; + + //Markers with label NOT updating OK with custom 'coords' property, check console for error + $scope.markersLabelNotOK = [ + { + id: "myMarker2", + //"custom" coords + xcoords: { + latitude: 45.005, + longitude: 11.005 + }, + options:{ + labelContent: "markerLabel with custom 'coords'", + labelAnchor: "5 0", + labelClass: "marker-labels" + } + } + ]; + + //Markers without label updating OK with custom 'coords' property + $scope.markersOK = [ + { + id: "myMarker3", + //"custom" coords + xcoords: { + latitude: 45.005, + longitude: 11.0 + } + } + ]; + + $interval(function() { + $scope.markersLabelOK[0].coords.latitude = $scope.markersLabelOK[0].coords.latitude + 0.0001; + $scope.markersLabelOK[0].coords.longitude = $scope.markersLabelOK[0].coords.longitude + 0.0001; + }, 1500); + $interval(function() { + $scope.markersLabelNotOK[0].xcoords.latitude = $scope.markersLabelNotOK[0].xcoords.latitude + 0.0001; + $scope.markersLabelNotOK[0].xcoords.longitude = $scope.markersLabelNotOK[0].xcoords.longitude + 0.0001; + }, 1500); + $interval(function() { + $scope.markersOK[0].xcoords.latitude = $scope.markersOK[0].xcoords.latitude + 0.0001; + $scope.markersOK[0].xcoords.longitude = $scope.markersOK[0].xcoords.longitude + 0.0001; + }, 1500); + }); diff --git a/example/assets/scripts/controllers/issue-978-window-not-open-not-transcluded-marker.js b/example/assets/scripts/controllers/issue-978-window-not-open-not-transcluded-marker.js new file mode 100644 index 000000000..a663b5c7f --- /dev/null +++ b/example/assets/scripts/controllers/issue-978-window-not-open-not-transcluded-marker.js @@ -0,0 +1,51 @@ +// Code goes here + +angular.module('app', ['uiGmapgoogle-maps']) + .controller('mainCtrl', function (uiGmapLogger, $scope, $timeout) { + uiGmapLogger.currentLevel = uiGmapLogger.LEVELS.debug; + + $scope.number = 0; + $scope.map = { + center: { + latitude: 35.027469, + longitude: -111.022753 + }, + zoom: 4, + markerModels: [ + { + id: 0, + coords: { + latitude: 35.027469, + longitude: -111.022753 + }, + lState: 'success' + }, + { + id: 1, + coords: { + latitude: 35.127469, + longitude: -111.122753 + }, + lState: 'info' + } + ], + getMarkerOptions: function (markerModel) { + if (!markerModel) + return; + var opts = { + icon: ' ', + labelContent: '

' + markerModel.id + '

', + labelAnchor: "20 10", + zIndex: -1 * markerModel.id //inverse to put first on top + }; + return opts; + }, + clickedMarker: function (gMarker, eventName, markerModel) { + if ($scope.map.windowModel) { + $scope.map.windowModel.show = false; + } + markerModel.show = true; + $scope.map.windowModel = markerModel; + } + }; + }); \ No newline at end of file diff --git a/example/assets/scripts/controllers/issue-979-polygons-race.js b/example/assets/scripts/controllers/issue-979-polygons-race.js new file mode 100644 index 000000000..e68e6ef5a --- /dev/null +++ b/example/assets/scripts/controllers/issue-979-polygons-race.js @@ -0,0 +1,95 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .config([ + "$provide", function ($provide) { + return $provide.decorator("$rootScope", [ + "$delegate", function ($delegate) { + Object.defineProperty($delegate.constructor.prototype, "$onRootScope", { + value: function (name, listener) { + var unsubscribe; + unsubscribe = $delegate.$on(name, listener); + this.$on("$destroy", unsubscribe); + return unsubscribe; + }, + enumerable: false + }); + return $delegate; + } + ]); + } + ]) + .controller('mapWidgetCtrl', ['$scope', '$rootScope', function ($scope, $rootScope) { + $scope.polyButton = { + controlText: 'make polys', + controlClick: function () { + $rootScope.$emit("polyButtonClicked"); + } + }; + $scope.clearWidget = { + controlText: 'clear', + controlClick: function () { + $rootScope.$emit("clearButtonClicked"); + } + }; + }]) + .config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.17', + libraries: 'geometry' + }); + }]) + .controller('ctrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", "$http", "$timeout", + function ($scope, $log, uiGmapGoogleMapApi, $http, $timeout) { + $log.currentLevel = $log.LEVELS.debug; + + var getPolys = function(){ + $http.get('assets/json/many_polygons.json') + .then(function (data) { + $scope.map.polys = data.data; +// $scope.map.polyControl.updateModels(data.data); + }); + }; + $scope.map = { + polyControl:{}, + center: { + latitude: 26.153215225012733, + longitude: -81.80121597097774 + }, + events:{ + idle:function(){ + if ($scope.map.zoom < 14) + return $scope.map.polys = []; + getPolys(); + } + }, + zoom: 15, + refresh: false, + bounds: {}, + polys: [], + polyEvents: { + click: function (gPoly, eventName, polyModel) { + window.alert("Poly Clicked: id:" + polyModel.$id + ' ' + JSON.stringify(polyModel.path)); + } + }, + draw: undefined + }; + + $scope.$onRootScope("polyButtonClicked", function () { + getPolys(); + }); + $scope.$onRootScope("clearButtonClicked", function () { + $scope.map.polys = []; +// $scope.map.polyControl.clean(); + }); + + }]) + .run(['$templateCache', 'uiGmapLogger', function ($templateCache, Logger) { + Logger.doLog = true; + Logger.info('polyButton.tpl.html should be in cache'); + $templateCache.put('polyButton.tpl.html', + ''); + $templateCache.put('clear.tpl.html', + ''); + }]); +})(window, angular); diff --git a/example/assets/scripts/controllers/issue-979-polylines-race.js b/example/assets/scripts/controllers/issue-979-polylines-race.js new file mode 100644 index 000000000..e68e6ef5a --- /dev/null +++ b/example/assets/scripts/controllers/issue-979-polylines-race.js @@ -0,0 +1,95 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .config([ + "$provide", function ($provide) { + return $provide.decorator("$rootScope", [ + "$delegate", function ($delegate) { + Object.defineProperty($delegate.constructor.prototype, "$onRootScope", { + value: function (name, listener) { + var unsubscribe; + unsubscribe = $delegate.$on(name, listener); + this.$on("$destroy", unsubscribe); + return unsubscribe; + }, + enumerable: false + }); + return $delegate; + } + ]); + } + ]) + .controller('mapWidgetCtrl', ['$scope', '$rootScope', function ($scope, $rootScope) { + $scope.polyButton = { + controlText: 'make polys', + controlClick: function () { + $rootScope.$emit("polyButtonClicked"); + } + }; + $scope.clearWidget = { + controlText: 'clear', + controlClick: function () { + $rootScope.$emit("clearButtonClicked"); + } + }; + }]) + .config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.17', + libraries: 'geometry' + }); + }]) + .controller('ctrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", "$http", "$timeout", + function ($scope, $log, uiGmapGoogleMapApi, $http, $timeout) { + $log.currentLevel = $log.LEVELS.debug; + + var getPolys = function(){ + $http.get('assets/json/many_polygons.json') + .then(function (data) { + $scope.map.polys = data.data; +// $scope.map.polyControl.updateModels(data.data); + }); + }; + $scope.map = { + polyControl:{}, + center: { + latitude: 26.153215225012733, + longitude: -81.80121597097774 + }, + events:{ + idle:function(){ + if ($scope.map.zoom < 14) + return $scope.map.polys = []; + getPolys(); + } + }, + zoom: 15, + refresh: false, + bounds: {}, + polys: [], + polyEvents: { + click: function (gPoly, eventName, polyModel) { + window.alert("Poly Clicked: id:" + polyModel.$id + ' ' + JSON.stringify(polyModel.path)); + } + }, + draw: undefined + }; + + $scope.$onRootScope("polyButtonClicked", function () { + getPolys(); + }); + $scope.$onRootScope("clearButtonClicked", function () { + $scope.map.polys = []; +// $scope.map.polyControl.clean(); + }); + + }]) + .run(['$templateCache', 'uiGmapLogger', function ($templateCache, Logger) { + Logger.doLog = true; + Logger.info('polyButton.tpl.html should be in cache'); + $templateCache.put('polyButton.tpl.html', + ''); + $templateCache.put('clear.tpl.html', + ''); + }]); +})(window, angular); diff --git a/example/assets/scripts/controllers/issue-992-marker-disappear.js b/example/assets/scripts/controllers/issue-992-marker-disappear.js new file mode 100644 index 000000000..424f8eeca --- /dev/null +++ b/example/assets/scripts/controllers/issue-992-marker-disappear.js @@ -0,0 +1,37 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + .controller('mainCtrl', function ($scope, $log, $timeout) { + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4 }; + $scope.map = {center: {latitude: 40.1451, longitude: -99.6680 }, zoom: 4 }; + $scope.options = {scrollwheel: false}; + + $scope.marker = { + id: 0, + coords: { + latitude: 40.1451, + longitude: -99.6680 + }, + options: { draggable: true }, + events: { + dragend: function (marker, eventName, args) { + $log.log('marker dragend'); + var lat = marker.getPosition().lat(); + var lon = marker.getPosition().lng(); + $log.log(lat); + $log.log(lon); + + $scope.marker.options = { + draggable: true, + labelContent: "lat: " + $scope.marker.coords.latitude + ' ' + 'lon: ' + $scope.marker.coords.longitude, + labelAnchor: "100 0", + labelClass: "marker-labels" + }; + } + } + }; + $scope.updateMarkerLocation=function(){ + $scope.marker.coords = { + latitude: 42.1451, + longitude: -100.6680 + }; + }; + }); \ No newline at end of file diff --git a/example/assets/scripts/controllers/many-polygons.js b/example/assets/scripts/controllers/many-polygons.js new file mode 100644 index 000000000..64409a469 --- /dev/null +++ b/example/assets/scripts/controllers/many-polygons.js @@ -0,0 +1,114 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .factory('channel', function () { + return function () { + var callbacks = []; + this.add = function (cb) { + callbacks.push(cb); + }; + this.invoke = function () { + callbacks.forEach(function (cb) { + cb(); + }); + }; + return this; + }; + }) + .config([ + "$provide", function ($provide) { + return $provide.decorator("$rootScope", [ + "$delegate", function ($delegate) { + Object.defineProperty($delegate.constructor.prototype, "$onRootScope", { + value: function (name, listener) { + var unsubscribe; + unsubscribe = $delegate.$on(name, listener); + this.$on("$destroy", unsubscribe); + return unsubscribe; + }, + enumerable: false + }); + return $delegate; + } + ]); + } + ]) + .controller('mapWidgetCtrl', ['$scope', '$rootScope', function ($scope, $rootScope) { + $scope.polyButton = { + controlText: 'make polys', + controlClick: function () { + $rootScope.$emit("polyButtonClicked"); + } + }; + $scope.clearWidget = { + controlText: 'clear', + controlClick: function () { + $rootScope.$emit("clearButtonClicked"); + } + }; + }]) + .config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.18', + libraries: 'geometry' + }); + }]) + .controller('ctrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", "$http", + function ($scope, $log, uiGmapGoogleMapApi, $http) { + $log.currentLevel = $log.LEVELS.debug; + var polyFillCtr = 0; + $scope.map = { + center: { + latitude: 26.153215225012733, + longitude: -81.80121597097774 + }, + pan: true, + zoom: 16, + refresh: false, + events: {}, + bounds: {}, + polys: [], + getPolyFill: function(model){ + if(!model){ + $log.debug("model undefined!"); + return; + } + polyFillCtr += 1; + $log.debug("polyFillCtr: " + polyFillCtr + ", id: " + model.id); + return { color: '#2c8aa7', opacity: '0.3' }; + }, + polyEvents: { + click: function (gPoly, eventName, polyModel) { + window.alert("Poly " + eventName + ": id:" + polyModel.id + ' ' + JSON.stringify(polyModel.geom)); + } + }, + draw: undefined + }; + var rawPolys = []; + uiGmapGoogleMapApi.then(function () { + $http.get('assets/json/many_polygons.json').then(function (data) { + $log.debug("poly length: " + data.data.length); + $scope.map.polys = data.data; + rawPolys = data.data; + }); + + }); + + $scope.$onRootScope("clearButtonClicked", function () { + $scope.map.polys = []; + }); + + $scope.$onRootScope("polyButtonClicked", function () { + $scope.map.polys = rawPolys; + }); + + }]) + .run(['$templateCache', 'uiGmapLogger', function ($templateCache, Logger) { + Logger.doLog = true; + Logger.info('polyButton.tpl.html should be in cache'); + $templateCache.put('polyButton.tpl.html', + ''); + $templateCache.put('clear.tpl.html', + ''); + }]); +})(window, angular); diff --git a/example/assets/scripts/controllers/many-polylines.js b/example/assets/scripts/controllers/many-polylines.js new file mode 100644 index 000000000..cb77afbb2 --- /dev/null +++ b/example/assets/scripts/controllers/many-polylines.js @@ -0,0 +1,108 @@ +(function (window, ng) { + ng.module('app', ['uiGmapgoogle-maps']) + .config([ + "$provide", function ($provide) { + return $provide.decorator("$rootScope", [ + "$delegate", function ($delegate) { + Object.defineProperty($delegate.constructor.prototype, "$onRootScope", { + value: function (name, listener) { + var unsubscribe; + unsubscribe = $delegate.$on(name, listener); + this.$on("$destroy", unsubscribe); + return unsubscribe; + }, + enumerable: false + }); + return $delegate; + } + ]); + } + ]) + .controller('mapWidgetCtrl', ['$scope', '$rootScope', function ($scope, $rootScope) { + $scope.polyButton = { + controlText: 'make polys', + controlClick: function () { + $rootScope.$emit("polyButtonClicked"); + } + }; + $scope.clearWidget = { + controlText: 'clear', + controlClick: function () { + $rootScope.$emit("clearButtonClicked"); + } + }; + }]) + .config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.17', + libraries: 'geometry' + }); + }]) + .controller('ctrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", "$http", + function ($scope, $log, uiGmapGoogleMapApi, $http) { + $scope.map = { + center: { + latitude: 45, + longitude: -73 + }, + pan: true, + zoom: 4, + refresh: false, + options: { + disableDefaultUI: true + }, + events: {}, + bounds: {}, + polys: [], + polyEvents: { + click: function (gPoly, eventName, polyModel) { + window.alert("Poly Clicked: id:" + polyModel.$id + ' ' + JSON.stringify(polyModel.path)); + } + }, + draw: undefined + }; + var rawPolys = []; + uiGmapGoogleMapApi.then(function () { + $http.get('assets/json/polylines.json').then(function (data) { + rawPolys = data.data; + }); + + }); + + var createPolys = function () { + $log.info('polys should be injected'); + $scope.map.polys = rawPolys; + }; + $scope.$onRootScope("polyButtonClicked", function () { + createPolys(); + var poly = rawPolys[0]; + var somePolys = _.range(500).map(function (num, i) { + var clonedPoly = _.extend({}, poly); + var paths = clonedPoly.path.map(function (p) { + return { + latitude: p.latitude, + longitude: p.longitude + i + } + }); + clonedPoly.id = i + 1; + clonedPoly.path = paths; + return clonedPoly; + }); + $scope.map.polys = somePolys; + }); + $scope.$onRootScope("clearButtonClicked", function () { + $scope.map.polys = []; + }); + //add beginDraw as a subscriber to be invoked by the channel, allows controller to controller coms + + }]) + .run(['$templateCache', 'uiGmapLogger', function ($templateCache, Logger) { + Logger.doLog = true; + Logger.info('polyButton.tpl.html should be in cache'); + $templateCache.put('polyButton.tpl.html', + ''); + $templateCache.put('clear.tpl.html', + ''); + }]); +})(window, angular); diff --git a/example/assets/scripts/controllers/marker-anchor.js b/example/assets/scripts/controllers/marker-anchor.js new file mode 100644 index 000000000..24720a4be --- /dev/null +++ b/example/assets/scripts/controllers/marker-anchor.js @@ -0,0 +1,31 @@ +// Code goes here + +angular.module('app', ['uiGmapgoogle-maps']) + .controller('mainCtrl', ['$scope', function($scope) { + $scope.number = 0; + $scope.map = { + center: { + latitude: 35.027469, + longitude: -111.022753 + }, + zoom: 4, + marker: { + id:0, + coords: { + latitude: 35.027469, + longitude: -111.022753 + }, + options: { + icon: { + anchor: new google.maps.Point(36,36), + origin: new google.maps.Point(0,0), + scaledSize: new google.maps.Size(72,72), + url: 'assets/images/cluster1.png' + } + } + } + }; + $scope.click = function() { + $scope.number += 1; + } + }]); \ No newline at end of file diff --git a/example/assets/scripts/controllers/markers-models-objects.js b/example/assets/scripts/controllers/markers-models-objects.js new file mode 100644 index 000000000..65d83cf44 --- /dev/null +++ b/example/assets/scripts/controllers/markers-models-objects.js @@ -0,0 +1,81 @@ +angular.module('appMaps', ['uiGmapgoogle-maps']) + + .controller("mapCtrl", ["$scope", "uiGmapLogger", "uiGmapObjectIterators", + function ($scope, logger, uiGmapObjectIterators) { + logger.doLog = true; + logger.currentLevel = logger.LEVELS.debug; + var lastId = 1; + var clusterThresh = 6; + + $scope.map = { + doCluster: true, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 18, + minZoom: 3 + }, + events: { + idle: function () { + if ($scope.map.zoom <= clusterThresh) { + if (!$scope.map.doCluster) { + $scope.map.doCluster = true; + $scope.searchResults.results = []; + } + } + else { + if ($scope.map.doCluster) { + $scope.map.doCluster = false; + $scope.searchResults.results = []; + } + } + $scope.addMarkers(1000); + } + }, + center: { + latitude: 0, + longitude: 0 + }, + clusterOptions: {}, + zoom: 0 + }; + + $scope.searchResults = { + results: { + length: 0 + } + }; + + + $scope.addMarkers = function (num) { + var markers = {}; + var i = 0; + + for (i = 0; i < num; i++) { + var cords = chance.coordinates().split(','); + markers['someKey-' + lastId] ={ + 'coords': { + 'latitude': cords[0], + 'longitude': cords[1] + }, + 'key': 'someKey-' + lastId + }; + lastId++; + } + lastId = 1;//reset + markers.length = num; + + $scope.searchResults.results = uiGmapObjectIterators.slapAll(markers); + }; + + $scope.reset = function () { + lastId = 1; + $scope.searchResults = { + results: { + length: 0 + } + }; + }; + + } + ]); diff --git a/example/assets/scripts/controllers/overlay-map-type.js b/example/assets/scripts/controllers/overlay-map-type.js new file mode 100644 index 000000000..e8083c610 --- /dev/null +++ b/example/assets/scripts/controllers/overlay-map-type.js @@ -0,0 +1,149 @@ +(function () { + function getNormalizedCoord(coord, zoom) { + var y = coord.y; + var x = coord.x; + var tileRange = 1 << zoom; + if (y < 0 || y >= tileRange) { + return null; + } + if (x < 0 || x >= tileRange) { + x = (x % tileRange + tileRange) % tileRange; + } + return {x: x, y: y}; + } + + var module = angular.module('angular-google-maps-example', ['uiGmapgoogle-maps']); + module.controller('maptypeExampleController', + function ($scope, $http) { + // Create custom map types + $scope.squaresMapType = { + getTile: function (coord, zoom, ownerDocument) { + var div = ownerDocument.createElement('div'); + div.innerHTML = coord; + div.style.width = this.tileSize.width + 'px'; + div.style.height = this.tileSize.height + 'px'; + div.style.fontSize = '10'; + div.style.borderStyle = 'solid'; + div.style.borderWidth = '1px'; + div.style.borderColor = '#AAAAAA'; + return div; + }, + tileSize: new google.maps.Size(256, 256), + name: 'Black Squares', + // maxZoom is a mandatory property in case where you use maptype as a single layer + maxZoom: 19, + }; + + $scope.mosconeCenterMapType = { + getTileUrl: function (coord, zoom) { + var bounds = { + 17: [ + [20969, 20970], + [50657, 50658] + ], + 18: [ + [41939, 41940], + [101315, 101317] + ], + 19: [ + [83878, 83881], + [202631, 202634] + ], + 20: [ + [167757, 167763], + [405263, 405269] + ] + }; + + if (zoom < 17 || zoom > 20 || + bounds[zoom][0][0] > coord.x || coord.x > bounds[zoom][0][1] || + bounds[zoom][1][0] > coord.y || coord.y > bounds[zoom][1][1]) { + return null; + } + + return [ + 'http://www.gstatic.com/io2010maps/tiles/5/L2_', zoom, '_', + coord.x, '_', coord.y, '.png' + ].join(''); + }, + tileSize: new google.maps.Size(256, 256) + }; + + $scope.moonMapType = { + getTileUrl: function (coord, zoom) { + var normalizedCoord = getNormalizedCoord(coord, zoom); + if (!normalizedCoord) { + return null; + } + var bound = Math.pow(2, zoom); + return 'http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw' + + '/' + zoom + '/' + normalizedCoord.x + '/' + + (bound - normalizedCoord.y - 1) + '.jpg'; + }, + tileSize: new google.maps.Size(256, 256), + maxZoom: 9, + minZoom: 0, + radius: 1738000, + name: 'Moon' + }; + + // Map instances controlers + $scope.map1 = { + center: { + latitude: 41.850033, + longitude: -87.6500523 + }, + showOverlay: true, + zoom: 10, + }; + + $scope.map2 = { + center: { + latitude: 37.78313383212, + longitude: -122.4039494991302 + }, + zoom: 18, + options: { + minZoom: 17, + maxZoom: 20 + } + }; + + $scope.map3 = { + center: { + latitude: 0, + longitude: 0 + }, + zoom: 1, + options: { + mapTypeId: 'moon', + mapTypeControlOptions: { + mapTypeIds: ['moon'] + } + } + }; + + $scope.map4 = { + center: { + latitude: 0, + longitude: 0 + }, + zoom: 3, + options: { + mapTypeControlOptions: { + mapTypeIds: ['moon', google.maps.MapTypeId.ROADMAP] + } + } + }; + + // Other actions + var versionUrl = window.location.host === 'rawgithub.com' ? + 'http://rawgithub.com/angular-ui/angular-google-maps/master/package.json' : '/package.json'; + $http.get(versionUrl).success(function (data) { + if (!data && console) { + console.error('no version object found!!'); + } + $scope.version = data.version; + }); + }); +}()); diff --git a/example/assets/scripts/controllers/search-box-autocomplete.js b/example/assets/scripts/controllers/search-box-autocomplete.js new file mode 100644 index 000000000..bfc7ebd13 --- /dev/null +++ b/example/assets/scripts/controllers/search-box-autocomplete.js @@ -0,0 +1,152 @@ +angular.module("search-box-example", ['uiGmapgoogle-maps']) + +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ +// key: 'your api key', + v: '3.17', + libraries: 'places' + }); +}]) + +.run(['$templateCache', function ($templateCache) { + $templateCache.put('searchbox.tpl.html', ''); + $templateCache.put('window.tpl.html', '
{{place.name}}
'); +}]) + +.controller('WindowCtrl', function ($scope) { + $scope.place = {}; + $scope.showPlaceDetails = function(param) { + $scope.place = param; + } +}) + +.controller("SearchBoxController",['$scope', '$timeout', 'uiGmapLogger', '$http','uiGmapGoogleMapApi' + , function ($scope, $timeout, $log, $http, GoogleMapApi) { + $log.doLog = true + + GoogleMapApi.then(function(maps) { + maps.visualRefresh = true; + $scope.defaultBounds = new google.maps.LatLngBounds( + new google.maps.LatLng(40.82148, -73.66450), + new google.maps.LatLng(40.66541, -74.31715)); + + + $scope.map.bounds = { + northeast: { + latitude:$scope.defaultBounds.getNorthEast().lat(), + longitude:$scope.defaultBounds.getNorthEast().lng() + }, + southwest: { + latitude:$scope.defaultBounds.getSouthWest().lat(), + longitude:-$scope.defaultBounds.getSouthWest().lng() + + } + } + $scope.searchbox.options.bounds = new google.maps.LatLngBounds($scope.defaultBounds.getNorthEast(), $scope.defaultBounds.getSouthWest()); + }); + + angular.extend($scope, { + window: { + show: false, + options: { + pixelOffset: { width: 0, height: -40 } + }, + templateurl:'window.tpl.html', + templateparameter: {}, + closeClick: function () { + $scope.window.show = false; + } + }, + map: { + control: {}, + center: { + latitude: 40.74349, + longitude: -73.990822 + }, + zoom: 12, + dragging: false, + bounds: {}, + markers: [], + idkey: 'place_id', + events: { + idle: function (map) { + + }, + dragend: function(map) { + //update the search box bounds after dragging the map + var bounds = map.getBounds(); + var ne = bounds.getNorthEast(); + var sw = bounds.getSouthWest(); + $scope.searchbox.options.bounds = new google.maps.LatLngBounds(sw, ne); + //$scope.searchbox.options.visible = true; + } + } + }, + searchbox: { + template:'searchbox.tpl.html', + options: { + autocomplete:true, + types: ['(cities)'], + componentRestrictions: {country: 'fr'} + }, + events: { + place_changed: function (autocomplete){ + + place = autocomplete.getPlace() + + if (place.address_components) { + + newMarkers = []; + var bounds = new google.maps.LatLngBounds(); + + var marker = { + idKey:place.place_id, + place_id: place.place_id, + name: place.address_components[0].long_name, + latitude: place.geometry.location.lat(), + longitude: place.geometry.location.lng(), + templateurl:'window.tpl.html', + templateparameter: place, + events: { + click: function (marker) { + $scope.window.coords = { + latitude: marker.model.latitude, + longitude: marker.model.longitude + } + $scope.window.templateparameter = marker.model.templateparameter; + $scope.window.show = true; + + } + } + }; + + newMarkers.push(marker); + + bounds.extend(place.geometry.location); + + $scope.map.bounds = { + northeast: { + latitude: bounds.getNorthEast().lat(), + longitude: bounds.getNorthEast().lng() + }, + southwest: { + latitude: bounds.getSouthWest().lat(), + longitude: bounds.getSouthWest().lng() + } + } + + $scope.map.markers = newMarkers; + } else { + console.log("do something else with the search string: " + place.name); + } + } + } + + + } + }); + + + + +}]); diff --git a/example/assets/scripts/controllers/search-box-ngmodel.js b/example/assets/scripts/controllers/search-box-ngmodel.js new file mode 100644 index 000000000..f887843c3 --- /dev/null +++ b/example/assets/scripts/controllers/search-box-ngmodel.js @@ -0,0 +1,161 @@ +angular.module("search-box-example", ['uiGmapgoogle-maps']) + +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ +// key: 'your api key', + v: '3.17', + libraries: 'places' + }); +}]) + +.run(['$templateCache', function ($templateCache) { + $templateCache.put('searchbox.tpl.html', ''); + $templateCache.put('window.tpl.html', '
{{place.name}}
'); +}]) + +.controller('WindowCtrl', function ($scope) { + $scope.place = {}; + $scope.showPlaceDetails = function(param) { + $scope.place = param; + } +}) + +.controller("SearchBoxController",['$scope', '$timeout', 'uiGmapLogger', '$http','uiGmapGoogleMapApi' + , function ($scope, $timeout, $log, $http, GoogleMapApi) { + $log.doLog = true + + $scope.$watch( 'searchModel.searchTerm', function (newValue, oldValue){ + if (newValue == oldValue) { + return null; + } else { + //console.log("the value changed to " + newValue); + } + + }); + + + GoogleMapApi.then(function(maps) { + maps.visualRefresh = true; + $scope.defaultBounds = new google.maps.LatLngBounds( + new google.maps.LatLng(40.82148, -73.66450), + new google.maps.LatLng(40.66541, -74.31715)); + + + $scope.map.bounds = { + northeast: { + latitude:$scope.defaultBounds.getNorthEast().lat(), + longitude:$scope.defaultBounds.getNorthEast().lng() + }, + southwest: { + latitude:$scope.defaultBounds.getSouthWest().lat(), + longitude:-$scope.defaultBounds.getSouthWest().lng() + + } + } + $scope.searchbox.options.bounds = new google.maps.LatLngBounds($scope.defaultBounds.getNorthEast(), $scope.defaultBounds.getSouthWest()); + }); + + angular.extend($scope, { + window: { + show: false, + options: { + pixelOffset: { width: 0, height: -40 } + }, + templateurl:'window.tpl.html', + templateparameter: {}, + closeClick: function () { + $scope.window.show = false; + } + }, + searchModel: { + searchTerm : "Pizza" + }, + map: { + control: {}, + center: { + latitude: 40.74349, + longitude: -73.990822 + }, + zoom: 12, + dragging: false, + bounds: {}, + markers: [], + idkey: 'place_id', + events: { + idle: function (map) { + + }, + dragend: function(map) { + //update the search box bounds after dragging the map + var bounds = map.getBounds(); + var ne = bounds.getNorthEast(); + var sw = bounds.getSouthWest(); + $scope.searchbox.options.bounds = new google.maps.LatLngBounds(sw, ne); + //$scope.searchbox.options.visible = true; + } + } + }, + searchbox: { + template:'searchbox.tpl.html', + //position:'top-right', + position:'top-left', + options: { + bounds: {} + }, + //parentdiv:'searchBoxParent', + events: { + places_changed: function (searchBox) { + + places = searchBox.getPlaces() + + if (places.length == 0) { + return; + } + // For each place, get the icon, place name, and location. + newMarkers = []; + var bounds = new google.maps.LatLngBounds(); + for (var i = 0, place; place = places[i]; i++) { + // Create a marker for each place. + var marker = { + idKey:i, + place_id: place.place_id, + name: place.name, + latitude: place.geometry.location.lat(), + longitude: place.geometry.location.lng(), + templateurl:'window.tpl.html', + templateparameter: place, + events: { + click: function (marker) { + $scope.window.coords = { + latitude: marker.model.latitude, + longitude: marker.model.longitude + } + $scope.window.templateparameter = marker.model.templateparameter; + $scope.window.show = true; + + } + } + }; + newMarkers.push(marker); + + bounds.extend(place.geometry.location); + } + + $scope.map.bounds = { + northeast: { + latitude: bounds.getNorthEast().lat(), + longitude: bounds.getNorthEast().lng() + }, + southwest: { + latitude: bounds.getSouthWest().lat(), + longitude: bounds.getSouthWest().lng() + } + } + + + $scope.map.markers = newMarkers; + } + } + } + }); +}]); diff --git a/example/assets/scripts/controllers/search-box.js b/example/assets/scripts/controllers/search-box.js new file mode 100644 index 000000000..f4fe36d00 --- /dev/null +++ b/example/assets/scripts/controllers/search-box.js @@ -0,0 +1,151 @@ +angular.module("search-box-example", ['uiGmapgoogle-maps']) + +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ +// key: 'your api key', + v: '3.17', + libraries: 'places' + }); +}]) + +.run(['$templateCache', function ($templateCache) { + $templateCache.put('searchbox.tpl.html', ''); + $templateCache.put('window.tpl.html', '
{{place.name}}
'); +}]) + +.controller('WindowCtrl', function ($scope) { + $scope.place = {}; + $scope.showPlaceDetails = function(param) { + $scope.place = param; + } +}) + +.controller("SearchBoxController",['$scope', '$timeout', 'uiGmapLogger', '$http','uiGmapGoogleMapApi' + , function ($scope, $timeout, $log, $http, GoogleMapApi) { + $log.doLog = true + + $scope.toggleMap = function () { + $scope.searchbox.options.visible = !$scope.searchbox.options.visible + } + + GoogleMapApi.then(function(maps) { + maps.visualRefresh = true; + $scope.defaultBounds = new google.maps.LatLngBounds( + new google.maps.LatLng(40.82148, -73.66450), + new google.maps.LatLng(40.66541, -74.31715)); + + + $scope.map.bounds = { + northeast: { + latitude:$scope.defaultBounds.getNorthEast().lat(), + longitude:$scope.defaultBounds.getNorthEast().lng() + }, + southwest: { + latitude:$scope.defaultBounds.getSouthWest().lat(), + longitude:-$scope.defaultBounds.getSouthWest().lng() + + } + } + $scope.searchbox.options.bounds = new google.maps.LatLngBounds($scope.defaultBounds.getNorthEast(), $scope.defaultBounds.getSouthWest()); + }); + + angular.extend($scope, { + window: { + show: false, + options: { + pixelOffset: { width: 0, height: -40 } + }, + templateurl:'window.tpl.html', + templateparameter: {}, + closeClick: function () { + $scope.window.show = false; + } + }, + map: { + control: {}, + center: { + latitude: 40.74349, + longitude: -73.990822 + }, + zoom: 12, + dragging: false, + bounds: {}, + markers: [], + idkey: 'place_id', + events: { + idle: function (map) { + + }, + dragend: function(map) { + //update the search box bounds after dragging the map + var bounds = map.getBounds(); + var ne = bounds.getNorthEast(); + var sw = bounds.getSouthWest(); + $scope.searchbox.options.bounds = new google.maps.LatLngBounds(sw, ne); + //$scope.searchbox.options.visible = true; + } + } + }, + searchbox: { + template: 'searchbox.tpl.html', + //position:'top-right', + position:'top-left', + options: { + bounds: {}, + visible: true + }, + //parentdiv:'searchBoxParent', + events: { + places_changed: function (searchBox) { + + places = searchBox.getPlaces() + + if (places.length == 0) { + return; + } + // For each place, get the icon, place name, and location. + newMarkers = []; + var bounds = new google.maps.LatLngBounds(); + for (var i = 0, place; place = places[i]; i++) { + // Create a marker for each place. + var marker = { + idKey:i, + place_id: place.place_id, + name: place.name, + latitude: place.geometry.location.lat(), + longitude: place.geometry.location.lng(), + templateurl:'window.tpl.html', + templateparameter: place, + events: { + click: function (marker) { + $scope.window.coords = { + latitude: marker.model.latitude, + longitude: marker.model.longitude + } + $scope.window.templateparameter = marker.model.templateparameter; + $scope.window.show = true; + + } + } + }; + newMarkers.push(marker); + bounds.extend(place.geometry.location); + } + + $scope.map.bounds = { + northeast: { + latitude: bounds.getNorthEast().lat(), + longitude: bounds.getNorthEast().lng() + }, + southwest: { + latitude: bounds.getSouthWest().lat(), + longitude: bounds.getSouthWest().lng() + } + } + + $scope.map.markers = newMarkers; + } + } + } + }); +}]); diff --git a/example/assets/scripts/controllers/shapes-lines.js b/example/assets/scripts/controllers/shapes-lines.js new file mode 100644 index 000000000..dd6cfdf33 --- /dev/null +++ b/example/assets/scripts/controllers/shapes-lines.js @@ -0,0 +1,262 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']).value("rndAddToLatLon",function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1) +}).controller("controller", + function ($scope, $timeout, $log, $http, rndAddToLatLon, uiGmapLogger) { + uiGmapLogger.doLog = true + // Enable the new Google Maps visuals until it gets enabled by default. + // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html + google.maps.visualRefresh = true; + + var versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + angular.extend($scope, { + example2: { + doRebuildAll: false + }, + clickWindow: function () { + $log.info('CLICK CLICK'); + Logger.info('CLICK CLICK'); + }, + map: { + control: {}, + version: "uknown", + + center: { + latitude: 45, + longitude: -73 + }, + options: { + streetViewControl: false, + panControl: false, + maxZoom: 20, + minZoom: 3 + }, + zoom: 3, + dragging: false, + bounds: {}, + + + events: { + tilesloaded: function (map, eventName, originalEventArgs) { + } + }, + circles: [ + { + id: 1, + center: { + latitude: 44, + longitude: -108 + }, + radius: 500000, + stroke: { + color: '#08B21F', + weight: 2, + opacity: 1 + }, + fill: { + color: '#08B21F', + opacity: 0.5 + }, + geodesic: true, // optional: defaults to false + draggable: true, // optional: defaults to false + clickable: true, // optional: defaults to true + editable: true, // optional: defaults to false + visible: true // optional: defaults to true + } + ], + polygons: [ + { + id: 1, + path: [ + { + latitude: 50, + longitude: -80 + }, + { + latitude: 30, + longitude: -120 + }, + { + latitude: 20, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: false, + visible: true, + fill: { + color: '#ff0000', + opacity: 0.8 + } + }, + { + id: 2, + path: [ + { + latitude: 60, + longitude: -80 + }, + { + latitude: 40, + longitude: -120 + }, + { + latitude: 45, + longitude: -95 + } + ], + stroke: { + color: '#33CDDC', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: false, + visible: true, + fill: { + color: '#33CCCC', + opacity: 0.8 + } + } + ], + polylines: [ + { + id: 1, + path: [ + { + latitude: 45, + longitude: -74 + }, + { + latitude: 30, + longitude: -89 + }, + { + latitude: 37, + longitude: -122 + }, + { + latitude: 60, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: false, + draggable: true, + geodesic: true, + visible: true + }, + { + id: 2, + path: [ + { + latitude: 47, + longitude: -74 + }, + { + latitude: 32, + longitude: -89 + }, + { + latitude: 39, + longitude: -122 + }, + { + latitude: 62, + longitude: -95 + } + ], + stroke: { + color: '#6060FB', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true + } + ] + }, + toggleColor: function (color) { + return color == 'red' ? '#6060FB' : 'red'; + } + + }); + + + $scope.refreshMap = function () { + //optional param if you want to refresh you can pass null undefined or false or empty arg + $scope.map.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map.control.getGMap().setZoom(11); + return; + }; + $scope.getMapInstance = function () { + alert("You have Map Instance of" + $scope.map.control.getGMap().toString()); + return; + } + + $timeout(function () { + + //go nuts // PLEASE KEEP THIS AS IT TESTS POLYLINES SPEED! +// var lastPolyline = $scope.map.polylines[1]; +// $scope.map.polylines = _.map(_.range(500), function (i) { +// var newPath = _.map(lastPolyline.path, function (p) { +// return { +// latitude: p.latitude, +// longitude: p.longitude + 1 +// }; +// }); +// var newPoly = _.clone(lastPolyline); +// newPoly.id = i + 1; +// newPoly.path = newPath; +// lastPolyline = newPoly; +// return newPoly; +// }); + + $scope.map.polylines.push({ + id: 3, + path: [ + { + latitude: 65, + longitude: -74 + }, + { + latitude: 50, + longitude: -89 + }, + { + latitude: 57, + longitude: -122 + }, + { + latitude: 20, + longitude: -95 + } + ], + stroke: { + color: '#FF0066', + weight: 3 + }, + editable: true, + draggable: true, + geodesic: true, + visible: true + }); + + }, 2000); + } +); diff --git a/example/assets/scripts/controllers/street-view-panorama.js b/example/assets/scripts/controllers/street-view-panorama.js new file mode 100644 index 000000000..ee32ee209 --- /dev/null +++ b/example/assets/scripts/controllers/street-view-panorama.js @@ -0,0 +1,21 @@ +angular.module('app', ['uiGmapgoogle-maps']) +.controller('ctrl', ['$scope', "uiGmapLogger", "uiGmapGoogleMapApi", "$http", + function ($scope, $log, uiGmapGoogleMapApi, $http) { + $scope.map = { + id: 1, + center: { + latitude: 38.889484, + longitude: -77.035279 + }, + zoom: 16, + refresh: false, + events: {}, + bounds: {}, + draw: undefined + }; + $scope.map.marker = _.extend({}, $scope.map.center); +}]) +.controller('PanCtrl',function(){ + +}); + diff --git a/example/assets/scripts/controllers/templates/app-window-ctrl.js b/example/assets/scripts/controllers/templates/app-window-ctrl.js new file mode 100644 index 000000000..707c1fb70 --- /dev/null +++ b/example/assets/scripts/controllers/templates/app-window-ctrl.js @@ -0,0 +1,13 @@ +angular.module('app') +.controller('WinController', function ($scope, $log) { + + $scope.getParam = function(){ + return $scope.parameter; + }; + + $scope.streetViewEvents = { + image_status_changed:function(gObject,eventName,model,status){ + $log.info("status street: " + status); + } + }; +}); diff --git a/example/assets/scripts/controllers/templates/info.js b/example/assets/scripts/controllers/templates/info.js new file mode 100644 index 000000000..9749c6a55 --- /dev/null +++ b/example/assets/scripts/controllers/templates/info.js @@ -0,0 +1,9 @@ +angular.module("angular-google-maps-example") + .controller('InfoController', function ($scope, $log) { + $scope.templateValue = 'hello from the template itself'; + $scope.clickedButtonInWindow = function () { + var msg = 'clicked a window in the template!'; + $log.info(msg); + alert(msg); + } + }); diff --git a/example/assets/scripts/controllers/templates/issue-1056-template-ctrl.js b/example/assets/scripts/controllers/templates/issue-1056-template-ctrl.js new file mode 100644 index 000000000..048244823 --- /dev/null +++ b/example/assets/scripts/controllers/templates/issue-1056-template-ctrl.js @@ -0,0 +1,2 @@ +angular.module('appMaps') +.controller('1056TemplateController', function ($scope, $log) {}); diff --git a/example/assets/scripts/controllers/two-maps.js b/example/assets/scripts/controllers/two-maps.js new file mode 100644 index 000000000..a85f1a726 --- /dev/null +++ b/example/assets/scripts/controllers/two-maps.js @@ -0,0 +1,133 @@ +angular.module("angular-google-maps-example", ['uiGmapgoogle-maps']) + +.value("rndAddToLatLon", function () { + return Math.floor(((Math.random() < 0.5 ? -1 : 1) * 2) + 1); +}) + +.config(['uiGmapGoogleMapApiProvider', function (GoogleMapApi) { + GoogleMapApi.configure({ + // key: 'your api key', + v: '3.17', + libraries: 'weather,geometry,visualization' + }); +}]) + +.controller("DebugController",[ +'$scope', '$timeout', 'uiGmapLogger', '$http', 'rndAddToLatLon','uiGmapGoogleMapApi', 'uiGmapIsReady', +function ($scope, $timeout, $log, $http, rndAddToLatLon,GoogleMapApi,IsReady) { + + + versionUrl = window.location.host === "rawgithub.com" ? "http://rawgithub.com/nlaplante/angular-google-maps/master/package.json" : "/package.json"; + + $http.get(versionUrl).success(function (data) { + if (!data) + console.error("no version object found!!"); + $scope.version = data.version; + }); + + + angular.extend($scope, { + map: { + control: {}, + center: { + latitude: 45, + longitude: -74 + }, + marker: { + id: 0, + latitude: 45, + longitude: -74, + options: { + visible: false + } + }, + marker2: { + id: 0, + latitude: 45.2, + longitude: -74.5 + }, + zoom: 7, + options: { + draggable:true, + disableDefaultUI: true, + panControl: false, + navigationControl: false, + scrollwheel: false, + scaleControl: false + }, + refresh: function () { + $scope.map.control.refresh(origCenter); + } + }, + map2: { + control: {}, + center: { + latitude: 52.2, + longitude: -80 + }, + showMap: true, + marker: { + id: 0, + latitude: 70, + longitude: -76, + options: { + visible: true + } + }, + marker2: { + id: 0, + latitude: 50.2, + longitude: -80.5 + }, + zoom: 4, + refresh: function () { + $scope.map2.control.refresh({latitude: 32.779680, longitude: -79.935493}); + $scope.map2.showMap = false; + $timeout(function () { + $scope.map2.showMap = true; + }); + }, + markers3: [ + { + id: 1, + time: "12:00PM", + coords: { + latitude: 52.2, + longitude: -80.5 + }, + icon: "assets/images/plane.png", + lastSignal: "Never", + click: function () { + this.show = true; + this.lastSignal = Math.round(Date.now()).toString(); + $scope.apply(); + }, + closeClick: function () { + this.showWindow = false; + }, + show: false + } + ], + onMarkerClick: function (m) { + m.lastSignal = Math.round(Date.now()).toString(); + m.show = true; + $scope.map2.markers3.length = 0; + $scope.map2.markers3 = [m]; + $scope.$apply(); + + } + } + }); + + GoogleMapApi.then(function(maps) { + maps.visualRefresh = true; + }); + + IsReady.promise(2).then(function (instances) { + instances.forEach(function(inst){ + inst.map.ourID = inst.instance; + }); + }); + + var origCenter = {latitude: $scope.map.center.latitude, longitude: $scope.map.center.longitude}; + }]); diff --git a/example/assets/scripts/mocks/heat-layer.js b/example/assets/scripts/mocks/heat-layer.js new file mode 100644 index 000000000..33aad5677 --- /dev/null +++ b/example/assets/scripts/mocks/heat-layer.js @@ -0,0 +1,541 @@ +//direct copy from here https://developers.google.com/maps/documentation/javascript/examples/layer-heatmap +//this function is only used to set the heatLayers data +MockHeatLayer = function (heatLayer) { + // Adding 500 Data Points + var map, pointarray, heatmap; + + var taxiData = [ + new google.maps.LatLng(37.782551, -122.445368), + new google.maps.LatLng(37.782745, -122.444586), + new google.maps.LatLng(37.782842, -122.443688), + new google.maps.LatLng(37.782919, -122.442815), + new google.maps.LatLng(37.782992, -122.442112), + new google.maps.LatLng(37.783100, -122.441461), + new google.maps.LatLng(37.783206, -122.440829), + new google.maps.LatLng(37.783273, -122.440324), + new google.maps.LatLng(37.783316, -122.440023), + new google.maps.LatLng(37.783357, -122.439794), + new google.maps.LatLng(37.783371, -122.439687), + new google.maps.LatLng(37.783368, -122.439666), + new google.maps.LatLng(37.783383, -122.439594), + new google.maps.LatLng(37.783508, -122.439525), + new google.maps.LatLng(37.783842, -122.439591), + new google.maps.LatLng(37.784147, -122.439668), + new google.maps.LatLng(37.784206, -122.439686), + new google.maps.LatLng(37.784386, -122.439790), + new google.maps.LatLng(37.784701, -122.439902), + new google.maps.LatLng(37.784965, -122.439938), + new google.maps.LatLng(37.785010, -122.439947), + new google.maps.LatLng(37.785360, -122.439952), + new google.maps.LatLng(37.785715, -122.440030), + new google.maps.LatLng(37.786117, -122.440119), + new google.maps.LatLng(37.786564, -122.440209), + new google.maps.LatLng(37.786905, -122.440270), + new google.maps.LatLng(37.786956, -122.440279), + new google.maps.LatLng(37.800224, -122.433520), + new google.maps.LatLng(37.800155, -122.434101), + new google.maps.LatLng(37.800160, -122.434430), + new google.maps.LatLng(37.800378, -122.434527), + new google.maps.LatLng(37.800738, -122.434598), + new google.maps.LatLng(37.800938, -122.434650), + new google.maps.LatLng(37.801024, -122.434889), + new google.maps.LatLng(37.800955, -122.435392), + new google.maps.LatLng(37.800886, -122.435959), + new google.maps.LatLng(37.800811, -122.436275), + new google.maps.LatLng(37.800788, -122.436299), + new google.maps.LatLng(37.800719, -122.436302), + new google.maps.LatLng(37.800702, -122.436298), + new google.maps.LatLng(37.800661, -122.436273), + new google.maps.LatLng(37.800395, -122.436172), + new google.maps.LatLng(37.800228, -122.436116), + new google.maps.LatLng(37.800169, -122.436130), + new google.maps.LatLng(37.800066, -122.436167), + new google.maps.LatLng(37.784345, -122.422922), + new google.maps.LatLng(37.784389, -122.422926), + new google.maps.LatLng(37.784437, -122.422924), + new google.maps.LatLng(37.784746, -122.422818), + new google.maps.LatLng(37.785436, -122.422959), + new google.maps.LatLng(37.786120, -122.423112), + new google.maps.LatLng(37.786433, -122.423029), + new google.maps.LatLng(37.786631, -122.421213), + new google.maps.LatLng(37.786660, -122.421033), + new google.maps.LatLng(37.786801, -122.420141), + new google.maps.LatLng(37.786823, -122.420034), + new google.maps.LatLng(37.786831, -122.419916), + new google.maps.LatLng(37.787034, -122.418208), + new google.maps.LatLng(37.787056, -122.418034), + new google.maps.LatLng(37.787169, -122.417145), + new google.maps.LatLng(37.787217, -122.416715), + new google.maps.LatLng(37.786144, -122.416403), + new google.maps.LatLng(37.785292, -122.416257), + new google.maps.LatLng(37.780666, -122.390374), + new google.maps.LatLng(37.780501, -122.391281), + new google.maps.LatLng(37.780148, -122.392052), + new google.maps.LatLng(37.780173, -122.391148), + new google.maps.LatLng(37.780693, -122.390592), + new google.maps.LatLng(37.781261, -122.391142), + new google.maps.LatLng(37.781808, -122.391730), + new google.maps.LatLng(37.782340, -122.392341), + new google.maps.LatLng(37.782812, -122.393022), + new google.maps.LatLng(37.783300, -122.393672), + new google.maps.LatLng(37.783809, -122.394275), + new google.maps.LatLng(37.784246, -122.394979), + new google.maps.LatLng(37.784791, -122.395958), + new google.maps.LatLng(37.785675, -122.396746), + new google.maps.LatLng(37.786262, -122.395780), + new google.maps.LatLng(37.786776, -122.395093), + new google.maps.LatLng(37.787282, -122.394426), + new google.maps.LatLng(37.787783, -122.393767), + new google.maps.LatLng(37.788343, -122.393184), + new google.maps.LatLng(37.788895, -122.392506), + new google.maps.LatLng(37.789371, -122.391701), + new google.maps.LatLng(37.789722, -122.390952), + new google.maps.LatLng(37.790315, -122.390305), + new google.maps.LatLng(37.790738, -122.389616), + new google.maps.LatLng(37.779448, -122.438702), + new google.maps.LatLng(37.779023, -122.438585), + new google.maps.LatLng(37.778542, -122.438492), + new google.maps.LatLng(37.778100, -122.438411), + new google.maps.LatLng(37.777986, -122.438376), + new google.maps.LatLng(37.777680, -122.438313), + new google.maps.LatLng(37.777316, -122.438273), + new google.maps.LatLng(37.777135, -122.438254), + new google.maps.LatLng(37.776987, -122.438303), + new google.maps.LatLng(37.776946, -122.438404), + new google.maps.LatLng(37.776944, -122.438467), + new google.maps.LatLng(37.776892, -122.438459), + new google.maps.LatLng(37.776842, -122.438442), + new google.maps.LatLng(37.776822, -122.438391), + new google.maps.LatLng(37.776814, -122.438412), + new google.maps.LatLng(37.776787, -122.438628), + new google.maps.LatLng(37.776729, -122.438650), + new google.maps.LatLng(37.776759, -122.438677), + new google.maps.LatLng(37.776772, -122.438498), + new google.maps.LatLng(37.776787, -122.438389), + new google.maps.LatLng(37.776848, -122.438283), + new google.maps.LatLng(37.776870, -122.438239), + new google.maps.LatLng(37.777015, -122.438198), + new google.maps.LatLng(37.777333, -122.438256), + new google.maps.LatLng(37.777595, -122.438308), + new google.maps.LatLng(37.777797, -122.438344), + new google.maps.LatLng(37.778160, -122.438442), + new google.maps.LatLng(37.778414, -122.438508), + new google.maps.LatLng(37.778445, -122.438516), + new google.maps.LatLng(37.778503, -122.438529), + new google.maps.LatLng(37.778607, -122.438549), + new google.maps.LatLng(37.778670, -122.438644), + new google.maps.LatLng(37.778847, -122.438706), + new google.maps.LatLng(37.779240, -122.438744), + new google.maps.LatLng(37.779738, -122.438822), + new google.maps.LatLng(37.780201, -122.438882), + new google.maps.LatLng(37.780400, -122.438905), + new google.maps.LatLng(37.780501, -122.438921), + new google.maps.LatLng(37.780892, -122.438986), + new google.maps.LatLng(37.781446, -122.439087), + new google.maps.LatLng(37.781985, -122.439199), + new google.maps.LatLng(37.782239, -122.439249), + new google.maps.LatLng(37.782286, -122.439266), + new google.maps.LatLng(37.797847, -122.429388), + new google.maps.LatLng(37.797874, -122.429180), + new google.maps.LatLng(37.797885, -122.429069), + new google.maps.LatLng(37.797887, -122.429050), + new google.maps.LatLng(37.797933, -122.428954), + new google.maps.LatLng(37.798242, -122.428990), + new google.maps.LatLng(37.798617, -122.429075), + new google.maps.LatLng(37.798719, -122.429092), + new google.maps.LatLng(37.798944, -122.429145), + new google.maps.LatLng(37.799320, -122.429251), + new google.maps.LatLng(37.799590, -122.429309), + new google.maps.LatLng(37.799677, -122.429324), + new google.maps.LatLng(37.799966, -122.429360), + new google.maps.LatLng(37.800288, -122.429430), + new google.maps.LatLng(37.800443, -122.429461), + new google.maps.LatLng(37.800465, -122.429474), + new google.maps.LatLng(37.800644, -122.429540), + new google.maps.LatLng(37.800948, -122.429620), + new google.maps.LatLng(37.801242, -122.429685), + new google.maps.LatLng(37.801375, -122.429702), + new google.maps.LatLng(37.801400, -122.429703), + new google.maps.LatLng(37.801453, -122.429707), + new google.maps.LatLng(37.801473, -122.429709), + new google.maps.LatLng(37.801532, -122.429707), + new google.maps.LatLng(37.801852, -122.429729), + new google.maps.LatLng(37.802173, -122.429789), + new google.maps.LatLng(37.802459, -122.429847), + new google.maps.LatLng(37.802554, -122.429825), + new google.maps.LatLng(37.802647, -122.429549), + new google.maps.LatLng(37.802693, -122.429179), + new google.maps.LatLng(37.802729, -122.428751), + new google.maps.LatLng(37.766104, -122.409291), + new google.maps.LatLng(37.766103, -122.409268), + new google.maps.LatLng(37.766138, -122.409229), + new google.maps.LatLng(37.766183, -122.409231), + new google.maps.LatLng(37.766153, -122.409276), + new google.maps.LatLng(37.766005, -122.409365), + new google.maps.LatLng(37.765897, -122.409570), + new google.maps.LatLng(37.765767, -122.409739), + new google.maps.LatLng(37.765693, -122.410389), + new google.maps.LatLng(37.765615, -122.411201), + new google.maps.LatLng(37.765533, -122.412121), + new google.maps.LatLng(37.765467, -122.412939), + new google.maps.LatLng(37.765444, -122.414821), + new google.maps.LatLng(37.765444, -122.414964), + new google.maps.LatLng(37.765318, -122.415424), + new google.maps.LatLng(37.763961, -122.415296), + new google.maps.LatLng(37.763115, -122.415196), + new google.maps.LatLng(37.762967, -122.415183), + new google.maps.LatLng(37.762278, -122.415127), + new google.maps.LatLng(37.761675, -122.415055), + new google.maps.LatLng(37.760932, -122.414988), + new google.maps.LatLng(37.759337, -122.414862), + new google.maps.LatLng(37.773187, -122.421922), + new google.maps.LatLng(37.773043, -122.422118), + new google.maps.LatLng(37.773007, -122.422165), + new google.maps.LatLng(37.772979, -122.422219), + new google.maps.LatLng(37.772865, -122.422394), + new google.maps.LatLng(37.772779, -122.422503), + new google.maps.LatLng(37.772676, -122.422701), + new google.maps.LatLng(37.772606, -122.422806), + new google.maps.LatLng(37.772566, -122.422840), + new google.maps.LatLng(37.772508, -122.422852), + new google.maps.LatLng(37.772387, -122.423011), + new google.maps.LatLng(37.772099, -122.423328), + new google.maps.LatLng(37.771704, -122.423783), + new google.maps.LatLng(37.771481, -122.424081), + new google.maps.LatLng(37.771400, -122.424179), + new google.maps.LatLng(37.771352, -122.424220), + new google.maps.LatLng(37.771248, -122.424327), + new google.maps.LatLng(37.770904, -122.424781), + new google.maps.LatLng(37.770520, -122.425283), + new google.maps.LatLng(37.770337, -122.425553), + new google.maps.LatLng(37.770128, -122.425832), + new google.maps.LatLng(37.769756, -122.426331), + new google.maps.LatLng(37.769300, -122.426902), + new google.maps.LatLng(37.769132, -122.427065), + new google.maps.LatLng(37.769092, -122.427103), + new google.maps.LatLng(37.768979, -122.427172), + new google.maps.LatLng(37.768595, -122.427634), + new google.maps.LatLng(37.768372, -122.427913), + new google.maps.LatLng(37.768337, -122.427961), + new google.maps.LatLng(37.768244, -122.428138), + new google.maps.LatLng(37.767942, -122.428581), + new google.maps.LatLng(37.767482, -122.429094), + new google.maps.LatLng(37.767031, -122.429606), + new google.maps.LatLng(37.766732, -122.429986), + new google.maps.LatLng(37.766680, -122.430058), + new google.maps.LatLng(37.766633, -122.430109), + new google.maps.LatLng(37.766580, -122.430211), + new google.maps.LatLng(37.766367, -122.430594), + new google.maps.LatLng(37.765910, -122.431137), + new google.maps.LatLng(37.765353, -122.431806), + new google.maps.LatLng(37.764962, -122.432298), + new google.maps.LatLng(37.764868, -122.432486), + new google.maps.LatLng(37.764518, -122.432913), + new google.maps.LatLng(37.763435, -122.434173), + new google.maps.LatLng(37.762847, -122.434953), + new google.maps.LatLng(37.762291, -122.435935), + new google.maps.LatLng(37.762224, -122.436074), + new google.maps.LatLng(37.761957, -122.436892), + new google.maps.LatLng(37.761652, -122.438886), + new google.maps.LatLng(37.761284, -122.439955), + new google.maps.LatLng(37.761210, -122.440068), + new google.maps.LatLng(37.761064, -122.440720), + new google.maps.LatLng(37.761040, -122.441411), + new google.maps.LatLng(37.761048, -122.442324), + new google.maps.LatLng(37.760851, -122.443118), + new google.maps.LatLng(37.759977, -122.444591), + new google.maps.LatLng(37.759913, -122.444698), + new google.maps.LatLng(37.759623, -122.445065), + new google.maps.LatLng(37.758902, -122.445158), + new google.maps.LatLng(37.758428, -122.444570), + new google.maps.LatLng(37.757687, -122.443340), + new google.maps.LatLng(37.757583, -122.443240), + new google.maps.LatLng(37.757019, -122.442787), + new google.maps.LatLng(37.756603, -122.442322), + new google.maps.LatLng(37.756380, -122.441602), + new google.maps.LatLng(37.755790, -122.441382), + new google.maps.LatLng(37.754493, -122.442133), + new google.maps.LatLng(37.754361, -122.442206), + new google.maps.LatLng(37.753719, -122.442650), + new google.maps.LatLng(37.753096, -122.442915), + new google.maps.LatLng(37.751617, -122.443211), + new google.maps.LatLng(37.751496, -122.443246), + new google.maps.LatLng(37.750733, -122.443428), + new google.maps.LatLng(37.750126, -122.443536), + new google.maps.LatLng(37.750103, -122.443784), + new google.maps.LatLng(37.750390, -122.444010), + new google.maps.LatLng(37.750448, -122.444013), + new google.maps.LatLng(37.750536, -122.444040), + new google.maps.LatLng(37.750493, -122.444141), + new google.maps.LatLng(37.790859, -122.402808), + new google.maps.LatLng(37.790864, -122.402768), + new google.maps.LatLng(37.790995, -122.402539), + new google.maps.LatLng(37.791148, -122.402172), + new google.maps.LatLng(37.791385, -122.401312), + new google.maps.LatLng(37.791405, -122.400776), + new google.maps.LatLng(37.791288, -122.400528), + new google.maps.LatLng(37.791113, -122.400441), + new google.maps.LatLng(37.791027, -122.400395), + new google.maps.LatLng(37.791094, -122.400311), + new google.maps.LatLng(37.791211, -122.400183), + new google.maps.LatLng(37.791060, -122.399334), + new google.maps.LatLng(37.790538, -122.398718), + new google.maps.LatLng(37.790095, -122.398086), + new google.maps.LatLng(37.789644, -122.397360), + new google.maps.LatLng(37.789254, -122.396844), + new google.maps.LatLng(37.788855, -122.396397), + new google.maps.LatLng(37.788483, -122.395963), + new google.maps.LatLng(37.788015, -122.395365), + new google.maps.LatLng(37.787558, -122.394735), + new google.maps.LatLng(37.787472, -122.394323), + new google.maps.LatLng(37.787630, -122.394025), + new google.maps.LatLng(37.787767, -122.393987), + new google.maps.LatLng(37.787486, -122.394452), + new google.maps.LatLng(37.786977, -122.395043), + new google.maps.LatLng(37.786583, -122.395552), + new google.maps.LatLng(37.786540, -122.395610), + new google.maps.LatLng(37.786516, -122.395659), + new google.maps.LatLng(37.786378, -122.395707), + new google.maps.LatLng(37.786044, -122.395362), + new google.maps.LatLng(37.785598, -122.394715), + new google.maps.LatLng(37.785321, -122.394361), + new google.maps.LatLng(37.785207, -122.394236), + new google.maps.LatLng(37.785751, -122.394062), + new google.maps.LatLng(37.785996, -122.393881), + new google.maps.LatLng(37.786092, -122.393830), + new google.maps.LatLng(37.785998, -122.393899), + new google.maps.LatLng(37.785114, -122.394365), + new google.maps.LatLng(37.785022, -122.394441), + new google.maps.LatLng(37.784823, -122.394635), + new google.maps.LatLng(37.784719, -122.394629), + new google.maps.LatLng(37.785069, -122.394176), + new google.maps.LatLng(37.785500, -122.393650), + new google.maps.LatLng(37.785770, -122.393291), + new google.maps.LatLng(37.785839, -122.393159), + new google.maps.LatLng(37.782651, -122.400628), + new google.maps.LatLng(37.782616, -122.400599), + new google.maps.LatLng(37.782702, -122.400470), + new google.maps.LatLng(37.782915, -122.400192), + new google.maps.LatLng(37.783137, -122.399887), + new google.maps.LatLng(37.783414, -122.399519), + new google.maps.LatLng(37.783629, -122.399237), + new google.maps.LatLng(37.783688, -122.399157), + new google.maps.LatLng(37.783716, -122.399106), + new google.maps.LatLng(37.783798, -122.399072), + new google.maps.LatLng(37.783997, -122.399186), + new google.maps.LatLng(37.784271, -122.399538), + new google.maps.LatLng(37.784577, -122.399948), + new google.maps.LatLng(37.784828, -122.400260), + new google.maps.LatLng(37.784999, -122.400477), + new google.maps.LatLng(37.785113, -122.400651), + new google.maps.LatLng(37.785155, -122.400703), + new google.maps.LatLng(37.785192, -122.400749), + new google.maps.LatLng(37.785278, -122.400839), + new google.maps.LatLng(37.785387, -122.400857), + new google.maps.LatLng(37.785478, -122.400890), + new google.maps.LatLng(37.785526, -122.401022), + new google.maps.LatLng(37.785598, -122.401148), + new google.maps.LatLng(37.785631, -122.401202), + new google.maps.LatLng(37.785660, -122.401267), + new google.maps.LatLng(37.803986, -122.426035), + new google.maps.LatLng(37.804102, -122.425089), + new google.maps.LatLng(37.804211, -122.424156), + new google.maps.LatLng(37.803861, -122.423385), + new google.maps.LatLng(37.803151, -122.423214), + new google.maps.LatLng(37.802439, -122.423077), + new google.maps.LatLng(37.801740, -122.422905), + new google.maps.LatLng(37.801069, -122.422785), + new google.maps.LatLng(37.800345, -122.422649), + new google.maps.LatLng(37.799633, -122.422603), + new google.maps.LatLng(37.799750, -122.421700), + new google.maps.LatLng(37.799885, -122.420854), + new google.maps.LatLng(37.799209, -122.420607), + new google.maps.LatLng(37.795656, -122.400395), + new google.maps.LatLng(37.795203, -122.400304), + new google.maps.LatLng(37.778738, -122.415584), + new google.maps.LatLng(37.778812, -122.415189), + new google.maps.LatLng(37.778824, -122.415092), + new google.maps.LatLng(37.778833, -122.414932), + new google.maps.LatLng(37.778834, -122.414898), + new google.maps.LatLng(37.778740, -122.414757), + new google.maps.LatLng(37.778501, -122.414433), + new google.maps.LatLng(37.778182, -122.414026), + new google.maps.LatLng(37.777851, -122.413623), + new google.maps.LatLng(37.777486, -122.413166), + new google.maps.LatLng(37.777109, -122.412674), + new google.maps.LatLng(37.776743, -122.412186), + new google.maps.LatLng(37.776440, -122.411800), + new google.maps.LatLng(37.776295, -122.411614), + new google.maps.LatLng(37.776158, -122.411440), + new google.maps.LatLng(37.775806, -122.410997), + new google.maps.LatLng(37.775422, -122.410484), + new google.maps.LatLng(37.775126, -122.410087), + new google.maps.LatLng(37.775012, -122.409854), + new google.maps.LatLng(37.775164, -122.409573), + new google.maps.LatLng(37.775498, -122.409180), + new google.maps.LatLng(37.775868, -122.408730), + new google.maps.LatLng(37.776256, -122.408240), + new google.maps.LatLng(37.776519, -122.407928), + new google.maps.LatLng(37.776539, -122.407904), + new google.maps.LatLng(37.776595, -122.407854), + new google.maps.LatLng(37.776853, -122.407547), + new google.maps.LatLng(37.777234, -122.407087), + new google.maps.LatLng(37.777644, -122.406558), + new google.maps.LatLng(37.778066, -122.406017), + new google.maps.LatLng(37.778468, -122.405499), + new google.maps.LatLng(37.778866, -122.404995), + new google.maps.LatLng(37.779295, -122.404455), + new google.maps.LatLng(37.779695, -122.403950), + new google.maps.LatLng(37.779982, -122.403584), + new google.maps.LatLng(37.780295, -122.403223), + new google.maps.LatLng(37.780664, -122.402766), + new google.maps.LatLng(37.781043, -122.402288), + new google.maps.LatLng(37.781399, -122.401823), + new google.maps.LatLng(37.781727, -122.401407), + new google.maps.LatLng(37.781853, -122.401247), + new google.maps.LatLng(37.781894, -122.401195), + new google.maps.LatLng(37.782076, -122.400977), + new google.maps.LatLng(37.782338, -122.400603), + new google.maps.LatLng(37.782666, -122.400133), + new google.maps.LatLng(37.783048, -122.399634), + new google.maps.LatLng(37.783450, -122.399198), + new google.maps.LatLng(37.783791, -122.398998), + new google.maps.LatLng(37.784177, -122.398959), + new google.maps.LatLng(37.784388, -122.398971), + new google.maps.LatLng(37.784404, -122.399128), + new google.maps.LatLng(37.784586, -122.399524), + new google.maps.LatLng(37.784835, -122.399927), + new google.maps.LatLng(37.785116, -122.400307), + new google.maps.LatLng(37.785282, -122.400539), + new google.maps.LatLng(37.785346, -122.400692), + new google.maps.LatLng(37.765769, -122.407201), + new google.maps.LatLng(37.765790, -122.407414), + new google.maps.LatLng(37.765802, -122.407755), + new google.maps.LatLng(37.765791, -122.408219), + new google.maps.LatLng(37.765763, -122.408759), + new google.maps.LatLng(37.765726, -122.409348), + new google.maps.LatLng(37.765716, -122.409882), + new google.maps.LatLng(37.765708, -122.410202), + new google.maps.LatLng(37.765705, -122.410253), + new google.maps.LatLng(37.765707, -122.410369), + new google.maps.LatLng(37.765692, -122.410720), + new google.maps.LatLng(37.765699, -122.411215), + new google.maps.LatLng(37.765687, -122.411789), + new google.maps.LatLng(37.765666, -122.412373), + new google.maps.LatLng(37.765598, -122.412883), + new google.maps.LatLng(37.765543, -122.413039), + new google.maps.LatLng(37.765532, -122.413125), + new google.maps.LatLng(37.765500, -122.413553), + new google.maps.LatLng(37.765448, -122.414053), + new google.maps.LatLng(37.765388, -122.414645), + new google.maps.LatLng(37.765323, -122.415250), + new google.maps.LatLng(37.765303, -122.415847), + new google.maps.LatLng(37.765251, -122.416439), + new google.maps.LatLng(37.765204, -122.417020), + new google.maps.LatLng(37.765172, -122.417556), + new google.maps.LatLng(37.765164, -122.418075), + new google.maps.LatLng(37.765153, -122.418618), + new google.maps.LatLng(37.765136, -122.419112), + new google.maps.LatLng(37.765129, -122.419378), + new google.maps.LatLng(37.765119, -122.419481), + new google.maps.LatLng(37.765100, -122.419852), + new google.maps.LatLng(37.765083, -122.420349), + new google.maps.LatLng(37.765045, -122.420930), + new google.maps.LatLng(37.764992, -122.421481), + new google.maps.LatLng(37.764980, -122.421695), + new google.maps.LatLng(37.764993, -122.421843), + new google.maps.LatLng(37.764986, -122.422255), + new google.maps.LatLng(37.764975, -122.422823), + new google.maps.LatLng(37.764939, -122.423411), + new google.maps.LatLng(37.764902, -122.424014), + new google.maps.LatLng(37.764853, -122.424576), + new google.maps.LatLng(37.764826, -122.424922), + new google.maps.LatLng(37.764796, -122.425375), + new google.maps.LatLng(37.764782, -122.425869), + new google.maps.LatLng(37.764768, -122.426089), + new google.maps.LatLng(37.764766, -122.426117), + new google.maps.LatLng(37.764723, -122.426276), + new google.maps.LatLng(37.764681, -122.426649), + new google.maps.LatLng(37.782012, -122.404200), + new google.maps.LatLng(37.781574, -122.404911), + new google.maps.LatLng(37.781055, -122.405597), + new google.maps.LatLng(37.780479, -122.406341), + new google.maps.LatLng(37.779996, -122.406939), + new google.maps.LatLng(37.779459, -122.407613), + new google.maps.LatLng(37.778953, -122.408228), + new google.maps.LatLng(37.778409, -122.408839), + new google.maps.LatLng(37.777842, -122.409501), + new google.maps.LatLng(37.777334, -122.410181), + new google.maps.LatLng(37.776809, -122.410836), + new google.maps.LatLng(37.776240, -122.411514), + new google.maps.LatLng(37.775725, -122.412145), + new google.maps.LatLng(37.775190, -122.412805), + new google.maps.LatLng(37.774672, -122.413464), + new google.maps.LatLng(37.774084, -122.414186), + new google.maps.LatLng(37.773533, -122.413636), + new google.maps.LatLng(37.773021, -122.413009), + new google.maps.LatLng(37.772501, -122.412371), + new google.maps.LatLng(37.771964, -122.411681), + new google.maps.LatLng(37.771479, -122.411078), + new google.maps.LatLng(37.770992, -122.410477), + new google.maps.LatLng(37.770467, -122.409801), + new google.maps.LatLng(37.770090, -122.408904), + new google.maps.LatLng(37.769657, -122.408103), + new google.maps.LatLng(37.769132, -122.407276), + new google.maps.LatLng(37.768564, -122.406469), + new google.maps.LatLng(37.767980, -122.405745), + new google.maps.LatLng(37.767380, -122.405299), + new google.maps.LatLng(37.766604, -122.405297), + new google.maps.LatLng(37.765838, -122.405200), + new google.maps.LatLng(37.765139, -122.405139), + new google.maps.LatLng(37.764457, -122.405094), + new google.maps.LatLng(37.763716, -122.405142), + new google.maps.LatLng(37.762932, -122.405398), + new google.maps.LatLng(37.762126, -122.405813), + new google.maps.LatLng(37.761344, -122.406215), + new google.maps.LatLng(37.760556, -122.406495), + new google.maps.LatLng(37.759732, -122.406484), + new google.maps.LatLng(37.758910, -122.406228), + new google.maps.LatLng(37.758182, -122.405695), + new google.maps.LatLng(37.757676, -122.405118), + new google.maps.LatLng(37.757039, -122.404346), + new google.maps.LatLng(37.756335, -122.403719), + new google.maps.LatLng(37.755503, -122.403406), + new google.maps.LatLng(37.754665, -122.403242), + new google.maps.LatLng(37.753837, -122.403172), + new google.maps.LatLng(37.752986, -122.403112), + new google.maps.LatLng(37.751266, -122.403355) + ]; + + + var pointArray = new google.maps.MVCArray(taxiData); + heatLayer.setData(pointArray); + +//function changeGradient() { +// var gradient = [ +// 'rgba(0, 255, 255, 0)', +// 'rgba(0, 255, 255, 1)', +// 'rgba(0, 191, 255, 1)', +// 'rgba(0, 127, 255, 1)', +// 'rgba(0, 63, 255, 1)', +// 'rgba(0, 0, 255, 1)', +// 'rgba(0, 0, 223, 1)', +// 'rgba(0, 0, 191, 1)', +// 'rgba(0, 0, 159, 1)', +// 'rgba(0, 0, 127, 1)', +// 'rgba(63, 0, 91, 1)', +// 'rgba(127, 0, 63, 1)', +// 'rgba(191, 0, 31, 1)', +// 'rgba(255, 0, 0, 1)' +// ] +// heatmap.set('gradient', heatmap.get('gradient') ? null : gradient); +//} +// +//function changeRadius() { +// heatmap.set('radius', heatmap.get('radius') ? null : 20); +//} +// +//function changeOpacity() { +// heatmap.set('opacity', heatmap.get('opacity') ? null : 0.2); +//} +}; \ No newline at end of file diff --git a/example/assets/stylesheets/dynamic-height.css b/example/assets/stylesheets/dynamic-height.css new file mode 100644 index 000000000..24d1b2c0d --- /dev/null +++ b/example/assets/stylesheets/dynamic-height.css @@ -0,0 +1,32 @@ +/* +let me google that for you (many ways to skin this cat) +http://stackoverflow.com/questions/10209704/set-google-maps-container-div-width-and-height-100 (implemented here) +http://stackoverflow.com/questions/2821596/100-height-with-fixed-footer-and-embedded-google-map +*/ + +body, html { + height: 100%; + width: 100%; +} +.angular-google-map-container { + height: 100%; + width: 50%; + position: absolute; +} + +.middle { + display: table; + width: 50%; + margin-left: auto; + margin-right: auto; +} + +/* +Use bootstraps container w/ some overrides, nice thing about this on bootstrap is there is +psuedo element with clearfix and display: table; , all after (which is why I know .middle works above) +*/ +.container{ + width: 50%; + padding-left: 0; + padding-right: 0; +} \ No newline at end of file diff --git a/example/assets/stylesheets/example.css b/example/assets/stylesheets/example.css new file mode 100644 index 000000000..8b56abed0 --- /dev/null +++ b/example/assets/stylesheets/example.css @@ -0,0 +1,81 @@ +body { + font-family: 'Open Sans', sans-serif; +} + +.angular-google-map-container { + width: 100%; + height: 600px; +} + +/* fix for Twitter Bootstrap handling of responsive images */ +.angular-google-map img { + max-width: none; +} + +.angular-google-map { + top: 80px; + +} + +.shrink { + font-size: 8; +} + +.true:hover { + background-color: lightgreen; +} + +.false:hover { + background-color: lightpink; +} + +.marker-labels { + color: red; + background-color: white; + font-family: "Lucida Grande", "Arial", sans-serif; + font-size: 10px; + font-weight: bold; + text-align: center; + border: 1px solid black; + white-space: nowrap; +} + +/** FIX for Bootstrap and Google Maps Info window styes problem **/ +img[src*="gstatic.com/"], img[src*="googleapis.com/"] { + max-width: none; +} + + +/* uncomment this if you are using the element instead of a div +.angular-google-map { + display: block; + }*/ + +.custom-info-window{ + background: rgba(0,0,0,0.5); + color: white; + padding: 20px; + /*border: 1px solid white;*/ + box-shadow: 3px 3px 10px rgba(0,0,0,0.5); + border-radius: 5px; + width: 200px; + margin-top: 15px; + margin-left: -130px; +} +.custom-info-window a{ + color: white; + text-decoration: underline; +} +.custom-info-window:after +{ + content: ''; + position: absolute; + border-style: solid; + border-width: 0 15px 15px; + border-color: rgba(0,0,0,0.5) transparent; + display: block; + width: 0; + z-index: 1; + top: -15px; + left: 118px; +} diff --git a/example/assets/stylesheets/geojson.css b/example/assets/stylesheets/geojson.css new file mode 100644 index 000000000..0ec4a78af --- /dev/null +++ b/example/assets/stylesheets/geojson.css @@ -0,0 +1,76 @@ +body { + font-family: 'Open Sans', sans-serif; +} + +.angular-google-map-container { + width: 100%; + height: 600px; +} + +/* fix for Twitter Bootstrap handling of responsive images */ +.angular-google-map img { + max-width: inherit; +} + +.angular-google-map { + top: 80px; + +} + +.shrink { + font-size: 8; +} + +.true:hover { + background-color: lightgreen; +} + +.false:hover { + background-color: lightpink; +} + +.marker-labels { + color: red; + background-color: white; + font-family: "Lucida Grande", "Arial", sans-serif; + font-size: 10px; + font-weight: bold; + text-align: center; + border: 1px solid black; + white-space: nowrap; +} +/* uncomment this if you are using the element instead of a div +.angular-google-map { + display: block; + }*/ + +.custom-info-window{ + background: rgba(0,0,0,0.5); + color: white; + padding: 20px; + /*border: 1px solid white;*/ + box-shadow: 3px 3px 10px rgba(0,0,0,0.5); + border-radius: 5px; + width: 200px; + margin-top: 15px; + margin-left: -130px; +} +.custom-info-window a{ + color: white; + text-decoration: underline; +} +.custom-info-window:after +{ + content: ''; + position: absolute; + border-style: solid; + border-width: 0 15px 15px; + border-color: rgba(0,0,0,0.5) transparent; + display: block; + width: 0; + z-index: 1; + top: -15px; + left: 118px; +} + + diff --git a/example/assets/stylesheets/gwin-size-fix.css b/example/assets/stylesheets/gwin-size-fix.css new file mode 100644 index 000000000..7541d36b5 --- /dev/null +++ b/example/assets/stylesheets/gwin-size-fix.css @@ -0,0 +1,16 @@ +/* +http://stackoverflow.com/questions/1554893/google-maps-api-v3-infowindow-not-sizing-correctly +*/ +.gm-style-iw { + overflow:auto !important; + max-width:300px; + min-height:75px; + max-height:175px +} + +.gm-style-iw > div{ + overflow:auto !important; + max-width:300px; + min-height:75px; + max-height:175px; +} \ No newline at end of file diff --git a/example/assets/stylesheets/gwin-size-street-view.css b/example/assets/stylesheets/gwin-size-street-view.css new file mode 100644 index 000000000..7b02f8a7f --- /dev/null +++ b/example/assets/stylesheets/gwin-size-street-view.css @@ -0,0 +1,25 @@ +/* +http://stackoverflow.com/questions/1554893/google-maps-api-v3-infowindow-not-sizing-correctly +*/ +.gm-style-iw { + overflow:auto !important; + max-width:600px; + min-width:300px; + min-height:300px; + max-height:600px; +} + +.gm-style-iw > div{ + overflow:auto !important; + max-width:600px; + min-width:300px; + min-height:300px; + max-height:600px; +} + +.angular-google-map-street-view-panorama{ + max-width:600px; + min-width:300px; + min-height:300px; + max-height:600px; +} \ No newline at end of file diff --git a/example/assets/stylesheets/hugedata.css b/example/assets/stylesheets/hugedata.css new file mode 100644 index 000000000..d4cb470d2 --- /dev/null +++ b/example/assets/stylesheets/hugedata.css @@ -0,0 +1,3 @@ +.buying-map .angular-google-map-container { + height: 560px; +} \ No newline at end of file diff --git a/example/assets/stylesheets/many-maps.css b/example/assets/stylesheets/many-maps.css new file mode 100644 index 000000000..191723387 --- /dev/null +++ b/example/assets/stylesheets/many-maps.css @@ -0,0 +1,3 @@ +.angular-google-map-container { + height: 250px; +} \ No newline at end of file diff --git a/example/assets/stylesheets/search-box-example.css b/example/assets/stylesheets/search-box-example.css new file mode 100644 index 000000000..ab7b29c0f --- /dev/null +++ b/example/assets/stylesheets/search-box-example.css @@ -0,0 +1,59 @@ +html, body { + height: 100%; + margin: 0px; + padding: 0px +} + +.pac-controls { + margin-top: 16px; + border: 1px solid transparent; + border-radius: 2px 0 0 2px; + box-sizing: border-box; + -moz-box-sizing: border-box; + height: 32px !important; + outline: none; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); +} + +#pac-input { + background-color: #fff; + padding: 0 11px 0 13px; + width: 400px; + font-family: 'Open Sans', sans-serif; + font-size: 15px; + font-weight: 300; + text-overflow: ellipsis; +} + +#pac-input:focus { + border-color: #4d90fe; + margin-left: -1px; + padding-left: 14px; /* Regular padding-left + 1. */ + width: 401px; +} + +.pac-container { + font-family: 'Open Sans', sans-serif; +} + +#type-selector { + color: #fff; + background-color: #4d90fe; + padding: 5px 11px 0px 11px; +} + +#type-selector label { + font-family: 'Open Sans', sans-serif; + font-size: 13px; + font-weight: 300; +} + +.angular-google-map-container { + width: 100%; + height: 600px; +} + +/* fix for Twitter Bootstrap handling of responsive images */ +.angular-google-map img { + max-width: inherit; +} diff --git a/example/assets/templates/info.html b/example/assets/templates/info.html new file mode 100644 index 000000000..5f1ce2fea --- /dev/null +++ b/example/assets/templates/info.html @@ -0,0 +1,11 @@ +
+
+ I'm loaded from an external template, yay! +
+ Parameter from opener: {{ parameter.message }} +
+
+ Template specific: {{ templateValue }} +
+
+
diff --git a/example/assets/templates/issue-1056-template.html b/example/assets/templates/issue-1056-template.html new file mode 100644 index 000000000..48582ecd2 --- /dev/null +++ b/example/assets/templates/issue-1056-template.html @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/example/assets/templates/issue-755-ng-router.html b/example/assets/templates/issue-755-ng-router.html new file mode 100644 index 000000000..5c5f7a792 --- /dev/null +++ b/example/assets/templates/issue-755-ng-router.html @@ -0,0 +1,28 @@ +
+

{{map.title}}

+ + + + + +
+ {{marker.coords}} +
+
+
+ + + + + + + + +
+ +
diff --git a/example/assets/templates/street-view-window.html b/example/assets/templates/street-view-window.html new file mode 100644 index 000000000..c90aaf7d2 --- /dev/null +++ b/example/assets/templates/street-view-window.html @@ -0,0 +1,4 @@ +
+ + +
\ No newline at end of file diff --git a/example/dragzoom.html b/example/dragzoom.html new file mode 100644 index 000000000..2e3ff7aca --- /dev/null +++ b/example/dragzoom.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + Map + + + +
+ + + + + + +
+ + + diff --git a/example/dynamic-map-height.html b/example/dynamic-map-height.html new file mode 100644 index 000000000..bc8903921 --- /dev/null +++ b/example/dynamic-map-height.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + Map + + + +
+ + + + +
+ +
+
+ + +
+
    +
  • {{p.getPath()}}
  • +
+
+ + + diff --git a/example/example-controller.js b/example/example-controller.js deleted file mode 100644 index 64048ebbd..000000000 --- a/example/example-controller.js +++ /dev/null @@ -1,48 +0,0 @@ - -(function () { - var module = angular.module("angular-google-maps-example", ["google-maps"]); -}()); - -function ExampleController ($scope, $timeout, $log) { - - // Enable the new Google Maps visuals until it gets enabled by default. - // See http://googlegeodevelopers.blogspot.ca/2013/05/a-fresh-new-look-for-maps-api-for-all.html - google.maps.visualRefresh = true; - - angular.extend($scope, { - - position: { - coords: { - latitude: 45, - longitude: -73 - } - }, - - /** the initial center of the map */ - centerProperty: { - latitude: 45, - longitude: -73 - }, - - /** the initial zoom level of the map */ - zoomProperty: 4, - - /** list of markers to put in the map */ - markersProperty: [ { - latitude: 45, - longitude: -74 - }], - - // These 2 properties will be set when clicking on the map - clickedLatitudeProperty: null, - clickedLongitudeProperty: null, - - eventsProperty: { - click: function (mapModel, eventName, originalEventArgs) { - // 'this' is the directive's scope - $log.log("user defined event on map directive with scope", this); - $log.log("user defined event: " + eventName, mapModel, originalEventArgs); - } - } - }); -} \ No newline at end of file diff --git a/example/example.html b/example/example.html index 52c4854b8..062a45557 100644 --- a/example/example.html +++ b/example/example.html @@ -1,42 +1,481 @@ + + + + angular-google-maps example page + + + - - - angular-google-maps example page - - + + + + + +
+
+
+

angular-google-maps: {{version}}, google-maps: {{googleVersion}}

+
+ + + + Show Map: +
+
+ + + + + + + + + + + + + +
+

This is an info window at {{ map.infoWindow.coords.latitude | number:4 }}, {{ map.infoWindow.coords.longitude | number:4 }}!

+
+ I should not be attached to a + marker. + + CLICK ME +
+
+
+ + + + I'm a window with a custom class set via options.boxClass. I only work when googles + infoBox plugin is included. + + + + + + + + + + + + + +
+ I should not be attached to a + marker. +
+ CLICK ME +
+

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+ +

My marker will stay open when the window is popped up!

+
+
+
+ + + + + + +
+

Dynamic Marker created via a delay!

+ +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+ +

My marker will stay open when the window is popped up!

+
+
+
+ + + +
+

Mexi!

+

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+

My marker will stay open when the window is popped up!

+
+
+
+ + + + + +

This is an info window at {{ m.latitude | number:4 }}, {{ m.longitude | number:4 }}!

+

My marker will stay open when the window is popped up!

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Layers + + Traffic: + Bicycling: + Weather: + Heat: +
center +
+                         
+                        
+                        {{ map.center.latitude | number:4 }} lat
+                        
+   + {{ map.center.longitude | number:4 }} lng +
+
zoom{{ map.zoom }}
bounds +
+                        north-east: {{ map.bounds.northeast.latitude | number:4 }},{{ map.bounds.northeast.longitude | number:4 }}
+                        
+ south-west: {{ map.bounds.southwest.latitude | number:4 }},{{ map.bounds.southwest.longitude | number:4 }} +
+
dragging{{ map.dragging }}
Generate Random Markers +
Do Cluster?:
+
Cluster Options: +
+ {{cType}} + +
+
+
+ + +
+
rectangle + +
markers + +
markers2 + +
dynamicMarkers + +
clicked position +
+                             
+                            
+                            {{ map.clickedMarker.latitude | number:4 }} lat
+                            
+   + {{ map.clickedMarker.longitude | number:4 }} lng +
+ Click the map to see +
polylines + +
circles + +
polygons + +
+
+
+
+
+ + + + + + + + + - \ No newline at end of file + diff --git a/example/free-draw-polygons.html b/example/free-draw-polygons.html new file mode 100644 index 000000000..7eb44377f --- /dev/null +++ b/example/free-draw-polygons.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + Map + + + +
+ + + + + + + + +
    +
  • {{p.getPath()}}
  • +
+
+ + + \ No newline at end of file diff --git a/example/geojson.html b/example/geojson.html new file mode 100644 index 000000000..685a4ff3e --- /dev/null +++ b/example/geojson.html @@ -0,0 +1,443 @@ + + + + + angular-google-maps example page + + + + + + + + + + + + +
+
+
+

angular-google-maps example {{version}}

+
+ + + +
+
+
+ + + + + + + + + +
+ I should not be attached to a + marker. +

This is an info window at {{ map.infoWindow.coords.coordinates[1] | number:4 }}, {{ map.infoWindow.coords.coordinates[0] | number:4 }}!

+ CLICK ME +
+
+ + + + I'm a window with a custom class set via options.boxClass. I only work when googles infoBox plugin is included. + + + + + + + + + + + + + + +
+

This is an info window at {{ geometry.coordinates[1] | number:4 }}, {{ geometry.coordinates[0] | number:4 }}!

+ +

My marker will stay open when the window is popped up!

+
+
+
+ + + + +
+

Dynamic Marker created via a delay!

+ +

This is an info window at {{ geometry.coordinates[1] | number:4 }}, {{ geometry.coordinates[0] | number:4 }}!

+ +

My marker will stay open when the window is popped up!

+
+
+
+ + + +
+

Mexi!

+

This is an info window at {{ geometry.coordinates[1] | number:4 }}, {{ geometry.coordinates[0] | number:4 }}!

+

My marker will stay open when the window is popped up!

+
+
+
+ + + + + + +

This is an info window at {{ m.geometry.coordinates[1] | number:4 }}, {{ m.geometry.coordinates[0] | number:4 }}!

+

My marker will stay open when the window is popped up!

+
+
+ + + + This is my clicked marker! +

My marker will reappear when you close me.

+
+
+ + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Layers + + Traffic: + Bicycling: + Weather: + Heat: +
Generate Random Markers +
Do Cluster?:
+
Cluster Options: + +
Use Ugly Cluster Image?:
+
+
+ + +
+
markers + +
markers2 + +
dynamicMarkers + +
center +
+						 
+						
+						{{ map.center.coordinates[1] | number:4 }} lat
+						
+   + {{ map.center.coordinates[0] | number:4 }} lng +
+
zoom{{ map.zoom }}
bounds +
+                    	north-east: {{ map.bounds.northeast.latitude | number:4 }},{{ map.bounds.northeast.longitude | number:4 }} 
+                    	
+ south-west: {{ map.bounds.southwest.latitude | number:4 }},{{ map.bounds.southwest.longitude | number:4 }} +
+
dragging{{ map.dragging }}
clicked position +
+							 
+							
+							{{ map.clickedMarker.geometry.coordinates[1] | number:4 }} lat
+							
+   + {{ map.clickedMarker.geometry.coordinates[1] | number:4 }} lng +
+ Click the map to see +
polylines + +
circles + +
polygons + +
+
+
+
+
+ + + + + + + + + + + + diff --git a/example/hugedata.html b/example/hugedata.html new file mode 100644 index 000000000..8864f4fbe --- /dev/null +++ b/example/hugedata.html @@ -0,0 +1,31 @@ + + + + + angular-google-maps huge data demo + + + + + + + + + +
+
+
+

angular-google-maps huge data demo

+
+
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/example/issue-1009-promise-async.html b/example/issue-1009-promise-async.html new file mode 100644 index 000000000..9827e1f83 --- /dev/null +++ b/example/issue-1009-promise-async.html @@ -0,0 +1,50 @@ + + + + + + + + + + Promise Async Fixes Break Compat with 1.2.X angular + + + + +
+

issue 1009 promise async {{version}}

+
+
+
+ +
+
+ + +

Max number of results to show: 100
Num of items in results: {{searchResults.results.length}}

+
+
+ + + +
+
+
+ + + + + + + + + + diff --git a/example/issue-1021-spiderfier-rerender-icon-change.html b/example/issue-1021-spiderfier-rerender-icon-change.html new file mode 100644 index 000000000..47cdb8888 --- /dev/null +++ b/example/issue-1021-spiderfier-rerender-icon-change.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + +
+ +
+
+

M # {{infoBoxProperty.id}}

+
+
+ + + + + + + + + +
+ +
+

+ +

+
+ + + + + diff --git a/example/issue-1021-spiderfier-rerender.html b/example/issue-1021-spiderfier-rerender.html new file mode 100644 index 000000000..42965e8c3 --- /dev/null +++ b/example/issue-1021-spiderfier-rerender.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + +

Clusterer

+
+ + + + +
+
+

Locations shown: {{userMaxIndex}}

+
+ + diff --git a/example/issue-1027-markers-clustering-ngif.html b/example/issue-1027-markers-clustering-ngif.html new file mode 100644 index 000000000..7931ea6e1 --- /dev/null +++ b/example/issue-1027-markers-clustering-ngif.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + +
+ + + + + +
+ ShowMarkers: +

Max number of results to show: 100
Num of items in results: {{searchResults.results.length}}

+

doCluster:{{map.doCluster}}

+

actualZoom:{{map.actualZoom}}

+

zoom:{{map.zoom}}

+

showMarkers:{{map.showMarkers}}

+ +
+ + diff --git a/example/issue-1028-clusterer-rerender-type-attrs.html b/example/issue-1028-clusterer-rerender-type-attrs.html new file mode 100644 index 000000000..fd563c849 --- /dev/null +++ b/example/issue-1028-clusterer-rerender-type-attrs.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + +

Clusterer

+
+ + + + +
+
+

Locations shown: {{userMaxIndex}}

+
+ + diff --git a/example/issue-1028-clusterer-rerender.html b/example/issue-1028-clusterer-rerender.html new file mode 100644 index 000000000..52a409477 --- /dev/null +++ b/example/issue-1028-clusterer-rerender.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + +

Clusterer

+
+ + + + +
+
+

Locations shown: {{userMaxIndex}}

+
+ + diff --git a/example/issue-1059-polylines-visibility.html b/example/issue-1059-polylines-visibility.html new file mode 100644 index 000000000..98c40c1c2 --- /dev/null +++ b/example/issue-1059-polylines-visibility.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + diff --git a/example/issue-1068-circle-events-doubled.html b/example/issue-1068-circle-events-doubled.html new file mode 100644 index 000000000..7da1bcf65 --- /dev/null +++ b/example/issue-1068-circle-events-doubled.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + Map + + + +
+ + + + + + +
+ + + diff --git a/example/issue-1075-markers-icon-change.html b/example/issue-1075-markers-icon-change.html new file mode 100644 index 000000000..5d0f8c820 --- /dev/null +++ b/example/issue-1075-markers-icon-change.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + +
+ + + + + + + +
+ + diff --git a/example/issue-1075-plurals-updates-other-than-coords.html b/example/issue-1075-plurals-updates-other-than-coords.html new file mode 100644 index 000000000..e170f1a22 --- /dev/null +++ b/example/issue-1075-plurals-updates-other-than-coords.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + +
+ + diff --git a/example/issue-1114-map-distorted.html b/example/issue-1114-map-distorted.html new file mode 100644 index 000000000..be5f30591 --- /dev/null +++ b/example/issue-1114-map-distorted.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + Map + + + +
+
+ + + +
+ +
+ + + + diff --git a/example/issue-1129-cluster-events-trigger-lazy.html b/example/issue-1129-cluster-events-trigger-lazy.html new file mode 100644 index 000000000..b9e85d499 --- /dev/null +++ b/example/issue-1129-cluster-events-trigger-lazy.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + +
+ + + + +
+ + diff --git a/example/issue-1136-markers-cluster-linger.html b/example/issue-1136-markers-cluster-linger.html new file mode 100644 index 000000000..d78ba1bd8 --- /dev/null +++ b/example/issue-1136-markers-cluster-linger.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + +
+ + + + +
+
+
+

Max number of results to show: 100
Num of items in results: {{searchResults.results.length}}

+

doCluster:{{map.doCluster}}

+

actualZoom:{{map.actualZoom}}

+

zoom:{{map.zoom}}

+

showMarkers:{{map.showMarkers}}

+
+ + diff --git a/example/issue-1169-windows-update.html b/example/issue-1169-windows-update.html new file mode 100644 index 000000000..8992a9e7c --- /dev/null +++ b/example/issue-1169-windows-update.html @@ -0,0 +1,27 @@ + + + + + + + + + + + +
+ + + + +
+ {{miles}} +
+
+
+
+
+ + diff --git a/example/issue-1170-map-center.html b/example/issue-1170-map-center.html new file mode 100644 index 000000000..0b4e7870f --- /dev/null +++ b/example/issue-1170-map-center.html @@ -0,0 +1,24 @@ + + + + + + + + + + + +
+ + +
+ center: {{mapCtrl.map.center}} +
+
+ + + diff --git a/example/issue-1170-markers-fit.html b/example/issue-1170-markers-fit.html new file mode 100644 index 000000000..a6d667648 --- /dev/null +++ b/example/issue-1170-markers-fit.html @@ -0,0 +1,62 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ + + + +
+
+ + + + + + + + + + + + diff --git a/example/issue-1218-window-windows-open-close.html b/example/issue-1218-window-windows-open-close.html new file mode 100644 index 000000000..8b23e527c --- /dev/null +++ b/example/issue-1218-window-windows-open-close.html @@ -0,0 +1,103 @@ + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ + + + + +
+ Normal Standalone Window +
+ using show to open close the window state. +
+
+ + +
+ Normal Standalone Windows +
+ using show to open close the window state. +
+
+ + + + +
+ Normal Standalone Window (No show state) +
+
+
+ + + +
+ Windows Should Open via marker click. NO SHOW state. +
+
+
+ + + + + + + + +
+ Single Window popped into mem as needed. +
+ {{map.openedCanadaWindows.latitude}}, {{map.openedCanadaWindows.longitude}} +
+
+ +
+
+
+ + + + + + + + + diff --git a/example/issue-1377-circle-event-probs.html b/example/issue-1377-circle-event-probs.html new file mode 100644 index 000000000..a81eae931 --- /dev/null +++ b/example/issue-1377-circle-event-probs.html @@ -0,0 +1,200 @@ + + + + + + AngularJS Plunker + + + + + +
+ +
+
+

M # {{infoBoxProperty.id}}

+
+
+ + + + + + + +
+

{{msg}}

+
+

+ +

+
+ + + + + + + + diff --git a/example/issue-1436-polygons-fit.html b/example/issue-1436-polygons-fit.html new file mode 100644 index 000000000..a66af9a30 --- /dev/null +++ b/example/issue-1436-polygons-fit.html @@ -0,0 +1,82 @@ + + + + + AngularJS Plunker + + + + + + + + +
+ + + +
+ + + diff --git a/example/issue-147-ng-show-map-refresh.html b/example/issue-147-ng-show-map-refresh.html new file mode 100644 index 000000000..96ce0721c --- /dev/null +++ b/example/issue-147-ng-show-map-refresh.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/example/issue-1485-doRebuildAll.html b/example/issue-1485-doRebuildAll.html new file mode 100644 index 000000000..5493b2704 --- /dev/null +++ b/example/issue-1485-doRebuildAll.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + {{sites}} + + + + + + + + + diff --git a/example/issue-154-marker-fit.html b/example/issue-154-marker-fit.html new file mode 100644 index 000000000..86f03378e --- /dev/null +++ b/example/issue-154-marker-fit.html @@ -0,0 +1,82 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + +
+ hit me + +

This is an info window at {{ m.latitude | number:4 }}, {{ m.longitude | number:4 }}!

+ +

My marker will stay open when the window is popped up!

+
+
+
+ + + +
+
+
+ + + + + + + + + + + + diff --git a/example/issue-157-ng-click.html b/example/issue-157-ng-click.html new file mode 100644 index 000000000..db2f58aaf --- /dev/null +++ b/example/issue-157-ng-click.html @@ -0,0 +1,68 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + +
+ hit me +

This is an info window at {{ m.latitude | number:4 }}, {{ m.longitude | number:4 }}!

+

My marker will stay open when the window is popped up!

+
+
+
+
+
+
+ + + + + + + + + + + + diff --git a/example/issue-1674-searchbox-parentdiv.html b/example/issue-1674-searchbox-parentdiv.html new file mode 100644 index 000000000..421fbfd6b --- /dev/null +++ b/example/issue-1674-searchbox-parentdiv.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + diff --git a/example/issue-322.html b/example/issue-322.html new file mode 100644 index 000000000..e4ce426dc --- /dev/null +++ b/example/issue-322.html @@ -0,0 +1,78 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+ +

My marker will stay open when the window is popped up!

+
+
+ + + + +

Dynamic Marker created via a delay!

+ +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+ +

My marker will stay open when the window is popped up!

+
+
+
+
+
+ + + + + + + + + + + + diff --git a/example/issue-354-window-windows-rerender-content.html b/example/issue-354-window-windows-rerender-content.html new file mode 100644 index 000000000..f4f1b08a0 --- /dev/null +++ b/example/issue-354-window-windows-rerender-content.html @@ -0,0 +1,48 @@ + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ + + test = {{ test.name }} +
+
+ + + + + +
+

test = {{test.name}}

+
+
+
+
+
+ + + + + + + + + + + diff --git a/example/issue-371-polygon-ng-repeat.html b/example/issue-371-polygon-ng-repeat.html new file mode 100644 index 000000000..8f42ae95b --- /dev/null +++ b/example/issue-371-polygon-ng-repeat.html @@ -0,0 +1,64 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ + + + + + + +
+
+ + + + + + + + + + + + diff --git a/example/issue-382-window-windows-ng-show.html b/example/issue-382-window-windows-ng-show.html new file mode 100644 index 000000000..0c30dc4bc --- /dev/null +++ b/example/issue-382-window-windows-ng-show.html @@ -0,0 +1,70 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + + + + + +
+
+ + + + + + + + + + + + diff --git a/example/issue-393-cluster-events-mapped.html b/example/issue-393-cluster-events-mapped.html new file mode 100644 index 000000000..811972b10 --- /dev/null +++ b/example/issue-393-cluster-events-mapped.html @@ -0,0 +1,73 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + + +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+
+
+ + + +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+
+
+
+
+
+ + + + + + + + + + + + diff --git a/example/issue-432-markers-fit-clustering.html b/example/issue-432-markers-fit-clustering.html new file mode 100644 index 000000000..9152c4909 --- /dev/null +++ b/example/issue-432-markers-fit-clustering.html @@ -0,0 +1,73 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + + + + + + + + + +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+
+
+
+
+
+ + + + + + + + + + + + diff --git a/example/issue-482-markers-animation-clustering.html b/example/issue-482-markers-animation-clustering.html new file mode 100644 index 000000000..d49d9b54b --- /dev/null +++ b/example/issue-482-markers-animation-clustering.html @@ -0,0 +1,55 @@ + + + + + angular-google-maps example page + + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + + +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+
+
+
+
+
+ + + + + + + + + + + + diff --git a/example/issue-482-markers-animation.html b/example/issue-482-markers-animation.html new file mode 100644 index 000000000..cc0d89126 --- /dev/null +++ b/example/issue-482-markers-animation.html @@ -0,0 +1,54 @@ + + + + + angular-google-maps example page + + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + + +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+
+
+
+
+
+ + + + + + + + + + + + diff --git a/example/issue-484-markers-self.html b/example/issue-484-markers-self.html new file mode 100644 index 000000000..b77b41e4c --- /dev/null +++ b/example/issue-484-markers-self.html @@ -0,0 +1,66 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + + + + + + +
+
+ + + + + + + + + + + + diff --git a/example/issue-495-polyline-fit.html b/example/issue-495-polyline-fit.html new file mode 100644 index 000000000..c8015590a --- /dev/null +++ b/example/issue-495-polyline-fit.html @@ -0,0 +1,52 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ + + + +
+
+ + + + + + + + + + + diff --git a/example/issue-498-marker-move-loaded.html b/example/issue-498-marker-move-loaded.html new file mode 100644 index 000000000..1873b66b2 --- /dev/null +++ b/example/issue-498-marker-move-loaded.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + {{sites}} + + +
+ + + This is my clicked marker! +

My marker will reappear when you close me.

+
+
+
+
+ + + diff --git a/example/issue-504-markers-flash.html b/example/issue-504-markers-flash.html new file mode 100644 index 000000000..f9342b03a --- /dev/null +++ b/example/issue-504-markers-flash.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + {{sites}} + + + + + + + diff --git a/example/issue-507-windows-show-w-marker-broken.html b/example/issue-507-windows-show-w-marker-broken.html new file mode 100644 index 000000000..67d67effe --- /dev/null +++ b/example/issue-507-windows-show-w-marker-broken.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + +
+ + + +
{{title}}
+
+
+
+
+ + + + diff --git a/example/issue-522-polyline-no-paths.html b/example/issue-522-polyline-no-paths.html new file mode 100644 index 000000000..840542f1b --- /dev/null +++ b/example/issue-522-polyline-no-paths.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + Map + + + +
+ + + + + + + +
    +
  • +
    {{p.id}}
    +
    {{p.path}}
    +
  • +
+
+ + + \ No newline at end of file diff --git a/example/issue-534-markers-child-destroy.html b/example/issue-534-markers-child-destroy.html new file mode 100644 index 000000000..6b983b039 --- /dev/null +++ b/example/issue-534-markers-child-destroy.html @@ -0,0 +1,55 @@ + + + + + angular-google-maps example page + + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + + +
+

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+
+
+
+
+
+
+ + + + + + + + + + + diff --git a/example/issue-538-window-plus1.html b/example/issue-538-window-plus1.html new file mode 100644 index 000000000..f672275b3 --- /dev/null +++ b/example/issue-538-window-plus1.html @@ -0,0 +1,30 @@ + + + + + + + + + + + Map + + + + +
+ + + +
+ {{ number }} +
+
+
+
+
+{{number}} + + + \ No newline at end of file diff --git a/example/issue-545-marker-flash-clusterer.html b/example/issue-545-marker-flash-clusterer.html new file mode 100644 index 000000000..33a89aca0 --- /dev/null +++ b/example/issue-545-marker-flash-clusterer.html @@ -0,0 +1,32 @@ + + + + + + + + + + + Map + + + +
+ + + + +
+ + + \ No newline at end of file diff --git a/example/issue-545-marker-flash.html b/example/issue-545-marker-flash.html new file mode 100644 index 000000000..7dcea4bc4 --- /dev/null +++ b/example/issue-545-marker-flash.html @@ -0,0 +1,31 @@ + + + + + + + + + + + Map + + + +
+ + + + +
+ + + \ No newline at end of file diff --git a/example/issue-572-polylines-no-paths.html b/example/issue-572-polylines-no-paths.html new file mode 100644 index 000000000..73fda58e4 --- /dev/null +++ b/example/issue-572-polylines-no-paths.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + Map + + + +
+ + + + + + + + + + + +
    +
  • +
    {{p.id}}
    +
    {{p.path}}
    +
  • +
+
+ + + diff --git a/example/issue-621-owl-w-window.html b/example/issue-621-owl-w-window.html new file mode 100644 index 000000000..028cb4f09 --- /dev/null +++ b/example/issue-621-owl-w-window.html @@ -0,0 +1,46 @@ + + + + + + AngularJS Plunker + + + + + + + +
+

Mash the change markers button and you'll see that not all the markers are removed with the ng-if

+

It would be ideal to get access to the marker array outside of angular google maps to clear it completely

+

Attempts to use the control attribute on a markers tag have resulted in an empty collection inside the object

+ +
+ +
+ + +
+ {{ latitude | number:4 }}, {{ longitude | number:4 }} +
+
+
+
+
+ + +
1 + {{ latitude | number:4 }}, {{ longitude | number:4 }} +
+
+
+
+
+
+
+ + + + + diff --git a/example/issue-621-owl.html b/example/issue-621-owl.html new file mode 100644 index 000000000..83d2d8c74 --- /dev/null +++ b/example/issue-621-owl.html @@ -0,0 +1,37 @@ + + + + + + AngularJS Plunker + + + + + + + + +
+

Mash the change markers button and you'll see that not all the markers are removed with the ng-if

+

It would be ideal to get access to the marker array outside of angular google maps to clear it completely

+

Attempts to use the control attribute on a markers tag have resulted in an empty collection inside the object

+ +
+ +
+ + +
+
+ + +
+
+
+
+ + + + + diff --git a/example/issue-622-many-markers-destroy.html b/example/issue-622-many-markers-destroy.html new file mode 100644 index 000000000..baa9243f6 --- /dev/null +++ b/example/issue-622-many-markers-destroy.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + 622 + + + + + + + + + + + + + + + + + + diff --git a/example/issue-624-drawing-manager.html b/example/issue-624-drawing-manager.html new file mode 100644 index 000000000..13adae8e3 --- /dev/null +++ b/example/issue-624-drawing-manager.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + Map + + + +
+

3 different usage examples are included in this file; see source of this html file to uncomment/try the other 2

+
+ + + + +

Example 1: dynamic (watched) options and control

+ + + + + +
+ +
+
+ + + + diff --git a/example/issue-654-marker-events-break-after-added.html b/example/issue-654-marker-events-break-after-added.html new file mode 100644 index 000000000..376fe0ba9 --- /dev/null +++ b/example/issue-654-marker-events-break-after-added.html @@ -0,0 +1,38 @@ + + + + + + + + + + + Map + + + +
+ + + + + + + + + +
+ + + \ No newline at end of file diff --git a/example/issue-663-marker-events-once.html b/example/issue-663-marker-events-once.html new file mode 100644 index 000000000..9dae19d32 --- /dev/null +++ b/example/issue-663-marker-events-once.html @@ -0,0 +1,48 @@ + + + + + + + + + + + Map + + + +
+ + + +
+

This is an info window at {{ m.latitude | number:4 }}, {{ m.longitude | number:4 }}!

+
+
+
+
+ + + +
+

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/example/issue-686-window-options.html b/example/issue-686-window-options.html new file mode 100644 index 000000000..3cd52709b --- /dev/null +++ b/example/issue-686-window-options.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + Map + + + +
+
Window Options: {{windowoptions|json}}
+ + + + +
{{title}}
+
+
+
+ + + + diff --git a/example/issue-725-polyline-dupes.html b/example/issue-725-polyline-dupes.html new file mode 100644 index 000000000..2ed53701c --- /dev/null +++ b/example/issue-725-polyline-dupes.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + Map + + + +
+
+
+ + + + + + + +
+
+
+ + +
+
+
+
+ + + + diff --git a/example/issue-728-windows-angular-1_3.html b/example/issue-728-windows-angular-1_3.html new file mode 100644 index 000000000..cd72e9f5a --- /dev/null +++ b/example/issue-728-windows-angular-1_3.html @@ -0,0 +1,50 @@ + + + + + + AngularJS Plunker + + + + + + + + + +
+

Mash the change markers button and you'll see that not all the markers are removed with the ng-if

+

It would be ideal to get access to the marker array outside of angular google maps to clear it completely

+

Attempts to use the control attribute on a markers tag have resulted in an empty collection inside the object

+ +
+ +
+ + + +
+ {{ latitude | number:4 }}, {{ longitude | number:4 }} +
+
+
+
+
+ + + +
+ {{ latitude | number:4 }}, {{ longitude | number:4 }} +
+
+
+
+
+
+
+ + + + + diff --git a/example/issue-74-markers-events.html b/example/issue-74-markers-events.html new file mode 100644 index 000000000..c265528aa --- /dev/null +++ b/example/issue-74-markers-events.html @@ -0,0 +1,67 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+
+ + + + + + +

This is an info window at {{ latitude | number:4 }}, {{ longitude | number:4 }}!

+
+
+
+
+
+ + + + + + + + + + + + diff --git a/example/issue-751-783-marker-coords-undefined-dragg.html b/example/issue-751-783-marker-coords-undefined-dragg.html new file mode 100644 index 000000000..767ef29fa --- /dev/null +++ b/example/issue-751-783-marker-coords-undefined-dragg.html @@ -0,0 +1,42 @@ + + + + + + + + + + + + + Map + + + +
+ + + + + +
+
+ id: {{id}}, lat: {{coords.latitude}}, lon: {{coords.latitude}} +
+
+
+
+
+
+
    +
  • coords update ctr: {{coordsUpdates}}
  • +
  • dynamic move ctr: {{dynamicMoveCtr}}
  • +
+ +
+
+ + + + diff --git a/example/issue-753-marker-not-watched.html b/example/issue-753-marker-not-watched.html new file mode 100644 index 000000000..06e83ad41 --- /dev/null +++ b/example/issue-753-marker-not-watched.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + +
+

{{map.title}}

+ + + + + +
+ {{marker.coords}} +
+
+
+ + + +
+
+ + diff --git a/example/issue-755-ng-router.html b/example/issue-755-ng-router.html new file mode 100644 index 000000000..88f6226b8 --- /dev/null +++ b/example/issue-755-ng-router.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + +
+
+
+ + diff --git a/example/issue-772-info-window-show-state.html b/example/issue-772-info-window-show-state.html new file mode 100644 index 000000000..d191446f7 --- /dev/null +++ b/example/issue-772-info-window-show-state.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + + +
+ + + + + +
{{text}}
+
+ +
+ +
+ markers shown: {{shownMarkers()}} +
+ markers:{{randomMarkers}} +
+ + diff --git a/example/issue-798-markerclusterer-perf.html b/example/issue-798-markerclusterer-perf.html new file mode 100644 index 000000000..5ecd087da --- /dev/null +++ b/example/issue-798-markerclusterer-perf.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + +
+ + + + + +

Max number of results to show: 1000
Num of items in results: {{searchResults.results.length}}

+ +
{{searchResults.results | json}}
+
+ + diff --git a/example/issue-816-multiple-maps-marker.html b/example/issue-816-multiple-maps-marker.html new file mode 100644 index 000000000..db808c4fe --- /dev/null +++ b/example/issue-816-multiple-maps-marker.html @@ -0,0 +1,32 @@ + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ + + + +
+ + + diff --git a/example/issue-904-markers-race.html b/example/issue-904-markers-race.html new file mode 100644 index 000000000..e3f68e05a --- /dev/null +++ b/example/issue-904-markers-race.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + +
+ + + + + + +

Max number of results to show: 100
Num of items in results: {{searchResults.results.length}}

+

doCluster:{{map.doCluster}}

+

zoom:{{map.zoom}}

+
{{searchResults.results | json}}
+
+ + diff --git a/example/issue-930-polygons-updates.html b/example/issue-930-polygons-updates.html new file mode 100644 index 000000000..984b940a1 --- /dev/null +++ b/example/issue-930-polygons-updates.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + Map + + + +
+ + + + + + + + + +
+

{{map.bounds}}

+ +
Polyline {{p.id}} + + + + + + + + + + + + + +
StaticEditabledraggablePath
+ + + + + + + + + + + + + + + +
LatitudeLongitude
+ + + +
+
+ static: {{p.static}} + editable: {{p.editable}} + draggable: {{p.draggable}} + path: {{p.path}} +
+
+
+ + + + + diff --git a/example/issue-930-polylines-updates.html b/example/issue-930-polylines-updates.html new file mode 100644 index 000000000..734d489b9 --- /dev/null +++ b/example/issue-930-polylines-updates.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + Map + + + +
+ + + + + + + + + +
+

{{map.bounds}}

+ +
Polyline {{p.id}} + + + + + + + + + + + + + +
StaticEditabledraggablePath
+ + + + + + + + + + + + + + + +
LatitudeLongitude
+ + + +
+
+ static: {{p.static}} + editable: {{p.editable}} + draggable: {{p.draggable}} + path: {{p.path}} +
+
+
+ + + + + diff --git a/example/issue-946-markers-update.html b/example/issue-946-markers-update.html new file mode 100644 index 000000000..521cacbdf --- /dev/null +++ b/example/issue-946-markers-update.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + Map + + + +
+ + + + + +
+ + + diff --git a/example/issue-975-markerwlabel-customcoords.html b/example/issue-975-markerwlabel-customcoords.html new file mode 100644 index 000000000..db4d65958 --- /dev/null +++ b/example/issue-975-markerwlabel-customcoords.html @@ -0,0 +1,52 @@ + + + + + + + + + + + +
+
+ markersLabelOK: {{markersLabelOK}} + markersOK: {{markersOK}} +
+
+
+ markersLabelNotOK: {{markersLabelNotOK}} +
+ + + + + + + + + + + + +
+ + diff --git a/example/issue-978-window-not-open-not-transcluded-marker.html b/example/issue-978-window-not-open-not-transcluded-marker.html new file mode 100644 index 000000000..f3605c087 --- /dev/null +++ b/example/issue-978-window-not-open-not-transcluded-marker.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + Map + + + +
+ + + + + + {{map.windowModel}} + + + +
+{{map.windowModel}} + + + \ No newline at end of file diff --git a/example/issue-979-polygons-race.html b/example/issue-979-polygons-race.html new file mode 100644 index 000000000..1e0ebe206 --- /dev/null +++ b/example/issue-979-polygons-race.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + Map + + + +
+ + + + + + + + + + + + + + + + + +
+ # of polygons: {{map.polys.length}} + zoom: {{map.zoom}} +
+
+ + + diff --git a/example/issue-979-polylines-race.html b/example/issue-979-polylines-race.html new file mode 100644 index 000000000..aff66bae7 --- /dev/null +++ b/example/issue-979-polylines-race.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + Map + + + +
+ + + + + + + + + + + + + + + + + +
+ # of polygons: {{map.polys.length}} + zoom: {{map.zoom}} +
+
+ + + diff --git a/example/issue-992-marker-disappear.html b/example/issue-992-marker-disappear.html new file mode 100644 index 000000000..f62e4cbfc --- /dev/null +++ b/example/issue-992-marker-disappear.html @@ -0,0 +1,60 @@ + + + + + + AngularJS Plunker + + + + + + + + + + +
+ + + + + +
+
    +
  • coords update ctr: {{coordsUpdates}}
  • +
  • dynamic move ctr: {{dynamicMoveCtr}}
  • +
+
+
+ + + + diff --git a/example/issue_1466_map_flicker.html b/example/issue_1466_map_flicker.html new file mode 100644 index 000000000..dcc181501 --- /dev/null +++ b/example/issue_1466_map_flicker.html @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
{{ group.$key | date: 'EEEE, MMMM d, yyyy' }}
+
+ +
+
+
{{ data.checkin_time | date:'shortTime' }}
+
+
+
+
+
View Map
+
+
+
+
+
+
+ + + + + + + + diff --git a/example/issue_1542_cartodb.html b/example/issue_1542_cartodb.html new file mode 100644 index 000000000..c8f8698fc --- /dev/null +++ b/example/issue_1542_cartodb.html @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + +
+ + + +
+ + + + + diff --git a/example/issue_1574_marker_dupes.html b/example/issue_1574_marker_dupes.html new file mode 100644 index 000000000..c53df6137 --- /dev/null +++ b/example/issue_1574_marker_dupes.html @@ -0,0 +1,481 @@ + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + diff --git a/example/many-polygons.html b/example/many-polygons.html new file mode 100644 index 000000000..55a55c19e --- /dev/null +++ b/example/many-polygons.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + Map + + + +
+ + + + + + + + + + + + + + + + + +
+ # of polygons: {{map.polys.length}} +
+
+ + + diff --git a/example/many-polylines.html b/example/many-polylines.html new file mode 100644 index 000000000..83df70334 --- /dev/null +++ b/example/many-polylines.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + Map + + + +
+ + + + + + + + + + + + +
    +
  • +
    {{p.id}}
    +
    {{p.path}}
    +
  • +
+
+ + + diff --git a/example/marker-anchor.html b/example/marker-anchor.html new file mode 100644 index 000000000..2400b5e0d --- /dev/null +++ b/example/marker-anchor.html @@ -0,0 +1,24 @@ + + + + + + + + + + + Map + + + + +
+ + + +
+{{number}} + + + \ No newline at end of file diff --git a/example/markers-models-objects.html b/example/markers-models-objects.html new file mode 100644 index 000000000..a865c1da1 --- /dev/null +++ b/example/markers-models-objects.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + +
+ + + + + + +

Max number of results to show: 100
Num of items in results: {{searchResults.results.length}}

+

doCluster:{{map.doCluster}}

+

zoom:{{map.zoom}}

+
{{searchResults.results | json}}
+
+ + diff --git a/example/overlay-map-type.html b/example/overlay-map-type.html new file mode 100644 index 000000000..c9951c355 --- /dev/null +++ b/example/overlay-map-type.html @@ -0,0 +1,378 @@ + + + + + map-type examples for angular-google-maps + + + + + + + + + + + +
+
+

map-type directive for angular-google-maps {{version}}

+ +

As seen on + Google Maps Javascript API v3 Map Types documentation.

+
+

Directive usage

+ +
+
+

map-type

+
+
+

Usage

+ +

The map-type directive is used to add custom map types, as overlays or single layers.

+
+<ui-gmap-map-type
+    options='{expression}'
+    id="'{string}'"
+    show='{expression}'
+    refresh='{expression}'>
+</ui-gmap-map-type>
+                
+

Parameters

+ +

Required properties are in red.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParamTypeDetails
optionsexpressionMap type options, including in particular getTile or getTileUrl methods. + For complete list of options see Google Maps API documentation. +
idstringMap type id, to be used in the controler to display the maptype as a single layer.
showexpressionScope variable used to show the maptype as an overlay. Defaults to true, unless id + has been defined +
refreshexpressionVariable or expression to watch, which will trigger a maptype refresh when changing.
+ Useful in the case where the getTileUrl is dynamically defined (for example using + filters, options…), and you want to apply changes immediately. +
+
+ +
+ +

Examples

+ + +
+
+

+ The most simple way to overlay a custom map type is just to define the map type options in the controller + and then add the directive in the google-map widget. +

+ +

In this example a map type displaying black squares is overlayed on the map. This can be hidden changing the + showOverlay value in the scope, as seen in Overlay map types API example.

+ + + + Toggle overlay +
+
+

Javascript

+
+// Define map type options
+$scope.squaresMapType = {
+    getTile: function(coord, zoom, ownerDocument) {
+        var div = ownerDocument.createElement('div');
+        div.innerHTML = coord;
+        div.style.width = this.tileSize.width + 'px';
+        div.style.height = this.tileSize.height + 'px';
+        div.style.fontSize = '10';
+        div.style.borderStyle = 'solid';
+        div.style.borderWidth = '1px';
+        div.style.borderColor = '#AAAAAA';
+        return div;
+    },
+    tileSize: new google.maps.Size(256, 256),
+    name: 'Black Squares',
+    maxZoom: 19,
+};
+
+// Define map options
+$scope.map1 = {
+    center: {
+        latitude: 41.850033,
+        longitude: -87.6500523
+    },
+    showOverlay: true,
+    zoom: 10,
+};
+
+

HTML

+
+<ui-gmap-google-map center="map1.center" zoom="map1.zoom">
+    <ui-gmap-map-type options="squaresMapType" show="map1.showOverlay"></ui-gmap-map-type>
+</ui-gmap-google-map>
+<a ng-click="map1.showOverlay = !map1.showOverlay">Toggle overlay</a>
+
+
+
+ + +
+
+

+ You can overlay an Image map type pretty much the same way, just by defining the method + getTileUrl in its options. MapTypes are handled internally and you don't need to care about + creating a custom type or using Google API ones. +

+ +

This example overlays Moscone Center pictures over the map, as seen in Overlaying an image map type API example.

+ + + + +
+
+

Javascript

+
+// Define map type options
+$scope.mosconeCenterMapType = {
+    getTileUrl: function(coord, zoom) {
+        var bounds = {
+            17: [[20969, 20970], [50657, 50658]],
+            18: [[41939, 41940], [101315, 101317]],
+            19: [[83878, 83881], [202631, 202634]],
+            20: [[167757, 167763], [405263, 405269]]
+        };
+
+        if (zoom < 17 || zoom > 20 ||
+            bounds[zoom][0][0] > coord.x || coord.x > bounds[zoom][0][1] ||
+            bounds[zoom][1][0] > coord.y || coord.y > bounds[zoom][1][1]) {
+            return null;
+        }
+
+        return [
+            'http://www.gstatic.com/io2010maps/tiles/5/L2_', zoom, '_',
+            coord.x, '_', coord.y, '.png'
+        ].join('');
+    },
+    tileSize: new google.maps.Size(256, 256)
+};
+
+// Define map options
+$scope.map2 = {
+    center: {
+        latitude: 37.78313383212,
+        longitude: -122.4039494991302
+    },
+    zoom: 18,
+    options: {
+        minZoom: 17,
+        maxZoom: 20
+    }
+};
+
+

HTML

+
+<ui-gmap-google-map center="map2.center" zoom="map2.zoom" options="map2.options">
+    <ui-gmap-map-type options="mosconeCenterMapType"></ui-gmap-map-type>
+</ui-gmap-google-map>
+
+
+
+ + +
+
+

You can alternatively give the directive an id attribute, so the map type can be used as a + single layer like the ROAD, SATELLITE or other basic map types.

+
    +
  • show attribute is not used for single-layer map types, you need to use controls or + explicitely set the map type you want in the javascript code. +
  • +
  • Additionnaly, you need to specify maxZoom parameter in the maptype options when using the + maptype as a single layer. +
  • +
+

This example displays a map of the moon instead of the earth, as seen on Image map types API example.

+ + + +
+
+

Javascript

+
+// Define map type options.
+$scope.moonMapType = {
+    getTileUrl: function(coord, zoom) {
+        var normalizedCoord = getNormalizedCoord(coord, zoom);
+        if (!normalizedCoord) {
+            return null;
+        }
+        var bound = Math.pow(2, zoom);
+        return 'http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw' +
+            '/' + zoom + '/' + normalizedCoord.x + '/' +
+            (bound - normalizedCoord.y - 1) + '.jpg';
+    },
+    tileSize: new google.maps.Size(256, 256),
+    maxZoom: 9, // This attribute is mandatory
+    minZoom: 0,
+    radius: 1738000,
+    name: 'Moon'
+};
+
+// Define map options
+$scope.map3 = {
+    center: {
+        latitude: 0,
+        longitude: 0
+    },
+    zoom: 1,
+    options: {
+        mapTypeId: 'moon',
+        mapTypeControlOptions: {
+            mapTypeIds: ['moon']
+        }
+    }
+};
+
+

HTML

+
+<ui-gmap-google-map center="map3.center" zoom="map3.zoom" options="map3.options">
+    <ui-gmap-map-type id="moon" options="moonMapType"></ui-gmap-map-type>
+</ui-gmap-google-map>
+
+
+
+ + + +
+
+

With several map-type directives you can mix custom overlays and single layers, using + id and show parameters. This is even possible to render the maptype in both ways, + despite you may not want do this.

+ +

This example features the previously defined "moon" image map type, and "squares" map type. + One is visible using the controls, the other is overlayed on the map (and can be toggled on/off using show). +

+ + + + +
+
+

Javascript

+
+// Previously defined map types are reused
+
+// Define map options
+$scope.map4 = {
+    center: {
+        latitude: 0,
+        longitude: 0
+    },
+    zoom: 3,
+    options: {
+        mapTypeControlOptions: {
+            mapTypeIds: ['moon', google.maps.MapTypeId.ROADMAP]
+        }
+    }
+};
+
+

HTML

+
+<ui-gmap-google-map center="map4.center" zoom="map4.zoom" options="map4.options">
+    <ui-gmap-map-type id="moon" options="moonMapType"></ui-gmap-map-type>
+    <ui-gmap-map-type options="squaresMapType"></ui-gmap-map-type>
+</ui-gmap-google-map>
+
+
+
+ +
+ + + + + + + + + + + + diff --git a/example/search-box-autocomplete.html b/example/search-box-autocomplete.html new file mode 100644 index 000000000..c1e0f8284 --- /dev/null +++ b/example/search-box-autocomplete.html @@ -0,0 +1,57 @@ + + + + + + + + + + + Places search box + + + +
+
Implements ui-gmap-search-box as google.maps.places.Autocomplete. Restricted to cities in France.
+
+
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + \ No newline at end of file diff --git a/example/search-box-ngmodel.html b/example/search-box-ngmodel.html new file mode 100644 index 000000000..c9304c2c7 --- /dev/null +++ b/example/search-box-ngmodel.html @@ -0,0 +1,56 @@ + + + + + + + + + + Places search box + + + +
+
+
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + \ No newline at end of file diff --git a/example/search-box.html b/example/search-box.html new file mode 100644 index 000000000..7c1c1081d --- /dev/null +++ b/example/search-box.html @@ -0,0 +1,57 @@ + + + + + + + + + + Places search box + + + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + \ No newline at end of file diff --git a/example/shapes-lines.html b/example/shapes-lines.html new file mode 100644 index 000000000..08155a761 --- /dev/null +++ b/example/shapes-lines.html @@ -0,0 +1,266 @@ + + + + + angular-google-maps example page + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/street-view-panorama.html b/example/street-view-panorama.html new file mode 100644 index 000000000..ab0c8770c --- /dev/null +++ b/example/street-view-panorama.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + Map + + + +
+ + + + + + + + + + + +
+ + + diff --git a/example/two-maps.html b/example/two-maps.html new file mode 100644 index 000000000..3ed4b95ab --- /dev/null +++ b/example/two-maps.html @@ -0,0 +1,95 @@ + + + + + angular-google-maps example page + + + + + + + + + + + +
+

angular-google-maps example {{version}}

+
+
+
+ +
+ +
+
+ + + +

Marker , MAP 1 Clicked on me2!

+
+
+
+ + + + + +

Marker 2Clicked on me2!

+
+
+ + +

+ Latitude: {{m.coords.latitude}}
+ Longitude: {{m.coords.longitude}}
+ Last signal: {{m.lastSignal}} +

+
+
+
+
+
+ + + + + + + + + + + + + + diff --git a/grunt/bower.coffee b/grunt/bower.coffee new file mode 100644 index 000000000..6efa0eac8 --- /dev/null +++ b/grunt/bower.coffee @@ -0,0 +1,11 @@ +exec = require('child_process').exec + +module.exports = (grunt) -> + grunt.registerTask 'bower', 'Install bower if bower_components is missing.', -> + cb = this.async() + # return if fs.existsSync('bower_components') + exec 'bower install', (error, stdout, stderr) -> + console.error error if error + console.error stderr if stdout + console.log stdout if stderr + cb() diff --git a/grunt/coffeelint.coffee b/grunt/coffeelint.coffee new file mode 100644 index 000000000..0bc4f6b10 --- /dev/null +++ b/grunt/coffeelint.coffee @@ -0,0 +1,25 @@ +{spawn} = require('child_process') +globby = require 'globby' + + +lint = ({src, doThrow}, cb) -> + doThrow ?= true + + args = globby.sync(src) + args.push('-q') #show errors only + + #note this is dependent on cofeelint being in the path, see: ./options.coffee + stream = spawn('coffeelint', args, {stdio: 'inherit'}) #note since using in inherit there is no .pipe (due to inherit) + + if !cb + return stream + + stream.on 'error', (error) -> + if doThrow + cb(error) + stream.once 'close', cb + stream.once 'end', cb + + return + +module.exports = lint diff --git a/grunt/options.coffee b/grunt/options.coffee new file mode 100644 index 000000000..68c418673 --- /dev/null +++ b/grunt/options.coffee @@ -0,0 +1,27 @@ +_ = require 'lodash' +_pkg = require './pkg' +requireDirectory = require 'require-directory' +allOptions = requireDirectory module, './options/' + +#BEGIN append ./node_modules to our path for this process +#shamelessly copied from gulp-shell +#https://github.com/sun-zheng-an/gulp-shell/blob/825a24c214ce91027d535ca767df2cfe8745f1a3/index.js#L33-L36 +path = require 'path' +pathToBin = path.join(process.cwd(), 'node_modules', '.bin') +pathName = if /^win/.test(process.platform) then 'Path' else 'PATH' +newPath = pathToBin + path.delimiter + process.env[pathName] +_.extend(process.env, _.fromPairs([[pathName, newPath]])) +#END adding node_modules to path + +module.exports = (grunt) -> + options = + pkg: _pkg + pkgFn: -> + grunt.file.readJSON("package.json") #always get latest! + + # coffeelint: disable=check_scope + for key, val of allOptions + # coffeelint: enable=check_scope + _.extend options, val + + options diff --git a/grunt/options/angularArchitectureGraph.coffee b/grunt/options/angularArchitectureGraph.coffee new file mode 100644 index 000000000..fd04159bd --- /dev/null +++ b/grunt/options/angularArchitectureGraph.coffee @@ -0,0 +1,5 @@ +module.exports = + angular_architecture_graph: + diagram: + files: + "dist/architecture": ["dist/angular-google-maps.js"] diff --git a/grunt/options/bump.coffee b/grunt/options/bump.coffee new file mode 100644 index 000000000..0d9a7f76f --- /dev/null +++ b/grunt/options/bump.coffee @@ -0,0 +1,16 @@ +module.exports = + bump: + options: + files: ['package.json', 'bower.json'] + updateConfigs: [] + commit: true + commitMessage: "Release %VERSION%" + commitFiles: ['package.json', 'bower.json', 'CHANGELOG.md', + 'Gruntfile.coffee', 'dist/angular-google-maps*','dist/architecture/*'] + createTag: true + tagName: "%VERSION%" + tagMessage: "Version %VERSION%" + push: false + pushTo: "origin" + gitDescribeOptions: "--tags --always --abbrev=1 --dirty=-d" + prereleaseName: 'X' diff --git a/grunt/options/changelog.coffee b/grunt/options/changelog.coffee new file mode 100644 index 000000000..6785dd58f --- /dev/null +++ b/grunt/options/changelog.coffee @@ -0,0 +1,6 @@ +_pkg = require '../pkg' + +module.exports = + changelog: + options: + version: _pkg.nextVersion diff --git a/grunt/options/clean.coffee b/grunt/options/clean.coffee new file mode 100644 index 000000000..1b5865585 --- /dev/null +++ b/grunt/options/clean.coffee @@ -0,0 +1,7 @@ +module.exports = + clean: + coffee: ["tmp/output_coffee.js", "tmp"] + dist: ["dist/*", "tmp"] + example: ["example/<%= pkg.name %>.js"] + spec: ["_Spec*"] + streetview: ["dist/*street-view*"] diff --git a/grunt/options/coffee.coffee b/grunt/options/coffee.coffee new file mode 100644 index 000000000..698551005 --- /dev/null +++ b/grunt/options/coffee.coffee @@ -0,0 +1,10 @@ +{pipeline} = require '../pipeline' + +module.exports = + coffee: + compile: + expand: true, + flatten: false, + src: pipeline.map (f) -> f + '.coffee' + dest: 'tmp/' + ext: '.js' diff --git a/grunt/options/concat.coffee b/grunt/options/concat.coffee new file mode 100644 index 000000000..0d51f2177 --- /dev/null +++ b/grunt/options/concat.coffee @@ -0,0 +1,58 @@ +_ = require 'lodash' +{fullPipeline} = require '../pipeline' + +# configs for concat main distribution & dev mapping +concatDist = + options: + banner: """ + /*! <%= pkg.name %> <%= pkgFn().version %> <%= grunt.template.today(\"yyyy-mm-dd\") %> + * <%= pkg.description %> + * <%= pkg.repository.type %>: <%= pkg.repository.url %> + */ + ; + (function( window, angular, _, undefined ){ + 'use strict'; + """ + separator: ";" + footer: "}( window, angular, _));" + src: fullPipeline + dest: "dist/<%= pkg.name %>.js" + +concatDistMapped = _.cloneDeep concatDist +concatDistMapped.options.sourceMap = true +concatDistMapped.options.sourceMap = "dist/<%= pkg.name %>_dev_mapped.js.map" +concatDistMapped.dest = "dist/<%= pkg.name %>_dev_mapped.js" + +# configs for concat street view directive & dev mapping +concatStreetView = _.cloneDeep concatDist +concatStreetView.src = [ + "src/coffee/module" + "wrapped_uuid" + "src/coffee/providers/map-loader" + "src/coffee/directives/api/utils/logger" + "src/coffee/directives/api/utils/gmap-util" + "src/coffee/directives/api/utils/events-helper" + "src/coffee/directives/street-view-panorama" +].map( (f) -> "tmp/#{f}.js" ) +concatStreetView.dest = "dist/<%= pkg.name %>-street-view.js" +concatStreetViewMapped = _.cloneDeep concatStreetView +concatStreetViewMapped.options.sourceMap = true +concatStreetViewMapped.options.sourceMapName = "dist/<%= pkg.name %>-street-view_dev_mapped.js.map" +concatStreetViewMapped.dest = "dist/<%= pkg.name %>-street-view_dev_mapped.js" + +module.exports = + concat: + dist: concatDist + distMapped: concatDistMapped + libs: + # NOTE: need to figure out how to make these optional in the examples so they are not bundled + src: [ + 'node_modules/markerclustererplus/dist/markerclusterer.min.js' + 'node_modules/google-maps-utility-library-v3-infobox/dist/infobox.js' + 'node_modules/google-maps-utility-library-v3-keydragzoom/dist/keydragzoom.js' + 'node_modules/google-maps-utility-library-v3-markerwithlabel/dist/markerwithlabel.js' + 'bower_components/js-rich-marker/src/richmarker.js' + ] + dest: "tmp/gmaps_sdk_util_v3.js" + streetview: concatStreetView + streetviewMapped: concatStreetViewMapped diff --git a/grunt/options/connect.coffee b/grunt/options/connect.coffee new file mode 100644 index 000000000..59c3deede --- /dev/null +++ b/grunt/options/connect.coffee @@ -0,0 +1,13 @@ +module.exports = + connect: + server: + options: + hostname: "0.0.0.0" + port: 3100 + base: "" + + coverage: + options: + hostname: "0.0.0.0" + port: 8069 + base: "" diff --git a/grunt/options/copy.coffee b/grunt/options/copy.coffee new file mode 100644 index 000000000..f4f350e86 --- /dev/null +++ b/grunt/options/copy.coffee @@ -0,0 +1,13 @@ +module.exports = + copy: + dist: + files: [ + ] + # libraries that are not versioned well, not really on bower, not on a cdn yet + poorly_managed_dev__dep_bower_libs: + files: [ + src: [ + "bower_components/bootstrap-without-jquery/bootstrap3/bootstrap-without-jquery.js" + ] + dest: "website_libs/dev_deps.js" + ] diff --git a/grunt/options/jshint.coffee b/grunt/options/jshint.coffee new file mode 100644 index 000000000..dda9a90e5 --- /dev/null +++ b/grunt/options/jshint.coffee @@ -0,0 +1,12 @@ +module.exports = + jshint: + all: [ + "Gruntfile.js" + "temp/spec/js/*.js" + "temp/spec/js/**/*.js" + "temp/spec/js/**/**/*.js", + "src/js/**/*.js" + "src/js/**/**/*.js" + "src/js/**/**/**/*.js" + "!src/js/wrapped/*.js" + ] diff --git a/grunt/options/mkdir.coffee b/grunt/options/mkdir.coffee new file mode 100644 index 000000000..0a1ba5356 --- /dev/null +++ b/grunt/options/mkdir.coffee @@ -0,0 +1,6 @@ +module.exports = + mkdir: + all: + options: + mode: 0o0700 + create: ["tmp"] diff --git a/grunt/options/ngAnnotate.coffee b/grunt/options/ngAnnotate.coffee new file mode 100644 index 000000000..b34f6cc1c --- /dev/null +++ b/grunt/options/ngAnnotate.coffee @@ -0,0 +1,11 @@ +{pipeline} = require '../pipeline' + +module.exports = + ngAnnotate: + options: + singleQuotes: true + app: + files: [ + expand: true + src: pipeline.map (f) -> "tmp/#{f}.js" + ] diff --git a/grunt/options/open.coffee b/grunt/options/open.coffee new file mode 100644 index 000000000..931623a10 --- /dev/null +++ b/grunt/options/open.coffee @@ -0,0 +1,8 @@ +module.exports = + open: + #examples replaced by lookup via allExamplesOpen see below + version: + path: "http://localhost:3100/package.json" + + coverage: + path: "http://localhost:8069/dist/coverage/dist/index.html" diff --git a/grunt/options/replace.coffee b/grunt/options/replace.coffee new file mode 100644 index 000000000..7aa57d5ae --- /dev/null +++ b/grunt/options/replace.coffee @@ -0,0 +1,25 @@ +module.exports = + replace: + utils: + options: + patterns: [ + match: 'REPLACE_W_LIBS', replacement: '<%= grunt.file.read("tmp/gmaps_sdk_util_v3.js") %>' + ] + src: 'src/js/wrapped/google-maps-util-v3.js' + dest: 'tmp/wrapped_gmaps_sdk_util_v3.js' + uuid: + options: + patterns: [ + match: 'REPLACE_W_LIBS', + replacement: '<%= grunt.file.read("bower_components/uuid/dist/uuid.core.js") %>' + ] + src: 'src/js/wrapped/uuid.core.js' + dest: 'tmp/wrapped_uuid.js' + markerSpiderfier: + options: + patterns: [ + match: 'REPLACE_W_LIBS', + replacement: '<%= grunt.file.read("bower_components/OverlappingMarkerSpiderfier/dist/oms.js") %>' + ] + src: 'src/js/wrapped/marker_spiderfier.js' + dest: 'tmp/wrapped_marker_spiderfier.js' diff --git a/grunt/options/uglify.coffee b/grunt/options/uglify.coffee new file mode 100644 index 000000000..0d9739673 --- /dev/null +++ b/grunt/options/uglify.coffee @@ -0,0 +1,32 @@ +_ = require 'lodash' +# configs for uglify main distribution & dev mapping +uglifyDist= + options: + banner: "/*! <%= pkg.name %> <%= pkgFn().version %> <%= grunt.template.today(\"yyyy-mm-dd\") %>\n * <%= pkg.description %>\n * <%= pkg.repository.type %>: <%= pkg.repository.url %>\n */\n" + compress: true + report: "gzip" + src: "dist/<%= pkg.name %>.js" + dest: "dist/<%= pkg.name %>.min.js" + +uglifyDistMapped = _.clone uglifyDist, true +uglifyDistMapped.options.sourceMap = true +uglifyDistMapped.options.sourceMap = "dist/<%= pkg.name %>_dev_mapped.min.js.map" +uglifyDistMapped.src = "dist/<%= pkg.name %>_dev_mapped.js" +uglifyDistMapped.dest = "dist/<%= pkg.name %>_dev_mapped.min.js" + +# configs for uglify street view directive & dev mapping +uglifyStreetView = _.clone uglifyDist, true +uglifyStreetView.src = "dist/<%= pkg.name %>-street-view.js" +uglifyStreetView.dest = "dist/<%= pkg.name %>-street-view.min.js" +uglifyStreetViewMapped = _.clone uglifyStreetView, true +uglifyStreetViewMapped.options.sourceMap = true +uglifyStreetViewMapped.options.sourceMapName = "dist/<%= pkg.name %>-street-view_dev_mapped.min.js.map" +uglifyStreetViewMapped.src = "dist/<%= pkg.name %>-street-view_dev_mapped.js" +uglifyStreetViewMapped.dest = "dist/<%= pkg.name %>-street-view_dev_mapped.min.js" + +module.exports = + uglify: + dist: uglifyDist + distMapped: uglifyDistMapped + streetview: uglifyStreetView + streetviewMapped: uglifyStreetViewMapped diff --git a/grunt/options/verbosity.coffee b/grunt/options/verbosity.coffee new file mode 100644 index 000000000..76e48ee8d --- /dev/null +++ b/grunt/options/verbosity.coffee @@ -0,0 +1,9 @@ +module.exports = + verbosity: + quiet: + options: mode: 'normal' + tasks: [ + 'coffee', 'clean', 'clean:dist', 'copy', 'concat', + 'mkdir:all', 'jshint', 'uglify', + 'replace', 'concat:dist', 'concat:libs' + ] diff --git a/grunt/options/watch.coffee b/grunt/options/watch.coffee new file mode 100644 index 000000000..228ae4d8e --- /dev/null +++ b/grunt/options/watch.coffee @@ -0,0 +1,52 @@ +_ = require 'lodash' + +coffeelint = {} +for n in ['grunt', 'src', 'spec'] + coffeelint[n] = + options: livereload: true + files: [ + "#{n}/**/*.coffee" + ] + tasks: ["coffeelint:#{n}"] + + +coffeelint.grunt.files.push '*.coffee' + +coffeelintWatches = _.mapKeys coffeelint, (v, k) -> + "coffeelint-#{k}" + + +module.exports = { + coffeelint + watch: _.extend coffeelintWatches, + offline: + options: + livereload: true + + files: [ + "src/coffee/*.coffee", "src/coffee/**/*.coffee", "src/coffee/**/**/*.coffee", + "src/js/*.js", "src/js/**/*.js", "src/js/**/**/*.js", "spec/**/*.spec.coffee", + "spec/coffee/helpers/**"#, + #"example/**" + ] + tasks: ['default-no-specs'] + all: + options: + livereload: true + + files: [ + "src/coffee/*.coffee", "src/coffee/**/*.coffee", "src/coffee/**/**/*.coffee", + "src/js/*.js", "src/js/**/*.js", "src/js/**/**/*.js", "spec/**/*.spec.coffee", + "spec/coffee/helpers/**", "spec/coffee/bootstrap.coffee" + #"example/**" + ] + tasks: ["fast"] + spec: + options: + livereload: true + + files: ["src/coffee/**/*.coffee"] + tasks: ["karma"] +} + +# console.log(module.exports) diff --git a/grunt/options/webpack.coffee b/grunt/options/webpack.coffee new file mode 100644 index 000000000..6e453a893 --- /dev/null +++ b/grunt/options/webpack.coffee @@ -0,0 +1,25 @@ +webpack = require 'webpack' +module.exports = + # for commonjs libraries that need to be rolled in + webpack: + commonjsDeps: + entry: + dataStructures: "./src/js/wrapped/webpack/data-structures.js", + output: + #Make sure to use [name] or [id] in output.filename + path: "tmp/" + filename: "webpack.[name].js", + + acceptance: + entry: + acceptance: "./spec/js/acceptance/app.js", + output: + #Make sure to use [name] or [id] in output.filename + path: "tmp/acceptance" + filename: "webpack.[name].js", + externals: + _ : "lodash" + plugins: [ + new webpack.ProvidePlugin + _ : "lodash" + ] diff --git a/grunt/pipeline.coffee b/grunt/pipeline.coffee new file mode 100644 index 000000000..b3934fc61 --- /dev/null +++ b/grunt/pipeline.coffee @@ -0,0 +1,42 @@ +pipeline = [ + "src/coffee/module" + "src/coffee/providers/*" + "src/coffee/extensions/*" + "src/coffee/directives/api/utils/*" + "src/coffee/directives/api/managers/*" + + "src/coffee/controllers/polyline-display" + "src/coffee/utils/*" + + "src/coffee/directives/api/options/**/*" + "src/coffee/directives/api/models/child/*" + "src/coffee/directives/api/models/parent/*" + "src/coffee/directives/api/*" + "src/coffee/directives/map" + "src/coffee/directives/marker" + "src/coffee/directives/markers" + "src/coffee/directives/label" + "src/coffee/directives/polygon" + "src/coffee/directives/circle" + "src/coffee/directives/polyline*" + "src/coffee/directives/rectangle" + "src/coffee/directives/window" + "src/coffee/directives/windows" + "src/coffee/directives/layer" + "src/coffee/directives/control" + "src/coffee/directives/*" +] + +module.exports = + pipeline: pipeline + fullPipeline: pipeline.map( (f) -> "tmp/#{f}.js").concat [ + "tmp/wrapped_uuid.js" + "tmp/wrapped_gmaps_sdk_util_v3.js" + "tmp/webpack.dataStructures.js" + "tmp/wrapped_marker_spiderfier.js" + "src/js/**/*.js" #this all will only work if the dependency orders do not matter + "src/js/**/**/*.js" + "src/js/**/**/**/*.js" + "!src/js/wrapped/webpack/*.js" + "!src/js/wrapped/*.js" + ] diff --git a/grunt/pkg.coffee b/grunt/pkg.coffee new file mode 100644 index 000000000..2d935da3e --- /dev/null +++ b/grunt/pkg.coffee @@ -0,0 +1,10 @@ +_ = require 'lodash' +pkg = require '../package.json' +pkg.nextVersion = do -> + # note this will fail on new minor or major releases.. oh well manually fix it + # for now as this is mainly for changelog + last = _.last pkg.version.split('.') + next = Number(last) + 1 + pkg.version.replace(last, String(next)) + +module.exports = pkg diff --git a/karma.acceptance.conf.coffee b/karma.acceptance.conf.coffee new file mode 100644 index 000000000..1555dd064 --- /dev/null +++ b/karma.acceptance.conf.coffee @@ -0,0 +1,79 @@ + +module.exports = (config) -> + config.set + # base path that will be used to resolve all patterns (eg. files, exclude) + basePath: './' + + # frameworks to use + # available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'] + + # preprocess matching files before serving them to the browser + # available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + # 'spec/**/*.coffee': ['coffee'] + 'spec/**/**/*.coffee': ['coffee'] + } + + # list of files / patterns to load in the browser + files: [ + # 'https://maps.googleapis.com/maps/api/js?sensor=false' + 'node_modules/phantomjs-polyfill/bind-polyfill.js' + './tmp/acceptance/webpack.acceptance.js' + 'bower_components/angular-mocks/angular-mocks.js' + 'spec/coffee/bootstrap/bootstrap.coffee' + 'spec/coffee/bootstrap/google-api-mock.coffee' + 'spec/coffee/bootstrap/initiator.coffee' + #do not include those specs for jasmine html runner by karma kama_jasmine_runner.html + {pattern:'*coffee', included: false} + 'spec/coffee/**/*.spec.coffee' + ] + + # list of files to exclude + exclude: [ + ] + + # test results reporter to use + # possible values: 'dots', 'progress' + # available reporters: https://npmjs.org/browse/keyword/karma-reporter + # NOTE , TODO 'html' reporter use if you want to hit the karma jasmine runner (frequently causes karma to blow up at the end of run), + # test results reporter to use + # possible values: 'dots', 'progress', 'mocha' + reporters: ['mocha', 'coverage'] + + # web server port + port: 9876 + + # enable / disable colors in the output (reporters and logs) + colors: true + + # level of logging + # possible values: + # - config.LOG_DISABLE + # - config.LOG_ERROR + # - config.LOG_WARN + # - config.LOG_INFO + # - config.LOG_DEBUG + logLevel: config.LOG_INFO + + # enable / disable watching file and executing tests whenever any file changes + autoWatch: false + + # start these browsers + # available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: process.env.KARMA_BROWSERS?.split(',') ? ['PhantomJS']# options Chrome, PhantomJS + #browserNoActivityTimeout: 200000000000000000000000000000000 + # If browser does not capture in given timeout [ms], kill it + captureTimeout: 60000 + # Continuous Integration mode + # if true, Karma captures browsers, runs the tests and exits + singleRun: false + + plugins: [ + 'karma-mocha-reporter' + 'karma-jasmine' + 'karma-coverage' + 'karma-chrome-launcher' + 'karma-phantomjs-launcher' + 'karma-coffee-preprocessor' + ] diff --git a/karma.conf.coffee b/karma.conf.coffee new file mode 100644 index 000000000..2344a1f3c --- /dev/null +++ b/karma.conf.coffee @@ -0,0 +1,94 @@ + +module.exports = (config) -> + config.set + # base path that will be used to resolve all patterns (eg. files, exclude) + basePath: './' + + # frameworks to use + # available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'] + + # preprocess matching files before serving them to the browser + # available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + # 'spec/**/*.coffee': ['coffee'] + 'spec/**/**/*.coffee': ['coffee'] + 'dist/angular-google-maps.js': ['coverage'] + } + + coverageReporter: + reporters:[ + { type : 'html', dir : 'dist/coverage/', subdir: 'dist' } + { type : 'cobertura', dir : 'dist/coverage/', subdir: 'dist' } + ] + + # list of files / patterns to load in the browser + files: [ + # 'https://maps.googleapis.com/maps/api/js?sensor=false' + 'node_modules/phantomjs-polyfill/bind-polyfill.js' + 'bower_components/lodash/lodash.js' + 'bower_components/angular/angular.js' + 'bower_components/angular-mocks/angular-mocks.js' + 'bower_components/angular-simple-logger/dist/angular-simple-logger.min.js' + 'dist/angular-google-maps.js' + 'spec/coffee/bootstrap/bootstrap.coffee' + 'spec/coffee/bootstrap/google-api-mock.coffee' + # 'node_modules/markerclustererplus/dist/markerclusterer.min.js' + # 'node_modules/google-maps-utility-library-v3-infobox/dist/infobox.js' + # 'node_modules/google-maps-utility-library-v3-keydragzoom/dist/keydragzoom.js' + # 'node_modules/google-maps-utility-library-v3-markerwithlabel/dist/markerwithlabel.js' + # 'bower_components/js-rich-marker/src/richmarker.js' + 'spec/coffee/bootstrap/initiator.coffee' + #do not include those specs for jasmine html runner by karma kama_jasmine_runner.html + {pattern:'*coffee', included: false} + 'spec/coffee/**/*.spec.coffee' + ] + + # list of files to exclude + exclude: [ + ] + + # test results reporter to use + # possible values: 'dots', 'progress' + # available reporters: https://npmjs.org/browse/keyword/karma-reporter + # NOTE , TODO 'html' reporter use if you want to hit the karma jasmine runner (frequently causes karma to blow up at the end of run), + # test results reporter to use + # possible values: 'dots', 'progress', 'mocha' + reporters: ['mocha', 'coverage'] + + # web server port + port: 9876 + + # enable / disable colors in the output (reporters and logs) + colors: true + + # level of logging + # possible values: + # - config.LOG_DISABLE + # - config.LOG_ERROR + # - config.LOG_WARN + # - config.LOG_INFO + # - config.LOG_DEBUG + logLevel: config.LOG_INFO + + # enable / disable watching file and executing tests whenever any file changes + autoWatch: false + + # start these browsers + # available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: process.env.KARMA_BROWSERS?.split(',') ? ['PhantomJS']# options Chrome, PhantomJS + #browserNoActivityTimeout: 200000000000000000000000000000000 + # If browser does not capture in given timeout [ms], kill it + captureTimeout: 60000 + # Continuous Integration mode + # if true, Karma captures browsers, runs the tests and exits + singleRun: false + + plugins: [ + 'karma-mocha-reporter' + 'karma-jasmine' + 'karma-coverage' + 'karma-chrome-launcher' + 'karma-phantomjs-launcher' + 'karma-coffee-preprocessor' + ] diff --git a/package.js b/package.js new file mode 100644 index 000000000..00f1d65b5 --- /dev/null +++ b/package.js @@ -0,0 +1,27 @@ +// package metadata file for Meteor.js +// console.log(global); +var packageName = 'angularui:angular-google-maps'; // https://atmospherejs.com/angularui/angular-google-maps +var where = 'client'; // where to install: 'client' or 'server'. For both, pass nothing. +var version = Npm.require(process.env.PWD + '/package.json').version; + +console.log("uigmap version to publish: " + version); + +Package.describe({ + name: packageName, + version: version, + summary: 'angular-google-maps (official)', + git: 'git@github.com:angular-ui/angular-google-maps.git', + documentation: null +}); + +Package.onUse(function(api) { + api.versionsFrom(['METEOR@0.9.0', 'METEOR@1.0']); + + api.use([ + 'stevezhu:lodash@3.0.0', + 'angular:angular@1.2.0', + 'nmccready:angular-simple-logger@0.0.1' + ], where); + + api.addFiles('dist/angular-google-maps.js', where); +}); diff --git a/package.json b/package.json new file mode 100644 index 000000000..5329e3117 --- /dev/null +++ b/package.json @@ -0,0 +1,95 @@ +{ + "name": "angular-google-maps", + "version": "2.4.1", + "description": "AngularJS directives for Google Maps", + "repository": { + "type": "git", + "url": "https://github.com/angular-ui/angular-google-maps.git" + }, + "scripts": { + "build": "grunt", + "buildAll": "grunt buildAll", + "example": "grunt example", + "mocha": "mocha ./spec/backend/**/*.spec.* --harmony_destructuring -t 6000", + "test": "npm run mocha && grunt bower karma", + "karma": "./scripts/karma" + }, + "keywords": [ + "angularjs", + "googlemaps", + "directives", + "webcomponent" + ], + "main": "dist/angular-google-maps.js", + "files": [ + "dist/*", + "spec/coffee/helpers/google-api-mock.coffee", + "spec/coffee/helpers/initiator.coffee" + ], + "license": "MIT", + "devDependencies": { + "bower": "~1.4.1", + "coffeelint": "1.16.0", + "coffeescope2": "0.4.4", + "data-structures": "^1.4.2", + "eslint": "3.7.1", + "eslint-config-airbnb": "12.0.0", + "eslint-plugin-import": "1.16.0", + "eslint-plugin-jsx-a11y": "2.2.2", + "eslint-plugin-react": "6.3.0", + "globby": "6.1.0", + "grunt": "~0.4.5", + "grunt-angular-architecture-graph": "^0.2.6", + "grunt-bump": "0.3.1", + "grunt-cli": "~0.1.13", + "grunt-contrib-clean": "~0.6.0", + "grunt-contrib-coffee": "git://github.com/nmccready/grunt-contrib-coffee#3d47cf8e539a0a7a537e6725c78c8c61b6b170eb", + "grunt-contrib-compress": "~0.13.0", + "grunt-contrib-concat": "~0.5.1", + "grunt-contrib-connect": "~0.10.1", + "grunt-contrib-copy": "~0.8.0", + "grunt-contrib-jasmine": "~0.9.x", + "grunt-contrib-jshint": "~0.11.2", + "grunt-contrib-uglify": "~0.9.1", + "grunt-contrib-watch": "~0.6.1", + "grunt-conventional-changelog": "~1.2.2", + "grunt-debug-task": "^0.1.7", + "grunt-graphviz": "^0.1.1", + "grunt-mkdir": "~0.1.2", + "grunt-ng-annotate": "1.0.1", + "grunt-open": "~0.2.3", + "grunt-replace": "^0.9.2", + "grunt-subgrunt": "^0.4.5", + "grunt-template-jasmine-istanbul": "~0.3.3", + "grunt-template-jasmine-requirejs": "~0.2.3", + "grunt-verbosity": "^0.2.2", + "grunt-webpack": "^1.0.8", + "grunt-wrap": "^0.3.0", + "jsonfile": "^2.0.1", + "karma": "0.13.X", + "karma-chrome-launcher": "^0.2.0", + "karma-coffee-preprocessor": "^0.3.0", + "karma-coverage": "0.5.X", + "karma-jasmine": "0.3.X", + "karma-kickoff": "0.0.X", + "karma-mocha-reporter": "1.X", + "karma-phantomjs-launcher": "0.2.X", + "mocha": "2.X", + "phantomjs-polyfill": "0.0.1", + "require-directory": "2.1.1", + "through2": "2.0.3", + "webpack": "1.X", + "webpack-dev-server": "1.X", + "yargs": "3.32.0" + }, + "dependencies": { + "angular": "1.2 - 1.6", + "angular-simple-logger": ">=0.0.1", + "google-maps-utility-library-v3-infobox": "1.1.14", + "google-maps-utility-library-v3-keydragzoom": "2.0.9", + "google-maps-utility-library-v3-markerwithlabel": "git://github.com/nmccready/google-maps-utility-library-v3-markerwithlabel.git", + "js-rich-marker": "git://github.com/MikaFima/js-rich-marker.git#0383f4bbdad4ddf154772fedbdd27e464600e943", + "lodash": "3.X - 4.X", + "markerclustererplus": "2.1.4" + } +} diff --git a/scripts/clean b/scripts/clean new file mode 100755 index 000000000..cecac4487 --- /dev/null +++ b/scripts/clean @@ -0,0 +1,3 @@ +#!/bin/sh +set -e +rm -rf bower_components app/bower_components node_modules dist diff --git a/scripts/publish b/scripts/publish new file mode 100755 index 000000000..e5d103c36 --- /dev/null +++ b/scripts/publish @@ -0,0 +1,15 @@ +#!/bin/sh +# removed set -e so npm can publish if meteor fails +#set -e + +if ! hash meteor &> /dev/null ;then + curl https://install.meteor.com | sh +fi + +echo meteor Publishing +meteor publish + +echo npm Publishing +npm publish ./ + +exit 0 diff --git a/spec/backend/grunt/grunt.curl.spec.js b/spec/backend/grunt/grunt.curl.spec.js new file mode 100644 index 000000000..4d8466c9d --- /dev/null +++ b/spec/backend/grunt/grunt.curl.spec.js @@ -0,0 +1,9 @@ +"use strict"; + +const {exec} = require('child_process') + +describe("grunt-curl", () => { + it("can run", done => { + exec("grunt curl", done) + }) +}) diff --git a/spec/coffee/bootstrap/bootstrap.coffee b/spec/coffee/bootstrap/bootstrap.coffee new file mode 100644 index 000000000..d7a9fb73a --- /dev/null +++ b/spec/coffee/bootstrap/bootstrap.coffee @@ -0,0 +1,51 @@ +###globals angular,_,inject### +#global jasmine protects +beforeEach -> + @googleTemp = window.google + + angular.module('uiGmapgoogle-maps') + .config ($provide) -> + $provide.value('$log', console) + $provide.decorator '$timeout', ($delegate, $browser) -> + $delegate.hasPendingTasks = -> + $browser.deferredFns.length > 0 + + $delegate + + #create + angular.module('uiGmapgoogle-maps.specs', ['uiGmapgoogle-maps']) + #require for testing + module "uiGmapgoogle-maps.specs" + + @injectAll = => + @injects.forEach (toInject) -> + inject toInject + + @injects = [] + + @injects.push (_$rootScope_, $timeout, $q, $browser, $compile, uiGmapPropMap) => + window.PropMap = uiGmapPropMap + @q = $q + @browser = $browser + @rootScope = _$rootScope_ + @scope = angular.extend @rootScope.$new(), @scope or {} + @scope.map = angular.extend @scope.map or {}, + zoom: 12 + center: + longitude: 47 + latitude: -27 + + @timeout = $timeout + @compile = $compile + + @digest = (fn, doCompile = true) => + @compile(@html)(@scope) if @html and @scope and doCompile + + fn() if fn? and _.isFunction fn + while @timeout.hasPendingTasks() + @timeout.flush() + @rootScope.$digest() + +afterEach -> + if @googleTemp? + window.google = @googleTemp diff --git a/spec/coffee/bootstrap/google-api-mock.coffee b/spec/coffee/bootstrap/google-api-mock.coffee new file mode 100644 index 000000000..ee1f91dde --- /dev/null +++ b/spec/coffee/bootstrap/google-api-mock.coffee @@ -0,0 +1,501 @@ +###global _:true, angular:true, google:true ### +do -> + #coffeelint:disable=check_scope + capitalize = (s) -> + return s[0].toUpperCase() + s.slice(1) + #coffeelint:enable=check_scope + + class MapObject + getMap: => + @map + setMap: (m) => + @map = m + setOptions: (o) => + @opts = o + + class DraggableObject extends MapObject + setDraggable: (bool) => + @draggable = bool + getDraggable: => + @draggable + + class VisibleObject extends MapObject + setVisible: (bool) => + @visible = bool + getVisible: => + @visible + + class PositionObject extends MapObject + setPosition:(position) => + @position + getPosition: => + @position + + class MockInfoWindow + constructor: -> + @_isOpen = false + + open: (map, anchor) => + @_isOpen = true + return + + close: => + @_isOpen = false + return + + isOpen: (val = undefined) -> + unless val? + return @_isOpen + else + @_isOpen = val + + setContent: (content) => + @content = content + + getContent: => + @content + + getLatLng = -> + class LatLng + constructor: (@y,@x, nowrap) -> + lat: => + @y + lng: => + @x + + getMarker = -> + class Marker extends MapObject + _.extend @::, PositionObject::, DraggableObject::, VisibleObject:: + @instances = 0 + #coffeelint:disable=no_private_function_fat_arrows + @resetInstances = => + #coffeelint:enable=no_private_function_fat_arrows + @instances = 0 + @creationSubscribe = (obj, cb) -> + window.google.maps.event.addListener(obj, 'creation', cb) + @creationUnSubscribe = (listener) -> + window.google.maps.event.removeListener listener + + constructor: (opts) -> + super() + if opts? + ['draggable', 'editable', + 'map','visible', 'position'].forEach (o) => + @[o] = opts[o] + Marker.instances += 1 + if window?.google?.maps?.event? + window.google.maps.event.fireAllListeners 'creation', @ + + setOptions: (o) => + super(o) + if o?.position? + @position = o.position + setAnimation:(obj) => + @animation = obj + getAnimation: => + @animation + setIcon: (icon) => + @icon + getIcon: => + @icon + setClickable: (bool) => + @clickable = bool + getClickable: => + @clickable + setZIndex:(z) => + @zIndex = z + getZIndex: => + @zIndex + setTitle: (str) => + @title = str + getTitle: => + @title + setOpacity: (num) => + @opacity = num + getOpacity: => + @opacity + + getCircle = -> + class Circle extends MapObject + _.extend @::, DraggableObject::, VisibleObject:: + @instances = 0 + #coffeelint:disable=no_private_function_fat_arrows + @resetInstances = => + #coffeelint:enable=no_private_function_fat_arrows + @instances = 0 + @creationSubscribe = (obj, cb) -> + window.google.maps.event.addListener(obj, 'creation', cb) + @creationUnSubscribe = (listener) -> + window.google.maps.event.removeListener listener + + constructor: (opts) -> + super() + @props = ['draggable', 'editable', 'map','visible', 'radius', 'center'] + @setOptions opts + + #getters + #coffeelint:disable=check_scope + @props.forEach (p) => + @["get#{capitalize(p)}"] = => + @[p] + + #setters + @props.forEach (p) => + @["set#{capitalize(p)}"] = (val) => + @[p] = val + if p == "radius" or p == "center" + window.google.maps.event.fireAllListeners "#{p}_changed", @ + #coffeelint:enable=check_scope + + Circle.instances += 1 + @instance = Circle.instances + if window?.google?.maps?.event? + window.google.maps.event.fireAllListeners 'creation', @ + + setOptions: (o) => + super(o) + _.extend @, o + + + + getMap = -> + Map = (opts) -> return + Map::center = + lat: -> 0 + lng: -> 0 + Map::controls = { + TOP_CENTER: [], + TOP_LEFT: [], + TOP_RIGHT: [], + LEFT_TOP: [], + RIGHT_TOP: [], + LEFT_CENTER: [], + RIGHT_CENTER: [], + LEFT_BOTTOM: [], + RIGHT_BOTTOM: [], + BOTTOM_CENTER: [], + BOTTOM_LEFT: [], + BOTTOM_RIGHT: [] + } + Map::overlayMapTypes = new window.google.maps.MVCArray() + Map::getControls = -> return @controls + Map::setOpts = -> return + Map::setOptions = -> return + Map::setZoom = -> return + Map::setCenter = -> return + Map::getCoords = -> return {latitude: 47, longitude: -27} unless Map.getCoords? + Map::getBounds = -> + unless Map.getBounds? + getNorthEast: -> + google.maps.LatLng(47,27) + getSouthWest: -> + google.maps.LatLng(89,100) + return Map + + + getMarkerWithLabel: -> + class MarkerWithLabel extends getMarker() + @instances = 0 + #coffeelint:disable=no_private_function_fat_arrows + @resetInstances = => + #coffeelint:enable=no_private_function_fat_arrows + @instances = 0 + constructor: (opts) -> + if opts? + ['draggable', 'editable', 'map','path', 'visible'].forEach (o) => + @[o] = opts[o] + @drawn = false + MarkerWithLabel.instances += 1 + + setAnchor: (anchor) => + @anchor = @anchor + getAnchor: => + @anchor + setMandatoryStyles: (obj) => + @mandatoryStyles = obj + getMandatoryStyles: => + @mandatoryStyles + setStyles:(obj) => + @styles = obj + getStyles: => + @styles + setContent:(content) => + @content = content + getContent: => + @content + draw: => + @drawn = true + onRemove: -> + onAdd: -> + + getPolyline = -> + class Polyline extends DraggableObject + @instances = 0 + #coffeelint:disable=no_private_function_fat_arrows + @resetInstances = => + @instances = 0 + #coffeelint:enable=no_private_function_fat_arrows + constructor: (opts) -> + if opts? + ['draggable', 'editable', 'map','path', 'visible'].forEach (o) => + @[o] = opts[o] + Polyline.instances += 1 + + getEditable: => + @editable + getPath: => + @path + setEditable: (bool) => + @editable = bool + setPath: (array) => + @path = array + + getMVCArray = -> + class MVCArray extends Array + @instances = 0 + #coffeelint:disable=no_private_function_fat_arrows + @resetInstances = => + #coffeelint:enable=no_private_function_fat_arrows + @instances = 0 + constructor: -> + MVCArray.instances += 1 + super() + clear: -> + @length = 0 + getArray: => + @ + getAt:(i) => + @[i] + getLength: => + @length + insertAt:(i, elem) => + @splice(i, 0, elem) + removeAt:(i) -> + @splice(i,1) + setAt:(i, elem) -> + @[i] = elem + + class GoogleApiMock + constructor: -> + @mocks = [ + @mockAPI + @mockLatLng + @mockLatLngBounds + @mockControlPosition + @mockAnimation + @mockMapTypeId + @mockOverlayView + @mockOverlayView + @mockEvent + @mockInfoWindow + @mockMarker + @mockCircle + @mockMVCArray + @mockPoint + @mockPolygon + @mockPolyline + @mockMap + @mockPlaces + @mockSearchBox + ] + @initAll = -> @mocks.forEach (fn) -> fn?() + + mockAPI: -> + window.google = {} + window.google.maps = {} + + # To make debugging easier, mock everything with exceptions + unmocked = (api) -> () -> throw new String('Unmocked API ' + api) + window.google.maps.Marker = unmocked('Marker') + window.google.maps.event = + clearListeners: unmocked('event.clearListeners') + addListener: unmocked('event.addListener') + removeListener: unmocked('event.removeListener') + window.google.maps.OverlayView = unmocked('OverlayView') + window.google.maps.InfoWindow = unmocked('InfoWindow') + window.google.maps.LatLng = unmocked('LatLng') + window.google.maps.MVCArray = unmocked('MVCArray') + window.google.maps.Point = unmocked('Point') + window.google.maps.LatLngBounds = unmocked('LatLngBounds') + window.google.maps.Polyline = unmocked('Polyline') + + mockPlaces: -> + window.google.maps.places = {} + + mockSearchBox: (SearchBox = () -> return) -> + window.google.maps.places.SearchBox = SearchBox + + mockLatLng: (yours) -> + window.google.maps.LatLng = unless yours then getLatLng() else yours + + mockLatLngBounds: (LatLngBounds = () -> return) -> + if not (LatLngBounds.extend?) + LatLngBounds.prototype.extend = () -> return + + window.google.maps.LatLngBounds = LatLngBounds + + mockMap: => + @mockMapTypeId() + @mockLatLng() + @mockOverlayView() + @mockEvent() + @mockMVCArray() + Map = getMap() + window.google.maps.Map = Map + + mockControlPosition: -> + ControlPosition = + TOP_CENTER: 'TOP_CENTER', + TOP_LEFT: 'TOP_LEFT', + TOP_RIGHT: 'TOP_RIGHT', + LEFT_TOP: 'LEFT_TOP', + RIGHT_TOP: 'RIGHT_TOP', + LEFT_CENTER: 'LEFT_CENTER', + RIGHT_CENTER: 'RIGHT_CENTER', + LEFT_BOTTOM: 'LEFT_BOTTOM', + RIGHT_BOTTOM: 'RIGHT_BOTTOM', + BOTTOM_CENTER: 'BOTTOM_CENTER', + BOTTOM_LEFT: 'BOTTOM_LEFT', + BOTTOM_RIGHT: 'BOTTOM_RIGHT' + window.google.maps.ControlPosition = ControlPosition + + mockAnimation: (Animation = {BOUNCE: 'bounce'}) -> + window.google.maps.Animation = Animation + + mockMapTypeId: (MapTypeId = {ROADMAP: 'roadmap'}) -> + window.google.maps.MapTypeId = MapTypeId + + mockOverlayView: (OverlayView = class OverlayView + setMap: () ->) -> + window.google.maps.OverlayView = OverlayView + + mockEvent: (event = {}) -> + listeners = [] + #mocking google maps event listener + if not event.addListener + event.addListener = (thing, eventName, callBack) -> + found = _.find listeners, (obj) -> + obj.obj == thing + unless found? + toPush = {} + toPush.obj = thing + toPush.events = {} + toPush.events[eventName] = [callBack] + listeners.push toPush + else + if !found.events[eventName] + found.events[eventName] = [callBack] + else + found.events[eventName].push callBack + + event.addListenerOnce = (thing, eventName, callBack) -> + callBack() #forcing immediate return for idle so async api kicks off + event.addListener(thing, eventName, callBack) + + if not event.clearListeners + event.clearListeners = () -> + listeners.length = 0 + + if not event.removeListener + event.removeListener = (item) -> + index = listeners.indexOf(item) + if index != -1 + listeners.splice(index) + + unless event.fireListener + event.fireListener = (thing, eventName) -> + found = _.find listeners, (obj) -> + obj.obj == thing + if found? and found?.events[eventName]? + found.events[eventName].forEach (cb) -> cb(found.obj) + + unless event.normalizedEvents + event.normalizedEvents = -> + ret = _ listeners.map (obj) -> + _.keys(obj.events) + .chain() + .flatten() + .uniq() + .value() + ret + + unless event.fireAllListeners + event.fireAllListeners = (eventName, state) -> + listeners.forEach (obj) -> + if obj.events[eventName]? + obj.events[eventName].forEach (cb) -> cb(state) + + window.google.maps.event = event + return listeners + + mockInfoWindow: (InfoWindow = MockInfoWindow) -> + window.google.maps.InfoWindow = InfoWindow + + mockMarker: (Marker = getMarker()) -> + window.google.maps.Marker = Marker + + mockMVCArray: (impl = getMVCArray()) -> + window.google.maps.MVCArray = impl + + mockCircle: (Circle = getCircle()) -> + window.google.maps.Circle = Circle + + mockPoint: (Point = (x, y) -> return {x: x, y: y}) -> + window.google.maps.Point = Point + + mockPolyline: (impl = getPolyline()) -> + return window.google.maps.Polyline = impl + + mockPolygon: (polygon) -> + return window.google.maps.Polygon = polygon if polygon? + + #https://developers.google.com/maps/documentation/javascript/reference#Polygon + #https://developers.google.com/maps/documentation/javascript/reference#PolygonOptions + window.google.maps.Polygon = (options) -> + @getDraggable = -> + options.draggable + @getEditable = -> + options.editable + @getMap = -> + options.map + @getPath = -> + _.first(options.paths) + @getPaths = -> + options.paths + @getVisible = -> + options.visible + @setOptions = (opts) -> + options = opts + + @setDraggable = (boolean) -> + options.draggable = boolean + @setEditable = (boolean) -> + options.editable = boolean + @setMap = (map) -> + options.map = map + @setPath = (path) -> + if options.paths? and options.paths.length > 0 + options.paths[0] = path + else + options.paths = [] + options.paths.push path + + @setPaths = (paths) -> + options.paths = paths + + @setVisible = (boolean) -> + options.visible = boolean + @ + + getMarker: getMarker + getMap: getMap + getPolyline: getPolyline + getMVCArray: getMVCArray + getLatLng: getLatLng + + (new GoogleApiMock()).initAll() + + angular.module('uiGmapgoogle-maps.mocks', ['uiGmapgoogle-maps']) + .factory('GoogleApiMock', -> + GoogleApiMock + ) diff --git a/spec/coffee/bootstrap/google-map-spec-controller.coffee b/spec/coffee/bootstrap/google-map-spec-controller.coffee new file mode 100644 index 000000000..80c94b90f --- /dev/null +++ b/spec/coffee/bootstrap/google-map-spec-controller.coffee @@ -0,0 +1,19 @@ +do -> + angular.module("angular-google-maps-specs", ['uiGmapgoogle-maps']) + .controller 'GoogleMapSpecController', ($scope, $timeout, $log) -> + self = @ + @hasRun = false + @map = {} + google.maps.visualRefresh = true + angular.extend $scope, + showTraffic: true, + center: + latitude: 45 + longitude: -73 + zoom: 3, + events: #direct hook to google maps sdk events + tilesloaded: (map, eventName, originalEventArgs) -> + if !self.hasRun + self.map = map + document.gMap = map + self.hasRun = true diff --git a/spec/coffee/bootstrap/initiator.coffee b/spec/coffee/bootstrap/initiator.coffee new file mode 100644 index 000000000..aaa7eca8b --- /dev/null +++ b/spec/coffee/bootstrap/initiator.coffee @@ -0,0 +1,35 @@ +window.uiGmapInitiator = + initDirective: (testSuite, apiSubjectClassName, thingsToInit = ['initAll']) -> + + injects = ['uiGmapLogger'] + if apiSubjectClassName? + injects.push 'uiGmap' + apiSubjectClassName + + module "uiGmapgoogle-maps.mocks" + + inject (GoogleApiMock) -> + testSuite.apiMock = new GoogleApiMock() + thingsToInit.forEach (init) -> + testSuite.apiMock[init]() + + injects.push (Logger, SubjectClass) -> + testSuite.subject = new SubjectClass() if SubjectClass? + testSuite.log = Logger + + spyOn testSuite.log, 'error' + + testSuite.injects.push injects + + testSuite + + initMock: (testSuite, injectedCb) -> + app = window.module "uiGmapgoogle-maps.mocks" + window.module "uiGmapgoogle-maps.directives.api.utils" + apiMock = undefined + testSuite.injects.push (GoogleApiMock) -> + apiMock = new GoogleApiMock() + apiMock.initAll() + injectedCb(apiMock) if injectedCb? and _.isFunction injectedCb + + app: app + apiMock: apiMock diff --git a/spec/coffee/directives/api/circle.spec.coffee b/spec/coffee/directives/api/circle.spec.coffee new file mode 100644 index 000000000..e0bc61aa9 --- /dev/null +++ b/spec/coffee/directives/api/circle.spec.coffee @@ -0,0 +1,199 @@ +describe 'uiGmapCircle', -> + #coffeelint:disable=check_scope + allDone = undefined + GCircle = null + modelClicked = false + #coffeelint:enable=check_scope + + afterEach -> + window.google.maps.event.clearListeners() + GCircle.resetInstances() + #coffeelint:disable=check_scope + modelClicked = false + #coffeelint:enable=check_scope + + beforeEach -> + + @html = """ + + + + + """ + map = + zoom: 12 + center : {longitude: 47, latitude: -27} + + circleEvents = jasmine.createSpyObj 'circleEvents', ['radius_changed','center_changed'] + @circle = + id: 1, + center: {longitude: 47, latitude: -27}, + radius: 500, + stroke: + color: '#08B21F', + weight: 2, + opacity: 1 + fill: + color: '#08B21F', + opacity: 0.5 + geodesic: true + draggable: true + clickable: true + editable: true + visible: true + events: circleEvents + control: {} + + window.uiGmapInitiator + .initMock(@, -> + GCircle = window.google.maps.Circle + ).apiMock + + @injects.push (uiGmapCircle) => + @subject = uiGmapCircle + + map.circle = @circle + + @scope = angular.extend @scope or {}, map: map + + @injectAll() + + describe 'should add one circle', -> + it 'from start', (done) -> + + @digest => + @timeout -> + expect(GCircle.instances).toEqual(1) + done() + + describe 'events', -> + it 'call radius changed once', (done) -> + + listener = GCircle.creationSubscribe @, (gObject) => + _.delay => + window.google.maps.event.fireListener(gObject,'radius_changed') + expect(@circle.events.radius_changed).toHaveBeenCalled() + expect(@circle.events.radius_changed.calls.count()).toBe(1) + done() + + @digest => + @timeout -> + expect(GCircle.instances).toEqual(1) + GCircle.creationUnSubscribe listener + , 500 + + describe "updates gObject from model", -> + it 'change center', (done) -> + #issue 1271 + @digest => + @timeout => + @circle.center = + longitude: 50 + latitude: -50 + # @circle.radius = 1 + @digest => + @timeout => + gTestObject = @circle.control.getCircle().getCenter() + expect(gTestObject?.lng()).toBe(50) + expect(gTestObject?.lat()).toBe(-50) + done() + , 500 + + it 'change center if directive events is not defined', (done) -> + #issue 1271 + @html = """ + + + + + """ + + @digest => + @timeout => + @digest => + GCircle.creationSubscribe @, (gObject) => + _.delay => + gObject.setCenter + lat: -> + -50 + lng: -> + 50 + + window.google.maps.event.fireListener(gObject,'center_changed') + @digest => + @timeout => + expect(@scope.map.circle.center.longitude).toBe(50) + expect(@scope.map.circle.center.latitude).toBe(-50) + done() + , false + , 200 + , 500 + , false + it 'change radius does not fire center_changed', (done) -> + listener = GCircle.creationSubscribe @, (gObject) => + _.delay => + @digest => + gObject.setRadius 200 + expect(@circle.events.radius_changed).toHaveBeenCalled() + expect(@circle.events.center_changed).not.toHaveBeenCalled() + done() + @digest => + @timeout -> + GCircle.creationUnSubscribe listener + , 500 + + it 'change center does not fire radius_changed', (done) -> + listener = GCircle.creationSubscribe @, (gObject) => + _.delay => + @digest => + gObject.setCenter + lng: -> 50 + lat: -> -50 + expect(@circle.events.center_changed).toHaveBeenCalled() + expect(@circle.events.radius_changed).not.toHaveBeenCalled() + done() + @digest -> + GCircle.creationUnSubscribe listener + + it 'exists', -> + expect(@subject).toBeDefined() + + it 'creates control', (done) -> + @digest => + @timeout => + expect(@circle.control.getCircle).toBeDefined() + expect(@circle.control.getCircle()).toEqual(jasmine.any(GCircle)) + done() + describe "updates model from gObject", -> + it 'change center', (done) -> + listener = GCircle.creationSubscribe @, (gObject) => + _.delay => + gObject.setCenter + lng: -> 50 + lat: -> -50 + @digest => + @timeout => + expect(@circle.center.latitude).toBe(-50) + expect(@circle.center.longitude).toBe(50) + done() + @digest => + @timeout -> + GCircle.creationUnSubscribe listener + , 500 diff --git a/spec/coffee/directives/api/control.spec.coffee b/spec/coffee/directives/api/control.spec.coffee new file mode 100644 index 000000000..5f126474c --- /dev/null +++ b/spec/coffee/directives/api/control.spec.coffee @@ -0,0 +1,55 @@ +describe "directives.api.control", -> + beforeEach -> + window['uiGmapInitiator'].initDirective @, "Control" + @injects.push ($templateCache) -> + $templateCache.put('mockControl.tpl.html', '') + @injectAll() + + it "can be created", -> + expect(@subject).toBeDefined() + @log.error.calls.reset() + + it "should load template", -> + html = angular.element """ + + + + """ + @compile(html)(@scope) + @rootScope.$apply() + expect(@log.error).not.toHaveBeenCalled() + @log.error.calls.reset() + #TODO: confirm it was added to the map.Controls[position] Array + + it "should validate position attribute", -> + html = angular.element """ + + + + """ + @compile(html)(@scope) + @rootScope.$apply() + expect(@log.error).toHaveBeenCalledWith('mapControl: invalid position property') + @log.error.calls.reset() + + it "error was called bottom_center", -> + html = angular.element """ + + + + """ + @compile(html)(@scope) + @rootScope.$apply() + expect(@log.error).not.toHaveBeenCalled() + @log.error.calls.reset() + + it "error was called - top_left", -> + html = angular.element """ + + + + """ + @compile(html)(@scope) + @rootScope.$apply() + expect(@log.error).not.toHaveBeenCalled() + @log.error.calls.reset() diff --git a/spec/coffee/directives/api/drag-zoom.spec.coffee b/spec/coffee/directives/api/drag-zoom.spec.coffee new file mode 100644 index 000000000..78c460642 --- /dev/null +++ b/spec/coffee/directives/api/drag-zoom.spec.coffee @@ -0,0 +1,43 @@ +describe 'uiGmapDragZoom spec', -> + + beforeEach -> + + window['uiGmapInitiator'].initMock @, (apiMock) -> + map = apiMock.getMap() + map.prototype.enableKeyDragZoom = @enableKeyDragZoom + + @injects.push ['uiGmapDragZoom', 'uiGmapGoogleMapApi', + (DragZoom, Api) => + @enableKeyDragZoom = (opts) -> + spyOn(@, 'enableKeyDragZoom') + @subject = DragZoom + ] + @injectAll() + + xit 'should be called from creation', (done) -> + html = """ + + + + """ + scope = @rootScope.$new() + scope.items = [] + scope.map = {} + scope.map.zoom = 12 + scope.map.center = {longitude: 47, latitude: -27} + scope.opts = {} + + spyOn(scope.spec, 'enableKeyDragZoom') + + @compile(html)(scope) + + @digest () => + @timeout () -> + #when it gets here map.prototype.enableKeyDragZoom has been squashed + expect(scope.spec.enableKeyDragZoom).toHaveBeenCalled() + done() + , 300 + #when map.prototype.enableKeyDragZoom is ok, rootScope apply is calling init which squashes it + + it 'exists', -> + expect(@subject).toBeDefined() diff --git a/spec/coffee/directives/api/map.spec.coffee b/spec/coffee/directives/api/map.spec.coffee new file mode 100644 index 000000000..543e9e655 --- /dev/null +++ b/spec/coffee/directives/api/map.spec.coffee @@ -0,0 +1,118 @@ +###globals _,google### +describe "uiGmapMap", -> + beforeEach -> + window['uiGmapInitiator'].initDirective @, "Map", ['initAll'], {} + @html = """ + + + """ + @scope = + map: + events: {} + options: {} + control: {} + zoom: 10 + center: + longitude: 47 + latitude: -27 + + @injectAll() + + afterEach -> + @scope = null + @log.error.calls.reset() + + describe "control props are set", -> + it "getGMap", -> + @digest => + expect(@scope.map.control.getGMap).toBeUndefined() + expect(@scope.map.control.getGMap).toBeDefined() + + it "refresh", -> + @digest => + expect(@scope.map.control.refresh).toBeUndefined() + expect(@scope.map.control.refresh).toBeDefined() + + it "getMapOptions", -> + @digest => + expect(@scope.map.control.getMapOptions).toBeUndefined() + expect(@scope.map.control.getMapOptions).toBeDefined() + + describe 'blackList events', -> + it '(all) blocks all but defaults', -> + @scope.map.events = + blacklist: 'all' + @digest -> + events = google.maps.event.normalizedEvents() + eventsBeyondDefaults = + _.without events, 'idle' + expect(_.isEmpty eventsBeyondDefaults).toBeTruthy() + + it '(dragstart) blocks only itself', -> + @scope.map.events = + blacklist: 'dragstart' + @digest -> + events = google.maps.event.normalizedEvents() + eventsBeyondDefaults = + _.without events, + 'idle', 'dragend', 'drag', + 'zoom_changed', 'center_changed', + expect(_.isEmpty eventsBeyondDefaults).toBeTruthy() + + it '(dragstart) blocks only itself', -> + @scope.map.events = + blacklist: 'dragstart' + @digest -> + events = google.maps.event.normalizedEvents() + eventsBeyondDefaults = + _.without events, + 'idle', 'dragend', 'drag', + 'zoom_changed', 'center_changed', + expect(_.isEmpty eventsBeyondDefaults).toBeTruthy() + + it '(dragend) blocks only itself', -> + @scope.map.events = + blacklist: 'dragstart' + @digest -> + events = google.maps.event.normalizedEvents() + eventsBeyondDefaults = + _.without events, + 'idle', 'dragstart', 'drag', + 'zoom_changed', 'center_changed', + expect(_.isEmpty eventsBeyondDefaults).toBeTruthy() + + it '(drag) blocks only itself', -> + @scope.map.events = + blacklist: 'dragstart' + @digest -> + events = google.maps.event.normalizedEvents() + eventsBeyondDefaults = + _.without events, + 'idle', 'dragstart', 'dragend', + 'zoom_changed', 'center_changed', + expect(_.isEmpty eventsBeyondDefaults).toBeTruthy() + + it '(zoom_changed) blocks only itself', -> + @scope.map.events = + blacklist: 'dragstart' + @digest -> + events = google.maps.event.normalizedEvents() + eventsBeyondDefaults = + _.without events, + 'idle', 'dragstart', 'dragend', + 'drag', 'center_changed', + expect(_.isEmpty eventsBeyondDefaults).toBeTruthy() + + it '(center_changed) blocks only itself', -> + @scope.map.events = + blacklist: 'dragstart' + @digest -> + events = google.maps.event.normalizedEvents() + eventsBeyondDefaults = + _.without events, + 'idle', 'dragstart', 'dragend', + 'drag', 'zoom_changed', + expect(_.isEmpty eventsBeyondDefaults).toBeTruthy() diff --git a/spec/coffee/directives/api/marker.spec.coffee b/spec/coffee/directives/api/marker.spec.coffee new file mode 100644 index 000000000..eae46d674 --- /dev/null +++ b/spec/coffee/directives/api/marker.spec.coffee @@ -0,0 +1,61 @@ +describe "uiGmapMarker", -> + beforeEach -> + module "uiGmapgoogle-maps.mocks" + + @mocks = + scope: + idKey: 0 + coords: + latitude: 90.0 + longitude: 89.0 + show: true + $watch: ()-> + $on: ()-> + control: {} + + element: + html: -> + "

test html

" + attrs: + isiconvisibleonclick: true + ctrl: + getMap: ()-> + {} + @timeOutNoW = (fnc, time) => + fnc() + + inject ['GoogleApiMock','$rootScope', '$q', 'uiGmapMarker',(GoogleApiMock,$rootScope, $q, Marker) => + @gmap = new GoogleApiMock() + @gmap.initAll() + @$rootScope = $rootScope + d = $q.defer() + d.resolve {} + @$rootScope.deferred = d + @mocks.ctrl.getScope = => + @$rootScope + @mocks.scope.$new = () => + @$rootScope.$new() + @mocks.scope.deferred = d + @subject = new Marker() + ] + + it 'can be created', -> + expect(@subject).toBeDefined() + + describe "link", -> + it 'gManager exists', -> + @subject.link(@mocks.scope, @mocks.element, @mocks.attrs, @mocks.ctrl) + @$rootScope.$apply() + expect(@mocks.scope.control.getGMarkers()).toBeDefined() + + it 'slaps control functions when a control is available', -> + @subject.link(@mocks.scope, @mocks.element, @mocks.attrs, @mocks.ctrl) + @$rootScope.$apply() + expect(@mocks.scope.control.getGMarkers).toBeDefined() + + it 'slaps control functions work', -> + @subject.link(@mocks.scope, @mocks.element, @mocks.attrs, @mocks.ctrl) + @$rootScope.$apply() + fn = @mocks.scope.control.getGMarkers + expect(fn).toBeDefined() + expect(fn()[0].key).toEqual(@mocks.scope.idKey) diff --git a/spec/coffee/directives/api/markers.spec.coffee b/spec/coffee/directives/api/markers.spec.coffee new file mode 100644 index 000000000..6336cf8db --- /dev/null +++ b/spec/coffee/directives/api/markers.spec.coffee @@ -0,0 +1,210 @@ +###globals _### +describe 'uiGmapMarkers (directive creation)', -> + GMarker = null + modelClicked = false + + afterEach -> + GMarker.resetInstances() + modelClicked = false + + beforeEach -> + @html = """ + + + + """ + @map = + zoom: 12 + center : {longitude: 47, latitude: -27} + + window['uiGmapInitiator'].initMock @, -> + GMarker = window.google.maps.Marker + + @injects.push ['uiGmapMarkers', (Markers) => + @subject = Markers + ] + @injectAll() + + describe "object models", -> + describe 'should add markers for each object in model', -> + describe 'from start', -> + it 'one model', (done) -> + _.extend @scope, map: @map + + toPush = {} + toPush.id = 0 + toPush.latitude = 47 + toPush.longitude = -27 + @scope.items = + 0: toPush + length: 1 + + @digest => + @timeout -> + expect(GMarker.instances).toEqual(1) + done() + + it 'multiple models', (done) -> + _.extend @scope, map: @map + + items = {} + array = _.range(2) + items.length = array.length + array.forEach (num) -> + toPush = + id: num + latitude: 47 + longitude: -27 + + items[num] = toPush + + @scope.items = items + + @digest => + @timeout -> + expect(GMarker.instances).toEqual(array.length) + done() + + describe "array models", -> + describe 'should add markers for each object in model', -> + it 'from start', (done) -> + _.extend @scope, map: @map + + toPush = {} + toPush.id = 0 + toPush.latitude = 47 + toPush.longitude = -27 + @scope.items = [toPush] + + @digest => + @timeout -> + expect(GMarker.instances).toEqual(1) + done() + + + describe 'dynamic', -> + it 'delayed creation', (done) -> + _.extend @scope, + map: @map + items: [] + + expect(GMarker.instances).toEqual(0) + @digest => + @timeout => + toPush = {} + toPush.id = 0 + toPush.latitude = 47 + toPush.longitude = -27 + @scope.items.push(toPush) + , 250 + @timeout -> + expect(GMarker.instances).toEqual(1) + done() + , 350 + + describe 'update an existing marker should modify an existing gObject (gMarker)', -> + beforeEach -> + @updateTest = (done, updateFn ) => + @scope.onClick = -> + spyOn @scope, 'onClick' + _.extend @scope, + map: @map + items: [ + { + id:0, + latitude:47, + longitude: -27 + }, + { + id:1, + latitude:67, + longitude: -57 + } + ] + + update = + id:1, + latitude:89, + longitude: -150 + + createdGMarkers = [] + listener = GMarker.creationSubscribe @, (gMarker) -> + createdGMarkers.push gMarker + + _.delay -> + gMarker = _.last(createdGMarkers) + expect(gMarker.key).toBe(1) + expect(gMarker.getPosition().lng()).toBe(update.longitude) + expect(gMarker.getPosition().lat()).toBe(update.latitude) + done() + , 500 + #force gMarker object to invoke click + @digest => + @timeout => + expect(GMarker.instances).toEqual(2) + GMarker.creationUnSubscribe listener + updateFn(@scope.items, update) + + it 'by reference', (done) -> + @updateTest done, (items, update) -> + items[1] = update + + it 'by position (model)', (done) -> + @updateTest done, (items, update) -> + model = items[1] + model.latitude = update.latitude + model.longitude = update.longitude + + describe 'can eval key function', -> + it 'handles click function in model', (done) -> + # spyOn scope.items[1], 'onClick' + _.extend @scope, map: @map + + toPush = { + id: 0, + latitude:47, + longitude: -27, + onClick: -> + modelClicked = true + } + @scope.items = [toPush] + + listener = GMarker.creationSubscribe @, (gMarker) -> + _.delay -> + window.google.maps.event.fireListener(gMarker,'click') + expect(modelClicked).toBeTruthy() + done() + , 250 + + #force gMarker object to invoke click + @digest => + @timeout -> + expect(GMarker.instances).toEqual(1) + GMarker.creationUnSubscribe listener + describe 'can eval expressions', -> + it 'handles click expression to function', (done) -> + @scope.onClick = -> + spyOn @scope, 'onClick' + _.extend @scope, map: @map + + toPush = {} + toPush.id = 0 + toPush.latitude = 47 + toPush.longitude = -27 + @scope.items = [toPush] + + listener = GMarker.creationSubscribe @, (gMarker) => + _.delay => + window.google.maps.event.fireListener(gMarker,'click') + expect(@scope.onClick).toHaveBeenCalled() + done() + , 250 + + #force gMarker object to invoke click + @digest => + @timeout -> + expect(GMarker.instances).toEqual(1) + GMarker.creationUnSubscribe listener + + it 'exists', -> + expect(@subject).toBeDefined() diff --git a/spec/coffee/directives/api/models/child/marker-child-model.spec.coffee b/spec/coffee/directives/api/models/child/marker-child-model.spec.coffee new file mode 100644 index 000000000..0acf707ed --- /dev/null +++ b/spec/coffee/directives/api/models/child/marker-child-model.spec.coffee @@ -0,0 +1,109 @@ +###globals angular,google,inject### +describe 'uiGmapMarkerChildModel', -> + beforeEach -> + #define / inject values into the item we are testing... not a controller but it allows us to inject + angular.module('mockModule', ['uiGmapgoogle-maps']) + module('mockModule') + module('uiGmapgoogle-maps.mocks') + inject (GoogleApiMock) => + @gmap = new GoogleApiMock() + @gmap.mockAPI() + @gmap.mockAnimation() + @gmap.mockLatLng() + @gmap.mockMarker() + @gmap.mockEvent() + #comparison variables + @index = 0 + @model = + id: 0 + icon: 'icon.png' + coords: + latitude: 90 + longitude: 90 + options: + animation: google.maps.Animation.BOUNCE + @iconKey = 'icon' + @coordsKey = 'coords' + @optionsKey = 'options' + + inject ['$rootScope', '$controller', 'uiGmapMarkerChildModel', 'uiGmapMarkerManager', + ($rootScope, $controller, MarkerChildModel, MarkerManager) => + scope = $rootScope.$new() + scope.click = -> + scope.icon = @iconKey + scope.coords = @coordsKey + scope.options = @optionsKey + mgr = new MarkerManager(document.gMap, undefined, undefined) + @subject = new MarkerChildModel { + scope, + model: @model, + keys: scope, + gmap: document.gMap, + doClick: (()->) + gManager: mgr + } + ] + + + it 'can be created', -> + expect(@subject).toBeDefined() + expect(@subject.scope).toBeDefined() + + it 'parentScope keys are set correctly', -> + expect(@subject.iconKey).toEqual(@iconKey) + expect(@subject.coordsKey).toEqual(@coordsKey) + expect(@subject.optionsKey).toEqual(@optionsKey) + + describe 'evalModelHandle()', -> + it 'scope values are equal to the model values by key', -> + #since evalHModelHandle does not use => and uses -> + #it is a prototype function which is more static, and kinda private.. as in not obvious to find + #2 ways to get to it instance.__proto___.function or classType.prototype.function + # equates to @subject.__proto__.evalModelHandle or directives.api.model.child.MarkerChildModel.prototype.evalModelHandle + expect(@subject.__proto__.evalModelHandle(@model, @iconKey)).toEqual(@model.icon) + expect(@subject.__proto__.evalModelHandle(@model, @coordsKey)).toEqual(@model.coords) + expect(@subject.__proto__.evalModelHandle(@model, @optionsKey)).toEqual(@model.options) + it 'updates an existing models properties via watch, icon', -> + @model.icon = 'test.png' + expect(@subject.__proto__.evalModelHandle(@model, @iconKey)).toEqual(@model.icon) + it 'updates an existing models properties via watch, coords', -> + @model.coords.latitude = 91 + expect(@subject.__proto__.evalModelHandle(@model, @coordsKey)).toEqual(@model.coords) + it 'updates an existing models properties via watch, options', -> + @model.options = 'options2' + expect(@subject.__proto__.evalModelHandle(@model, @optionsKey)).toEqual(@model.options) + it 'undefined model returns undefined', -> + expect(@subject.__proto__.evalModelHandle(undefined, @optionsKey)).toEqual(undefined) + + it 'modelKey of self returns model', -> + expect(@subject.__proto__.evalModelHandle(@model, 'self')).toEqual(@model) + it 'modelKey of undefined returns undefined', -> + expect(@subject.__proto__.evalModelHandle(@model, undefined)).toEqual(undefined) + + describe 'maybeSetScopeValue()', -> + beforeEach -> + @gSetterObj = gSetter: -> + spyOn(@gSetterObj,'gSetter') + @isInit = false + + + it 'oldModel undefined, isInit false - changes scope\'s models value, and calls gSetter ', -> + @subject.maybeSetScopeValue(gSetter: @gSetterObj.gSetter) + expect(@gSetterObj.gSetter).toHaveBeenCalled() + + describe 'destroy()', -> + it 'wipes internal scope', -> + @subject.destroy() + expect(@subject.scope.$$destroyed).toEqual(true) + + it 'wipes gObject', -> + @subject.destroy() + expect(@subject.gObject).toBeFalsy() + expect(@subject.gManager.gMarkers.length).toEqual(0) + + describe 'attaches to marker events', -> + it 'setEvents exists', -> + expect(@subject.setEvents).toBeDefined() + + it 'removeEvents exists', -> + expect(@subject.removeEvents).toBeDefined() diff --git a/spec/coffee/directives/api/models/child/window-child-model.spec.coffee b/spec/coffee/directives/api/models/child/window-child-model.spec.coffee new file mode 100644 index 000000000..173d019ea --- /dev/null +++ b/spec/coffee/directives/api/models/child/window-child-model.spec.coffee @@ -0,0 +1,48 @@ +###globals _,google### +describe 'uiGmapWindowChildModel', -> + beforeEach -> + + window['uiGmapInitiator'].initMock(@) + + if window.InfoBox + @infoBoxRealTemp = window.InfoBox + else + window.InfoBox = (opt_opts) -> + opt_opts = opt_opts ? {} + @boxClass_ = opt_opts.boxClass ? 'infoBox' + @content_ = opt_opts.content ? '' + @div_ = document.createElement('div') + @div_.className = @boxClass_ + + scope = + coords: + latitude: 90.0 + longitude: 89.0 + show: true + + @commonOpts = + position: new google.maps.LatLng(scope.coords.latitude, scope.coords.longitude) + @windowOpts = _.extend(@commonOpts, content: 'content') + @gMarker = new google.maps.Marker(@commonOpts) + #define / inject values into the item we are testing... not a controller but it allows us to inject + #constructor: (@model, @scope, @opts, @isIconVisibleOnClick, @mapCtrl, @markerScope, + #@element, @needToManualDestroy = false, @markerIsVisibleAfterWindowClose = true) -> + + @injects.push (uiGmapWindowChildModel) => + isIconVisibleOnClick = true + model = _.extend @scope, scope + mapCtrl = document.gMap + @gMarker + + @subject = + new uiGmapWindowChildModel { + model, + scope: @scope, opts: @windowOpts, + isIconVisibleOnClick, gMap: mapCtrl, + element: 'hi' + } + @injectAll() + + it 'can be created', -> + expect(@subject).toBeDefined() + expect(@subject.index).toEqual(@index) diff --git a/spec/coffee/directives/api/models/parent/i-marker-parent.spec.coffee b/spec/coffee/directives/api/models/parent/i-marker-parent.spec.coffee new file mode 100644 index 000000000..71d17c4ad --- /dev/null +++ b/spec/coffee/directives/api/models/parent/i-marker-parent.spec.coffee @@ -0,0 +1,63 @@ +describe 'uiGmapIMarkerParentModel', -> + beforeEach -> + angular.mock.module('uiGmapgoogle-maps.directives.api.models.parent') + + @clickCount = 0 + @html = '' + @injects.push ($http, $templateCache, $interpolate, uiGmapIMarkerParentModel) => + @attrs = {click: @click} + @IMarkerParentModel = uiGmapIMarkerParentModel + @scope.click = () => + @clickCount++ + + @injectAll() + + it 'should instantiate', -> + @scope.coords = { + latitude: 47, + longitude: -27 + } + subject = new @IMarkerParentModel(@scope, @ele, @attrs, null, @$timeout) + expect(subject?).toEqual(true) + + it 'should validate a scope correctly', -> + try + @subject = new @IMarkerParentModel(@scope, @ele, @attrs, null, @$timeout) + expect(false).toEqual(true) + catch e + expect(e).toEqual('Unable to construct IMarkerParentModel due to invalid scope') + + @scope.coords = { + latitude: 47, + longitude: -27 + } + @subject = new @IMarkerParentModel(@scope, @ele, @attrs, null, @$timeout) + expect(@subject.validateScope(@scope)).toEqual(true) + + it 'should call watch on timeout for correct properties', -> + props = [] + expectedProps = 'coords icon options'.split(' ') + @IMarkerParentModel.prototype.watch = (prop, scope) -> + props.push(prop) + + @scope.coords = { + latitude: 47, + longitude: -27 + } + + @subject = new @IMarkerParentModel(@scope, @ele, @attrs, null, @$timeout) + expect(props[i]).toEqual(prop) for prop, i in expectedProps + + describe 'IMarkerParentModel method tests', -> + beforeEach -> + @scope.coords = { + latitude: 47, + longitude: -27 + } + @subject = new @IMarkerParentModel(@scope, @ele, @attrs, null, @$timeout) + + it 'should throw onWatch', -> + expect(@subject.onWatch).not.toThrow() + + it 'should not throw onDestroy', -> + expect(@subject.onDestroy).not.toThrow() diff --git a/spec/coffee/directives/api/models/parent/layer-parent-model.spec.coffee b/spec/coffee/directives/api/models/parent/layer-parent-model.spec.coffee new file mode 100644 index 000000000..1cbe61b20 --- /dev/null +++ b/spec/coffee/directives/api/models/parent/layer-parent-model.spec.coffee @@ -0,0 +1,52 @@ +describe 'uiGmapLayerParentModelSpec', -> + beforeEach -> + module('uiGmapgoogle-maps.mocks') + angular.module('mockModule', ['uiGmapgoogle-maps']) + .value('mapCtrl', {}) + .value('element', {}) + .value('attrs', {}) + .value('model', {}) + .value('scope', @scope) + + module 'mockModule' + inject (GoogleApiMock) -> + mock = new GoogleApiMock() + mock.mockAPI() + + @scope = + options : + blah:true + $watch:()-> + $on:()-> + @attrs = + type:'testLayer' + options:'someBoundAttr' + self = @ + @setOpts + @tempMaps = google.maps + google.maps.testLayer = (opts) -> + self.setOpts = opts + setMap:()-> + + @mapCtrl = {} + + @timeout = (fnc,time) -> + fnc() + + inject ['$rootScope', 'uiGmapLayerParentModel', ($rootScope, LayerParentModel) => + scope = $rootScope.$new() + @constructor = LayerParentModel + @scope = _.extend @scope, scope + @subject = new @constructor(@scope,{},@attrs,@mapCtrl) + ] + + afterEach -> + google.map = @tempMaps + + it 'constructor is defined', -> + expect(@constructor).toBeDefined() + it 'subject is defined', -> + expect(@subject).toBeDefined() + + it 'options set', -> + expect(@setOpts.blah).toBe(@scope.options.blah) diff --git a/spec/coffee/directives/api/models/parent/map-type-parent-model.spec.coffee b/spec/coffee/directives/api/models/parent/map-type-parent-model.spec.coffee new file mode 100644 index 000000000..e592a30d2 --- /dev/null +++ b/spec/coffee/directives/api/models/parent/map-type-parent-model.spec.coffee @@ -0,0 +1,54 @@ +describe 'uiGmapMapTypeParentModelSpec', -> + beforeEach -> + + window['uiGmapInitiator'].initMock @, (apiMock) => + apiMock.mockAPI() + apiMock.mockMap() + @tempMaps = google.maps + google.maps.ImageMapType = (opts) => + @setOpts = opts + getTileUrl: -> + + spyOn(google.maps, 'ImageMapType').and.callThrough() + @mapCtrl = new window.google.maps.Map() + + angular.module('mockModule', ['uiGmapgoogle-maps', 'uiGmapgoogle-maps.mocks']) + .value('mapCtrl', {}) + .value('element', {}) + .value('attrs', {}) + .value('model', {}) + .value('scope', @scope) + + scope = + options: + blah: true + getTileUrl: -> + + $watch: -> + $on: -> + @attrs = + id: 'testmaptype' + options: 'someBoundAttr' + + + @timeout = (fnc, time) => + fnc() + + @injects.push (uiGmapMapTypeParentModel) => + @constructor = uiGmapMapTypeParentModel + _.extend @scope, scope + @subject = new @constructor(@scope, {}, @attrs, @mapCtrl) + + @injectAll() + + afterEach -> + google.maps = @tempMaps + + it 'constructor is defined', -> + expect(@constructor).toBeDefined() + it 'options set', -> + expect(@setOpts.blah).toBe(@scope.options.blah) + it 'subject is defined', -> + expect(@subject).toBeDefined() + it 'maptype is an ImageMapType instance if getTileUrl method is provided', -> + expect(google.maps.ImageMapType).toHaveBeenCalled() diff --git a/spec/coffee/directives/api/models/parent/map-types-parent-model.spec.coffee b/spec/coffee/directives/api/models/parent/map-types-parent-model.spec.coffee new file mode 100644 index 000000000..154be4755 --- /dev/null +++ b/spec/coffee/directives/api/models/parent/map-types-parent-model.spec.coffee @@ -0,0 +1,43 @@ +describe 'uiGmapMapTypesParentModelSpec', -> + beforeEach -> + + window['uiGmapInitiator'].initMock @, (apiMock) => + apiMock.mockAPI() + apiMock.mockMap() + @tempMaps = google.maps + @mapCtrl = new window.google.maps.Map() + + angular.module('mockModule', ['uiGmapgoogle-maps', 'uiGmapgoogle-maps.mocks']) + .value('mapCtrl', {}) + .value('element', {}) + .value('attrs', {}) + .value('model', {}) + .value('scope', @scope) + + scope = mapTypes: [ + { options: + getTileUrl: -> + visible: true } + { options: + getTileUrl: -> + visible: false } + ] + + @attrs = + options: 'options' + show: 'visible' + + @timeout = (fnc, time) => + fnc() + + @injects.push (uiGmapMapTypesParentModel) => + @constructor = uiGmapMapTypesParentModel + _.extend @scope, scope + @subject = new @constructor(@scope, {}, @attrs, @mapCtrl) + + @injectAll() + + it 'constructor is defined', -> + expect(@constructor).toBeDefined() + it 'subject is defined', -> + expect(@subject).toBeDefined() diff --git a/spec/coffee/directives/api/models/parent/markers-parent-model.spec.coffee b/spec/coffee/directives/api/models/parent/markers-parent-model.spec.coffee new file mode 100644 index 000000000..cb4976a2e --- /dev/null +++ b/spec/coffee/directives/api/models/parent/markers-parent-model.spec.coffee @@ -0,0 +1,110 @@ +# TODO: These tests are failing because something is not mocked correctly +# in the clusterermanager. Likely google.maps.overlayview. +describe 'MarkersParentModel - Clusterer Event Extensions', -> + afterEach -> + self.markerModelsCluster = undefined + beforeEach -> + @clusterTest = + getMarkers: -> + map = new PropMap() + map.push {key: 1} + map.push {key: 2} + map + + @index = 0 + @clicked = false + self = @ + @scope = + icon: 'icon.png' + coords: + latitude: 90 + longitude: 90 + events: + click: (marker, eventName, args) -> + self.clicked = true + self.gMarkerSetEvent = marker + clusterOptions: {} + clusterEvents: + click: (cluster, markerModelsCluster) -> + self.markerModelsCluster = markerModelsCluster + mouseout: (cluster, markerModelsCluster) -> + self.markerModelsCluster = markerModelsCluster + mouseover: (cluster, markerModelsCluster) -> + self.markerModelsCluster = markerModelsCluster + crap: -> + self.markerModelsCluster = 'crap' + doCluster: 'true' + models: [] + + #define / inject values into the item we are testing... not a controller but it allows us to inject + angular.module('mockModule', ['uiGmapgoogle-maps','uiGmapgoogle-maps.mocks']) + .value('map', document.gMap) + .value('element', {}) + .value('attrs', click: true) + .value('model', {}) + .value('scope', @scope) + + module 'mockModule' + window['uiGmapInitiator'].initMock(@) + + @injects.push (element, attrs, map, uiGmapMarkersParentModel, uiGmapGoogleMapsUtilV3,uiGmapExtendMarkerClusterer) => + uiGmapGoogleMapsUtilV3.init() + uiGmapExtendMarkerClusterer.init() + + @scope.options = + animation: google.maps.Animation.BOUNCE + @testCtor = uiGmapMarkersParentModel + + @subject = new @testCtor(@scope, element, attrs, map) + @subject + + @injectAll() + + it 'constructor exist', -> + expect(@testCtor).toBeDefined() + + it 'can be created', -> + expect(@subject).toBeDefined() + + it 'has plurals', -> + expect(@subject.plurals).toBeDefined() + + describe 'plurals reference stays the same', -> + it 'initially', -> + expect(@subject.plurals).toEqual(@subject.scope.plurals) + it 'post destruction', -> + @subject.onDestroy(@subject.scope) + expect(@subject.plurals).toEqual(@subject.scope.plurals) + + describe 'clusterEvents', -> + describe 'basic event handling', -> + describe 'is fired', -> + describe 'mapped extension', -> + it 'click - ', -> + @subject.plurals.put 1, model: 'test1' + @subject.plurals.put 2, model: 'test2' + @subject.scope.clusterEvents.click @clusterTest + expect(_.every(@markerModelsCluster, (entity, i) => + entity == @subject.plurals.get(i + 1).model + )).toBeTruthy() + it 'mouseout - ', -> + @subject.plurals.put 1, model: 'test1' + @subject.plurals.put 2, model: 'test2' + @subject.scope.clusterEvents.mouseout @clusterTest + expect(_.every(@markerModelsCluster, (entity, i) => + entity == @subject.plurals.get(i + 1).model + )).toBeTruthy() + it 'mouseover - ', -> + @subject.plurals.put 1, model: 'test1' + @subject.plurals.put 2, model: 'test2' + @subject.scope.clusterEvents.mouseover @clusterTest + expect(_.every(@markerModelsCluster, (entity, i) => + entity == @subject.plurals.get(i + 1).model + )).toBeTruthy() + describe 'some legacy event', -> + it 'crap - ', -> #not a real event but shows that any existing function can be fired + @subject.gManager.opt_events.crap() + expect(@markerModelsCluster).toBe('crap') + + describe 'not fired', -> + it 'click - ', -> diff --git a/spec/coffee/directives/api/models/parent/markers-parent.spec.coffee b/spec/coffee/directives/api/models/parent/markers-parent.spec.coffee new file mode 100644 index 000000000..eac76e7d0 --- /dev/null +++ b/spec/coffee/directives/api/models/parent/markers-parent.spec.coffee @@ -0,0 +1,224 @@ +xdescribe 'uiGmapMarkersParentModel', -> + beforeEach -> + angular.mock.module 'uiGmapgoogle-maps.directives.api.models.parent', ($provide) => + @provide = $provide + class MarkerManager + constructor: (args...) -> + @args = args + @constructed = true + @drawCalled = 0 + @clearCalled = 0 + @fitCalled = 0 + draw: () -> + @drawCalled++ + clear: () -> + @clearCalled++ + fit:() -> + @fitCalled++ + + class ClustererMarkerManager extends MarkerManager + constructor: (args...) -> + super(args) + @constructed = true + @childConstructed = true + + class MarkerChildModel + constructor: (@args...) -> + @constructed = true + + @clustererMarkerManager = ClustererMarkerManager + @markerManager = MarkerManager + @markerChildModel = MarkerChildModel + @provide.decorator 'uiGmapClustererMarkerManager', () => @clustererMarkerManager + @provide.decorator 'uiGmapMarkerManager', () => @markerManager + @provide.decorator 'uiGmapMarkerChildModel', () => @markerChildModel + + @clickCount = 0 + @html = '' + @injects.push ['$http', '$templateCache', '$interpolate', 'uiGmapMarkersParentModel', ( + $http, $templateCache, $interpolate, MarkersParentModel) => + @attrs = {click: @click} + @MarkersParentModel = MarkersParentModel + @scope.click = () => + @clickCount++ + ] + + @map = jasmine.createSpyObj('map') + @subject = new @MarkersParentModel(@scope, {}, @attrs, @map, @$timeout) + + it 'should instantiate', -> + expect(@subject?).toEqual(true) + + it 'should validate a scope correctly', -> + #XXX: Should this really validate as true if no models is set? + expect(@subject.validateScope(@scope)).toEqual(true) + @scope.models = [{ + latitude: 47, + longitude: -27 + }] + expect(@subject.validateScope(@scope)).toEqual(false) + @scope.coords = { + latitude: 47, + longitude: -27 + } + expect(@subject.validateScope(@scope)).toEqual(true) + + it 'should watch the appropriate properties on timeout', -> + props = [] + + @scope.$watch = (propName, func) -> + props.push(propName) + + spyOn(@subject, 'createMarkersFromScratch') + console.log @subject.createMarkersFromScratch + @subject.onTimeOut(@scope) + + expect(@subject.createMarkersFromScratch).toHaveBeenCalled() + + describe 'watch tests', -> + beforeEach -> + spyOn(@subject, 'reBuildMarkers') + spyOn(@subject, 'pieceMealMarkers') + @idKey = @subject.idKey + + it 'should watch rebuild markers and not change idKey', -> + @subject.onWatch('foo', @scope, 'baz', 'bar') + expect(@subject.idKey).toEqual(@idKey) + expect(@subject.pieceMealMarkers).not.toHaveBeenCalled() + expect(@subject.reBuildMarkers).toHaveBeenCalled() + + it 'should watch and rebuild markers, but change idKey', -> + @subject.onWatch('idKey', @scope, 'foo', @idKey) + expect(@subject.idKey).toEqual('foo') + expect(@subject.pieceMealMarkers).not.toHaveBeenCalled() + expect(@subject.reBuildMarkers).toHaveBeenCalled() + + it 'should watch and build piecemeal and not change idKey', -> + @subject.doRebuildAll = false + @subject.onWatch('foo', @scope, 'foo', @idKey) + expect(@subject.idKey).toEqual(@idKey) + expect(@subject.pieceMealMarkers).toHaveBeenCalled() + expect(@subject.reBuildMarkers).not.toHaveBeenCalled() + + it 'should watch and build piecemeal and change idKey', -> + @subject.doRebuildAll = false + @subject.onWatch('idKey', @scope, 'foo', @idKey) + expect(@subject.idKey).toEqual('foo') + expect(@subject.pieceMealMarkers).toHaveBeenCalled() + expect(@subject.reBuildMarkers).not.toHaveBeenCalled() + + #TODO: need to get some negative testing in here and validate parameters a bit more + describe 'createMarkers from scratch tests', -> + beforeEach -> + spyOn(@subject, 'newChildMarker') + # create a ClustererMarkerManager so that we fall into the else + @subject.gManager = new @clustererMarkerManager() + + it 'should call ClustererMarkerManager', -> + @scope.doCluster = true + @scope.clusterOptions = {} + @subject.createMarkersFromScratch(@scope) + expect(@subject.gManager.childConstructed).toEqual(true) + + it 'should call not call ClustererMarkerManager when markerManager is set and options are the same as scope options', -> + @scope.doCluster = true + @scope.clusterOptions = {} + @subject.gManager.opt_options = @scope.clusterOptions + # create a ClustererMarkerManager so that we fall into the else + # Set mock value to false, so we can verify if it gets called or not + @subject.gManager.childConstructed = false + @subject.createMarkersFromScratch(@scope) + expect(@subject.gManager.childConstructed).toEqual(false) + + it 'should call ClustererMarkerManager when markerManager is set and options options are not the same', -> + @scope.doCluster = true + @scope.clusterOptions = {} + # Set mock value to false, so we can verify if it gets called or not + @subject.gManager.childConstructed = false + @subject.createMarkersFromScratch(@scope) + expect(@subject.gManager.childConstructed).toEqual(true) + + it 'should call clustererMarkerManager when doCluster is true and no clusterOptions set', -> + @scope.doCluster = true + @subject.createMarkersFromScratch(@scope) + expect(@subject.gManager.childConstructed).toEqual(true) + expect(@subject.gManager.args.length).toEqual(1) + + it 'should call generic MarkerManager when no cluster options are set', -> + @subject.createMarkersFromScratch(@scope) + expect(@subject.gManager.childConstructed).toEqual(undefined) + + it 'should call newChildMarker for each model and fit should not be called', -> + @scope.models = [ + {}, {} + ] + @subject.createMarkersFromScratch(@scope) + expect(@subject.newChildMarker.calls.length).toEqual(2) + expect(@subject.gManager.fitCalled).toBe(0) + + #TODO: Should flesh out these tests a bit more so that the async loop is tested, right now _async is not very testable + # because the timeout is not able to made synchronous. Passing $timeout could fix this. + + describe 'Rebuild markers', -> + @beforeEach -> + spyOn(@subject, 'onDestroy') + spyOn(@subject, 'createMarkersFromScratch') + + it 'should return without doRebuild', -> + @scope.doRebuild = false + @subject.reBuildMarkers(@scope) + expect(@subject.onDestroy).not.toHaveBeenCalled() + + it 'should call on destroy and createMarkersFromScratch', -> + @subject.reBuildMarkers(@scope) + expect(@subject.onDestroy).toHaveBeenCalled() + expect(@subject.createMarkersFromScratch).toHaveBeenCalled() + + # TODO: This needs to be fleshed out significantly once _async.each is testable + describe 'pieceMealMarkers', -> + @beforeEach -> + spyOn(@subject, 'figureOutState') + spyOn(@subject, 'reBuildMarkers') + spyOn(@subject, 'newChildMarker') + + it 'should call reBuildMarkers', -> + @subject.pieceMealMarkers(@scope) + expect(@subject.reBuildMarkers).toHaveBeenCalled() + + it 'should call figureOutState', -> + @scope.models = [ + {} + ] + + # What is markerModels? + @scope.markerModels = [ + {} + ] + @subject.pieceMealMarkers(@scope) + expect(@subject.figureOutState).toHaveBeenCalled() + + describe 'newChildMarker', -> + it 'should return undefined, but call constructor', -> + expect(@subject.newChildMarker({}, @scope)).toEqual(undefined) + + it 'should return a new childMarker', -> + model = {} + model[@subject.idKey] = 'foo' + @scope.markerModels = {put :->} + spyOn(@scope.markerModels, 'put') + child = @subject.newChildMarker(model, @scope) + expect(child.constructed).toEqual(true) + expect(@scope.markerModels.put.calls[0].args[0]).toEqual('foo') + expect(@scope.markerModels.put.calls[0].args[1]).toEqual(child) + + #TODO: need to figure out what to test here, looks like some refactoring in the method + # is in order anyway, so won't put too much in here. + describe 'onDestroy', -> + it 'should succeed', -> + @subject.onDestroy(@scope) + + #TODO: This needs to be fleshed out a lot once _async is testable + describe 'fit', -> + it 'should succeed', -> + @subject.gManager = new @clustererMarkerManager() + @subject.gManager.fit() diff --git a/spec/coffee/directives/api/models/parent/polygons-parent-model.spec.coffee b/spec/coffee/directives/api/models/parent/polygons-parent-model.spec.coffee new file mode 100644 index 000000000..cf7dd26e9 --- /dev/null +++ b/spec/coffee/directives/api/models/parent/polygons-parent-model.spec.coffee @@ -0,0 +1,22 @@ +describe 'PolygonsParentModel', -> + beforeEach -> + #define / inject values into the item we are testing... not a controller but it allows us to inject + angular.mock.module('uiGmapgoogle-maps.directives.api.models.parent') + + window['uiGmapInitiator'].initMock(@) + + @injects.push (uiGmapPolygonsParentModel, uiGmapGoogleMapsUtilV3) => + uiGmapGoogleMapsUtilV3.init() + @testCtor = uiGmapPolygonsParentModel + @subject = new @testCtor(@scope, {}, {}, {}) + @subject + @injectAll() + + it 'constructor exist', -> + expect(@testCtor).toBeDefined() + + it 'can be created', -> + expect(@subject).toBeDefined() + + it 'has plurals', -> + expect(@subject.plurals).toBeDefined() diff --git a/spec/coffee/directives/api/models/parent/search-box-parent-model.spec.coffee b/spec/coffee/directives/api/models/parent/search-box-parent-model.spec.coffee new file mode 100644 index 000000000..4b0908a5e --- /dev/null +++ b/spec/coffee/directives/api/models/parent/search-box-parent-model.spec.coffee @@ -0,0 +1,36 @@ +describe "uiGmapSearchBoxParentModelSpec", -> + beforeEach -> + module("uiGmapgoogle-maps.mocks") + module('uiGmapgoogle-maps') + module("uiGmapgoogle-maps.directives.api.utils") + + inject ($templateCache) -> + $templateCache.put('searchbox.tpl.html', '') + + inject ['$rootScope', 'GoogleApiMock', '$compile', 'uiGmapSearchBoxParentModel', + ($rootScope, GoogleApiMock, $compile, SearchBoxParentModel) => + @rootScope = $rootScope + @apiMock = new GoogleApiMock() + @compile = $compile + @apiMock.mockAPI() + @apiMock.mockMap() + @apiMock.mockPlaces() + @apiMock.mockSearchBox() + @subject = SearchBoxParentModel + + ] + + it "should add a searchbox", -> + html = """ + + + + """ + scope = @rootScope.$new() + scope.map = {} + scope.map.zoom = 12 + scope.map.center = {longitude: 47, latitude: -27} + @compile(html)(scope) + + it "exists", -> + expect(@subject).toBeDefined() diff --git a/spec/coffee/directives/api/models/parent/windows-parent.spec.coffee b/spec/coffee/directives/api/models/parent/windows-parent.spec.coffee new file mode 100644 index 000000000..a9ccf9eef --- /dev/null +++ b/spec/coffee/directives/api/models/parent/windows-parent.spec.coffee @@ -0,0 +1,10 @@ +describe 'uiGmapWindowsParentModel', -> + beforeEach -> + angular.mock.module('mockModule', 'uiGmapgoogle-maps') + + inject ($rootScope, uiGmapWindowsParentModel) => + @scope = $rootScope.$new() + @subject = new uiGmapWindowsParentModel(@scope, {}, {}, {}) + + it 'has plurals', -> + expect(@subject.plurals).toBeDefined() diff --git a/spec/coffee/directives/api/options/marker-options.spec.coffee b/spec/coffee/directives/api/options/marker-options.spec.coffee new file mode 100644 index 000000000..4ab9ace94 --- /dev/null +++ b/spec/coffee/directives/api/options/marker-options.spec.coffee @@ -0,0 +1,38 @@ +describe 'marker-options', -> + beforeEach -> + module 'uiGmapgoogle-maps.directives.api.options' + module 'uiGmapgoogle-maps.mocks' + inject [ 'uiGmapMarkerOptions', 'GoogleApiMock', (@subject, GoogleApiMock) => + @gmap = new GoogleApiMock() + @gmap.mockAPI() + @gmap.mockMVCArray() + @gmap.mockPoint() + @gmap.mockLatLng() + @gmap.mockLatLngBounds() + ] + + + describe 'should create markers with correct scope', -> + it 'should create the correct scope on the marker', -> + latLng = {latitude: 1, longitude: 2} + options = {visible: true} + defaults = { + coords: latLng, + options: options + } + mOpts = @subject.createOptions latLng, undefined, defaults + expect(mOpts.visible).toEqual(defaults.options.visible) + options.visible = false + expect(mOpts.options.visible).toEqual(defaults.options.visible) + + it 'should respect changes to options', -> + latLng = {latitude: 1, longitude: 2} + options = {icon: 'icon'} + defaults = { + coords: latLng, + options: options + } + mOpts = @subject.createOptions latLng, options.icon, defaults + expect(mOpts.icon).toEqual(defaults.options.icon) + options.icon = 'foo' + expect(mOpts.options.icon).toEqual(defaults.options.icon) diff --git a/spec/coffee/directives/api/polygon.spec.coffee b/spec/coffee/directives/api/polygon.spec.coffee new file mode 100644 index 000000000..3c999e499 --- /dev/null +++ b/spec/coffee/directives/api/polygon.spec.coffee @@ -0,0 +1,107 @@ +describe "uiGmapPolygon", -> + beforeEach -> + window['uiGmapInitiator'].initDirective @, 'Polygon' + + @html = """ + + + + + """ + @scope = + map: + polygon: + events: + click: (p) -> + dblclick: (p) -> + mouseover: (p) -> + control: {} + polygons: [ + { + id: 1, + path: [ + { + latitude: 50, + longitude: -80 + }, + { + latitude: 30, + longitude: -120 + }, + { + latitude: 20, + longitude: -95 + } + ], + stroke: + color: '#6060FB', + weight: 3, + editable: true, + draggable: true, + geodesic: false, + visible: true, + fill: + color: '#ff0000', + opacity: 0.8 + } + ], + polygons2: [ + { + id: 1, + path: [ + { + latitude: 60, + longitude: -80 + }, + { + latitude: 40, + longitude: -120 + }, + { + latitude: 45, + longitude: -95 + } + ], + stroke: + color: '#33CDDC', + weight: 3, + editable: true, + draggable: true, + geodesic: false, + visible: true, + fill: + color: '#33CCCC', + opacity: 0.8 + } + ] + + @injectAll() + + + it "can be created", -> + expect(@subject).toBeDefined() + @log.error.calls.reset() + + it "created a single instance", (done) -> + + @digest => + @scope.map.polygon.control.promise.then => + expect(@scope.map.polygon.control.polygons.length).toBe(1) + done() + @digest() + + @log.error.calls.reset() + + it "created 3 listeners", (done) -> + + @digest() + @scope.map.polygon.control.promise.then => + expect(@scope.map.polygon.control.polygons[0].listeners.length).toBe 3 + done() + @digest() + @log.error.calls.reset() diff --git a/spec/coffee/directives/api/polyline.spec.coffee b/spec/coffee/directives/api/polyline.spec.coffee new file mode 100644 index 000000000..0c6c43373 --- /dev/null +++ b/spec/coffee/directives/api/polyline.spec.coffee @@ -0,0 +1,70 @@ +describe 'uiGmapPolyline', -> + Polyline = null + + beforeEach -> + + window['uiGmapInitiator'].initMock @, -> + Polyline = window.google.maps.Polyline + Polyline.resetInstances() + + @injects.push (uiGmapPolyline) => + @subject = uiGmapPolyline + + @injectAll() + + describe 'can create a polyline', -> + it 'from start', -> + @html = """ + + + + + """ + @scope.map = {} + @scope.map.zoom = 12 + @scope.map.center = {longitude: 47, latitude: -27} + @digest => + toPush = {} + toPush.id = 0 + toPush.path = [ + {latitude:47 + longitude: -27}, + {latitude:57 + longitude: -37} + ] + @scope.items = [toPush] + + + expect(Polyline.instances).toEqual(1) + + it 'from dynamic lazyUpdate', (done) -> + @html = """ + + + + + """ + @scope.map = {} + @scope.map.zoom = 12 + @scope.map.center = {longitude: 47, latitude: -27} + + toPush = {} + toPush.id = 0 + toPush.path = [ + {latitude:47 + longitude: -27}, + {latitude:57 + longitude: -37} + ] + @scope.items = [] + @digest => + @timeout => + @scope.items.push toPush + , 250 + @timeout -> + expect(Polyline.instances).toEqual(1) + done() + , 400 + + it 'exists', -> + expect(@subject).toBeDefined() diff --git a/spec/coffee/directives/api/street-view-panorama.spec.coffee b/spec/coffee/directives/api/street-view-panorama.spec.coffee new file mode 100644 index 000000000..9f9bf8ad2 --- /dev/null +++ b/spec/coffee/directives/api/street-view-panorama.spec.coffee @@ -0,0 +1,27 @@ +describe 'uiGmapStreetViewPanorama (directive creation)', -> + apiPromise = null + + beforeEach -> + @html = """ + + + """ + @focalCoord = + longitude: 47 + latitude: -27 + + window['uiGmapInitiator'].initMock(@) + @injects.push (uiGmapGoogleMapApi ) -> + apiPromise = uiGmapGoogleMapApi + + @injectAll() + + it 'created', (done) -> + _.extend @scope, + focalCoord: @focalCoord + control: {} + + @digest => + apiPromise.then => + expect(@scope.control.getGObject).toBeDefined() + done() diff --git a/spec/coffee/directives/api/utils/_async.spec.coffee b/spec/coffee/directives/api/utils/_async.spec.coffee new file mode 100644 index 000000000..2ca30842b --- /dev/null +++ b/spec/coffee/directives/api/utils/_async.spec.coffee @@ -0,0 +1,298 @@ +###global _:true,expect:true,### +describe "_async", -> + + beforeEach -> + + @injects.push (uiGmap_async) => + @subject = uiGmap_async + + @injectAll() + + afterEach -> + @subject = null + + describe 'getArrayAndKeys', -> + describe 'handles array', -> + it 'normal', (done) -> + testColl = [1,2,3] + @subject.getArrayAndKeys testColl, null, null, (array, keys) -> + expect(testColl).toEqual array + expect(keys).toBeFalsy() + done() + + describe 'handles object', -> + it 'normal', (done) -> + testColl = + 'one':1 + 'two':2 + 'three':3 + @subject.getArrayAndKeys testColl, null, (-> throw "bail"), (array, keys) -> + expect(['one','two','three']).toEqual array + expect(keys).toBeFalsy() + done() + + it 'came w keys', (done) -> + testColl = + '1':1 + '2':2 + '3':3 + @subject.getArrayAndKeys testColl, ['a','b','c'], (-> throw "bail"), (array, keys) -> + expect(['a','b','c']).toEqual array + expect(['a','b','c']).toEqual keys + done() + + describe "arrays", -> + + it "handle zero elements", (done) -> + @digest => + known = [] + test = [] + pauses = 0 + + @subject.each known, (num) -> + test.push(num) + , 100 + , -> + pauses++ + .then -> + expect(pauses).toEqual(0) + expect(test.length).toEqual(known.length) + expect(test).toEqual(known) + done() + + it "handle array of 101 outputs 101 elements equal to the original, with 1 pauses", (done) -> + @digest => + known = _.range(101) + test = [] + pauses = 1 + + @subject.each known, (num) -> + test.push(num) + , 100 + , -> + pauses++ + .then -> + expect(pauses).toEqual(2) + expect(test.length).toEqual(known.length) + expect(test).toEqual(known) + done() + + it "handle callback passes an index", (done) -> + @digest => + chunkHit = false + @subject.each [1], (thing, index) -> + chunkHit = true + expect(thing).toEqual 1 + expect(index).toEqual 0 + .then -> + expect(chunkHit).toBeTruthy() + done() + + it "handle array of 200 outputs 200 elements equal to the original, with 2 pauses", (done) -> + @digest => + known = _.range(200) + test = [] + pauses = 1 + + @subject.each known, (num) -> + test.push(num) + , 100 + , -> + pauses++ + .then -> + expect(pauses).toEqual(2) + expect(test.length).toEqual(known.length) + expect(test).toEqual(known) + done() + + it "handle array of 1000 outputs 1000 elements equal to the original, with 10 pauses", (done) -> + @digest => + known = _.range(1000) + test = [] + pauses = 1 + @subject.each known, (num) -> + test.push(num) + , 100 + , -> + pauses++ + .then -> + expect(test.length).toEqual(known.length) + expect(test).toEqual(known) + expect(pauses).toEqual(10) + done() + , 10 + + describe 'map', -> + it "handle 1000 outputs 1000 elements equal to the original, with 10 pauses", (done) -> + @digest => + known = _.range(1000) + test = [] + pauses = 1 + @subject.map known, (num) -> + num += 1 + "$#{num.toString()}" + , 100 + , -> + pauses++ + .then (mapped) -> + test = mapped + expect(test[999]).toEqual("$1000") + expect(test.length).toEqual(known.length) + expect(test).toEqual( + _.map known, (n) -> + n += 1 + "$#{n.toString()}" + ) + expect(pauses).toEqual(10) + done() + , 10 + + describe "no chunking / pauses", -> + it "range 101 zero pauses", (done) -> + @digest => + known = _.range(101) + test = [] + pauses = 0 + @subject.each(known, (num) -> + test.push(num) + , false #chunking + , -> + pauses++ + ).then -> + expect(pauses).toEqual(0) #it should not be hit + expect(test.length).toEqual(known.length) + expect(test).toEqual(known) + done() + + it 'prototypes should not be called', (done) -> + class Dummy + prop1: 'prop1' + prop2: 'prop2' + d = new Dummy() + d.prop3 = 'prop3' + + vals = [] + + @digest => + @subject.each d, (val) -> + vals.push val + , false #chunking + .then -> + expect(vals.length).toBe 1 + expect(vals[0]).toBe d.prop3 + done() + + + describe "Objects", -> + it "handle zero elements", (done) -> + @digest => + known = {} + test = [] + pauses = 0 + + @subject.each known, (num) -> + test.push(num) + , 100 + , -> + pauses++ + .then -> + expect(pauses).toEqual(0) + vals = _.values(_.omit known, 'length') + expect(test.length).toEqual(vals.length) + expect(test).toEqual(vals) + done() + + it "101 outputs 101 elements equal to the original, with 1 pauses", (done) -> + @digest => + known = {} + known[num] = num for num in [0..100] + # known.length = _.values(known).length + test = [] + pauses = 1 + + @subject.each known, (num) -> + test.push(num) + , 100 + , -> + pauses++ + .then -> + expect(pauses).toEqual(2) + vals = _.values(_.omit known, 'length') + expect(test.length).toEqual(vals.length) + expect(test).toEqual(vals) + done() + + it "handle 1000 outputs 1000 elements equal to the original, with 10 pauses", (done) -> + @digest => + known = {} + known[num] = num for num in [0..999] + known.length = _.values(known).length + test = [] + pauses = 1 + @subject.each known, (num) -> + test.push(num) + , 100 + , -> + pauses++ + .then -> + vals = _.values(_.omit known, 'length') + expect(test.length).toEqual(vals.length) + expect(test).toEqual(vals) + expect(pauses).toEqual(10) + done() + , 10 + + describe 'map', -> + it "handle 1000 outputs 1000 elements equal to the original, with 10 pauses", (done) -> + @digest => + known = {} + known[num] = num for num in [0..999] + test = [] + pauses = 1 + @subject.map known, (num) -> + num += 1 + "$#{num.toString()}" + , 100 + , -> + pauses++ + .then (mapped) -> + test = mapped + expect(test[999]).toEqual("$1000") + vals = _.values(_.omit known, 'length') + expect(test.length).toEqual(vals.length) + expect(test).toEqual( + _.map vals, (n) -> + n += 1 + "$#{n.toString()}" + ) + expect(pauses).toEqual(10) + done() + , 10 + + describe 'chunkSizeFrom', -> + it 'undefined returns undefined', -> + expect(@subject.chunkSizeFrom(undefined)).toBeFalsy() + #note this allows chunkSize to default to a chunk of 20 or some chunk + #if it returns false then chunking is disabled by default on plurals + expect(@subject.chunkSizeFrom(undefined) == undefined).toBeTruthy() + + it 'false returns false', -> + expect(@subject.chunkSizeFrom(false)).toBeFalsy() + expect(@subject.chunkSizeFrom(false) == false).toBeTruthy() + + it 'NO returns false', -> + expect(@subject.chunkSizeFrom('NO')).toBeFalsy() + expect(@subject.chunkSizeFrom('NO') == false).toBeTruthy() + + it 'FALSE returns false', -> + expect(@subject.chunkSizeFrom('FALSE')).toBeFalsy() + expect(@subject.chunkSizeFrom('FALSE') == false).toBeTruthy() + + it 'number returns number', -> + expect(@subject.chunkSizeFrom(300)).toBe(300) + + it 'string number returns undefined', -> + expect(@subject.chunkSizeFrom('300')).toBeUndefined() + + it 'non number returns undefined', -> + expect(@subject.chunkSizeFrom('3-00')).toBeUndefined() diff --git a/spec/coffee/directives/api/utils/base-object.spec.coffee b/spec/coffee/directives/api/utils/base-object.spec.coffee new file mode 100644 index 000000000..54256cdc2 --- /dev/null +++ b/spec/coffee/directives/api/utils/base-object.spec.coffee @@ -0,0 +1,50 @@ +describe 'oo.BaseObject', -> + beforeEach -> + module 'uiGmapgoogle-maps.directives.api.utils' + inject ['uiGmapBaseObject', (BaseObject) => + @subject = BaseObject + PersonModule = + changePersonName: (person, name) -> + person.name = name + person + killPersonsName: (person) -> + delete person.name + person + PersonAttributes = + p_name: 'no_name' + state: 'no_state' + @PersonAttributes = PersonAttributes + class Person extends BaseObject + @include PersonModule + @extend PersonAttributes + constructor: (name, state) -> + @name = if name? then name else Person.p_name + @state = if state? then state else Person.state + @name = 'nick' + @state = 'fl' + @defaultUsage = new Person() + @usage = new Person(@name, @state) + ] + + it 'exists ~ you loaded the script!', -> + expect(@subject?).toEqual(true) + + describe 'include specs', -> + it 'defaults attributes exist', -> + expect(@defaultUsage.name?).toEqual(true) + expect(@defaultUsage.name?).toEqual(true) + it 'defaults attributes are correct', -> + expect(@defaultUsage.name).toEqual(@PersonAttributes.p_name) + expect(@defaultUsage.state).toEqual(@PersonAttributes.state) + it 'subject attributes are correct ', -> + expect(@usage.name).toEqual(@name) + expect(@usage.state).toEqual(@state) + describe 'extend specs', -> + it 'defaults functions exist', -> + expect(@defaultUsage.changePersonName?).toEqual(true) + expect(@defaultUsage.killPersonsName?).toEqual(true) + it 'subject functions act correctly', -> + p = @defaultUsage.changePersonName(angular.copy(@defaultUsage), 'john') + p2 = @defaultUsage.killPersonsName(@defaultUsage) + expect(p.name).toEqual('john') + expect(p2.name).toEqual(undefined) diff --git a/spec/coffee/directives/api/utils/events-helper.spec.coffee b/spec/coffee/directives/api/utils/events-helper.spec.coffee new file mode 100644 index 000000000..e4248f781 --- /dev/null +++ b/spec/coffee/directives/api/utils/events-helper.spec.coffee @@ -0,0 +1,40 @@ +describe 'uiGmapEventsHelper', -> + scope = null + beforeEach -> + module 'uiGmapgoogle-maps.directives.api.utils' + module 'uiGmapgoogle-maps.mocks' + @injects.push ['uiGmapEventsHelper', 'GoogleApiMock', (EventsHelper, GoogleApiMock) => + @subject = EventsHelper + @gmap = new GoogleApiMock() + @gmap.mockAPI() + @listeners = @gmap.mockEvent() + ] + @injectAll() + + scope = + events: + click: -> + $evalAsync: (arg) -> + return + it 'exists', -> + expect(@subject).toBeDefined() + + describe 'setEvents', -> + it 'function exists', -> + expect(@subject.setEvents).toBeDefined() + + it 'add events', -> + spyOn scope.events, 'click' + @subject.setEvents @, scope, 'model' + window.google.maps.event.fireListener @, 'click' + expect(scope.events.click).toHaveBeenCalled() + + describe 'removeEvents', -> + it 'function exists', -> + expect(@subject.removeEvents).toBeDefined() + + it 'removes the listeners', -> + @subject.setEvents @, scope, 'model' + expect(@listeners.length).toBe(1) + @subject.removeEvents @listeners + expect(@listeners.length).toBe(0) diff --git a/spec/coffee/directives/api/utils/gmap-util.spec.coffee b/spec/coffee/directives/api/utils/gmap-util.spec.coffee new file mode 100644 index 000000000..09cc9e779 --- /dev/null +++ b/spec/coffee/directives/api/utils/gmap-util.spec.coffee @@ -0,0 +1,187 @@ +describe 'utils.gmap-util', -> + beforeEach -> + module 'uiGmapgoogle-maps.directives.api.utils' + module 'uiGmapgoogle-maps.mocks' + inject [ 'uiGmapGmapUtil', 'GoogleApiMock', (GmapUtil, GoogleApiMock) => + @subject = GmapUtil + @gmap = new GoogleApiMock() + @gmap.mockAPI() + @gmap.mockMVCArray() + @gmap.mockPoint() + @gmap.mockLatLng() + @gmap.mockLatLngBounds() + ] + + describe 'should validate the path correctly', -> + it 'latlong', -> + latlong = {longitude: 45, latitude: -27} + expect(@subject.validatePath([latlong, latlong])).toEqual(true) + expect(@subject.validatePath([latlong])).toEqual(false) + it 'empty array', -> + expect(@subject.validatePath([])).toEqual(false) + it 'array of invalid objects', -> + expect(@subject.validatePath([ + {}, + {} + ])).toEqual(false) + it 'Polygon', -> + expect(@subject.validatePath({type: 'Polygon'})).toEqual(false) + expect(@subject.validatePath({type: 'Polygon', coordinates: [[1, 2] for [1..4]]})).toEqual(true) + expect(@subject.validatePath({type: 'Polygon', coordinates: [[1, 2] for [1..1]]})).toEqual(false) + it 'Polygon', -> + expect(@subject.validatePath({type: 'LineString', coordinates: [1, 2] for [1..2]})).toEqual(true) + expect(@subject.validatePath({type: 'LineString', coordinates: [1, 2] for [1..1]})).toEqual(false) + expect(@subject.validatePath({type: 'LineString', coordinates: [] for [1..2]})).toEqual(false) + it 'foo', -> + expect(@subject.validatePath({type: 'foo', coordinates: []})).toEqual(false) + + + describe 'should validate coordinates correctly', -> + it 'basic', -> + expect(@subject.validateCoords()).toEqual(false) + expect(@subject.validateCoords([1, 2])).toEqual(true) + expect(@subject.validateCoords([])).toEqual(false) + + it 'type:Point', -> + expect(@subject.validateCoords({type: 'Point', coordinates: [1, 2]})).toEqual(true) + expect(@subject.validateCoords({type: 'Point', coordinates: []})).toEqual(false) + it 'type:foo, no lat lon', -> + expect(@subject.validateCoords({type: 'foo', coordinates: []})).toEqual(false) + it 'type:foo, w lat lon', -> + expect(@subject.validateCoords( type: 'foo', latitude: 45, longitude:150 )).toEqual true + + describe 'should evaluate truthiness correctly', -> + it 'true', -> + expect(@subject.isTrue(true)).toEqual(true) + it '"true"', -> + expect(@subject.isTrue('true')).toEqual(true) + it '1', -> + expect(@subject.isTrue(1)).toEqual(true) + it '"TRUE"', -> + expect(@subject.isTrue("TRUE")).toEqual(true) + it '"y"', -> + expect(@subject.isTrue('y')).toEqual(true) + it 'undefined', -> + expect(@subject.isTrue()).toEqual(false) + it 'null', -> + expect(@subject.isTrue(null)).toEqual(false) + #falses to be false + it '"false"', -> + expect(@subject.isTrue('false')).toEqual(false) + it '"FALSE"', -> + expect(@subject.isTrue('FALSE')).toEqual(false) + it '0', -> + expect(@subject.isTrue(0)).toEqual(false) + it '"n"', -> + expect(@subject.isTrue('n')).toEqual(false) + it '"N"', -> + expect(@subject.isTrue('N')).toEqual(false) + it '"no"', -> + expect(@subject.isTrue('no')).toEqual(false) + it '"NO"', -> + expect(@subject.isTrue('NO')).toEqual(false) + it 'false', -> + expect(@subject.isTrue(false)).toEqual(false) + + describe 'should evaluate false correctly', -> + it '"false"', -> + expect(@subject.isFalse('false')).toEqual(true) + it '"FALSE"', -> + expect(@subject.isFalse('FALSE')).toEqual(true) + it '0', -> + expect(@subject.isFalse(0)).toEqual(true) + it '"n"', -> + expect(@subject.isFalse('n')).toEqual(true) + it '"N"', -> + expect(@subject.isFalse('N')).toEqual(true) + it '"no"', -> + expect(@subject.isFalse('no')).toEqual(true) + it '"NO"', -> + expect(@subject.isFalse('NO')).toEqual(true) + it 'false', -> + expect(@subject.isFalse(false)).toEqual(true) + #expect truthies to be false + it 'true', -> + expect(@subject.isFalse(true)).toEqual(false) + it '"true"', -> + expect(@subject.isFalse('true')).toEqual(false) + it '1', -> + expect(@subject.isFalse(1)).toEqual(false) + it '"TRUE"', -> + expect(@subject.isFalse("TRUE")).toEqual(false) + it '"y"', -> + expect(@subject.isFalse('y')).toEqual(false) + #expect null and undefined + it 'undefined', -> + expect(@subject.isFalse()).toEqual(false) + it 'null', -> + expect(@subject.isFalse(null)).toEqual(false) + + describe 'should evaluate falsiness correctly', -> + it '"false"', -> + expect(@subject.isFalsy('false')).toEqual(true) + it '"FALSE"', -> + expect(@subject.isFalsy('FALSE')).toEqual(true) + it '0', -> + expect(@subject.isFalsy(0)).toEqual(true) + it '"n"', -> + expect(@subject.isFalsy('n')).toEqual(true) + it '"N"', -> + expect(@subject.isFalsy('N')).toEqual(true) + it '"no"', -> + expect(@subject.isFalsy('no')).toEqual(true) + it '"NO"', -> + expect(@subject.isFalsy('NO')).toEqual(true) + it 'false', -> + expect(@subject.isFalsy(false)).toEqual(true) + #expect truthies to be false + it 'true', -> + expect(@subject.isFalsy(true)).toEqual(false) + it '"true"', -> + expect(@subject.isFalsy('true')).toEqual(false) + it '1', -> + expect(@subject.isFalsy(1)).toEqual(false) + it '"TRUE"', -> + expect(@subject.isFalsy("TRUE")).toEqual(false) + it '"y"', -> + expect(@subject.isFalsy('y')).toEqual(false) + #expect null and undefined + it 'undefined', -> + expect(@subject.isFalsy()).toEqual(true) + it 'null', -> + expect(@subject.isFalsy(null)).toEqual(true) + + + it 'should convert path points correctly', -> + latlong = {longitude: 45, latitude: -27} + expect(@subject.convertPathPoints([]).getLength()).toEqual(0) + expect(@subject.convertPathPoints([latlong]).getLength()).toEqual(1) + expect(@subject.convertPathPoints({type: 'Polygon', coordinates: [[1, 2] for [1..4]]}).getLength()).toEqual(4) + expect(@subject.convertPathPoints({type: 'LineString', coordinates: [1, 2] for [1..4]}).getLength()).toEqual(4) + + it '(getLabelPositionPoint) should convert decimal coordinates separated by a space into a map Point object', -> + testCases = [ + { input: '22 0', expected: { x: 22, y: 0 } } + { input: '1 2', expected: { x: 1, y: 2 } } + { input: '1.0 2.3', expected: { x: 1.0, y: 2.3 } } + { input: '-1 -2', expected: { x: -1, y: -2 } } + ] + testCases.forEach (testCase ) => + result = @subject.getLabelPositionPoint(testCase.input) + expect(result.x).toEqual(testCase.expected.x) + expect(result.y).toEqual(testCase.expected.y) + + it '(getLabelPositionPoint) should ignore coordinate strings not following the format', -> + testCases = [ + ' 1 2 ' + 'a b' + '1,2' + ] + testCases.forEach (testCase) => + @subject.getLabelPositionPoint(testCase.input) + + it 'should correctly fetch object values using dot-notation', -> + object = { foo: { sea: 'hawks' }} + expect(@subject.getPath(object, 'foo.sea')).toEqual('hawks') + expect(@subject.getPath(object, 'foo.sea.birds')).toEqual(undefined) + expect(@subject.getPath(object, 'boo.hoo')).toEqual(undefined) diff --git a/spec/coffee/directives/api/utils/model-key.spec.coffee b/spec/coffee/directives/api/utils/model-key.spec.coffee new file mode 100644 index 000000000..70d4fc42c --- /dev/null +++ b/spec/coffee/directives/api/utils/model-key.spec.coffee @@ -0,0 +1,79 @@ +###global angular:true, inject:true, expect: true ### +describe 'ModelKey Tests', -> + beforeEach -> + angular.mock.module('uiGmapgoogle-maps.directives.api.utils') + inject [ '$rootScope', 'uiGmapModelKey', ($rootScope, ModelKey) => + @scope = $rootScope.$new() + @subject = new ModelKey(@scope) + ] + + it 'should eval model handle correctly', -> + model = {key: 'key', sub: { foo: 'bar' }} + expect(@subject.evalModelHandle()).toEqual(undefined) + expect(@subject.evalModelHandle(model, 'self')).toEqual(model) + expect(@subject.evalModelHandle(model, 'key')).toEqual('key') + expect(@subject.evalModelHandle(model, 'foo')).toEqual(undefined) + expect(@subject.evalModelHandle(model, 'sub.foo')).toEqual('bar') + + describe 'should properly compare models', -> + beforeEach -> + @model1 = {coords: {latitude: 41, longitude: -27}} + @model2 = {coords: {latitude: 40, longitude: -27}} + @model3 = {coords: { type: 'Point', coordinates: [ -27, 40 ] }} + @model4 = {options: {animation: 2, visible: true}, coords: {latitude: 41, longitude: -27}} + @model5 = {options: {animation: 2, visible: true}, coords: {latitude: 41, longitude: -27}} + @model6 = {options: {animation: 2, visible: false}, coords: {latitude: 41, longitude: -27}} + @subject.interface.scopeKeys = ['coords','options'] + delete @scope.coords + delete @scope.options + delete @scope.deepComparison + + it 'throws with no scope', -> + expect(@subject.modelKeyComparison).toThrow('No scope set!') + + it 'model1 to model1 is same', -> + @scope.coords = 'coords' + expect(@subject.modelKeyComparison(@model1, @model1)) + .toEqual(true) + + it 'model1 to model2 is diff', -> + @scope.coords = 'coords' + expect(@subject.modelKeyComparison(@model1, @model2)) + .toEqual(false) + + it 'model2 to model3 is same by values', -> + @scope.coords = 'coords' + expect(@subject.modelKeyComparison(@model2, @model3)) + .toEqual(true) + + it 'model4 to model5 with options is same by values with deepComparison', -> + @scope.coords = 'coords' + @scope.options = 'options' + @scope.deepComparison = true + expect(@subject.modelKeyComparison(@model4, @model5)) + .toEqual(true) + + it 'model4 to model5 with options is diff without deepComparison', -> + @scope.coords = 'coords' + @scope.options = 'options' + expect(@subject.modelKeyComparison(@model4, @model5)) + .toEqual(false) + + it 'model4 to model6 with different options is diff with deepComparison', -> + @scope.coords = 'coords' + @scope.options = 'options' + @scope.deepComparison = true + expect(@subject.modelKeyComparison(@model4, @model6)) + .toEqual(false) + + it 'model4 to model6 with different options is diff without deepComparison', -> + @scope.coords = 'coords' + @scope.options = 'options' + expect(@subject.modelKeyComparison(@model4, @model6)) + .toEqual(false) + + it 'should properly set id key', -> + expect(@subject.idKey).toEqual(undefined) + expect(@subject.setIdKey(@scope)).toEqual('id') + @scope.idKey = 'foo' + expect(@subject.setIdKey(@scope)).toEqual('foo') diff --git a/spec/coffee/directives/api/utils/promise.spec.coffee b/spec/coffee/directives/api/utils/promise.spec.coffee new file mode 100644 index 000000000..7b79561fd --- /dev/null +++ b/spec/coffee/directives/api/utils/promise.spec.coffee @@ -0,0 +1,95 @@ +describe 'uiGmapPromise', -> + rootScope = null + timeout = null + q = null + + digest = (fn, times = 1) => + fn() + if times + _.range(times).forEach -> # i would like to say that it sucks that I have to do this.. (angular) + timeout?.flush() + rootScope?.$apply() + + beforeEach -> + module 'uiGmapgoogle-maps' + inject (_$rootScope_, $timeout, uiGmapPromise, $q) => + q = $q + rootScope = _$rootScope_ + timeout = $timeout + @subject = uiGmapPromise + + afterEach -> + rootScope = null + @subject = null + + it 'exists', -> + expect(@subject).toBeDefined() + + it 'resolves immediately', (done) -> + digest => + @subject.resolve().then -> + done() + + describe 'ExposedPromise', -> + describe 'can be notified', -> + it 'from wrapped', (done) -> + d = q.defer() + promise = d.promise + + digest => + cPromise = @subject.ExposedPromise promise + + cPromise.then (->), (->), + (notifyMsg) -> + done() + expect(notifyMsg).toBe('test') + cPromise.notify 'test' + , false + + it 'from original', (done) -> + d = q.defer() + promise = d.promise + + digest => + cPromise = @subject.ExposedPromise promise + + cPromise.then (->), (->), + (notifyMsg) -> + done() + expect(notifyMsg).toBe('test') + d.notify 'test' + , false + + + it 'can be canceled', (done) -> + d = q.defer() + promise = d.promise + cPromise = null + + digest => + cPromise = @subject.ExposedPromise promise + + cPromise.cancel 'blah' + cPromise + .catch (notifyMsg) -> + expect(notifyMsg).toBe 'blah' + done() + + # d.notify('test') + , false + + it 'original promise resolves combined', (done) -> + d = q.defer() + promise = d.promise + cPromise = null + digest => + cPromise = @subject.ExposedPromise promise + + d.resolve('winning') + + cPromise + .then (msg) -> + expect(msg).toBe 'winning' + done() + + , false \ No newline at end of file diff --git a/spec/coffee/directives/api/utils/prop-map.spec.coffee b/spec/coffee/directives/api/utils/prop-map.spec.coffee new file mode 100644 index 000000000..7f0014a48 --- /dev/null +++ b/spec/coffee/directives/api/utils/prop-map.spec.coffee @@ -0,0 +1,62 @@ +describe 'PropMap tests', -> + beforeEach -> + angular.mock.module('uiGmapgoogle-maps.directives.api.models.parent') + inject [ 'uiGmapPropMap',(PropMap) => + @PropMap = PropMap + ] + + it 'should construct', -> + propMap = new @PropMap() + expect(propMap?).toEqual(true) + + describe 'PropMap method tests', -> + beforeEach -> + @propMap = new @PropMap() + + it 'should have initial length 0', -> + expect(@propMap.length).toEqual(0) + + it 'should return undefined initially', -> + expect(@propMap.get('foo')).toEqual(undefined) + + it 'should return what is put', -> + @propMap.put('foo', 'bar') + expect(@propMap.get('foo')).toEqual('bar') + + it 'should remove and reflect length', -> + @propMap.put('foo', 'bar') + expect(@propMap.length).toEqual(1) + @propMap.remove('foo') + expect(@propMap.get('foo')).toEqual(undefined) + expect(@propMap.length).toEqual(0) + + it 'should remove and tracked length should match real length', -> + @propMap.put('foo', 'bar') + expect(@propMap.length).toEqual(1) + expect(_.values(@propMap.dict).length).toEqual(@propMap.length) + @propMap.remove('foo') + expect(_.values(@propMap.dict).length).toEqual(@propMap.length) + + it 'should return all put values', -> + @propMap.put('foo', 'bar') + @propMap.put('baz', 'biz') + values = @propMap.values() + expected = ['bar', 'biz'] + expect(values[i]).toEqual(item) for item, i in expected + + it 'should return all put keys', -> + @propMap.put('foo', 'bar') + @propMap.put('baz', 'biz') + keys = @propMap.keys() + # console.log keys + expected = ['foo', 'baz'] + expect(keys[i]).toEqual(item) for item, i in expected + + it 'map works', -> + @propMap.put('foo', 'bar') + @propMap.put('biz', 'biz') + mapped = @propMap.map (v) -> + v + 'BAR' + expected = ['barBAR', 'bizBAR'] + expected.forEach (item, i) -> + expect(mapped[i]).toBe(item) diff --git a/spec/coffee/directives/api/window.spec.coffee b/spec/coffee/directives/api/window.spec.coffee new file mode 100644 index 000000000..7b2051b8c --- /dev/null +++ b/spec/coffee/directives/api/window.spec.coffee @@ -0,0 +1,76 @@ +describe "uiGmapWindow", -> + beforeEach -> + window['uiGmapInitiator'].initMock(@) + @mocks = + scope: + coords: + latitude: 90.0 + longitude: 89.0 + show: true + $watch:()-> + $on:()-> + control: {} + $evalAsync: (fn) -> + fn() + element: + html: -> + "

test html

" + attrs: { + isiconvisibleonclick:true + } + ctrls: [{getMap: -> {}}] + @gmap = {} + @injects.push ['$http', '$templateCache', 'uiGmapExtendGWin', 'uiGmapWindow', + ($http, $templateCache, ExtendGWin, Window) => + ExtendGWin.init() + d = @q.defer() + d.resolve @gmap + + @rootScope.deferred = d + @mocks.ctrls[0].getScope = => + @rootScope + @windowScope = _.extend @rootScope.$new(), @mocks.scope + + @subject = new Window() + @subject.onChildCreation = (child) => + @childWindow = child + + @prom = d.promise + ] + @injectAll() + + it "should test receive the fulfilled promise!!", -> + result = undefined + @prom.then (returnFromPromise) -> + result = returnFromPromise + @digest -> + expect(result).toBe @gmap + + it 'can be created', -> + expect(@subject).toBeDefined() +# expect(@subject.index).toEqual(@index) + + it 'link creates window options and a childWindow', -> + + @subject.link(@windowScope, @mocks.element, @mocks.attrs, @mocks.ctrls) + crap = null + @prom.then -> + crap = "set" + @digest -> + expect(crap).toBe 'set' + expect(@childWindow).toBeDefined() + expect(@childWindow.opts).toBeDefined() + + it 'slaps control functions when a control is available', -> + @subject.link(@mocks.scope, @mocks.element, @mocks.attrs, @mocks.ctrls) + @digest -> + expect(@mocks.scope.control.getChildWindows).toBeDefined() + expect(@mocks.scope.control.getGWindows).toBeDefined() + + it 'control functions work', -> + @subject.link(@mocks.scope, @mocks.element, @mocks.attrs, @mocks.ctrls) + @digest -> + expect(@mocks.scope.control.getChildWindows).toBeDefined() + expect(@mocks.scope.control.getChildWindows().length).toBe(1) + expect(@mocks.scope.control.getChildWindows()[0]).toEqual(@childWindow) + expect(@mocks.scope.control.getGWindows()[0]).toEqual(@childWindow.gObject) diff --git a/spec/coffee/helpers/helper.mockEvents.spec.coffee b/spec/coffee/helpers/helper.mockEvents.spec.coffee new file mode 100644 index 000000000..367f87621 --- /dev/null +++ b/spec/coffee/helpers/helper.mockEvents.spec.coffee @@ -0,0 +1,54 @@ +describe 'Events Mock', -> + subject = null + afterEach -> + google.maps.event.clearListeners() + beforeEach -> + window['uiGmapInitiator'].initMock @, (apiMock) -> + subject = apiMock.getPolyline() + subject.resetInstances() + + @injectAll() + + it 'exists', -> + expect(window.google.maps.event).toBeDefined() + + describe 'flatten', -> + it 'can add a few events and they all are flattened', -> + obj = {} + expectedEvents = [ + 'click' + 'mouseover' + 'mousedown' + ] + expectedEvents.forEach (e) -> + google.maps.event.addListener obj, e, -> + + actualEvents = window.google.maps.event.normalizedEvents() + + expectedEvents.forEach (e) -> + expect(actualEvents).toContain e + + it 'two individul object listeners', -> + obj = {} + obj2 = {} + expectedEvents = [ + 'click' + 'mouseover' + 'mousedown' + ] + expectedEvents2 = [ + 'lol' + 'crap' + 'ROFL' + ] + expectedEvents.forEach (e) -> + google.maps.event.addListener obj, e, -> + + expectedEvents2.forEach (e) -> + google.maps.event.addListener obj2, e, -> + + actualEvents = window.google.maps.event.normalizedEvents() + + expectedEvents + .concat(expectedEvents2).forEach (e) -> + expect(actualEvents).toContain e diff --git a/spec/coffee/helpers/helper.polyline.spec.coffee b/spec/coffee/helpers/helper.polyline.spec.coffee new file mode 100644 index 000000000..d4a76f5f2 --- /dev/null +++ b/spec/coffee/helpers/helper.polyline.spec.coffee @@ -0,0 +1,16 @@ +describe 'Polyline Mock', -> + subject = null + beforeEach -> + module "uiGmapgoogle-maps.mocks" + inject (GoogleApiMock) -> + apiMock = new GoogleApiMock() + subject = apiMock.getPolyline() + subject.resetInstances() + + it 'constructor exists', -> + expect(subject).toBeDefined() + + it 'can create exists', -> + poly = new subject() + expect(poly).toBeDefined() + expect(subject.instances).toBe(1) diff --git a/spec/coffee/providers/google-map-api-provider.spec.coffee b/spec/coffee/providers/google-map-api-provider.spec.coffee new file mode 100644 index 000000000..efaa22a4c --- /dev/null +++ b/spec/coffee/providers/google-map-api-provider.spec.coffee @@ -0,0 +1,73 @@ +describe 'uiGmapGoogleMapApiProvider', -> + mapScriptLoader = null + mapScriptManualLoader = null + + beforeEach -> + angular.module('mockModule', ['uiGmapgoogle-maps']).config( + ['uiGmapGoogleMapApiProvider', + (GoogleMapApi) -> + GoogleMapApi.configure({ + china: true + }) + ] + ) + module('uiGmapgoogle-maps', 'mockModule') + inject ($injector) -> + mapScriptLoader = $injector.get 'uiGmapMapScriptLoader' + mapScriptManualLoader = $injector.get 'uiGmapGoogleMapApiManualLoader' + + window.google = undefined + + + it 'uses maps.google.cn when in china', -> + options = { china: true, v: '3.17', libraries: '', language: 'en' } + mapScriptLoader.load(options) + lastScriptIndex = document.head.getElementsByTagName('script').length - 1 + expect(document.head.getElementsByTagName('script')[lastScriptIndex].src).toContain('http://maps.google.cn/maps/api/js') + + describe 'on Cordova devices', -> + beforeAll -> + window.navigator.connection = {} + window.Connection = + WIFI: 'wifi' + NONE: 'none' + + afterAll -> delete window.navigator.connection + + it 'should include the script when the device is online', -> + window.navigator.connection.type = window.Connection.WIFI + + options = { v: '3.17', libraries: '', language: 'en', device: 'online' } + mapScriptLoader.load(options) + + lastScriptIndex = document.head.getElementsByTagName('script').length - 1 + expect(document.head.getElementsByTagName('script')[lastScriptIndex].src).toContain('device=online') + + it 'should wait for the online event to include the script when the device is offline', -> + window.navigator.connection.type = window.Connection.NONE + + options = { v: '3.17', libraries: '', language: 'en', device: 'offline' } + mapScriptLoader.load(options) + lastScriptIndex = document.head.getElementsByTagName('script').length - 1 + expect(document.head.getElementsByTagName('script')[lastScriptIndex].src).not.toContain('device=offline') + + # https://github.com/ariya/phantomjs/issues/11289 + onlineEvent = document.createEvent 'CustomEvent' + onlineEvent.initCustomEvent 'online', false, false, null + document.dispatchEvent onlineEvent + + lastScriptIndex = document.head.getElementsByTagName('script').length - 1 + expect(document.head.getElementsByTagName('script')[lastScriptIndex].src).toContain('device=offline') + + describe 'performance', -> + it 'should delay loading the API when delayLoad is true, until the controller explicitly calls it', -> + options = { v: '3.17', libraries: '', language: 'en', sensor: 'false', device: 'online', preventLoad: true } + mapScriptLoader.load(options) + + lastScriptIndex = document.head.getElementsByTagName('script').length - 1 + expect(document.head.getElementsByTagName('script')[lastScriptIndex].src).not.toContain('device=online') + + mapScriptManualLoader.load() + + lastScriptIndex = document.head.getElementsByTagName('script').length - 1 + expect(document.head.getElementsByTagName('script')[lastScriptIndex].src).toContain('device=online') diff --git a/spec/coffee/usage/underscore.difference.spec.coffee b/spec/coffee/usage/underscore.difference.spec.coffee new file mode 100644 index 000000000..67340566e --- /dev/null +++ b/spec/coffee/usage/underscore.difference.spec.coffee @@ -0,0 +1,130 @@ +#SPEC set is to make sure Underscore is being understood and used correctly +describe "uiGmapLodash.differenceObjects", -> + subject = null + beforeEach -> + @objArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + ] + module 'uiGmapgoogle-maps.extensions' + inject (uiGmapLodash) -> + subject = uiGmapLodash + + describe "Comparing Arrays of Objects", -> + describe "difference", -> + describe "0 length", -> + it "when two arrays are identical - same reference", -> + interArray = _.difference(@objArray, @objArray) + expect(interArray.length).toEqual(0) + + describe "different length - not identical", -> + it "diff reference, diff values", -> + difArray = [ + a: 1 + b: 2 + , + a: 2 + b: 3 + , + a: 3 + b: 4 + ] + interArray = _.difference(@objArray, difArray) + expect(interArray.length).toEqual(3) + + it "diff reference, 1 val identical", -> + difArray = [ + a: 1 + b: 1 + ] + interArray = _.difference(@objArray, difArray) + expect(interArray.length).toEqual(3) + + it "diff reference, same values", -> + difArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + ] + index = @objArray.indexOf {a: 1, b: 1} + expect(index).toBe(-1) + interArray = _.difference(@objArray, difArray) + expect(interArray.length).toEqual(3) + + describe "subject.differenceObjects - extension", -> + describe "same length", -> + it "when two arrays are identical - same reference", -> + interArray = subject.differenceObjects @objArray, @objArray + expect(interArray.length).toEqual(0) + + it "diff reference, same values", -> + difArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + ] + interArray = subject.differenceObjects difArray, @objArray + expect(interArray.length).toEqual(0) + + it "diff reference one added (new), same values (intersected)", -> + difArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + , + a: 4 + b: 4 + ] + interArray = subject.differenceObjects difArray, @objArray + expect(interArray.length).toEqual(1) + describe "different length - not identical", -> + it "diff reference, diff values", -> + difArray = [ + a: 1 + b: 2 + , + a: 2 + b: 3 + , + a: 3 + b: 4 + ] + interArray = subject.differenceObjects difArray, @objArray + expect(interArray.length).toEqual(3) + + it "diff reference, 1 val identical", -> + difArray = [ + a: 1 + b: 1 + ] + interArray = subject.differenceObjects difArray, @objArray + expect(interArray.length).toEqual(0) + describe "removal", -> + it "diff reference, 1 val identical", -> + difArray = [ + a: 1 + b: 1 + ] + interArray = subject.withoutObjects @objArray, difArray + expect(interArray.length).toEqual(2) diff --git a/spec/coffee/usage/underscore.indexOfObject.spec.coffee b/spec/coffee/usage/underscore.indexOfObject.spec.coffee new file mode 100644 index 000000000..bfb129c77 --- /dev/null +++ b/spec/coffee/usage/underscore.indexOfObject.spec.coffee @@ -0,0 +1,38 @@ +describe "uiGmapLodash.indexOfObject", -> + subject = null + beforeEach -> + @objArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 5 + b: 3 + , + a: 3 + b: 3 + ] + module 'uiGmapgoogle-maps.extensions' + inject (uiGmapLodash) => + subject = uiGmapLodash + + it "finds first element", -> + i = subject.indexOfObject(@objArray, {a: 1, b: 1}) + expect(i).toEqual(0) + + it "finds element beginning", -> + i = subject.indexOfObject(@objArray, {a: 2, b: 2}) + expect(i).toEqual(1) + it "finds last element", -> + i = subject.indexOfObject(@objArray, {a: 5, b: 3}) + expect(i).toEqual(2) + + it "finds last element", -> + i = subject.indexOfObject(@objArray, {a: 3, b: 3}) + expect(i).toEqual(3) + + it "find no element", -> + i = subject.indexOfObject(@objArray, {a: 4, b: 3}) + expect(i).toEqual(-1) diff --git a/spec/coffee/usage/underscore.intersection.spec.coffee b/spec/coffee/usage/underscore.intersection.spec.coffee new file mode 100644 index 000000000..cd21d0eb4 --- /dev/null +++ b/spec/coffee/usage/underscore.intersection.spec.coffee @@ -0,0 +1,122 @@ +#SPEC set is to make sure Underscore is being understood and used correctly +describe "uiGmapLodash.intersectionObjects", -> + subject = null + beforeEach -> + @objArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + ] + module 'uiGmapgoogle-maps.extensions' + inject (uiGmapLodash) -> + subject = uiGmapLodash + + describe "Comparing Arrays of Objects", -> + describe "intersection", -> + describe "same length", -> + it "when two arrays are identical - same reference", -> + interArray = _.intersection(@objArray, @objArray) + expect(interArray.length).toEqual(@objArray.length) + + describe "different length - not identical", -> + it "diff reference, diff values", -> + difArray = [ + a: 1 + b: 2 + , + a: 2 + b: 3 + , + a: 3 + b: 4 + ] + interArray = _.intersection(@objArray, difArray) + expect(interArray.length).toEqual(0) + + it "diff reference, 1 val identical", -> + difArray = [ + a: 1 + b: 1 + ] + interArray = _.intersection(@objArray, difArray) + expect(interArray.length).toEqual(0) + + it "diff reference, same values", -> + difArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + ] + index = @objArray.indexOf {a: 1, b: 1} + expect(index).toBe(-1) + interArray = _.intersection(@objArray, difArray) + expect(interArray.length).toEqual(0) + + describe "subject.intersectionObjects - extension", -> + describe "same length", -> + it "when two arrays are identical - same reference", -> + interArray = subject.intersectionObjects @objArray, @objArray + expect(interArray.length).toEqual(@objArray.length) + it "diff reference, same values", -> + difArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + ] + interArray = subject.intersectionObjects @objArray, difArray + expect(interArray.length).toEqual(@objArray.length) + + it "diff reference one added (new), same values (intersected)", -> + difArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + , + a: 4 + b: 4 + ] + interArray = subject.intersectionObjects @objArray, difArray + expect(interArray.length).toEqual(@objArray.length) + describe "different length - not identical", -> + it "diff reference, diff values", -> + difArray = [ + a: 1 + b: 2 + , + a: 2 + b: 3 + , + a: 3 + b: 4 + ] + interArray = subject.intersectionObjects @objArray, difArray + expect(interArray.length).toEqual(0) + + it "diff reference, 1 val identical", -> + difArray = [ + a: 1 + b: 1 + ] + interArray = subject.intersectionObjects @objArray, difArray + expect(interArray.length).toEqual(1) + expect(interArray.length).not.toEqual(@objArray.length) diff --git a/spec/coffee/usage/underscore.isEqual.spec.coffee b/spec/coffee/usage/underscore.isEqual.spec.coffee new file mode 100644 index 000000000..528ef91f1 --- /dev/null +++ b/spec/coffee/usage/underscore.isEqual.spec.coffee @@ -0,0 +1,134 @@ +#SPEC set is to make sure Underscore is being understood and used correctly +describe "_.isEqual", -> + beforeEach -> + @objArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + ] + + describe "Comparing Arrays of Objects", -> + describe "isEqual", -> + describe "same length", -> + it "when two arrays are identical - same reference", -> + expect(_.isEqual(@objArray, @objArray)).toBeTruthy + + it "diff reference, same values", -> + difArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + ] + expect(_.isEqual(@objArray, difArray)).toBeTruthy + + it "diff reference one added (new), same values (intersected)", -> + difArray = [ + a: 1 + b: 1 + , + a: 2 + b: 2 + , + a: 3 + b: 3 + , + a: 4 + b: 4 + ] + expect(_.isEqual(@objArray, difArray)).toBeFalsy + + describe "different length - not identical", -> + it "diff reference, diff values", -> + difArray = [ + a: 1 + b: 2 + , + a: 2 + b: 3 + , + a: 3 + b: 4 + ] + expect(_.isEqual(@objArray, difArray)).toBeFalsy + + it "diff reference, 1 val identical", -> + difArray = [ + a: 1 + b: 1 + ] + expect(_.isEqual(@objArray, difArray)).toBeFalsy + describe "array of nested objects", -> + beforeEach -> + @objArray = [ + a: 1 + b: + n: 1 + m: 2 + o: "hi!" + , + a: 2 + b: + n: 4 + m: 5 + o: "hi!" + , + a: + n: 2 + m: 3 + o: "hi!" + b: 3 + ] + it "same - reference should be equal", -> + expect(_.isEqual(@objArray, @objArray)).toBeTruthy + it "same - dif reference same values should be ==", -> + difArray = [ + a: 1 + b: + n: 1 + m: 2 + o: "hi!" + , + a: 2 + b: + n: 4 + m: 5 + o: "hi!" + , + a: + n: 2 + m: 3 + o: "hi!" + b: 3 + ] + expect(_.isEqual(@objArray, difArray)).toBeTruthy + it "dif reference diff values should be !=", -> + difArray = [ + a: 1 + b: + n: 1 + m: 2 + o: "hi!" + , + a: 2 + b: + n: 4 + m: 5 + o: "hi!!" + , + a: + n: 2 + m: 3 + o: "hi!" + b: 3 + ] + expect(_.isEqual(@objArray, difArray)).toBeFalsy \ No newline at end of file diff --git a/spec/js/.keep b/spec/js/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/spec/js/acceptance/app.js b/spec/js/acceptance/app.js new file mode 100644 index 000000000..2d2eaada6 --- /dev/null +++ b/spec/js/acceptance/app.js @@ -0,0 +1,3 @@ +var angular = require('angular'); +require('../../../dist/angular-google-maps.js'); +require('angular-simple-logger'); diff --git a/src/angular-google-maps.js b/src/angular-google-maps.js deleted file mode 100644 index f7d94cf12..000000000 --- a/src/angular-google-maps.js +++ /dev/null @@ -1,549 +0,0 @@ -/**! - * The MIT License - * - * Copyright (c) 2010-2012 Google, Inc. http://angularjs.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * angular-google-maps - * https://github.com/nlaplante/angular-google-maps - * - * @author Nicolas Laplante https://plus.google.com/108189012221374960701 - */ - -(function () { - - "use strict"; - - /* - * Utility functions - */ - - /** - * Check if 2 floating point numbers are equal - * - * @see http://stackoverflow.com/a/588014 - */ - function floatEqual (f1, f2) { - return (Math.abs(f1 - f2) < 0.000001); - } - - /* - * Create the model in a self-contained class where map-specific logic is - * done. This model will be used in the directive. - */ - - var MapModel = (function () { - - var _defaults = { - zoom: 8, - draggable: false, - container: null - }; - - /** - * - */ - function PrivateMapModel(opts) { - - var _instance = null, - _markers = [], // caches the instances of google.maps.Marker - _handlers = [], // event handlers - _windows = [], // InfoWindow objects - o = angular.extend({}, _defaults, opts), - that = this, - currentInfoWindow = null; - - this.center = opts.center; - this.zoom = o.zoom; - this.draggable = o.draggable; - this.dragging = false; - this.selector = o.container; - this.markers = []; - this.options = o.options; - - this.draw = function () { - - if (that.center == null) { - // TODO log error - return; - } - - if (_instance == null) { - - // Create a new map instance - - _instance = new google.maps.Map(that.selector, angular.extend(that.options, { - center: that.center, - zoom: that.zoom, - draggable: that.draggable, - mapTypeId : google.maps.MapTypeId.ROADMAP - })); - - google.maps.event.addListener(_instance, "dragstart", - - function () { - that.dragging = true; - } - ); - - google.maps.event.addListener(_instance, "idle", - - function () { - that.dragging = false; - } - ); - - google.maps.event.addListener(_instance, "drag", - - function () { - that.dragging = true; - } - ); - - google.maps.event.addListener(_instance, "zoom_changed", - - function () { - that.zoom = _instance.getZoom(); - that.center = _instance.getCenter(); - } - ); - - google.maps.event.addListener(_instance, "center_changed", - - function () { - that.center = _instance.getCenter(); - } - ); - - // Attach additional event listeners if needed - if (_handlers.length) { - - angular.forEach(_handlers, function (h, i) { - - google.maps.event.addListener(_instance, - h.on, h.handler); - }); - } - } - else { - - // Refresh the existing instance - google.maps.event.trigger(_instance, "resize"); - - var instanceCenter = _instance.getCenter(); - - if (!floatEqual(instanceCenter.lat(), that.center.lat()) - || !floatEqual(instanceCenter.lng(), that.center.lng())) { - _instance.setCenter(that.center); - } - - if (_instance.getZoom() != that.zoom) { - _instance.setZoom(that.zoom); - } - } - }; - - this.fit = function () { - if (_instance && _markers.length) { - - var bounds = new google.maps.LatLngBounds(); - - angular.forEach(_markers, function (m, i) { - bounds.extend(m.getPosition()); - }); - - _instance.fitBounds(bounds); - } - }; - - this.on = function(event, handler) { - _handlers.push({ - "on": event, - "handler": handler - }); - }; - - this.addMarker = function (lat, lng, icon, infoWindowContent, label, url, - thumbnail) { - - if (that.findMarker(lat, lng) != null) { - return; - } - - var marker = new google.maps.Marker({ - position: new google.maps.LatLng(lat, lng), - map: _instance, - icon: icon - }); - - if (label) { - - } - - if (url) { - - } - - if (infoWindowContent != null) { - var infoWindow = new google.maps.InfoWindow({ - content: infoWindowContent - }); - - google.maps.event.addListener(marker, 'click', function() { - if (currentInfoWindow != null) { - currentInfoWindow.close(); - } - infoWindow.open(_instance, marker); - currentInfoWindow = infoWindow; - }); - } - - // Cache marker - _markers.unshift(marker); - - // Cache instance of our marker for scope purposes - that.markers.unshift({ - "lat": lat, - "lng": lng, - "draggable": false, - "icon": icon, - "infoWindowContent": infoWindowContent, - "label": label, - "url": url, - "thumbnail": thumbnail - }); - - // Return marker instance - return marker; - }; - - this.findMarker = function (lat, lng) { - for (var i = 0; i < _markers.length; i++) { - var pos = _markers[i].getPosition(); - - if (floatEqual(pos.lat(), lat) && floatEqual(pos.lng(), lng)) { - return _markers[i]; - } - } - - return null; - }; - - this.findMarkerIndex = function (lat, lng) { - for (var i = 0; i < _markers.length; i++) { - var pos = _markers[i].getPosition(); - - if (floatEqual(pos.lat(), lat) && floatEqual(pos.lng(), lng)) { - return i; - } - } - - return -1; - }; - - this.addInfoWindow = function (lat, lng, html) { - var win = new google.maps.InfoWindow({ - content: html, - position: new google.maps.LatLng(lat, lng) - }); - - _windows.push(win); - - return win; - }; - - this.hasMarker = function (lat, lng) { - return that.findMarker(lat, lng) !== null; - }; - - this.getMarkerInstances = function () { - return _markers; - }; - - this.removeMarkers = function (markerInstances) { - - var s = this; - - angular.forEach(markerInstances, function (v, i) { - var pos = v.getPosition(), - lat = pos.lat(), - lng = pos.lng(), - index = s.findMarkerIndex(lat, lng); - - // Remove from local arrays - _markers.splice(index, 1); - s.markers.splice(index, 1); - - // Remove from map - v.setMap(null); - }); - }; - } - - // Done - return PrivateMapModel; - }()); - - // End model - - // Start Angular directive - - var googleMapsModule = angular.module("google-maps", []); - - /** - * Map directive - */ - googleMapsModule.directive("googleMap", ["$log", "$timeout", "$filter", function ($log, $timeout, - $filter) { - - var controller = function ($scope, $element) { - - var _m = $scope.map; - - self.addInfoWindow = function (lat, lng, content) { - _m.addInfoWindow(lat, lng, content); - }; - }; - - controller.$inject = ['$scope', '$element']; - - return { - restrict: "ECA", - priority: 100, - transclude: true, - template: "
", - replace: false, - scope: { - center: "=center", // required - markers: "=markers", // optional - latitude: "=latitude", // required - longitude: "=longitude", // required - zoom: "=zoom", // required - refresh: "&refresh", // optional - windows: "=windows", // optional - events: "=events" - }, - controller: controller, - link: function (scope, element, attrs, ctrl) { - - // Center property must be specified and provide lat & - // lng properties - if (!angular.isDefined(scope.center) || - (!angular.isDefined(scope.center.latitude) || - !angular.isDefined(scope.center.longitude))) { - - $log.error("angular-google-maps: could not find a valid center property"); - return; - } - - if (!angular.isDefined(scope.zoom)) { - $log.error("angular-google-maps: map zoom property not set"); - return; - } - - angular.element(element).addClass("angular-google-map"); - - // Parse options - var opts = {options: {}}; - if (attrs.options) { - opts.options = angular.fromJson(attrs.options); - } - - // Create our model - var _m = new MapModel(angular.extend(opts, { - container: element[0], - center: new google.maps.LatLng(scope.center.latitude, scope.center.longitude), - draggable: attrs.draggable == "true", - zoom: scope.zoom - })); - - _m.on("drag", function () { - - var c = _m.center; - - $timeout(function () { - - scope.$apply(function (s) { - scope.center.latitude = c.lat(); - scope.center.longitude = c.lng(); - }); - }); - }); - - _m.on("zoom_changed", function () { - - if (scope.zoom != _m.zoom) { - - $timeout(function () { - - scope.$apply(function (s) { - scope.zoom = _m.zoom; - }); - }); - } - }); - - _m.on("center_changed", function () { - var c = _m.center; - - $timeout(function () { - - scope.$apply(function (s) { - - if (!_m.dragging) { - scope.center.latitude = c.lat(); - scope.center.longitude = c.lng(); - } - }); - }); - }); - - if (angular.isDefined(scope.events)) { - for (var eventName in scope.events) { - if (scope.events.hasOwnProperty(eventName) && angular.isFunction(scope.events[eventName])) { - _m.on(eventName, function () { - scope.events[eventName].apply(scope, [_m, eventName, arguments]); - }); - } - } - } - - if (attrs.markClick == "true") { - (function () { - var cm = null; - - _m.on("click", function (e) { - if (cm == null) { - - cm = { - latitude: e.latLng.lat(), - longitude: e.latLng.lng() - }; - - scope.markers.push(cm); - } - else { - cm.latitude = e.latLng.lat(); - cm.longitude = e.latLng.lng(); - } - - - $timeout(function () { - scope.latitude = cm.latitude; - scope.longitude = cm.longitude; - scope.$apply(); - }); - }); - }()); - } - - // Put the map into the scope - scope.map = _m; - - // Check if we need to refresh the map - if (angular.isUndefined(scope.refresh())) { - // No refresh property given; draw the map immediately - _m.draw(); - } - else { - scope.$watch("refresh()", function (newValue, oldValue) { - if (newValue && !oldValue) { - _m.draw(); - } - }); - } - - // Markers - scope.$watch("markers", function (newValue, oldValue) { - - $timeout(function () { - - angular.forEach(newValue, function (v, i) { - if (!_m.hasMarker(v.latitude, v.longitude)) { - _m.addMarker(v.latitude, v.longitude, v.icon, v.infoWindow); - } - }); - - // Clear orphaned markers - var orphaned = []; - - angular.forEach(_m.getMarkerInstances(), function (v, i) { - // Check our scope if a marker with equal latitude and longitude. - // If not found, then that marker has been removed form the scope. - - var pos = v.getPosition(), - lat = pos.lat(), - lng = pos.lng(), - found = false; - - // Test against each marker in the scope - for (var si = 0; si < scope.markers.length; si++) { - - var sm = scope.markers[si]; - - if (floatEqual(sm.latitude, lat) && floatEqual(sm.longitude, lng)) { - // Map marker is present in scope too, don't remove - found = true; - } - } - - // Marker in map has not been found in scope. Remove. - if (!found) { - orphaned.push(v); - } - }); - - orphaned.length && _m.removeMarkers(orphaned); - - // Fit map when there are more than one marker. - // This will change the map center coordinates - if (attrs.fit == "true" && newValue && newValue.length > 1) { - _m.fit(); - } - }); - - }, true); - - - // Update map when center coordinates change - scope.$watch("center", function (newValue, oldValue) { - if (newValue === oldValue) { - return; - } - - if (!_m.dragging) { - _m.center = new google.maps.LatLng(newValue.latitude, - newValue.longitude); - _m.draw(); - } - }, true); - - scope.$watch("zoom", function (newValue, oldValue) { - if (newValue === oldValue) { - return; - } - - _m.zoom = newValue; - _m.draw(); - }); - } - }; - }]); -}()); diff --git a/src/coffee/directives/api/circle.coffee b/src/coffee/directives/api/circle.coffee new file mode 100644 index 000000000..26893efee --- /dev/null +++ b/src/coffee/directives/api/circle.coffee @@ -0,0 +1,9 @@ +###global angular, _### +angular.module("uiGmapgoogle-maps.directives.api").factory "uiGmapCircle", [ + "uiGmapICircle", "uiGmapCircleParentModel", + (ICircle,CircleParentModel) -> + _.extend ICircle, + link: (scope, element, attrs, mapCtrl) -> + mapCtrl.getScope().deferred.promise.then (gMap) -> + new CircleParentModel scope,element,attrs, gMap + ] diff --git a/src/coffee/directives/api/control.coffee b/src/coffee/directives/api/control.coffee new file mode 100644 index 000000000..1c7162290 --- /dev/null +++ b/src/coffee/directives/api/control.coffee @@ -0,0 +1,69 @@ +angular.module("uiGmapgoogle-maps.directives.api") +.factory "uiGmapControl", ["uiGmapIControl", "$http", "$templateCache", "$compile", "$controller",'uiGmapGoogleMapApi', + (IControl, $http, $templateCache, $compile, $controller, GoogleMapApi) -> + class Control extends IControl + constructor: -> + super() + transclude:true, + link: (scope, element, attrs, ctrl, transclude) => + GoogleMapApi.then (maps) => + # Validate attributes + + hasTranscludedContent = angular.isUndefined scope.template + + index = if angular.isDefined scope.index && !isNaN(parseInt scope.index) + parseInt(scope.index) + else + undefined + + position = if angular.isDefined(scope.position) + scope.position.toUpperCase().replace /-/g, '_' + else + 'TOP_CENTER' + + if !maps.ControlPosition[position] + @$log.error 'mapControl: invalid position property' + return + + # Wrap control initialization inside a $timeout() call to make sure the map is created already + IControl.mapPromise(scope, ctrl).then (map) => + control = undefined + controlDiv = angular.element '
' + + pushControl = (map, control, index) -> + + # add index if defined + if index + control[0].index = index + + map.controls[google.maps.ControlPosition[position]].push(control[0]) + + + # checking if is using the transcluded content or will load the template + if hasTranscludedContent + + transclude (transcludeEl) -> + + controlDiv.append transcludeEl + + pushControl(map, controlDiv.children(), index) + + else + $http.get(scope.template, { cache: $templateCache }) + .then ({data}) -> + templateScope = scope.$new() + controlDiv.append(data) + + # if a controller is defined on the directive then add it to the template + if angular.isDefined scope.controller + templateCtrl = $controller scope.controller, {$scope: templateScope} + controlDiv.children().data '$ngControllerController', templateCtrl + + # use children() rather than content() as the former seems to trim the content + control = $compile(controlDiv.children())(templateScope) + + .catch (error) => + @$log.error 'mapControl: template could not be found' + .then -> + pushControl(map, control, index) +] diff --git a/src/coffee/directives/api/drag-zoom.coffee b/src/coffee/directives/api/drag-zoom.coffee new file mode 100644 index 000000000..a9a79e284 --- /dev/null +++ b/src/coffee/directives/api/drag-zoom.coffee @@ -0,0 +1,46 @@ +## +# +# author: Nicholas McCready +# directive to invoke google-maps-tools keydragzoom +# +# details: http://google-maps-utility-library-v3.googlecode.com/svn/tags/keydragzoom/2.0.9/docs/examples.html +# options: can set styles and keys +# +## +###globals angular, _### +angular.module('uiGmapgoogle-maps.directives.api').service 'uiGmapDragZoom', [ + 'uiGmapCtrlHandle', 'uiGmapPropertyAction', (CtrlHandle, PropertyAction) -> + restrict: 'EMA' + transclude: true + template: '' + require: '^' + 'uiGmapGoogleMap' + scope: + keyboardkey: '=' + options: '=' + spec: '=' #callback hack for testing, I can't seem to intercept DragZoom creation on map::enableKeyDragZoom + + controller: ['$scope', '$element', ($scope, $element) -> + $scope.ctrlType = 'uiGmapDragZoom' + _.extend @, CtrlHandle.handle($scope, $element) + ] + + link: (scope, element, attrs, ctrl) -> + CtrlHandle.mapPromise(scope, ctrl).then (map) -> + enableKeyDragZoom = (opts) -> + map.enableKeyDragZoom(opts) + + setKeyAction = new PropertyAction (key, newVal) -> + if newVal + enableKeyDragZoom key: newVal + else + enableKeyDragZoom() + + setOptionsAction = new PropertyAction (key, newVal) -> + enableKeyDragZoom newVal if newVal + + scope.$watch 'keyboardkey', setKeyAction.sic 'keyboardkey' + setKeyAction.sic scope.keyboardkey + + scope.$watch 'options', setOptionsAction.sic 'options' + setOptionsAction.sic scope.options +] diff --git a/src/coffee/directives/api/drawing-manager.coffee b/src/coffee/directives/api/drawing-manager.coffee new file mode 100644 index 000000000..a38939253 --- /dev/null +++ b/src/coffee/directives/api/drawing-manager.coffee @@ -0,0 +1,8 @@ +angular.module("uiGmapgoogle-maps.directives.api").factory "uiGmapDrawingManager", [ + "uiGmapIDrawingManager", "uiGmapDrawingManagerParentModel", + (IDrawingManager, DrawingManagerParentModel) -> + _.extend IDrawingManager, + link: (scope, element, attrs, mapCtrl) -> + mapCtrl.getScope().deferred.promise.then (map) -> + new DrawingManagerParentModel scope, element, attrs, map +] diff --git a/src/coffee/directives/api/free-draw-polygons.coffee b/src/coffee/directives/api/free-draw-polygons.coffee new file mode 100644 index 000000000..5f2ffd46c --- /dev/null +++ b/src/coffee/directives/api/free-draw-polygons.coffee @@ -0,0 +1,40 @@ +### + - Link up Polygons to be sent back to a controller + - inject the draw function into a controllers scope so that controller can call the directive to draw on demand + - draw function creates the DrawFreeHandChildModel which manages itself +### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapApiFreeDrawPolygons', [ + 'uiGmapLogger', 'uiGmapBaseObject', 'uiGmapCtrlHandle', 'uiGmapDrawFreeHandChildModel', 'uiGmapLodash', + ($log, BaseObject, CtrlHandle, DrawFreeHandChildModel, uiGmapLodash) -> + class FreeDrawPolygons extends BaseObject + @include CtrlHandle + restrict: 'EMA' + replace: true + require: '^' + 'uiGmapGoogleMap' + scope: + polygons: '=' + draw: '=' + + link: (scope, element, attrs, ctrl) => + @mapPromise(scope, ctrl).then (map) => + return $log.error 'No polygons to bind to!' unless scope.polygons + return $log.error 'Free Draw Polygons must be of type Array!' unless _.isArray scope.polygons + freeHand = new DrawFreeHandChildModel map, ctrl.getScope() + listener = undefined + scope.draw = -> + #clear watch only watch when we are finished drawing/engaging + listener?() + freeHand.engage(scope.polygons).then -> + #we are done drawing, now watch for changes on polygons, on post draw + firstTime = true + listener = + scope.$watchCollection 'polygons', (newValue, oldValue) -> + #preven infinite loop on watching + if firstTime or newValue == oldValue + firstTime = false + return + removals = uiGmapLodash.differenceObjects oldValue, newValue + removals.forEach (p) -> + p.setMap null +] diff --git a/src/coffee/directives/api/i-circle.coffee b/src/coffee/directives/api/i-circle.coffee new file mode 100644 index 000000000..a24348c74 --- /dev/null +++ b/src/coffee/directives/api/i-circle.coffee @@ -0,0 +1,19 @@ +angular.module("uiGmapgoogle-maps.directives.api").service "uiGmapICircle", [ -> + restrict: "EA" + replace: true + require: '^' + 'uiGmapGoogleMap' + scope: + center: "=center" + radius: "=radius" + stroke: "=stroke" + fill: "=fill" + clickable: "=" + draggable: "=" + editable: "=" + geodesic: "=" + icons: "=icons" + visible: "=" + events: "=" + control: "=" + zIndex: "=zindex" +] diff --git a/src/coffee/directives/api/i-control.coffee b/src/coffee/directives/api/i-control.coffee new file mode 100644 index 000000000..c9d944b7d --- /dev/null +++ b/src/coffee/directives/api/i-control.coffee @@ -0,0 +1,27 @@ +### + - interface for all controls to derive from + - to enforce a minimum set of requirements + - attributes + - template + - position + - controller + - index +### +angular.module("uiGmapgoogle-maps.directives.api") +.factory "uiGmapIControl", [ "uiGmapBaseObject", "uiGmapLogger", "uiGmapCtrlHandle", (BaseObject, Logger, CtrlHandle) -> + class IControl extends BaseObject + @extend CtrlHandle + constructor: -> + @restrict = 'EA' + @replace = true + @require = '^' + 'uiGmapGoogleMap' + @scope = + template: '@template' + position: '@position' + controller: '@controller' + index: '@index' + @$log = Logger + + link: (scope, element, attrs, ctrl) -> + throw new Error("Not implemented!!") +] diff --git a/src/coffee/directives/api/i-drawing-manager.coffee b/src/coffee/directives/api/i-drawing-manager.coffee new file mode 100644 index 000000000..7ca1f6436 --- /dev/null +++ b/src/coffee/directives/api/i-drawing-manager.coffee @@ -0,0 +1,10 @@ +angular.module('uiGmapgoogle-maps.directives.api').service 'uiGmapIDrawingManager', [ -> + restrict: 'EA' + replace: true + require: '^' + 'uiGmapGoogleMap' + scope: + static: '@' + control: '=' + options: '=' + events: '=' +] diff --git a/src/coffee/directives/api/i-marker.coffee b/src/coffee/directives/api/i-marker.coffee new file mode 100644 index 000000000..61f9b4a04 --- /dev/null +++ b/src/coffee/directives/api/i-marker.coffee @@ -0,0 +1,27 @@ +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapIMarker', [ 'uiGmapBaseObject', 'uiGmapCtrlHandle', + (BaseObject, CtrlHandle)-> + class IMarker extends BaseObject + + IMarker.scope = + coords: '=coords' + icon: '=icon' + click: '&click' + options: '=options' + events: '=events' + fit: '=fit' + idKey: '=idkey' + control: '=control' + + IMarker.scopeKeys = _.keys(IMarker.scope) + IMarker.keys = IMarker.scopeKeys + + @extend CtrlHandle + constructor: -> + @restrict = 'EMA' + @require = '^' + 'uiGmapGoogleMap' + @priority = -1 + @transclude = true + @replace = true + @scope = _.extend @scope or {}, IMarker.scope +] diff --git a/src/coffee/directives/api/i-polygon.coffee b/src/coffee/directives/api/i-polygon.coffee new file mode 100644 index 000000000..b047954a2 --- /dev/null +++ b/src/coffee/directives/api/i-polygon.coffee @@ -0,0 +1,33 @@ +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapIPolygon', ['uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapCtrlHandle', + (GmapUtil, BaseObject, Logger, CtrlHandle) -> + + class IPolygon extends BaseObject + IPolygon.scope = + path: '=path' + stroke: '=stroke' + clickable: '=' + draggable: '=' + editable: '=' + geodesic: '=' + fill: '=' + icons: '=icons' + visible: '=' + static: '=' + events: '=' + zIndex: '=zindex' + fit: '=' + control:'=control' + IPolygon.scopeKeys = _.keys(IPolygon.scope) + + @include GmapUtil + @extend CtrlHandle + constructor: -> + restrict: 'EMA' + replace: true + require: '^' + 'uiGmapGoogleMap' + scope: IPolygon.scope + + DEFAULTS: {} + $log: Logger +] diff --git a/src/coffee/directives/api/i-polyline.coffee b/src/coffee/directives/api/i-polyline.coffee new file mode 100644 index 000000000..28c2a7895 --- /dev/null +++ b/src/coffee/directives/api/i-polyline.coffee @@ -0,0 +1,31 @@ +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapIPolyline', [ + 'uiGmapGmapUtil', 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapCtrlHandle', + (GmapUtil, BaseObject, Logger, CtrlHandle) -> + class IPolyline extends BaseObject + IPolyline.scope = + path: '=' + stroke: '=' + clickable: '=' + draggable: '=' + editable: '=' + geodesic: '=' + icons: '=' + visible: '=' + static: '=' + fit: '=' + events: '=' + zIndex: '=zindex' + IPolyline.scopeKeys = _.keys(IPolyline.scope) + + @include GmapUtil + @extend CtrlHandle + constructor: -> + restrict: 'EMA' + replace: true + require: '^' + 'uiGmapGoogleMap' + scope: IPolyline.scope + + DEFAULTS: {} + $log: Logger +] diff --git a/src/coffee/directives/api/i-rectangle.coffee b/src/coffee/directives/api/i-rectangle.coffee new file mode 100644 index 000000000..fe0dc3543 --- /dev/null +++ b/src/coffee/directives/api/i-rectangle.coffee @@ -0,0 +1,16 @@ +angular.module('uiGmapgoogle-maps.directives.api').service 'uiGmapIRectangle', [ -> + 'use strict' + + restrict: 'EMA' + require: '^' + 'uiGmapGoogleMap' + replace: true + scope: + bounds: '=' + stroke: '=' + clickable: '=' + draggable: '=' + editable: '=' + fill: '=' + visible: '=' + events: '=' +] diff --git a/src/coffee/directives/api/i-window.coffee b/src/coffee/directives/api/i-window.coffee new file mode 100644 index 000000000..fc941c449 --- /dev/null +++ b/src/coffee/directives/api/i-window.coffee @@ -0,0 +1,29 @@ +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapIWindow', [ + 'uiGmapBaseObject', 'uiGmapChildEvents', 'uiGmapCtrlHandle', + (BaseObject, ChildEvents, CtrlHandle) -> + class IWindow extends BaseObject + IWindow.scope = + coords: '=coords', + template: '=template', + templateUrl: '=templateurl', + templateParameter: '=templateparameter', + isIconVisibleOnClick: '=isiconvisibleonclick', + closeClick: '&closeclick', + options: '=options' + control: '=control' + show: '=show' + IWindow.scopeKeys = _.keys(IWindow.scope) + + @include ChildEvents + @extend CtrlHandle + constructor: -> + @restrict = 'EMA' + @template = undefined + @transclude = true + @priority = -100 + @require = '^' + 'uiGmapGoogleMap' + @replace = true + @scope = _.extend @scope or {}, IWindow.scope + +] diff --git a/src/coffee/directives/api/managers/clusterer-marker-manager.coffee b/src/coffee/directives/api/managers/clusterer-marker-manager.coffee new file mode 100644 index 000000000..42ac831db --- /dev/null +++ b/src/coffee/directives/api/managers/clusterer-marker-manager.coffee @@ -0,0 +1,87 @@ +angular.module('uiGmapgoogle-maps.directives.api.managers') +.factory 'uiGmapClustererMarkerManager', ['uiGmapLogger', +'uiGmapFitHelper', 'uiGmapPropMap', 'uiGmapEventsHelper', ($log, FitHelper, PropMap, EventsHelper) -> + class ClustererMarkerManager + @type = 'ClustererMarkerManager' + constructor: (gMap, opt_markers = {}, @opt_options = {}, @opt_events) -> + @type = ClustererMarkerManager.type + + @clusterer = new NgMapMarkerClusterer gMap, opt_markers, @opt_options + + @propMapGMarkers = new PropMap() #keep in sync with cluster.markers_ + + @attachEvents @opt_events, 'opt_events' + + @clusterer.setIgnoreHidden true + @noDrawOnSingleAddRemoves = true + $log.info @ + + checkKey: (gMarker) -> + unless gMarker.key? + msg = 'gMarker.key undefined and it is REQUIRED!!' + $log.error msg + + add: (gMarker) => + @checkKey gMarker + @clusterer.addMarker gMarker, @noDrawOnSingleAddRemoves + @propMapGMarkers.put gMarker.key, gMarker + @checkSync() + + #if you want flashing as in remove and then re-add use this + #otherwise leave the marker in the map and just edit its properties (coords, icon etc) + update: (gMarker) => + @remove gMarker + @add gMarker + + addMany: (gMarkers) => + gMarkers.forEach (gMarker) => + @add gMarker + + remove: (gMarker) => + @checkKey gMarker + exists = @propMapGMarkers.get gMarker.key + if exists + @clusterer.removeMarker(gMarker, @noDrawOnSingleAddRemoves) + @propMapGMarkers.remove gMarker.key + @checkSync() + + removeMany: (gMarkers) => + gMarkers.forEach (gMarker) => + @remove gMarker + + draw: () => + @clusterer.repaint() + + clear: () => + @removeMany @getGMarkers() + @clusterer.repaint() + + attachEvents: (options, optionsName) => + @listeners = [] + if angular.isDefined(options) and options? and angular.isObject(options) + #coffeelint: disable=check_scope + for eventName, eventHandler of options + #coffeelint: enable=check_scope + if options.hasOwnProperty(eventName) and angular.isFunction(options[eventName]) + $log.info "#{optionsName}: Attaching event: #{eventName} to clusterer" + @listeners.push google.maps.event.addListener @clusterer, eventName, options[eventName] + + clearEvents: () -> + EventsHelper.removeEvents @listeners + @listeners = [] + + destroy: => + @clearEvents() + @clear() + + fit: => + FitHelper.fit @getGMarkers(), @clusterer.getMap() + + getGMarkers: => + @clusterer.getMarkers().values() + + checkSync: -> +# throw 'GMarkers out of Sync in MarkerClusterer' if @getGMarkers().length != @propMapGMarkers.length + + ClustererMarkerManager +] diff --git a/src/coffee/directives/api/managers/google-map-object-manager.coffee b/src/coffee/directives/api/managers/google-map-object-manager.coffee new file mode 100644 index 000000000..c42b135f2 --- /dev/null +++ b/src/coffee/directives/api/managers/google-map-object-manager.coffee @@ -0,0 +1,24 @@ +angular.module('uiGmapgoogle-maps.directives.api.managers') +.service 'uiGmapGoogleMapObjectManager', [ () -> + _availableInstances = [] + _usedInstances = [] + return { + createMapInstance: (parentElement, options) -> + instance = null + if _availableInstances.length == 0 + instance = new google.maps.Map(parentElement, options) + _usedInstances.push(instance) + else + instance = _availableInstances.pop() + angular.element(parentElement).append(instance.getDiv()) + instance.setOptions(options) + _usedInstances.push(instance) + return instance + recycleMapInstance: (instance) -> + index = _usedInstances.indexOf(instance) + if index < 0 + throw new Error('Expected map instance to be a previously used instance') + _usedInstances.splice(index, 1) + _availableInstances.push(instance) + } +] \ No newline at end of file diff --git a/src/coffee/directives/api/managers/marker-manager.coffee b/src/coffee/directives/api/managers/marker-manager.coffee new file mode 100644 index 000000000..1c7a8c215 --- /dev/null +++ b/src/coffee/directives/api/managers/marker-manager.coffee @@ -0,0 +1,83 @@ +angular.module("uiGmapgoogle-maps.directives.api.managers") +.factory "uiGmapMarkerManager", ["uiGmapLogger", "uiGmapFitHelper", +"uiGmapPropMap", (Logger, FitHelper, PropMap) -> + class MarkerManager + @type = 'MarkerManager' + constructor: (gMap, opt_markers, opt_options) -> + @type = MarkerManager.type + @gMap = gMap + @gMarkers = new PropMap() + @$log = Logger + @$log.info(@) + + add: (gMarker, optDraw = true) => + unless gMarker.key? + msg = "gMarker.key undefined and it is REQUIRED!!" + Logger.error msg + throw msg + exists = @gMarkers.get gMarker.key + if !exists + @handleOptDraw(gMarker, optDraw, true) + @gMarkers.put gMarker.key, gMarker + + #if you want flashing as in remove and then re-add use this + #otherwise leave the marker in the map and just edit its properties (coords, icon etc) + update: (gMarker, optDraw = true) => + @remove gMarker, optDraw + @add gMarker, optDraw + + addMany: (gMarkers) => + gMarkers.forEach (gMarker) => + @add(gMarker) + + remove: (gMarker, optDraw = true) => + @handleOptDraw gMarker, optDraw, false + if @gMarkers.get gMarker.key + @gMarkers.remove gMarker.key + + removeMany: (gMarkers)=> + gMarkers.forEach (marker) => + @remove(marker) + + draw: => + deletes = [] + @gMarkers.each (gMarker) => + unless gMarker.isDrawn + if gMarker.doAdd + gMarker.setMap(@gMap) + gMarker.isDrawn = true + else + deletes.push(gMarker) + + deletes.forEach (gMarker) => + gMarker.isDrawn = false + @remove(gMarker, true) + + destroy: => + @clear() + + clear: => + @gMarkers.each (gMarker) -> + gMarker.setMap null + delete @gMarkers + @gMarkers = new PropMap() + + handleOptDraw: (gMarker, optDraw, doAdd) => + if optDraw == true + if doAdd + gMarker.setMap @gMap + else + gMarker.setMap null + gMarker.isDrawn = true + else + gMarker.isDrawn = false + gMarker.doAdd = doAdd + + fit: => + FitHelper.fit @getGMarkers(), @gMap + + getGMarkers: => + @gMarkers.values() + + MarkerManager +] diff --git a/src/coffee/directives/api/managers/spiderfier-marker-manager.coffee b/src/coffee/directives/api/managers/spiderfier-marker-manager.coffee new file mode 100644 index 000000000..b587d42b7 --- /dev/null +++ b/src/coffee/directives/api/managers/spiderfier-marker-manager.coffee @@ -0,0 +1,92 @@ +angular.module('uiGmapgoogle-maps.directives.api.managers') +.factory 'uiGmapSpiderfierMarkerManager', ['uiGmapLogger', +'uiGmapFitHelper', 'uiGmapPropMap', 'uiGmapMarkerSpiderfier', ($log, FitHelper, PropMap, MarkerSpiderfier) -> + class SpiderfierMarkerManager + @type = 'SpiderfierMarkerManager' + constructor: (gMap, opt_markers = {}, @opt_options = {}, @opt_events, @scope) -> + @type = SpiderfierMarkerManager.type + @markerSpiderfier = new MarkerSpiderfier gMap, @opt_options + @propMapGMarkers = new PropMap() #keep in sync with cluster.markers_ + @attachEvents @opt_events, 'opt_events' + @noDrawOnSingleAddRemoves = true + $log.info @ + + checkKey: (gMarker) -> + unless gMarker.key? + msg = 'gMarker.key undefined and it is REQUIRED!!' + $log.error msg + + add: (gMarker) => + gMarker.setMap @markerSpiderfier.map #puts on map (could optimize for draw.. ugh) + @checkKey gMarker + @markerSpiderfier.addMarker gMarker, @noDrawOnSingleAddRemoves + @propMapGMarkers.put gMarker.key, gMarker + @checkSync() + + #if you want flashing as in remove and then re-add use this + #otherwise leave the marker in the map and just edit its properties (coords, icon etc) + update: (gMarker) => + @remove gMarker + @add gMarker + + addMany: (gMarkers) => + gMarkers.forEach (gMarker) => + @add gMarker + + remove: (gMarker) => + @checkKey gMarker + exists = @propMapGMarkers.get gMarker.key + if exists + gMarker.setMap null #puts on map (could optimize for draw.. ugh) + @markerSpiderfier.removeMarker(gMarker, @noDrawOnSingleAddRemoves) + @propMapGMarkers.remove gMarker.key + @checkSync() + + removeMany: (gMarkers) => + gMarkers.forEach (gMarker) => + @remove gMarker + + draw: () -> + # @markerSpiderfier.repaint() + + clear: () => + @removeMany @getGMarkers() + + attachEvents: (options, optionsName) => + if angular.isDefined(options) and options? and angular.isObject(options) + _.each options, (eventHandler, eventName) => + if options.hasOwnProperty(eventName) and angular.isFunction(options[eventName]) + $log.info "#{optionsName}: Attaching event: #{eventName} to markerSpiderfier" + @markerSpiderfier.addListener eventName, => + if eventName == 'spiderfy' or eventName == 'unspiderfy' + @scope.$evalAsync(options[eventName](arguments...)) + else #for consistency to be like EventsHelper + @scope.$evalAsync(options[eventName]([arguments[0], eventName, arguments[0].model, arguments]...)) + + clearEvents: (options, optionsName) -> + if angular.isDefined(options) and options? and angular.isObject(options) + #coffeelint:disable=check_scope + for eventName, eventHandler of options + #coffeelint:enable=check_scope + if options.hasOwnProperty(eventName) and angular.isFunction(options[eventName]) + $log.info "#{optionsName}: Clearing event: #{eventName} to markerSpiderfier" + @markerSpiderfier.clearListeners eventName + return + + destroy: => + @clearEvents @opt_events, 'opt_events' + @clear() + + fit: => + FitHelper.fit @getGMarkers(), @markerSpiderfier.map + + getGMarkers: => + @markerSpiderfier.getMarkers()#is an array so this should be fine as markerSpiderfierMarkerManager returns .values() (Array) + + isSpiderfied: => + _.find @getGMarkers(), (gMarker) -> + gMarker?._omsData? + + checkSync: -> +# throw 'GMarkers out of Sync in MarkermarkerSpiderfier' if @getGMarkers().length != @propMapGMarkers.length +] diff --git a/src/coffee/directives/api/map.coffee b/src/coffee/directives/api/map.coffee new file mode 100644 index 000000000..ffdb3c918 --- /dev/null +++ b/src/coffee/directives/api/map.coffee @@ -0,0 +1,272 @@ +###globals angular,_,google### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapMap', + ($timeout,$q, $log, uiGmapGmapUtil, uiGmapBaseObject, + uiGmapCtrlHandle, uiGmapIsReady, uiGmapuuid, + uiGmapExtendGWin, uiGmapExtendMarkerClusterer, + uiGmapGoogleMapsUtilV3,uiGmapGoogleMapApi, + uiGmapEventsHelper, uiGmapGoogleMapObjectManager) -> + + DEFAULTS = undefined + + initializeItems = [uiGmapGoogleMapsUtilV3, uiGmapExtendGWin, uiGmapExtendMarkerClusterer] + + class Map extends uiGmapBaseObject + @include uiGmapGmapUtil + constructor: -> + ctrlFn = ($scope) -> + retCtrl = undefined + $scope.$on '$destroy', -> + uiGmapIsReady.decrement() + + ctrlObj = uiGmapCtrlHandle.handle $scope + $scope.ctrlType = 'Map' + $scope.deferred.promise.then -> + initializeItems.forEach (i) -> + i.init() + ctrlObj.getMap = -> + $scope.map + retCtrl = _.extend @, ctrlObj + retCtrl + @controller = ['$scope', ctrlFn ] + + restrict: 'EMA' + transclude: true + replace: false + #priority: 100, + template: """ +
+
""" + + scope: + center: '=' # either bounds or center is required + zoom: '=' # optional + dragging: '=' # optional + control: '=' # optional + options: '=' # optional + events: '=' # optional + eventOpts: '=' # optional + styles: '=' # optional + bounds: '=' # either bounds or center is required + update: '=' # optional + + link: (scope, element, attrs) => + listeners = [] + scope.$on '$destroy', -> + uiGmapEventsHelper.removeEvents listeners + if attrs.recycleMapInstance == 'true' && scope.map + uiGmapGoogleMapObjectManager.recycleMapInstance(scope.map) + scope.map = null + + scope.idleAndZoomChanged = false + + uiGmapGoogleMapApi.then (maps) => + DEFAULTS = mapTypeId: maps.MapTypeId.ROADMAP + spawned = uiGmapIsReady.spawn() + resolveSpawned = -> + spawned.deferred.resolve + instance: spawned.instance + map: _gMap + + # Either a center or bounds lat/long property must be specified + if not angular.isDefined(scope.center) and not angular.isDefined(scope.bounds) + $log.error 'angular-google-maps: a center or bounds property is required' + return + + # If center is not set, calculate the center point from bounds + if !angular.isDefined(scope.center) + scope.center = new google.maps.LatLngBounds(@getCoords(scope.bounds.southwest), + @getCoords(scope.bounds.northeast)).getCenter() + + # If zoom is not set, use a default value + unless angular.isDefined(scope.zoom) + scope.zoom = 10 + + el = angular.element(element) + el.addClass 'angular-google-map' + + # Parse options + opts = + options: {} + opts.options = scope.options if attrs.options + + opts.styles = scope.styles if attrs.styles + if attrs.type + type = attrs.type.toUpperCase() + if google.maps.MapTypeId.hasOwnProperty(type) + opts.mapTypeId = google.maps.MapTypeId[attrs.type.toUpperCase()] + else + $log.error "angular-google-maps: invalid map type '#{attrs.type}'" + + # Create the map + mapOptions = angular.extend {}, DEFAULTS, opts, + center: @getCoords scope.center + zoom: scope.zoom + bounds: scope.bounds + + if attrs.recycleMapInstance == 'true' + _gMap = uiGmapGoogleMapObjectManager.createMapInstance(el.find('div')[1], mapOptions) + else + _gMap = new google.maps.Map(el.find('div')[1], mapOptions) + _gMap['uiGmap_id'] = uiGmapuuid.generate() + + dragging = false + + listeners.push google.maps.event.addListenerOnce _gMap, 'idle', -> + scope.deferred.resolve _gMap + resolveSpawned() + + disabledEvents = + if attrs.events and scope.events?.blacklist? + scope.events.blacklist + else [] + if _.isString disabledEvents + disabledEvents = [disabledEvents] + + maybeHookToEvent = (eventName, fn, prefn) -> + unless _.includes disabledEvents, eventName + prefn() if prefn + listeners.push google.maps.event.addListener _gMap, eventName, -> + unless scope.update?.lazy + fn() + + unless _.includes disabledEvents, 'all' + maybeHookToEvent 'dragstart', -> + dragging = true + scope.$evalAsync (s) -> + s.dragging = dragging if s.dragging? + + maybeHookToEvent 'dragend', -> + dragging = false + scope.$evalAsync (s) -> + s.dragging = dragging if s.dragging? + + updateCenter = (c = _gMap.center, s = scope) -> + unless _.includes disabledEvents, 'center' + cLat = c.lat() + cLng = c.lng() + if angular.isDefined(s.center.type) + s.center.coordinates[1] = cLat if s.center.coordinates[1] isnt cLat + s.center.coordinates[0] = cLng if s.center.coordinates[0] isnt cLng + else + s.center.latitude = cLat if s.center.latitude isnt cLat + s.center.longitude = cLng if s.center.longitude isnt cLng + + settingFromDirective = false + maybeHookToEvent 'idle', -> + b = _gMap.getBounds() + ne = b.getNorthEast() + sw = b.getSouthWest() + + settingFromDirective = true + scope.$evalAsync (s) -> + + updateCenter() + + if !_.isUndefined(s.bounds) and !_.includes(disabledEvents, 'bounds') + s.bounds.northeast = + latitude: ne.lat() + longitude: ne.lng() + + s.bounds.southwest = + latitude: sw.lat() + longitude: sw.lng() + + if not _.includes(disabledEvents, 'zoom') + s.zoom = _gMap.zoom + scope.idleAndZoomChanged = !scope.idleAndZoomChanged + settingFromDirective = false + + if angular.isDefined(scope.events) and scope.events isnt null and angular.isObject(scope.events) + getEventHandler = (eventName) -> + -> scope.events[eventName].apply scope, [_gMap, eventName, arguments] + + customListeners = [] + for eventName of scope.events + if scope.events.hasOwnProperty(eventName) and angular.isFunction(scope.events[eventName]) + customListeners.push google.maps.event.addListener _gMap, eventName, getEventHandler(eventName) + listeners.concat customListeners + + # Put the map into the scope + # free-draw-polygons depends on this + #possibly risky, but this adds the original options to be accessible + #if we end up watching options this should be updated (appears to be free-draw only this should probably go away) + _gMap.getOptions = -> + mapOptions + scope.map = _gMap + + # check if have an external control hook to direct us manually without watches + # this will normally be an empty object that we extend and slap functionality + # onto with this directive + if attrs.control? and scope.control? + scope.control.refresh = (maybeCoords) => + return unless _gMap? + if google?.maps?.event?.trigger? and _gMap? + google.maps.event.trigger _gMap, 'resize' #actually refresh + if maybeCoords?.latitude? and maybeCoords?.longitude? + coords = @getCoords(maybeCoords) + if @isTrue(attrs.pan) + _gMap.panTo coords + else + _gMap.setCenter coords + + scope.control.getGMap = -> + _gMap + scope.control.getMapOptions = -> + mapOptions + #make customListeners available so a user can de-register the ones they want + #they can map / trim this list and hand it back to us + scope.control.getCustomEventListeners = -> + customListeners + scope.control.removeEvents = (yourListeners) -> + uiGmapEventsHelper.removeEvents(yourListeners) + + #UPDATES / SETS FROM CONTROLLER TO COMMAND DIRECTIVE + #TODO: These watches could potentially be removed infavor of using control only + # Update map when center coordinates change + scope.$watch 'center', (newValue, oldValue) => + return if newValue == oldValue or settingFromDirective + coords = @getCoords scope.center #get scope.center to make sure that newValue is not behind + return if coords.lat() is _gMap.center.lat() and coords.lng() is _gMap.center.lng() + + unless dragging + if !@validateCoords(newValue) + $log.error("Invalid center for newValue: #{JSON.stringify newValue}") + if @isTrue(attrs.pan) and scope.zoom is _gMap.zoom + _gMap.panTo coords + else + _gMap.setCenter coords + , true + + zoomPromise = null + scope.$watch 'zoom', (newValue, oldValue) -> + return unless newValue? + return if _.isEqual(newValue,oldValue) or _gMap?.getZoom() == scope?.zoom or settingFromDirective + #make this time out longer than zoom_changes because zoom_changed should be done first + #being done first should make scopes equal + $timeout.cancel(zoomPromise) if zoomPromise? + zoomPromise = $timeout -> + _gMap.setZoom newValue + , scope.eventOpts?.debounce?.zoomMs + 20 + , false + + scope.$watch 'bounds', (newValue, oldValue) -> + return if newValue is oldValue + if !newValue?.northeast?.latitude? or !newValue?.northeast?.longitude? or + !newValue?.southwest?.latitude? or !newValue?.southwest?.longitude? + $log.error "Invalid map bounds for new value: #{JSON.stringify newValue}" + return + ne = new google.maps.LatLng(newValue.northeast.latitude, newValue.northeast.longitude) + sw = new google.maps.LatLng(newValue.southwest.latitude, newValue.southwest.longitude) + bounds = new google.maps.LatLngBounds(sw, ne) + _gMap.fitBounds bounds + + ['options','styles'].forEach (toWatch) -> + scope.$watch toWatch, (newValue,oldValue) -> + return if _.isEqual(newValue,oldValue) + if toWatch == 'options' + opts.options = newValue + else + opts.options[toWatch] = newValue + _gMap.setOptions opts if _gMap? + , true diff --git a/src/coffee/directives/api/marker.coffee b/src/coffee/directives/api/marker.coffee new file mode 100644 index 000000000..cf1f840c8 --- /dev/null +++ b/src/coffee/directives/api/marker.coffee @@ -0,0 +1,39 @@ +###global _:true,angular:true### +angular.module("uiGmapgoogle-maps.directives.api") +.factory "uiGmapMarker", [ + "uiGmapIMarker", "uiGmapMarkerChildModel", "uiGmapMarkerManager", "uiGmapLogger", + (IMarker, MarkerChildModel, MarkerManager, $log) -> + class Marker extends IMarker + constructor: -> + super() + @template = '' + $log.info @ + + controller: ['$scope', '$element', ($scope, $element) -> + $scope.ctrlType = 'Marker' + _.extend @, IMarker.handle($scope, $element) + ] + + link:(scope, element, attrs, ctrl) -> + mapPromise = IMarker.mapPromise(scope, ctrl) + mapPromise.then (gMap) -> + gManager = new MarkerManager gMap + + keys = _.object(IMarker.keys,IMarker.keys) + + m = new MarkerChildModel { + scope, model: scope, keys, gMap, + doClick: true, gManager, + doDrawSelf: false, trackModel: false + } + + m.deferred.promise.then (gMarker) -> + scope.deferred.resolve gMarker + + if scope.control? + scope.control.getGMarkers = gManager.getGMarkers + + scope.$on '$destroy', -> + gManager?.clear() + gManager = null +] diff --git a/src/coffee/directives/api/markers.coffee b/src/coffee/directives/api/markers.coffee new file mode 100644 index 000000000..fdcbac5f2 --- /dev/null +++ b/src/coffee/directives/api/markers.coffee @@ -0,0 +1,51 @@ +###global _:true,angular:true### +angular.module("uiGmapgoogle-maps.directives.api") +.factory "uiGmapMarkers", [ + "uiGmapIMarker", "uiGmapPlural", "uiGmapMarkersParentModel", "uiGmap_sync", "uiGmapLogger", + (IMarker, Plural, MarkersParentModel, _sync, $log) -> + class Markers extends IMarker + constructor: -> + super() + @template = '' + Plural.extend @, + doCluster: '=?docluster' #deprecated use type instead; 2.2 we will remove + clusterOptions: '=clusteroptions'#deprecated use typeOptions instead; 2.2 we will remove + clusterEvents: '=clusterevents'#deprecated use typeEvents instead; 2.2 we will remove + modelsByRef: '=modelsbyref' + type: '=?type' # cluster, spider, default undefined - normal + typeOptions: '=?typeoptions' + typeEvents: '=?typeevents' + deepComparison: '=?deepcomparison' + + $log.info @ + + controller: ['$scope', '$element', ($scope, $element) -> + $scope.ctrlType = 'Markers' + _.extend @, IMarker.handle($scope, $element) + ] + + link: (scope, element, attrs, ctrl) -> + parentModel = undefined + + ready = -> + scope.deferred.resolve() + + IMarker.mapPromise(scope, ctrl).then (map) -> + mapScope = ctrl.getScope() + + #this is to deal with race conditions in how MarkerClusterer deals with drawing on idle + mapScope.$watch 'idleAndZoomChanged', -> + _.defer parentModel.gManager.draw + + parentModel = new MarkersParentModel(scope, element, attrs, map) + Plural.link(scope, parentModel) + if scope.control? + scope.control.getGMarkers = -> + parentModel.gManager?.getGMarkers() + #deprecated use getPlurals + scope.control.getChildMarkers = -> + parentModel.plurals + + _.last(parentModel.existingPieces._content).then -> + ready() +] diff --git a/src/coffee/directives/api/models/child/base-poly-child-model.coffee b/src/coffee/directives/api/models/child/base-poly-child-model.coffee new file mode 100644 index 000000000..e98a843d0 --- /dev/null +++ b/src/coffee/directives/api/models/child/base-poly-child-model.coffee @@ -0,0 +1,112 @@ +###global _,angular### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapBasePolyChildModel', [ + 'uiGmapLogger', '$timeout', 'uiGmaparray-sync', 'uiGmapGmapUtil', 'uiGmapEventsHelper' + ($log, $timeout, arraySync, GmapUtil, EventsHelper) -> + (Builder, gFactory) -> + class BasePolyChildModel extends Builder + @include GmapUtil + constructor: ({@scope, @attrs, @gMap, @defaults, @model, gObjectChangeCb, @isScopeModel = false}) -> + #where @model is a reference to model in the controller scope + #clonedModel is a copy for comparison + if @isScopeModel + @clonedModel = _.clone @model, true + + @isDragging = false + @internalEvents = + dragend: => + # allow the lock of dragging to overrun slightly to make sure nothing is created unnecessarily + _.defer => + @isDragging = false + dragstart: => + @isDragging = true + + create = => + return if @isDragging #avoid unnecessary creation (be nice if we knew we were editing too) + @pathPoints = @convertPathPoints @scope.path + if @gObject? + @clean() + if @scope.model? + maybeCachedEval = @scope + @gObject = gFactory @buildOpts(@pathPoints, maybeCachedEval) if @pathPoints.length > 0 + if @gObject + arraySync @gObject.getPath(), @scope, 'path', (pathPoints) => + @pathPoints = pathPoints + gObjectChangeCb() if gObjectChangeCb? + if angular.isDefined(@scope.events) and angular.isObject @scope.events + @listeners = if @model then EventsHelper.setEvents @gObject, @scope, @model else EventsHelper.setEvents @gObject, @scope, @scope + @internalListeners = if @model then EventsHelper.setEvents @gObject, events: @internalEvents, @model else EventsHelper.setEvents @gObject, events: @internalEvents, @scope + + create() #handle stuff without being dependent on digests (ie using watches for init) + + @scope.$watch 'path', (newValue, oldValue) => + if not _.isEqual(newValue, oldValue) or not @gObject + create() + , true + #TODO refactor all these sets and watches to be handled functionally as an array + #Begin Booleans + if !@scope.static and angular.isDefined(@scope.editable) + @scope.$watch 'editable', (newValue, oldValue) => + if newValue isnt oldValue + newValue = not @isFalse newValue + @gObject?.setEditable newValue + , true + if angular.isDefined @scope.draggable + @scope.$watch 'draggable', (newValue, oldValue) => + if newValue isnt oldValue + newValue = not @isFalse newValue + @gObject?.setDraggable newValue + , true + if angular.isDefined @scope.visible + @scope.$watch 'visible', (newValue, oldValue) => + if newValue isnt oldValue + newValue = not @isFalse newValue + @gObject?.setVisible newValue + , true + if angular.isDefined @scope.geodesic + @scope.$watch 'geodesic', (newValue, oldValue) => + if newValue isnt oldValue + newValue = not @isFalse newValue + @gObject?.setOptions @buildOpts(@gObject.getPath()) + , true + #End Booleans + + if angular.isDefined(@scope.stroke) and angular.isDefined(@scope.stroke.weight) + @scope.$watch 'stroke.weight', (newValue, oldValue) => + @gObject?.setOptions @buildOpts(@gObject.getPath()) if newValue isnt oldValue + , true + if angular.isDefined(@scope.stroke) and angular.isDefined(@scope.stroke.color) + @scope.$watch 'stroke.color', (newValue, oldValue) => + @gObject?.setOptions @buildOpts(@gObject.getPath()) if newValue isnt oldValue + , true + if angular.isDefined(@scope.stroke) and angular.isDefined(@scope.stroke.opacity) + @scope.$watch 'stroke.opacity', (newValue, oldValue) => + @gObject?.setOptions @buildOpts(@gObject.getPath()) if newValue isnt oldValue + , true + if angular.isDefined(@scope.icons) + @scope.$watch 'icons', (newValue, oldValue) => + @gObject?.setOptions @buildOpts(@gObject.getPath()) if newValue isnt oldValue + , true + # Remove @gObject on scope $destroy + @scope.$on '$destroy', => + @clean() + @scope = null + + if angular.isDefined(@scope.fill) and angular.isDefined @scope.fill.color + @scope.$watch 'fill.color', (newValue, oldValue) => + @gObject.setOptions @buildOpts(@gObject.getPath()) if newValue isnt oldValue + + if angular.isDefined(@scope.fill) and angular.isDefined @scope.fill.opacity + @scope.$watch 'fill.opacity', (newValue, oldValue) => + @gObject.setOptions @buildOpts(@gObject.getPath()) if newValue isnt oldValue + + if angular.isDefined @scope.zIndex + @scope.$watch 'zIndex', (newValue, oldValue) => + @gObject.setOptions @buildOpts(@gObject.getPath()) if newValue isnt oldValue + + clean: => + EventsHelper.removeEvents @listeners + EventsHelper.removeEvents @internalListeners + @gObject?.setMap null + @gObject = null +] diff --git a/src/coffee/directives/api/models/child/free-draw-polygons-child.coffee b/src/coffee/directives/api/models/child/free-draw-polygons-child.coffee new file mode 100644 index 000000000..a3e5b5584 --- /dev/null +++ b/src/coffee/directives/api/models/child/free-draw-polygons-child.coffee @@ -0,0 +1,65 @@ +### +@authors +Nicholas McCready - https://twitter.com/nmccready +Original idea from: http://stackoverflow.com/questions/22758950/google-map-drawing-freehand , & + http://jsfiddle.net/YsQdh/88/ +### +angular.module('uiGmapgoogle-maps.directives.api.models.child') +.factory 'uiGmapDrawFreeHandChildModel', ['uiGmapLogger', '$q', ($log, $q) -> + drawFreeHand = (map, polys, done) -> + poly = new google.maps.Polyline + map: map + clickable: false + + move = google.maps.event.addListener map, 'mousemove', (e) -> + poly.getPath().push e.latLng + + google.maps.event.addListenerOnce map, 'mouseup', (e) -> + google.maps.event.removeListener move + path = poly.getPath() + poly.setMap null + polys.push new google.maps.Polygon + map: map + path: path + poly = null + google.maps.event.clearListeners map.getDiv(), 'mousedown' + done() + + undefined + + freeHandMgr = (@map, scope) -> + disableMap = => + # Whilst drawing, freeze the map (so that mouse "drag" action draws and doesn't move the map). + mapOptions = + draggable: false + disableDefaultUI: true + scrollwheel: false + disableDoubleClickZoom: false + + $log.info 'disabling map move' + @map.setOptions mapOptions + + enableMap = => + # After drawing, un-freeze the map. + mapOptions = + draggable: true + disableDefaultUI: false + scrollwheel: true + disableDoubleClickZoom: true + + @deferred?.resolve() + _.defer => + @map.setOptions _.extend mapOptions, scope.options + + @engage = (@polys) => + @deferred = $q.defer() + disableMap() + $log.info 'DrawFreeHandChildModel is engaged (drawing).' + google.maps.event.addDomListener @map.getDiv(), 'mousedown', (e) => + drawFreeHand @map, @polys, enableMap + @deferred.promise + + this + + freeHandMgr +] diff --git a/src/coffee/directives/api/models/child/marker-child-model.coffee b/src/coffee/directives/api/models/child/marker-child-model.coffee new file mode 100644 index 000000000..9c1a71a3a --- /dev/null +++ b/src/coffee/directives/api/models/child/marker-child-model.coffee @@ -0,0 +1,230 @@ +###global _:true,angular:true,google:true, RichMarker:true### +angular.module('uiGmapgoogle-maps.directives.api.models.child') +.factory 'uiGmapMarkerChildModel', [ + 'uiGmapModelKey', 'uiGmapGmapUtil', + 'uiGmapLogger', 'uiGmapEventsHelper', 'uiGmapPropertyAction', + 'uiGmapMarkerOptions', 'uiGmapIMarker', 'uiGmapMarkerManager', 'uiGmapPromise', + (ModelKey, GmapUtil, $log, EventsHelper, PropertyAction, MarkerOptions, IMarker, MarkerManager, uiGmapPromise) -> + + class MarkerChildModel extends ModelKey + @include GmapUtil + @include EventsHelper + @include MarkerOptions + + destroy = (child) -> + if child?.gObject? + child.removeEvents child.externalListeners + child.removeEvents child.internalListeners + if child?.gObject + child.gManager.remove child.gObject if child.removeFromManager + child.gObject.setMap null + child.gObject = null + + constructor: (opts) -> + { + scope, @model, @keys, @gMap, @defaults = {}, + @doClick, @gManager, @doDrawSelf = true, + @trackModel = true, @needRedraw = false + @isScopeModel = false + } = opts + #where @model is a reference to model in the controller scope + #clonedModel is a copy for comparison (see models-watcher) + @clonedModel = _.clone(@model,true) if @isScopeModel + @deferred = uiGmapPromise.defer() + _.each @keys, (v, k) => + keyValue = @keys[k] + if keyValue? and not _.isFunction(keyValue) and _.isString(keyValue) + @[k + 'Key'] = keyValue + @idKey = @idKeyKey or 'id' + @id = @model[@idKey] if @model[@idKey]? + + super(scope) + + @scope.getGMarker = => + @gObject + + @firstTime = true + if @trackModel + @scope.model = @model + @scope.$watch 'model', (newValue, oldValue) => + if (newValue != oldValue) + @handleModelChanges newValue, oldValue + , true + else + action = new PropertyAction (calledKey) => + #being in a closure works , direct to setMyScope is not working (but should?) + calledKey = 'all' if _.isFunction calledKey + if not @firstTime + @setMyScope calledKey, scope + , false + + _.each @keys, (v, k) -> + scope.$watch k, action.sic(k), true + + #hiding destroy functionality as it should only be called via scope.$destroy() + @scope.$on '$destroy', => + destroy @ + + # avoid double creation, but this might be needed for + # @setMyScope 'all', @model, undefined, true + @createMarker @model + $log.info @ + + destroy: (removeFromManager = true) => + @removeFromManager = removeFromManager + @scope.$destroy() + + handleModelChanges: (newValue, oldValue) => + changes = @getChanges newValue, oldValue, IMarker.keys + if not @firstTime + ctr = 0 + len = _.keys(changes).length + _.each changes, (v, k) => + ctr += 1 + doDraw = len == ctr + @setMyScope k, newValue, oldValue, false, true, doDraw + @needRedraw = true + + updateModel: (model) => + @clonedModel = _.clone(model,true) if @isScopeModel + @setMyScope 'all', model, @model + + renderGMarker: (doDraw = true, validCb) -> + #doDraw is to only update the marker on the map when it is really ready + coords = @getProp('coords', @scope, @model) + if @gManager?.isSpiderfied? + isSpiderfied = @gManager.isSpiderfied() + if coords? + if !@validateCoords coords + $log.debug 'MarkerChild does not have coords yet. They may be defined later.' + return + + validCb() if validCb? + @gManager.add @gObject if doDraw and @gObject + @gManager.markerSpiderfier.spiderListener(@gObject, window.event) if isSpiderfied + else + @gManager.remove @gObject if doDraw and @gObject + + + setMyScope: (thingThatChanged, model, oldModel = undefined, isInit = false, doDraw = true) => + if not model? + model = @model + else + @model = model + + if !@gObject + @setOptions @scope, doDraw + justCreated = true + switch thingThatChanged + when 'all' + _.each @keys, (v, k) => + @setMyScope k, model, oldModel, isInit, doDraw + when 'icon' + @maybeSetScopeValue {gSetter: @setIcon, doDraw} + when 'coords' + @maybeSetScopeValue {gSetter: @setCoords, doDraw} + when 'options' + @createMarker(model, oldModel, isInit, doDraw) if !justCreated + + createMarker: (model, oldModel = undefined, isInit = false, doDraw = true) => + @maybeSetScopeValue {gSetter: @setOptions, doDraw} + @firstTime = false + + maybeSetScopeValue: ({gSetter, doDraw = true}) => + gSetter(@scope, doDraw) if gSetter? + @gManager.draw() if @doDrawSelf and doDraw + + isNotValid: (scope, doCheckGmarker = true) => + hasNoGmarker = unless doCheckGmarker then false else @gObject == undefined + hasIdenticalScopes = unless @trackModel then scope.$id != @scope.$id else false + hasIdenticalScopes or hasNoGmarker + + setCoords: (scope, doDraw = true) => + return if @isNotValid(scope) or !@gObject? + @renderGMarker doDraw, => + newModelVal = @getProp 'coords', scope, @model + newGValue = @getCoords newModelVal + oldGValue = @gObject.getPosition() + if oldGValue? and newGValue? + return if newGValue.lng() == oldGValue.lng() and newGValue.lat() == oldGValue.lat() + @gObject.setPosition newGValue + @gObject.setVisible @validateCoords newModelVal + + setIcon: (scope, doDraw = true) => + return if @isNotValid(scope) or !@gObject? + @renderGMarker doDraw, => + oldValue = @gObject.getIcon() + newValue = @getProp 'icon',scope, @model + return if oldValue == newValue + @gObject.setIcon newValue + coords = @getProp 'coords', scope, @model + @gObject.setPosition @getCoords coords + @gObject.setVisible @validateCoords coords + + setOptions: (scope, doDraw = true) => + return if @isNotValid scope, false + @renderGMarker doDraw, => + coords = @getProp 'coords', scope, @model + icon = @getProp 'icon', scope, @model + _options = @getProp 'options', scope, @model + @opts = @createOptions coords, icon, _options + + if @isLabel(@gObject) != @isLabel(@opts) and @gObject? + @gManager.remove @gObject + @gObject = undefined + + #update existing options if it is the same type + if @gObject? + @gObject.setOptions @setLabelOptions @opts + + unless @gObject + if @isLabel @opts + @gObject = new MarkerWithLabel @setLabelOptions @opts + else if @opts.content + @gObject = new RichMarker @opts + @gObject.getIcon = @gObject.getContent + @gObject.setIcon = @gObject.setContent + else + @gObject = new google.maps.Marker @opts + _.extend @gObject, model: @model + + #hook external event handlers for events + @removeEvents @externalListeners if @externalListeners + @removeEvents @internalListeners if @internalListeners + @externalListeners = @setEvents @gObject, @scope, @model, ['dragend'] + #must pass fake $evalAsync see events-helper + @internalListeners = @setEvents @gObject, {events: @internalEvents(), $evalAsync: -> }, @model + + @gObject.key = @id if @id? + + if @gObject and (@gObject.getMap() or @gManager.type != MarkerManager.type) + @deferred.resolve @gObject + else + return @deferred.reject 'gObject is null' unless @gObject + unless @gObject?.getMap() and @gManager.type == MarkerManager.type + $log.debug 'gObject has no map yet' + @deferred.resolve @gObject + + if @model[@fitKey] + @gManager.fit() + + setLabelOptions: (opts) => + opts.labelAnchor = @getLabelPositionPoint opts.labelAnchor if opts.labelAnchor + opts + + internalEvents: => + dragend: (marker, eventName, model, mousearg) => + modelToSet = if @trackModel then @scope.model else @model + newCoords = @setCoordsFromEvent @modelOrKey(modelToSet, @coordsKey), @gObject.getPosition() + modelToSet = @setVal model, @coordsKey, newCoords + #since we ignored dragend for scope above, if @scope.events has it then we should fire it + events = @scope.events + events.dragend(marker, eventName, modelToSet, mousearg) if events?.dragend? + @scope.$apply() + click: (marker, eventName, model, mousearg) => + click = @getProp 'click', @scope, @model + if @doClick and angular.isFunction(click) + @scope.$evalAsync click marker, eventName, @model, mousearg + + MarkerChildModel +] diff --git a/src/coffee/directives/api/models/child/polygon-child-model.coffee b/src/coffee/directives/api/models/child/polygon-child-model.coffee new file mode 100644 index 000000000..5a4c7cb64 --- /dev/null +++ b/src/coffee/directives/api/models/child/polygon-child-model.coffee @@ -0,0 +1,10 @@ +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapPolygonChildModel', [ + 'uiGmapBasePolyChildModel', 'uiGmapPolygonOptionsBuilder', + (BaseGen, Builder) -> + gFactory = (opts) -> + new google.maps.Polygon opts + + base = new BaseGen(Builder, gFactory) + return class PolygonChildModel extends base +] diff --git a/src/coffee/directives/api/models/child/polyline-child-model.coffee b/src/coffee/directives/api/models/child/polyline-child-model.coffee new file mode 100644 index 000000000..92d7e6f6e --- /dev/null +++ b/src/coffee/directives/api/models/child/polyline-child-model.coffee @@ -0,0 +1,10 @@ +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapPolylineChildModel', [ + 'uiGmapBasePolyChildModel', 'uiGmapPolylineOptionsBuilder', + (BaseGen, Builder) -> + gFactory = (opts) -> + new google.maps.Polyline opts + + base = BaseGen(Builder, gFactory) + return class PolylineChildModel extends base +] diff --git a/src/coffee/directives/api/models/child/window-child-model.coffee b/src/coffee/directives/api/models/child/window-child-model.coffee new file mode 100644 index 000000000..01e6c74bc --- /dev/null +++ b/src/coffee/directives/api/models/child/window-child-model.coffee @@ -0,0 +1,217 @@ +###global _:true,angular:true,google:true### +angular.module('uiGmapgoogle-maps.directives.api.models.child') +.factory 'uiGmapWindowChildModel', + ['uiGmapBaseObject', 'uiGmapGmapUtil', 'uiGmapLogger', '$compile', '$http', '$templateCache', + 'uiGmapChromeFixes', 'uiGmapEventsHelper', + (BaseObject, GmapUtil, $log, $compile, $http, $templateCache, ChromeFixes, EventsHelper) -> + class WindowChildModel extends BaseObject + @include GmapUtil + @include EventsHelper + constructor: (opts) -> + { + @model = {}, @scope, @opts, @isIconVisibleOnClick, + @gMap, @markerScope, @element, + @needToManualDestroy = false, + @markerIsVisibleAfterWindowClose = true, + @isScopeModel = false + } = opts + + #where @model is a reference to model in the controller scope + #clonedModel is a copy for comparison + @clonedModel = _.clone @model, true if @isScopeModel + + @getGmarker = -> + @markerScope?.getGMarker() if @markerScope?['getGMarker']? + + @listeners = [] + @createGWin() + + maybeMarker = @getGmarker() + maybeMarker.setClickable(true) if maybeMarker? + + @watchElement() + @watchOptions() + @watchCoords() + + @watchAndDoShow() + @scope.$on '$destroy', => + @destroy() + $log.info @ + + doShow: (wasOpen) => + if @scope.show == true or wasOpen + @showWindow() + else + @hideWindow() + + watchAndDoShow: => + @scope.show = @model.show if @model.show? + @scope.$watch 'show', @doShow, true + @doShow() + + + watchElement: => + #note this is not efficient and is mainly dependent on model changing anywhere + #thus this is more targeted towards window and now windows + #if updateModel is used then it is more direct without watch overhead + #supporting this until window is removed + @scope.$watch => + return unless @element or @html + if @html isnt @element.html() and @gObject + @opts?.content = undefined + wasOpen = @gObject.isOpen() + @remove() + @createGWin(wasOpen) + + createGWin: (isOpen = false) => + maybeMarker = @getGmarker() + + defaults = {} + if @opts? + #being double careful for race condition on @opts.position via watch coords (if element and coords change at same time) + @opts.position = @getCoords @scope.coords if @scope.coords + defaults = @opts + if @element + @html = if _.isObject(@element) then @element.html() else @element + _opts = if @scope.options then @scope.options else defaults + @opts = @createWindowOptions maybeMarker, @markerScope or @scope, @html, _opts + + if @opts? + unless @gObject + if @opts.boxClass and (window.InfoBox and typeof window.InfoBox is 'function') + @gObject = new window.InfoBox @opts + else + @gObject = new google.maps.InfoWindow @opts + + # Set visibility of marker back to what it was before opening the window + @listeners.push google.maps.event.addListener @gObject, 'domready', -> + ChromeFixes.maybeRepaint @content + + @listeners.push google.maps.event.addListener @gObject, 'closeclick', => + if maybeMarker + maybeMarker.setAnimation @oldMarkerAnimation + if @markerIsVisibleAfterWindowClose + _.delay => #appears to help animation chrome bug + maybeMarker.setVisible false + maybeMarker.setVisible @markerIsVisibleAfterWindowClose + , 250 + @gObject.close() + @model.show = false + if @scope.closeClick? + @scope.$evalAsync @scope.closeClick() + else + #update models state change since it is out of angular scope (closeClick) + @scope.$evalAsync() + @gObject.setContent @opts.content + @handleClick(@scope?.options?.forceClick or isOpen) + @doShow(@gObject.isOpen()) + + watchCoords: => + scope = if @markerScope? then @markerScope else @scope + scope.$watch 'coords', (newValue, oldValue) => + if newValue isnt oldValue + unless newValue? + @hideWindow() + else if !@validateCoords newValue + $log.error "WindowChildMarker cannot render marker as scope.coords as no position on marker: #{JSON.stringify @model}" + return + pos = @getCoords newValue + @doShow() + @gObject.setPosition pos + @opts.position = pos if @opts + , true + + watchOptions: => + #windows and markers options are separate + @scope.$watch 'options', (newValue, oldValue) => + if newValue isnt oldValue + @opts = newValue + if @gObject? + @gObject.setOptions @opts + + if @opts.visible? and @opts.visible + @showWindow() + else if @opts.visible? + @hideWindow() + + , true + + handleClick: (forceClick) => + return unless @gObject? + # Show the window and hide the marker on click + maybeMarker = @getGmarker() + click = => + @createGWin() unless @gObject? + @showWindow() + if maybeMarker? + @initialMarkerVisibility = maybeMarker.getVisible() + @oldMarkerAnimation = maybeMarker.getAnimation() + maybeMarker.setVisible @isIconVisibleOnClick + + click() if forceClick + if maybeMarker + @listeners = @listeners.concat @setEvents maybeMarker, {events: {click: click}}, @model + + showWindow: => + return unless @gObject? + templateScope = null + + show = => + unless @gObject.isOpen() + maybeMarker = @getGmarker() + pos = @gObject.getPosition() if @gObject? and @gObject.getPosition? + pos = maybeMarker.getPosition() if maybeMarker + return unless pos + @gObject.open @gMap, maybeMarker + isOpen = @gObject.isOpen() + @model.show = isOpen if @model.show != isOpen + + if @scope.templateUrl + $http.get(@scope.templateUrl, { cache: $templateCache }).then (content) => + templateScope = @scope.$new() + if angular.isDefined @scope.templateParameter + templateScope.parameter = @scope.templateParameter + compiled = $compile(content.data) templateScope + @gObject.setContent compiled[0] + show() + + else if @scope.template + templateScope = @scope.$new() + if angular.isDefined(@scope.templateParameter) + templateScope.parameter = @scope.templateParameter + compiled = $compile(@scope.template) templateScope + @gObject.setContent compiled[0] + show() + else + show() + + @scope.$on 'destroy', -> templateScope.$destroy() + + hideWindow: => + @gObject.close() if @gObject? and @gObject.isOpen() + + getLatestPosition: (overridePos) => + maybeMarker = @getGmarker() + if @gObject? and maybeMarker? and not overridePos + @gObject.setPosition maybeMarker.getPosition() + else + @gObject.setPosition overridePos if overridePos + + remove: => + @hideWindow() + @removeEvents @listeners + @listeners.length = 0 + delete @gObject + delete @opts + + destroy: (manualOverride = false) => + @remove() + if (@scope? and not @scope?.$$destroyed) and (@needToManualDestroy or manualOverride) + @scope.$destroy() + + updateModel: (model) => + @clonedModel = _.clone(model,true) if @isScopeModel + _.extend(@model, @clonedModel or model) + + WindowChildModel + ] diff --git a/src/coffee/directives/api/models/parent/base-polys-parent-model.coffee b/src/coffee/directives/api/models/parent/base-polys-parent-model.coffee new file mode 100644 index 000000000..19df035c0 --- /dev/null +++ b/src/coffee/directives/api/models/parent/base-polys-parent-model.coffee @@ -0,0 +1,175 @@ +###global _, angular### +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapBasePolysParentModel', [ + '$timeout', 'uiGmapLogger','uiGmapModelKey', 'uiGmapModelsWatcher', + 'uiGmapPropMap', 'uiGmap_async', 'uiGmapPromise', 'uiGmapFitHelper' + ($timeout, $log, ModelKey, ModelsWatcher, + PropMap, _async, uiGmapPromise, FitHelper) -> + (IPoly, PolyChildModel, gObjectName) -> + class BasePolysParentModel extends ModelKey + @include ModelsWatcher + constructor: (scope, @element, @attrs, @gMap, @defaults) -> + super(scope) + @interface = IPoly + + @$log = $log + @plurals = new PropMap() + + #setting up local references to propety keys IE: @pathKey + _.each IPoly.scopeKeys, (name) => @[name + 'Key'] = undefined + @models = undefined + @firstTime = true + @$log.info @ + + # @watchOurScope(scope) + @createChildScopes() + + watchModels: (scope) => + ### + This was watchCollection but not all model changes were being caught. + TODO: Make the directive flexible in overriding whether we watch models (and depth) via watch or watchColleciton. + ### + scope.$watch 'models', (newValue, oldValue) => + unless newValue == oldValue + if @doINeedToWipe(newValue) or scope.doRebuildAll + @rebuildAll(scope, true, true) + else + @createChildScopes(false) + , true + + doINeedToWipe: (newValue) => + newValueIsEmpty = if newValue? then newValue.length == 0 else true + @plurals.length > 0 and newValueIsEmpty + + rebuildAll: (scope, doCreate, doDelete) => + @onDestroy(doDelete).then => + @createChildScopes() if doCreate + + onDestroy: () => + super(@scope) + _async.promiseLock @, uiGmapPromise.promiseTypes.delete, undefined, undefined, => + _async.each @plurals.values(), (child) -> + child.destroy true #to make sure it is really dead, otherwise watchers can kick off (artifacts in path create) + , _async.chunkSizeFrom(@scope.cleanchunk, false) + .then => + @plurals?.removeAll() + + watchDestroy: (scope) => + scope.$on '$destroy', => + @rebuildAll(scope, false, true) + + createChildScopes: (isCreatingFromScratch = true) => + if angular.isUndefined(@scope.models) + @$log.error("No models to create #{gObjectName}s from! I Need direct models!") + return + + return if not @gMap? or not @scope.models? + @watchIdKey @scope + if isCreatingFromScratch + @createAllNew @scope, false + else + @pieceMeal @scope, false + + watchIdKey: (scope) => + @setIdKey scope + scope.$watch 'idKey', (newValue, oldValue) => + if (newValue != oldValue and !newValue?) + @idKey = newValue + @rebuildAll(scope, true, true) + + createAllNew: (scope, isArray = false) => + @models = scope.models + if @firstTime + @watchModels scope + @watchDestroy scope + + return if @didQueueInitPromise(@,scope) + + #allows graceful fallout of _async.each + maybeCanceled = null + _async.promiseLock @, uiGmapPromise.promiseTypes.create, 'createAllNew', ((canceledMsg) -> maybeCanceled = canceledMsg), => + _async.map scope.models, (model) => + child = @createChild(model, @gMap) + if maybeCanceled + $log.debug 'createNew should fall through safely' + child.isEnabled = false + maybeCanceled + child.pathPoints.getArray() + , _async.chunkSizeFrom scope.chunk + .then (pathPoints) => + @maybeFit(pathPoints) + #handle done callBack + @firstTime = false + + pieceMeal: (scope, isArray = true) => + return if scope.$$destroyed + #allows graceful fallout of _async.each + maybeCanceled = null + payload = null + @models = scope.models + + if scope? and @modelsLength() and @plurals.length + _async.promiseLock @, uiGmapPromise.promiseTypes.update, 'pieceMeal', ((canceledMsg) -> maybeCanceled = canceledMsg), => + uiGmapPromise.promise( => @figureOutState @idKey, scope, @plurals, @modelKeyComparison) + .then (state) => + payload = state + if(payload.updates.length) + _async.each payload.updates, (obj) -> + _.extend obj.child.scope, obj.model + obj.child.model = obj.model + _async.each payload.removals, (child) => + if child? + child.destroy() + @plurals.remove(child.model[@idKey]) + maybeCanceled + , _async.chunkSizeFrom scope.chunk + .then => + #add all adds via creating new ChildMarkers which are appended to @markers + _async.each payload.adds, (modelToAdd) => + if maybeCanceled + $log.debug 'pieceMeal should fall through safely' + @createChild(modelToAdd, @gMap) + maybeCanceled + , _async.chunkSizeFrom scope.chunk + .then => + @maybeFit() + else + @inProgress = false + @rebuildAll(@scope, true, true) + + createChild: (model, gMap) => + childScope = @scope.$new(false) + @setChildScope(IPoly.scopeKeys, childScope, model) + + childScope.$watch 'model', (newValue, oldValue) => + if(newValue != oldValue) + @setChildScope(IPoly.scopeKeys, childScope, newValue) + , true + + childScope.static = @scope.static + child = new PolyChildModel { + isScopeModel: true, + scope: childScope + attrs: @attrs + gMap + defaults: @defaults, model, + gObjectChangeCb: => + @maybeFit() + } + + unless model[@idKey]? + @$log.error """ + #{gObjectName} model has no id to assign a child to. + This is required for performance. Please assign id, + or redirect id to a different key. + """ + return + @plurals.put(model[@idKey], child) + # $log.debug "create: " + @plurals.length + child + + maybeFit: (pathPoints = @plurals.map (p) -> p.pathPoints) => + if @scope.fit + pathPoints = _.flatten pathPoints + FitHelper.fit pathPoints, @gMap +] diff --git a/src/coffee/directives/api/models/parent/circle-parent-model.coffee b/src/coffee/directives/api/models/parent/circle-parent-model.coffee new file mode 100644 index 000000000..d6deb6364 --- /dev/null +++ b/src/coffee/directives/api/models/parent/circle-parent-model.coffee @@ -0,0 +1,91 @@ +###globals angular, _, google### +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapCircleParentModel', +['uiGmapLogger', '$timeout','uiGmapGmapUtil', +'uiGmapEventsHelper', 'uiGmapCircleOptionsBuilder', +($log, $timeout, GmapUtil, EventsHelper, Builder) -> + _settingFromDirective = (scope, fn) -> + scope.settingFromDirective = true + fn() + $timeout -> + scope.settingFromDirective = false + + class CircleParentModel extends Builder + @include GmapUtil + @include EventsHelper + constructor: (scope, element, @attrs, @gMap, @DEFAULTS) -> + @scope = scope + lastRadius = null + clean = => + lastRadius = null + if @listeners? + @removeEvents @listeners + @listeners = undefined + + gObject = + new google.maps.Circle @buildOpts GmapUtil.getCoords(scope.center), scope.radius + + @setMyOptions = (newVals, oldVals) => + return if scope.settingFromDirective + unless _.isEqual(newVals,oldVals) and + newVals == oldVals and + (if newVals? and oldVals? then newVals.coordinates == oldVals.coordinates else true) + gObject.setOptions @buildOpts GmapUtil.getCoords(scope.center), scope.radius + + @props = @props.concat [ + {prop: 'center',isColl: true} + {prop: 'fill',isColl: true} + 'radius' + 'zIndex' + ] + @watchProps() + + if @scope.control? + @scope.control.getCircle = -> + gObject + + clean() + @listeners = @setEvents(gObject, scope, scope, ['radius_changed']) or [] #or needed incase no-one is listening in controller + @listeners.push google.maps.event.addListener gObject, 'radius_changed', -> + ### + possible google bug, and or because a circle has two radii + radius_changed appears to fire twice (original and new) which is not too helpful + therefore we will check for radius changes manually and bail out if nothing has changed + ### + + newRadius = gObject.getRadius() + return if newRadius == lastRadius + + lastRadius = newRadius + + work = -> + _settingFromDirective scope, -> + scope.radius = newRadius if newRadius != scope.radius + if scope.events?.radius_changed and _.isFunction scope.events?.radius_changed + scope.events.radius_changed(gObject, 'radius_changed', scope, arguments) + + # hack + # for some reason in specs I can not get $evalAsync to fire.. im tired of wasting time on this + if not angular.mock + scope.$evalAsync -> + work() + else + work() + + @listeners.push google.maps.event.addListener gObject, 'center_changed', -> + scope.$evalAsync -> + _settingFromDirective scope, -> + if angular.isDefined(scope.center.type) + scope.center.coordinates[1] = gObject.getCenter().lat() + scope.center.coordinates[0] = gObject.getCenter().lng() + else + scope.center.latitude = gObject.getCenter().lat() + scope.center.longitude = gObject.getCenter().lng() + + + scope.$on '$destroy', -> + clean() + gObject.setMap null + + $log.info @ +] diff --git a/src/coffee/directives/api/models/parent/drawing-manager-parent-model.coffee b/src/coffee/directives/api/models/parent/drawing-manager-parent-model.coffee new file mode 100644 index 000000000..52454a0a6 --- /dev/null +++ b/src/coffee/directives/api/models/parent/drawing-manager-parent-model.coffee @@ -0,0 +1,33 @@ +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapDrawingManagerParentModel', + ['uiGmapLogger', '$timeout', 'uiGmapBaseObject', 'uiGmapEventsHelper', + ($log, $timeout, BaseObject, EventsHelper) -> + class DrawingManagerParentModel extends BaseObject + @include EventsHelper + constructor: (@scope, element, @attrs, @map) -> + gObject = new google.maps.drawing.DrawingManager @scope.options + gObject.setMap @map + + listeners = undefined + + if @scope.control? + @scope.control.getDrawingManager = -> + gObject + + if !@scope.static and @scope.options + @scope.$watch 'options', (newValue) -> + gObject?.setOptions newValue + , true + + if @scope.events? + listeners = @setEvents gObject, @scope, @scope + @scope.$watch 'events', (newValue, oldValue) => + unless _.isEqual newValue, oldValue + @removeEvents listeners if listeners? + listeners = @setEvents gObject, @scope, @scope + + @scope.$on '$destroy', => + @removeEvents listeners if listeners? + gObject.setMap null + gObject = null + ] diff --git a/src/coffee/directives/api/models/parent/i-marker-parent-model.coffee b/src/coffee/directives/api/models/parent/i-marker-parent-model.coffee new file mode 100644 index 000000000..e4004385e --- /dev/null +++ b/src/coffee/directives/api/models/parent/i-marker-parent-model.coffee @@ -0,0 +1,48 @@ +### + - interface for all markers to derrive from + - to enforce a minimum set of requirements + - attributes + - coords + - icon + - implementation needed on watches +### +angular.module("uiGmapgoogle-maps.directives.api.models.parent") +.factory "uiGmapIMarkerParentModel", ["uiGmapModelKey","uiGmapLogger", (ModelKey, Logger) -> + class IMarkerParentModel extends ModelKey + DEFAULTS: {} + constructor: (@scope, @element, @attrs, @map) -> + super(@scope) + @$log = Logger + # Validate required properties + unless @validateScope @scope + throw new String("Unable to construct IMarkerParentModel due to invalid scope") + @doClick = angular.isDefined @attrs.click + if @scope.options? + @DEFAULTS = @scope.options + # Wrap marker initialization inside a $timeout() call to make sure the map is created already + @watch 'coords', @scope + @watch 'icon', @scope + @watch 'options', @scope + @scope.$on "$destroy", => + @onDestroy(@scope) + + validateScope: (scope)=> + unless scope? + @$log.error(@constructor.name + ": invalid scope used") + return false + ret = scope.coords? + unless ret + @$log.error(@constructor.name + ": no valid coords attribute found") + return false + ret + + watch: (propNameToWatch, scope, equalityCheck = true) => + scope.$watch propNameToWatch, (newValue, oldValue) => + if ! _.isEqual newValue,oldValue + @onWatch(propNameToWatch, scope, newValue, oldValue) + , equalityCheck + + onWatch: (propNameToWatch, scope, newValue, oldValue) => + + return IMarkerParentModel +] diff --git a/src/coffee/directives/api/models/parent/i-window-parent-model.coffee b/src/coffee/directives/api/models/parent/i-window-parent-model.coffee new file mode 100644 index 000000000..bbbe9213c --- /dev/null +++ b/src/coffee/directives/api/models/parent/i-window-parent-model.coffee @@ -0,0 +1,21 @@ +angular.module("uiGmapgoogle-maps.directives.api.models.parent") +.factory "uiGmapIWindowParentModel", ["uiGmapModelKey", "uiGmapGmapUtil", "uiGmapLogger", (ModelKey, GmapUtil, Logger) -> + class IWindowParentModel extends ModelKey + @include GmapUtil + + constructor: (scope, element, attrs, ctrls, $timeout, $compile, $http, $templateCache) -> + super scope + @$log = Logger + @$timeout = $timeout + @$compile = $compile + @$http = $http + @$templateCache = $templateCache + @DEFAULTS = {} + if scope.options? + @DEFAULTS = scope.options + + getItem: (scope, modelsPropToIterate, index) -> + if modelsPropToIterate == 'models' + return scope[modelsPropToIterate][index] + scope[modelsPropToIterate].get index #otherwise it is a propMap +] diff --git a/src/coffee/directives/api/models/parent/layer-parent-model.coffee b/src/coffee/directives/api/models/parent/layer-parent-model.coffee new file mode 100644 index 000000000..11025ef14 --- /dev/null +++ b/src/coffee/directives/api/models/parent/layer-parent-model.coffee @@ -0,0 +1,43 @@ +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapLayerParentModel', ['uiGmapBaseObject', 'uiGmapLogger', '$timeout', (BaseObject, Logger, $timeout) -> + class LayerParentModel extends BaseObject + constructor: (@scope, @element, @attrs, @gMap, @onLayerCreated = undefined, @$log = Logger) -> + unless @attrs.type? + @$log.info 'type attribute for the layer directive is mandatory. Layer creation aborted!!' + return + @createGoogleLayer() + @doShow = true + + @doShow = @scope.show if angular.isDefined(@attrs.show) + @gObject.setMap @gMap if @doShow and @gMap? + @scope.$watch 'show', (newValue, oldValue) => + if newValue isnt oldValue + @doShow = newValue + if newValue + @gObject.setMap @gMap + else + @gObject.setMap null + , true + @scope.$watch 'options', (newValue, oldValue) => + if newValue isnt oldValue and @doShow + @gObject.setOptions newValue + , true + + @scope.$on '$destroy', => @gObject.setMap null + + createGoogleLayer: => + unless @attrs.options? + @gObject = if @attrs.namespace == undefined then new google.maps[@attrs.type]() + else new google.maps[@attrs.namespace][@attrs.type]() + else + @gObject = if @attrs.namespace == undefined then new google.maps[@attrs.type](@scope.options) + else new google.maps[@attrs.namespace][@attrs.type](@scope.options) + + if @gObject? and @doShow + @gObject.setMap @gMap + + if @gObject? and @onLayerCreated? + @onLayerCreated(@scope, @gObject)? @gObject + + LayerParentModel +] diff --git a/src/coffee/directives/api/models/parent/map-type-parent-model.coffee b/src/coffee/directives/api/models/parent/map-type-parent-model.coffee new file mode 100644 index 000000000..ae754890c --- /dev/null +++ b/src/coffee/directives/api/models/parent/map-type-parent-model.coffee @@ -0,0 +1,124 @@ +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapMapTypeParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', + (BaseObject, Logger) -> + class MapTypeParentModel extends BaseObject + constructor: (@scope, @element, @attrs, @gMap, @$log = Logger, @childModel, @propMap) -> + unless @scope.options? + @$log.info('options attribute for the map-type directive is mandatory. Map type creation aborted!!') + return + @id = @gMap.overlayMapTypesCount = @gMap.overlayMapTypesCount + 1 or 0 + @doShow = true + @createMapType() + @refreshShown() + @showOverlay() if @doShow and @gMap? + + watchChildModelShow = => + @childModel[@attrs.show] + watchShow = if @childModel then watchChildModelShow else 'show' + + @scope.$watch watchShow, (newValue, oldValue) => + if newValue isnt oldValue + @doShow = newValue + if newValue + @showOverlay() + else + @hideOverlay() + + watchChildModelOptions = => + @childModel[@attrs.options] + watchOptions = if @childModel then watchChildModelOptions else 'options' + + @scope.$watchCollection watchOptions, (newValue, oldValue) => + unless _.isEqual newValue, oldValue + mapTypeProps = [ + 'tileSize' + 'maxZoom' + 'minZoom' + 'name' + 'alt' + ] + different = _.some(mapTypeProps, (prop) -> + !oldValue or !newValue or !_.isEqual(newValue[prop], oldValue[prop]) + ) + if different + @refreshMapType() + + if angular.isDefined @attrs.refresh + @scope.$watch 'refresh', (newValue, oldValue) => + unless _.isEqual newValue, oldValue + @refreshMapType() + , true + + @scope.$on '$destroy', => + @hideOverlay() + @mapType = null + + createMapType: => + mapType = if @childModel then (if @attrs.options then @childModel[@attrs.options] else @childModel) else @scope.options + if mapType.getTile? + @mapType = mapType + else if mapType.getTileUrl? + @mapType = new google.maps.ImageMapType mapType + else + @$log.info('options should provide either getTile or getTileUrl methods. Map type creation aborted!!') + return + + idAttr = if @attrs.id then (if @childModel then @attrs.id else 'id') else undefined + id = if idAttr then (if @childModel then @childModel[idAttr] else @scope[idAttr]) else undefined + if id + @gMap.mapTypes.set id, @mapType + @doShow = false unless angular.isDefined(@attrs.show) + + @mapType.layerId = @id + + # use prop map to keep track of order of layers + if @childModel and angular.isDefined @scope.index + @propMap.put @mapType.layerId, @scope.index + + refreshMapType: => + @hideOverlay() + @mapType = null + @createMapType() + @showOverlay() if @doShow and @gMap? + + showOverlay: => + if angular.isDefined @scope.index + + # iterate over each current map-type layer + found = false + if @gMap.overlayMapTypes.getLength() + @gMap.overlayMapTypes.forEach (mapType, index) => + if !found + + # once we have found a layer with a higher or missing layer index, + # insert this layer using the found overlayMapTypes index to keep + # them in the layers in order + layerIndex = @propMap.get(mapType.layerId.toString()) + if layerIndex > @scope.index or !angular.isDefined(layerIndex) + found = true + @gMap.overlayMapTypes.insertAt index, @mapType + return + + # if still not found, it just means that no layer has been found with + # a higher (or missing) index, so just added to the end + if !found + @gMap.overlayMapTypes.push @mapType + else + @gMap.overlayMapTypes.push @mapType + else + @gMap.overlayMapTypes.push @mapType + + hideOverlay: => + found = false + @gMap.overlayMapTypes.forEach (mapType, index) => + if not found and mapType.layerId is @id + found = true + @gMap.overlayMapTypes.removeAt index + return + + refreshShown: () => + @doShow = if angular.isDefined(@attrs.show) then (if @childModel then @childModel[@attrs.show] else @scope.show) else true + + MapTypeParentModel +] diff --git a/src/coffee/directives/api/models/parent/map-types-parent-model.coffee b/src/coffee/directives/api/models/parent/map-types-parent-model.coffee new file mode 100644 index 000000000..8f9f0d24e --- /dev/null +++ b/src/coffee/directives/api/models/parent/map-types-parent-model.coffee @@ -0,0 +1,24 @@ +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapMapTypesParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapMapTypeParentModel', 'uiGmapPropMap' + (BaseObject, Logger, MapTypeParentModel, PropMap) -> + class MapTypesParentModel extends BaseObject + constructor: (@scope, @element, @attrs, @gMap, @$log = Logger) -> + unless @attrs.mapTypes? + @$log.info('layers attribute for the map-types directive is mandatory. Map types creation aborted!!') + return + + pMap = new PropMap + + @scope.mapTypes.forEach (l, i) => + mockAttr = + options: @scope.options + show: @scope.show + refresh: @scope.refresh + childScope = @scope.$new() + childScope.index = i + new MapTypeParentModel(childScope, null, mockAttr, @gMap, @$log, l, pMap) + return + + MapTypesParentModel +] diff --git a/src/coffee/directives/api/models/parent/markers-parent-model.coffee b/src/coffee/directives/api/models/parent/markers-parent-model.coffee new file mode 100644 index 000000000..3cec49567 --- /dev/null +++ b/src/coffee/directives/api/models/parent/markers-parent-model.coffee @@ -0,0 +1,266 @@ +###global _:true,angular:true,### +angular.module("uiGmapgoogle-maps.directives.api.models.parent") +.factory "uiGmapMarkersParentModel", [ + "uiGmapIMarkerParentModel", "uiGmapModelsWatcher", + "uiGmapPropMap", "uiGmapMarkerChildModel", "uiGmap_async", + "uiGmapClustererMarkerManager", "uiGmapMarkerManager", "$timeout", "uiGmapIMarker", + "uiGmapPromise", "uiGmapGmapUtil", "uiGmapLogger", "uiGmapSpiderfierMarkerManager", + (IMarkerParentModel, ModelsWatcher, + PropMap, MarkerChildModel, _async, + ClustererMarkerManager, MarkerManager, $timeout, IMarker, uiGmapPromise, GmapUtil, $log, + SpiderfierMarkerManager) -> + _setPlurals = (val, objToSet) -> + objToSet.plurals = new PropMap() #for api consistency + objToSet.scope.plurals = objToSet.plurals #for transclusion + objToSet + + class MarkersParentModel extends IMarkerParentModel + @include GmapUtil + @include ModelsWatcher + constructor: (scope, element, attrs, map) -> + super(scope, element, attrs, map) + @interface = IMarker + + _setPlurals(new PropMap(), @) + @scope.pluralsUpdate = + updateCtr: 0 + + @$log.info @ + #assume do rebuild all is false and were lookging for a modelKey prop of id + @doRebuildAll = if @scope.doRebuildAll? then @scope.doRebuildAll else false + @setIdKey @scope + @scope.$watch 'doRebuildAll', (newValue, oldValue) => + if (newValue != oldValue) + @doRebuildAll = newValue + + @modelsRendered = false if !@modelsLength() + @scope.$watch 'models', (newValue, oldValue) => + if !_.isEqual(newValue,oldValue) or not @modelsRendered + return if newValue.length == 0 and oldValue.length == 0 + @modelsRendered = true + @onWatch('models', @scope, newValue, oldValue) + , !@isTrue(attrs.modelsbyref) + + @watch 'doCluster', @scope + @watch 'type', @scope + @watch 'clusterOptions', @scope + @watch 'clusterEvents', @scope + @watch 'typeOptions', @scope + @watch 'typeEvents', @scope + @watch 'fit', @scope + @watch 'idKey', @scope + + @gManager = undefined + @createAllNew(@scope) + + + onWatch: (propNameToWatch, scope, newValue, oldValue) => + if propNameToWatch == "idKey" and newValue != oldValue + @idKey = newValue + if @doRebuildAll or (propNameToWatch == 'doCluster' or propNameToWatch == 'type') + @rebuildAll(scope) + else + @pieceMeal(scope) + + validateScope: (scope) => + modelsNotDefined = angular.isUndefined(scope.models) or scope.models == undefined + if(modelsNotDefined) + @$log.error(@constructor.name + ": no valid models attribute found") + + super(scope) or modelsNotDefined + + ### + Not used internally by this parent + created for consistency for external control in the API + ### + createChildScopes: (isCreatingFromScratch) => + return if not @gMap? or not @scope.models? + + if isCreatingFromScratch + @createAllNew @scope, false + else + @pieceMeal @scope, false + + bindToTypeEvents: (typeEvents, events = ['click', 'mouseout', 'mouseover']) => + ### + You should only be binding to events that produce groups/clusters of somthing. + Otherwise use the orginal event handle. + For Example: Click on a cluster pushes a cluster/group obj through which has getMarkers + However Spiderfy's click is for a single marker so this is not ideal for that. + ### + self = @ + if not @origTypeEvents + @origTypeEvents = {} + _.each events, (eventName) => + @origTypeEvents[eventName] = typeEvents?[eventName] + else + #rollback to not have stack overflow to call self over and over + angular.extend typeEvents, @origTypeEvents + internalHandles = {} + _.each events, (eventName) -> + internalHandles[eventName] = (group) -> + self.maybeExecMappedEvent group, eventName + + angular.extend typeEvents, internalHandles + + createAllNew: (scope) => + if @gManager? + if @gManager instanceof SpiderfierMarkerManager + isSpiderfied = @gManager.isSpiderfied() + @gManager.clear() + delete @gManager + #support backwards comapat clusterEvents and clusterOptions + typeEvents = scope.typeEvents or scope.clusterEvents + typeOptions = scope.typeOptions or scope.clusterOptions + + if scope.doCluster or scope.type == 'cluster' + @bindToTypeEvents(typeEvents) if typeEvents? + @gManager = new ClustererMarkerManager @map, undefined, typeOptions, typeEvents + else if scope.type == 'spider' + @bindToTypeEvents(typeEvents, ['spiderfy', 'unspiderfy']) if typeEvents? + @gManager = new SpiderfierMarkerManager @map, undefined, typeOptions, typeEvents, @scope + @gManager.spiderfy() if isSpiderfied + else + @gManager = new MarkerManager @map + + return if @didQueueInitPromise(@,scope) + + #allows graceful fallout of _async.each + maybeCanceled = null + + _async.promiseLock @, uiGmapPromise.promiseTypes.create, 'createAllNew' + , ((canceledMsg) -> maybeCanceled = canceledMsg) + , => + _async.each scope.models, (model) => + @newChildMarker(model, scope) + maybeCanceled + , _async.chunkSizeFrom scope.chunk + .then => + @modelsRendered = true + @gManager.fit() if scope.fit + @gManager.draw() + @scope.pluralsUpdate.updateCtr += 1 + , _async.chunkSizeFrom scope.chunk + + rebuildAll: (scope) => + if(!scope.doRebuild and scope.doRebuild != undefined) + return + if @scope.plurals?.length + @onDestroy(scope).then => + @createAllNew(scope) + else + @createAllNew(scope) + + pieceMeal: (scope) => + return if scope.$$destroyed + #allows graceful fallout of _async.each + maybeCanceled = null + payload = null + if @modelsLength() and @scope.plurals.length + + _async.promiseLock @, uiGmapPromise.promiseTypes.update, 'pieceMeal', ((canceledMsg) -> maybeCanceled = canceledMsg), => + uiGmapPromise.promise((=> @figureOutState @idKey, scope, @scope.plurals, @modelKeyComparison)) + .then (state) => + payload = state + _async.each payload.removals, (child) => + if child? + child.destroy() if child.destroy? + @scope.plurals.remove(child.id) + maybeCanceled + , _async.chunkSizeFrom scope.chunk + .then => + #add all adds via creating new ChildMarkers which are appended to @scope.plurals + _async.each payload.adds, (modelToAdd) => + @newChildMarker(modelToAdd, scope) + maybeCanceled + , _async.chunkSizeFrom scope.chunk + .then () => + _async.each payload.updates, (update) => + @updateChild update.child, update.model + maybeCanceled + , _async.chunkSizeFrom scope.chunk + .then => + #finally redraw if something has changed + if(payload.adds.length > 0 or payload.removals.length > 0 or payload.updates.length > 0) + scope.plurals = @scope.plurals #for other directives like windows + @gManager.fit() if scope.fit #note fit returns a promise + @gManager.draw() + @scope.pluralsUpdate.updateCtr += 1 + + else + @inProgress = false + @rebuildAll(scope) + + newChildMarker: (model, scope) => + unless model + throw 'model undefined' + unless model[@idKey]? + @$log.error("Marker model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key.") + return + @$log.info('child', child, 'markers', @scope.markerModels) + childScope = scope.$new(false) + childScope.events = scope.events + keys = {} + IMarker.scopeKeys.forEach (k) -> + keys[k] = scope[k] + child = new MarkerChildModel { + scope:childScope + model, keys, + gMap:@map + defaults: @DEFAULTS + doClick: @doClick + gManager: @gManager + doDrawSelf: false + isScopeModel: true + } + @scope.plurals.put(model[@idKey], child) #major change this makes model.id a requirement + child + + onDestroy: (scope) => + super(scope) + _async.promiseLock @, uiGmapPromise.promiseTypes.delete, undefined, undefined, => + _async.each @scope.plurals.values(), (model) -> + model.destroy(false) if model? + , _async.chunkSizeFrom(@scope.cleanchunk, false) + .then => + @gManager.destroy() if @gManager? + # _setPlurals(new PropMap(), @) + @plurals.removeAll() + if @plurals != @scope.plurals + console.error 'plurals out of sync for MarkersParentModel' + @scope.pluralsUpdate.updateCtr += 1 + + maybeExecMappedEvent:(group, fnName) => + #this should not be happening, but events are not getting unhooked (google bug maybe) + return if @scope.$$destroyed + typeEvents = @scope.typeEvents or @scope.clusterEvents + if _.isFunction typeEvents?[fnName] + pair = @mapTypeToPlurals group + @origTypeEvents[fnName](pair.group,pair.mapped) if @origTypeEvents[fnName] + + mapTypeToPlurals:(group) -> + if _.isArray group + arrayToMap = group + else if _.isFunction group.getMarkers + arrayToMap = group.getMarkers() + + unless arrayToMap? + $log.error "Unable to map event as we cannot find the array group to map" + return + if @scope.plurals.values()?.length + mapped = arrayToMap.map (g) => + @scope.plurals.get(g.key).model + else + mapped = [] + + cluster: group + mapped: mapped + group: group + + getItem: (scope, modelsPropToIterate, index) -> + if modelsPropToIterate == 'models' + return scope[modelsPropToIterate][index] + scope[modelsPropToIterate].get index #otherwise it is a propMap + + return MarkersParentModel +] diff --git a/src/coffee/directives/api/models/parent/poly-parent-models.coffee b/src/coffee/directives/api/models/parent/poly-parent-models.coffee new file mode 100644 index 000000000..44163a4c8 --- /dev/null +++ b/src/coffee/directives/api/models/parent/poly-parent-models.coffee @@ -0,0 +1,6 @@ +['Polygon','Polyline'].forEach (name) -> + angular.module('uiGmapgoogle-maps.directives.api.models.parent') + .factory "uiGmap#{name}sParentModel", ['uiGmapBasePolysParentModel',"uiGmap#{name}ChildModel", "uiGmapI#{name}", + (BasePolysParentModel, ChildModel, IPoly) -> + BasePolysParentModel(IPoly, ChildModel, name) + ] \ No newline at end of file diff --git a/src/coffee/directives/api/models/parent/rectangle-parent-model.coffee b/src/coffee/directives/api/models/parent/rectangle-parent-model.coffee new file mode 100644 index 000000000..a448f4876 --- /dev/null +++ b/src/coffee/directives/api/models/parent/rectangle-parent-model.coffee @@ -0,0 +1,107 @@ +###globals angular, _, google### +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapRectangleParentModel', +['uiGmapLogger','uiGmapGmapUtil', +'uiGmapEventsHelper', 'uiGmapRectangleOptionsBuilder', +($log,GmapUtil, + EventsHelper, Builder) -> + class RectangleParentModel extends Builder + @include GmapUtil + @include EventsHelper + constructor: (@scope, element, @attrs, @gMap, @DEFAULTS) -> + # Validate required properties + bounds = undefined + dragging = false + myListeners = [] + listeners = undefined + fit = => + @fitMapBounds @gMap, bounds if @isTrue(@attrs.fit) + createBounds = => + if @scope.bounds? and @scope.bounds?.sw? and @scope.bounds?.ne? and @validateBoundPoints(@scope.bounds) + bounds = @convertBoundPoints(@scope.bounds) + $log.info "new new bounds created: #{JSON.stringify bounds}" + else if @scope.bounds.getNorthEast? and @scope.bounds.getSouthWest? + bounds = @scope.bounds + else + if @scope.bounds? + $log.error "Invalid bounds for newValue: #{JSON.stringify @scope?.bounds}" #note if bounds is recursive this could crash + createBounds() + gObject = new google.maps.Rectangle(@buildOpts bounds) + $log.info "gObject (rectangle) created: #{gObject}" + + settingBoundsFromScope = false + + updateBounds = => + b = gObject.getBounds() + ne = b.getNorthEast() + sw = b.getSouthWest() + #if the scope notified this change then there is no reason + #to update scope otherwise infinite loop + return if settingBoundsFromScope + @scope.$evalAsync (s) -> + if s.bounds? and s.bounds.sw? and s.bounds.ne? + s.bounds.ne = + latitude: ne.lat() + longitude: ne.lng() + + s.bounds.sw = + latitude: sw.lat() + longitude: sw.lng() + if s.bounds.getNorthEast? and s.bounds.getSouthWest? + s.bounds = b + + init = => + fit() + @removeEvents myListeners + myListeners.push google.maps.event.addListener gObject, 'dragstart', -> + dragging = true + myListeners.push google.maps.event.addListener gObject, 'dragend', -> + dragging = false + updateBounds() + myListeners.push google.maps.event.addListener gObject, 'bounds_changed', -> + return if dragging + updateBounds() + + clear = => + @removeEvents myListeners + @removeEvents listeners if listeners? + gObject.setMap null + + init() if bounds? + # Update map when center coordinates change + @scope.$watch 'bounds', ((newValue, oldValue) -> + return if _.isEqual(newValue, oldValue) and bounds? or dragging + settingBoundsFromScope = true + unless newValue? + clear() + return + unless bounds? + isNew = true + else + fit() + createBounds() + gObject.setBounds bounds + settingBoundsFromScope = false + init() if isNew and bounds? + ), true + + @setMyOptions = (newVals, oldVals) => + unless _.isEqual newVals,oldVals + if bounds? and newVals? + gObject.setOptions @buildOpts bounds + + @props.push 'bounds' + @watchProps @props + + if @attrs.events? + listeners = @setEvents gObject, @scope, @scope + @scope.$watch 'events', (newValue, oldValue) => + unless _.isEqual newValue, oldValue + @removeEvents listeners if listeners? + listeners = @setEvents gObject, @scope, @scope + # Remove gObject on scope $destroy + @scope.$on '$destroy', -> + clear() + + $log.info @ +] diff --git a/src/coffee/directives/api/models/parent/search-box-parent-model.coffee b/src/coffee/directives/api/models/parent/search-box-parent-model.coffee new file mode 100644 index 000000000..de4d445c5 --- /dev/null +++ b/src/coffee/directives/api/models/parent/search-box-parent-model.coffee @@ -0,0 +1,103 @@ +###global angular:true, google:true ### +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapSearchBoxParentModel', [ + 'uiGmapBaseObject', 'uiGmapLogger','uiGmapEventsHelper', +(BaseObject, Logger, EventsHelper) -> + class SearchBoxParentModel extends BaseObject + @include EventsHelper + constructor: (@scope, @element, @attrs, @gMap, @ctrlPosition, @template, @$log = Logger) -> + unless @attrs.template? + @$log.error 'template attribute for the search-box directive is mandatory. Places Search Box creation aborted!!' + return + + if angular.isUndefined @scope.options + @scope.options = {} + @scope.options.visible = true + + if angular.isUndefined @scope.options.visible + @scope.options.visible = true + + if angular.isUndefined @scope.options.autocomplete + @scope.options.autocomplete = false + + @visible = @scope.options.visible + @autocomplete = @scope.options.autocomplete + + controlDiv = angular.element '
' + controlDiv.append @template + @input = controlDiv.find('input')[0] + + @init() + + init: => + @createSearchBox() + + @scope.$watch('options', (newValue, oldValue) => + if angular.isObject newValue + if newValue.bounds? + @setBounds(newValue.bounds) + if newValue.visible? + if @visible != newValue.visible + @setVisibility(newValue.visible) + , true) + + if @attrs.parentdiv? + @addToParentDiv() + else + @addAsMapControl() + + if not @visible + @setVisibility(@visible) + + if @autocomplete + @listener = google.maps.event.addListener @gObject, 'place_changed', => + @places = @gObject.getPlace() + else + @listener = google.maps.event.addListener @gObject, 'places_changed', => + @places = @gObject.getPlaces() + + @listeners = @setEvents @gObject, @scope, @scope + @$log.info @ + + @scope.$on '$stateChangeSuccess', => + @addToParentDiv() if @attrs.parentdiv? + + @scope.$on '$destroy', => + @gObject = null + + addAsMapControl: => + @gMap.controls[google.maps.ControlPosition[@ctrlPosition]].push(@input) + + addToParentDiv: => + @parentDiv = angular.element document.getElementById(@scope.parentdiv) + @parentDiv.append @input if @parentDiv?.length + + createSearchBox: => + if @autocomplete + @gObject = new google.maps.places.Autocomplete @input, @scope.options + else + @gObject = new google.maps.places.SearchBox @input, @scope.options + + setBounds: (bounds) => + if angular.isUndefined bounds.isEmpty + @$log.error 'Error: SearchBoxParentModel setBounds. Bounds not an instance of LatLngBounds.' + return + else + if bounds.isEmpty() == false + if @gObject? + @gObject.setBounds(bounds) + + getBounds: => + @gObject.getBounds() + + setVisibility: (val) => + if @attrs.parentdiv? + if val == false then @parentDiv.addClass "ng-hide" else @parentDiv.removeClass "ng-hide" + else + if val == false then @gMap.controls[google.maps.ControlPosition[@ctrlPosition]].clear() else @gMap.controls[google.maps.ControlPosition[@ctrlPosition]].push(@input) + @visible = val + + + + SearchBoxParentModel +] diff --git a/src/coffee/directives/api/models/parent/windows-parent-model.coffee b/src/coffee/directives/api/models/parent/windows-parent-model.coffee new file mode 100644 index 000000000..8cb31fac0 --- /dev/null +++ b/src/coffee/directives/api/models/parent/windows-parent-model.coffee @@ -0,0 +1,254 @@ +###global _,angular### +### + WindowsChildModel generator where there are many ChildModels to a parent. +### +angular.module('uiGmapgoogle-maps.directives.api.models.parent') +.factory 'uiGmapWindowsParentModel', + ['uiGmapIWindowParentModel', 'uiGmapModelsWatcher', + 'uiGmapPropMap', 'uiGmapWindowChildModel', + 'uiGmapLinked', 'uiGmap_async', 'uiGmapLogger', + '$timeout', '$compile', '$http', '$templateCache', '$interpolate','uiGmapPromise', 'uiGmapIWindow', 'uiGmapGmapUtil', + (IWindowParentModel, ModelsWatcher, PropMap, WindowChildModel, Linked, _async, $log, + $timeout, $compile, $http, $templateCache, $interpolate, uiGmapPromise, IWindow, GmapUtil) -> + class WindowsParentModel extends IWindowParentModel + @include ModelsWatcher + constructor: (scope, element, attrs, ctrls, @gMap, @markersScope) -> + super(scope, element, attrs, ctrls, $timeout, $compile, $http, $templateCache) + @interface = IWindow + @plurals = new PropMap() + + #setting up local references to propety keys IE: @coordsKey + _.each IWindow.scopeKeys, (name) => + @[name + 'Key'] = undefined + @linked = new Linked(scope, element, attrs, ctrls) + + @contentKeys = undefined #model keys to parse html angular content + @isIconVisibleOnClick = undefined + @firstTime = true + @firstWatchModels = true + @$log.info(self) + @parentScope = undefined + + @go(scope) + + go: (scope) => + @watchOurScope(scope) + @doRebuildAll = if @scope.doRebuildAll? then @scope.doRebuildAll else false + scope.$watch 'doRebuildAll', (newValue, oldValue) => + if (newValue != oldValue) + @doRebuildAll = newValue + + @createChildScopes() + + watchModels: (scope) => + #if there is a markersScope we only want to start our changes when markers is done + # therefore we wait on pluralsUpdate to change + itemToWatch = if @markersScope? then 'pluralsUpdate' else 'models' + scope.$watch itemToWatch, (newValue, oldValue) => + #check to make sure that the newValue Array is really a set of new objects + if not _.isEqual(newValue, oldValue) or @firstWatchModels + @firstWatchModels = false + if @doRebuildAll or @doINeedToWipe(scope.models) + @rebuildAll(scope, true, true) + else + doScratch = @plurals.length == 0 + if @existingPieces? + _.last(@existingPieces._content).then => @createChildScopes doScratch + else + @createChildScopes doScratch + , true + + doINeedToWipe: (newValue) => + newValueIsEmpty = if newValue? then newValue.length == 0 else true + @plurals.length > 0 and newValueIsEmpty + + rebuildAll: (scope, doCreate, doDelete) => + @onDestroy(doDelete).then => + @createChildScopes() if doCreate + + onDestroy: (scope) => + super(@scope) + _async.promiseLock @, uiGmapPromise.promiseTypes.delete, undefined, undefined, => + _async.each @plurals.values(), (child) -> + child.destroy(true)#this allows scope.$destroy to be called on the child with out recursion issues + , _async.chunkSizeFrom(@scope.cleanchunk, false) + .then => + @plurals?.removeAll() + + watchDestroy: (scope) => + scope.$on '$destroy', => + @firstWatchModels = true + @firstTime = true + @rebuildAll(scope, false, true) + + watchOurScope: (scope) => + _.each IWindow.scopeKeys, (name) => + #coffeelint:disable=check_scope + nameKey = name + 'Key' + @[nameKey] = if typeof scope[name] == 'function' then scope[name]() else scope[name] + #coffeelint:enable=check_scope + + createChildScopes: (isCreatingFromScratch = true) => + ### + being that we cannot tell the difference in Key String vs. a normal value string (TemplateUrl) + we will assume that all scope values are string expressions either pointing to a key (propName) or using + 'self' to point the model as container/object of interest. + + This may force redundant information into the model, but this appears to be the most flexible approach. + ### + @isIconVisibleOnClick = true + if angular.isDefined(@linked.attrs.isiconvisibleonclick) + @isIconVisibleOnClick = @linked.scope.isIconVisibleOnClick + + modelsNotDefined = angular.isUndefined @linked.scope.models + + if modelsNotDefined and (@markersScope == undefined or (@markersScope?.plurals == undefined or @markersScope?.models == undefined)) + @$log.error('No models to create windows from! Need direct models or models derived from markers!') + return + if @gMap? + #at the very least we need a Map, the marker is optional as we can create Windows without markers + if @linked.scope.models? + #we are creating windows with no markers + @watchIdKey @linked.scope + if isCreatingFromScratch + @createAllNew @linked.scope, false + else + @pieceMeal @linked.scope, false + else + #creating windows with parent markers + @parentScope = @markersScope + @watchIdKey @parentScope + if isCreatingFromScratch + @createAllNew @markersScope, true, 'plurals', false + else + @pieceMeal @markersScope, true, 'plurals', false + + watchIdKey: (scope) => + @setIdKey scope + scope.$watch 'idKey', (newValue, oldValue) => + if (newValue != oldValue and !newValue?) + @idKey = newValue + @rebuildAll(scope, true, true) + + + createAllNew: (scope, hasGMarker, modelsPropToIterate = 'models', isArray = false) => + if @firstTime + @watchModels scope + @watchDestroy scope + @setContentKeys(scope.models) #only setting content keys once per model array + + return if @didQueueInitPromise(@,scope) + + maybeCanceled = null + _async.promiseLock @, uiGmapPromise.promiseTypes.create, 'createAllNew', + ((canceledMsg) -> maybeCanceled = canceledMsg), => + _async.each scope.models, (model) => + gMarker = if hasGMarker then @getItem(scope, modelsPropToIterate, model[@idKey])?.gObject else undefined + unless maybeCanceled + $log.error 'Unable to get gMarker from markersScope!' if not gMarker and @markersScope + @createWindow(model, gMarker, @gMap) + maybeCanceled + , _async.chunkSizeFrom scope.chunk + .then => + @firstTime = false + + pieceMeal: (scope, hasGMarker, modelsPropToIterate = 'models', isArray = true) => + return if scope.$$destroyed + maybeCanceled = null + payload = null + + if scope? and @modelsLength() and @plurals.length + + _async.promiseLock @, uiGmapPromise.promiseTypes.update, 'pieceMeal', ((canceledMsg) -> maybeCanceled = canceledMsg), => + uiGmapPromise.promise((=> @figureOutState @idKey, scope, @plurals, @modelKeyComparison)) + .then (state) => + payload = state + _async.each payload.removals, (child) => + if child? + @plurals.remove(child.id) + child.destroy(true) if child.destroy? + maybeCanceled + , _async.chunkSizeFrom scope.chunk + .then => + #add all adds via creating new ChildMarkers which are appended to @markers + _async.each payload.adds, (modelToAdd) => + gMarker = @getItem(scope, modelsPropToIterate, modelToAdd[@idKey])?.gObject + throw 'Gmarker undefined' unless gMarker + @createWindow(modelToAdd, gMarker, @gMap) + maybeCanceled + .then => + _async.each payload.updates, (update) => + @updateChild update.child, update.model + maybeCanceled + , _async.chunkSizeFrom scope.chunk + + else + $log.debug('pieceMeal: rebuildAll') + @rebuildAll(@scope, true, true) + + setContentKeys: (models) => + if @modelsLength(models) + @contentKeys = Object.keys(models[0]) + + createWindow: (model, gMarker, gMap) => + childScope = @linked.scope.$new(false) + @setChildScope(childScope, model) + childScope.$watch('model', (newValue, oldValue) => + if(newValue != oldValue) + @setChildScope(childScope, newValue) + + , true) + fakeElement = + html: => + @interpolateContent(@linked.element.html(), model) + @DEFAULTS = @scopeOrModelVal(@optionsKey, @scope, model) or {} + opts = @createWindowOptions gMarker, childScope, fakeElement.html(), @DEFAULTS + + child = new WindowChildModel { + model, scope: childScope, opts, + isIconVisibleOnClick: @isIconVisibleOnClick, + gMap, + markerScope: @markersScope?.plurals.get(model[@idKey])?.scope, + element: fakeElement, + needToManualDestroy: false, + markerIsVisibleAfterWindowClose: true, + isScopeModel: true + } + + unless model[@idKey]? + @$log.error('Window model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key.') + return + @plurals.put(model[@idKey], child) + child + + setChildScope: (childScope, model) => + _.each IWindow.scopeKeys, (name) => + nameKey = name + 'Key' + newValue = if @[nameKey] == 'self' then model else model[@[nameKey]] + if(newValue != childScope[name]) + childScope[name] = newValue + childScope.model = model + + interpolateContent: (content, model) => + if @contentKeys == undefined or @contentKeys.length == 0 + return + exp = $interpolate(content) + interpModel = {} + interpModel[key] = model[key] for key in @contentKeys + exp(interpModel) + + modelKeyComparison: (model1, model2) => + #handle possible transclusion + scope = if @scope.coords? then @scope else @parentScope + if not scope? then throw 'No scope or parentScope set!' + isEqual = GmapUtil.equalCoords @evalModelHandle(model1, scope.coords), + @evalModelHandle(model2, scope.coords) + #deep comparison of the rest of properties + return isEqual unless isEqual + #compare the rest of the properties that are being watched by scope + isEqual = _.every _.without(@interface.scopeKeys, 'coords'), (k) => + @evalModelHandle(model1, scope[k]) == @evalModelHandle(model2, scope[k]) + isEqual + + WindowsParentModel + ] diff --git a/src/coffee/directives/api/options/builders/common-options-builder.coffee b/src/coffee/directives/api/options/builders/common-options-builder.coffee new file mode 100644 index 000000000..9e2d15285 --- /dev/null +++ b/src/coffee/directives/api/options/builders/common-options-builder.coffee @@ -0,0 +1,66 @@ +angular.module('uiGmapgoogle-maps.directives.api.options.builders') +.service 'uiGmapCommonOptionsBuilder', +[ 'uiGmapBaseObject', 'uiGmapLogger', 'uiGmapModelKey', (BaseObject, $log, ModelKey) -> + + class CommonOptionsBuilder extends ModelKey + + props: [ + 'clickable' + 'draggable' + 'editable' + 'visible' + {prop: 'stroke',isColl: true} + ] + + getCorrectModel: (scope) -> + if angular.isDefined(scope?.model) then scope.model else scope + + buildOpts: (customOpts = {}, cachedEval, forEachOpts = {}) => + unless @scope + $log.error 'this.scope not defined in CommonOptionsBuilder can not buildOpts' + return + unless @gMap + $log.error 'this.map not defined in CommonOptionsBuilder can not buildOpts' + return + + model = @getCorrectModel(@scope) + + stroke = @scopeOrModelVal 'stroke', @scope, model + opts = angular.extend customOpts, @DEFAULTS, + map: @gMap + strokeColor: stroke?.color + strokeOpacity: stroke?.opacity + strokeWeight: stroke?.weight + + angular.forEach angular.extend(forEachOpts, + clickable: true + draggable: false + editable: false + static: false + fit: false + visible: true + zIndex: 0, + icons: [] + ), (defaultValue, key) => + + val = if cachedEval then cachedEval[key] else @scopeOrModelVal key, @scope, model + + if angular.isUndefined val + opts[key] = defaultValue + else + opts[key] = model[key] + + opts.editable = false if opts.static + opts + + watchProps: (props) => + unless props? + props = @props + props.forEach (prop) => + if @attrs[prop]? or @attrs[prop?.prop]? + if prop?.isColl + @scope.$watchCollection prop.prop, @setMyOptions + else + @scope.$watch prop, @setMyOptions + +] diff --git a/src/coffee/directives/api/options/builders/options-builders.coffee b/src/coffee/directives/api/options/builders/options-builders.coffee new file mode 100644 index 000000000..121b3819a --- /dev/null +++ b/src/coffee/directives/api/options/builders/options-builders.coffee @@ -0,0 +1,41 @@ +angular.module('uiGmapgoogle-maps.directives.api.options.builders') +.factory('uiGmapPolylineOptionsBuilder', [ + 'uiGmapCommonOptionsBuilder' + (CommonOptionsBuilder) -> + class PolylineOptionsBuilder extends CommonOptionsBuilder + buildOpts: (pathPoints, cachedEval) -> + super({path: pathPoints}, cachedEval, {geodesic: false}) +]) +.factory('uiGmapShapeOptionsBuilder', [ + 'uiGmapCommonOptionsBuilder' + (CommonOptionsBuilder) -> + class ShapeOptionsBuilder extends CommonOptionsBuilder + buildOpts: (customOpts, cachedEval, forEachOpts) -> + model = @getCorrectModel(@scope) + fill = if cachedEval then cachedEval['fill'] else @scopeOrModelVal 'fill', @scope, model + customOpts = angular.extend customOpts, + fillColor: fill?.color + fillOpacity: fill?.opacity + super(customOpts, cachedEval, forEachOpts) +]) +.factory('uiGmapPolygonOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder' + (ShapeOptionsBuilder) -> + class PolygonOptionsBuilder extends ShapeOptionsBuilder + buildOpts: (pathPoints, cachedEval) -> + super({path: pathPoints}, cachedEval, {geodesic: false}) +]) +.factory('uiGmapRectangleOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder' + (ShapeOptionsBuilder) -> + class RectangleOptionsBuilder extends ShapeOptionsBuilder + buildOpts: (bounds, cachedEval) -> + super(bounds: bounds, cachedEval) +]) +.factory('uiGmapCircleOptionsBuilder', [ + 'uiGmapShapeOptionsBuilder' + (ShapeOptionsBuilder) -> + class CircleOptionsBuilder extends ShapeOptionsBuilder + buildOpts: (center, radius, cachedEval) -> + super({center: center, radius: radius}, cachedEval) +]) diff --git a/src/coffee/directives/api/options/marker-options.coffee b/src/coffee/directives/api/options/marker-options.coffee new file mode 100644 index 000000000..7d12bf8df --- /dev/null +++ b/src/coffee/directives/api/options/marker-options.coffee @@ -0,0 +1,26 @@ +angular.module('uiGmapgoogle-maps.directives.api.options') +.service 'uiGmapMarkerOptions', +[ 'uiGmapLogger', 'uiGmapGmapUtil', ($log, GmapUtil) -> + _.extend GmapUtil, + createOptions: (coords, icon, defaults, map) -> + defaults ?= {} + + opts = angular.extend {}, defaults, + position: if defaults.position? then defaults.position else GmapUtil.getCoords coords + visible: if defaults.visible? then defaults.visible else GmapUtil.validateCoords coords + + if defaults.icon? or icon? + opts = angular.extend opts, + icon: if defaults.icon? then defaults.icon else icon + + opts.map = map if map? + opts + + isLabel: (options) -> + return false unless options? + options.labelContent? or + options.labelAnchor? or + options.labelClass? or + options.labelStyle? or + options.labelVisible? +] diff --git a/src/coffee/directives/api/plural.coffee b/src/coffee/directives/api/plural.coffee new file mode 100644 index 000000000..4ce19471f --- /dev/null +++ b/src/coffee/directives/api/plural.coffee @@ -0,0 +1,45 @@ +###global angular### +angular.module('uiGmapgoogle-maps.directives.api') +.service 'uiGmapPlural', [-> + _initControl = (scope, parent) -> + return unless scope.control? + + scope.control.updateModels = (models) -> + scope.models = models + parent.createChildScopes(false) + + scope.control.newModels = (models) -> + scope.models = models + parent.rebuildAll(scope, true, true) + + scope.control.clean = -> + parent.rebuildAll(scope, false, true) + + scope.control.getPlurals = -> + parent.plurals + + scope.control.getManager = -> + parent.gManager + + scope.control.hasManager = -> + parent.gManager? == true + + scope.control.managerDraw = -> + scope.control.getManager()?.draw() if scope.control.hasManager() + + extend: (obj, obj2) -> + _.extend obj.scope or {}, obj2 or {}, + idKey: '=idkey' #id key to bind to that makes a model unique, if it does not exist default to rebuilding all markers + doRebuildAll: '=dorebuildall' #root level directive attribute not a model level, should default to false + models: '=models' + chunk: '=chunk' #false to disable chunking, otherwise a number to define chunk size + cleanchunk: '=cleanchunk' #false to disable chunking, otherwise a number to define chunk size + control: '=control' + deepComparison: '=deepcomparison' #true to deep compare attributes on model for determining uniqueness. + + link: (scope, parent) -> + _initControl(scope, parent) + + + +] diff --git a/src/coffee/directives/api/polygon.coffee b/src/coffee/directives/api/polygon.coffee new file mode 100644 index 000000000..95f57c8eb --- /dev/null +++ b/src/coffee/directives/api/polygon.coffee @@ -0,0 +1,17 @@ +###global angular### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapPolygon', [ + 'uiGmapIPolygon', '$timeout', 'uiGmapPolygonChildModel' + (IPolygon, $timeout, PolygonChild) -> + class Polygon extends IPolygon + link: (scope, element, attrs, mapCtrl) => + children = [] + promise = IPolygon.mapPromise(scope, mapCtrl) + if scope.control? + scope.control.getInstance = @ + scope.control.polygons = children + scope.control.promise = promise + + promise.then (gMap) => + children.push new PolygonChild {scope, attrs, gMap, defaults: @DEFAULTS} +] diff --git a/src/coffee/directives/api/polygons.coffee b/src/coffee/directives/api/polygons.coffee new file mode 100644 index 000000000..bfc1799ef --- /dev/null +++ b/src/coffee/directives/api/polygons.coffee @@ -0,0 +1,23 @@ +###global angular:true### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapPolygons', [ + 'uiGmapIPolygon', '$timeout', 'uiGmapPolygonsParentModel', 'uiGmapPlural', + (Interface, $timeout, ParentModel, Plural) -> + class Polygons extends Interface + constructor: -> + super() + Plural.extend @ + @$log.info @ + + link: (scope, element, attrs, mapCtrl) => + # Wrap polyline initialization inside a $timeout() call to make sure the map is created already + mapCtrl.getScope().deferred.promise.then (map) => + # Validate required properties + if angular.isUndefined(scope.path) or scope.path is null + @$log.warn 'polygons: no valid path attribute found' + + unless scope.models + @$log.warn 'polygons: no models found to create from' + + Plural.link scope, new ParentModel(scope, element, attrs, map, @DEFAULTS) +] diff --git a/src/coffee/directives/api/polyline.coffee b/src/coffee/directives/api/polyline.coffee new file mode 100644 index 000000000..bf55ed263 --- /dev/null +++ b/src/coffee/directives/api/polyline.coffee @@ -0,0 +1,15 @@ +###global angular### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapPolyline', [ + 'uiGmapIPolyline', '$timeout', 'uiGmapPolylineChildModel', + (IPolyline, $timeout, PolylineChildModel) -> + class Polyline extends IPolyline + link: (scope, element, attrs, mapCtrl) => + # Wrap polyline initialization inside a $timeout() call to make sure the map is created already + IPolyline.mapPromise(scope, mapCtrl).then (gMap) => + # Validate required properties + if angular.isUndefined(scope.path) or scope.path is null or not @validatePath(scope.path) + @$log.warn 'polyline: no valid path attribute found' + + new PolylineChildModel {scope, attrs, gMap, defaults: @DEFAULTS} +] diff --git a/src/coffee/directives/api/polylines.coffee b/src/coffee/directives/api/polylines.coffee new file mode 100644 index 000000000..1db3716ed --- /dev/null +++ b/src/coffee/directives/api/polylines.coffee @@ -0,0 +1,22 @@ +###global angular### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapPolylines', [ + 'uiGmapIPolyline', '$timeout', 'uiGmapPolylinesParentModel', 'uiGmapPlural', + (IPolyline, $timeout, PolylinesParentModel, Plural) -> + class Polylines extends IPolyline + constructor: () -> + super() + Plural.extend @ + @$log.info @ + + link: (scope, element, attrs, mapCtrl) => + # Wrap polyline initialization inside a $timeout() call to make sure the map is created already + mapCtrl.getScope().deferred.promise.then (gMap) => + # Validate required properties + if angular.isUndefined(scope.path) or scope.path is null + @$log.warn 'polylines: no valid path attribute found' + + unless scope.models + @$log.warn 'polylines: no models found to create from' + Plural.link scope, new PolylinesParentModel(scope, element, attrs, gMap, @DEFAULTS) +] diff --git a/src/coffee/directives/api/rectangle.coffee b/src/coffee/directives/api/rectangle.coffee new file mode 100644 index 000000000..0d8e2a37b --- /dev/null +++ b/src/coffee/directives/api/rectangle.coffee @@ -0,0 +1,9 @@ +angular.module('uiGmapgoogle-maps.directives.api').factory 'uiGmapRectangle', +['uiGmapLogger', 'uiGmapGmapUtil' +'uiGmapIRectangle', 'uiGmapRectangleParentModel', + ($log, GmapUtil,IRectangle, RectangleParentModel) -> + _.extend IRectangle, + link: (scope, element, attrs, mapCtrl) -> + mapCtrl.getScope().deferred.promise.then (gMap) -> + new RectangleParentModel scope, element, attrs, gMap +] diff --git a/src/coffee/directives/api/utils/_async.coffee b/src/coffee/directives/api/utils/_async.coffee new file mode 100644 index 000000000..e75f062aa --- /dev/null +++ b/src/coffee/directives/api/utils/_async.coffee @@ -0,0 +1,264 @@ +###global _:true,angular:true,### +angular.module('uiGmapgoogle-maps.directives.api.utils') +.service('uiGmap_sync', [ -> + fakePromise: -> + _cb = undefined + then: (cb) -> + _cb = cb + resolve: -> + _cb.apply(undefined, arguments) + ]) +.service 'uiGmap_async', [ '$timeout', 'uiGmapPromise', 'uiGmapLogger', '$q','uiGmapDataStructures', 'uiGmapGmapUtil', +($timeout, uiGmapPromise, $log, $q, uiGmapDataStructures, uiGmapGmapUtil) -> + promiseTypes = uiGmapPromise.promiseTypes + isInProgress = uiGmapPromise.isInProgress + promiseStatus = uiGmapPromise.promiseStatus + ExposedPromise = uiGmapPromise.ExposedPromise + SniffedPromise = uiGmapPromise.SniffedPromise + + kickPromise = (sniffedPromise, cancelCb) -> + #kick a promise off and log some info on it + promise = sniffedPromise.promise() + promise.promiseType = sniffedPromise.promiseType + $log.debug "promiseType: #{promise.promiseType}, state: #{promiseStatus promise.$$state.status}" if promise.$$state + promise.cancelCb = cancelCb + promise + + doSkippPromise = (sniffedPromise,lastPromise) -> + # note this skipp could be specific to polys (but it works for that) + if sniffedPromise.promiseType == promiseTypes.create and + lastPromise.promiseType != promiseTypes.delete and lastPromise.promiseType != promiseTypes.init + $log.debug "lastPromise.promiseType #{lastPromise.promiseType}, newPromiseType: #{sniffedPromise.promiseType}, SKIPPED MUST COME AFTER DELETE ONLY" + return true + false + + maybeCancelPromises = (queue, sniffedPromise,lastPromise) -> +# $log.warn "sniff: promiseType: #{sniffedPromise.promiseType}, lastPromiseType: #{lastPromise.promiseType}" +# $log.warn "lastPromise.cancelCb #{lastPromise.cancelCb}" + if sniffedPromise.promiseType == promiseTypes.delete and lastPromise.promiseType != promiseTypes.delete + if lastPromise.cancelCb? and _.isFunction(lastPromise.cancelCb) and isInProgress(lastPromise) + $log.debug "promiseType: #{sniffedPromise.promiseType}, CANCELING LAST PROMISE type: #{lastPromise.promiseType}" + lastPromise.cancelCb('cancel safe') + #see if we can cancel anything else + first = queue.peek() + if first? and isInProgress(first)# and first.promiseType != promiseTypes.delete + if first.hasOwnProperty("cancelCb") and _.isFunction first.cancelCb + $log.debug "promiseType: #{first.promiseType}, CANCELING FIRST PROMISE type: #{first.promiseType}" + first.cancelCb('cancel safe') + else + $log.warn 'first promise was not cancelable' + + ### + From a High Level: + This is a SniffedPromiseQueueManager (looking to rename) where the queue is existingPiecesObj.existingPieces. + This is a function and should not be considered a class. + So it is run to manage the state (cancel, skip, link) as needed. + Purpose: + The whole point is to check if there is existing async work going on. If so we wait on it. + + arguments: + - existingPiecesObj = Queue + - sniffedPromise = object wrapper holding a function to a pending (function) promise (promise: fnPromise) + with its intended type. + - cancelCb = callback which accepts a string, this string is intended to be returned at the end of _async.each iterator + + Where the cancelCb passed msg is 'cancel safe' _async.each will drop out and fall through. Thus canceling the promise + gracefully without messing up state. + + Synopsis: + + - Promises have been broken down to 4 states create, update,delete (3 main) and init. (Helps boil down problems in ordering) + where (init) is special to indicate that it is one of the first or to allow a create promise to work beyond being after a delete + + - Every Promise that comes in is enqueued and linked to the last promise in the queue. + + - A promise can be skipped or canceled to save cycles. + + Saved Cycles: + - Skipped - This will only happen if async work comes in out of order. Where a pending create promise (un-executed) comes in + after a delete promise. + - Canceled - Where an incoming promise (un-executed promise) is of type delete and the any lastPromise is not a delete type. + + + NOTE: + - You should not muck with existingPieces as its state is dependent on this functional loop. + - PromiseQueueManager should not be thought of as a class that has a life expectancy (it has none). It's sole + purpose is to link, skip, and kill promises. It also manages the promise queue existingPieces. + ### + PromiseQueueManager = (existingPiecesObj, sniffedPromise, cancelCb) -> + unless existingPiecesObj.existingPieces + #TODO: rename existingPieces to some kind of queue + existingPiecesObj.existingPieces = new uiGmapDataStructures.Queue() + existingPiecesObj.existingPieces.enqueue kickPromise(sniffedPromise, cancelCb) + else + lastPromise = _.last existingPiecesObj.existingPieces._content + + return if doSkippPromise(sniffedPromise, lastPromise) + maybeCancelPromises(existingPiecesObj.existingPieces, sniffedPromise, lastPromise) + + newPromise = ExposedPromise lastPromise.finally -> + kickPromise(sniffedPromise, cancelCb) + newPromise.cancelCb = cancelCb + newPromise.promiseType = sniffedPromise.promiseType + existingPiecesObj.existingPieces.enqueue newPromise + # finally is important as we don't care how something is canceled + lastPromise.finally -> + # keep the queue tight + existingPiecesObj.existingPieces.dequeue() + + managePromiseQueue = (objectToLock, promiseType, msg = '', cancelCb, fnPromise) -> + cancelLogger = (msg) -> + $log.debug "#{msg}: #{msg}" + if cancelCb? and _.isFunction cancelCb + cancelCb(msg) + PromiseQueueManager objectToLock, SniffedPromise(fnPromise, promiseType), cancelLogger + + + defaultChunkSize = 80 + errorObject = + value: null + + #https://github.com/petkaantonov/bluebird/wiki/Optimization-killers + tryCatch = (fn, ctx, args) -> + try + return fn.apply(ctx, args) + catch e + errorObject.value = e + return errorObject + + logTryCatch = (fn, ctx, deferred, args) -> + result = tryCatch(fn, ctx, args) + if result == errorObject + msg = "error within chunking iterator: #{errorObject.value}" + $log.error msg + deferred.reject msg + if result == 'cancel safe' + # THIS IS MAD IMPORTANT AS THIS IS OUR FALLTHOUGH TO ALLOW + # _async.each iterator to drop out at a safe point (IE the end of its iterator callback) + return false + true + + + _getIterateeValue = (collection, array, index) -> + # logger.debug "collection: #{JSON.stringify collection}" + # logger.debug "array: #{JSON.stringify array}" + # logger.debug "index: #{index}" + _isArray = collection == array + valOrKey = array[index] + return valOrKey if _isArray + collection[valOrKey] + + _ignoreFields = ['length', 'forEach', 'map'] + + getArrayAndKeys = (collection, keys, bailOutCb, cb) -> + #checks to handle array and object iteration + if angular.isArray collection + array = collection + else + if keys + array = keys + else + array = [] + #coffeelint:disable=check_scope + for propName, val of collection + #coffeelint:enable=check_scope + if collection.hasOwnProperty(propName) and !_.includes(_ignoreFields, propName) + array.push propName + + if !cb? #shifting args if last cb is not defined + cb = bailOutCb + + if angular.isArray(array) and !array?.length + return bailOutCb() if cb != bailOutCb + cb(array, keys) + + ### + Author: Nicholas McCready & jfriend00 + _async handles things asynchronous-like :), to allow the UI to be free'd to do other things + Code taken from http://stackoverflow.com/questions/10344498/best-way-to-iterate-over-an-array-without-blocking-the-ui + + The design of any functionality of _async is to be like lodash/underscore and replicate it but call things + asynchronously underneath. Each should be sufficient for most things to be derived from. + + Optional Asynchronous Chunking via promises. + ### + doChunk = (collection, chunkSizeOrDontChunk, pauseMilli, chunkCb, pauseCb, overallD, index, _keys) -> + getArrayAndKeys collection, _keys, (array, keys) -> + # logger.debug array + # logger.debug keys + if chunkSizeOrDontChunk and chunkSizeOrDontChunk < array.length + cnt = chunkSizeOrDontChunk + else + cnt = array.length + + i = index + keepGoing = true + # logger.debug "cnt: #{cnt}" + while keepGoing and cnt-- and i < (if array then array.length else i + 1) + # logger.debug "cnt: #{cnt}" + # process array[index] here + val = _getIterateeValue(collection, array, i) + # logger.debug "val: #{val}" + keepGoing = if angular.isFunction val then true else logTryCatch chunkCb, undefined, overallD, [val, i] + ++i + + if array + if keepGoing and i < array.length + index = i + if chunkSizeOrDontChunk + if pauseCb? and _.isFunction pauseCb + logTryCatch pauseCb, undefined, overallD, [] + $timeout -> + doChunk collection, chunkSizeOrDontChunk, pauseMilli, chunkCb, pauseCb, overallD, index, keys + , pauseMilli, false + else + overallD.resolve() + + each = (collection, chunk, chunkSizeOrDontChunk = defaultChunkSize, pauseCb, index = 0, pauseMilli = 1, _keys) -> + ret = undefined + overallD = uiGmapPromise.defer() + ret = overallD.promise + + unless pauseMilli + error = 'pause (delay) must be set from _async!' + $log.error error + overallD.reject error + return ret + + getArrayAndKeys collection, _keys + , -> + overallD.resolve() + return ret + , (array, keys) -> + # set this to whatever number of items you can process at once + doChunk collection, chunkSizeOrDontChunk, pauseMilli, chunk, pauseCb, overallD, index, keys + + return ret + + #copied from underscore but w/ async each above + map = (collection, iterator, chunkSizeOrDontChunk, pauseCb, index, pauseMilli, _keys) -> + results = [] + getArrayAndKeys collection, _keys + , -> + return uiGmapPromise.resolve(results) + , (array, keys) -> + each(collection, (o) -> + results.push iterator o + , chunkSizeOrDontChunk, pauseCb, index, pauseMilli, keys) + .then -> + results + + + each: each + map: map + managePromiseQueue: managePromiseQueue + promiseLock: managePromiseQueue + defaultChunkSize: defaultChunkSize + getArrayAndKeys: getArrayAndKeys + chunkSizeFrom: (fromSize, ret = undefined) -> + if _.isNumber fromSize + ret = fromSize + if uiGmapGmapUtil.isFalse(fromSize) or fromSize == false + ret = false + ret +] diff --git a/src/coffee/directives/api/utils/base-object.coffee b/src/coffee/directives/api/utils/base-object.coffee new file mode 100644 index 000000000..707f9f472 --- /dev/null +++ b/src/coffee/directives/api/utils/base-object.coffee @@ -0,0 +1,17 @@ +angular.module('uiGmapgoogle-maps.directives.api.utils') +.factory 'uiGmapBaseObject', -> + baseObjectKeywords = ['extended', 'included'] + class BaseObject + @extend: (obj) -> + for key, value of obj when key not in baseObjectKeywords + @[key] = value + obj.extended?.apply(@) + this + @include: (obj) -> + for key, value of obj when key not in baseObjectKeywords + #Assign properties to the prototype + @::[key] = value + obj.included?.apply(@) + this + + BaseObject diff --git a/src/coffee/directives/api/utils/child-events.coffee b/src/coffee/directives/api/utils/child-events.coffee new file mode 100644 index 000000000..650e7b1d0 --- /dev/null +++ b/src/coffee/directives/api/utils/child-events.coffee @@ -0,0 +1,10 @@ +### + Useful function callbacks that should be defined at later time. + Mainly to be used for specs to verify creation / linking. + + This is to lead a common design in notifying child stuff. +### +angular.module('uiGmapgoogle-maps.directives.api.utils') +.factory 'uiGmapChildEvents', -> + onChildCreation: (child) -> + #doing nothing but can be hooked / overriden later diff --git a/src/coffee/directives/api/utils/ctrl-handle.coffee b/src/coffee/directives/api/utils/ctrl-handle.coffee new file mode 100644 index 000000000..f42931824 --- /dev/null +++ b/src/coffee/directives/api/utils/ctrl-handle.coffee @@ -0,0 +1,16 @@ +angular.module('uiGmapgoogle-maps.directives.api.utils') +.service 'uiGmapCtrlHandle', ['$q', ($q) -> + CtrlHandle = + handle: ($scope, $element) -> + $scope.$on '$destroy', -> + CtrlHandle.handle($scope) + $scope.deferred = $q.defer() + getScope: -> + $scope + + mapPromise: (scope, ctrl) -> + mapScope = ctrl.getScope() + mapScope.deferred.promise.then (map) -> + scope.map = map + mapScope.deferred.promise +] diff --git a/src/coffee/directives/api/utils/events-helper.coffee b/src/coffee/directives/api/utils/events-helper.coffee new file mode 100644 index 000000000..e002e56df --- /dev/null +++ b/src/coffee/directives/api/utils/events-helper.coffee @@ -0,0 +1,33 @@ +angular.module("uiGmapgoogle-maps.directives.api.utils") +.service "uiGmapEventsHelper", ["uiGmapLogger", ($log) -> + _hasEvents = (obj) -> + angular.isDefined(obj.events) and obj.events? and angular.isObject(obj.events) + + _getEventsObj = (scope, model) -> + if _hasEvents scope + return scope + if _hasEvents model + return model + + + setEvents: (gObject, scope, model, ignores) -> + eventObj = _getEventsObj scope, model + + if eventObj? + _.compact _.map eventObj.events, (eventHandler, eventName) -> + if ignores + doIgnore = _(ignores).includes(eventName) #ignores to be invoked by internal listeners + if eventObj.events.hasOwnProperty(eventName) and angular.isFunction(eventObj.events[eventName]) and !doIgnore + google.maps.event.addListener gObject, eventName, -> + #$scope.$evalAsync must exist, I have tried null checking, underscore key checking. Nothing works but having a real or fake $evalAsync + #it would be nice to know why + unless scope.$evalAsync + scope.$evalAsync = -> + scope.$evalAsync(eventHandler.apply(scope, [gObject, eventName, model, arguments])) + + removeEvents: (listeners) -> + return unless listeners + for key, l of listeners + google.maps.event.removeListener(l) if l and listeners.hasOwnProperty(key) + return +] diff --git a/src/coffee/directives/api/utils/fit-helper.coffee b/src/coffee/directives/api/utils/fit-helper.coffee new file mode 100644 index 000000000..0733a04cd --- /dev/null +++ b/src/coffee/directives/api/utils/fit-helper.coffee @@ -0,0 +1,16 @@ +angular.module('uiGmapgoogle-maps.directives.api.utils') +.service 'uiGmapFitHelper', [ 'uiGmapLogger', '$timeout', ($log, $timeout) -> + fit: (markersOrPoints, gMap) -> + if gMap and markersOrPoints?.length + bounds = new google.maps.LatLngBounds() + everSet = false + #coffeelint:disable=check_scope + for key, markerOrPoint of markersOrPoints + #coffeelint:enable=check_scope + if markerOrPoint + everSet = true unless everSet + point = if _.isFunction markerOrPoint.getPosition then markerOrPoint.getPosition() else markerOrPoint + bounds.extend point + if everSet + $timeout () -> gMap.fitBounds(bounds) +] diff --git a/src/coffee/directives/api/utils/gmap-util.coffee b/src/coffee/directives/api/utils/gmap-util.coffee new file mode 100644 index 000000000..a9f56705d --- /dev/null +++ b/src/coffee/directives/api/utils/gmap-util.coffee @@ -0,0 +1,242 @@ +###global _:true, angular:true, google:true ### +angular.module('uiGmapgoogle-maps.directives.api.utils') +.service 'uiGmapGmapUtil', ['uiGmapLogger', '$compile', (Logger, $compile) -> + #BEGIN Private Methods + _isTruthy = (value, bool, optionsArray) -> + value is bool or optionsArray.indexOf(value) != -1 + + _isFalse = (value) -> + _isTruthy(value, false,['false', 'FALSE', 0, 'n', 'N', 'no', 'NO']) + + getLatitude = (value) -> + if Array.isArray(value) and value.length is 2 + value[1] + else if angular.isDefined(value.type) and value.type is 'Point' + value.coordinates[1] + else + value.latitude + + getLongitude = (value) -> + if Array.isArray(value) and value.length is 2 + value[0] + else if angular.isDefined(value.type) and value.type is 'Point' + value.coordinates[0] + else + value.longitude + + getCoords = (value) -> + return unless value + if value instanceof google.maps.LatLng + return value + else if Array.isArray(value) and value.length is 2 + new google.maps.LatLng(value[1], value[0]) + else if angular.isDefined(value.type) and value.type is 'Point' + new google.maps.LatLng(value.coordinates[1], value.coordinates[0]) + else + new google.maps.LatLng(value.latitude, value.longitude) + + validateCoords = (coords) -> + return false if angular.isUndefined coords + + if _.isArray(coords) + return true if coords.length is 2 + else if coords? and coords?.type + return true if coords.type is 'Point' and _.isArray(coords.coordinates) and coords.coordinates.length is 2 + return true if coords and angular.isDefined coords?.latitude and angular.isDefined coords?.longitude + false + #END Private Methods + + # BEGIN Public Methods + setCoordsFromEvent: (prevValue, newLatLon) -> + return unless prevValue + if Array.isArray(prevValue) and prevValue.length is 2 + prevValue[1] = newLatLon.lat() + prevValue[0] = newLatLon.lng() + else if angular.isDefined(prevValue.type) and prevValue.type is 'Point' + prevValue.coordinates[1] = newLatLon.lat() + prevValue.coordinates[0] = newLatLon.lng() + else + prevValue.latitude = newLatLon.lat() + prevValue.longitude = newLatLon.lng() + + prevValue + + getLabelPositionPoint: (anchor) -> + if anchor == undefined + return undefined + + anchor = /^([-\d\.]+)\s([-\d\.]+)$/.exec(anchor) + xPos = parseFloat(anchor[1]) + yPos = parseFloat(anchor[2]) + if xPos? && yPos? + new google.maps.Point(xPos, yPos) + + createWindowOptions: (gMarker, scope, content, defaults) -> + if content? and defaults? and $compile? + options = angular.extend {}, defaults, + content: @buildContent(scope, defaults, content), + position: if defaults.position? + then defaults.position else if angular.isObject(gMarker) + then gMarker.getPosition() else getCoords(scope.coords) + if gMarker? and !options?.pixelOffset? + #if we have a marker, center the window above + if !options.boxClass? + # options.pixelOffset = height:-40, width:0 (using anchor) + else #it is an infoBox center it below + options.pixelOffset = height:0, width:-2 + options + else + unless defaults + Logger.error 'infoWindow defaults not defined' + Logger.error 'infoWindow content not defined' unless content + else + return defaults + + buildContent: (scope, defaults, content) -> + if defaults.content? + ret = defaults.content + else + if $compile? + # replace leading/trailing whitespace + content = content.replace /^\s+|\s+$/g, '' + #avoid jqlite selector error on passing an empty string to $compile + parsed = if content == '' then '' else $compile(content)(scope) + if parsed.length > 0 + ret = parsed[0] #must be one element with children or angular bindings get lost + else + ret = content + ret + + defaultDelay: 50 + + isTrue: (value) -> + _isTruthy(value, true, ['true', 'TRUE', 1, 'y', 'Y', 'yes', 'YES']) + + isFalse: _isFalse + + isFalsy: (value) -> + _isTruthy(value, false,[undefined, null]) or _isFalse(value) + + getCoords: getCoords + + validateCoords: validateCoords + + equalCoords: (coord1, coord2) -> + getLatitude(coord1) == getLatitude(coord2) and + getLongitude(coord1) == getLongitude(coord2) + + validatePath: (path) -> + i = 0 + if angular.isUndefined(path.type) + if not Array.isArray(path) or path.length < 2 + return false + + #Arrays of latitude/longitude objects or Google Maps LatLng objects are allowed + while i < path.length + if not ((angular.isDefined(path[i].latitude) and angular.isDefined(path[i].longitude)) or (typeof path[i].lat == 'function' and typeof path[i].lng == 'function')) + return false + + i++ + + true + else + return false if angular.isUndefined(path.coordinates) + + if path.type is 'Polygon' + return false if path.coordinates[0].length < 4 + #Note: At this time, we only support the outer polygon and ignore the inner 'holes' + array = path.coordinates[0] + else if path.type is 'MultiPolygon' + #Note: At this time, we will display the polygon with the most vertices + trackMaxVertices = { max: 0, index: 0 } + _.forEach(path.coordinates, (polygon, index) -> + if polygon[0].length > this.max + this.max = polygon[0].length + this.index = index + , trackMaxVertices) + + #TODO: Properly support MultiPolygons + polygon = path.coordinates[trackMaxVertices.index] + #Note: At this time, we only support the outer polygon and ignore the inner 'holes' + array = polygon[0] + + return false if array.length < 4 + else if path.type is 'LineString' + return false if path.coordinates.length < 2 + array = path.coordinates + else + return false + + while i < array.length + return false if array[i].length != 2 + i++ + + true + + convertPathPoints: (path) -> + i = 0 + result = new google.maps.MVCArray() + + if angular.isUndefined(path.type) + # TODO: optimize to detect if array contains LatLng and directly pass array to MVCArray constructor + # CONTRIBUTIONS WELCOMED + # TODO: remove while loop it is the same as maping, either array.map or _.map + while i < path.length + latlng + if angular.isDefined(path[i].latitude) and angular.isDefined(path[i].longitude) # latitude/longitude object + latlng = new google.maps.LatLng(path[i].latitude, path[i].longitude) + else if typeof path[i].lat == 'function' and typeof path[i].lng == 'function' # LatLng object + latlng = path[i] + + result.push latlng + i++ + else + array + if path.type is 'Polygon' + #Note: At this time, we only support the outer polygon and ignore the inner 'holes' + array = path.coordinates[0] + else if path.type is 'MultiPolygon' + #Note: At this time we will display the polygon with the most vertices + trackMaxVertices = { max: 0, index: 0 } + _.forEach(path.coordinates, (polygon, index) -> + if polygon[0].length > this.max + this.max = polygon[0].length + this.index = index + , trackMaxVertices) + + #TODO: Properly support MultiPolygons + array = path.coordinates[trackMaxVertices.index][0] + else if path.type is 'LineString' + array = path.coordinates + + while i < array.length + result.push new google.maps.LatLng(array[i][1], array[i][0]) + i++ + + result + + getPath: (object, key) -> + #if the key is not a sting then we already have the value + return key if not key? or not _.isString key + obj = object + _.each key.split('.'), (value) -> + if obj then obj = obj[value] + + obj + + validateBoundPoints: (bounds) -> + return false if angular.isUndefined(bounds.sw.latitude) or + angular.isUndefined(bounds.sw.longitude) or + angular.isUndefined(bounds.ne.latitude) or + angular.isUndefined(bounds.ne.longitude) + true + + convertBoundPoints: (bounds) -> + result = new google.maps.LatLngBounds new google.maps.LatLng(bounds.sw.latitude, bounds.sw.longitude) + ,new google.maps.LatLng(bounds.ne.latitude, bounds.ne.longitude) + result + + fitMapBounds: (map, bounds) -> + map.fitBounds bounds + #end Public Methods +] diff --git a/src/coffee/directives/api/utils/is-ready.coffee b/src/coffee/directives/api/utils/is-ready.coffee new file mode 100644 index 000000000..8046470fe --- /dev/null +++ b/src/coffee/directives/api/utils/is-ready.coffee @@ -0,0 +1,49 @@ +angular.module('uiGmapgoogle-maps.directives.api.utils') +.service 'uiGmapIsReady', ['$q', '$timeout', ($q, $timeout) -> + _ctr = 0 + _proms = [] + + _promises = -> + $q.all _proms + + + _checkIfReady = (deferred, expectedInstances, retriesLeft) -> + $timeout -> + if retriesLeft <= 0 + deferred.reject('Your maps are not found we have checked the maximum amount of times. :)') + return + if _ctr != expectedInstances + _checkIfReady(deferred, expectedInstances, retriesLeft-1) + else + deferred.resolve(_promises()) + return + , 100 + + spawn: -> + d = $q.defer() + _proms.push d.promise + _ctr += 1 + + instance: _ctr + deferred: d + + promises: _promises + + instances: -> + _ctr + + promise: (expectedInstances = 1, numRetries = 50) -> + d = $q.defer() + _checkIfReady(d, expectedInstances, numRetries) + d.promise + + reset: -> + _ctr = 0 + _proms.length = 0 + return + + decrement: -> + _ctr -= 1 if _ctr > 0 + _proms.length -= 1 if _proms.length + return +] diff --git a/src/coffee/directives/api/utils/linked.coffee b/src/coffee/directives/api/utils/linked.coffee new file mode 100644 index 000000000..d38105bcc --- /dev/null +++ b/src/coffee/directives/api/utils/linked.coffee @@ -0,0 +1,10 @@ +angular.module("uiGmapgoogle-maps.directives.api.utils") +.factory "uiGmapLinked", [ "uiGmapBaseObject", (BaseObject) -> + class Linked extends BaseObject + constructor: (scope, element, attrs, ctrls)-> + @scope = scope + @element = element + @attrs = attrs + @ctrls = ctrls + Linked +] diff --git a/src/coffee/directives/api/utils/logger.coffee b/src/coffee/directives/api/utils/logger.coffee new file mode 100644 index 000000000..af697e32a --- /dev/null +++ b/src/coffee/directives/api/utils/logger.coffee @@ -0,0 +1,4 @@ +angular.module('uiGmapgoogle-maps.directives.api.utils') +.service 'uiGmapLogger', [ 'nemSimpleLogger', (nemSimpleLogger) -> + nemSimpleLogger.spawn() +] diff --git a/src/coffee/directives/api/utils/model-key.coffee b/src/coffee/directives/api/utils/model-key.coffee new file mode 100644 index 000000000..feb22f183 --- /dev/null +++ b/src/coffee/directives/api/utils/model-key.coffee @@ -0,0 +1,165 @@ +###global _:true, angular:true ### +angular.module('uiGmapgoogle-maps.directives.api.utils') +.factory 'uiGmapModelKey', ['uiGmapBaseObject', 'uiGmapGmapUtil', (BaseObject, GmapUtil) -> + class extends BaseObject + constructor: (@scope, @interface = scopeKeys:[]) -> + super() + ##common scope keys interface for iterating comparators + @defaultIdKey = 'id' + @idKey = undefined +# @cached = {} + + evalModelHandle: (model, modelKey) -> + return if not model? or not modelKey? + + if modelKey == 'self' + model + else #modelKey may use dot-notation + modelKey = modelKey() if _.isFunction(modelKey) + GmapUtil.getPath(model, modelKey) + + modelKeyComparison: (model1, model2) => + hasCoords = @interface.scopeKeys.indexOf('coords') >= 0 + scope = @scope if hasCoords and @scope.coords? or not hasCoords + if not scope? then throw 'No scope set!' + + if hasCoords + # logger.debug 'hasCoords' + coord1 = @scopeOrModelVal('coords', scope, model1) + coord2 = @scopeOrModelVal('coords', scope, model2) + # logger.debug "coord1:" + JSON.stringify coord1 + # logger.debug "coord2:" + JSON.stringify coord2 + isEqual = GmapUtil.equalCoords coord1, coord2 + + #deep comparison of the rest of properties + return isEqual unless isEqual + #compare the rest of the properties that are being watched by scope + without = _.without(@interface.scopeKeys, 'coords') + + isEqual = _.every without, (k) => + m1 = @scopeOrModelVal(scope[k], scope, model1) + m2 = @scopeOrModelVal(scope[k], scope, model2) + if scope.deepComparison then _.isEqual(m1, m2) else m1 == m2 + isEqual + + + setIdKey: (scope) => + @idKey = if scope.idKey? then scope.idKey else @defaultIdKey + + setVal: (model, key, newValue) -> + @modelOrKey model, key = newValue + model + + modelOrKey: (model, key) -> + return unless key? + if key != 'self' + return GmapUtil.getPath(model, key) + model + + getProp: (propName, scope, model) => + @scopeOrModelVal(propName, scope, model) + + ### + For the cases were watching a large object we only want to know the list of props + that actually changed. + Also we want to limit the amount of props we analyze to whitelisted props that are + actually tracked by scope. (should make things faster with whitelisted) + ### + getChanges: (now, prev, whitelistedProps) => + if whitelistedProps + prev = _.pick prev, whitelistedProps + now = _.pick now, whitelistedProps + changes = {} + prop = {} + c = {} + + for prop of now #ignore jslint + if not prev or prev[prop] isnt now[prop] + if _.isArray(now[prop]) + changes[prop] = now[prop] + else if _.isObject(now[prop]) + # Recursion alert + c = @getChanges(now[prop], (if prev then prev[prop] else null)) + changes[prop] = c unless _.isEmpty(c) + else + changes[prop] = now[prop] + changes + + + # evaluate scope to scope.$parent (as long as isolate is false) with preference over models + # this will allow for expressions and strings evals + # returns + # doWrap: false + # a value evaluated as a function or object + # doWrap: true + # a object indicating where the value comes (isScope) + # isScope: true is from scope, false from model + # value: return value from doWrap false + scopeOrModelVal: (key, scope, model, doWrap = false) -> + maybeWrap = (isScope, ret, doWrap = false) -> + if doWrap + return {isScope: isScope, value: ret} + ret + + scopeProp = _.get scope, key + + if _.isFunction scopeProp + return maybeWrap true, scopeProp(model), doWrap + if _.isObject scopeProp + return maybeWrap true, scopeProp, doWrap + unless _.isString scopeProp + return maybeWrap true, scopeProp, doWrap + + modelKey = scopeProp #this should be the key pointing to what we need + unless modelKey + modelProp = _.get model, key + else + modelProp = if modelKey == 'self' then model else _.get model, modelKey + if _.isFunction modelProp + return maybeWrap false, modelProp(), doWrap + maybeWrap false, modelProp, doWrap + + + setChildScope: (keys, childScope, model) => + #coffeelint:disable=check_scope + for key, name of keys + #coffeelint:enable=check_scope + isScopeObj = @scopeOrModelVal name, childScope, model, true + if isScopeObj?.value? #if we have something evaluated save to scope to not reevaluate on init + newValue = isScopeObj.value + if(newValue != childScope[name]) + childScope[name] = newValue + + childScope.model = model + + + onDestroy: (scope) -> + + destroy: (manualOverride = false) => + if @scope? and not @scope?.$$destroyed and (@needToManualDestroy or manualOverride) + @scope.$destroy() + else + @clean() + + updateChild:(child, model) => + unless model[@idKey]? + @$log.error("Model has no id to assign a child to. This is required for performance. Please assign id, or redirect id to a different key.") + return + #set isInit to true to force redraw after all updates are processed + child.updateModel model + + + modelsLength: (arrayOrObjModels = undefined) => + len = 0 + toCheck = if arrayOrObjModels then arrayOrObjModels else @scope.models + return len unless toCheck? + + # isArray .. get length + # OR check to see if there is length field which (is essentially cached on the front or backend) + if angular.isArray(toCheck) or toCheck.length? + len = toCheck.length + else #worst case ... pay the price + len = Object.keys(toCheck).length + len + +] diff --git a/src/coffee/directives/api/utils/models-watcher.coffee b/src/coffee/directives/api/utils/models-watcher.coffee new file mode 100644 index 000000000..843b304b9 --- /dev/null +++ b/src/coffee/directives/api/utils/models-watcher.coffee @@ -0,0 +1,48 @@ +angular.module('uiGmapgoogle-maps.directives.api.utils') +.factory 'uiGmapModelsWatcher', [ + 'uiGmapLogger', 'uiGmap_async', '$q', 'uiGmapPromise', + (Logger,_async, $q, uiGmapPromise) -> + + didQueueInitPromise:(existingPiecesObj, scope) -> + if scope.models.length == 0 + _async.promiseLock existingPiecesObj, uiGmapPromise.promiseTypes.init, null , null, (-> uiGmapPromise.resolve()) + return true + false + + figureOutState: (idKey, scope, childObjects, comparison, callBack) -> + adds = [] #models to add or update + mappedScopeModelIds = {} + removals = [] #childModels to remove + updates = [] + scope.models.forEach (m) -> + if m[idKey]? + mappedScopeModelIds[m[idKey]] = {} + unless childObjects.get(m[idKey])? + adds.push m + else + child = childObjects.get(m[idKey]) + #we're UPDATE in this case + unless comparison m, child.clonedModel, scope + updates.push + model: m + child: child + else + Logger.error ''' id missing for model #{m.toString()}, + can not use do comparison/insertion''' + children = childObjects.values() + children.forEach (c) -> + unless c? + Logger.error('child undefined in ModelsWatcher.') + return + unless c.model? + Logger.error('child.model undefined in ModelsWatcher.') + return + id = c.model[idKey] + #if we do not have the object we can remove it, + #this case is when it no longer exists and should be removed + removals.push c unless mappedScopeModelIds[id]? + + adds: adds + removals: removals + updates: updates +] diff --git a/src/coffee/directives/api/utils/promise.coffee b/src/coffee/directives/api/utils/promise.coffee new file mode 100644 index 000000000..fa88d8460 --- /dev/null +++ b/src/coffee/directives/api/utils/promise.coffee @@ -0,0 +1,99 @@ +# wrapper to be 'like' bluebirds interface +angular.module('uiGmapgoogle-maps.directives.api.utils') +.service 'uiGmapPromise', [ '$q', '$timeout', 'uiGmapLogger', ($q, $timeout, $log) -> + + promiseTypes = + create : 'create' + update : 'update' + delete : 'delete' + init: 'init' + + promiseStatuses = + IN_PROGRESS: 0 + RESOLVED: 1 + REJECTED: 2 + + strPromiseStatuses = do -> + obj = {} + obj["#{promiseStatuses.IN_PROGRESS}"] = 'in-progress' + obj["#{promiseStatuses.RESOLVED}"] = 'resolved' + obj["#{promiseStatuses.REJECTED}"] = 'rejected' + obj + + isInProgress = (promise) -> + return promise.$$state.status == promiseStatuses.IN_PROGRESS if promise.$$state + true unless promise.hasOwnProperty("$$v") + + + isResolved = (promise) -> + return promise.$$state.status == promiseStatuses.RESOLVED if promise.$$state + true if promise.hasOwnProperty("$$v") + + promiseStatus = (status) -> + strPromiseStatuses[status] or 'done w error' + + #wrapper to expose reject (cancel), notify and other extensions on a promise without needing to pass around deferred. + ExposedPromise = (promise) -> + cancelDeferred = $q.defer() + combined = $q.all [promise, cancelDeferred.promise] + wrapped = $q.defer() + + promise.then cancelDeferred.resolve, (->), (notify) -> + cancelDeferred.notify notify + wrapped.notify notify + + #if we completion from combined then we pass on the correct msh from its index + combined.then (successes) -> + wrapped.resolve successes[0] or successes[1] + , (error) -> + wrapped.reject error + # , (notifies) -> #this is not handled in angular yet.. it should be + # wrapped.notify notifies[0] or notifies[1] + + wrapped.promise.cancel = (reason = 'canceled') -> + cancelDeferred.reject reason + + wrapped.promise.notify = (msg = 'cancel safe') -> + wrapped.notify msg + #if originating promise is a cancelable type (we can send it a message as well) + promise.notify msg if promise.hasOwnProperty('notify') + + if promise.promiseType? + wrapped.promise.promiseType = promise.promiseType + wrapped.promise + + # a wrapper on a promise that has not been executed + # consider passing in a unresolved promise instead of a callback, or handle both + SniffedPromise = (fnPromise, promiseType) -> + promise: fnPromise + promiseType: promiseType + + #export + defer = -> + $q.defer() + resolve = -> + d = $q.defer() + d.resolve.apply(undefined,arguments) + d.promise + + #create a promise around a callback that has not executed + promise= (fnToWrap) -> + unless _.isFunction fnToWrap + $log.error "uiGmapPromise.promise() only accepts functions" + return + d = $q.defer() + $timeout -> + result = fnToWrap() + d.resolve result + d.promise + + defer: defer + promise: promise + resolve: resolve + promiseTypes: promiseTypes + isInProgress: isInProgress + isResolved: isResolved + promiseStatus: promiseStatus + ExposedPromise: ExposedPromise + SniffedPromise: SniffedPromise +] \ No newline at end of file diff --git a/src/coffee/directives/api/utils/prop-map.coffee b/src/coffee/directives/api/utils/prop-map.coffee new file mode 100644 index 000000000..7a27de981 --- /dev/null +++ b/src/coffee/directives/api/utils/prop-map.coffee @@ -0,0 +1,73 @@ +angular.module("uiGmapgoogle-maps.directives.api.utils") +.factory "uiGmapPropMap", -> + ### + Simple Object Map with a length property to make it easy to track length/size + ### + class PropMap + constructor: () -> + @length = 0 + @dict = {} + @didValsStateChange = false + @didKeysStateChange = false + @allVals = [] + @allKeys = [] + + get: (key)=> + @dict[key] + + stateChanged: => + @didValsStateChange = true + @didKeysStateChange = true + + #modify map through put or remove to keep track of length , otherwise the state will be incorrect + put: (key, value)=> + unless @get(key)? #if we are adding something new increment length + @length++ + @stateChanged() + @dict[key] = value + + remove: (key, isSafe = false)=> + return undefined if isSafe and not @get key + value = @dict[key] + delete @dict[key] + @length-- + @stateChanged() + value + + valuesOrKeys: (str = 'Keys') -> + return @['all' + str] unless @["did#{str}StateChange"] + vals = [] + keys = [] + _.each @dict, (v, k)-> + vals.push v + keys.push k + @didKeysStateChange = false + @didValsStateChange = false + + @allVals = vals + @allKeys = keys + return @['all' + str] + + values: => + @valuesOrKeys 'Vals' + + keys: => + @valuesOrKeys() + + push: (obj, key = "key") => + @put obj[key], obj + + slice: => + @keys().map (k) => + @remove k + + removeAll: => + @slice() + + each: (cb) -> + _.each @dict, (v, k) -> + cb(v) + + map: (cb) -> + _.map @dict, (v, k) -> + cb(v) diff --git a/src/coffee/directives/api/utils/property-action.coffee b/src/coffee/directives/api/utils/property-action.coffee new file mode 100644 index 000000000..d846203bb --- /dev/null +++ b/src/coffee/directives/api/utils/property-action.coffee @@ -0,0 +1,13 @@ +###globals angular,_### +angular.module("uiGmapgoogle-maps.directives.api.utils") +.factory "uiGmapPropertyAction", ["uiGmapLogger", (Logger) -> + + PropertyAction = (setterFn) -> + @setIfChange = (callingKey) -> (newVal, oldVal) -> + if not _.isEqual oldVal, newVal + setterFn(callingKey, newVal) + #alias to setIfChange + @sic = @setIfChange + @ + PropertyAction +] diff --git a/src/coffee/directives/api/window.coffee b/src/coffee/directives/api/window.coffee new file mode 100644 index 000000000..4a54c7aa7 --- /dev/null +++ b/src/coffee/directives/api/window.coffee @@ -0,0 +1,65 @@ +###global angular:true### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapWindow', [ 'uiGmapIWindow', 'uiGmapGmapUtil', 'uiGmapWindowChildModel','uiGmapLodash', 'uiGmapLogger', + (IWindow, GmapUtil, WindowChildModel, uiGmapLodash, $log) -> + class Window extends IWindow + @include GmapUtil + constructor: -> + super() + @require = ['^' + 'uiGmapGoogleMap', '^?' + 'uiGmapMarker'] + @template = '' + $log.debug @ + @childWindows = [] + + link: (scope, element, attrs, ctrls) => + #keep out of promise.then to keep scopes unique , not sure why yet + markerCtrl = if ctrls.length > 1 and ctrls[1]? then ctrls[1] else undefined + markerScope = markerCtrl?.getScope() + #end of keep out of promise + @mapPromise = IWindow.mapPromise(scope, ctrls[0]) + #looks like angulars $q is FIFO and Bluebird is LIFO + @mapPromise.then (gMap) => + isIconVisibleOnClick = true + + if angular.isDefined attrs.isiconvisibleonclick + isIconVisibleOnClick = scope.isIconVisibleOnClick + if not markerCtrl + @init scope, element, isIconVisibleOnClick, gMap + return + markerScope.deferred.promise.then (gMarker) => + @init scope, element, isIconVisibleOnClick, gMap, markerScope + + # post: (scope, element, attrs, ctrls) => + + init: (scope, element, isIconVisibleOnClick, gMap, markerScope) -> + defaults = if scope.options? then scope.options else {} + hasScopeCoords = scope? and @validateCoords(scope.coords) + gMarker = markerScope.getGMarker() if markerScope?['getGMarker']? + opts = if hasScopeCoords then @createWindowOptions(gMarker, scope, element.html(), defaults) else defaults + if gMap? #at the very least we need a Map, the marker is optional as we can create Windows without markers + childWindow = new WindowChildModel { + scope, opts, isIconVisibleOnClick, gMap, markerScope, element + } + @childWindows.push childWindow + + scope.$on '$destroy', => + @childWindows = uiGmapLodash.withoutObjects @childWindows,[childWindow], (child1,child2) -> + child1.scope.$id == child2.scope.$id + @childWindows.length = 0 + + if scope.control? + scope.control.getGWindows = => + @childWindows.map (child) -> + child.gObject + scope.control.getChildWindows = => + @childWindows + scope.control.getPlurals = scope.control.getChildWindows + scope.control.showWindow = => + @childWindows.map (child) -> + child.showWindow() + scope.control.hideWindow = => + @childWindows.map (child) -> + child.hideWindow() + + @onChildCreation childWindow if @onChildCreation? and childWindow? +] diff --git a/src/coffee/directives/api/windows.coffee b/src/coffee/directives/api/windows.coffee new file mode 100644 index 000000000..26b845596 --- /dev/null +++ b/src/coffee/directives/api/windows.coffee @@ -0,0 +1,46 @@ +###global angular### +angular.module('uiGmapgoogle-maps.directives.api') +.factory 'uiGmapWindows', [ + 'uiGmapIWindow', 'uiGmapPlural', 'uiGmapWindowsParentModel', 'uiGmapPromise', 'uiGmapLogger', + (IWindow, Plural, WindowsParentModel, uiGmapPromise, $log) -> + ### + Windows directive where many windows map to the models property + ### + class Windows extends IWindow + constructor: -> + super() + @require = ['^' + 'uiGmapGoogleMap', '^?' + 'uiGmapMarkers'] + @template = '' + Plural.extend @ + + $log.debug @ + + + link: (scope, element, attrs, ctrls) => + mapScope = ctrls[0].getScope() + markerCtrl = if ctrls.length > 1 and ctrls[1]? then ctrls[1] else undefined + markerScope = markerCtrl?.getScope() + + mapScope.deferred.promise.then (map) => + promise = markerScope?.deferred?.promise or uiGmapPromise.resolve() + promise.then => + pieces = @parentModel?.existingPieces + if pieces + pieces.then => + @init scope, element, attrs, ctrls, map, markerScope + else + @init scope, element, attrs, ctrls, map, markerScope + + init: (scope, element, attrs, ctrls, map, additionalScope) -> + parentModel = new WindowsParentModel(scope, element, attrs, ctrls, map, additionalScope) + Plural.link(scope, parentModel) + if scope.control? + scope.control.getGWindows = -> + parentModel.plurals.map (child) -> + child.gObject + #deprecated use getPlurals + scope.control.getChildWindows = -> + parentModel.plurals + + +] diff --git a/src/coffee/directives/circle.coffee b/src/coffee/directives/circle.coffee new file mode 100644 index 000000000..24b18b5ae --- /dev/null +++ b/src/coffee/directives/circle.coffee @@ -0,0 +1,8 @@ +### +@authors +Julian Popescu - https://github.com/jpopesculian +Rick Huizinga - https://plus.google.com/+RickHuizinga +### +angular.module('uiGmapgoogle-maps').directive "uiGmapCircle", [ + "uiGmapCircle", (Circle) -> Circle +] diff --git a/src/coffee/directives/control.coffee b/src/coffee/directives/control.coffee new file mode 100644 index 000000000..7abc3efee --- /dev/null +++ b/src/coffee/directives/control.coffee @@ -0,0 +1,20 @@ +### +@authors +Adam Kreitals, kreitals@hotmail.com +### + +### +mapControl directive + +This directive is used to create a custom control element on an existing map. +This directive creates a new scope. + +{attribute template required} string url of the template to be used for the control +{attribute position optional} string position of the control of the form top-left or TOP_LEFT defaults to TOP_CENTER +{attribute controller optional} string controller to be applied to the template +{attribute index optional} number index for controlling the order of similarly positioned mapControl elements +### +angular.module("uiGmapgoogle-maps") +.directive "uiGmapMapControl", ["uiGmapControl", (Control) -> + new Control() +] diff --git a/src/coffee/directives/controllers/polyline-display.coffee b/src/coffee/directives/controllers/polyline-display.coffee new file mode 100644 index 000000000..78d6bdb37 --- /dev/null +++ b/src/coffee/directives/controllers/polyline-display.coffee @@ -0,0 +1,5 @@ +angular.module('uiGmapgoogle-maps') +.controller 'uiGmapPolylineDisplayController', ['$scope', ($scope) -> + $scope.toggleStrokeColor = -> + $scope.stroke.color = (if ($scope.stroke.color is '#6060FB') then 'red' else '#6060FB') +] diff --git a/src/coffee/directives/drag-zoom.coffee b/src/coffee/directives/drag-zoom.coffee new file mode 100644 index 000000000..3e8ed5b19 --- /dev/null +++ b/src/coffee/directives/drag-zoom.coffee @@ -0,0 +1,6 @@ +### +@authors +Nicholas McCready - https://twitter.com/nmccready +### +angular.module('uiGmapgoogle-maps') +.directive 'uiGmapDragZoom', [ 'uiGmapDragZoom', (DragZoom) -> DragZoom ] diff --git a/src/coffee/directives/drawing-manager.coffee b/src/coffee/directives/drawing-manager.coffee new file mode 100644 index 000000000..c30dd5357 --- /dev/null +++ b/src/coffee/directives/drawing-manager.coffee @@ -0,0 +1,3 @@ +angular.module('uiGmapgoogle-maps').directive "uiGmapDrawingManager", [ + "uiGmapDrawingManager", (DrawingManager) -> DrawingManager +] diff --git a/src/coffee/directives/free-draw-polygons.coffee b/src/coffee/directives/free-draw-polygons.coffee new file mode 100644 index 000000000..c2c5904e6 --- /dev/null +++ b/src/coffee/directives/free-draw-polygons.coffee @@ -0,0 +1,9 @@ +### +@authors +Nicholas McCready - https://twitter.com/nmccready +# Brunt of the work is in DrawFreeHandChildModel +### +angular.module('uiGmapgoogle-maps').directive 'uiGmapFreeDrawPolygons', [ + 'uiGmapApiFreeDrawPolygons',(FreeDrawPolygons) -> + new FreeDrawPolygons() +] diff --git a/src/coffee/directives/layer.coffee b/src/coffee/directives/layer.coffee new file mode 100644 index 000000000..1fd31c89a --- /dev/null +++ b/src/coffee/directives/layer.coffee @@ -0,0 +1,41 @@ +### +@authors: +- Nicolas Laplante https://plus.google.com/108189012221374960701 +- Nicholas McCready - https://twitter.com/nmccready +### + +### +Map Layer directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. + +{attribute show optional} true (default) shows the trafficlayer otherwise it is hidden +### +angular.module('uiGmapgoogle-maps') +.directive 'uiGmapLayer', ['$timeout', 'uiGmapLogger', 'uiGmapLayerParentModel', + ($timeout, Logger, LayerParentModel) -> + class Layer + constructor: -> + @$log = Logger + @restrict = 'EMA' + @require = '^' + 'uiGmapGoogleMap' + @priority = -1 + @transclude = true + @template = '' + @replace = true + @scope = + show: '=show' + type: '=type' + namespace: '=namespace' + options: '=options' + onCreated: '&oncreated' + + link: (scope, element, attrs, mapCtrl) => + mapCtrl.getScope().deferred.promise.then (map) => + if scope.onCreated? + new LayerParentModel(scope, element, attrs, map, scope.onCreated) + else + new LayerParentModel(scope, element, attrs, map) + new Layer() +] diff --git a/src/coffee/directives/map-type.coffee b/src/coffee/directives/map-type.coffee new file mode 100644 index 000000000..2f962586f --- /dev/null +++ b/src/coffee/directives/map-type.coffee @@ -0,0 +1,31 @@ +### +Map Layer directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. + +{attribute show optional} true (default) shows the trafficlayer otherwise it is hidden +### +angular.module("uiGmapgoogle-maps") +.directive "uiGmapMapType", ["$timeout", "uiGmapLogger", "uiGmapMapTypeParentModel", + ($timeout, Logger, MapTypeParentModel) -> + class MapType + constructor: -> + @$log = Logger + @restrict = "EMA" + @require = '^' + 'uiGmapGoogleMap' + @priority = -1 + @transclude = true + @template = '' + @replace = true + @scope = + show: "=show" + options: '=options' + refresh: '=refresh' + id: '@' + + link: (scope, element, attrs, mapCtrl) => + mapCtrl.getScope().deferred.promise.then (map) => + new MapTypeParentModel(scope, element, attrs, map) + new MapType() +] diff --git a/src/coffee/directives/map-types.coffee b/src/coffee/directives/map-types.coffee new file mode 100644 index 000000000..12d3f8fb7 --- /dev/null +++ b/src/coffee/directives/map-types.coffee @@ -0,0 +1,29 @@ +### +Map Layers directive + +This directive is used to create any type of Layer from the google maps sdk. +This directive creates a new scope. +### +angular.module('uiGmapgoogle-maps') +.directive "uiGmapMapTypes", ["$timeout", "uiGmapLogger", "uiGmapMapTypesParentModel", + ($timeout, Logger, MapTypesParentModel) -> + class MapTypes + constructor: -> + @$log = Logger + @restrict = "EMA" + @require = '^' + 'uiGmapGoogleMap' + @priority = -1 + @transclude = true + @template = '' + @scope = + mapTypes: "=mapTypes" + show: "=show" + options: "=options" + refresh: "=refresh" + id: "=idKey" + + link: (scope, element, attrs, mapCtrl) => + mapCtrl.getScope().deferred.promise.then (map) => + new MapTypesParentModel(scope, element, attrs, map) + new MapTypes() +] diff --git a/src/coffee/directives/map.coffee b/src/coffee/directives/map.coffee new file mode 100644 index 000000000..e51edb30c --- /dev/null +++ b/src/coffee/directives/map.coffee @@ -0,0 +1,12 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Nick Baugh - https://github.com/niftylettuce +### + +#jshint indent:4 + +###globals angular### +angular.module("uiGmapgoogle-maps").directive "uiGmapGoogleMap", (uiGmapMap) -> + new uiGmapMap() diff --git a/src/coffee/directives/marker.coffee b/src/coffee/directives/marker.coffee new file mode 100644 index 000000000..baf0bfcc2 --- /dev/null +++ b/src/coffee/directives/marker.coffee @@ -0,0 +1,20 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +### + +### +Map marker directive + +This directive is used to create a marker on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute icon optional} string url to image used for marker icon +{attribute animate optional} if set to false, the marker won't be animated (on by default) +### +angular.module('uiGmapgoogle-maps') +.directive 'uiGmapMarker', ['$timeout', 'uiGmapMarker', ($timeout, Marker) -> + new Marker($timeout) +] diff --git a/src/coffee/directives/markers.coffee b/src/coffee/directives/markers.coffee new file mode 100644 index 000000000..3e609ef95 --- /dev/null +++ b/src/coffee/directives/markers.coffee @@ -0,0 +1,20 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +### + +### +Map marker directive + +This directive is used to create a marker on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute icon optional} string url to image used for marker icon +{attribute animate optional} if set to false, the marker won't be animated (on by default) +### +angular.module('uiGmapgoogle-maps') +.directive 'uiGmapMarkers', ['$timeout', 'uiGmapMarkers', ($timeout, Markers) -> + new Markers($timeout) + ] diff --git a/src/coffee/directives/polygon.coffee b/src/coffee/directives/polygon.coffee new file mode 100644 index 000000000..58fcc2780 --- /dev/null +++ b/src/coffee/directives/polygon.coffee @@ -0,0 +1,8 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Rick Huizinga - https://plus.google.com/+RickHuizinga +### +angular.module('uiGmapgoogle-maps').directive 'uiGmapPolygon', ['uiGmapPolygon', +(Polygon) -> new Polygon()] diff --git a/src/coffee/directives/polygons.coffee b/src/coffee/directives/polygons.coffee new file mode 100644 index 000000000..92bc32ca2 --- /dev/null +++ b/src/coffee/directives/polygons.coffee @@ -0,0 +1,7 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Rick Huizinga - https://plus.google.com/+RickHuizinga +### +angular.module('uiGmapgoogle-maps').directive 'uiGmapPolygons', ['uiGmapPolygons', (Polygons) -> new Polygons()] diff --git a/src/coffee/directives/polyline.coffee b/src/coffee/directives/polyline.coffee new file mode 100644 index 000000000..aa0281d92 --- /dev/null +++ b/src/coffee/directives/polyline.coffee @@ -0,0 +1,6 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +### +angular.module("uiGmapgoogle-maps").directive "uiGmapPolyline", [ "uiGmapPolyline", (Polyline) -> new Polyline() ] diff --git a/src/coffee/directives/polylines.coffee b/src/coffee/directives/polylines.coffee new file mode 100644 index 000000000..9193fb6d9 --- /dev/null +++ b/src/coffee/directives/polylines.coffee @@ -0,0 +1,7 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +### +angular.module('uiGmapgoogle-maps') +.directive 'uiGmapPolylines', [ 'uiGmapPolylines', (Polylines) -> new Polylines() ] diff --git a/src/coffee/directives/rectangle.coffee b/src/coffee/directives/rectangle.coffee new file mode 100644 index 000000000..50368e75c --- /dev/null +++ b/src/coffee/directives/rectangle.coffee @@ -0,0 +1,11 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +Chentsu Lin - https://github.com/ChenTsuLin +### +angular.module("uiGmapgoogle-maps").directive "uiGmapRectangle", [ + "uiGmapLogger" + "uiGmapRectangle" + ($log, Rectangle) -> Rectangle +] diff --git a/src/coffee/directives/search-box.coffee b/src/coffee/directives/search-box.coffee new file mode 100644 index 000000000..c6df30da3 --- /dev/null +++ b/src/coffee/directives/search-box.coffee @@ -0,0 +1,56 @@ +### +@authors: +- Nicolas Laplante https://plus.google.com/108189012221374960701 +- Nicholas McCready - https://twitter.com/nmccready +- Carrie Kengle - http://about.me/carrie +### + +### +Places Search Box directive + +This directive is used to create a Places Search Box. +This directive creates a new scope. + +{attribute input required} HTMLInputElement +{attribute options optional} The options that can be set on a SearchBox object (google.maps.places.SearchBoxOptions object specification) +### +angular.module('uiGmapgoogle-maps') +.directive 'uiGmapSearchBox', ['uiGmapGoogleMapApi', 'uiGmapLogger', +'uiGmapSearchBoxParentModel', '$http', '$templateCache', '$compile', + (GoogleMapApi, Logger, SearchBoxParentModel, $http, $templateCache, $compile) -> + class SearchBox + require: 'ngModel' + constructor: -> + @$log = Logger + @restrict = 'EMA' + @require = '^' + 'uiGmapGoogleMap' + @priority = -1 + @transclude = true + @template = '' + @replace = true + @scope = + template: '=template' #required + events: '=events' #required + position: '=?position' #optional + options: '=?options' #optional + parentdiv: '=?parentdiv' #optional + ngModel: "=?" #optional + + link: (scope, element, attrs, mapCtrl) => + GoogleMapApi.then (maps) => + unless scope.template? + $templateCache.put 'uigmap-searchbox-default.tpl.html', '' + scope.template = 'uigmap-searchbox-default.tpl.html' + $http.get(scope.template, { cache: $templateCache }) + .then ({data}) => + if angular.isUndefined scope.events + @$log.error 'searchBox: the events property is required' + return + mapCtrl.getScope().deferred.promise.then (map) => + ctrlPosition = if angular.isDefined scope.position then scope.position.toUpperCase().replace /-/g, '_' else 'TOP_LEFT' + if not maps.ControlPosition[ctrlPosition] + @$log.error 'searchBox: invalid position property' + return + new SearchBoxParentModel(scope, element, attrs, map, ctrlPosition, $compile(data)(scope)) + new SearchBox() +] diff --git a/src/coffee/directives/show.coffee b/src/coffee/directives/show.coffee new file mode 100644 index 000000000..5a824b121 --- /dev/null +++ b/src/coffee/directives/show.coffee @@ -0,0 +1,31 @@ +#taken directly from (should be its own lib) +#http://stackoverflow.com/questions/20921622/running-code-after-an-angularjs-animation-has-completed +angular.module('uiGmapgoogle-maps') +.directive 'uiGmapShow',['$animate', 'uiGmapLogger', ($animate, $log) -> + scope: + 'uiGmapShow': '=' + 'uiGmapAfterShow': '&' + 'uiGmapAfterHide': '&' + link: (scope, element) -> + angular_post_1_3_handle = (animateAction, cb) -> + $animate[animateAction](element, 'ng-hide').then -> + cb() + angular_pre_1_3_handle = (animateAction, cb) -> + $animate[animateAction](element, 'ng-hide', cb) + + handle = (animateAction, cb) -> + if angular.version.major > 1 + return $log.error """ + uiGmapShow is not supported for Angular Major greater than 1. + Your Major is #{angular.version.major}" + """ + if angular.version.major == 1 and angular.version.minor < 3 + return angular_pre_1_3_handle(animateAction, cb) + angular_post_1_3_handle(animateAction, cb) + + scope.$watch 'uiGmapShow', (show) -> + if show + handle('removeClass', scope.uiGmapAfterShow) + if !show + handle('addClass', scope.uiGmapAfterHide) +] \ No newline at end of file diff --git a/src/coffee/directives/street-view-panorama.coffee b/src/coffee/directives/street-view-panorama.coffee new file mode 100644 index 000000000..9c61a45d4 --- /dev/null +++ b/src/coffee/directives/street-view-panorama.coffee @@ -0,0 +1,123 @@ +### +@authors: +- Nicholas McCready - https://twitter.com/nmccready +### + +### +StreetViewPanorama Directive to care of basic initialization of StreetViewPanorama +### +angular.module('uiGmapgoogle-maps') +.directive 'uiGmapStreetViewPanorama', ['uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper' + (GoogleMapApi, $log, GmapUtil, EventsHelper) -> + name = 'uiGmapStreetViewPanorama' + + restrict: 'EMA' + template: '
' + replace: true + scope: + focalcoord: '=' + + radius: '=?' + events: '=?' + options: '=?' + control: '=?' + povoptions: '=?' + imagestatus: '=' + + link: (scope, element, attrs) -> + GoogleMapApi.then (maps) => + + pano = undefined + sv = undefined + didCreateOptionsFromDirective = false + listeners = undefined + opts = null + povOpts = null + + clean = -> + EventsHelper.removeEvents listeners + + if pano? + pano.unbind 'position' + pano.setVisible false + if sv? + sv.setVisible false if sv?.setVisible? + sv = undefined + + handleSettings = (perspectivePoint, focalPoint) -> + heading = google.maps.geometry.spherical.computeHeading(perspectivePoint, focalPoint) + didCreateOptionsFromDirective = true + #options down + scope.radius = scope.radius or 50 + povOpts = angular.extend + heading: heading + zoom: 1 + pitch: 0 + , scope.povoptions or {} + + opts = opts = angular.extend + navigationControl: false + addressControl: false + linksControl: false + position: perspectivePoint + pov: povOpts + visible: true + , scope.options or {} + didCreateOptionsFromDirective = false + + create = -> + unless scope.focalcoord + $log.error "#{name}: focalCoord needs to be defined" + return + unless scope.radius + $log.error "#{name}: needs a radius to set the camera view from its focal target." + return + + clean() + + unless sv? + sv = new google.maps.StreetViewService() + + if scope.events + listeners = EventsHelper.setEvents sv, scope, scope + + focalPoint = GmapUtil.getCoords scope.focalcoord + + sv.getPanoramaByLocation focalPoint, scope.radius, (streetViewPanoramaData, status) -> + #get status via scope or callback + scope.imagestatus = status if scope.imagestatus? + if scope.events?.image_status_changed? + scope.events.image_status_changed(sv, 'image_status_changed', scope, status) + if status is "OK" + perspectivePoint = streetViewPanoramaData.location.latLng + #derrived + handleSettings(perspectivePoint, focalPoint) + ele = element[0] + pano = new google.maps.StreetViewPanorama(ele, opts) + + + if scope.control? + scope.control.getOptions = -> + opts + scope.control.getPovOptions = -> + povOpts + scope.control.getGObject = -> + sv + scope.control.getGPano = -> + pano + + scope.$watch 'options', (newValue, oldValue) -> + #options are limited so we do not have to worry about them conflicting with positon + return if newValue == oldValue or newValue == opts or didCreateOptionsFromDirective + create() + + firstTime = true + scope.$watch 'focalcoord', (newValue, oldValue) -> + return if newValue == oldValue and not firstTime + return unless newValue? + firstTime = false + create() + + scope.$on '$destroy', -> + clean() +] diff --git a/src/coffee/directives/window.coffee b/src/coffee/directives/window.coffee new file mode 100644 index 000000000..1e617993f --- /dev/null +++ b/src/coffee/directives/window.coffee @@ -0,0 +1,21 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +### + +### +Map info window directive + +This directive is used to create an info window on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute show optional} map will show when this expression returns true +### +angular.module("uiGmapgoogle-maps") +.directive("uiGmapWindow", + ["$timeout", "$compile", "$http", "$templateCache", "uiGmapWindow", + ($timeout, $compile, $http, $templateCache, Window) -> + new Window($timeout, $compile, $http, $templateCache) + ]) diff --git a/src/coffee/directives/windows.coffee b/src/coffee/directives/windows.coffee new file mode 100644 index 000000000..b1df7ea6e --- /dev/null +++ b/src/coffee/directives/windows.coffee @@ -0,0 +1,20 @@ +### +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +### + +### +Map info window directive + +This directive is used to create an info window on an existing map. +This directive creates a new scope. + +{attribute coords required} object containing latitude and longitude properties +{attribute show optional} map will show when this expression returns true +### +angular.module("uiGmapgoogle-maps") +.directive "uiGmapWindows", ["$timeout", "$compile", "$http", "$templateCache", "$interpolate", "uiGmapWindows", + ($timeout, $compile, $http, $templateCache, $interpolate, Windows) -> + new Windows($timeout, $compile, $http, $templateCache, $interpolate) +] diff --git a/src/coffee/extensions/google.maps.coffee b/src/coffee/extensions/google.maps.coffee new file mode 100644 index 000000000..75f52c944 --- /dev/null +++ b/src/coffee/extensions/google.maps.coffee @@ -0,0 +1,115 @@ +#boot strap angular and extend google maps +angular.module('uiGmapgoogle-maps.extensions') +.service('uiGmapExtendGWin', -> + init: _.once -> + return unless google or google?.maps or google.maps.InfoWindow? + #Taken from : http://stackoverflow.com/questions/12410062/check-if-infowindow-is-opened-google-maps-v3 + # + # + # modify the prototype for google.maps.Infowindow so that it is capable of tracking + # the opened state of the window. we track the state via boolean which is set when + # open() or close() are called. in addition to these, the closeclick event is + # monitored so that the value of _openedState can be set when the close button is + # clicked (see code at bottom of this file). + # + google.maps.InfoWindow::_open = google.maps.InfoWindow::open + google.maps.InfoWindow::_close = google.maps.InfoWindow::close + google.maps.InfoWindow::_isOpen = false + + google.maps.InfoWindow::open = (map, anchor, recurse) -> + return if recurse? + @_isOpen = true + @_open map, anchor, true + return + + google.maps.InfoWindow::close = (recurse) -> + return if recurse? + @_isOpen = false + @_close(true) + return + + google.maps.InfoWindow::isOpen = (val = undefined) -> + unless val? + return @_isOpen + else + @_isOpen = val + + ### + Do the same for InfoBox + TODO: Clean this up so the logic is defined once, wait until develop becomes master as this will be easier + ### + if window.InfoBox + window.InfoBox::_open = window.InfoBox::open + window.InfoBox::_close = window.InfoBox::close + window.InfoBox::_isOpen = false + + window.InfoBox::open = (map, anchor) -> + @_isOpen = true + @_open map, anchor + return + + window.InfoBox::close = -> + @_isOpen = false + @_close() + return + + window.InfoBox::isOpen = (val = undefined) -> + unless val? + return @_isOpen + else + @_isOpen = val + + #coffeelint:disable=camel_case_classes + class uiGmapInfoBox extends window.InfoBox + #coffeelint:disable=camel_case_classes + constructor: (opts) -> + box = new window.InfoBox(opts) + _.extend @, box + @closeBoxDiv_ = opts.closeBoxDiv if opts.closeBoxDiv? + + getCloseBoxDiv_: => + @closeBoxDiv_ + #overriding with fetching div or image block + getCloseBoxImg_: -> + #custom div has pref + div = @getCloseBoxDiv_() + img = @getOrigCloseBoxImg_() + div or img + + #default lame behavior, why grab an image when a template is possibly better! + getOrigCloseBoxImg_: => + img = "" + if @closeBoxURL_ isnt "" + img = " + content = @marker_.get('labelContent') + #uigmap patches checking for undefined content and different + return if !content or _.isEqual @oldContent, content + if typeof content?.nodeType is 'undefined' + @labelDiv_.innerHTML = content + @eventDiv_.innerHTML = @labelDiv_.innerHTML + @oldContent = content + else + @labelDiv_.innerHTML = '' # Remove current content + @labelDiv_.appendChild content + content = content.cloneNode(true) + @labelDiv_.innerHTML = '' # Remove current content + @eventDiv_.appendChild content + @oldContent = content + return + ) diff --git a/src/coffee/extensions/lodash.coffee b/src/coffee/extensions/lodash.coffee new file mode 100644 index 000000000..99ac013e7 --- /dev/null +++ b/src/coffee/extensions/lodash.coffee @@ -0,0 +1,180 @@ +###global _:true, angular:true ### +angular.module('uiGmapgoogle-maps.extensions') +.service 'uiGmapLodash', -> + # Used to match property names within property paths. + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g + #Used to match backslashes in property paths. + reEscapeChar = /\\(\\)?/g + + ### + For Lodash 4 compatibility (some aliases are removed) + ### + fixLodash = ({missingName, swapName, isProto}) -> + unless _[missingName]? + _[missingName] = _[swapName] + _::[missingName] = _[swapName] if isProto + + [ + {missingName: 'contains', swapName: 'includes', isProto: true} + {missingName: 'includes', swapName: 'contains', isProto: true} + {missingName: 'object', swapName: 'zipObject'} + {missingName: 'zipObject', swapName: 'object'} + {missingName: 'all', swapName: 'every'} + {missingName: 'every', swapName: 'all'} + {missingName: 'any', swapName: 'some'} + {missingName: 'some', swapName: 'any'} + {missingName: 'first', swapName: 'head'} + {missingName: 'head', swapName: 'first'} + ].forEach (toMonkeyPatch) -> + fixLodash(toMonkeyPatch) + + unless _.get?#fill dependency if missing + ###* + # Converts `value` to an object if it's not one. + # + # @private + # @param {*} value The value to process. + # @returns {Object} Returns the object. + ### + toObject = (value) -> + if _.isObject(value) then value else Object(value) + + ###* + # Converts `value` to a string if it's not one. An empty string is returned + # for `null` or `undefined` values. + # + # @private + # @param {*} value The value to process. + # @returns {string} Returns the string. + ### + + baseToString = (value) -> + if value == null then '' else value + '' + + ###* + # Converts `value` to property path array if it's not one. + # + # @private + # @param {*} value The value to process. + # @returns {Array} Returns the property path array. + ### + + toPath = (value) -> + if _.isArray(value) + return value + result = [] + baseToString(value).replace rePropName, (match, number, quote, string) -> + result.push if quote then string.replace(reEscapeChar, '$1') else number or match + return + result + ###* + # The base implementation of `get` without support for string paths + # and default values. + # + # @private + # @param {Object} object The object to query. + # @param {Array} path The path of the property to get. + # @param {string} [pathKey] The key representation of path. + # @returns {*} Returns the resolved value. + ### + + baseGet = (object, path, pathKey) -> + if object == null + return + if pathKey != undefined and pathKey of toObject(object) + path = [pathKey] + index = 0 + length = path.length + while !_.isUndefined(object) and index < length + object = object[path[index++]] + if index and index == length then object else undefined + + ###* + # Gets the property value at `path` of `object`. If the resolved value is + # `undefined` the `defaultValue` is used in its place. + # + # @static + # @memberOf _ + # @category Object + # @param {Object} object The object to query. + # @param {Array|string} path The path of the property to get. + # @param {*} [defaultValue] The value returned if the resolved value is `undefined`. + # @returns {*} Returns the resolved value. + # @example + # + # var object = { 'a': [{ 'b': { 'c': 3 } }] }; + # + # _.get(object, 'a[0].b.c'); + # // => 3 + # + # _.get(object, ['a', '0', 'b', 'c']); + # // => 3 + # + # _.get(object, 'a.b.c', 'default'); + # // => 'default' + ### + + get = (object, path, defaultValue) -> + result = if object == null then undefined else baseGet(object, toPath(path), path + '') + if result == undefined then defaultValue else result + + _.get = get + + + ### + Author Nick McCready + Intersection of Objects if the arrays have something in common each intersecting object will be returned + in an new array. + ### + @intersectionObjects = (array1, array2, comparison = undefined) -> + res = _.map array1, (obj1) -> + _.find array2, (obj2) -> + if comparison? + comparison(obj1, obj2) + else + _.isEqual(obj1, obj2) + _.filter res, (o) -> + o? + + # Determine if the array or object contains a given value (using `===`). + #Aliased as `include`. + @containsObject = _.includeObject = (obj, target, comparison = undefined) -> + if (obj == null) + return false + # if (nativeIndexOf && obj.indexOf == nativeIndexOf) + # return obj.indexOf(target) != -1 + _.some obj, (value) -> + if comparison? + comparison value, target + else + _.isEqual value, target + + + @differenceObjects = (array1, array2, comparison = undefined) -> + _.filter array1, (value) => + !@containsObject array2, value, comparison + + #alias to differenceObjects + @withoutObjects = @differenceObjects + + @indexOfObject = (array, item, comparison, isSorted) -> + return -1 unless array? + i = 0 + length = array.length + if isSorted + if typeof isSorted is "number" + i = ((if isSorted < 0 then Math.max(0, length + isSorted) else isSorted)) + else + i = _.sortedIndex(array, item) + return (if array[i] is item then i else -1) + while i < length + if comparison? + return i if comparison array[i], item + else + return i if _.isEqual array[i], item + i++ + -1 + + @isNullOrUndefined = (thing) -> + _.isNull thing or _.isUndefined thing + @ diff --git a/src/coffee/extensions/string.coffee b/src/coffee/extensions/string.coffee new file mode 100644 index 000000000..265792e1c --- /dev/null +++ b/src/coffee/extensions/string.coffee @@ -0,0 +1,6 @@ +angular.module('uiGmapgoogle-maps.extensions') +.factory 'uiGmapString', -> + (str) -> + @contains = (value, fromIndex) -> + str.indexOf(value, fromIndex) != -1 + @ \ No newline at end of file diff --git a/src/coffee/module.coffee b/src/coffee/module.coffee new file mode 100644 index 000000000..7ea161884 --- /dev/null +++ b/src/coffee/module.coffee @@ -0,0 +1,56 @@ +### +! +The MIT License + +Copyright (c) 2010-2013 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the 'Software'), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +angular-google-maps +https://github.com/angular-ui/angular-google-maps + +@authors +Nicolas Laplante - https://plus.google.com/108189012221374960701 +Nicholas McCready - https://twitter.com/nmccready +### +#define application wide modules +angular.module('uiGmapgoogle-maps.providers',['nemLogging']) +angular.module('uiGmapgoogle-maps.wrapped', []) +angular.module('uiGmapgoogle-maps.extensions', ['uiGmapgoogle-maps.wrapped','uiGmapgoogle-maps.providers']) +angular.module('uiGmapgoogle-maps.directives.api.utils', ['uiGmapgoogle-maps.extensions']) +angular.module('uiGmapgoogle-maps.directives.api.managers', []) +angular.module('uiGmapgoogle-maps.directives.api.options',[ + 'uiGmapgoogle-maps.directives.api.utils' +]) +angular.module('uiGmapgoogle-maps.directives.api.options.builders',[]) +angular.module('uiGmapgoogle-maps.directives.api.models.child', [ + 'uiGmapgoogle-maps.directives.api.utils' + 'uiGmapgoogle-maps.directives.api.options' + 'uiGmapgoogle-maps.directives.api.options.builders' + ]) +angular.module('uiGmapgoogle-maps.directives.api.models.parent', [ + 'uiGmapgoogle-maps.directives.api.managers' + 'uiGmapgoogle-maps.directives.api.models.child' + 'uiGmapgoogle-maps.providers' +]) +angular.module('uiGmapgoogle-maps.directives.api', [ 'uiGmapgoogle-maps.directives.api.models.parent']) +angular.module('uiGmapgoogle-maps', [ + 'uiGmapgoogle-maps.directives.api' + 'uiGmapgoogle-maps.providers' +]) diff --git a/src/coffee/providers/map-loader.coffee b/src/coffee/providers/map-loader.coffee new file mode 100644 index 000000000..8c98e0e51 --- /dev/null +++ b/src/coffee/providers/map-loader.coffee @@ -0,0 +1,113 @@ +# The service, that is a promise for a reference to window.google.maps +angular.module('uiGmapgoogle-maps.providers') +.factory('uiGmapMapScriptLoader', ['$q', 'uiGmapuuid', ($q, uuid) -> + scriptId = undefined + usedConfiguration = undefined + + getScriptUrl = (options) -> + #china doesn't allow https and has a special url + if options.china + 'http://maps.google.cn/maps/api/js?' + else + #auto will just use protocol-less api code so will automatically use https if used on https website, and http if used on http website + if options.transport == 'auto' + '//maps.googleapis.com/maps/api/js?' + else + options.transport + '://maps.googleapis.com/maps/api/js?' + + includeScript = (options) -> + omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad'] + # 'Google Maps API for Work developers must not include a key in their requests.' so remove from url params + if options.isGoogleMapsForWork + omitOptions.push('key') + + query = _.map _.omit(options, omitOptions), (v, k) -> + k + '=' + v + + if scriptId + scriptElem = document.getElementById(scriptId) + scriptElem.parentNode.removeChild(scriptElem) + + query = query.join '&' + script = document.createElement 'script' + script.id = scriptId = "ui_gmap_map_load_#{uuid.generate()}" + script.type = 'text/javascript' + script.src = getScriptUrl(options) + query + document.head.appendChild script + + isGoogleMapsLoaded = -> + angular.isDefined(window.google) and angular.isDefined(window.google.maps) + + load: (options) -> + deferred = $q.defer() + + # Early-resolve if google-maps-api is already in global-scope + if isGoogleMapsLoaded() + deferred.resolve window.google.maps + return deferred.promise + + randomizedFunctionName = options.callback = 'onGoogleMapsReady' + Math.round(Math.random() * 1000) + window[randomizedFunctionName] = -> + window[randomizedFunctionName] = null + deferred.resolve window.google.maps + return + + # Cordova specific https://github.com/apache/cordova-plugin-network-information/ + if window.navigator.connection && window.Connection && window.navigator.connection.type == window.Connection.NONE && !options.preventLoad + document.addEventListener 'online', -> + includeScript options if !isGoogleMapsLoaded() + else if !options.preventLoad + includeScript options + + usedConfiguration = options + usedConfiguration.randomizedFunctionName = randomizedFunctionName + + # Return the promise + deferred.promise + + manualLoad: () -> + # Use the configuration defined when Angular configured all modules + config = usedConfiguration + + if !isGoogleMapsLoaded() + # Load the API if it isn't already + includeScript config + else + # If the API is loaded but the original configuration's callback has + # not been executed then do so + window[config.randomizedFunctionName]() if window[config.randomizedFunctionName] +]) +#holy hool!!, any time your passing a dependency to a 'provider' you must append the Provider text to the service +# name.. makes no sense and this is not documented well +.provider('uiGmapGoogleMapApi', -> + # Some nice default options + @options = + # key: 'api-key here', + # client: 'gme-googleMapsForWorkClientId here' + transport: 'https' + isGoogleMapsForWork: false + china: false + # https://developers.google.com/maps/documentation/javascript/basics#Versioning + # This should be a release version. + # If it is not the version you want.. override it or then complain to google. + v: '3' #NOTICE THIS CAN BE OVERRIDEN, That is why this is a provider!!!!!!!!! + libraries: '' + language: 'en' + preventLoad: false + + # A function that lets us configure options of the service + @configure = (options) -> + angular.extend @options, options + return + + # Return an instance of the service + @$get = ['uiGmapMapScriptLoader' ,(loader) => + loader.load @options + ] + @ +) +.service('uiGmapGoogleMapApiManualLoader', ['uiGmapMapScriptLoader', (loader) -> + load: () -> + loader.manualLoad() + return +]) diff --git a/src/coffee/utils/add-events.coffee b/src/coffee/utils/add-events.coffee new file mode 100644 index 000000000..c61a4ebb8 --- /dev/null +++ b/src/coffee/utils/add-events.coffee @@ -0,0 +1,18 @@ +angular.module('uiGmapgoogle-maps') +.factory 'uiGmapadd-events', ['$timeout', ($timeout) -> + addEvent = (target, eventName, handler) -> + google.maps.event.addListener target, eventName, -> + handler.apply this, arguments + $timeout((->),true) + + addEvents = (target, eventName, handler) -> + return addEvent(target, eventName, handler) if handler + remove = [] + angular.forEach eventName, (_handler, key) -> + remove.push addEvent(target, key, _handler) + return -> + angular.forEach remove, (listener) -> + google.maps.event.removeListener listener + remove = null + addEvents +] diff --git a/src/coffee/utils/array-sync.coffee b/src/coffee/utils/array-sync.coffee new file mode 100644 index 000000000..ae85d6da8 --- /dev/null +++ b/src/coffee/utils/array-sync.coffee @@ -0,0 +1,161 @@ +angular.module('uiGmapgoogle-maps').factory 'uiGmaparray-sync', [ + 'uiGmapadd-events', (mapEvents) -> + # pathChangedFn is an optional callback that is called whenever a change to the path + # is detected. The first parameter contains the internal array of Google LatLng objects. + (mapArray, scope, pathEval, pathChangedFn) -> + isSetFromScope = false + scopePath = scope.$eval(pathEval) + if !scope.static + #should pathChangedFn be called for changes made via the UI too? Currently not needed, and not implemented + legacyHandlers = + #listeners / handles to changes of the points from the map direction to update back to our scope (two way) + set_at: (index) -> + return if isSetFromScope #important to avoid cyclic forever change loop watch to map event change and back + value = mapArray.getAt(index) + return unless value + if not value.lng or not value.lat # LatLng object + scopePath[index] = value + else + scopePath[index].latitude = value.lat() + scopePath[index].longitude = value.lng() + + insert_at: (index) -> + return if isSetFromScope #important to avoid cyclic forever change loop watch to map event change and back + value = mapArray.getAt(index) + return unless value + #check to make sure we are not inserting something that is already there + if not value.lng or not value.lat # LatLng object + scopePath.splice index, 0, value + else + scopePath.splice index, 0, + latitude: value.lat() + longitude: value.lng() + + remove_at: (index) -> + return if isSetFromScope #important to avoid cyclic forever change loop watch to map event change and back + scopePath.splice index, 1 + + geojsonArray + if scopePath.type == 'Polygon' + #Note: we only support display of the outer Polygon ring, not internal holes + geojsonArray = scopePath.coordinates[0] + else if scopePath.type == 'LineString' + geojsonArray = scopePath.coordinates + + geojsonHandlers = + set_at: (index) -> + return if isSetFromScope #important to avoid cyclic forever change loop watch to map event change and back + value = mapArray.getAt(index) + return unless value and value.lng and value.lat + geojsonArray[index][1] = value.lat() + geojsonArray[index][0] = value.lng() + + insert_at: (index) -> + return if isSetFromScope #important to avoid cyclic forever change loop watch to map event change and back + value = mapArray.getAt(index) + return unless value + return if not value.lng or not value.lat + geojsonArray.splice index, 0, [ value.lng(), value.lat() ] + + remove_at: (index) -> + return if isSetFromScope #important to avoid cyclic forever change loop watch to map event change and back + geojsonArray.splice index, 1 + + mapArrayListener = mapEvents mapArray, + if angular.isUndefined scopePath.type then legacyHandlers else geojsonHandlers + + legacyWatcher = (newPath) -> + isSetFromScope = true + oldArray = mapArray + changed = false + if newPath + i = 0 + oldLength = oldArray.getLength() + newLength = newPath.length + l = Math.min(oldLength, newLength) + newValue = undefined + #update existing points if different + while i < l + oldValue = oldArray.getAt(i) + newValue = newPath[i] + if typeof newValue.equals == 'function' #LatLng object + if not newValue.equals(oldValue) + oldArray.setAt i, newValue + changed = true + else # latitude/longitude object + if (oldValue.lat() isnt newValue.latitude) or (oldValue.lng() isnt newValue.longitude) + oldArray.setAt i, new google.maps.LatLng(newValue.latitude, newValue.longitude) + changed = true + + i++ + #add new points + while i < newLength + newValue = newPath[i] + if typeof newValue.lat == 'function' and typeof newValue.lng == 'function' + oldArray.push newValue + else + oldArray.push new google.maps.LatLng(newValue.latitude, newValue.longitude) + + changed = true + i++ + #remove old no longer there + while i < oldLength + oldArray.pop() + changed = true + i++ + + isSetFromScope = false + pathChangedFn oldArray if changed + + geojsonWatcher = (newPath) -> + isSetFromScope = true + oldArray = mapArray + changed = false + if newPath + array + if scopePath.type == 'Polygon' + array = newPath.coordinates[0] + else if scopePath.type == 'LineString' + array = newPath.coordinates + + i = 0 + oldLength = oldArray.getLength() + newLength = array.length + l = Math.min(oldLength, newLength) + newValue = undefined + while i < l + oldValue = oldArray.getAt(i) + newValue = array[i] + if (oldValue.lat() isnt newValue[1]) or (oldValue.lng() isnt newValue[0]) + oldArray.setAt i, new google.maps.LatLng(newValue[1], newValue[0]) + changed = true + + i++ + while i < newLength + newValue = array[i] + oldArray.push new google.maps.LatLng(newValue[1], newValue[0]) + changed = true + i++ + while i < oldLength + oldArray.pop() + changed = true + i++ + + isSetFromScope = false + pathChangedFn oldArray if changed + + watchListener + if !scope.static + if angular.isUndefined(scopePath.type) + watchListener = scope.$watchCollection pathEval, legacyWatcher + else + watchListener = scope.$watch pathEval, geojsonWatcher, true + + -> + if mapArrayListener + mapArrayListener() + mapArrayListener = null + if watchListener + watchListener() # call the watch deregistration function + watchListener = null +] diff --git a/src/coffee/utils/chrome-fixes.coffee b/src/coffee/utils/chrome-fixes.coffee new file mode 100644 index 000000000..da6875df0 --- /dev/null +++ b/src/coffee/utils/chrome-fixes.coffee @@ -0,0 +1,8 @@ +angular.module("uiGmapgoogle-maps.directives.api.utils") + .factory "uiGmapChromeFixes", ['$timeout', ($timeout) -> + maybeRepaint: (el) -> + if el + el.style.opacity = 0.9 + $timeout -> + el.style.opacity = 1 + ] diff --git a/src/coffee/utils/object-iterators.coffee b/src/coffee/utils/object-iterators.coffee new file mode 100644 index 000000000..0c4fbf53d --- /dev/null +++ b/src/coffee/utils/object-iterators.coffee @@ -0,0 +1,30 @@ +angular.module('uiGmapgoogle-maps') +.service 'uiGmapObjectIterators', -> + _ignores = ['length', 'forEach', 'map'] + + _iterators = [] + + _slapForEach = (object) -> + object.forEach = (cb) -> + _.each _.omit(object, _ignores), (val) -> + cb(val) unless _.isFunction val + object + + _iterators.push _slapForEach + + + _slapMap = (object) -> + object.map = (cb) -> + _.map _.omit(object, _ignores), (val) -> + cb(val) unless _.isFunction val + object + + _iterators.push _slapMap + + slapMap: _slapMap + slapForEach: _slapForEach + slapAll: (object) -> + _iterators.forEach (it) -> + it(object) + object + diff --git a/src/js/.gitkeep b/src/js/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/js/directives/.gitkeep b/src/js/directives/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/js/directives/api/managers/.gitkeep b/src/js/directives/api/managers/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/js/directives/api/models/.gitkeep b/src/js/directives/api/models/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/js/directives/api/utils/.gitkeep b/src/js/directives/api/utils/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/js/extensions/markerclusterer.js b/src/js/extensions/markerclusterer.js new file mode 100644 index 000000000..256e6f500 --- /dev/null +++ b/src/js/extensions/markerclusterer.js @@ -0,0 +1,387 @@ +/** + * Performance overrides on MarkerClusterer custom to Angular Google Maps + * + * Created by Petr Bruna ccg1415 and Nick McCready on 7/13/14. + */ +angular.module('uiGmapgoogle-maps.extensions') +.service('uiGmapExtendMarkerClusterer',['uiGmapLodash', 'uiGmapPropMap', function (uiGmapLodash, PropMap) { + return { + init: _.once(function () { + (function () { + var __hasProp = {}.hasOwnProperty, + __extends = function (child, parent) { + for (var key in parent) { + if (__hasProp.call(parent, key)) child[key] = parent[key]; + } + function ctor() { + this.constructor = child; + } + + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }; + + window.NgMapCluster = (function (_super) { + __extends(NgMapCluster, _super); + + function NgMapCluster(opts) { + NgMapCluster.__super__.constructor.call(this, opts); + this.markers_ = new PropMap(); + } + + /** + * Adds a marker to the cluster. + * + * @param {google.maps.Marker} marker The marker to be added. + * @return {boolean} True if the marker was added. + * @ignore + */ + NgMapCluster.prototype.addMarker = function (marker) { + var i; + var mCount; + var mz; + + if (this.isMarkerAlreadyAdded_(marker)) { + var oldMarker = this.markers_.get(marker.key); + if (oldMarker.getPosition().lat() == marker.getPosition().lat() && oldMarker.getPosition().lon() == marker.getPosition().lon()) //if nothing has changed + return false; + } + + if (!this.center_) { + this.center_ = marker.getPosition(); + this.calculateBounds_(); + } else { + if (this.averageCenter_) { + var l = this.markers_.length + 1; + var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l; + var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l; + this.center_ = new google.maps.LatLng(lat, lng); + this.calculateBounds_(); + } + } + marker.isAdded = true; + this.markers_.push(marker); + + mCount = this.markers_.length; + mz = this.markerClusterer_.getMaxZoom(); + if (mz !== null && this.map_.getZoom() > mz) { + // Zoomed in past max zoom, so show the marker. + if (marker.getMap() !== this.map_) { + marker.setMap(this.map_); + } + } else if (mCount < this.minClusterSize_) { + // Min cluster size not reached so show the marker. + if (marker.getMap() !== this.map_) { + marker.setMap(this.map_); + } + } else if (mCount === this.minClusterSize_) { + // Hide the markers that were showing. + this.markers_.each(function (m) { + m.setMap(null); + }); + } else { + marker.setMap(null); + } + + //this.updateIcon_(); + return true; + }; + + /** + * Determines if a marker has already been added to the cluster. + * + * @param {google.maps.Marker} marker The marker to check. + * @return {boolean} True if the marker has already been added. + */ + NgMapCluster.prototype.isMarkerAlreadyAdded_ = function (marker) { + return uiGmapLodash.isNullOrUndefined(this.markers_.get(marker.key)); + }; + + + /** + * Returns the bounds of the cluster. + * + * @return {google.maps.LatLngBounds} the cluster bounds. + * @ignore + */ + NgMapCluster.prototype.getBounds = function () { + var i; + var bounds = new google.maps.LatLngBounds(this.center_, this.center_); + this.getMarkers().each(function(m){ + bounds.extend(m.getPosition()); + }); + return bounds; + }; + + + /** + * Removes the cluster from the map. + * + * @ignore + */ + NgMapCluster.prototype.remove = function () { + this.clusterIcon_.setMap(null); + this.markers_ = new PropMap(); + delete this.markers_; + }; + + + return NgMapCluster; + + })(Cluster); + + + window.NgMapMarkerClusterer = (function (_super) { + __extends(NgMapMarkerClusterer, _super); + + function NgMapMarkerClusterer(map, opt_markers, opt_options) { + NgMapMarkerClusterer.__super__.constructor.call(this, map, opt_markers, opt_options); + this.markers_ = new PropMap(); + } + + /** + * Removes all clusters and markers from the map and also removes all markers + * managed by the clusterer. + */ + NgMapMarkerClusterer.prototype.clearMarkers = function () { + this.resetViewport_(true); + this.markers_ = new PropMap(); + }; + /** + * Removes a marker and returns true if removed, false if not. + * + * @param {google.maps.Marker} marker The marker to remove + * @return {boolean} Whether the marker was removed or not + */ + NgMapMarkerClusterer.prototype.removeMarker_ = function (marker) { + if (!this.markers_.get(marker.key)) { + return false; + } + marker.setMap(null); + this.markers_.remove(marker.key); // Remove the marker from the list of managed markers + return true; + }; + + /** + * Creates the clusters. This is done in batches to avoid timeout errors + * in some browsers when there is a huge number of markers. + * + * @param {number} iFirst The index of the first marker in the batch of + * markers to be added to clusters. + */ + NgMapMarkerClusterer.prototype.createClusters_ = function (iFirst) { + var i, marker; + var mapBounds; + var cMarkerClusterer = this; + if (!this.ready_) { + return; + } + + // Cancel previous batch processing if we're working on the first batch: + if (iFirst === 0) { + /** + * This event is fired when the MarkerClusterer begins + * clustering markers. + * @name MarkerClusterer#clusteringbegin + * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered. + * @event + */ + google.maps.event.trigger(this, 'clusteringbegin', this); + + if (typeof this.timerRefStatic !== 'undefined') { + clearTimeout(this.timerRefStatic); + delete this.timerRefStatic; + } + } + + // Get our current map view bounds. + // Create a new bounds object so we don't affect the map. + // + // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug: + if (this.getMap().getZoom() > 3) { + mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(), + this.getMap().getBounds().getNorthEast()); + } else { + mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625)); + } + var bounds = this.getExtendedBounds(mapBounds); + + var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length); + + var _ms = this.markers_.values(); + for (i = iFirst; i < iLast; i++) { + marker = _ms[i]; + if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) { + if (!this.ignoreHidden_ || (this.ignoreHidden_ && marker.getVisible())) { + this.addToClosestCluster_(marker); + } + } + } + + if (iLast < this.markers_.length) { + this.timerRefStatic = setTimeout(function () { + cMarkerClusterer.createClusters_(iLast); + }, 0); + } else { + // custom addition by ui-gmap + // update icon for all clusters + for (i = 0; i < this.clusters_.length; i++) { + this.clusters_[i].updateIcon_(); + } + + delete this.timerRefStatic; + + /** + * This event is fired when the MarkerClusterer stops + * clustering markers. + * @name MarkerClusterer#clusteringend + * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered. + * @event + */ + google.maps.event.trigger(this, 'clusteringend', this); + } + }; + + /** + * Adds a marker to a cluster, or creates a new cluster. + * + * @param {google.maps.Marker} marker The marker to add. + */ + NgMapMarkerClusterer.prototype.addToClosestCluster_ = function (marker) { + var i, d, cluster, center; + var distance = 40000; // Some large number + var clusterToAddTo = null; + for (i = 0; i < this.clusters_.length; i++) { + cluster = this.clusters_[i]; + center = cluster.getCenter(); + if (center) { + d = this.distanceBetweenPoints_(center, marker.getPosition()); + if (d < distance) { + distance = d; + clusterToAddTo = cluster; + } + } + } + + if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) { + clusterToAddTo.addMarker(marker); + } else { + cluster = new NgMapCluster(this); + cluster.addMarker(marker); + this.clusters_.push(cluster); + } + }; + + /** + * Redraws all the clusters. + */ + NgMapMarkerClusterer.prototype.redraw_ = function () { + this.createClusters_(0); + }; + + + /** + * Removes all clusters from the map. The markers are also removed from the map + * if opt_hide is set to true. + * + * @param {boolean} [opt_hide] Set to true to also remove the markers + * from the map. + */ + NgMapMarkerClusterer.prototype.resetViewport_ = function (opt_hide) { + var i, marker; + // Remove all the clusters + for (i = 0; i < this.clusters_.length; i++) { + this.clusters_[i].remove(); + } + this.clusters_ = []; + + // Reset the markers to not be added and to be removed from the map. + this.markers_.each(function (marker) { + marker.isAdded = false; + if (opt_hide) { + marker.setMap(null); + } + }); + }; + + /** + * Extends an object's prototype by another's. + * + * @param {Object} obj1 The object to be extended. + * @param {Object} obj2 The object to extend with. + * @return {Object} The new extended object. + * @ignore + */ + NgMapMarkerClusterer.prototype.extend = function (obj1, obj2) { + return (function (object) { + var property; + for (property in object.prototype) { + if (property !== 'constructor') + this.prototype[property] = object.prototype[property]; + } + return this; + }).apply(obj1, [obj2]); + }; + //////////////////////////////////////////////////////////////////////////////// + /* + Other overrides relevant to MarkerClusterPlus + */ + //////////////////////////////////////////////////////////////////////////////// + /** + * Positions and shows the icon. + */ + ClusterIcon.prototype.show = function () { + if (this.div_) { + var img = ""; + // NOTE: values must be specified in px units + var bp = this.backgroundPosition_.split(" "); + var spriteH = parseInt(bp[0].trim(), 10); + var spriteV = parseInt(bp[1].trim(), 10); + var pos = this.getPosFromLatLng_(this.center_); + this.div_.style.cssText = this.createCss(pos); + img = ""; + this.div_.innerHTML = img + "
" + this.sums_.text + "
"; + if (typeof this.sums_.title === "undefined" || this.sums_.title === "") { + this.div_.title = this.cluster_.getMarkerClusterer().getTitle(); + } else { + this.div_.title = this.sums_.title; + } + this.div_.style.display = ""; + } + this.visible_ = true; + }; + //END OTHER OVERRIDES + //////////////////////////////////////////////////////////////////////////////// + + return NgMapMarkerClusterer; + + })(MarkerClusterer); + }).call(this); + }) + }; +}]); diff --git a/src/js/wrapped/google-maps-util-v3.js b/src/js/wrapped/google-maps-util-v3.js new file mode 100644 index 000000000..24d780690 --- /dev/null +++ b/src/js/wrapped/google-maps-util-v3.js @@ -0,0 +1,24 @@ +// wrap the utility libraries needed in ./lib +// http://google-maps-utility-library-v3.googlecode.com/svn/ +angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapGoogleMapsUtilV3', function () { + return { + init: _.once(function () { + //BEGIN REPLACE + /* istanbul ignore next */ + +function(){ + @@REPLACE_W_LIBS + + //TODO: export / passthese on in the service instead of window + window.InfoBox = InfoBox; + window.Cluster = Cluster; + window.ClusterIcon = ClusterIcon; + window.MarkerClusterer = MarkerClusterer; + window.MarkerLabel_ = MarkerLabel_; + window.MarkerWithLabel = MarkerWithLabel; + window.RichMarker = RichMarker; + }(); + //END REPLACE + }) + }; +}); diff --git a/src/js/wrapped/marker_spiderfier.js b/src/js/wrapped/marker_spiderfier.js new file mode 100644 index 000000000..2c5a9e41c --- /dev/null +++ b/src/js/wrapped/marker_spiderfier.js @@ -0,0 +1,13 @@ +angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapMarkerSpiderfier', [ 'uiGmapGoogleMapApi', function(GoogleMapApi) { + var self = this; + /* istanbul ignore next */ + +function(){ + @@REPLACE_W_LIBS + }.apply(self); + + GoogleMapApi.then(function(){ + self.OverlappingMarkerSpiderfier.initializeGoogleMaps(window.google); + }); + return this.OverlappingMarkerSpiderfier; +}]); diff --git a/src/js/wrapped/uuid.core.js b/src/js/wrapped/uuid.core.js new file mode 100644 index 000000000..2a250e68b --- /dev/null +++ b/src/js/wrapped/uuid.core.js @@ -0,0 +1,8 @@ +angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapuuid', function() { + //BEGIN REPLACE + /* istanbul ignore next */ + @@REPLACE_W_LIBS + //END REPLACE +return UUID; +}); diff --git a/src/js/wrapped/webpack/data-structures.js b/src/js/wrapped/webpack/data-structures.js new file mode 100644 index 000000000..29eff8db3 --- /dev/null +++ b/src/js/wrapped/webpack/data-structures.js @@ -0,0 +1,8 @@ +/* istanbul ignore next */ +angular.module('uiGmapgoogle-maps.wrapped') +.service('uiGmapDataStructures', function() { +return { + Graph: require('data-structures').Graph, + Queue: require('data-structures').Queue +}; +}); diff --git a/website_libs/dev_deps.js b/website_libs/dev_deps.js new file mode 100644 index 000000000..fc9d48b04 --- /dev/null +++ b/website_libs/dev_deps.js @@ -0,0 +1,248 @@ +/*! + * Bootstrap without jQuery v0.5.0 for Bootstrap 3 + * By Daniel Davis under MIT License + * https://github.com/tagawa/bootstrap-without-jquery + */ + +(function() { + 'use strict'; + + /* + * Utility functions + */ + + // transitionend - source: https://stackoverflow.com/questions/5023514/how-do-i-normalize-css3-transition-functions-across-browsers#answer-9090128 + function transitionEndEventName() { + var i, + el = document.createElement('div'), + transitions = { + 'transition':'transitionend', + 'OTransition':'otransitionend', // oTransitionEnd in very old Opera + 'MozTransition':'transitionend', + 'WebkitTransition':'webkitTransitionEnd' + }; + + for (i in transitions) { + if (transitions.hasOwnProperty(i) && el.style[i] !== undefined) { + return transitions[i]; + } + } + + return false; + } + var transitionend = transitionEndEventName(); + + // Get an event's target element and the element specified by the "data-target" attribute + function getTargets(event) { + var targets = {}; + event = event || window.event; + targets.evTarget = event.currentTarget || event.srcElement; + var dataTarget = targets.evTarget.getAttribute('data-target'); + targets.dataTarget = (dataTarget) ? document.querySelector(dataTarget) : false; + return targets; + } + + // Get the potential max height of an element + function getMaxHeight(element) { + // Source: http://n12v.com/css-transition-to-from-auto/ + var prevHeight = element.style.height; + element.style.height = 'auto'; + var maxHeight = getComputedStyle(element).height; + element.style.height = prevHeight; + element.offsetHeight; // force repaint + return maxHeight; + } + + // Fire a specified event + // Source: http://youmightnotneedjquery.com/ + function fireTrigger(element, eventType) { + if (document.createEvent) { + var event = document.createEvent('HTMLEvents'); + event.initEvent(eventType, true, false); + element.dispatchEvent(event); + } else { + element.fireEvent('on' + eventType); + } + } + + + /* + * Collapse action + * 1. Get list of all elements that are collapse triggers + * 2. Add click event listener to these elements + * 3. When clicked, change target element's class name from "collapse" to "collapsing" + * 4. When action (collapse) is complete, change target element's class name from "collapsing" to "collapse in" + * 5. Do the reverse, i.e. "collapse in" -> "collapsing" -> "collapse" + */ + + // Show a target element + function show(element, trigger) { + element.classList.remove('collapse'); + element.classList.add('collapsing'); + trigger.classList.remove('collapsed'); + trigger.setAttribute('aria-expanded', true); + + // Set element's height to its maximum height + element.style.height = getMaxHeight(element); + + // Call the complete() function after the transition has finished + if (transitionend) { + element.addEventListener(transitionend, function() { + complete(element); + }, false); + } else { + // For browsers that don't support transitions (e.g. IE9 and lower); + complete(element); + } + } + + // Hide a target element + function hide(element, trigger) { + element.classList.remove('collapse'); + element.classList.remove('in'); + element.classList.add('collapsing'); + trigger.classList.add('collapsed'); + trigger.setAttribute('aria-expanded', false); + + // Reset element's height + element.style.height = getComputedStyle(element).height; + element.offsetHeight; // force repaint + element.style.height = '0px'; + } + + // Change classes once transition is complete + function complete(element) { + element.classList.remove('collapsing'); + element.classList.add('collapse'); + element.setAttribute('aria-expanded', false); + + // Check whether the element is unhidden + if (element.style.height !== '0px') { + element.classList.add('in'); + element.style.height = 'auto'; + } + } + + // Start the collapse action on the chosen element + function doCollapse(event) { + event.preventDefault(); + var targets = getTargets(event); + var dataTarget = targets.dataTarget; + + // Add the "in" class name when elements are unhidden + if (dataTarget.classList.contains('in')) { + hide(dataTarget, targets.evTarget); + } else { + show(dataTarget, targets.evTarget); + } + return false; + } + + // Get all elements that are collapse triggers and add click event listeners + var collapsibleList = document.querySelectorAll('[data-toggle=collapse]'); + for (var i = 0, leni = collapsibleList.length; i < leni; i++) { + collapsibleList[i].onclick = doCollapse; + } + + + /* + * Alert dismiss action + * 1. Get list of all elements that are alert dismiss buttons + * 2. Add click event listener to these elements + * 3. When clicked, find the target or parent element with class name "alert" + * 4. Remove that element from the DOM + */ + + // Start the collapse action on the chosen element + function doDismiss(event) { + event.preventDefault(); + // Get target element from data-target attribute + var targets = getTargets(event); + var target = targets.dataTarget; + + if (!target) { + // If data-target not specified, get parent or grandparent node with class="alert" + var parent = targets.evTarget.parentNode; + if (parent.classList.contains('alert')) { + target = parent; + } else if (parent.parentNode.classList.contains('alert')) { + target = parent.parentNode; + } + } + + fireTrigger(target, 'close.bs.alert'); + target.classList.remove('in'); + + function removeElement() { + // Remove alert from DOM + try { + target.parentNode.removeChild(target); + fireTrigger(target, 'closed.bs.alert'); + } catch(e) { + window.console.error('Unable to remove alert'); + } + } + + // Call the complete() function after the transition has finished + if (transitionend && target.classList.contains('fade')) { + target.addEventListener(transitionend, function() { + removeElement(); + }, false); + } else { + // For browsers that don't support transitions (e.g. IE9 and lower); + removeElement(); + } + + return false; + } + + // Get all alert dismiss buttons and add click event listeners + var dismissList = document.querySelectorAll('[data-dismiss=alert]'); + for (var j = 0, lenj = dismissList.length; j < lenj; j++) { + dismissList[j].onclick = doDismiss; + } + + // Show a dropdown menu + function doDropdown(event) { + event = event || window.event; + var evTarget = event.currentTarget || event.srcElement; + var target = evTarget.parentElement; + var className = (' ' + target.className + ' '); + + if (className.indexOf(' open ') > -1) { + // Hide the menu + className = className.replace(' open ', ' '); + target.className = className; + } else { + // Show the menu + target.className += ' open '; + } + return false; + } + + // Close a dropdown menu + function closeDropdown(event) { + event = event || window.event; + var evTarget = event.currentTarget || event.srcElement; + var target = evTarget.parentElement; + + target.className = (' ' + target.className + ' ').replace(' open ', ' '); + + // Trigger the click event on the target if it not opening another menu + if(event.relatedTarget) { + if(event.relatedTarget.getAttribute('data-toggle') !== 'dropdown'){ + event.relatedTarget.click(); + } + } + return false; + } + + // Set event listeners for dropdown menus + var dropdowns = document.querySelectorAll('[data-toggle=dropdown]'); + for (var k = 0, dropdown, lenk = dropdowns.length; k < lenk; k++) { + dropdown = dropdowns[k]; + dropdown.setAttribute('tabindex', '0'); // Fix to make onblur work in Chrome + dropdown.onclick = doDropdown; + dropdown.onblur = closeDropdown; + } +})();