From 6990205849ac925e1c3c3697fbe005728d6e1ad7 Mon Sep 17 00:00:00 2001 From: pal155 Date: Thu, 5 Nov 2020 16:05:44 +1100 Subject: [PATCH 01/10] Update to grails 4.0.5, bootstrap 3 Now using alaAdmin plugin for some administrative functions Loads and caches resource metadata Configuration can now have data resources as well as collections --- .gitignore | 13 +- .travis.yml | 18 - README.md | 59 -- application.properties | 6 - build.gradle | 129 ++++ gradle.properties | 5 + gradlew | 172 +++++ gradlew.bat | 84 +++ .../assets}/images/ajax-loader.gif | Bin .../assets/images/skin/database_add.png | 0 .../assets/images/skin/database_delete.png | 0 .../assets/images/skin/database_edit.png | 0 .../assets/images/skin/database_save.png | 0 .../assets/images/skin/database_table.png | 0 grails-app/assets/images/skin/exclamation.png | 0 grails-app/assets/images/skin/house.png | 0 grails-app/assets/images/skin/information.png | 0 grails-app/assets/images/skin/shadow.jpg | 0 grails-app/assets/images/skin/sorted_asc.gif | 0 grails-app/assets/images/skin/sorted_desc.gif | 0 grails-app/assets/javascripts/admin.js | 3 + grails-app/assets/javascripts/browser.js | 3 + .../assets/javascripts}/jquery.ba-bbq.min.js | 0 .../assets/javascripts/utilities.js | 1 - .../assets/javascripts/xxxknockout-3.0.0.js | 0 .../assets/stylesheets}/specimenbrowser.css | 256 +++---- grails-app/assets/stylesheets/viewer.css | 5 + grails-app/conf/ApplicationResources.groovy | 14 - grails-app/conf/BootStrap.groovy | 7 - grails-app/conf/BuildConfig.groovy | 48 -- grails-app/conf/Config.groovy | 163 ----- grails-app/conf/DataSource.groovy | 2 - grails-app/conf/application.yml | 187 +++++ grails-app/conf/logback.groovy | 37 + .../specimenbrowser/AdminController.groovy | 60 +- .../ala/specimenbrowser/ViewController.groovy | 78 +- .../specimenbrowser}/UrlMappings.groovy | 25 +- grails-app/i18n/messages.properties | 1 + grails-app/i18n/messages_cs_CZ.properties | 55 -- grails-app/i18n/messages_de.properties | 110 +-- grails-app/i18n/messages_fr.properties | 38 +- grails-app/i18n/messages_it.properties | 110 +-- grails-app/i18n/messages_ja.properties | 110 +-- grails-app/i18n/messages_pt_BR.properties | 8 +- grails-app/i18n/messages_pt_PT.properties | 68 +- grails-app/i18n/messages_ru.properties | 62 +- grails-app/i18n/messages_th.properties | 110 +-- grails-app/i18n/messages_zh_CN.properties | 36 +- .../specimenbrowser/ResourceService.groovy | 59 ++ grails-app/views/admin/counts.gsp | 53 +- grails-app/views/admin/index.gsp | 21 +- grails-app/views/admin/settings.gsp | 48 -- grails-app/views/admin/tools.gsp | 81 --- grails-app/views/browse/index.gsp | 42 +- grails-app/views/index.gsp | 4 +- grails-app/views/index.gsp.new | 52 -- grails-app/views/layouts/adminLayout.gsp | 83 --- grails-app/views/layouts/main.gsp | 104 --- grails-app/views/layouts/main.gsp.new | 106 --- grails-app/views/view/homePage.gsp | 66 +- grails-app/views/view/viewer.gsp | 27 +- grails-release-plugin-bug-workaround_pom.xml | 39 - grails-wrapper.jar | Bin 0 -> 4821 bytes grailsw | 152 ++++ grailsw.bat | 89 +++ settings.gradle | 2 + .../resources/GebConfig.groovy | 25 + .../AdminControllerTests.groovy | 17 - .../ViewControllerTests.groovy | 17 - .../BrowseControllerTests.groovy | 15 - .../SpecimenTagTagLibSpec.groovy | 20 - upgrade-notes.md | 3 + web-app/WEB-INF/applicationContext.xml | 34 - web-app/WEB-INF/sitemesh.xml | 14 - web-app/WEB-INF/tld/c.tld | 572 --------------- web-app/WEB-INF/tld/fmt.tld | 671 ------------------ web-app/WEB-INF/tld/grails.tld | 550 -------------- web-app/WEB-INF/tld/spring.tld | 457 ------------ web-app/css/errors.css | 109 --- web-app/css/main.css | 596 ---------------- web-app/css/mobile.css | 82 --- web-app/images/apple-touch-icon-retina.png | Bin 14986 -> 0 bytes web-app/images/apple-touch-icon.png | Bin 5434 -> 0 bytes web-app/images/favicon.ico | Bin 10134 -> 0 bytes web-app/images/grails_logo.jpg | Bin 8065 -> 0 bytes web-app/images/grails_logo.png | Bin 10172 -> 0 bytes web-app/images/leftnav_btm.png | Bin 3859 -> 0 bytes web-app/images/leftnav_midstretch.png | Bin 2883 -> 0 bytes web-app/images/leftnav_top.png | Bin 3317 -> 0 bytes web-app/images/skin/database_add.png | Bin 658 -> 0 bytes web-app/images/skin/database_delete.png | Bin 659 -> 0 bytes web-app/images/skin/database_edit.png | Bin 767 -> 0 bytes web-app/images/skin/database_save.png | Bin 755 -> 0 bytes web-app/images/skin/database_table.png | Bin 726 -> 0 bytes web-app/images/skin/exclamation.png | Bin 701 -> 0 bytes web-app/images/skin/house.png | Bin 806 -> 0 bytes web-app/images/skin/information.png | Bin 778 -> 0 bytes web-app/images/skin/shadow.jpg | Bin 300 -> 0 bytes web-app/images/skin/sorted_asc.gif | Bin 835 -> 0 bytes web-app/images/skin/sorted_desc.gif | Bin 834 -> 0 bytes web-app/images/spinner.gif | Bin 2037 -> 0 bytes web-app/images/springsource.png | Bin 9109 -> 0 bytes web-app/leaflet/Control.FullScreen.css | 4 - web-app/leaflet/Control.FullScreen.js | 163 ----- web-app/leaflet/images/icon-fullscreen-2x.png | Bin 228 -> 0 bytes web-app/leaflet/images/icon-fullscreen.png | Bin 153 -> 0 bytes web-app/leaflet/images/layers-2x.png | Bin 2898 -> 0 bytes web-app/leaflet/images/layers.png | Bin 1502 -> 0 bytes web-app/leaflet/images/marker-icon-2x.png | Bin 4033 -> 0 bytes web-app/leaflet/images/marker-icon.png | Bin 1747 -> 0 bytes web-app/leaflet/images/marker-shadow.png | Bin 797 -> 0 bytes web-app/leaflet/leaflet.css | 478 ------------- web-app/leaflet/leaflet.js | 9 - 113 files changed, 1609 insertions(+), 5338 deletions(-) delete mode 100644 .travis.yml delete mode 100644 README.md delete mode 100644 application.properties create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100755 gradlew create mode 100755 gradlew.bat rename {web-app => grails-app/assets}/images/ajax-loader.gif (100%) create mode 100644 grails-app/assets/images/skin/database_add.png create mode 100644 grails-app/assets/images/skin/database_delete.png create mode 100644 grails-app/assets/images/skin/database_edit.png create mode 100644 grails-app/assets/images/skin/database_save.png create mode 100644 grails-app/assets/images/skin/database_table.png create mode 100644 grails-app/assets/images/skin/exclamation.png create mode 100644 grails-app/assets/images/skin/house.png create mode 100644 grails-app/assets/images/skin/information.png create mode 100644 grails-app/assets/images/skin/shadow.jpg create mode 100644 grails-app/assets/images/skin/sorted_asc.gif create mode 100644 grails-app/assets/images/skin/sorted_desc.gif create mode 100644 grails-app/assets/javascripts/admin.js create mode 100644 grails-app/assets/javascripts/browser.js rename {web-app/js => grails-app/assets/javascripts}/jquery.ba-bbq.min.js (100%) rename web-app/js/application.js => grails-app/assets/javascripts/utilities.js (99%) rename web-app/js/knockout-3.0.0.js => grails-app/assets/javascripts/xxxknockout-3.0.0.js (100%) rename {web-app/css => grails-app/assets/stylesheets}/specimenbrowser.css (93%) create mode 100644 grails-app/assets/stylesheets/viewer.css delete mode 100644 grails-app/conf/ApplicationResources.groovy delete mode 100644 grails-app/conf/BootStrap.groovy delete mode 100644 grails-app/conf/BuildConfig.groovy delete mode 100644 grails-app/conf/Config.groovy delete mode 100644 grails-app/conf/DataSource.groovy create mode 100644 grails-app/conf/application.yml create mode 100644 grails-app/conf/logback.groovy rename grails-app/{conf => controllers/specimenbrowser}/UrlMappings.groovy (57%) delete mode 100644 grails-app/i18n/messages_cs_CZ.properties create mode 100644 grails-app/services/au/org/ala/specimenbrowser/ResourceService.groovy delete mode 100644 grails-app/views/admin/settings.gsp delete mode 100644 grails-app/views/admin/tools.gsp delete mode 100644 grails-app/views/index.gsp.new delete mode 100644 grails-app/views/layouts/adminLayout.gsp delete mode 100644 grails-app/views/layouts/main.gsp delete mode 100644 grails-app/views/layouts/main.gsp.new delete mode 100644 grails-release-plugin-bug-workaround_pom.xml create mode 100644 grails-wrapper.jar create mode 100755 grailsw create mode 100755 grailsw.bat create mode 100644 settings.gradle create mode 100644 src/integration-test/resources/GebConfig.groovy delete mode 100644 test/unit/au/org/ala/specimenbrowser/AdminControllerTests.groovy delete mode 100644 test/unit/au/org/ala/specimenbrowser/ViewControllerTests.groovy delete mode 100644 test/unit/specimenbrowser/BrowseControllerTests.groovy delete mode 100644 test/unit/specimenbrowser/SpecimenTagTagLibSpec.groovy create mode 100644 upgrade-notes.md delete mode 100644 web-app/WEB-INF/applicationContext.xml delete mode 100644 web-app/WEB-INF/sitemesh.xml delete mode 100644 web-app/WEB-INF/tld/c.tld delete mode 100644 web-app/WEB-INF/tld/fmt.tld delete mode 100644 web-app/WEB-INF/tld/grails.tld delete mode 100644 web-app/WEB-INF/tld/spring.tld delete mode 100644 web-app/css/errors.css delete mode 100644 web-app/css/main.css delete mode 100644 web-app/css/mobile.css delete mode 100644 web-app/images/apple-touch-icon-retina.png delete mode 100644 web-app/images/apple-touch-icon.png delete mode 100644 web-app/images/favicon.ico delete mode 100644 web-app/images/grails_logo.jpg delete mode 100644 web-app/images/grails_logo.png delete mode 100644 web-app/images/leftnav_btm.png delete mode 100644 web-app/images/leftnav_midstretch.png delete mode 100644 web-app/images/leftnav_top.png delete mode 100644 web-app/images/skin/database_add.png delete mode 100644 web-app/images/skin/database_delete.png delete mode 100644 web-app/images/skin/database_edit.png delete mode 100644 web-app/images/skin/database_save.png delete mode 100644 web-app/images/skin/database_table.png delete mode 100644 web-app/images/skin/exclamation.png delete mode 100644 web-app/images/skin/house.png delete mode 100644 web-app/images/skin/information.png delete mode 100644 web-app/images/skin/shadow.jpg delete mode 100644 web-app/images/skin/sorted_asc.gif delete mode 100644 web-app/images/skin/sorted_desc.gif delete mode 100644 web-app/images/spinner.gif delete mode 100644 web-app/images/springsource.png delete mode 100644 web-app/leaflet/Control.FullScreen.css delete mode 100644 web-app/leaflet/Control.FullScreen.js delete mode 100644 web-app/leaflet/images/icon-fullscreen-2x.png delete mode 100644 web-app/leaflet/images/icon-fullscreen.png delete mode 100644 web-app/leaflet/images/layers-2x.png delete mode 100644 web-app/leaflet/images/layers.png delete mode 100644 web-app/leaflet/images/marker-icon-2x.png delete mode 100644 web-app/leaflet/images/marker-icon.png delete mode 100644 web-app/leaflet/images/marker-shadow.png delete mode 100644 web-app/leaflet/leaflet.css delete mode 100644 web-app/leaflet/leaflet.js diff --git a/.gitignore b/.gitignore index 15bdd96..f33ace2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,12 @@ -/target -/.idea +Thumbs.db +.DS_Store +.gradle +build/ +out/ +.idea *.iml +*.ipr +*.iws +.project +.settings +.classpath diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index bec923b..0000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: groovy -jdk: -- oraclejdk7 -sudo: false -branches: - only: - - master -before_install: - - wget -q https://raw.githubusercontent.com/AtlasOfLivingAustralia/travis-build-configuration/master/ala_common.sh - - chmod +x ala_common.sh - - source ./ala_common.sh - - ala_travis_grails_setup_env -script: - - ala_travis_grails_build -env: - global: - - secure: XXXTssBnWIBinafmyop1zf/2Pf81hpr0IisjfUd9lw4InfnbICNChS6P/ovfdtFu062xeVYbAgUQLCec1KlPDZQ32UgxFGU74EQ/1M70bJULsxd35UBpTNkhUyNQIcr9DkOhMYahvQbmySv5JGVFiT9ry/38xzQsHfYCQPs5dJY= - - secure: FHlKa+UKFJdz/4AlfIo6rspYR6+KGOND4hk13LJN3QZCHRjM2ij9toqDxP74aH4VGpaUzEaKy1cC8hqE2F97VbptrFo2NtDEl9fJ6Z/+3lPo3tr6PZ69WZqex//bO+kkpjEn0KspLc92cCfaVOJxHWu5QcQ+C1SddfTwY5FuHPU= diff --git a/README.md b/README.md deleted file mode 100644 index c266d49..0000000 --- a/README.md +++ /dev/null @@ -1,59 +0,0 @@ -### specimenbrowser [![Build Status](https://travis-ci.org/AtlasOfLivingAustralia/specimenbrowser.svg?branch=master)](https://travis-ci.org/AtlasOfLivingAustralia/specimenbrowser) - -Browsing application for specimen images in Australian collections. -This application make use of biocache, collectory and image services. - -Deploying a new version of specimenbrowser to Nexus -=================================================== - -Before deploying a new version, check that the dependency versions are up to date in grails-app/conf/BuildConfig.groovy. - -Travis-CI is used to deploy new versions of specimenbrowser to Nexus. This is done automatically by updating the version number in the application.properties file and pushing to GitHub. - -Once the new version of specimenbrowser is deployed to Nexus, the version number in ansible-inventories needs to change. To do this, the version number must be changed in: - -https://github.com/AtlasOfLivingAustralia/ansible-inventories/blob/master/specimens.ala.org.au - -Deploying the current Nexus deployed version of SpecimenBrowser to a virtual machine -==================================================================================== - -If you have not yet installed Ansible, Vagrant, or VirtualBox, use the instructions at the [ALA Install README.md file](https://github.com/AtlasOfLivingAustralia/ala-install/blob/master/README.md) to install those first for your operating system. - -Then, to deploy SpecimenBrowser onto a local virtual box install use the following instructions: - -``` -$ cd gitrepos -$ git clone git@github.com:AtlasOfLivingAustralia/ala-install.git -$ (cd ala-install/vagrant/ubuntu-trusty && vagrant up) -``` - -Add a line to your /etc/hosts file with the following information, replacing '10.1.1.3' with whatever IP address is assigned to the virtual machine that Vagrant starts up in VirtualBox: - -``` -10.1.1.3 specimens.ala.org.au -``` - -Then you can clone the ansible instructions and install it onto the given machine: - -``` -$ git clone git@github.com:AtlasOfLivingAustralia/ansible-inventories.git -$ ansible-playbook -i ansible-inventories/specimens.ala.org.au ala-install/ansible/specimenbrowser-standalone.yml - --private-key ~/.vagrant.d/insecure_private_key -vvvv --user vagrant --sudo -``` - -Deploying to AWS EC2 production server -====================================== - -After testing locally, the same ansible scripts can be used to deploy to the production server which is an AWS EC2 server. - -Comment out any testing line for specimens.ala.org.au in your /etc/hosts file and add the following line: - -``` -54.153.224.165 specimens.ala.org.au -``` - -Then deploy to that machine using the following command, replacing "MY_USER_NAME" with your login username: - -``` -$ ansible-playbook --user MY_USER_NAME -i ansible-inventories/specimens.ala.org.au ala-install/ansible/specimenbrowser-standalone.yml --private-key ~/.ssh/id_rsa -vvvv --sudo --ask-sudo-pass -``` diff --git a/application.properties b/application.properties deleted file mode 100644 index feddc65..0000000 --- a/application.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Grails Metadata file -#Wed Feb 04 20:00:21 EST 2015 -app.grails.version=2.3.11 -app.name=specimenbrowser -app.servlet.version=2.5 -app.version=1.3-SNAPSHOT diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..c04f538 --- /dev/null +++ b/build.gradle @@ -0,0 +1,129 @@ +buildscript { + repositories { + mavenLocal() + maven { url "https://repo.grails.org/grails/core" } + } + dependencies { + classpath "org.grails:grails-gradle-plugin:$grailsVersion" + classpath "gradle.plugin.com.github.erdi.webdriver-binaries:webdriver-binaries-gradle-plugin:2.0" + // classpath "org.grails.plugins:hibernate5:7.0.4" + classpath "com.bertramlabs.plugins:asset-pipeline-gradle:3.2.4" + } +} + +version "" +group "au.org.ala" + +apply plugin:"eclipse" +apply plugin:"idea" +apply plugin:"war" +apply plugin:"org.grails.grails-web" +apply plugin:"com.github.erdi.webdriver-binaries" +apply plugin:"com.bertramlabs.asset-pipeline" +apply plugin:"org.grails.grails-gsp" + +repositories { + mavenLocal() + maven { url "http://nexus.ala.org.au/content/groups/public/" } + maven { url "https://repo.grails.org/grails/core" } +} + +configurations { + developmentOnly + runtimeClasspath { + extendsFrom developmentOnly + } +} + +dependencies { + developmentOnly("org.springframework.boot:spring-boot-devtools") + compile "org.springframework.boot:spring-boot-starter-logging" + compile "org.springframework.boot:spring-boot-autoconfigure" + compile "org.grails:grails-core" + compile "org.springframework.boot:spring-boot-starter-actuator" + compile "org.springframework.boot:spring-boot-starter-tomcat" + compile "org.grails:grails-web-boot" + compile "org.grails:grails-logging" + compile "org.grails:grails-plugin-rest" + // compile "org.grails:grails-plugin-databinding" + compile "org.grails:grails-plugin-i18n" + compile "org.grails:grails-plugin-services" + compile "org.grails:grails-plugin-url-mappings" + compile "org.grails:grails-plugin-interceptors" + compile "org.grails.plugins:cache" + compile "org.grails.plugins:async" + //compile "org.grails.plugins:scaffolding" + compile "org.grails.plugins:events" + // compile "org.grails.plugins:hibernate5" + // compile "org.hibernate:hibernate-core:5.4.18.Final" + compile "org.grails.plugins:gsp" + compileOnly "io.micronaut:micronaut-inject-groovy" + console "org.grails:grails-console" + profile "org.grails.profiles:web" + runtime "org.glassfish.web:el-impl:2.1.2-b03" + //runtime "com.h2database:h2" + //runtime "org.apache.tomcat:tomcat-jdbc" + runtime "javax.xml.bind:jaxb-api:2.3.1" + runtime "xml-apis:xml-apis:1.4.01" + runtime "com.bertramlabs.plugins:asset-pipeline-grails:3.2.4" + testCompile "io.micronaut:micronaut-inject-groovy" + //testCompile "org.grails:grails-gorm-testing-support" + testCompile "org.mockito:mockito-core" + testCompile "org.grails:grails-web-testing-support" + testCompile "org.grails.plugins:geb" + testCompile "org.seleniumhq.selenium:selenium-remote-driver:3.14.0" + testCompile "org.seleniumhq.selenium:selenium-api:3.14.0" + testCompile "org.seleniumhq.selenium:selenium-support:3.14.0" + testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:3.14.0" + testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:3.14.0" + + // External config + compile 'org.grails.plugins:external-config:2.0.0' + + // Javascript libraries + // compile 'org.webjars:leaflet:1.6.0' + compile 'org.webjars:knockout:3.5.1' + // compile 'org.webjars:swagger-ui:3.18.2' + + // ALA Plugins + compile group: 'org.grails.plugins', name: 'ala-auth', version: '3.2.2' + compile group: 'org.grails.plugins', name: 'ala-admin-plugin', version: '2.2' + compile group: 'org.grails.plugins', name: 'ala-bootstrap3', version: '3.2.2' + compile group: 'au.org.ala.plugins.grails', name: 'images-client-plugin', version: '1.2' +} + +bootRun { + ignoreExitValue true + jvmArgs( + '-Dspring.output.ansi.enabled=always', + '-noverify', + '-XX:TieredStopAtLevel=1', + '-Xmx1024m') + sourceResources sourceSets.main + String springProfilesActive = 'spring.profiles.active' + systemProperty springProfilesActive, System.getProperty(springProfilesActive) +} + +tasks.withType(GroovyCompile) { + configure(groovyOptions) { + forkOptions.jvmArgs = ['-Xmx1024m'] + } +} + +webdriverBinaries { + chromedriver '2.45.0' + geckodriver '0.24.0' +} + +tasks.withType(Test) { + systemProperty "geb.env", System.getProperty('geb.env') + systemProperty "geb.build.reportsDir", reporting.file("geb/integrationTest") + systemProperty "webdriver.chrome.driver", System.getProperty('webdriver.chrome.driver') + systemProperty "webdriver.gecko.driver", System.getProperty('webdriver.gecko.driver') +} + + +assets { + minifyJs = true + minifyCss = true +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..f5c617a --- /dev/null +++ b/gradle.properties @@ -0,0 +1,5 @@ +grailsVersion=4.0.5 +gorm.version=7.0.8.RELEASE +org.gradle.daemon=true +org.gradle.parallel=true +org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xmx1024M diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..af6708f --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100755 index 0000000..6d57edc --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/web-app/images/ajax-loader.gif b/grails-app/assets/images/ajax-loader.gif similarity index 100% rename from web-app/images/ajax-loader.gif rename to grails-app/assets/images/ajax-loader.gif diff --git a/grails-app/assets/images/skin/database_add.png b/grails-app/assets/images/skin/database_add.png new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/database_delete.png b/grails-app/assets/images/skin/database_delete.png new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/database_edit.png b/grails-app/assets/images/skin/database_edit.png new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/database_save.png b/grails-app/assets/images/skin/database_save.png new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/database_table.png b/grails-app/assets/images/skin/database_table.png new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/exclamation.png b/grails-app/assets/images/skin/exclamation.png new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/house.png b/grails-app/assets/images/skin/house.png new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/information.png b/grails-app/assets/images/skin/information.png new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/shadow.jpg b/grails-app/assets/images/skin/shadow.jpg new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/sorted_asc.gif b/grails-app/assets/images/skin/sorted_asc.gif new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/images/skin/sorted_desc.gif b/grails-app/assets/images/skin/sorted_desc.gif new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/assets/javascripts/admin.js b/grails-app/assets/javascripts/admin.js new file mode 100644 index 0000000..dd415f0 --- /dev/null +++ b/grails-app/assets/javascripts/admin.js @@ -0,0 +1,3 @@ +//= require /webjars/knockout/3.5.1/knockout.js +//= require jquery.ba-bbq.min.js +//= require utilities.js \ No newline at end of file diff --git a/grails-app/assets/javascripts/browser.js b/grails-app/assets/javascripts/browser.js new file mode 100644 index 0000000..dd415f0 --- /dev/null +++ b/grails-app/assets/javascripts/browser.js @@ -0,0 +1,3 @@ +//= require /webjars/knockout/3.5.1/knockout.js +//= require jquery.ba-bbq.min.js +//= require utilities.js \ No newline at end of file diff --git a/web-app/js/jquery.ba-bbq.min.js b/grails-app/assets/javascripts/jquery.ba-bbq.min.js similarity index 100% rename from web-app/js/jquery.ba-bbq.min.js rename to grails-app/assets/javascripts/jquery.ba-bbq.min.js diff --git a/web-app/js/application.js b/grails-app/assets/javascripts/utilities.js similarity index 99% rename from web-app/js/application.js rename to grails-app/assets/javascripts/utilities.js index 60074ff..b8ad840 100644 --- a/web-app/js/application.js +++ b/grails-app/assets/javascripts/utilities.js @@ -72,4 +72,3 @@ function AjaxLauncher (baseUrl) { list.push(callback); }; } - diff --git a/web-app/js/knockout-3.0.0.js b/grails-app/assets/javascripts/xxxknockout-3.0.0.js similarity index 100% rename from web-app/js/knockout-3.0.0.js rename to grails-app/assets/javascripts/xxxknockout-3.0.0.js diff --git a/web-app/css/specimenbrowser.css b/grails-app/assets/stylesheets/specimenbrowser.css similarity index 93% rename from web-app/css/specimenbrowser.css rename to grails-app/assets/stylesheets/specimenbrowser.css index 7425ab8..6988d55 100644 --- a/web-app/css/specimenbrowser.css +++ b/grails-app/assets/stylesheets/specimenbrowser.css @@ -1,128 +1,128 @@ -.panel-text { margin-top : 15px; font-size: 15px; line-height: 1.5em;} -.panel h2 { line-height: 1.2em; } -.panel h3 { line-height: 1.2em; } - -.space-after { - margin-bottom: 10px; -} - -.space-before { - margin-top: 10px; -} - -.large-space-after { - margin-bottom: 20px; -} - -.large-space-before { - margin-top: 20px; -} - -.center {text-align: center} - -.clickable { - cursor: pointer; - /*text-decoration: underline;*/ - color: #007fb6; -} - -ul { - list-style: none; -} - -.clickable:hover, -.clickable:focus { - color: #00638d; - text-decoration: underline; -} - -#imagesList { - margin:0; -} - -.imgCon { - display: inline-block; - /*margin-right: 8px;*/ - text-align: center; - line-height: 1.3em; - background-color: #DDD; - color: #DDD; - /*padding: 5px;*/ - /*margin-bottom: 8px;*/ - margin: 2px 0 2px 0; - position: relative; -} - -.imgCon .meta { - opacity: 0.7; - position: absolute; - bottom: 0; - left: 0; - right: 0; - overflow: hidden; - text-align: left; - padding: 4px 6px 2px 8px; -} - -.imgCon .full { - color: white; - background-color: black; - display: none; -} - -.imgCon .brief { - color: black; - background-color: white; -} - -.imgCon .hover-target { - display: none; -} - -.imgCon:hover .full { - display: inline-block; -} - -.imgCon:hover .brief { - display: none; -} - -#taxonomyFacet .level0 { - margin-left: 0; -} - -#taxonomyFacet .level1 { - margin-left: 4px; -} - -#taxonomyFacet .level2 { - margin-left: 8px; -} - -#taxonomyFacet .level3 { - margin-left: 12px; -} - -#taxonomyFacet .level4 { - margin-left: 16px; -} - -#taxonomyFacet .level5 { - margin-left: 20px; -} - -#taxonomyFacet .level6 { - margin-left: 24px; -} - -#taxonomyFacet .level7 { - margin-left: 28px; -} - -#taxonomyFacet .level8 { - margin-left: 32px; -} - -#imageViewer { - height: 600px; -} +.panel-text { margin-top : 15px; font-size: 15px; line-height: 1.5em;} +.panel h2 { line-height: 1.2em; } +.panel h3 { line-height: 1.2em; } + +.space-after { + margin-bottom: 10px; +} + +.space-before { + margin-top: 10px; +} + +.large-space-after { + margin-bottom: 20px; +} + +.large-space-before { + margin-top: 20px; +} + +.center {text-align: center} + +.clickable { + cursor: pointer; + /*text-decoration: underline;*/ + color: #007fb6; +} + +ul { + list-style: none; +} + +.clickable:hover, +.clickable:focus { + color: #00638d; + text-decoration: underline; +} + +#imagesList { + margin:0; +} + +.imgCon { + display: inline-block; + /*margin-right: 8px;*/ + text-align: center; + line-height: 1.3em; + background-color: #DDD; + color: #DDD; + /*padding: 5px;*/ + /*margin-bottom: 8px;*/ + margin: 2px 0 2px 0; + position: relative; +} + +.imgCon .meta { + opacity: 0.7; + position: absolute; + bottom: 0; + left: 0; + right: 0; + overflow: hidden; + text-align: left; + padding: 4px 6px 2px 8px; +} + +.imgCon .full { + color: white; + background-color: black; + display: none; +} + +.imgCon .brief { + color: black; + background-color: white; +} + +.imgCon .hover-target { + display: none; +} + +.imgCon:hover .full { + display: inline-block; +} + +.imgCon:hover .brief { + display: none; +} + +#taxonomyFacet .level0 { + margin-left: 0; +} + +#taxonomyFacet .level1 { + margin-left: 4px; +} + +#taxonomyFacet .level2 { + margin-left: 8px; +} + +#taxonomyFacet .level3 { + margin-left: 12px; +} + +#taxonomyFacet .level4 { + margin-left: 16px; +} + +#taxonomyFacet .level5 { + margin-left: 20px; +} + +#taxonomyFacet .level6 { + margin-left: 24px; +} + +#taxonomyFacet .level7 { + margin-left: 28px; +} + +#taxonomyFacet .level8 { + margin-left: 32px; +} + +#imageViewer { + height: 600px; +} diff --git a/grails-app/assets/stylesheets/viewer.css b/grails-app/assets/stylesheets/viewer.css new file mode 100644 index 0000000..756c495 --- /dev/null +++ b/grails-app/assets/stylesheets/viewer.css @@ -0,0 +1,5 @@ +/* + * CSS and extensions for the image viewer + * + * + */ \ No newline at end of file diff --git a/grails-app/conf/ApplicationResources.groovy b/grails-app/conf/ApplicationResources.groovy deleted file mode 100644 index 23bac5b..0000000 --- a/grails-app/conf/ApplicationResources.groovy +++ /dev/null @@ -1,14 +0,0 @@ -modules = { - application { - resource url:'js/application.js' - resource url:'css/specimenbrowser.css' - } - - knockout { - resource 'js/knockout-3.0.0.js' - } - - bbq { - resource 'js/jquery.ba-bbq.min.js' - } -} \ No newline at end of file diff --git a/grails-app/conf/BootStrap.groovy b/grails-app/conf/BootStrap.groovy deleted file mode 100644 index 1287dae..0000000 --- a/grails-app/conf/BootStrap.groovy +++ /dev/null @@ -1,7 +0,0 @@ -class BootStrap { - - def init = { servletContext -> - } - def destroy = { - } -} diff --git a/grails-app/conf/BuildConfig.groovy b/grails-app/conf/BuildConfig.groovy deleted file mode 100644 index 6db0c31..0000000 --- a/grails-app/conf/BuildConfig.groovy +++ /dev/null @@ -1,48 +0,0 @@ -grails.servlet.version = "2.5" // Change depending on target container compliance (2.5 or 3.0) -grails.project.class.dir = "target/classes" -grails.project.test.class.dir = "target/test-classes" -grails.project.test.reports.dir = "target/test-reports" -grails.project.target.level = 1.6 -grails.project.source.level = 1.6 -//grails.project.war.file = "target/${appName}-${appVersion}.war" - -//grails.plugin.location."images-client-plugin" = "../images-client-plugin" -// uncomment (and adjust settings) to fork the JVM to isolate classpaths -grails.project.fork = [ - test: false, - run: false, - war: false, - console: false -] - -grails.project.dependency.resolver = "maven" - -grails.project.dependency.resolution = { - // inherit Grails' default dependencies - inherits("global") { - // specify dependency exclusions here; for example, uncomment this to disable ehcache: - // excludes 'ehcache' - } - log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose' - checksums true // Whether to verify checksums on resolve - legacyResolve false // whether to do a secondary resolve on plugin installation, not advised and here for backwards compatibility - - repositories { - mavenLocal() - mavenRepo("https://nexus.ala.org.au/content/groups/public/"){ - updatePolicy 'always' - } - } - - dependencies { - - } - - plugins { - runtime ":ala-bootstrap2:2.2" - runtime ":images-client-plugin:0.5.3" - compile ':cache:1.1.8' - compile ':ala-auth:1.3.1' - build ':tomcat:7.0.54' - } -} diff --git a/grails-app/conf/Config.groovy b/grails-app/conf/Config.groovy deleted file mode 100644 index 11139e3..0000000 --- a/grails-app/conf/Config.groovy +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************************\ - * CONFIG MANAGEMENT - \******************************************************************************/ -def appName = 'specimenbrowser' -def ENV_NAME = "${appName.toUpperCase()}_CONFIG" -default_config = "/data/${appName}/config/${appName}-config.properties" -if(!grails.config.locations || !(grails.config.locations instanceof List)) { - grails.config.locations = [] -} -if(System.getenv(ENV_NAME) && new File(System.getenv(ENV_NAME)).exists()) { - println "[${appName}] Including configuration file specified in environment: " + System.getenv(ENV_NAME); - grails.config.locations.add "file:" + System.getenv(ENV_NAME) -} else if(System.getProperty(ENV_NAME) && new File(System.getProperty(ENV_NAME)).exists()) { - println "[${appName}] Including configuration file specified on command line: " + System.getProperty(ENV_NAME); - grails.config.locations.add "file:" + System.getProperty(ENV_NAME) -} else if(new File(default_config).exists()) { - println "[${appName}] Including default configuration file: " + default_config; - grails.config.locations.add "file:" + default_config -} else { - println "[${appName}] No external configuration file defined." -} -println "[${appName}] (*) grails.config.locations = ${grails.config.locations}" - -grails.project.groupId = appName // change this to alter the default package name and Maven publishing destination -grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format -grails.mime.use.accept.header = false -grails.mime.types = [ - all: '*/*', - atom: 'application/atom+xml', - css: 'text/css', - csv: 'text/csv', - form: 'application/x-www-form-urlencoded', - html: ['text/html','application/xhtml+xml'], - js: 'text/javascript', - json: ['application/json', 'text/json'], - multipartForm: 'multipart/form-data', - rss: 'application/rss+xml', - text: 'text/plain', - xml: ['text/xml', 'application/xml'] -] - -// URL Mapping Cache Max Size, defaults to 5000 -//grails.urlmapping.cache.maxsize = 1000 - -// What URL patterns should be processed by the resources plugin -grails.resources.adhoc.patterns = ['/images/*', '/css/*', '/js/*', '/plugins/*'] - -/******************************************************************************\ - * RELOADABLE CONFIG - \******************************************************************************/ -reloadable.cfgs = ["file:/data/${appName}/config/${appName}-config.properties"] - -/******************************************************************************\ - * EXTERNAL SERVERS - \******************************************************************************/ -if (!bie.baseURL) { - bie.baseURL = "https://bie.ala.org.au" -} -if (!bie.searchPath) { - bie.searchPath = "/search" -} -if (!biocache.baseURL) { - biocache.baseURL = "https://biocache.ala.org.au" -} -if(!biocacheServicesUrl){ - biocacheServicesUrl = "https://biocache-ws.ala.org.au/ws" -} -if(!collectory.baseURL){ - collectory.baseURL = "https://collections.ala.org.au" -} -if(!collectory.servicesURL){ - collectory.servicesURL = "https://collections.ala.org.au/ws" -} -if (!spatial.baseURL) { - spatial.baseURL = "https://spatial.ala.org.au" -} -if (!ala.baseURL) { - ala.baseURL = "https://www.ala.org.au" -} -if (!ala.image.service.url) { - ala.image.service.url = "https://images.ala.org.au" -} - -// The default codec used to encode data with ${} -grails.views.default.codec = "none" // none, html, base64 -grails.views.gsp.encoding = "UTF-8" -grails.converters.encoding = "UTF-8" -// enable Sitemesh preprocessing of GSP pages -grails.views.gsp.sitemesh.preprocess = true -// scaffolding templates configuration -grails.scaffolding.templates.domainSuffix = 'Instance' - -// Set to false to use the new Grails 1.2 JSONBuilder in the render method -grails.json.legacy.builder = false -// enabled native2ascii conversion of i18n properties files -grails.enable.native2ascii = true -// packages to include in Spring bean scanning -grails.spring.bean.packages = [] -// whether to disable processing of multi part requests -grails.web.disable.multipart=false - -// request parameters to mask when logging exceptions -grails.exceptionresolver.params.exclude = ['password'] - -// configure auto-caching of queries by default (if false you can cache individual queries with 'cache: true') -grails.hibernate.cache.queries = false - -environments { - development { - grails.logging.jul.usebridge = true - grails.serverURL = "http://devt.ala.org.au:8080/specimenbrowser" -// grails.context = '' - } - production { - grails.logging.jul.usebridge = false - // TODO: grails.serverURL = "http://www.changeme.com" - } -} - -// log4j configuration -log4j = { - // Example of changing the log pattern for the default console appender: - // - //appenders { - // console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n') - //} - - error 'org.codehaus.groovy.grails.web.servlet', // controllers - 'org.codehaus.groovy.grails.web.pages', // GSP - 'org.codehaus.groovy.grails.web.sitemesh', // layouts - 'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping - 'org.codehaus.groovy.grails.web.mapping', // URL mapping - 'org.codehaus.groovy.grails.commons', // core / classloading - 'org.codehaus.groovy.grails.plugins', // plugins - 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration - 'org.springframework', - 'org.hibernate', - 'net.sf.ehcache.hibernate' -} - -// Uncomment and edit the following lines to start using Grails encoding & escaping improvements - -/* remove this line -// GSP settings -grails { - views { - gsp { - encoding = 'UTF-8' - htmlcodec = 'xml' // use xml escaping instead of HTML4 escaping - codecs { - expression = 'html' // escapes values inside null - scriptlet = 'none' // escapes output from scriptlets in GSPs - taglib = 'none' // escapes output from taglibs - staticparts = 'none' // escapes output from static template parts - } - } - // escapes all not-encoded output at final stage of outputting - filteringCodecForContentType { - //'text/html' = 'html' - } - } -} -remove this line */ diff --git a/grails-app/conf/DataSource.groovy b/grails-app/conf/DataSource.groovy deleted file mode 100644 index 3d6b94a..0000000 --- a/grails-app/conf/DataSource.groovy +++ /dev/null @@ -1,2 +0,0 @@ -dataSource { -} diff --git a/grails-app/conf/application.yml b/grails-app/conf/application.yml new file mode 100644 index 0000000..c193a28 --- /dev/null +++ b/grails-app/conf/application.yml @@ -0,0 +1,187 @@ +--- +grails: + profile: web + config: + locations: + - file:///data/specimenbrowser/config/specimenbrowser-config.properties + - file:///data/specimenbrowser/config/specimenbrowser-config.yml + - file:///data/specimenbrowser/config/specimenbrowser-config.groovy + codegen: + defaultPackage: au.org.ala.specimenbrowser + gorm: + reactor: + # Whether to translate GORM events into Reactor events + # Disabled by default for performance reasons + events: false +info: + app: + name: '@info.app.name@' + version: '@info.app.version@' + grailsVersion: '@info.app.grailsVersion@' +spring: + jmx: + unique-names: true + main: + banner-mode: "off" + groovy: + template: + check-template-location: false + devtools: + restart: + additional-exclude: + - '*.gsp' + - '**/*.gsp' + - '*.gson' + - '**/*.gson' + - 'logback.groovy' + - '*.properties' +management: + endpoints: + enabled-by-default: false + +--- +grails: + mime: + disable: + accept: + header: + userAgents: + - Gecko + - WebKit + - Presto + - Trident + types: + all: '*/*' + atom: application/atom+xml + css: text/css + csv: text/csv + form: application/x-www-form-urlencoded + html: + - text/html + - application/xhtml+xml + js: text/javascript + json: + - application/json + - text/json + multipartForm: multipart/form-data + pdf: application/pdf + rss: application/rss+xml + text: text/plain + hal: + - application/hal+json + - application/hal+xml + xml: + - text/xml + - application/xml + urlmapping: + cache: + maxsize: 1000 + controllers: + defaultScope: singleton + converters: + encoding: UTF-8 + views: + default: + codec: html + gsp: + encoding: UTF-8 + htmlcodec: xml + codecs: + expression: html + scriptlet: html + taglib: none + staticparts: none +management: + endpoints: + jmx: + unique-names: true + +--- +hibernate: + cache: + queries: false + use_second_level_cache: false + use_query_cache: false +dataSource: + pooled: true + jmxExport: true + driverClassName: org.h2.Driver + username: sa + password: '' + +environments: + development: + dataSource: + dbCreate: create-drop + url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE + test: + dataSource: + dbCreate: update + url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE + production: + dataSource: + dbCreate: none + url: jdbc:h2:./prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE + properties: + jmxEnabled: true + initialSize: 5 + maxActive: 50 + minIdle: 5 + maxIdle: 25 + maxWait: 10000 + maxAge: 600000 + timeBetweenEvictionRunsMillis: 5000 + minEvictableIdleTimeMillis: 60000 + validationQuery: SELECT 1 + validationQueryTimeout: 3 + validationInterval: 15000 + testOnBorrow: true + testWhileIdle: true + testOnReturn: false + jdbcInterceptors: ConnectionState + defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED +--- +grails: + serverURL: https://specimens.ala.org.au +bie: + baseURL: https://bie.ala.org.au + searchPath: /search +biocache: + baseURL: https://biocache.ala.org.au + servicesUrl: https://biocache-ws.ala.org.au/ws/ +collectory: + baseURL: https://collections.ala.org.au + servicesUrl: https://collections.ala.org.au/ws/ + resourceMapping: + - prefix: dr + path: dataResource + - prefix: co + path: collection + - prefix: in + path: institution + - prefix: dh + path: dataHub + - prefix: dp + path: dataProvider +spatial: + baseURL: https://spatial.ala.org.au +ala: + baseURL: https://www.ala.org.au + image: + service: + url: https://images.ala.org.au +security: + cas: + appServerName: https://specimens.ala.org.au + casServerName: https://auth.ala.org.au + uriFilterPattern: /admin.*,/alaAdmin.* +skin: + layout: main + fluidLayout: true + orgNameLong: Atlas of Living Australia +specimenbrowser: + data: + url: file:///data/specimenbrowser/config/data.json +headerAndFooter: + baseURL: https://www.ala.org.au/commonui-bs3-2019 + version: 2 diff --git a/grails-app/conf/logback.groovy b/grails-app/conf/logback.groovy new file mode 100644 index 0000000..b835215 --- /dev/null +++ b/grails-app/conf/logback.groovy @@ -0,0 +1,37 @@ +import grails.util.BuildSettings +import grails.util.Environment +import org.springframework.boot.logging.logback.ColorConverter +import org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter + +import java.nio.charset.StandardCharsets + +conversionRule 'clr', ColorConverter +conversionRule 'wex', WhitespaceThrowableProxyConverter + +// See http://logback.qos.ch/manual/groovy.html for details on configuration +appender('STDOUT', ConsoleAppender) { + encoder(PatternLayoutEncoder) { + charset = StandardCharsets.UTF_8 + + pattern = + '%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} ' + // Date + '%clr(%5p) ' + // Log level + '%clr(---){faint} %clr([%15.15t]){faint} ' + // Thread + '%clr(%-40.40logger{39}){cyan} %clr(:){faint} ' + // Logger + '%m%n%wex' // Message + } +} + +def targetDir = BuildSettings.TARGET_DIR +if (Environment.isDevelopmentMode() && targetDir != null) { + appender("FULL_STACKTRACE", FileAppender) { + file = "${targetDir}/stacktrace.log" + append = true + encoder(PatternLayoutEncoder) { + charset = StandardCharsets.UTF_8 + pattern = "%level %logger - %msg%n" + } + } + logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false) +} +root(ERROR, ['STDOUT']) diff --git a/grails-app/controllers/au/org/ala/specimenbrowser/AdminController.groovy b/grails-app/controllers/au/org/ala/specimenbrowser/AdminController.groovy index 4b39620..d109554 100644 --- a/grails-app/controllers/au/org/ala/specimenbrowser/AdminController.groovy +++ b/grails-app/controllers/au/org/ala/specimenbrowser/AdminController.groovy @@ -1,61 +1,19 @@ package au.org.ala.specimenbrowser -import grails.util.Environment -import org.springframework.core.io.support.PathMatchingResourcePatternResolver +import au.org.ala.web.AlaSecured +import au.org.ala.web.CASRoles +@AlaSecured(CASRoles.ROLE_ADMIN) class AdminController { + def resourceService def index() {} - def tools() {} - def counts() {} - - def settings() { - def settings = [] - def config = grailsApplication.config.flatten() - ['ala.baseURL','grails.serverURL','grails.config.locations','collectory.baseURL', - 'headerAndFooter.baseURL','biocacheServicesUrl','collectory.servicesURL' - ].each { - settings << [key: it, value: config[it], comment: ''] - } - [settings: settings] - } - def reloadConfig = { - // clear any cached external config - //cacheService.clear() - - // reload system config - def resolver = new PathMatchingResourcePatternResolver() - def resource = resolver.getResource(grailsApplication.config.reloadable.cfgs[0]) - def stream = null + def counts() {} - try { - stream = resource.getInputStream() - ConfigSlurper configSlurper = new ConfigSlurper(Environment.current.name) - if(resource.filename.endsWith('.groovy')) { - def newConfig = configSlurper.parse(stream.text) - grailsApplication.getConfig().merge(newConfig) - } - else if(resource.filename.endsWith('.properties')) { - def props = new Properties() - props.load(stream) - def newConfig = configSlurper.parse(props) - grailsApplication.getConfig().merge(newConfig) - } - flash.message = "Config reloaded from ${grailsApplication.config.reloadable.cfgs[0]}." - render 'done' - } - catch (FileNotFoundException fnf) { - println "No external config to reload configuration. Looking for ${grailsApplication.config.reloadable.cfgs[0]}" - render "No external config to reload configuration. Looking for ${grailsApplication.config.reloadable.cfgs[0]}" - } - catch (Exception gre) { - println "Unable to reload configuration. Please correct problem and try again: " + gre.getMessage() - render "Unable to reload configuration - " + gre.getMessage() - } - finally { - stream?.close() - } + def reloadResources() { + resourceService.buildResources() + flash.message = "Resource configuration reloaded" + redirect controller: 'admin', action: 'index' } - } diff --git a/grails-app/controllers/au/org/ala/specimenbrowser/ViewController.groovy b/grails-app/controllers/au/org/ala/specimenbrowser/ViewController.groovy index f1f910e..9ffe2fe 100644 --- a/grails-app/controllers/au/org/ala/specimenbrowser/ViewController.groovy +++ b/grails-app/controllers/au/org/ala/specimenbrowser/ViewController.groovy @@ -1,24 +1,17 @@ package au.org.ala.specimenbrowser -import grails.converters.JSON +import grails.config.Config +import grails.core.support.GrailsConfigurationAware import groovy.json.JsonOutput import groovy.json.JsonSlurper -class ViewController { +class ViewController implements GrailsConfigurationAware { + def resourceService - def grailsApplication + URL biocacheServicesUrl def homePage(){ - def collectionsData = [] - def md = new File("/data/specimenbrowser/config/data.json")?.text - def js = new JsonSlurper() - def collectionsToRender = js.parseText(md) - collectionsToRender.each { collection -> - def collectionMetadata = js.parseText(new URL(grailsApplication.config.collectory.servicesURL + "/collection/" + collection.uid).text) - collectionMetadata.put("displayCollectionImage", collection.imageUrl) - collectionsData << collectionMetadata - } - [collectionsData: collectionsData] + [collectionsData: resourceService.resources] } def view(String id, String recordId) { @@ -27,31 +20,37 @@ class ViewController { def auxData(){ def js = new JsonSlurper() - def json = js.parseText(new URL(grailsApplication.config.biocacheServicesUrl + "/occurrence/" + params.recordId).text) - def title = "Collection: " + json.processed.attribution.collectionName - def data = [ - "Scientific name": json.raw.classification.scientificName, - "Type status": json.raw.identification.typeStatus?:"", - "Catalog Number": json.raw.occurrence.catalogNumber?:"", - "Preparations": json.raw.occurrence.preparations?:"", - "Sex": json.raw.occurrence.sex?:"", - "Recorded by": json.raw.occurrence.recordedBy?:"", - "Photographer": json.raw.occurrence.photographer?:"", - "State": json.processed.location.stateProvince?:"", - "Country": json.processed.location.country?:"" - ] + def json = js.parse(new URL(biocacheServicesUrl, "occurrence/" + params.recordId)) + def data = [:] + def title + if (!json) { + title = "Unable to retrieve specimen data" + } else { + title = "Collection: " + json.processed.attribution.collectionName + data = [ + "Scientific name": json.raw.classification.scientificName, + "Type status" : json.raw.identification.typeStatus ?: "", + "Catalog Number" : json.raw.occurrence.catalogNumber ?: "", + "Preparations" : json.raw.occurrence.preparations ?: "", + "Sex" : json.raw.occurrence.sex ?: "", + "Recorded by" : json.raw.occurrence.recordedBy ?: "", + "Photographer" : json.raw.occurrence.photographer ?: "", + "State" : json.processed.location.stateProvince ?: "", + "Country" : json.processed.location.country ?: "" + ] - if(json.processed.location.decimalLatitude && json.processed.location.decimalLongitude){ - data.put("Coordinates", json.processed.location.decimalLatitude + " " + json.processed.location.decimalLongitude) - } - if(json.raw.location.locality){ - data.put("Locality", json.raw.location.locality) - } - if(json.processed.location.stateProvince){ - data.put("State", json.processed.location.stateProvince) - } - if(json.processed.location.country){ - data.put("Country", json.processed.location.country) + if (json.processed.location.decimalLatitude && json.processed.location.decimalLongitude) { + data.put("Coordinates", json.processed.location.decimalLatitude + " " + json.processed.location.decimalLongitude) + } + if (json.raw.location.locality) { + data.put("Locality", json.raw.location.locality) + } + if (json.processed.location.stateProvince) { + data.put("State", json.processed.location.stateProvince) + } + if (json.processed.location.country) { + data.put("Country", json.processed.location.country) + } } def model = [title:title, data:data, link:grailsApplication.config.biocache.baseURL + "/occurrence/" + params.recordId, linkText:"View full record details"] @@ -63,4 +62,9 @@ class ViewController { response.setContentType("application/json") render output } + + @Override + void setConfiguration(Config config) { + biocacheServicesUrl = new URL(config.getRequiredProperty("biocache.servicesUrl")) + } } diff --git a/grails-app/conf/UrlMappings.groovy b/grails-app/controllers/specimenbrowser/UrlMappings.groovy similarity index 57% rename from grails-app/conf/UrlMappings.groovy rename to grails-app/controllers/specimenbrowser/UrlMappings.groovy index d926e15..4c20d7a 100644 --- a/grails-app/conf/UrlMappings.groovy +++ b/grails-app/controllers/specimenbrowser/UrlMappings.groovy @@ -1,7 +1,8 @@ -class UrlMappings { +package specimenbrowser - static mappings = { +class UrlMappings { + static mappings = { "/browse/$id?"{ controller = 'browse' action = 'index' @@ -15,15 +16,17 @@ class UrlMappings { } } - "/$controller/$action?/$id?"{ - constraints { - // apply constraints here - } - } - "/"(controller: 'view', action: 'homePage') - "/auxData/$recordId"(controller: 'view', action: 'auxData') + "/"(controller: 'view', action: 'homePage') + "/view/auxData/$recordId"(controller: 'view', action: 'auxData') "/view/$id"(controller: 'view', action: 'view') - "500"(view:'/error') - } + "/$controller/$action?/$id?"{ + constraints { + // apply constraints here + } + } + + "500"(view:'/error') + "404"(view:'/notFound') + } } diff --git a/grails-app/i18n/messages.properties b/grails-app/i18n/messages.properties index 0c9d7ee..b045136 100644 --- a/grails-app/i18n/messages.properties +++ b/grails-app/i18n/messages.properties @@ -53,3 +53,4 @@ typeMismatch.java.lang.Long=Property {0} must be a valid number typeMismatch.java.lang.Short=Property {0} must be a valid number typeMismatch.java.math.BigDecimal=Property {0} must be a valid number typeMismatch.java.math.BigInteger=Property {0} must be a valid number +typeMismatch=Property {0} is type-mismatched diff --git a/grails-app/i18n/messages_cs_CZ.properties b/grails-app/i18n/messages_cs_CZ.properties deleted file mode 100644 index c617dca..0000000 --- a/grails-app/i18n/messages_cs_CZ.properties +++ /dev/null @@ -1,55 +0,0 @@ -default.doesnt.match.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neodpovídá požadovanému vzoru [{3}] -default.invalid.url.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní URL -default.invalid.creditCard.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní číslo kreditní karty -default.invalid.email.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní emailová adresa -default.invalid.range.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] -default.invalid.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] -default.invalid.max.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální povolenou hodnotu [{3}] -default.invalid.min.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální povolená hodnota [{3}] -default.invalid.max.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální velikost [{3}] -default.invalid.min.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální velikost [{3}] -default.invalid.validator.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neprošla validací -default.not.inlist.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není obsažena v seznamu [{3}] -default.blank.message=Položka [{0}] třídy [{1}] nemůže být prázdná -default.not.equal.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] nemůže být stejná jako [{3}] -default.null.message=Položka [{0}] třídy [{1}] nemůže být prázdná -default.not.unique.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] musí být unikátní - -default.paginate.prev=Předcházející -default.paginate.next=Následující -default.boolean.true=Pravda -default.boolean.false=Nepravda -default.date.format=dd. MM. yyyy HH:mm:ss z -default.number.format=0 - -default.created.message={0} {1} vytvořeno -default.updated.message={0} {1} aktualizováno -default.deleted.message={0} {1} smazáno -default.not.deleted.message={0} {1} nelze smazat -default.not.found.message={0} nenalezen s id {1} -default.optimistic.locking.failure=Jiný uživatel aktualizoval záznam {0}, právě když byl vámi editován - -default.home.label=Domů -default.list.label={0} Seznam -default.add.label=Přidat {0} -default.new.label=Nový {0} -default.create.label=Vytvořit {0} -default.show.label=Ukázat {0} -default.edit.label=Editovat {0} - -default.button.create.label=Vytvoř -default.button.edit.label=Edituj -default.button.update.label=Aktualizuj -default.button.delete.label=Smaž -default.button.delete.confirm.message=Jste si jistý? - -# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) -typeMismatch.java.net.URL=Položka {0} musí být validní URL -typeMismatch.java.net.URI=Položka {0} musí být validní URI -typeMismatch.java.util.Date=Položka {0} musí být validní datum -typeMismatch.java.lang.Double=Položka {0} musí být validní desetinné číslo -typeMismatch.java.lang.Integer=Položka {0} musí být validní číslo -typeMismatch.java.lang.Long=Položka {0} musí být validní číslo -typeMismatch.java.lang.Short=Položka {0} musí být validní číslo -typeMismatch.java.math.BigDecimal=Položka {0} musí být validní číslo -typeMismatch.java.math.BigInteger=Položka {0} musí být validní číslo \ No newline at end of file diff --git a/grails-app/i18n/messages_de.properties b/grails-app/i18n/messages_de.properties index a942358..0f7bfe9 100644 --- a/grails-app/i18n/messages_de.properties +++ b/grails-app/i18n/messages_de.properties @@ -1,55 +1,55 @@ -default.doesnt.match.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] entspricht nicht dem vorgegebenen Muster [{3}] -default.invalid.url.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige URL -default.invalid.creditCard.message=Das Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige Kreditkartennummer -default.invalid.email.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige E-Mail Adresse -default.invalid.range.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] -default.invalid.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] -default.invalid.max.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist größer als der Höchstwert von [{3}] -default.invalid.min.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist kleiner als der Mindestwert von [{3}] -default.invalid.max.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] übersteigt den Höchstwert von [{3}] -default.invalid.min.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] unterschreitet den Mindestwert von [{3}] -default.invalid.validator.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist ungültig -default.not.inlist.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht in der Liste [{3}] enthalten. -default.blank.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht leer sein -default.not.equal.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nicht gleich [{3}] sein -default.null.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein -default.not.unique.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nur einmal vorkommen - -default.paginate.prev=Vorherige -default.paginate.next=Nächste -default.boolean.true=Wahr -default.boolean.false=Falsch -default.date.format=dd.MM.yyyy HH:mm:ss z -default.number.format=0 - -default.created.message={0} {1} wurde angelegt -default.updated.message={0} {1} wurde geändert -default.deleted.message={0} {1} wurde gelöscht -default.not.deleted.message={0} {1} konnte nicht gelöscht werden -default.not.found.message={0} mit der id {1} wurde nicht gefunden -default.optimistic.locking.failure=Ein anderer Benutzer hat das {0} Object geändert während Sie es bearbeitet haben - -default.home.label=Home -default.list.label={0} Liste -default.add.label={0} hinzufügen -default.new.label={0} anlegen -default.create.label={0} anlegen -default.show.label={0} anzeigen -default.edit.label={0} bearbeiten - -default.button.create.label=Anlegen -default.button.edit.label=Bearbeiten -default.button.update.label=Aktualisieren -default.button.delete.label=Löschen -default.button.delete.confirm.message=Sind Sie sicher? - -# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) -typeMismatch.java.net.URL=Die Eigenschaft {0} muss eine gültige URL sein -typeMismatch.java.net.URI=Die Eigenschaft {0} muss eine gültige URI sein -typeMismatch.java.util.Date=Die Eigenschaft {0} muss ein gültiges Datum sein -typeMismatch.java.lang.Double=Die Eigenschaft {0} muss eine gültige Zahl sein -typeMismatch.java.lang.Integer=Die Eigenschaft {0} muss eine gültige Zahl sein -typeMismatch.java.lang.Long=Die Eigenschaft {0} muss eine gültige Zahl sein -typeMismatch.java.lang.Short=Die Eigenschaft {0} muss eine gültige Zahl sein -typeMismatch.java.math.BigDecimal=Die Eigenschaft {0} muss eine gültige Zahl sein -typeMismatch.java.math.BigInteger=Die Eigenschaft {0} muss eine gültige Zahl sein \ No newline at end of file +default.doesnt.match.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] entspricht nicht dem vorgegebenen Muster [{3}] +default.invalid.url.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige URL +default.invalid.creditCard.message=Das Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige Kreditkartennummer +default.invalid.email.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige E-Mail Adresse +default.invalid.range.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] +default.invalid.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] +default.invalid.max.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist größer als der Höchstwert von [{3}] +default.invalid.min.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist kleiner als der Mindestwert von [{3}] +default.invalid.max.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] übersteigt den Höchstwert von [{3}] +default.invalid.min.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] unterschreitet den Mindestwert von [{3}] +default.invalid.validator.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist ungültig +default.not.inlist.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht in der Liste [{3}] enthalten. +default.blank.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht leer sein +default.not.equal.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nicht gleich [{3}] sein +default.null.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein +default.not.unique.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nur einmal vorkommen + +default.paginate.prev=Vorherige +default.paginate.next=Nächste +default.boolean.true=Wahr +default.boolean.false=Falsch +default.date.format=dd.MM.yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} wurde angelegt +default.updated.message={0} {1} wurde geändert +default.deleted.message={0} {1} wurde gelöscht +default.not.deleted.message={0} {1} konnte nicht gelöscht werden +default.not.found.message={0} mit der id {1} wurde nicht gefunden +default.optimistic.locking.failure=Ein anderer Benutzer hat das {0} Object geändert während Sie es bearbeitet haben + +default.home.label=Home +default.list.label={0} Liste +default.add.label={0} hinzufügen +default.new.label={0} anlegen +default.create.label={0} anlegen +default.show.label={0} anzeigen +default.edit.label={0} bearbeiten + +default.button.create.label=Anlegen +default.button.edit.label=Bearbeiten +default.button.update.label=Aktualisieren +default.button.delete.label=Löschen +default.button.delete.confirm.message=Sind Sie sicher? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=Die Eigenschaft {0} muss eine gültige URL sein +typeMismatch.java.net.URI=Die Eigenschaft {0} muss eine gültige URI sein +typeMismatch.java.util.Date=Die Eigenschaft {0} muss ein gültiges Datum sein +typeMismatch.java.lang.Double=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Integer=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Long=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.lang.Short=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.math.BigDecimal=Die Eigenschaft {0} muss eine gültige Zahl sein +typeMismatch.java.math.BigInteger=Die Eigenschaft {0} muss eine gültige Zahl sein diff --git a/grails-app/i18n/messages_fr.properties b/grails-app/i18n/messages_fr.properties index b1d665c..5572164 100644 --- a/grails-app/i18n/messages_fr.properties +++ b/grails-app/i18n/messages_fr.properties @@ -1,19 +1,19 @@ -default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] -default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide -default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide -default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide -default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] -default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] -default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] -default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] -default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] -default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] -default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide -default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] -default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide -default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] -default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle -default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique - -default.paginate.prev=Précédent -default.paginate.next=Suivant +default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] +default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide +default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide +default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide +default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] +default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] +default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] +default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] +default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] +default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] +default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide +default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] +default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide +default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] +default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle +default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique + +default.paginate.prev=Précédent +default.paginate.next=Suivant diff --git a/grails-app/i18n/messages_it.properties b/grails-app/i18n/messages_it.properties index 462ec1c..a90f1c7 100644 --- a/grails-app/i18n/messages_it.properties +++ b/grails-app/i18n/messages_it.properties @@ -1,55 +1,55 @@ -default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] -default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido -default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido -default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido -default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] -default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] -default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] -default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] -default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] -default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] -default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida -default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] -default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota -default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] -default.null.message=La proprietà [{0}] della classe [{1}] non può essere null -default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica - -default.paginate.prev=Precedente -default.paginate.next=Successivo -default.boolean.true=Vero -default.boolean.false=Falso -default.date.format=dd/MM/yyyy HH:mm:ss z -default.number.format=0 - -default.created.message={0} {1} creato -default.updated.message={0} {1} aggiornato -default.deleted.message={0} {1} eliminato -default.not.deleted.message={0} {1} non può essere eliminato -default.not.found.message={0} non trovato con id {1} -default.optimistic.locking.failure=Un altro utente ha aggiornato questo {0} mentre si era in modifica - -default.home.label=Home -default.list.label={0} Elenco -default.add.label=Aggiungi {0} -default.new.label=Nuovo {0} -default.create.label=Crea {0} -default.show.label=Mostra {0} -default.edit.label=Modifica {0} - -default.button.create.label=Crea -default.button.edit.label=Modifica -default.button.update.label=Aggiorna -default.button.delete.label=Elimina -default.button.delete.confirm.message=Si è sicuri? - -# Data binding errors. Usa "typeMismatch.$className.$propertyName per la personalizzazione (es typeMismatch.Book.author) -typeMismatch.java.net.URL=La proprietà {0} deve essere un URL valido -typeMismatch.java.net.URI=La proprietà {0} deve essere un URI valido -typeMismatch.java.util.Date=La proprietà {0} deve essere una data valida -typeMismatch.java.lang.Double=La proprietà {0} deve essere un numero valido -typeMismatch.java.lang.Integer=La proprietà {0} deve essere un numero valido -typeMismatch.java.lang.Long=La proprietà {0} deve essere un numero valido -typeMismatch.java.lang.Short=La proprietà {0} deve essere un numero valido -typeMismatch.java.math.BigDecimal=La proprietà {0} deve essere un numero valido -typeMismatch.java.math.BigInteger=La proprietà {0} deve essere un numero valido +default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] +default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido +default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido +default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido +default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] +default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] +default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] +default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] +default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] +default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] +default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida +default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] +default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota +default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] +default.null.message=La proprietà [{0}] della classe [{1}] non può essere null +default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica + +default.paginate.prev=Precedente +default.paginate.next=Successivo +default.boolean.true=Vero +default.boolean.false=Falso +default.date.format=dd/MM/yyyy HH:mm:ss z +default.number.format=0 + +default.created.message={0} {1} creato +default.updated.message={0} {1} aggiornato +default.deleted.message={0} {1} eliminato +default.not.deleted.message={0} {1} non può essere eliminato +default.not.found.message={0} non trovato con id {1} +default.optimistic.locking.failure=Un altro utente ha aggiornato questo {0} mentre si era in modifica + +default.home.label=Home +default.list.label={0} Elenco +default.add.label=Aggiungi {0} +default.new.label=Nuovo {0} +default.create.label=Crea {0} +default.show.label=Mostra {0} +default.edit.label=Modifica {0} + +default.button.create.label=Crea +default.button.edit.label=Modifica +default.button.update.label=Aggiorna +default.button.delete.label=Elimina +default.button.delete.confirm.message=Si è sicuri? + +# Data binding errors. Usa "typeMismatch.$className.$propertyName per la personalizzazione (es typeMismatch.Book.author) +typeMismatch.java.net.URL=La proprietà {0} deve essere un URL valido +typeMismatch.java.net.URI=La proprietà {0} deve essere un URI valido +typeMismatch.java.util.Date=La proprietà {0} deve essere una data valida +typeMismatch.java.lang.Double=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Integer=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Long=La proprietà {0} deve essere un numero valido +typeMismatch.java.lang.Short=La proprietà {0} deve essere un numero valido +typeMismatch.java.math.BigDecimal=La proprietà {0} deve essere un numero valido +typeMismatch.java.math.BigInteger=La proprietà {0} deve essere un numero valido diff --git a/grails-app/i18n/messages_ja.properties b/grails-app/i18n/messages_ja.properties index b5e4d18..d9e9b78 100644 --- a/grails-app/i18n/messages_ja.properties +++ b/grails-app/i18n/messages_ja.properties @@ -1,55 +1,55 @@ -default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 -default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なURLではありません。 -default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なクレジットカード番号ではありません。 -default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なメールアドレスではありません。 -default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 -default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 -default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 -default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 -default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 -default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 -default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 -default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 -default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 -default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]と同等ではありません。 -default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 -default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 - -default.paginate.prev=戻る -default.paginate.next=次へ -default.boolean.true=はい -default.boolean.false=いいえ -default.date.format=yyyy/MM/dd HH:mm:ss z -default.number.format=0 - -default.created.message={0}(id:{1})を作成しました。 -default.updated.message={0}(id:{1})を更新しました。 -default.deleted.message={0}(id:{1})を削除しました。 -default.not.deleted.message={0}(id:{1})は削除できませんでした。 -default.not.found.message={0}(id:{1})は見つかりませんでした。 -default.optimistic.locking.failure=この{0}は編集中に他のユーザによって先に更新されています。 - -default.home.label=ホーム -default.list.label={0}リスト -default.add.label={0}を追加 -default.new.label={0}を新規作成 -default.create.label={0}を作成 -default.show.label={0}詳細 -default.edit.label={0}を編集 - -default.button.create.label=作成 -default.button.edit.label=編集 -default.button.update.label=更新 -default.button.delete.label=削除 -default.button.delete.confirm.message=本当に削除してよろしいですか? - -# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) -typeMismatch.java.net.URL={0}は有効なURLでなければなりません。 -typeMismatch.java.net.URI={0}は有効なURIでなければなりません。 -typeMismatch.java.util.Date={0}は有効な日付でなければなりません。 -typeMismatch.java.lang.Double={0}は有効な数値でなければなりません。 -typeMismatch.java.lang.Integer={0}は有効な数値でなければなりません。 -typeMismatch.java.lang.Long={0}は有効な数値でなければなりません。 -typeMismatch.java.lang.Short={0}は有効な数値でなければなりません。 -typeMismatch.java.math.BigDecimal={0}は有効な数値でなければなりません。 -typeMismatch.java.math.BigInteger={0}は有効な数値でなければなりません。 +default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 +default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なURLではありません。 +default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なクレジットカード番号ではありません。 +default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なメールアドレスではありません。 +default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 +default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 +default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 +default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 +default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 +default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 +default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 +default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 +default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 +default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]に[{3}]は許可されません。 +default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 +default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 + +default.paginate.prev=戻る +default.paginate.next=次へ +default.boolean.true=はい +default.boolean.false=いいえ +default.date.format=yyyy/MM/dd HH:mm:ss z +default.number.format=0 + +default.created.message={0}(id:{1})を作成しました。 +default.updated.message={0}(id:{1})を更新しました。 +default.deleted.message={0}(id:{1})を削除しました。 +default.not.deleted.message={0}(id:{1})は削除できませんでした。 +default.not.found.message={0}(id:{1})は見つかりませんでした。 +default.optimistic.locking.failure=この{0}は編集中に他のユーザによって先に更新されています。 + +default.home.label=ホーム +default.list.label={0}リスト +default.add.label={0}を追加 +default.new.label={0}を新規作成 +default.create.label={0}を作成 +default.show.label={0}詳細 +default.edit.label={0}を編集 + +default.button.create.label=作成 +default.button.edit.label=編集 +default.button.update.label=更新 +default.button.delete.label=削除 +default.button.delete.confirm.message=本当に削除してよろしいですか? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL={0}は有効なURLでなければなりません。 +typeMismatch.java.net.URI={0}は有効なURIでなければなりません。 +typeMismatch.java.util.Date={0}は有効な日付でなければなりません。 +typeMismatch.java.lang.Double={0}は有効な数値でなければなりません。 +typeMismatch.java.lang.Integer={0}は有効な数値でなければなりません。 +typeMismatch.java.lang.Long={0}は有効な数値でなければなりません。 +typeMismatch.java.lang.Short={0}は有効な数値でなければなりません。 +typeMismatch.java.math.BigDecimal={0}は有効な数値でなければなりません。 +typeMismatch.java.math.BigInteger={0}は有効な数値でなければなりません。 diff --git a/grails-app/i18n/messages_pt_BR.properties b/grails-app/i18n/messages_pt_BR.properties index 0c368f2..b5044e2 100644 --- a/grails-app/i18n/messages_pt_BR.properties +++ b/grails-app/i18n/messages_pt_BR.properties @@ -8,7 +8,7 @@ default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2 default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] -default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapass o valor máximo [{3}] +default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] @@ -16,7 +16,7 @@ default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2} default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] -default.null.message=O campo [{0}] da classe [{1}] não pode ser vazia +default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único default.paginate.prev=Anterior @@ -30,7 +30,7 @@ default.created.message={0} {1} criado default.updated.message={0} {1} atualizado default.deleted.message={0} {1} removido default.not.deleted.message={0} {1} não pode ser removido -default.not.found.message={0} não foi encontrado com id {1} +default.not.found.message={0} não foi encontrado com o id {1} default.optimistic.locking.failure=Outro usuário atualizou este [{0}] enquanto você tentou salvá-lo default.home.label=Principal @@ -56,4 +56,4 @@ typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. -typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. \ No newline at end of file +typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. diff --git a/grails-app/i18n/messages_pt_PT.properties b/grails-app/i18n/messages_pt_PT.properties index 43a6416..a386070 100644 --- a/grails-app/i18n/messages_pt_PT.properties +++ b/grails-app/i18n/messages_pt_PT.properties @@ -1,34 +1,34 @@ -# -# translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com -# - -default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] -default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido -default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito -default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. -default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] -default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] -default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] -default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] -default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] -default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] -default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação -default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] -default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio -default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] -default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio -default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único - -default.paginate.prev=Anterior -default.paginate.next=Próximo - -# Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) -typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. -typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. -typeMismatch.java.util.Date=O campo {0} deve ser uma data válida -typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. -typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. -typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. -typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. -typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. -typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. +# +# translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com +# + +default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] +default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido +default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito +default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. +default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] +default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] +default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] +default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] +default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] +default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] +default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação +default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] +default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio +default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] +default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio +default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único + +default.paginate.prev=Anterior +default.paginate.next=Próximo + +# Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) +typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. +typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. +typeMismatch.java.util.Date=O campo {0} deve ser uma data válida +typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. +typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. +typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. +typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. diff --git a/grails-app/i18n/messages_ru.properties b/grails-app/i18n/messages_ru.properties index 02239db..53a4bdc 100644 --- a/grails-app/i18n/messages_ru.properties +++ b/grails-app/i18n/messages_ru.properties @@ -1,31 +1,31 @@ -default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] -default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом -default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты -default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом -default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] -default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] -default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] -default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] -default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] -default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] -default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо -default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] -default.blank.message=Поле [{0}] класса [{1}] не может быть пустым -default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] -default.null.message=Поле [{0}] класса [{1}] не может иметь значение null -default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным - -default.paginate.prev=Предыдушая страница -default.paginate.next=Следующая страница - -# Ошибки при присвоении данных. Для точной настройки для полей классов используйте -# формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) -typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL -typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI -typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой -typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом -typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом -typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом -typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом -typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом -typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом +default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] +default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом +default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты +default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом +default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] +default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] +default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] +default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] +default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] +default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] +default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо +default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] +default.blank.message=Поле [{0}] класса [{1}] не может быть пустым +default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] +default.null.message=Поле [{0}] класса [{1}] не может иметь значение null +default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным + +default.paginate.prev=Предыдушая страница +default.paginate.next=Следующая страница + +# Ошибки при присвоении данных. Для точной настройки для полей классов используйте +# формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) +typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL +typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI +typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой +typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом +typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом +typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом +typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом +typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом +typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом diff --git a/grails-app/i18n/messages_th.properties b/grails-app/i18n/messages_th.properties index 4f4076d..fd0dbb6 100644 --- a/grails-app/i18n/messages_th.properties +++ b/grails-app/i18n/messages_th.properties @@ -1,55 +1,55 @@ -default.doesnt.match.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบที่กำหนดไว้ใน [{3}] -default.invalid.url.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบ URL -default.invalid.creditCard.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบหมายเลขบัตรเครดิต -default.invalid.email.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบอีเมล์ -default.invalid.range.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีค่าที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] -default.invalid.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีขนาดที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] -default.invalid.max.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าเกิดกว่าค่ามากสุด [{3}] -default.invalid.min.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าน้อยกว่าค่าต่ำสุด [{3}] -default.invalid.max.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดเกินกว่าขนาดมากสุดของ [{3}] -default.invalid.min.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดต่ำกว่าขนาดต่ำสุดของ [{3}] -default.invalid.validator.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ผ่านการทวนสอบค่าที่ตั้งขึ้น -default.not.inlist.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้อยู่ในรายการต่อไปนี้ [{3}] -default.blank.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็นค่าว่างได้ -default.not.equal.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่สามารถเท่ากับ [{3}] ได้ -default.null.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็น null ได้ -default.not.unique.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] จะต้องไม่ซ้ำ (unique) - -default.paginate.prev=ก่อนหน้า -default.paginate.next=ถัดไป -default.boolean.true=จริง -default.boolean.false=เท็จ -default.date.format=dd-MM-yyyy HH:mm:ss z -default.number.format=0 - -default.created.message=สร้าง {0} {1} เรียบร้อยแล้ว -default.updated.message=ปรับปรุง {0} {1} เรียบร้อยแล้ว -default.deleted.message=ลบ {0} {1} เรียบร้อยแล้ว -default.not.deleted.message=ไม่สามารถลบ {0} {1} -default.not.found.message=ไม่พบ {0} ด้วย id {1} นี้ -default.optimistic.locking.failure=มีผู้ใช้ท่านอื่นปรับปรุง {0} ขณะที่คุณกำลังแก้ไขข้อมูลอยู่ - -default.home.label=หน้าแรก -default.list.label=รายการ {0} -default.add.label=เพิ่ม {0} -default.new.label=สร้าง {0} ใหม่ -default.create.label=สร้าง {0} -default.show.label=แสดง {0} -default.edit.label=แก้ไข {0} - -default.button.create.label=สร้าง -default.button.edit.label=แก้ไข -default.button.update.label=ปรับปรุง -default.button.delete.label=ลบ -default.button.delete.confirm.message=คุณแน่ใจหรือไม่ ? - -# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) -typeMismatch.java.net.URL=คุณสมบัติ '{0}' จะต้องเป็นค่า URL ที่ถูกต้อง -typeMismatch.java.net.URI=คุณสมบัติ '{0}' จะต้องเป็นค่า URI ที่ถูกต้อง -typeMismatch.java.util.Date=คุณสมบัติ '{0}' จะต้องมีค่าเป็นวันที่ -typeMismatch.java.lang.Double=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Double -typeMismatch.java.lang.Integer=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Integer -typeMismatch.java.lang.Long=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Long -typeMismatch.java.lang.Short=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Short -typeMismatch.java.math.BigDecimal=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigDecimal -typeMismatch.java.math.BigInteger=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigInteger +default.doesnt.match.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบที่กำหนดไว้ใน [{3}] +default.invalid.url.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบ URL +default.invalid.creditCard.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบหมายเลขบัตรเครดิต +default.invalid.email.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบอีเมล์ +default.invalid.range.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีค่าที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] +default.invalid.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีขนาดที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] +default.invalid.max.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าเกิดกว่าค่ามากสุด [{3}] +default.invalid.min.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าน้อยกว่าค่าต่ำสุด [{3}] +default.invalid.max.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดเกินกว่าขนาดมากสุดของ [{3}] +default.invalid.min.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดต่ำกว่าขนาดต่ำสุดของ [{3}] +default.invalid.validator.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ผ่านการทวนสอบค่าที่ตั้งขึ้น +default.not.inlist.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้อยู่ในรายการต่อไปนี้ [{3}] +default.blank.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็นค่าว่างได้ +default.not.equal.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่สามารถเท่ากับ [{3}] ได้ +default.null.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็น null ได้ +default.not.unique.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] จะต้องไม่ซ้ำ (unique) + +default.paginate.prev=ก่อนหน้า +default.paginate.next=ถัดไป +default.boolean.true=จริง +default.boolean.false=เท็จ +default.date.format=dd-MM-yyyy HH:mm:ss z +default.number.format=0 + +default.created.message=สร้าง {0} {1} เรียบร้อยแล้ว +default.updated.message=ปรับปรุง {0} {1} เรียบร้อยแล้ว +default.deleted.message=ลบ {0} {1} เรียบร้อยแล้ว +default.not.deleted.message=ไม่สามารถลบ {0} {1} +default.not.found.message=ไม่พบ {0} ด้วย id {1} นี้ +default.optimistic.locking.failure=มีผู้ใช้ท่านอื่นปรับปรุง {0} ขณะที่คุณกำลังแก้ไขข้อมูลอยู่ + +default.home.label=หน้าแรก +default.list.label=รายการ {0} +default.add.label=เพิ่ม {0} +default.new.label=สร้าง {0} ใหม่ +default.create.label=สร้าง {0} +default.show.label=แสดง {0} +default.edit.label=แก้ไข {0} + +default.button.create.label=สร้าง +default.button.edit.label=แก้ไข +default.button.update.label=ปรับปรุง +default.button.delete.label=ลบ +default.button.delete.confirm.message=คุณแน่ใจหรือไม่ ? + +# Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) +typeMismatch.java.net.URL=คุณสมบัติ '{0}' จะต้องเป็นค่า URL ที่ถูกต้อง +typeMismatch.java.net.URI=คุณสมบัติ '{0}' จะต้องเป็นค่า URI ที่ถูกต้อง +typeMismatch.java.util.Date=คุณสมบัติ '{0}' จะต้องมีค่าเป็นวันที่ +typeMismatch.java.lang.Double=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Double +typeMismatch.java.lang.Integer=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Integer +typeMismatch.java.lang.Long=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Long +typeMismatch.java.lang.Short=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Short +typeMismatch.java.math.BigDecimal=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigDecimal +typeMismatch.java.math.BigInteger=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigInteger diff --git a/grails-app/i18n/messages_zh_CN.properties b/grails-app/i18n/messages_zh_CN.properties index 782580b..b89bc93 100644 --- a/grails-app/i18n/messages_zh_CN.properties +++ b/grails-app/i18n/messages_zh_CN.properties @@ -1,18 +1,18 @@ -default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A -default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D -default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 -default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 -default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 -default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 -default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F -default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F -default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) -default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) -default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL -default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 -default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 -default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 -default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 -default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull -default.paginate.next=\u4E0B\u9875 -default.paginate.prev=\u4E0A\u9875 +default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A +default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D +default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 +default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 +default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 +default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 +default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F +default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F +default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) +default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) +default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL +default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 +default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 +default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 +default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 +default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull +default.paginate.next=\u4E0B\u9875 +default.paginate.prev=\u4E0A\u9875 diff --git a/grails-app/services/au/org/ala/specimenbrowser/ResourceService.groovy b/grails-app/services/au/org/ala/specimenbrowser/ResourceService.groovy new file mode 100644 index 0000000..47b281c --- /dev/null +++ b/grails-app/services/au/org/ala/specimenbrowser/ResourceService.groovy @@ -0,0 +1,59 @@ +package au.org.ala.specimenbrowser + +import grails.config.Config +import grails.core.support.GrailsConfigurationAware +import groovy.json.JsonSlurper + +class ResourceService implements GrailsConfigurationAware { + /** The location of the resource configuration file */ + URL resourceConfigurationUrl + /** The location of the collectory web services */ + URL collectoryServicesUrl + /** The mappsings from collectory UIDs to resource types, eg co -> collection, dr -> dataResource */ + List resourceMappings + /** The list of resource metadata for each resource that is displayed */ + List resources + + /** + * Collect the resource information + */ + def buildResources() { + resources = [] + def js = new JsonSlurper() + def collectionsToRender = js.parse(resourceConfigurationUrl) + collectionsToRender.each { collection -> + def path = resourcePath(collection.uid) + def metadataUrl = new URL(collectoryServicesUrl, path + "/" + collection.uid) + try { + def collectionMetadata = js.parse(metadataUrl) + collectionMetadata.put("displayCollectionImage", collection.imageUrl) + this.resources << collectionMetadata + } catch (Exception ex) { + log.error("Unable to access while building collections " + metadataUrl, ex) + } + } + } + + + /** + * Get the path to the resource in the collectory, based on the resource UID prefix + * + * @param uid The resource UID (eg. co12, dr1456) + * @return The path to that resource (eg collection, dataResource) + */ + String resourcePath(String uid) { + def mapping = resourceMappings.find { m -> uid.startsWith(m.prefix) } + if (mapping) + return mapping.path + throw new IllegalArgumentException("Unable to find collectory path for " + uid) + } + + @Override + void setConfiguration(Config config) { + resourceConfigurationUrl = new URL(config.getRequiredProperty("specimenbrowser.data.url")) + collectoryServicesUrl = new URL(config.getRequiredProperty("collectory.servicesUrl")) + resourceMappings = config.getRequiredProperty("collectory.resourceMapping", List) + buildResources() + } + +} diff --git a/grails-app/views/admin/counts.gsp b/grails-app/views/admin/counts.gsp index d5a92ce..0d7e639 100644 --- a/grails-app/views/admin/counts.gsp +++ b/grails-app/views/admin/counts.gsp @@ -2,25 +2,33 @@ - - Settings - Admin - Specimen image browser - Atlas of Living Australia - - - var biocacheServicesUrl = "${grailsApplication.config.biocacheServicesUrl}", - collectoryServicesURL = "${grailsApplication.config.collectory.servicesURL}", + + + Image Counts - Specimen image browser - Atlas of Living Australia + + + var biocacheServicesUrl = "${grailsApplication.config.biocache.servicesUrl}", + collectoryServicesURL = "${grailsApplication.config.collectory.servicesUrl}", browseUrl = "${createLink(controller: 'browse')}"; - + - - Image counts - + +
+
+
+ + + @@ -30,21 +38,15 @@
Resource UID Resource Number of images
- + + + + + \ No newline at end of file diff --git a/grails-app/views/admin/index.gsp b/grails-app/views/admin/index.gsp index 826bad3..7abd5f2 100644 --- a/grails-app/views/admin/index.gsp +++ b/grails-app/views/admin/index.gsp @@ -1,12 +1,27 @@ - + + Admin - Specimen image browser - Atlas of Living Australia - - + + + + + + + +
+
+
    +
  • Counts
  • +
  • Reload Resources
  • +
  • Application Administration
  • +
+
+
diff --git a/grails-app/views/admin/settings.gsp b/grails-app/views/admin/settings.gsp deleted file mode 100644 index e153b15..0000000 --- a/grails-app/views/admin/settings.gsp +++ /dev/null @@ -1,48 +0,0 @@ -<%@ page import="org.apache.commons.lang.StringEscapeUtils" %> - - - - - Settings - Admin - Specimen image browser - Atlas of Living Australia - - - - - Settings - - - - - - - - - - - - - - - %{----}% - - - - -
SettingValueComment
- ${setting.key} - - ${setting.value} - - ${setting.comment} - - - - -
- - \ No newline at end of file diff --git a/grails-app/views/admin/tools.gsp b/grails-app/views/admin/tools.gsp deleted file mode 100644 index 2d7c1ac..0000000 --- a/grails-app/views/admin/tools.gsp +++ /dev/null @@ -1,81 +0,0 @@ -<%@ page import="org.apache.commons.lang.StringEscapeUtils" %> - - - - - Tools - Admin - Specimen image browser - Atlas of Living Australia - - - - - Tools - - - - - - - - - - - - - -
ToolDescription
- - - Reads any defined config files and merges new config with old. Usually used after a change is - made to external config files. Note that this cannot remove a config item as the result is a - union of the old and new config. -
- - \ No newline at end of file diff --git a/grails-app/views/browse/index.gsp b/grails-app/views/browse/index.gsp index c02fa13..dba1450 100644 --- a/grails-app/views/browse/index.gsp +++ b/grails-app/views/browse/index.gsp @@ -2,32 +2,26 @@ + Specimens | Atlas of Living Australia - - - var biocacheServicesUrl = "${grailsApplication.config.biocacheServicesUrl}", + + + + var biocacheServicesUrl = "${grailsApplication.config.biocache.servicesUrl}", biocacheWebappUrl = "${grailsApplication.config.biocache.baseURL}", - collectoryServicesURL = "${grailsApplication.config.collectory.servicesURL}", + collectoryServicesURL = "${grailsApplication.config.collectory.servicesUrl}", collectoryURL = "${grailsApplication.config.collectory.baseURL}", imageViewerBaseUrl = "${createLink(controller: 'view', action: 'view')}", entityUid = "${uid}"; - + - - - -
+
- + var wsBase = "/occurrences/search.json", uiBase = "/occurrences/search", @@ -750,6 +744,6 @@ var imageLayout = new ImageLayout(); - + diff --git a/grails-app/views/index.gsp b/grails-app/views/index.gsp index 0cad5f7..f5f4f7e 100644 --- a/grails-app/views/index.gsp +++ b/grails-app/views/index.gsp @@ -1,8 +1,8 @@ - - Specimens | Atlas of Living Australia + + Specimens | ${grailsApplication.config.skin.orgNameLong} diff --git a/grails-app/views/index.gsp.new b/grails-app/views/index.gsp.new deleted file mode 100644 index f1f76a0..0000000 --- a/grails-app/views/index.gsp.new +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - ALA Web Theme - Home - - -%{----}% -
- -
-

Welcome to Grails

-

Congratulations, you have successfully started your first Grails application! At the moment - this is the default page, feel free to modify it to either redirect to a controller or display whatever - content you may choose. Below is a list of controllers that are currently deployed in this application, - click on each to execute its default action:

- - -
-
- - - - diff --git a/grails-app/views/layouts/adminLayout.gsp b/grails-app/views/layouts/adminLayout.gsp deleted file mode 100644 index 02f8c1b..0000000 --- a/grails-app/views/layouts/adminLayout.gsp +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - -
- - - - - - -
HomeAdministration
-
- -
-
- -
- -
- -
-
- ${flash.errorMessage} -
-
-
- - -
-
- ${flash.message} -
-
-
- - - -
-
-
- -
\ No newline at end of file diff --git a/grails-app/views/layouts/main.gsp b/grails-app/views/layouts/main.gsp deleted file mode 100644 index 166305a..0000000 --- a/grails-app/views/layouts/main.gsp +++ /dev/null @@ -1,104 +0,0 @@ -<%@ page import="org.codehaus.groovy.grails.commons.ConfigurationHolder" %> - - - - - - - - - - - - <g:layoutTitle /> - -<%-- Do not include JS & CSS files here - add them to your app's "application" module (in "Configuration/ApplicationResources.groovy") --%> - - - - // initialise plugins - jQuery(function(){ - // autocomplete on navbar search input - jQuery("form#search-form-2011 input#search-2011, form#search-inpage input#search, input#search-2013").autocomplete('https://bie.ala.org.au/search/auto.jsonp', { - extraParams: {limit: 100}, - dataType: 'jsonp', - parse: function(data) { - var rows = new Array(); - data = data.autoCompleteList; - for(var i=0; i - - - - - - - - -
- -
- -
- <%-- Borrowed from http://marcusasplund.com/optout/ --%> - Desktop version -
- - - - - - var pageTracker = _gat._getTracker("UA-4355440-1"); - pageTracker._initData(); - pageTracker._trackPageview(); - - // show warning if using IE6 - if ($.browser && $.browser.msie && $.browser.version.slice(0,1) == '6') { - $('#header').prepend($('
WARNING: This page is not compatible with IE6.' + - ' Many functions will still work but layout and image transparency will be disrupted.
')); - } -
- - - - - - diff --git a/grails-app/views/layouts/main.gsp.new b/grails-app/views/layouts/main.gsp.new deleted file mode 100644 index 0d83760..0000000 --- a/grails-app/views/layouts/main.gsp.new +++ /dev/null @@ -1,106 +0,0 @@ -<%@ page import="org.codehaus.groovy.grails.commons.ConfigurationHolder" %> - - - - - - - - - - - <g:layoutTitle /> - - <%-- Do not include JS & CSS files here - add them to your app's "application" module (in "Configuration/ApplicationResources.groovy") --%> - - - - // initialise plugins - jQuery(function(){ - // autocomplete on navbar search input - jQuery("form#search-form-2011 input#search-2011, form#search-inpage input#search, input#search-2013").autocomplete('http://bie.ala.org.au/search/auto.jsonp', { - extraParams: {limit: 100}, - dataType: 'jsonp', - parse: function(data) { - var rows = new Array(); - data = data.autoCompleteList; - for(var i=0; i - - - - - - - - - - -
- -
- -
- <%-- Borrowed from http://marcusasplund.com/optout/ --%> - Desktop version - %{-- Desktop version--}% -
- - - - - - var pageTracker = _gat._getTracker("UA-4355440-1"); - pageTracker._initData(); - pageTracker._trackPageview(); - - // show warning if using IE6 - if ($.browser.msie && $.browser.version.slice(0,1) == '6') { - $('#header').prepend($('
WARNING: This page is not compatible with IE6.' + - ' Many functions will still work but layout and image transparency will be disrupted.
')); - } -
- - - - - - \ No newline at end of file diff --git a/grails-app/views/view/homePage.gsp b/grails-app/views/view/homePage.gsp index 9927ab2..2108e96 100644 --- a/grails-app/views/view/homePage.gsp +++ b/grails-app/views/view/homePage.gsp @@ -1,35 +1,37 @@ - - - Images of specimens | Atlas of Living Australia - - -
-

Images of specimens from Australia’s Natural History Collections

-

- Images from Australia's Natural History collections made available by the museums and herbaria of Australia.
- To view images from all collections, click here.

-

- - - -
- -
- -
-

${collection.name}

-

${collection.institution.name}

- - - -

- -

-
- -
- - + + + Images of specimens | Atlas of Living Australia + + + + + +
+
+
+

${collection.name}

+

${collection.institution.name}

+ + + +

+ +

+
+
+
+ + diff --git a/grails-app/views/view/viewer.gsp b/grails-app/views/view/viewer.gsp index 164b625..e5ede66 100644 --- a/grails-app/views/view/viewer.gsp +++ b/grails-app/views/view/viewer.gsp @@ -2,6 +2,13 @@ + + + + + + + Image viewer | ${params.recordId} | Specimens | Atlas of Living Australia - - - + + + + + + + + + + + + @@ -32,6 +48,5 @@
- \ No newline at end of file diff --git a/grails-release-plugin-bug-workaround_pom.xml b/grails-release-plugin-bug-workaround_pom.xml deleted file mode 100644 index 92fb0d7..0000000 --- a/grails-release-plugin-bug-workaround_pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - au.org.ala - SET_ARTIFACT_ID - war - SET_VERSION_STRING - SET_NAME - - - diff --git a/grails-wrapper.jar b/grails-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..b9bd249f589660cf867961102cb1760974e60dcb GIT binary patch literal 4821 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +JAR_PATH=$APP_HOME/grails-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + JAVACMD=`cygpath --unix "$JAVACMD"` + JAR_PATH=`cygpath --path --mixed "$JAR_PATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRAILS_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRAILS_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRAILS_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRAILS_OPTS + +exec "$JAVACMD" -jar "${JVM_OPTS[@]}" "$JAR_PATH" "$@" diff --git a/grailsw.bat b/grailsw.bat new file mode 100755 index 0000000..14734e4 --- /dev/null +++ b/grailsw.bat @@ -0,0 +1,89 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Grails startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRAILS_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-XX:+TieredCompilation" "-XX:TieredStopAtLevel=1" "-XX:CICompilerCount=3" + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line +set JAR_PATH=%APP_HOME%/grails-wrapper.jar + +@rem Execute Grails +"%JAVA_EXE%" -jar %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRAILS_OPTS% %JAR_PATH% %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRAILS_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRAILS_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..d002523 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'specimenbrowser' + diff --git a/src/integration-test/resources/GebConfig.groovy b/src/integration-test/resources/GebConfig.groovy new file mode 100644 index 0000000..0d97e35 --- /dev/null +++ b/src/integration-test/resources/GebConfig.groovy @@ -0,0 +1,25 @@ +import org.openqa.selenium.chrome.ChromeDriver +import org.openqa.selenium.chrome.ChromeOptions +import org.openqa.selenium.firefox.FirefoxDriver + +environments { + + // run via “./gradlew -Dgeb.env=chrome iT” + chrome { + driver = { new ChromeDriver() } + } + + // run via “./gradlew -Dgeb.env=chromeHeadless iT” + chromeHeadless { + driver = { + ChromeOptions o = new ChromeOptions() + o.addArguments('headless') + new ChromeDriver(o) + } + } + + // run via “./gradlew -Dgeb.env=firefox iT” + firefox { + driver = { new FirefoxDriver() } + } +} diff --git a/test/unit/au/org/ala/specimenbrowser/AdminControllerTests.groovy b/test/unit/au/org/ala/specimenbrowser/AdminControllerTests.groovy deleted file mode 100644 index dcd7b59..0000000 --- a/test/unit/au/org/ala/specimenbrowser/AdminControllerTests.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package au.org.ala.specimenbrowser - - - -import grails.test.mixin.* -import org.junit.* - -/** - * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions - */ -@TestFor(AdminController) -class AdminControllerTests { - - void testSomething() { - fail "Implement me" - } -} diff --git a/test/unit/au/org/ala/specimenbrowser/ViewControllerTests.groovy b/test/unit/au/org/ala/specimenbrowser/ViewControllerTests.groovy deleted file mode 100644 index b609ada..0000000 --- a/test/unit/au/org/ala/specimenbrowser/ViewControllerTests.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package au.org.ala.specimenbrowser - - - -import grails.test.mixin.* -import org.junit.* - -/** - * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions - */ -@TestFor(ViewController) -class ViewControllerTests { - - void testSomething() { - fail "Implement me" - } -} diff --git a/test/unit/specimenbrowser/BrowseControllerTests.groovy b/test/unit/specimenbrowser/BrowseControllerTests.groovy deleted file mode 100644 index 922a07e..0000000 --- a/test/unit/specimenbrowser/BrowseControllerTests.groovy +++ /dev/null @@ -1,15 +0,0 @@ -package specimenbrowser - -import au.org.ala.specimenbrowser.BrowseController -import grails.test.mixin.* - -/** - * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions - */ -@TestFor(BrowseController) -class BrowseControllerTests { - - void testSomething() { - fail "Implement me" - } -} diff --git a/test/unit/specimenbrowser/SpecimenTagTagLibSpec.groovy b/test/unit/specimenbrowser/SpecimenTagTagLibSpec.groovy deleted file mode 100644 index 12b320f..0000000 --- a/test/unit/specimenbrowser/SpecimenTagTagLibSpec.groovy +++ /dev/null @@ -1,20 +0,0 @@ -package specimenbrowser - -import grails.test.mixin.TestFor -import spock.lang.Specification - -/** - * See the API for {@link grails.test.mixin.web.GroovyPageUnitTestMixin} for usage instructions - */ -@TestFor(SpecimenTagTagLib) -class SpecimenTagTagLibSpec extends Specification { - - def setup() { - } - - def cleanup() { - } - - void "test something"() { - } -} diff --git a/upgrade-notes.md b/upgrade-notes.md new file mode 100644 index 0000000..195d0d2 --- /dev/null +++ b/upgrade-notes.md @@ -0,0 +1,3 @@ +* Using wenjars version for knockout library. This is handled by an asset javascript that requires the path to the actual libraries +* images-client-plugin contains an internal leaflet.js library +* images-client-plugin requires the importing of xml-apis:xml-apis \ No newline at end of file diff --git a/web-app/WEB-INF/applicationContext.xml b/web-app/WEB-INF/applicationContext.xml deleted file mode 100644 index a48dec0..0000000 --- a/web-app/WEB-INF/applicationContext.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Grails application factory bean - - - - - - A bean that manages Grails plugins - - - - - - - - - - - - - - - - utf-8 - - - - - \ No newline at end of file diff --git a/web-app/WEB-INF/sitemesh.xml b/web-app/WEB-INF/sitemesh.xml deleted file mode 100644 index 72399ce..0000000 --- a/web-app/WEB-INF/sitemesh.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/web-app/WEB-INF/tld/c.tld b/web-app/WEB-INF/tld/c.tld deleted file mode 100644 index 5e18236..0000000 --- a/web-app/WEB-INF/tld/c.tld +++ /dev/null @@ -1,572 +0,0 @@ - - - - - JSTL 1.2 core library - JSTL core - 1.2 - c - http://java.sun.com/jsp/jstl/core - - - - Provides core validation features for JSTL tags. - - - org.apache.taglibs.standard.tlv.JstlCoreTLV - - - - - - Catches any Throwable that occurs in its body and optionally - exposes it. - - catch - org.apache.taglibs.standard.tag.common.core.CatchTag - JSP - - -Name of the exported scoped variable for the -exception thrown from a nested action. The type of the -scoped variable is the type of the exception thrown. - - var - false - false - - - - - - Simple conditional tag that establishes a context for - mutually exclusive conditional operations, marked by - <when> and <otherwise> - - choose - org.apache.taglibs.standard.tag.common.core.ChooseTag - JSP - - - - - Simple conditional tag, which evalutes its body if the - supplied condition is true and optionally exposes a Boolean - scripting variable representing the evaluation of this condition - - if - org.apache.taglibs.standard.tag.rt.core.IfTag - JSP - - -The test condition that determines whether or -not the body content should be processed. - - test - true - true - boolean - - - -Name of the exported scoped variable for the -resulting value of the test condition. The type -of the scoped variable is Boolean. - - var - false - false - - - -Scope for var. - - scope - false - false - - - - - - Retrieves an absolute or relative URL and exposes its contents - to either the page, a String in 'var', or a Reader in 'varReader'. - - import - org.apache.taglibs.standard.tag.rt.core.ImportTag - org.apache.taglibs.standard.tei.ImportTEI - JSP - - -The URL of the resource to import. - - url - true - true - - - -Name of the exported scoped variable for the -resource's content. The type of the scoped -variable is String. - - var - false - false - - - -Scope for var. - - scope - false - false - - - -Name of the exported scoped variable for the -resource's content. The type of the scoped -variable is Reader. - - varReader - false - false - - - -Name of the context when accessing a relative -URL resource that belongs to a foreign -context. - - context - false - true - - - -Character encoding of the content at the input -resource. - - charEncoding - false - true - - - - - - The basic iteration tag, accepting many different - collection types and supporting subsetting and other - functionality - - forEach - org.apache.taglibs.standard.tag.rt.core.ForEachTag - org.apache.taglibs.standard.tei.ForEachTEI - JSP - - -Collection of items to iterate over. - - items - false - true - java.lang.Object - - java.lang.Object - - - - -If items specified: -Iteration begins at the item located at the -specified index. First item of the collection has -index 0. -If items not specified: -Iteration begins with index set at the value -specified. - - begin - false - true - int - - - -If items specified: -Iteration ends at the item located at the -specified index (inclusive). -If items not specified: -Iteration ends when index reaches the value -specified. - - end - false - true - int - - - -Iteration will only process every step items of -the collection, starting with the first one. - - step - false - true - int - - - -Name of the exported scoped variable for the -current item of the iteration. This scoped -variable has nested visibility. Its type depends -on the object of the underlying collection. - - var - false - false - - - -Name of the exported scoped variable for the -status of the iteration. Object exported is of type -javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested -visibility. - - varStatus - false - false - - - - - - Iterates over tokens, separated by the supplied delimeters - - forTokens - org.apache.taglibs.standard.tag.rt.core.ForTokensTag - JSP - - -String of tokens to iterate over. - - items - true - true - java.lang.String - - java.lang.String - - - - -The set of delimiters (the characters that -separate the tokens in the string). - - delims - true - true - java.lang.String - - - -Iteration begins at the token located at the -specified index. First token has index 0. - - begin - false - true - int - - - -Iteration ends at the token located at the -specified index (inclusive). - - end - false - true - int - - - -Iteration will only process every step tokens -of the string, starting with the first one. - - step - false - true - int - - - -Name of the exported scoped variable for the -current item of the iteration. This scoped -variable has nested visibility. - - var - false - false - - - -Name of the exported scoped variable for the -status of the iteration. Object exported is of -type -javax.servlet.jsp.jstl.core.LoopTag -Status. This scoped variable has nested -visibility. - - varStatus - false - false - - - - - - Like <%= ... >, but for expressions. - - out - org.apache.taglibs.standard.tag.rt.core.OutTag - JSP - - -Expression to be evaluated. - - value - true - true - - - -Default value if the resulting value is null. - - default - false - true - - - -Determines whether characters <,>,&,'," in the -resulting string should be converted to their -corresponding character entity codes. Default value is -true. - - escapeXml - false - true - - - - - - - Subtag of <choose> that follows <when> tags - and runs only if all of the prior conditions evaluated to - 'false' - - otherwise - org.apache.taglibs.standard.tag.common.core.OtherwiseTag - JSP - - - - - Adds a parameter to a containing 'import' tag's URL. - - param - org.apache.taglibs.standard.tag.rt.core.ParamTag - JSP - - -Name of the query string parameter. - - name - true - true - - - -Value of the parameter. - - value - false - true - - - - - - Redirects to a new URL. - - redirect - org.apache.taglibs.standard.tag.rt.core.RedirectTag - JSP - - -The URL of the resource to redirect to. - - url - false - true - - - -Name of the context when redirecting to a relative URL -resource that belongs to a foreign context. - - context - false - true - - - - - - Removes a scoped variable (from a particular scope, if specified). - - remove - org.apache.taglibs.standard.tag.common.core.RemoveTag - empty - - -Name of the scoped variable to be removed. - - var - true - false - - - -Scope for var. - - scope - false - false - - - - - - Sets the result of an expression evaluation in a 'scope' - - set - org.apache.taglibs.standard.tag.rt.core.SetTag - JSP - - -Name of the exported scoped variable to hold the value -specified in the action. The type of the scoped variable is -whatever type the value expression evaluates to. - - var - false - false - - - -Expression to be evaluated. - - value - false - true - - java.lang.Object - - - - -Target object whose property will be set. Must evaluate to -a JavaBeans object with setter property property, or to a -java.util.Map object. - - target - false - true - - - -Name of the property to be set in the target object. - - property - false - true - - - -Scope for var. - - scope - false - false - - - - - - Creates a URL with optional query parameters. - - url - org.apache.taglibs.standard.tag.rt.core.UrlTag - JSP - - -Name of the exported scoped variable for the -processed url. The type of the scoped variable is -String. - - var - false - false - - - -Scope for var. - - scope - false - false - - - -URL to be processed. - - value - false - true - - - -Name of the context when specifying a relative URL -resource that belongs to a foreign context. - - context - false - true - - - - - - Subtag of <choose> that includes its body if its - condition evalutes to 'true' - - when - org.apache.taglibs.standard.tag.rt.core.WhenTag - JSP - - -The test condition that determines whether or not the -body content should be processed. - - test - true - true - boolean - - - - diff --git a/web-app/WEB-INF/tld/fmt.tld b/web-app/WEB-INF/tld/fmt.tld deleted file mode 100644 index 2ae4776..0000000 --- a/web-app/WEB-INF/tld/fmt.tld +++ /dev/null @@ -1,671 +0,0 @@ - - - - - JSTL 1.2 i18n-capable formatting library - JSTL fmt - 1.2 - fmt - http://java.sun.com/jsp/jstl/fmt - - - - Provides core validation features for JSTL tags. - - - org.apache.taglibs.standard.tlv.JstlFmtTLV - - - - - - Sets the request character encoding - - requestEncoding - org.apache.taglibs.standard.tag.rt.fmt.RequestEncodingTag - empty - - -Name of character encoding to be applied when -decoding request parameters. - - value - false - true - - - - - - Stores the given locale in the locale configuration variable - - setLocale - org.apache.taglibs.standard.tag.rt.fmt.SetLocaleTag - empty - - -A String value is interpreted as the -printable representation of a locale, which -must contain a two-letter (lower-case) -language code (as defined by ISO-639), -and may contain a two-letter (upper-case) -country code (as defined by ISO-3166). -Language and country codes must be -separated by hyphen (-) or underscore -(_). - - value - true - true - - - -Vendor- or browser-specific variant. -See the java.util.Locale javadocs for -more information on variants. - - variant - false - true - - - -Scope of the locale configuration variable. - - scope - false - false - - - - - - Specifies the time zone for any time formatting or parsing actions - nested in its body - - timeZone - org.apache.taglibs.standard.tag.rt.fmt.TimeZoneTag - JSP - - -The time zone. A String value is interpreted as -a time zone ID. This may be one of the time zone -IDs supported by the Java platform (such as -"America/Los_Angeles") or a custom time zone -ID (such as "GMT-8"). See -java.util.TimeZone for more information on -supported time zone formats. - - value - true - true - - - - - - Stores the given time zone in the time zone configuration variable - - setTimeZone - org.apache.taglibs.standard.tag.rt.fmt.SetTimeZoneTag - empty - - -The time zone. A String value is interpreted as -a time zone ID. This may be one of the time zone -IDs supported by the Java platform (such as -"America/Los_Angeles") or a custom time zone -ID (such as "GMT-8"). See java.util.TimeZone for -more information on supported time zone -formats. - - value - true - true - - - -Name of the exported scoped variable which -stores the time zone of type -java.util.TimeZone. - - var - false - false - - - -Scope of var or the time zone configuration -variable. - - scope - false - false - - - - - - Loads a resource bundle to be used by its tag body - - bundle - org.apache.taglibs.standard.tag.rt.fmt.BundleTag - JSP - - -Resource bundle base name. This is the bundle's -fully-qualified resource name, which has the same -form as a fully-qualified class name, that is, it uses -"." as the package component separator and does not -have any file type (such as ".class" or ".properties") -suffix. - - basename - true - true - - - -Prefix to be prepended to the value of the message -key of any nested <fmt:message> action. - - prefix - false - true - - - - - - Loads a resource bundle and stores it in the named scoped variable or - the bundle configuration variable - - setBundle - org.apache.taglibs.standard.tag.rt.fmt.SetBundleTag - empty - - -Resource bundle base name. This is the bundle's -fully-qualified resource name, which has the same -form as a fully-qualified class name, that is, it uses -"." as the package component separator and does not -have any file type (such as ".class" or ".properties") -suffix. - - basename - true - true - - - -Name of the exported scoped variable which stores -the i18n localization context of type -javax.servlet.jsp.jstl.fmt.LocalizationC -ontext. - - var - false - false - - - -Scope of var or the localization context -configuration variable. - - scope - false - false - - - - - - Maps key to localized message and performs parametric replacement - - message - org.apache.taglibs.standard.tag.rt.fmt.MessageTag - JSP - - -Message key to be looked up. - - key - false - true - - - -Localization context in whose resource -bundle the message key is looked up. - - bundle - false - true - - - -Name of the exported scoped variable -which stores the localized message. - - var - false - false - - - -Scope of var. - - scope - false - false - - - - - - Supplies an argument for parametric replacement to a containing - <message> tag - - param - org.apache.taglibs.standard.tag.rt.fmt.ParamTag - JSP - - -Argument used for parametric replacement. - - value - false - true - - - - - - Formats a numeric value as a number, currency, or percentage - - formatNumber - org.apache.taglibs.standard.tag.rt.fmt.FormatNumberTag - JSP - - -Numeric value to be formatted. - - value - false - true - - - -Specifies whether the value is to be -formatted as number, currency, or -percentage. - - type - false - true - - - -Custom formatting pattern. - - pattern - false - true - - - -ISO 4217 currency code. Applied only -when formatting currencies (i.e. if type is -equal to "currency"); ignored otherwise. - - currencyCode - false - true - - - -Currency symbol. Applied only when -formatting currencies (i.e. if type is equal -to "currency"); ignored otherwise. - - currencySymbol - false - true - - - -Specifies whether the formatted output -will contain any grouping separators. - - groupingUsed - false - true - - - -Maximum number of digits in the integer -portion of the formatted output. - - maxIntegerDigits - false - true - - - -Minimum number of digits in the integer -portion of the formatted output. - - minIntegerDigits - false - true - - - -Maximum number of digits in the -fractional portion of the formatted output. - - maxFractionDigits - false - true - - - -Minimum number of digits in the -fractional portion of the formatted output. - - minFractionDigits - false - true - - - -Name of the exported scoped variable -which stores the formatted result as a -String. - - var - false - false - - - -Scope of var. - - scope - false - false - - - - - - Parses the string representation of a number, currency, or percentage - - parseNumber - org.apache.taglibs.standard.tag.rt.fmt.ParseNumberTag - JSP - - -String to be parsed. - - value - false - true - - - -Specifies whether the string in the value -attribute should be parsed as a number, -currency, or percentage. - - type - false - true - - - -Custom formatting pattern that determines -how the string in the value attribute is to be -parsed. - - pattern - false - true - - - -Locale whose default formatting pattern (for -numbers, currencies, or percentages, -respectively) is to be used during the parse -operation, or to which the pattern specified -via the pattern attribute (if present) is -applied. - - parseLocale - false - true - - - -Specifies whether just the integer portion of -the given value should be parsed. - - integerOnly - false - true - - - -Name of the exported scoped variable which -stores the parsed result (of type -java.lang.Number). - - var - false - false - - - -Scope of var. - - scope - false - false - - - - - - Formats a date and/or time using the supplied styles and pattern - - formatDate - org.apache.taglibs.standard.tag.rt.fmt.FormatDateTag - empty - - -Date and/or time to be formatted. - - value - true - true - - - -Specifies whether the time, the date, or both -the time and date components of the given -date are to be formatted. - - type - false - true - - - -Predefined formatting style for dates. Follows -the semantics defined in class -java.text.DateFormat. Applied only -when formatting a date or both a date and -time (i.e. if type is missing or is equal to -"date" or "both"); ignored otherwise. - - dateStyle - false - true - - - -Predefined formatting style for times. Follows -the semantics defined in class -java.text.DateFormat. Applied only -when formatting a time or both a date and -time (i.e. if type is equal to "time" or "both"); -ignored otherwise. - - timeStyle - false - true - - - -Custom formatting style for dates and times. - - pattern - false - true - - - -Time zone in which to represent the formatted -time. - - timeZone - false - true - - - -Name of the exported scoped variable which -stores the formatted result as a String. - - var - false - false - - - -Scope of var. - - scope - false - false - - - - - - Parses the string representation of a date and/or time - - parseDate - org.apache.taglibs.standard.tag.rt.fmt.ParseDateTag - JSP - - -Date string to be parsed. - - value - false - true - - - -Specifies whether the date string in the -value attribute is supposed to contain a -time, a date, or both. - - type - false - true - - - -Predefined formatting style for days -which determines how the date -component of the date string is to be -parsed. Applied only when formatting a -date or both a date and time (i.e. if type -is missing or is equal to "date" or "both"); -ignored otherwise. - - dateStyle - false - true - - - -Predefined formatting styles for times -which determines how the time -component in the date string is to be -parsed. Applied only when formatting a -time or both a date and time (i.e. if type -is equal to "time" or "both"); ignored -otherwise. - - timeStyle - false - true - - - -Custom formatting pattern which -determines how the date string is to be -parsed. - - pattern - false - true - - - -Time zone in which to interpret any time -information in the date string. - - timeZone - false - true - - - -Locale whose predefined formatting styles -for dates and times are to be used during -the parse operation, or to which the -pattern specified via the pattern -attribute (if present) is applied. - - parseLocale - false - true - - - -Name of the exported scoped variable in -which the parsing result (of type -java.util.Date) is stored. - - var - false - false - - - -Scope of var. - - scope - false - false - - - - diff --git a/web-app/WEB-INF/tld/grails.tld b/web-app/WEB-INF/tld/grails.tld deleted file mode 100644 index 9bd036b..0000000 --- a/web-app/WEB-INF/tld/grails.tld +++ /dev/null @@ -1,550 +0,0 @@ - - - The Grails custom tag library - 0.2 - grails - http://grails.codehaus.org/tags - - - link - org.codehaus.groovy.grails.web.taglib.jsp.JspLinkTag - JSP - - action - false - true - - - controller - false - true - - - id - false - true - - - url - false - true - - - params - false - true - - true - - - form - org.codehaus.groovy.grails.web.taglib.jsp.JspFormTag - JSP - - action - false - true - - - controller - false - true - - - id - false - true - - - url - false - true - - - method - true - true - - true - - - select - org.codehaus.groovy.grails.web.taglib.jsp.JspSelectTag - JSP - - name - true - true - - - value - false - true - - - optionKey - false - true - - - optionValue - false - true - - true - - - datePicker - org.codehaus.groovy.grails.web.taglib.jsp.JspDatePickerTag - empty - - name - true - true - - - value - false - true - - - precision - false - true - - false - - - currencySelect - org.codehaus.groovy.grails.web.taglib.jsp.JspCurrencySelectTag - empty - - name - true - true - - - value - false - true - - true - - - localeSelect - org.codehaus.groovy.grails.web.taglib.jsp.JspLocaleSelectTag - empty - - name - true - true - - - value - false - true - - true - - - timeZoneSelect - org.codehaus.groovy.grails.web.taglib.jsp.JspTimeZoneSelectTag - empty - - name - true - true - - - value - false - true - - true - - - checkBox - org.codehaus.groovy.grails.web.taglib.jsp.JspCheckboxTag - empty - - name - true - true - - - value - true - true - - true - - - hasErrors - org.codehaus.groovy.grails.web.taglib.jsp.JspHasErrorsTag - JSP - - model - false - true - - - bean - false - true - - - field - false - true - - false - - - eachError - org.codehaus.groovy.grails.web.taglib.jsp.JspEachErrorTag - JSP - - model - false - true - - - bean - false - true - - - field - false - true - - false - - - renderErrors - org.codehaus.groovy.grails.web.taglib.jsp.JspEachErrorTag - JSP - - model - false - true - - - bean - false - true - - - field - false - true - - - as - true - true - - false - - - message - org.codehaus.groovy.grails.web.taglib.jsp.JspMessageTag - JSP - - code - false - true - - - error - false - true - - - default - false - true - - false - - - remoteFunction - org.codehaus.groovy.grails.web.taglib.jsp.JspRemoteFunctionTag - empty - - before - false - true - - - after - false - true - - - action - false - true - - - controller - false - true - - - id - false - true - - - url - false - true - - - params - false - true - - - asynchronous - false - true - - - method - false - true - - - update - false - true - - - onSuccess - false - true - - - onFailure - false - true - - - onComplete - false - true - - - onLoading - false - true - - - onLoaded - false - true - - - onInteractive - false - true - - true - - - remoteLink - org.codehaus.groovy.grails.web.taglib.jsp.JspRemoteLinkTag - JSP - - before - false - true - - - after - false - true - - - action - false - true - - - controller - false - true - - - id - false - true - - - url - false - true - - - params - false - true - - - asynchronous - false - true - - - method - false - true - - - update - false - true - - - onSuccess - false - true - - - onFailure - false - true - - - onComplete - false - true - - - onLoading - false - true - - - onLoaded - false - true - - - onInteractive - false - true - - true - - - formRemote - org.codehaus.groovy.grails.web.taglib.jsp.JspFormRemoteTag - JSP - - before - false - true - - - after - false - true - - - action - false - true - - - controller - false - true - - - id - false - true - - - url - false - true - - - params - false - true - - - asynchronous - false - true - - - method - false - true - - - update - false - true - - - onSuccess - false - true - - - onFailure - false - true - - - onComplete - false - true - - - onLoading - false - true - - - onLoaded - false - true - - - onInteractive - false - true - - true - - - invokeTag - org.codehaus.groovy.grails.web.taglib.jsp.JspInvokeGrailsTagLibTag - JSP - - it - java.lang.Object - true - NESTED - - - tagName - true - true - - true - - - diff --git a/web-app/WEB-INF/tld/spring.tld b/web-app/WEB-INF/tld/spring.tld deleted file mode 100644 index a0a8c6f..0000000 --- a/web-app/WEB-INF/tld/spring.tld +++ /dev/null @@ -1,457 +0,0 @@ - - - - Spring Framework JSP Tag Library - 3.0 - spring - http://www.springframework.org/tags - - - - Sets default HTML escape value for the current page. - Overrides a "defaultHtmlEscape" context-param in web.xml, if any. - - htmlEscape - org.springframework.web.servlet.tags.HtmlEscapeTag - JSP - - Set the default value for HTML escaping, to be put - into the current PageContext. - defaultHtmlEscape - true - true - - - - - - Escapes its enclosed body content, applying HTML escaping and/or JavaScript escaping. - The HTML escaping flag participates in a page-wide or application-wide setting - (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). - - escapeBody - org.springframework.web.servlet.tags.EscapeBodyTag - JSP - - Set HTML escaping for this tag, as boolean value. Overrides the - default HTML escaping setting for the current page. - htmlEscape - false - true - - - Set JavaScript escaping for this tag, as boolean value. - Default is false. - javaScriptEscape - false - true - - - - - - Retrieves the message with the given code, or text if code isn't resolvable. - The HTML escaping flag participates in a page-wide or application-wide setting - (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). - - message - org.springframework.web.servlet.tags.MessageTag - JSP - - A MessageSourceResolvable argument (direct or through JSP EL). - Fits nicely when used in conjunction with Spring's own validation error - classes which all implement the MessageSourceResolvable interface. For - example, this allows you to iterate over all of the errors in a form, - passing each error (using a runtime expression) as the value of this - 'message' attribute, thus effecting the easy display of such error - messages. - message - false - true - - - The code (key) to use when looking up the message. - If code is not provided, the text attribute will be used. - code - false - true - - - Set optional message arguments for this tag, as a - (comma-)delimited String (each String argument can contain JSP EL), - an Object array (used as argument array), or a single Object (used - as single argument). - arguments - false - true - - - The separator character to be used for splitting the - arguments string value; defaults to a 'comma' (','). - argumentSeparator - false - true - - - Default text to output when a message for the given code - could not be found. If both text and code are not set, the tag will - output null. - text - false - true - - - The string to use when binding the result to the page, - request, session or application scope. If not specified, the result - gets outputted to the writer (i.e. typically directly to the JSP). - var - false - true - - - The scope to use when exporting the result to a variable. - This attribute is only used when var is also set. Possible values are - page, request, session and application. - scope - false - true - - - Set HTML escaping for this tag, as boolean value. - Overrides the default HTML escaping setting for the current page. - htmlEscape - false - true - - - Set JavaScript escaping for this tag, as boolean value. Default is false. - javaScriptEscape - false - true - - - - - - Retrieves the theme message with the given code, or text if code isn't resolvable. - The HTML escaping flag participates in a page-wide or application-wide setting - (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). - - theme - org.springframework.web.servlet.tags.ThemeTag - JSP - - A MessageSourceResolvable argument (direct or through JSP EL). - message - false - true - - - The code (key) to use when looking up the message. - If code is not provided, the text attribute will be used. - code - false - true - - - Set optional message arguments for this tag, as a - (comma-)delimited String (each String argument can contain JSP EL), - an Object array (used as argument array), or a single Object (used - as single argument). - arguments - false - true - - - The separator character to be used for splitting the - arguments string value; defaults to a 'comma' (','). - argumentSeparator - false - true - - - Default text to output when a message for the given code - could not be found. If both text and code are not set, the tag will - output null. - text - false - true - - - The string to use when binding the result to the page, - request, session or application scope. If not specified, the result - gets outputted to the writer (i.e. typically directly to the JSP). - var - false - true - - - The scope to use when exporting the result to a variable. - This attribute is only used when var is also set. Possible values are - page, request, session and application. - scope - false - true - - - Set HTML escaping for this tag, as boolean value. - Overrides the default HTML escaping setting for the current page. - htmlEscape - false - true - - - Set JavaScript escaping for this tag, as boolean value. Default is false. - javaScriptEscape - false - true - - - - - - Provides Errors instance in case of bind errors. - The HTML escaping flag participates in a page-wide or application-wide setting - (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). - - hasBindErrors - org.springframework.web.servlet.tags.BindErrorsTag - JSP - - errors - org.springframework.validation.Errors - - - The name of the bean in the request, that needs to be - inspected for errors. If errors are available for this bean, they - will be bound under the 'errors' key. - name - true - true - - - Set HTML escaping for this tag, as boolean value. - Overrides the default HTML escaping setting for the current page. - htmlEscape - false - true - - - - - - Sets a nested path to be used by the bind tag's path. - - nestedPath - org.springframework.web.servlet.tags.NestedPathTag - JSP - - nestedPath - java.lang.String - - - Set the path that this tag should apply. E.g. 'customer' - to allow bind paths like 'address.street' rather than - 'customer.address.street'. - path - true - true - - - - - - Provides BindStatus object for the given bind path. - The HTML escaping flag participates in a page-wide or application-wide setting - (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). - - bind - org.springframework.web.servlet.tags.BindTag - JSP - - status - org.springframework.web.servlet.support.BindStatus - - - The path to the bean or bean property to bind status - information for. For instance account.name, company.address.zipCode - or just employee. The status object will exported to the page scope, - specifically for this bean or bean property - path - true - true - - - Set whether to ignore a nested path, if any. Default is to not ignore. - ignoreNestedPath - false - true - - - Set HTML escaping for this tag, as boolean value. Overrides - the default HTML escaping setting for the current page. - htmlEscape - false - true - - - - - - Provides transformation of variables to Strings, using an appropriate - custom PropertyEditor from BindTag (can only be used inside BindTag). - The HTML escaping flag participates in a page-wide or application-wide setting - (i.e. by HtmlEscapeTag or a 'defaultHtmlEscape' context-param in web.xml). - - transform - org.springframework.web.servlet.tags.TransformTag - JSP - - The value to transform. This is the actual object you want - to have transformed (for instance a Date). Using the PropertyEditor that - is currently in use by the 'spring:bind' tag. - value - true - true - - - The string to use when binding the result to the page, - request, session or application scope. If not specified, the result gets - outputted to the writer (i.e. typically directly to the JSP). - var - false - true - - - The scope to use when exported the result to a variable. - This attribute is only used when var is also set. Possible values are - page, request, session and application. - scope - false - true - - - Set HTML escaping for this tag, as boolean value. Overrides - the default HTML escaping setting for the current page. - htmlEscape - false - true - - - - - URL tag based on the JSTL c:url tag. This variant is fully - backwards compatible with the standard tag. Enhancements include support - for URL template parameters. - url - org.springframework.web.servlet.tags.UrlTag - JSP - - The URL to build. This value can include template place holders - that are replaced with the URL encoded value of the named parameter. Parameters - must be defined using the param tag inside the body of this tag. - value - true - true - - - Specifies a remote application context path. The default is the - current application context path. - context - false - true - - - The name of the variable to export the URL value to. - var - false - true - - - The scope for the var. 'application', 'session', 'request' and - 'page' scopes are supported. Defaults to page scope. This attribute has no - effect unless the var attribute is also defined. - scope - false - true - - - Set HTML escaping for this tag, as a boolean value. Overrides the - default HTML escaping setting for the current page. - htmlEscape - false - true - - - Set JavaScript escaping for this tag, as a boolean value. - Default is false. - javaScriptEscape - false - true - - - - - Parameter tag based on the JSTL c:param tag. The sole purpose is to - support params inside the spring:url tag. - param - org.springframework.web.servlet.tags.ParamTag - JSP - - The name of the parameter. - name - true - true - - - The value of the parameter. - value - false - true - - - - - Evaluates a Spring expression (SpEL) and either prints the result or assigns it to a variable. - eval - org.springframework.web.servlet.tags.EvalTag - JSP - - The expression to evaluate. - expression - true - true - - - The name of the variable to export the evaluation result to. - var - false - true - - - The scope for the var. 'application', 'session', 'request' and - 'page' scopes are supported. Defaults to page scope. This attribute has no - effect unless the var attribute is also defined. - scope - false - true - - - Set HTML escaping for this tag, as a boolean value. Overrides the - default HTML escaping setting for the current page. - htmlEscape - false - true - - - Set JavaScript escaping for this tag, as a boolean value. Default is false. - javaScriptEscape - false - true - - - - diff --git a/web-app/css/errors.css b/web-app/css/errors.css deleted file mode 100644 index bdb58bc..0000000 --- a/web-app/css/errors.css +++ /dev/null @@ -1,109 +0,0 @@ -h1, h2 { - margin: 10px 25px 5px; -} - -h2 { - font-size: 1.1em; -} - -.filename { - font-style: italic; -} - -.exceptionMessage { - margin: 10px; - border: 1px solid #000; - padding: 5px; - background-color: #E9E9E9; -} - -.stack, -.snippet { - margin: 0 25px 10px; -} - -.stack, -.snippet { - border: 1px solid #ccc; - -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); - box-shadow: 0 0 2px rgba(0,0,0,0.2); -} - -/* error details */ -.error-details { - border-top: 1px solid #FFAAAA; - -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); - box-shadow: 0 0 2px rgba(0,0,0,0.2); - border-bottom: 1px solid #FFAAAA; - -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); - box-shadow: 0 0 2px rgba(0,0,0,0.2); - background-color:#FFF3F3; - line-height: 1.5; - overflow: hidden; - padding: 5px; - padding-left:25px; -} - -.error-details dt { - clear: left; - float: left; - font-weight: bold; - margin-right: 5px; -} - -.error-details dt:after { - content: ":"; -} - -.error-details dd { - display: block; -} - -/* stack trace */ -.stack { - padding: 5px; - overflow: auto; - height: 150px; -} - -/* code snippet */ -.snippet { - background-color: #fff; - font-family: monospace; -} - -.snippet .line { - display: block; -} - -.snippet .lineNumber { - background-color: #ddd; - color: #999; - display: inline-block; - margin-right: 5px; - padding: 0 3px; - text-align: right; - width: 3em; -} - -.snippet .error { - background-color: #fff3f3; - font-weight: bold; -} - -.snippet .error .lineNumber { - background-color: #faa; - color: #333; - font-weight: bold; -} - -.snippet .line:first-child .lineNumber { - padding-top: 5px; -} - -.snippet .line:last-child .lineNumber { - padding-bottom: 5px; -} \ No newline at end of file diff --git a/web-app/css/main.css b/web-app/css/main.css deleted file mode 100644 index a55945d..0000000 --- a/web-app/css/main.css +++ /dev/null @@ -1,596 +0,0 @@ -/* FONT STACK */ -body, -input, select, textarea { - font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; -} - -h1, h2, h3, h4, h5, h6 { - line-height: 1.1; -} - -/* BASE LAYOUT */ - -html { - background-color: #ddd; - background-image: -moz-linear-gradient(center top, #aaa, #ddd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #aaa), color-stop(1, #ddd)); - background-image: linear-gradient(top, #aaa, #ddd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr = '#aaaaaa', EndColorStr = '#dddddd'); - background-repeat: no-repeat; - height: 100%; - /* change the box model to exclude the padding from the calculation of 100% height (IE8+) */ - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html.no-cssgradients { - background-color: #aaa; -} - -.ie6 html { - height: 100%; -} - -html * { - margin: 0; -} - -body { - background: #ffffff; - color: #333333; - margin: 0 auto; - max-width: 960px; - overflow-x: hidden; /* prevents box-shadow causing a horizontal scrollbar in firefox when viewport < 960px wide */ - -moz-box-shadow: 0 0 0.3em #255b17; - -webkit-box-shadow: 0 0 0.3em #255b17; - box-shadow: 0 0 0.3em #255b17; -} - -#grailsLogo { - background-color: #abbf78; -} - -/* replace with .no-boxshadow body if you have modernizr available */ -.ie6 body, -.ie7 body, -.ie8 body { - border-color: #255b17; - border-style: solid; - border-width: 0 1px; -} - -.ie6 body { - height: 100%; -} - -a:link, a:visited, a:hover { - color: #48802c; -} - -a:hover, a:active { - outline: none; /* prevents outline in webkit on active links but retains it for tab focus */ -} - -h1 { - color: #48802c; - font-weight: normal; - font-size: 1.25em; - margin: 0.8em 0 0.3em 0; -} - -ul { - padding: 0; -} - -img { - border: 0; -} - -/* GENERAL */ - -#grailsLogo a { - display: inline-block; - margin: 1em; -} - -.content { -} - -.content h1 { - border-bottom: 1px solid #CCCCCC; - margin: 0.8em 1em 0.3em; - padding: 0 0.25em; -} - -.scaffold-list h1 { - border: none; -} - -.footer { - background: #abbf78; - color: #000; - clear: both; - font-size: 0.8em; - margin-top: 1.5em; - padding: 1em; - min-height: 1em; -} - -.footer a { - color: #255b17; -} - -.spinner { - background: url(../images/spinner.gif) 50% 50% no-repeat transparent; - height: 16px; - width: 16px; - padding: 0.5em; - position: absolute; - right: 0; - top: 0; - text-indent: -9999px; -} - -/* NAVIGATION MENU */ - -.nav { - background-color: #efefef; - padding: 0.5em 0.75em; - -moz-box-shadow: 0 0 3px 1px #aaaaaa; - -webkit-box-shadow: 0 0 3px 1px #aaaaaa; - box-shadow: 0 0 3px 1px #aaaaaa; - zoom: 1; -} - -.nav ul { - overflow: hidden; - padding-left: 0; - zoom: 1; -} - -.nav li { - display: block; - float: left; - list-style-type: none; - margin-right: 0.5em; - padding: 0; -} - -.nav a { - color: #666666; - display: block; - padding: 0.25em 0.7em; - text-decoration: none; - -moz-border-radius: 0.3em; - -webkit-border-radius: 0.3em; - border-radius: 0.3em; -} - -.nav a:active, .nav a:visited { - color: #666666; -} - -.nav a:focus, .nav a:hover { - background-color: #999999; - color: #ffffff; - outline: none; - text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); -} - -.no-borderradius .nav a:focus, .no-borderradius .nav a:hover { - background-color: transparent; - color: #444444; - text-decoration: underline; -} - -.nav a.home, .nav a.list, .nav a.create { - background-position: 0.7em center; - background-repeat: no-repeat; - text-indent: 25px; -} - -.nav a.home { - background-image: url(../images/skin/house.png); -} - -.nav a.list { - background-image: url(../images/skin/database_table.png); -} - -.nav a.create { - background-image: url(../images/skin/database_add.png); -} - -/* CREATE/EDIT FORMS AND SHOW PAGES */ - -fieldset, -.property-list { - margin: 0.6em 1.25em 0 1.25em; - padding: 0.3em 1.8em 1.25em; - position: relative; - zoom: 1; - border: none; -} - -.property-list .fieldcontain { - list-style: none; - overflow: hidden; - zoom: 1; -} - -.fieldcontain { - margin-top: 1em; -} - -.fieldcontain label, -.fieldcontain .property-label { - color: #666666; - text-align: right; - width: 25%; -} - -.fieldcontain .property-label { - float: left; -} - -.fieldcontain .property-value { - display: block; - margin-left: 27%; -} - -label { - cursor: pointer; - display: inline-block; - margin: 0 0.25em 0 0; -} - -input, select, textarea { - background-color: #fcfcfc; - border: 1px solid #cccccc; - font-size: 1em; - padding: 0.2em 0.4em; -} - -select { - padding: 0.2em 0.2em 0.2em 0; -} - -select[multiple] { - vertical-align: top; -} - -textarea { - width: 250px; - height: 150px; - overflow: auto; /* IE always renders vertical scrollbar without this */ - vertical-align: top; -} - -input[type=checkbox], input[type=radio] { - background-color: transparent; - border: 0; - padding: 0; -} - -input:focus, select:focus, textarea:focus { - background-color: #ffffff; - border: 1px solid #eeeeee; - outline: 0; - -moz-box-shadow: 0 0 0.5em #ffffff; - -webkit-box-shadow: 0 0 0.5em #ffffff; - box-shadow: 0 0 0.5em #ffffff; -} - -.required-indicator { - color: #48802C; - display: inline-block; - font-weight: bold; - margin-left: 0.3em; - position: relative; - top: 0.1em; -} - -ul.one-to-many { - display: inline-block; - list-style-position: inside; - vertical-align: top; -} - -.ie6 ul.one-to-many, .ie7 ul.one-to-many { - display: inline; - zoom: 1; -} - -ul.one-to-many li.add { - list-style-type: none; -} - -/* EMBEDDED PROPERTIES */ - -fieldset.embedded { - background-color: transparent; - border: 1px solid #CCCCCC; - margin-left: 0; - margin-right: 0; - padding-left: 0; - padding-right: 0; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -fieldset.embedded legend { - margin: 0 1em; -} - -/* MESSAGES AND ERRORS */ - -.errors, -.message { - font-size: 0.8em; - line-height: 2; - margin: 1em 2em; - padding: 0.25em; -} - -.message { - background: #f3f3ff; - border: 1px solid #b2d1ff; - color: #006dba; - -moz-box-shadow: 0 0 0.25em #b2d1ff; - -webkit-box-shadow: 0 0 0.25em #b2d1ff; - box-shadow: 0 0 0.25em #b2d1ff; -} - -.errors { - background: #fff3f3; - border: 1px solid #ffaaaa; - color: #cc0000; - -moz-box-shadow: 0 0 0.25em #ff8888; - -webkit-box-shadow: 0 0 0.25em #ff8888; - box-shadow: 0 0 0.25em #ff8888; -} - -.errors ul, -.message { - padding: 0; -} - -.errors li { - list-style: none; - background: transparent url(../images/skin/exclamation.png) 0.5em 50% no-repeat; - text-indent: 2.2em; -} - -.message { - background: transparent url(../images/skin/information.png) 0.5em 50% no-repeat; - text-indent: 2.2em; -} - -/* form fields with errors */ - -.error input, .error select, .error textarea { - background: #fff3f3; - border-color: #ffaaaa; - color: #cc0000; -} - -.error input:focus, .error select:focus, .error textarea:focus { - -moz-box-shadow: 0 0 0.5em #ffaaaa; - -webkit-box-shadow: 0 0 0.5em #ffaaaa; - box-shadow: 0 0 0.5em #ffaaaa; -} - -/* same effects for browsers that support HTML5 client-side validation (these have to be specified separately or IE will ignore the entire rule) */ - -input:invalid, select:invalid, textarea:invalid { - background: #fff3f3; - border-color: #ffaaaa; - color: #cc0000; -} - -input:invalid:focus, select:invalid:focus, textarea:invalid:focus { - -moz-box-shadow: 0 0 0.5em #ffaaaa; - -webkit-box-shadow: 0 0 0.5em #ffaaaa; - box-shadow: 0 0 0.5em #ffaaaa; -} - -/* TABLES */ - -table { - border-top: 1px solid #DFDFDF; - border-collapse: collapse; - width: 100%; - margin-bottom: 1em; -} - -tr { - border: 0; -} - -tr>td:first-child, tr>th:first-child { - padding-left: 1.25em; -} - -tr>td:last-child, tr>th:last-child { - padding-right: 1.25em; -} - -td, th { - line-height: 1.5em; - padding: 0.5em 0.6em; - text-align: left; - vertical-align: top; -} - -th { - background-color: #efefef; - background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ffffff), color-stop(1, #eaeaea)); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr = '#ffffff', EndColorStr = '#eaeaea'); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#eaeaea')"; - color: #666666; - font-weight: bold; - line-height: 1.7em; - padding: 0.2em 0.6em; -} - -thead th { - white-space: nowrap; -} - -th a { - display: block; - text-decoration: none; -} - -th a:link, th a:visited { - color: #666666; -} - -th a:hover, th a:focus { - color: #333333; -} - -th.sortable a { - background-position: right; - background-repeat: no-repeat; - padding-right: 1.1em; -} - -th.asc a { - background-image: url(../images/skin/sorted_asc.gif); -} - -th.desc a { - background-image: url(../images/skin/sorted_desc.gif); -} - -.odd { - background: #f7f7f7; -} - -.even { - background: #ffffff; -} - -th:hover, tr:hover { - background: #E1F2B6; -} - -/* PAGINATION */ - -.pagination { - border-top: 0; - margin: 0; - padding: 0.3em 0.2em; - text-align: center; - -moz-box-shadow: 0 0 3px 1px #AAAAAA; - -webkit-box-shadow: 0 0 3px 1px #AAAAAA; - box-shadow: 0 0 3px 1px #AAAAAA; - background-color: #EFEFEF; -} - -.pagination a, -.pagination .currentStep { - color: #666666; - display: inline-block; - margin: 0 0.1em; - padding: 0.25em 0.7em; - text-decoration: none; - -moz-border-radius: 0.3em; - -webkit-border-radius: 0.3em; - border-radius: 0.3em; -} - -.pagination a:hover, .pagination a:focus, -.pagination .currentStep { - background-color: #999999; - color: #ffffff; - outline: none; - text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); -} - -.no-borderradius .pagination a:hover, .no-borderradius .pagination a:focus, -.no-borderradius .pagination .currentStep { - background-color: transparent; - color: #444444; - text-decoration: underline; -} - -/* ACTION BUTTONS */ - -.buttons { - background-color: #efefef; - overflow: hidden; - padding: 0.3em; - -moz-box-shadow: 0 0 3px 1px #aaaaaa; - -webkit-box-shadow: 0 0 3px 1px #aaaaaa; - box-shadow: 0 0 3px 1px #aaaaaa; - margin: 0.1em 0 0 0; - border: none; -} - -.buttons input, -.buttons a { - background-color: transparent; - border: 0; - color: #666666; - cursor: pointer; - display: inline-block; - margin: 0 0.25em 0; - overflow: visible; - padding: 0.25em 0.7em; - text-decoration: none; - - -moz-border-radius: 0.3em; - -webkit-border-radius: 0.3em; - border-radius: 0.3em; -} - -.buttons input:hover, .buttons input:focus, -.buttons a:hover, .buttons a:focus { - background-color: #999999; - color: #ffffff; - outline: none; - text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.no-borderradius .buttons input:hover, .no-borderradius .buttons input:focus, -.no-borderradius .buttons a:hover, .no-borderradius .buttons a:focus { - background-color: transparent; - color: #444444; - text-decoration: underline; -} - -.buttons .delete, .buttons .edit, .buttons .save { - background-position: 0.7em center; - background-repeat: no-repeat; - text-indent: 25px; -} - -.ie6 .buttons input.delete, .ie6 .buttons input.edit, .ie6 .buttons input.save, -.ie7 .buttons input.delete, .ie7 .buttons input.edit, .ie7 .buttons input.save { - padding-left: 36px; -} - -.buttons .delete { - background-image: url(../images/skin/database_delete.png); -} - -.buttons .edit { - background-image: url(../images/skin/database_edit.png); -} - -.buttons .save { - background-image: url(../images/skin/database_save.png); -} - -a.skip { - position: absolute; - left: -9999px; -} diff --git a/web-app/css/mobile.css b/web-app/css/mobile.css deleted file mode 100644 index 167f502..0000000 --- a/web-app/css/mobile.css +++ /dev/null @@ -1,82 +0,0 @@ -/* Styles for mobile devices */ - -@media screen and (max-width: 480px) { - .nav { - padding: 0.5em; - } - - .nav li { - margin: 0 0.5em 0 0; - padding: 0.25em; - } - - /* Hide individual steps in pagination, just have next & previous */ - .pagination .step, .pagination .currentStep { - display: none; - } - - .pagination .prevLink { - float: left; - } - - .pagination .nextLink { - float: right; - } - - /* pagination needs to wrap around floated buttons */ - .pagination { - overflow: hidden; - } - - /* slightly smaller margin around content body */ - fieldset, - .property-list { - padding: 0.3em 1em 1em; - } - - input, textarea { - width: 100%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - - select, input[type=checkbox], input[type=radio], input[type=submit], input[type=button], input[type=reset] { - width: auto; - } - - /* hide all but the first column of list tables */ - .scaffold-list td:not(:first-child), - .scaffold-list th:not(:first-child) { - display: none; - } - - .scaffold-list thead th { - text-align: center; - } - - /* stack form elements */ - .fieldcontain { - margin-top: 0.6em; - } - - .fieldcontain label, - .fieldcontain .property-label, - .fieldcontain .property-value { - display: block; - float: none; - margin: 0 0 0.25em 0; - text-align: left; - width: auto; - } - - .errors ul, - .message p { - margin: 0.5em; - } - - .error ul { - margin-left: 0; - } -} diff --git a/web-app/images/apple-touch-icon-retina.png b/web-app/images/apple-touch-icon-retina.png deleted file mode 100644 index 5cc83edbe69203eaaf7d64e5b2596de6e01fff29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14986 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 diff --git a/web-app/images/favicon.ico b/web-app/images/favicon.ico deleted file mode 100644 index 3dfcb9279f60f2396a8f19fb6607ff281800c905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10134 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 HxB~wLBPRzvo?bs5u)ML^KP)Z7$c zVPOGoFb{x%1AMMT`}+WZxw#U+4FCW;Ai=@`urO;zOp^SMx+$}MnuYCO?X1kY1`8`7 z$h=xH>2JBgq`&X{->c0{|KPi-R#zNk?`f&3>jI2f;1a;b%KG>Nip zIF5+$^YV-Qj|-y%5aI?LSj5>_P6Dh#ENnt7jBWtTWS@g6mA``dkHW&r&q2muqJ4IOcPJU5G>YgoZKaG25G5C&NTEA7qzu%bC=D0ojca
v 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 diff --git a/web-app/images/grails_logo.png b/web-app/images/grails_logo.png deleted file mode 100644 index 9836b93d2cbdee17ee3c18329bef39ec724dcf97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10172 zcmV;tCqvkYP)xN`*#&2{`c=+Mi>oLA_l~-KztyOV$cm0({QU$_zwdalhpoK&ajyy zAt3?cf(&HfY;3Lu1_pxo zag4Bt+HfL#HYXd4lDpATXG$XqAb=QPt`auj&4#fl!HkkN0x?p0Jd3$Nu@1z)-u}L` zcg7P{Sj+=K1u)h-KzwK{Ga$!2OdQC52V@E|IF!i!M+SM*)xqH-EG!HUQ&?=r$Hz|u zv0;2rOvBhPngtZYFmV0xJ_ada2wz@a{tSpVGc)@SifK^HU$}6A(cIiT52{>PR#ujQ ziHQl!dH(#l5K!(v6F&>%p@yZ}V8Q*D3K_(OSio#xQZNY$3i=OBE(}sqQVbx&92^`n zrKP10o;-Py(cjL9q-}`%X|$kO3B$5{vd3f}9*fX`}!I5IpHfxeDj7aWYNj z5o2RuV`E}qWnp9hMhU~0CqFM=TK`IqVIYBix-^4sjKu$#4%hz|?wHoxDRZxiVf;~{m zNXUF3`w55*1UyhZr?|Md{zJtiL1G{_l+OUAO<`=1T31)sr9g8);;syuZbCV}b&BAW zm^Il7C1n=R(gD*oi?shYF4YDb2rMrC_w@7>fY`ud#23U@Q&am7OqppQHVgyP1V}wA zOwaG%zk`8^@H>bN5>r)G1?z*!!yE}LhQvW~Fmpj-OxJe4odQbLdDAr*rsf=Fs9c~0 z4&l}nIt(32XBj4MHerwuWM-&~x)K2r7ZDL**s)_rzoDTa!`ruSH;ajhF@RD!C^3TQ z8#it+e*5-KT2oUKq+H0w#RcR6hUwF%%K}3=5~K!Lbmhs&$S{B~2!Ol!YC(m_A1GT0h+*b2LFI&z)V>E|b5M8y@n(=ZfB?)^Ur3Wt6u;j# zH&f@zHT*YnSP!L^rIJQZH7twhA$n-xgY-XD!kq<|@y1Hudns)<`iS!18 zA&b5N&=vrAPV124NGCusg-~$F43u09>8iZHzyG5WEtL@r^RV$f2RJ(6k8L_T7sbg{ z>~ifV0OdqlfHZR&n=%C;$|#wHvIyz5T5U0n!J{UJ!_i7MCX;Cd$(c<~PQD~41xJ9}pJRTx@fOPP3!D!^Um8t}?al74}e*;M^5C~9? zqnmHL-FM4sAKwx5|W(U6vo@M-}}jRMQadlEWmFc{3EMXgrr4*~Kqjg`$1 zuCIQ-znns7u~R34FzLP?37fK5$J@ww=SaWBo_-yYK2 zY_>B{N1RUQqwMVL0p%`IcEQ1zMx)_n6lky>Y|~6$gdOvGy+i=7V^z?Fj@7a@k!>Km zHat0zqRYCNa8hCnx-U5p3g1t`FobdvlElkY@%|t|@n0pFgzQrU+bkA(Cg$csR!}Vo zdG|*_4pH@fZnNI(EStFfswCRyb+$s6{68?xZvoh`+L$Fl6l!j|O zAn0*YONu~BIY`Tu&+~crcGl&r+W#`iWM^h~X5V>c=6#=M6eK;#e76RiL=6{t4pHD=^^fzZn=46I0vS*_jS!^co_!S*^3>38=OAB`}9%b$^{smyB4| zq;5m~CY&MpAO~+FLBh*m9DDG%!rSOy7?okaTH@^ z2TD%yQJIe0;MqyhnPtXe1r1VUDnigAK$c=3sMfKLj*bubJCF(&O%OZ~zgZdv0OV*{ ze0==#4Gj&gp5IAY;m)1icy#hM!eVM_Dvs+IaDV{h+f>H5%;9jnjN(_agAYR{+X&=k zZP>20Ng)Pbw&}^u?Bv^DOFzggj%C%k|9!po?&sUtCx?2a^3Z5EJKb^+B|GiBF65gK zSuP%*0nk8yfB!b3p&rAG$XQB|$qL!PPMG2C7;8T!EXq5H0Yt?&BYYNevH}&Go0XMi z#{cdS<`#?PTXOkachT6yveYh(Y$PDn7iDs2pCkbZFr_-^z8lsDvS5@9qzO_^NJ#it4I*}`p6Ft9bTnPoNl!HIBBOa9fU!F=GSU?l73BiktED!R z$+RDQn|4Dj9}9~5J((pspqNX+t!Ke`s;P}sHk5afYF8^+4J6h1qN~&R__$b5P~d|j ze^us0Yrr~N$Y#m_SGt?hY}@C5&PS(_1Ofq3cIgdv;mUDokk6XZnO3~VYQ8@r)dxp@ zV6$^Kn8kjE+5foAW@g7&^>-$wm-`aq+#I^MlCKn2?q_avUtixDwShQRcS-uw4pdFd zr3MlV(>gFPAXu$dx@zd6ww|7zFXQ6kx@k_-0W^A^e-H51#>U3FD5IXq0Rq4WdwY9B zJr~y#Nckjq>f+^$j11@K=;#ixWC5p2fP31<#{ebo!#CTtHAjb7Vs_Bu5eDBIqSo!_ zCLC5)(UQ#qeDx4HPL^&gl}3zsY_9}3`O#i`1-=y}Hq3)hpkG8+a@?m!xCLOYTOcK? zkTVG|x)PTCO&^ZPlq`Oj?Aw&1&36WluoARvHrr04(MY#gG~xB-<>dipvpFd^I9R&! zgl}Wr-Q7mIx8!}W%Pk=xAzP`OmzOux+S;lku!vpr|MBBaZIobRx1tM%hhGF(ML0c? zIQG;&4_kF$`_ITepB9gN+u#cN^L}Nd#mh_BDvH92NKINNB+$Sd_lB8seq3&sqq^XJ zrtG+Q)Ym8U_&>N)Z%lGyPEO7-9J^E;S;PVz?O2ALwuDJJ)6&vv^YimBLKz0(eHrZx z9HHOZ+uOtWAOPh}9IaBBZMbjR+*iRuRaMo8*r|n{KMoHMpM$RyC_%=YXl`ykOm*sm z-F^ViI=GlQ4NYPt%@ME@%aHuAum_MuzTh)6GfRnyiS;EVC5`y>?B94~aeWlaHCe@z zjmDHEVX|HU%L6nHC*fA&ey|6GutXq)kl537XW- zL{Oqb2}r1BCRT|iGsb8z)k!T(m^cU4i~dq$60^tNZgIT5B@OCi9$0)KNafI1*@5Vn1;KEvbLV&U;Bw?K+|a( zXSZ5LGOslB|LsQ*q)>^tphG^vipS+z9_lj8(6FEfv`nX0m=-{kn@)ZP`%;GuxYQV~ zVKEDWjwhvunWrKE%!vdrGtOY{!$&)xpPwHf#<}k@23z?Q^VfQh$M}fXn3MDles_qz zGg99UUvtB|1LD04nw@Bbdky;8+~PDZ3p*JQp<#w_EqE=HkFFdZ^Tm<;H^|LL76<=8 z!TdW6MxCx5Y((=ERTGOVDk>IZL>P@=Ig%oA0p9Xqu6!_h)nIQP{^wz?BLb*J;=3lnE$eBqIXO8c_4W1d;YQeOwgTvSgYp>&7>%R5 z+(%$avC_TN2PdTn=0flus|e+fy?wc0JsHRE-8>YECLv(CBhkfBi{3f74)@YKQ?i^A|;O5g8c{vEcQEm zkIy2!tb0@yp)4qThU_7%3U4}ROs40?YKDT=E;?;VlQXHI{{dM{XA#`&P2yBAj zK6#Fqm>4&uyhVE2LYzq7$?pLuy-+#>4Gj$+llvJR9i4z2hvVbpc!OLp3R)9#jgyMzf3kV2!9qEaSi}RRt3d%w>SFUwmWII02W}^-p zn`4^CUV8fXtZ?5?+1HnAJd^fWZ?Y}r32gcNJl-Y%-NTN5_u7QX10V((f;2)%N7D|A zW7R1W2n)5!#|0FPL*_){3~cmlG#amhf>{E?s-&>i5qb|w>t&o8l+j5N3-I4&;3%yC z%uQoSR?|3NoQPL{fB&N}X6?|>5La3>9>B~eZ_cgoK2Y!#JBbf^jJ+DMv-3oIp&XIRLCHSpR?x+;Xe&dyN4<2WEI2W*^E+%^w59+?96t4o?vqO6J6!J9pNcJ9lm)m^gu`Z3V|Z z4Dyv%9mmGT#vxdwY>-o^$sF9#(ebLc{G&~i`(Tc#D!@9nZQFJc=E9W4sC3GnR2;+O zJJgB?1ZIxpNiG2+;)T5 zA2@2u(xpo`%T&Qmj(daXrJYASaeDxU#+H|t=ZpN!pQ#Tx-?C}brtRz2tt-yW%`LK6 zEPJJ+`XriD@^SX1So-?K3i+Cg^q%)|4(B2z$^s)mD z`D|=_gah-Fh(yoF%jXxdv;Qh%J^#MMK5Hyww$UyQJOyiC_*u<|hrUc1TfgFaKEA1` zX*T9SFeM;_^PbGi%sl|eSy6^Li)=zP!sSKz$jZGH85voM90|(e=g@_9Sx?Z|tgNhx zyu3V5qN=#Kn5CzuZ^rj{RaI4mAg9qY%}@U)uCi6DR`J}($jAux2d-SX(h2`*1)BdU zWPO?_2;wOU*w99fwAJD;hlOhfkegj_jN5y^L_R&q5x1_$79sWe>AEEv)PI zEe@PU?4rH{2Opbxhn4N?j93; zlhb}Km+IKDV-djNcHnp&aVu^NZ2DkrZS6Y=2?_goGOP4(B71Y~M1Fen?zjh|AJn&b z#}Ade-Bp-xS#Ummeg#_d=kCMFLAJm^1lDF6L=>q}7~xdN93r%@OL#V8()S_Wkr{Cz zh*lr{R7}mp{0`B_q>{HlQSsn?jfwvc6;&Kjf-ar#u!ej_wg+vUe%&{R{7zq8bBd{) zPxwj6sXG%^DwdYG`|X+G%gX-RxUeth@gHx(>Tb!Z5Mbw!&n~Qf#qR7+w2$3hfk5gt z#;%Cqx!*pOv=6QI%T&`cogTP%#t)s?S;CR;^>*K;FUI~OKs#3&9aWKqtKaKRcPE{M zgzWo51R*900x=0fFcSrrgMuI;9E4FYBI5u#jx#DEDrZ#YID%o+0RcH67!^S=gq?sa zA{aOU!;%FO0wD{8G+8@6-+ldFQ~lDN1jhL_sY4yQ)Aee(_0?DR-n#X=du-~ELPz_J zZ)>omfVGk}BDh+pk}oqx4=4Uu{K$n z+dsnJ-}x=Ky1r*BdXgQCk&}WYMk`%YY5y_gf!-ejK$%hunL%JWcY$dQq78haMh2ZN z3-+r>9ltB!w3jD*LKn2QwX@bnI>l})Zmes|JegOswP#9t!03=d(tMWzI5Ua)baZvh z0|3-gOn5Ig&wShKCUoi$!ixgV;4~UCQ-;ar2ANCovI!!} z<`TJY%4NHiY`_DMN4=^JPx*ApojbJG$#q!S&4^K}Y#LeQ`u3}@B-}#3W0@^*+*Km8 zZU^db=%OC-5=S}tsTR-f;mX}7%Y|`cp>dr+xwE&}_e5DYrZ~xTVfHPL}wO(*jBj$FX%zPq`(m72}wvG{mYE=Shr zDAlzXI`CUuP*6Z#tAZ}%{v4kDfZVRPD(^*$7CoGml|_!Ii*`qD`29W^1}`xeET}Pf zYnjd{N)aX0L3h1Tx&Qu?&4wD;mth;P?N%}6=2o-xU3ta`Hum%slN;+T7yd9k zG=AIiifgRn4G&(hs79DauhwwpCgk0i&UOKQ0`S=~X3QA!!1*hOiryiB&qt<9$j?#CL34BSI@U?tEKMxh8`2F1dL$_+Dd*t9gS%Z>=5%7BcGJo-6J+aN zDQ9(7&ePLV@4|_u)DuXdO^|zEXENvIqm~W*ee~$jYv#?HM{P(4zuG~W;p|#jW3rpO z_@&WXt1ll}bs zTAaCnJv=<(3f!i`pkC~g3# z?p9AQp8I6Ph!HKjckkY%On`$s)MyL@V3+W1kzYMBGIDKcX=y6zjo^oW?%cV|yu7@l z85tQC<|I@?i9Av-B=tF`vvM>>XNSs4qQevnbwA3)s@&TY6?JCCiWTdUlaq^OHx{Wr zSH_JS=f7*$t`8uWu$Y*bOWE1kGU`XNur-4bd5gH}YAO3V z|KIG%`=9^afmnR0fE_#cgY5)Ny>;V*!HxC(`}#5Oy#M09_tjwZ^70yq$@>liGw}kH zFR?VwpFe-)oH=u78~Vl-bHv5PNm)*7TriacMt)+boz~V?a);Aa?x6S3ArcnJC_Iyo zXZr9=fW8?_CKItpQtG^o%PoB?bpKQrwQ_>ePZ;t?ndtna z>TSMDOT)ku=XROyicRxTRzHB~1>G(OLNuva1OmFee*OBlhYT4)?DJn=il>R9b7!7S zs2zN#{pY%~XRy7|b!9aWX~L@(E?ii|ZobmMo_hE0Jp+qt7!LqC-2|hTL`6l>+0qh# z* zi822R^?ZE!^5vRt$yyXN@f0+s1di=F@hzJ$dETsp}nF1nLFoADaU z7&Pg&C--7a5kNSDr3{$B{yFnRhu_!jp35xl*QMidNypH&4k^2IEFNHNQNRen#ezk8 zska-j6&pBkU><;2>ya$b4fl;kKC_yCr-)SMZ2wRfUjT<-2=raW}e~m?y;v`m#PQn*Z?$f7_ zq%t9I12|VfzF$^WR$4nQd^~S33d}%m90>re?4|5QLoe&hQl!v*fN$sY>C+F68a0X{*69Te*VJV}^sl2o0X*Z;b`N9fz3}kx zLWS|bf`0-_K7qc3sTlMr7z1B#*|H^{2P4JEsX@Zu#Z`lrFGmZgGcZzWXlNi+BNaP= zKP>xIsAH5ODlQ9kMLCWM^=-p&z zaIXX^t*B%1kq@wN{{i+ghfl9#JAVC;wX~V-I-?qhqNpWL@ z02sey+{Ge0q9Y>*LC1PV4R*A7asU4Peu;^RGk9y=$H(Uc833xX6cn{w_U(De27^87 zRju!;0jUIJ^2|t|yV$1f3GyVJ{7KoL>z10DIvz%0VqIO`WXMCO#HFji-5Y=315kc_ z^5jW+xuKv9jy0arw6lvkk%dsaqBH+tY1L7-^_NdsY{)Xn(p|Z2E~}|OF9FzAww--{ z=soCvAKF_gD$j?3k}s99)nj2r6?p()EK5t6#cCVQvu#J;u>nxaxrGErw@`@hfFJuu zJ$R94I|y@&qKG>&EXIOSmTug*(ao7l=;~GJa>G>0V3{YZ{RzMVOgP(WU1=(743|D^wCG(*t~i38e!YA@=8s+^<%m)=cc_GWlX@df5zYAqf+ed zo%qOPRYWqqxmBeUg9(-2^xQSV0TH&hBYGPA85r+oSh)Rqp2tAlM7Fsgs2O!^$zVaViIrfVge(@&%jO@|X^m`LN;dmy-xSu^a>dbk&TOBD$G^JF*DIRzw+>N0 zWo2cbMMOmC0g5H`YC`pj0{~V$^w2{qzyfOl+HKgDa}FFh;NTvDrD`PMsC6pdk?o2Z z)$GE#cJ=^F7ogmSD`EJY3bAa~tXWUc_kR8QX#xTQRuG7ItDCm|haY};`GN%t$k6%K z2?G^Dj}%eg3A%{FvlrUa!g8HoT3WgXtY1Txw=-r`JO7mhr>cuxyLK&nP49~j z3=I54d1sblX(AVF-MTeX?PsLaw{PDUuw`c}@8;qrk)Hb_>Rz6blCl_mo})Gz0OWE2 zaRKx$^3%C|1033zjK#E?+Th1ZbpRxZ}5Xy59Y7*USP;Oc&mYs5} zryNs}P$(r z&~~hzlL5 zTz3r?k_YtNAjpQE(<_FXvy&XTJ!PRuDhA44oH}*trWrG4{DLBzG0vhK^VMo z)226u(b2T+ zQV;_jJ(ys?XkueyNtlOR*%TW#Y#0oN3_;zrU(@Tw$(QY(9lZgY8PP5dxIT)v17*~b8~YafxO8H zZo688M27=dU}vXIoAxu>G=t3>WSNz!&*(L8e9>P5!~97de8kfE%gnc8Oi_K^v$1uL zr>j|A#xF8QaJni_Stq*J_X~Uao4X=234r-lYx^n8m8B=L@BcHoWJbEjMt~U{H&v55 zU=H~{3}?&tdKHweN~|>(zGAhu!7^+MbjfKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000C&NklX8FVAZW(3RqI(!&6cf^-#Rn-tq*dvIhyg7sBZ^3= z<07($bgWi%i0n;^BB_5u8NrH-P=kar#I`XHlA2j&tsO1ar7VK9qr^4lPwzcGobP2U zMFjh>BEQeemwWEH_k^5>55IHI5ky2po`lLHah1mgRo>SlrIb>B^D4DaE|<&YGBFIp zFwB9(m-eN7X`(i>&1^Gox34d)FRd>vejMlubOpN1pH%DbD=N3LDtA8A(EnW(vZm5L zjr^7WVuoQD=Kq9P6Ki5kJ_OJGhCBlg9zwSS1SuovaKB1xTjlO$J8$Rhyw$yDfTT!@ zB>&M2!!XPN72&4X6q|e7EzQy_t^N!=2SHjV;KNhMR~$j^qQeV#01wtZ6|-Vi%p396 z0rWwAP#@$8U>JsB4yG85hS4w@d+%?}ZOv`XU4H_ey8!Qfk3#V>yx5CUQeJ@|Z>ntI zmDNkda4}pAXFuqte(I;;Q_cYXPJgGrlSmKgAw5LY9BK|Vhj?NbhGCeyB*tFRD|(4M zrpNS{M6QCX;40j{Z0K6E0Anj!sbP-0y1JzK} zAN5E57tgQeSM#g+h}|A(kF-a^&bLc)FT0oB%S3K+lbh#XW{S+(d37_sh%h95$&owjs!4=>CWc-km@LN=|wT?VmLk8VijD``Kx0+M2e$yBgVu zY(zE=XFGx&!H!_?ap4tS;T3Q2j4%wtFb9eHWPP$eSt(6rrZQ8R3&H4EbSyeH^|rdZ zeNE-gMfAp|)ZH5>9A6Z8&sh~(RplYO@^ZN!Y25j*n3$mq!E$moNa z?pSxMJ9hF%YuFmLhFv{!M$X6?aa_h_T*m1vtL~VTNRam_CbvB++Xlp9lo=$ z{ZxMH2=W9H=RjP?k$IJ#FID>9L_&1luaW0ey77@yTSQ{pEWyyChi8~!7>3yg5S>gT z!^jXSz>icmQxM<1Dr+9(HrjFB#PLQ8i?X(}*Cy_q_b4GBLkE~tUPa9PxLMPgaS`uCDe9yrM{0`LgIXX^Adc9Z;v+o zWPgtL!f#X+Edx87Z*U%xUWe$giAUi0hj!)8?i!4&!PvrCN=4-S#VBz=Q992*d8e=F4`(3pFF(XF;87$>S;970!od#l7Ot_> zDzH0<`dWl*@Z2&C!!Y~6ZV}lc5|yCD5-Xj@H7ZI%0Y`JlHK$Vir-A+k009600|1{o Vd*l#Wn-~B9002ovPDHLkV1nEVK@R`` diff --git a/web-app/images/leftnav_midstretch.png b/web-app/images/leftnav_midstretch.png deleted file mode 100644 index 3cb8a51559b4bd4ed79fba033b4274b33e5cdd2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2883 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 diff --git a/web-app/images/leftnav_top.png b/web-app/images/leftnav_top.png deleted file mode 100644 index 6afec7d32f3163446829de0ed38099021fc7b0d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3317 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 diff --git a/web-app/images/skin/database_delete.png b/web-app/images/skin/database_delete.png deleted file mode 100644 index cce652e845cde732ac3ce9a4132b597301ad660e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 zcmV;E0&M+>P)ps_J1 zHhTmGl@tMUh=_=a3Fb%)BqZVTW3s!xH?UsxE?7A5@n+t<@6Gq#%m~l(@IOPFT;%il z03|#}Sa4nU2-$-Kn!4}FekQv@$S0FY$L9!N0g;c={9!m8K4zLG48uSu6aw$J+ii5a zT~sO+G#ZW9!I0fqFSvY9*@h|sR=YqL#x%oU@(yD@pz0* zr-R{eDEHX6V*RaK<|4rWl@GKt@8COeKZT>%ICBq4+h_I-+?Y*V28oxmqBc+Oz5 zc>4@kzJgDe<1lkKXYEtktsNC`FoTI)4qLaF!_1E&4qv>EKx`iUcee83)!MzalltZ# z3K)~8`*H_w9^uf5^9X)<39-6>(AOuJvu0IKc#FRkFoCa%ULtC>8v6bIR-H|{S~CWm zy|LB2yL+L!Vs5g8ONBz=aUzj0EX$JbfSV}a#vT*B_2)32Uc<0oLyzLS9V$=7hM4?~ znM@`|iEa~8)bZW?7q}d~l*7K(I`+@}grT|_=WaH**u tj~DMRZZpzVy^OjT85Vq(G=8XD@S91FH}kp`d7hyPh1 z5CCa%X>*RH50W(1GMNlqE*ChCgTvu4bCM)M5Co)BDTG2HvvyYjmSvI4<)A2v`CcxU zQ79BpEEdf*P56K_c;lUWy=bic9s#4IZm`yWps?HR<^;5uf_%3rLf1Uy7}ym7{u3SG zgQxL#;V@<+y-&7GK#MIB!!Xb^&5SuEhPoOV9{wDJpWonQN~qlHho`!h-y&cUDCjiw zot3{JSR;b3Z$U9V2&bDtVsaL$Qu?FFtIb;kXm<)qqyl<=9Kq@&_)r^^)N|OJWjH)_ za7i;6X_aj`duRB^h5&`toyKA^3V-E1_yb`=eg>PPj8Y+p^vFkpk)_tg?(s>=HO~R< zNVkfdL~{$}rBQI|9QHR{MrpYhcBg@2p$?h%pAnUsbBDUeKUv#oTc6-&EEZdf$Kwze zM&QwZLDd6D&pd?=1#1F{N2f6?Hf8gwvt`>|pf)ft5F|nm_AI~XywcT&?}K--v^WN? z_7vo-s3)9F{TXfF{hpqll^q2vdwBb}datvKg-yfc+gC^|#8-K5)%lB$rlxi}-rEGO xUZ|2A>wRp~(I5;*aZFyx-fDe3J-^%i_y?+(!m^mX(n$aS002ovPDHLkV1gwlT*CkW diff --git a/web-app/images/skin/database_save.png b/web-app/images/skin/database_save.png deleted file mode 100644 index 44c06dddf19fbda14efe428b9b1793c13f46b2cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmV3^_07cLZBR}_>&jXObH zw2it@svr%qE?kJ(Xuudu+DSW|WWK!jNvbU^UO02#+Tt zYOko4%Vx8c4Gh!M(=Qem7g;XcE?n0Qi^XD?&*vX7@xPFCIh;%;@xMr?(;$(vo9j9i z6;riZMJyIWG#Z6r7^-I5HtO{{DwPWQ`}>&y+Y;!yjz*&a$8prX=XtO!3$0d5J>%Mz z1f8>Jnx-7^X2#7Yb#zC2VYfZ>c17@L{s)8{OuWBa3WHFfVXfhLv2t?V0V~q5R2D*D z&315l_#iF}b>Zoo?-;+7*`WOJWsMw(x3WXv`@U*s@Y-&edFEYpz0skP)dFfu zZ4wIp&Vbb!+|0+3Qa}p<*AH-eY>3q8s6?RA)zqP8W39IT5HLFG9m1F);gE|P`L7@@ zctjKsn1rA6!ZZR%R^(SjU!r=2o$yGp<$KViK~{B;AIcgvN+J+&Nvur+W(Sw&=H?z} zGMRW^U!Nl3AvWzQ3~C%Z*G*(?qLfNCq;tpg2yRW4@yl9;p3CK)O-@c8Sy))OUMiKc zQp#QYFZe-*@LZDInR^#F=Bm=!vA2i6tkEJ#i0aggzp2D%3!>h~r~3uLt(-IMoyFAT&uF!>{(iS?1OX-eX zKw9bunxR5FrF6QaYs~9>A4#zW^dwIvCpq(+cfR?U`T6-{9LHUqo16RKcDwUVr?cX4 zIN~hJDs48~aRAJ}U_2g=KAB9SP$;0;Y@*$6Ly{z<(`i^NmbL#1W@l#$wOS3;YPBOE zJ;7`?L*?Ga6XzC292wl75}>gDz`(>h?is$JPxm#0jGnotoK|nAVM5$DQ z!C*kO-aeF@+Ejy?nVHEp8V&F~k7BWicsx!aH9kHLRpcQ?L&JFBAB4i&kAaVUxVvzh z3a-EY0%m%8nhI7|SE(QpiBL#sG#VUMM9}*(0mg2(Q$Zq;z|PJNd_Euiem@;jtJN@i za|c2MmsL?PR;yKNwOUA}QuO=7;V@#c7!{~gs?J7hAlsE7U#g?$aRkhSTqLq6iuCu9 z10_j_=;?Dc?4cZ386qH0HkgHTDT|HmGR`W4V2noNQJqfLJEot)q{V_UtsW+m31cP~ zDwWEi3HYBSoF4M;T?VaIdqinn1HZ9}32qs-PdwPbCf+WI6n9jl0-8cjV3%1FB%B&r z+`mzSliyLSH0dxYE}rk&=!uCa*V>()2znj`_XYjtbt>@4FLHnJE|G`xv)Ba@oLBny z1%3K7c4fiB^4{k6E8Pif0kNy62}b@9+N#0$9Ug7g~-`rQ^qx~m@y2OU8A z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5% za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_ zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI diff --git a/web-app/images/skin/house.png b/web-app/images/skin/house.png deleted file mode 100644 index fed62219f57cdfb854782dbadf5123c44d056bd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 806 zcmV+>1KIqEP)v;U&v3%|^C`Ga3?LtY&4dQB4Oz;1v;J%z!D&%WRH@BZ?x; z3)8@IUIv@hG|@IwyHLC`l{1<4BK>wam95g|i|?Cfzt876&-Zx_0f5*l-9`IJI&mHu zE6$@xB)6N}7VeR;!X8D!TAw;;&0Bsj?A071cO>X3K0wl7WZ1;Tg!4LHyNcnzoeQ7t zNW`aSlm8WXYkek&ir$13=ngczvf zV0vnjNpCF&K8px}dunv+`LIb-sOC$_jD(;IBI$xC|7`(+9cA>Vir_V#z{?k7SX^Ah z^71m~W@q439Ycqfhi7+gp#A14n1n1!e>$EdeATG|f798Y=ggzwEKH2Q!qU2QA(Se?dwqG69%>n$6rtE z%F(845Az8c{w(XgimJg96!jLMz?zS6I1HUm2baqQx7&@nx;lhHA!r6vs2|fqJETOu zLxeu2OQ(3(au%dg>AcZsWI(zXn9XJg1cLe8k~0h0wOL=&HK}7X k{AKr*U4z7Szv)i%9gTgghwgU$Q~&?~07*qoM6N<$g31kYk^lez diff --git a/web-app/images/skin/information.png b/web-app/images/skin/information.png deleted file mode 100644 index 12cd1aef900803abba99b26920337ec01ad5c267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 778 zcmV+l1NHogP)BVme|mWaqy4$_pJm?y9KM{-*hp?1+Ey3e-CEDooTa!B;e(Q>TSF?bj>5At13y1p zriN3w3x~5SfZj{@J4M{kp{?=M_Lh2bV+5LH)Q)5W!-ePA$RgE1@5f1cyHki0Y}JyVEYZF(LD$xXlt$7A5CgE@ zpV-&l%vf;=5kZ2-2gi@Y6J&=cuwt>!vJ^#(&n|LcZyUzi6Duj$$hJ1s*HD-#;k-w@ zpdrwAuoDG_N2bvb07G$Zk*?Hc)JLtW4yqOnic_$zO7NZ#l>Fm){;fE?b$IbOaX2fe z0la4g0Dfw2xk7Wi7NapVD8YMPCZu?A1QCK*67dgsvRKBLFtrM>?$%&_lD1882mzdO zWPdw5KWw6IT`m1b_8=lS5jt8D3=RDa=&jWzR-)S@56WMslZ~mKu1)-wpXB>rNBQ>N zU#K`#1B&v|_AQK;7I~B}OdGiUT9LX>f0xm6<;LeP!=vFjPsUQF*wCJ*dO)4YBypgdiuF!=i@6Zyi7F|q#K zz?tlSZULa@t1D?$e;f@b36&N!V2mjOHw|*FMR=dr@6o0ZXGBB_+=zx3%$`cG63Jm-*84Da1I50Ew7%?y?G#+5$ UVU>wEFhP-tNtBU=gM+~u00(^_>i_@% diff --git a/web-app/images/skin/sorted_desc.gif b/web-app/images/skin/sorted_desc.gif deleted file mode 100644 index 38b3a01d078418d3afcdb2765251a9f21b7995be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 834 zcmZ?wbhEHbWMg1s_|Cu}C@83_tE;D{=jG+)?d|RKCt}{bc?%XSShQ%-?%lih?%lh8 z|9*y1Fd72GGz1iXvM@3*urla?{0GVt3>@+doD32i4hNW;7z9Kl3=A9^nYh^GDt25@ NJj%i*$Hu~74FL5|8=3$B diff --git a/web-app/images/spinner.gif b/web-app/images/spinner.gif deleted file mode 100644 index 1ed786f2ece49ec5db07dee13a56ef38025b628c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2037 zcmY*ZcTf|19{+AO8xjIZfItFCFrkL3BodGwflvety+|>T03uy{D35o<4X`9Q3=bSU zojZMs3Qw_)j=f_!)B!!mUKqwc>ezd^4c;H{$Ifr|uTTHRC8&buXgI)uM*u&6{`~Rd zM}L3+_wV1IK7G1x-@ebEKY#i1<^B8j-@bj@wr$&s7cWknII(;8?sMnPJ$(4^-Me>t z_wN1p@#D#pCr3v|A3b`6qUeJM5ANT;KRi7A^5x65YuBDSb?WNXs}mCwVPRo|gM+(v z?RxX(&Gzlv_w3no`}XavTesf4dGq@9>xT~?_VDnybm`KK8#fLfJh*P%x(gRB?AWp6 z>({T(pFdAaOMCY0SzBA%hYueT6BF;;xnpHzb@}q;O`A4(d3im4{J5Z?;ONn#0|NsW zFJ9cgfB);(ugAv5a&vP_OG`&aMz(C(^6J&A@$vBk2M!!Re*DRkCvV@rJ%9duQ&ZFC z&6|%MJC>4?a{Bb?vuDqqIdg`~z*4Ws1>(;I2=4ORL zQCC-|R4OYgD_5;rwQSk44I4IW+_=%t&(GD>Rj=1yxpHM_Xh`ytnG&0k9<5Zz%KT@c z2mnYvQ>hsF`jQ_R5(mKIydH2saldkg!Gzlvi9nFeu<gyfnCs8|SGO1R0M3N~Sp zx@MoynP5Rh(303ldPHFemMT%$+lXy}A1JR?IwL6=E`apW=@Z-0R!QO^@j_&{6#;i|5R1o$ zJ1J~xCDQ$1cs9`DW9Z!)D)^+%&Ug81908UkMXX;jkp>#b+SE}d{`0S>>Ef(`Ns6oa zB~H-LX25y1!BDgW%?nC0$RettYz8zsuz>9Z!g8TH$kU;rwYWrSTkjuYCH9utgFU6b z*wzBKaG6IjEXYSpAo5j4&c(t zwi-c(Q6YX2N-v2q(mgN`>wuCTV&XSRUA4h-f8g+uV2k_=o;2wb`7N)&+7T-C+CT_Bu4KrjWmK>x0AbH2rmR&7+q6fX+R0o&}V!t?TP+g0{x`8PSP{7CvnEPL^Hzx^T2Eus2 zi$U6ZM7}+l%$}afWn#%|+MPTsC236GKi9-ad*Z9;Ymg?jSO$L1s$w4BvDzu_kH9>z zTWC{K?jx4~H3oGGt3}I}LWNw@H)C>9GF4^|x(5n#+Va}kr_cb>{a+K%>B+@JNrC8? zJOUkD3fe*NdA-rJupqo?FfRK}k zOm!l7Dj$dsL|kS`3FL3^@^7axrU9d*@79yf!+bu3kXbziU!v&TO3p#w{y_lYG5ZPzDh;giB_lkGp((nqZ12&%LTrgm4vY= z{ffd0B$DiUKReJ9>?{#_KVrMyhiu_A8fNd!&DWTZ4+9S|1lJHkLv-^}a0IC{WI9N! zQTY-}db!%OH^;l2ZeajnA&Q6Uv=#0KZB9;^^lzMOi^0~bS~m!&K#e6hia79(ItV9M SXP~*+AU!zMlD%~Wg#Hic*k=_0 diff --git a/web-app/images/springsource.png b/web-app/images/springsource.png deleted file mode 100644 index e806d001151dd0c5dfbb2d24e9255e7b1f3c1cc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9109 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 diff --git a/web-app/leaflet/Control.FullScreen.css b/web-app/leaflet/Control.FullScreen.css deleted file mode 100644 index 152f3e0..0000000 --- a/web-app/leaflet/Control.FullScreen.css +++ /dev/null @@ -1,4 +0,0 @@ -.leaflet-control-zoom-fullscreen { background-image: url(images/icon-fullscreen.png); } -.leaflet-retina .leaflet-control-zoom-fullscreen { background-image: url(images/icon-fullscreen-2x.png); background-size: 26px 26px; } -.leaflet-container:-webkit-full-screen { width: 100% !important; height: 100% !important; z-index: 99999; } -.leaflet-pseudo-fullscreen { position: fixed !important; width: 100% !important; height: 100% !important; top: 0px !important; left: 0px !important; z-index: 99999; } \ No newline at end of file diff --git a/web-app/leaflet/Control.FullScreen.js b/web-app/leaflet/Control.FullScreen.js deleted file mode 100644 index db77cc1..0000000 --- a/web-app/leaflet/Control.FullScreen.js +++ /dev/null @@ -1,163 +0,0 @@ -(function() { - -L.Control.FullScreen = L.Control.extend({ - options: { - position: 'topleft', - title: 'Full Screen', - forceSeparateButton: false, - forcePseudoFullscreen: false - }, - - onAdd: function (map) { - var className = 'leaflet-control-zoom-fullscreen', container; - - if (map.zoomControl && !this.options.forceSeparateButton) { - container = map.zoomControl._container; - } else { - container = L.DomUtil.create('div', 'leaflet-bar'); - } - - this._createButton(this.options.title, className, container, this.toogleFullScreen, map); - - return container; - }, - - _createButton: function (title, className, container, fn, context) { - var link = L.DomUtil.create('a', className, container); - link.href = '#'; - link.title = title; - - L.DomEvent - .addListener(link, 'click', L.DomEvent.stopPropagation) - .addListener(link, 'click', L.DomEvent.preventDefault) - .addListener(link, 'click', fn, context); - - L.DomEvent - .addListener(container, fullScreenApi.fullScreenEventName, L.DomEvent.stopPropagation) - .addListener(container, fullScreenApi.fullScreenEventName, L.DomEvent.preventDefault) - .addListener(container, fullScreenApi.fullScreenEventName, this._handleEscKey, context); - - L.DomEvent - .addListener(document, fullScreenApi.fullScreenEventName, L.DomEvent.stopPropagation) - .addListener(document, fullScreenApi.fullScreenEventName, L.DomEvent.preventDefault) - .addListener(document, fullScreenApi.fullScreenEventName, this._handleEscKey, context); - - return link; - }, - - toogleFullScreen: function () { - this._exitFired = false; - var container = this._container; - if (this._isFullscreen) { - if (fullScreenApi.supportsFullScreen && !this.options.forcePseudoFullscreen) { - fullScreenApi.cancelFullScreen(container); - } else { - L.DomUtil.removeClass(container, 'leaflet-pseudo-fullscreen'); - } - this.invalidateSize(); - this.fire('exitFullscreen'); - this._exitFired = true; - this._isFullscreen = false; - } - else { - if (fullScreenApi.supportsFullScreen && !this.options.forcePseudoFullscreen) { - fullScreenApi.requestFullScreen(container); - } else { - L.DomUtil.addClass(container, 'leaflet-pseudo-fullscreen'); - } - this.invalidateSize(); - this.fire('enterFullscreen'); - this._isFullscreen = true; - } - }, - - _handleEscKey: function () { - if (!fullScreenApi.isFullScreen(this) && !this._exitFired) { - this.fire('exitFullscreen'); - this._exitFired = true; - this._isFullscreen = false; - } - } -}); - -L.Map.addInitHook(function () { - if (this.options.fullscreenControl) { - this.fullscreenControl = L.control.fullscreen(this.options.fullscreenControlOptions); - this.addControl(this.fullscreenControl); - } -}); - -L.control.fullscreen = function (options) { - return new L.Control.FullScreen(options); -}; - -/* -Native FullScreen JavaScript API -------------- -Assumes Mozilla naming conventions instead of W3C for now - -source : http://johndyer.name/native-fullscreen-javascript-api-plus-jquery-plugin/ - -*/ - - var - fullScreenApi = { - supportsFullScreen: false, - isFullScreen: function() { return false; }, - requestFullScreen: function() {}, - cancelFullScreen: function() {}, - fullScreenEventName: '', - prefix: '' - }, - browserPrefixes = 'webkit moz o ms khtml'.split(' '); - - // check for native support - if (typeof document.exitFullscreen != 'undefined') { - fullScreenApi.supportsFullScreen = true; - } else { - // check for fullscreen support by vendor prefix - for (var i = 0, il = browserPrefixes.length; i < il; i++ ) { - fullScreenApi.prefix = browserPrefixes[i]; - if (typeof document[fullScreenApi.prefix + 'CancelFullScreen' ] != 'undefined' ) { - fullScreenApi.supportsFullScreen = true; - break; - } - } - } - - // update methods to do something useful - if (fullScreenApi.supportsFullScreen) { - fullScreenApi.fullScreenEventName = fullScreenApi.prefix + 'fullscreenchange'; - fullScreenApi.isFullScreen = function() { - switch (this.prefix) { - case '': - return document.fullScreen; - case 'webkit': - return document.webkitIsFullScreen; - default: - return document[this.prefix + 'FullScreen']; - } - } - fullScreenApi.requestFullScreen = function(el) { - return (this.prefix === '') ? el.requestFullscreen() : el[this.prefix + 'RequestFullScreen'](); - } - fullScreenApi.cancelFullScreen = function(el) { - return (this.prefix === '') ? document.exitFullscreen() : document[this.prefix + 'CancelFullScreen'](); - } - } - - // jQuery plugin - if (typeof jQuery != 'undefined') { - jQuery.fn.requestFullScreen = function() { - return this.each(function() { - var el = jQuery(this); - if (fullScreenApi.supportsFullScreen) { - fullScreenApi.requestFullScreen(el); - } - }); - }; - } - - // export api - window.fullScreenApi = fullScreenApi; -})(); diff --git a/web-app/leaflet/images/icon-fullscreen-2x.png b/web-app/leaflet/images/icon-fullscreen-2x.png deleted file mode 100644 index 7320d953bcdaf9e2ae787dbedb4a1b44393538e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkg1|*MGNWTVBt36#DLn>~)opF(~!GMQV_Ta@k z2FjLB?k_k(|7fsWbn<%5{Qg0$ltpy%Y*wIhhC0{ElX5Gzn`iYcRou+>YHg^Ohlcgc z86jcOiqVf|oa6fHJ@b_L6n3tsl}`H@Z#3wpuM6aPe(&rW_h&2prv94o)@N1z?zttl z%B|BiC$8{X%C~TdMo3kYfD?z}6Q|qHj%yWtd024jYvLu=er*fqNu0?#Y`r~Aj6jPW ZW-|XRt>!qZetHYY9iFa!F6*2UngIPLSBn4u diff --git a/web-app/leaflet/images/icon-fullscreen.png b/web-app/leaflet/images/icon-fullscreen.png deleted file mode 100644 index 17478145d1fdb3eb25901c7dcd70cd4af4e4b2aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%37#&FAr-gYPC3ZQpuoc{ds5J9 zmUJ15d!UG*;|cYq+9wM8Gk$r@ZsBmXesbXX^69)r4>nJC6#bzk{UrI;*Fd&?du+_^ zPncr+aqXuq5*}Q?1YD*lI_>@0%3Is?W3iTtgjMOm#D{_Fzj*=eV(@hJb6Mw<&;$S{ CQ#W`3 diff --git a/web-app/leaflet/images/layers-2x.png b/web-app/leaflet/images/layers-2x.png deleted file mode 100644 index a2cf7f9efef65d2e021f382f47ef50d51d51a0df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 zcmV-Y3$65tP)?AfzNU07Ji0>J$I zyy*J%>jA&t|KY2zz8cz!dNXf;;xfzYhMv6otBB#?C3IqawZEtV)Ws@UgL!F(S zVuQi(g3)MfC@U-DvZ*wkrlzJCm&-NacDq09>gq~l5}T2sGiS~m&}cNz)Ya8VDT)#l zNC*+dVzFibkV>Wf6h#RdO+pCebUI^xzyIT7$BqeRmmotYPo7ln-o5)Lb#-+Wt4tB1 zL?WS%$KwYGA#wnqC~8q6kz5js#Q~u?=I7@{PN#EXe0=;bLfDnk&?-~(di{aQ%F2}6 z@Otq)pTDxQa)9Ug-O2u^X?k2HlU<@|dP!(bpU+2oJf2JG*tMadci(-tUaeLiZfIyI zNXL}*ZH>iZbu7y^5kgWvyHOOC5Q#)KsZ{C&ASge}vh={fz(ODpIRDBkuQ-zCz2DG@ z6DQ<4o$iRqWHRj7u|x2JWLdT}9*;l4^Za(9F#tf*^mh`8#Vh4?g(dDVl2B@enN;WQv=CFQPhf9EWRp{ zNIXJgB9Vy5;c(oXn3y=%-rnw`&Ye4V)Mzv|l$VzaHo|e-_E;?T1kdxO*)=`2Xqpa6 zrP7NG!+a++W^!^;hrf`@B%%6jB1%hvEb zFJ>4fL{U`QO=E0qtk7<^KSgzPbPxbBg+g)p>8GEbC@wBeYV3ZdJSwGQ*R5N(WS@NU zNkupuZUrD^T3cIt2q6ce(P*R7=`5L>n_JN7bW0RVDKOzL<*owE|)*| z=9_Ph+_P37C(~njkHQ666opafyd+FS(c>%d`Sp- z`JH#(8C@+SS|9N2v(JVZh6&ubaf8_Hc6w-N2$PeOXliOgb#?V4H?UqKBO|ccY?z;) zhfF4;&1N%EsZ;@u*D=RA~Dk?%tOA8c=4VUv}hGC8|TCMgUDwV34 zrs<>$B{w%0TCEl`nGC^T5K~iA2m}Ji&(FuUZQHiQ%*4b5KL7l4_AkZ2nK`j`Fyy2 z`!Kkw^p=FJ44nUmup2m!VRr@Z^(ELa9_@6(h;y^ZEL^ySv4Ui;H!u96I#v zx8Iulet&Oyc{weSNRq-+EEYqhQlX@z1T!-;2nK`jdc6PurBeA&W*iO&zWVAbghCjHZwG}lrH7Pr5d3kyIv(G*o9v>e!1DK_0`Y=TZ!5eS9AzNHr{1t#-0$?jED{U<; zEss+aCE6$%&+`}>8iL#H2FGzIEiJ{qefu&t77B&X)6;`sFbIZWU@#a^TU(oQjS@oG zzP`RIKA*1%cXsNx<#PF3ufP8K%7z@u%gc+I&1Px31}-ctz-F@{6beBs7DKPs-EPOq$_fe#3sbV|KBl0tu@My&6)E$_Vlnjh z_hWK$5)z37)z#HdDwY2N(B9V8Hu->|?(XjA0i48L4zVl?uh+Ylz+^I^s;VmG;!MXb z0Ze&7gb<95j$&|d5UU-m)9D}*t*wS70KWlns;#Y!r7m2!Py^tP0KT6r;ljcKTrL+D z7Z-)F0KkLns;#XB01OQc31!LydE|0Aj7DRsDR~{hPnqiK>c8#Sv12d8FgeLeNu^Sh zm6bsvksuTb!RPZK8jWJ-&Yc@B++^&Uo}L!W6qaRSx7%T}*^o#iP*qh0qtOVNY~vSW zj^pG`r&CXLbaW&DENHb_w??CRe8ULbna3WF2RCotL{3f)_U_#awOXAj1kq>|cDo$_ z(Ae0BoSdZnwx&QJfNR&Tt#z7SuTQ&vr>Cd;T`pHCA*77z=;&wz@E(9lu~_VEYHG@t z%jK1+5`@EH3=a>lRcbbyk)NNRveI-~T3SMHZ|_=X)zs9aos!XLblPUKO-7?pGXNie zmnlLBEEbClz$%C6l9G}ud-m*UVHjq^dBO8M{C+h5~JRXF@VdUrMqot)qFkC~S5c>N1u(Y%Ug+c+nUXQ%Iyp%EFaCp$+a7a0hs{-&P zfS0XSYjO^)Gxi*S-vij0latfi)YMd-lasS6UE@YZMj(V;8!#oMkwhXfXSdsj78Vv- z0n7mSxz%d@`~BrMJPNj0EQJ8N02~7lEh{Ut84QM$k3;F$C4ebO<@ft9kByDh0N4iL z41i9n)jFT7Y}(rgi^bA>H%SA-Fr)SL^)ZD)VM-N~j9maSVG00XadFXSv)Pssi9{WM z0RYFWR%?H%7(v%57K?=ea2&vI0musq3NAM`Hr9&8;tgM42_cxAoW$7J7 zXf#RRbXT>?E&v%b1;9T6{LE^#3O>ls>W z1%Om4^+QKT$He~%>hA6?ZftBk<8ry0&1N$IV0CpB>2x|AjYe;Fc6L7h&!E1(zLV9} z)u*ghYw33S?Ck9Fgo=++wEZ(=B3H#x{g#TB~MOH_MSa^ zc4|)`Ns{=6hK6>J$8)^2w3OYbQA&$)x!mgjU^1EhAcSN$>dVW^nk>r$u~@866vh0G zpj)?YHF`XrckFh1+18Bm`FyRSC@qvyBLEOW)(i&25YO}DTWx1%W}eBi{Nw42!K@e0==o zxpU{{$nD#=-|~9BZwP{5+EOON+S*#Ps;cz>Ufv`?=QwW6Xf%ciA<9N!VPPScOeTM2 z-EQ}HPN#E85Cpv-DvILC<#KQ7y6yx(c7Xr@(RKZxs;V`FkY$!-7Yf4T$B&Ed-o1N< zZE9+oefaR<2dPx*`JqFH463TWsVGVi0KW&o*2Qa@R;_7TrK+m4y}iAba5&toD9UGq zQi`6Qp4W6;?^|76J$~%iG2-=lUxD$@N+y%IckdoGo6Q3Z!?d42e}0ifqtTO;(yIXc zOG`@#hr=i-DM4#%D-IkuurEL+lfmHNAXZjZ(A?Y%i^T!}aYD$4ti$2>-r;b#3kZ@&v(P5LT;o-DhrY4v|QNvMf8u^L+b-3m2Y|J9qB10=NpGer06^@pv5N<>feX zg(&*Cs5aQjE#+9YHA8TpAUi{Y=lqVzkffYD9SGYK9?lv`KH@j6va9K z-w1+$Kp+s{IIgtNqjWlrr%#_E5C{MOMn*5}%e7uUP19CmvDon3+#Ch)u_Q@< z7GnSFJrYHc0C=AeBKmy3#j2{RmV%bcAKzn;9E(O zHU-}Cg%w4y9Ke@Gqw#Ps7_=4_7gud(m(6BpB9X|WY&JU%;8RJG=C`xk_0J%RVjCgk zE1S)hsjI7NVHm~;0F+WS9*+-BPfwdErJa%_gh876I}?PQWpJLz%)x;}A1s3+;FijJ6nrW+Pl4)+EiN1Z`Z};D5lx0BtvZnmddk_DqORVPG3@A z|MUAQ5d8CyG`n3U%W5w|$1lmUI>14Eit;<8S?vK{s*?{-Ss+T)u_t92ZJTA8?H?iF zR>;v&x7=gkU3dZlw!Q;_2%o}};F13pC@6@Z$Rj?JWwli(vf7`Uv_M3vmPaI6ZRyg? zwr>!?ft(K4bi>Np0r=D2_w3@8-GdNOt_Q!(r!eStxP|AMG^4f1MRn*m6B>vlqxDrZ z^e+Su+;WdVxV9T!t{sF|>)yKqtLo0f%X=)K?{|}VWzP^q==9)`cMLdQ#3#~>wy4qc zkwZdrRrSA+s#>ZLK#*s&!Gi5)Vb$&-com)GuwvIBL{{}fScMrv%gqq1Gu;L{wqS=D zA}ae~dCefKx&Wue^ipzWJZ7j zXOrbS%~*l+4B-|15TG$lD8hF1;}EmhTVCA{%ItO^Ul121NsW&?6bK%9NRoQ!5CUZB zO|YcG$Vgw>H3Xqp1%I_^QV@c+R-jF?y|mH7qa2-(C z0ugQ8pDRw<4{n()NIJyegIV${HQGfO5|ixWN;7!nv;%PvB8%H$$MGRJ`}fQ6#kbes z>h&MMcTZrm#Ts3`fhrQak0q-hmbwneh)8_kw~}aV#&vv&0DQ zTMfe^L}O-h6u4_rJ&^vk4ik*_)7p25=@J%{bu-Se@_xIv$v4hVrK*YPiWBP+oJ5Ir zr3moEi=@SPav_d;H&n2Pu<`*W>zjWJNOw_DD_r~j28`tsSACjsxMemoPU@AB>{HW| ztXJMqrYlUW(>mdwMq$Dp@GE$mom`;n2e&N-yI52)$YiOCq+5IXJdE|zd*KS>5aSRb z&c)UdVb4DKNOFD!$C<8h{hnqg;riV@!i3$}=UGTOZpIU)>0{iquGsT|d?Y#Yne-5SPQrxRe+$>w;#JvMh{Q|>l$k-X z*)S}8wwajRf-*gjo*13Ddi{I2mrq!J6XOcRiG#RlA-3m(|8_HzBcDkRaoI^2U;8Bj zLQ1_>oIw~*j8y0k)gb88Fw%SV$TO(&Ik0F^e6@= zLHw>E1o&f_sL`n+G87&T9yqi}E?j2>(j)xilP|{{#Ely_L7r5{ctW;yF>b25Js}>`iO75R6BpgcE9|%%7ZRzD#1@K!W4(uK@LfLHB`NAX3qZf^YwSvp;i9@cqQ*)vIMW(V~k@y^(GFR zk?hjYBY8Jfi-jYuvcKGw#YY%vDItj}3 z7Q|uPsUF8INEZfRw#oQYFK+5{*aoL3O>O}4)g`9<@EtcFTw-*g{8$|m2r9KG(G1~; z5e{y}MqI4=Zwu&dpd`7ElAEf=5>(R5d?a55G39=D1mdJp{meN=dkKNp1|7_pf2kQ< za(hP&%AULsujtTO-x4$UA&=)46DW!dAjWf}ei8-FW91wTuZPe2cpnffC0y4@sv2)Mw;_ci|bZ`gPMKR{MfO zKlGq*A1TRFnjioxLQU_S-3#-w^pgr|akh3F*-@`3{jraTr2X0$DxU9J6 zonZ#3S7xR6ObDnNWJ8&AnybbQ=UC0Wae1hQ7p*{c(l)9RmncZ49Yhd#w`%) zJK~gOp5Ur+-DQnt#)LdUN8^=@2-enu2QF9ys>*XI-S-6QHw&K;_-m@Idn%23!X5>r z@k-;CZ74HNf_oumFy8=wOzyrX$n%YiOPc-`SB%=YvR_CYcdtRU%#lH0jzd^#(k@-di-hx~al>I_R&DnN#rm07DYJ+aF!NQPu( zbl)m=2e-pbn6kGOq%ozxMkhXFRl&@1RiUgum3Vj1u#)6jsv%5j<*IR6^t$emDShpN z7o|>QRl&?k@XAh_XN1|9@o5QNcLkjz8A*rcE*n}g+c*p5 z7~m;%`pNaTgO1TTk`ZiZ=Bn}0^D(8ryf5D9p^RE?AC-e7yN3;(S*bnf{JGme)u3~( zS$ORcqqFvg`t|$f)g;O&W!6%aW^l!m_k7b2$D02GPgh9AD1`()~cZ8Oj2AQyau(pP%|J;>TN`^P;r=4@@A|s=UjbU%Sr& zOCYBon0Iw=*%^D@^5cwU6_3(-JaBP001cn1^@s6z>|W`000J>NklgF+#9zZY7a#;@J(5X0e&McXK2n7+jhR}<0i-1U5t`>D@ zJSJ*^swjdwq0keUf9!BETXZhVyjqS4&z|?2HdJnOU-HYF_xSyu=XsCkdtVv=(53>u zME@3F*5J;OHwJNJdWK(ivQ??rr&t7M)1yRas=d_yYH>g+p#{( zm+NoyW%|8bNfUkAMrabri(FY#Dqr5%zhZA&e^iALHXiJOFYA7Qt##L_a?_z6SW{&J zVeyp#G&snW>SO{*%d9CGVM}xic~V`MU$)*JU1Nbw2YX?ywi}|VZ4g;$g)p^+DoLHR zZ^Zr$S_=f^oU`+!4K^?NsU;H{;bhhex#H7(!s52U&FJ}OHQf-VvVd?Btj2MhF|zQI z%l~jBr~6T7^_WIHC1>8j&bv`c18g|Z3*l-jgeoml1{oh++Y75JI)RgU>LEY<%)C)X zI2rZ2kb>s^4cZuYeq3!A}DS`X~>Nd;+A$4e;ZwyD<1@2!8$ZKJ3w%!6)+sCALy+bKwyk zqKCS6qEGWmJ)97b-QXY|`<0lS5THkEtGgjE>ojOvuftfM&Ugd-rQg9C+|FdGM)HXs z(IxsA$&r(xg_j^4=hC;>s;1UF*Wp1I-2~sEF zZYgb?&`4bM1qjM*hR`yr3qJ(;L>Kj2XpBUy+)t((6z;bIr@-ihFNVAl4<#?{TWIaQ zIi>;YjXS_iIfNb?!N1t-!Y6vZvW5ZXE{%l7imzV9NvV4nf#G`Pcex;#@}?EINwsk7 z>UC=SlJC*b5a>-mgHP%q2+qF;cbNx ztCV@{s&fPsSt#;i@#G-m$as&$gLaG}ebOrtS5*22&glbhMH_fz8(~qVVN!VIVCKzg z1$U9^93(E%Ur9v_R*h#!t)Ce+#)+m(q^zCq%g&L-!E zC&et9WrT(49pl0S`?=DK7=`+;`CB!wP3ta97b)XdJ8K=@`DXOk0Q0};7zNT!`k4t@ z+)=9S)4p(jEGm5!qq)PDTmXiw3qDM19|fiylc@LtiQ=}Kfb#w&ckv^7tBj;cfwtY$q?IdliYlg zqh@4;IyW)OFPQPw4z|JsAEb7`+@yA@Q8SXQT#;upV`QNJ59Bg5m(jci3`0T4X-&^GU6)x7$Vi0XMWB(2hrdK^!hq0 zt!bDg$Hh)-9L62h`&{0PBf%7vM>69o`k4~kx^Wc)?lG!}=WgV2x-rq?HN#jMr^B0; p5zMeb2q5MEX5{g&Aa%N&e*pr!t%ZZ}>w*9P002ovPDHLkV1gpUS8xCT diff --git a/web-app/leaflet/images/marker-shadow.png b/web-app/leaflet/images/marker-shadow.png deleted file mode 100644 index d1e773c715a9b508ebea055c4bb4b0a2ad7f6e52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 797 zcmV+&1LFLNP)oNwbRQ6Eq$4M3RDU@$ z<4cV9zWLV=bA&uX9wCpA{{f^4$D#k>GcX53-UQqf>_LzMU@frMz|MwbfQGbY0?ccG zBj_wh0?6Tv;HWR0`x;m^Bm<;sCm_85SGspFBn6|A!tDh$nR`wGorGkyL7j?F3#OJq zIswLIz;iF7f|LMnF(pXPAY*GYpsw%&e_WjlnV`C$6@#Q7GZu1$Q8>&p8=(iJj8o|T~0u%hM*Yg_d(Av{WS$h&pM%nlEAonVL0;DkN|xc zn)9F+aMDk#VtAMb0c=kIb1pU-$e4$3pwo&qVh(Umlw3_IU_dFcFe(In6*x}D4LHLhFZ4N=V2ZR+>XHU5D&uY$npJ7Eu?{iAK>UxC?4uyg4+iD z!nst**H%2zhOBxc7C7Tv{f^`%hqT1KpU@Vf6+C2|bGaR(1~TU5D-1;&HXT~PMc2Lu z{Q%^i6vvox&EMFT7I_)R$xq1779I8kE@?|D*cLWnP0a@a)xJA`o*^$^V(yN)b`kV7 z=o@jbFF4j{KeuQhi;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?void(o=!0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),void t.apply(i,a))}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;it;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints&&!t.PointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled&&t.navigator.maxTouchPoints||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix&&!c,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&function(){var t="ontouchstart";if(m||t in g)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;ni||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n)),a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return s=e&&e.maxZoom?Math.min(e.maxZoom,s):s,this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){if(!this._loaded)return this;t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._initialCenter=null;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("viewreset",{hard:!i}),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-1/0,o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_; -return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map,e=t.getPixelBounds(),i=t.getZoom(),n=this._getTileSize();if(!(i>this.options.maxZoom||in;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=e.tileSize,o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(it.max.x||nt.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+=t.zoomOffset,t.maxNativeZoom?Math.min(e,t.maxNativeZoom):e},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this._getTileSize();return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this._getTileSize())._floor()},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=o.DomUtil.create("img","leaflet-tile");return t.style.width=t.style.height=this._getTileSize()+"px",t.galleryimg="no",t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;i.width=i.height=e.detectRetina&&o.Browser.retina?2*n:n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTile:function(){var t=o.DomUtil.create("canvas","leaflet-tile");return t.width=t.height=this.options.tileSize,t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i=o.point("shadow"===e?n.shadowAnchor||n.iconAnchor:n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;is?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({layer:t.target,target:this},t),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):"",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click",this._onClick,this))},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return void(this._parts=[n]);this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,e){if(!e)return new o.Point(t.clientX,t.clientY);var i=e.getBoundingClientRect();return new o.Point(t.clientX-i.left-e.clientLeft,t.clientY-i.top-e.clientTop)},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&1e3>n||t.target._simulatedClick&&!t._simulated?void o.DomEvent.stop(t):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!(t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(o.DomEvent.stopPropagation(t),o.Draggable._disabled||(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),this._moving)))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return void(this._moved=!0);var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),o.DomUtil.addClass(t.target||t.srcElement,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){o.DomUtil.removeClass(e.body,"leaflet-dragging"),o.DomUtil.removeClass(t.target||t.srcElement,"leaflet-drag-target");for(var i in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[i],this._onMove).off(e,o.Draggable.END[i],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&this._moving&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],s[a]="function"==typeof n?n.bind(h):n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n);case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){o.DomEvent.preventDefault(t);for(var e=!1,i=0;i1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return void(this._zooming=!1);var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),void o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this))},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,void this.fire("step")):void this._onTransitionEnd()},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a){this._animatingZoom=!0,o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a})},_onZoomTransitionEnd:function(){this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",void this._stopLoadingImages(t)):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),void clearTimeout(this._clearBgBufferTimer))},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document); \ No newline at end of file From 040134b4fdfa23bfa58e3a0848d6e3a795a80be9 Mon Sep 17 00:00:00 2001 From: pal155 Date: Thu, 5 Nov 2020 16:49:37 +1100 Subject: [PATCH 02/10] Cleanup an re-introduce travis --- .travis.yml | 23 ++++ build.gradle | 11 +- .../assets/images/skin/database_add.png | 0 .../assets/images/skin/database_delete.png | 0 .../assets/images/skin/database_edit.png | 0 .../assets/images/skin/database_save.png | 0 .../assets/images/skin/database_table.png | 0 grails-app/assets/images/skin/exclamation.png | 0 grails-app/assets/images/skin/house.png | 0 grails-app/assets/images/skin/information.png | 0 grails-app/assets/images/skin/shadow.jpg | 0 grails-app/assets/images/skin/sorted_asc.gif | 0 grails-app/assets/images/skin/sorted_desc.gif | 0 .../assets/javascripts/xxxknockout-3.0.0.js | 94 --------------- grails-app/assets/stylesheets/errors.css | 109 ++++++++++++++++++ grails-app/views/notFound.gsp | 14 +++ 16 files changed, 147 insertions(+), 104 deletions(-) create mode 100644 .travis.yml delete mode 100644 grails-app/assets/images/skin/database_add.png delete mode 100644 grails-app/assets/images/skin/database_delete.png delete mode 100644 grails-app/assets/images/skin/database_edit.png delete mode 100644 grails-app/assets/images/skin/database_save.png delete mode 100644 grails-app/assets/images/skin/database_table.png delete mode 100644 grails-app/assets/images/skin/exclamation.png delete mode 100644 grails-app/assets/images/skin/house.png delete mode 100644 grails-app/assets/images/skin/information.png delete mode 100644 grails-app/assets/images/skin/shadow.jpg delete mode 100644 grails-app/assets/images/skin/sorted_asc.gif delete mode 100644 grails-app/assets/images/skin/sorted_desc.gif delete mode 100644 grails-app/assets/javascripts/xxxknockout-3.0.0.js create mode 100644 grails-app/assets/stylesheets/errors.css create mode 100644 grails-app/views/notFound.gsp diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..5885e9c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,23 @@ +dist: trusty +language: groovy +jdk: +- oraclejdk8 +sudo: false +branches: + only: + - master + - develop +before_cache: + - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock + - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ +cache: + directories: + - $HOME/.m2 + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ +after_success: + - '[ "${TRAVIS_PULL_REQUEST}" = "false" ] && travis_retry ./gradlew publish' +env: + global: + - secure: XXXTssBnWIBinafmyop1zf/2Pf81hpr0IisjfUd9lw4InfnbICNChS6P/ovfdtFu062xeVYbAgUQLCec1KlPDZQ32UgxFGU74EQ/1M70bJULsxd35UBpTNkhUyNQIcr9DkOhMYahvQbmySv5JGVFiT9ry/38xzQsHfYCQPs5dJY= + - secure: FHlKa+UKFJdz/4AlfIo6rspYR6+KGOND4hk13LJN3QZCHRjM2ij9toqDxP74aH4VGpaUzEaKy1cC8hqE2F97VbptrFo2NtDEl9fJ6Z/+3lPo3tr6PZ69WZqex//bO+kkpjEn0KspLc92cCfaVOJxHWu5QcQ+C1SddfTwY5FuHPU= diff --git a/build.gradle b/build.gradle index c04f538..efba535 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { } } -version "" +version "2.0-SNAPSHOT" group "au.org.ala" apply plugin:"eclipse" @@ -45,29 +45,22 @@ dependencies { compile "org.grails:grails-web-boot" compile "org.grails:grails-logging" compile "org.grails:grails-plugin-rest" - // compile "org.grails:grails-plugin-databinding" compile "org.grails:grails-plugin-i18n" compile "org.grails:grails-plugin-services" compile "org.grails:grails-plugin-url-mappings" compile "org.grails:grails-plugin-interceptors" compile "org.grails.plugins:cache" compile "org.grails.plugins:async" - //compile "org.grails.plugins:scaffolding" compile "org.grails.plugins:events" - // compile "org.grails.plugins:hibernate5" - // compile "org.hibernate:hibernate-core:5.4.18.Final" compile "org.grails.plugins:gsp" compileOnly "io.micronaut:micronaut-inject-groovy" console "org.grails:grails-console" profile "org.grails.profiles:web" runtime "org.glassfish.web:el-impl:2.1.2-b03" - //runtime "com.h2database:h2" - //runtime "org.apache.tomcat:tomcat-jdbc" runtime "javax.xml.bind:jaxb-api:2.3.1" runtime "xml-apis:xml-apis:1.4.01" runtime "com.bertramlabs.plugins:asset-pipeline-grails:3.2.4" testCompile "io.micronaut:micronaut-inject-groovy" - //testCompile "org.grails:grails-gorm-testing-support" testCompile "org.mockito:mockito-core" testCompile "org.grails:grails-web-testing-support" testCompile "org.grails.plugins:geb" @@ -81,9 +74,7 @@ dependencies { compile 'org.grails.plugins:external-config:2.0.0' // Javascript libraries - // compile 'org.webjars:leaflet:1.6.0' compile 'org.webjars:knockout:3.5.1' - // compile 'org.webjars:swagger-ui:3.18.2' // ALA Plugins compile group: 'org.grails.plugins', name: 'ala-auth', version: '3.2.2' diff --git a/grails-app/assets/images/skin/database_add.png b/grails-app/assets/images/skin/database_add.png deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/database_delete.png b/grails-app/assets/images/skin/database_delete.png deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/database_edit.png b/grails-app/assets/images/skin/database_edit.png deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/database_save.png b/grails-app/assets/images/skin/database_save.png deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/database_table.png b/grails-app/assets/images/skin/database_table.png deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/exclamation.png b/grails-app/assets/images/skin/exclamation.png deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/house.png b/grails-app/assets/images/skin/house.png deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/information.png b/grails-app/assets/images/skin/information.png deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/shadow.jpg b/grails-app/assets/images/skin/shadow.jpg deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/sorted_asc.gif b/grails-app/assets/images/skin/sorted_asc.gif deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/images/skin/sorted_desc.gif b/grails-app/assets/images/skin/sorted_desc.gif deleted file mode 100644 index e69de29..0000000 diff --git a/grails-app/assets/javascripts/xxxknockout-3.0.0.js b/grails-app/assets/javascripts/xxxknockout-3.0.0.js deleted file mode 100644 index 1c6945a..0000000 --- a/grails-app/assets/javascripts/xxxknockout-3.0.0.js +++ /dev/null @@ -1,94 +0,0 @@ -// Knockout JavaScript library v3.0.0 -// (c) Steven Sanderson - http://knockoutjs.com/ -// License: MIT (http://www.opensource.org/licenses/mit-license.php) - -(function() {(function(q){var y=this||(0,eval)("this"),w=y.document,K=y.navigator,u=y.jQuery,B=y.JSON;(function(q){"function"===typeof require&&"object"===typeof exports&&"object"===typeof module?q(module.exports||exports):"function"===typeof define&&define.amd?define(["exports"],q):q(y.ko={})})(function(F){function G(a,c){return null===a||typeof a in N?a===c:!1}function H(b,c,d,e){a.d[b]={init:function(b){a.a.f.set(b,L,{});return{controlsDescendantBindings:!0}},update:function(b,h,k,m,f){k=a.a.f.get(b,L);h=a.a.c(h()); -m=!d!==!h;var p=!k.ob;if(p||c||m!==k.Db)p&&(k.ob=a.a.Ya(a.e.childNodes(b),!0)),m?(p||a.e.S(b,a.a.Ya(k.ob)),a.Ta(e?e(f,h):f,b)):a.e.Z(b),k.Db=m}};a.g.Y[b]=!1;a.e.P[b]=!0}var a="undefined"!==typeof F?F:{};a.b=function(b,c){for(var d=b.split("."),e=a,g=0;ga.a.l(c,b[f])&&c.push(b[f]);return c},ha:function(a,b){a=a||[];for(var f=[],c=0,d=a.length;cd?f&&b.push(c):f||b.splice(d,1)},extend:function(a,b){if(b)for(var f in b)b.hasOwnProperty(f)&& -(a[f]=b[f]);return a},K:b,Da:function(a,b){if(!a)return a;var f={},c;for(c in a)a.hasOwnProperty(c)&&(f[c]=b(a[c],c,a));return f},wa:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},Vb:function(b){b=a.a.Q(b);for(var c=w.createElement("div"),f=0,d=b.length;fh?a.setAttribute("selected",b):a.selected=b},la:function(a){return null===a||a=== -q?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},ec:function(b,c){for(var f=[],d=(b||"").split(c),e=0,g=d.length;ea.length?!1:a.substring(0,b.length)===b},Gb:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(3===a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode; -return!!a},va:function(b){return a.a.Gb(b,b.ownerDocument.documentElement)},Ra:function(b){return!!a.a.Ua(b,a.a.va)},v:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},r:function(b,d,f){var e=h&&g[d];if(e||"undefined"==typeof u)if(e||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var s=function(a){f.call(b,a)},l="on"+d;b.attachEvent(l,s);a.a.C.ea(b,function(){b.detachEvent(l,s)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(d, -f,!1);else{if(c(b,d)){var n=f;f=function(a,b){var f=this.checked;b&&(this.checked=!0!==b.Ab);n.call(this,a);this.checked=f}}u(b).bind(d,f)}},da:function(a,b){if(!a||!a.nodeType)throw Error("element must be a DOM node when calling triggerEvent");if("undefined"!=typeof u){var f=[];c(a,b)&&f.push({Ab:a.checked});u(a).trigger(b,f)}else if("function"==typeof w.createEvent)if("function"==typeof a.dispatchEvent)f=w.createEvent(e[b]||"HTMLEvents"),f.initEvent(b,!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,a),a.dispatchEvent(f); -else throw Error("The supplied element doesn't support dispatchEvent");else if("undefined"!=typeof a.fireEvent)c(a,b)&&(a.checked=!0!==a.checked),a.fireEvent("on"+b);else throw Error("Browser doesn't support triggering events");},c:function(b){return a.M(b)?b():b},Ha:function(b){return a.M(b)?b.t():b},ma:function(b,c,f){if(c){var d=/\S+/g,e=b.className.match(d)||[];a.a.n(c.match(d),function(b){a.a.V(e,b,f)});b.className=e.join(" ")}},Ma:function(b,c){var f=a.a.c(c);if(null===f||f===q)f="";var d=a.e.firstChild(b); -!d||3!=d.nodeType||a.e.nextSibling(d)?a.e.S(b,[w.createTextNode(f)]):d.data=f;a.a.Jb(b)},pb:function(a,b){a.name=b;if(7>=h)try{a.mergeAttributes(w.createElement(""),!1)}catch(f){}},Jb:function(a){9<=h&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},Hb:function(a){if(h){var b=a.style.width;a.style.width=0;a.style.width=b}},Zb:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var f=[],d=b;d<=c;d++)f.push(d);return f},Q:function(a){for(var b=[],c=0,d=a.length;c< -d;c++)b.push(a[c]);return b},cc:6===h,dc:7===h,ja:h,ab:function(b,c){for(var f=a.a.Q(b.getElementsByTagName("input")).concat(a.a.Q(b.getElementsByTagName("textarea"))),d="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},e=[],g=f.length-1;0<=g;g--)d(f[g])&&e.push(f[g]);return e},Wb:function(b){return"string"==typeof b&&(b=a.a.la(b))?B&&B.parse?B.parse(b):(new Function("return "+b))():null},Na:function(b,c,f){if(!B||!B.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js"); -return B.stringify(a.a.c(b),c,f)},Xb:function(c,d,f){f=f||{};var e=f.params||{},g=f.includeFields||this.$a,h=c;if("object"==typeof c&&"form"===a.a.v(c))for(var h=c.action,n=g.length-1;0<=n;n--)for(var r=a.a.ab(c,g[n]),v=r.length-1;0<=v;v--)e[r[v].name]=r[v].value;d=a.a.c(d);var t=w.createElement("form");t.style.display="none";t.action=h;t.method="post";for(var E in d)c=w.createElement("input"),c.name=E,c.value=a.a.Na(a.a.c(d[E])),t.appendChild(c);b(e,function(a,b){var c=w.createElement("input");c.name= -a;c.value=b;t.appendChild(c)});w.body.appendChild(t);f.submitter?f.submitter(t):t.submit();setTimeout(function(){t.parentNode.removeChild(t)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.n);a.b("utils.arrayFirst",a.a.Ua);a.b("utils.arrayFilter",a.a.ga);a.b("utils.arrayGetDistinctValues",a.a.Va);a.b("utils.arrayIndexOf",a.a.l);a.b("utils.arrayMap",a.a.ha);a.b("utils.arrayPushAll",a.a.X);a.b("utils.arrayRemoveItem",a.a.ia);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost", -a.a.$a);a.b("utils.getFormFields",a.a.ab);a.b("utils.peekObservable",a.a.Ha);a.b("utils.postJson",a.a.Xb);a.b("utils.parseJson",a.a.Wb);a.b("utils.registerEventHandler",a.a.r);a.b("utils.stringifyJson",a.a.Na);a.b("utils.range",a.a.Zb);a.b("utils.toggleDomNodeCssClass",a.a.ma);a.b("utils.triggerEvent",a.a.da);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.K);a.b("utils.addOrRemoveItem",a.a.V);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=function(a){var c= -this,d=Array.prototype.slice.call(arguments);a=d.shift();return function(){return c.apply(a,d.concat(Array.prototype.slice.call(arguments)))}});a.a.f=new function(){function a(b,h){var k=b[d];if(!k||"null"===k||!e[k]){if(!h)return q;k=b[d]="ko"+c++;e[k]={}}return e[k]}var c=0,d="__ko__"+(new Date).getTime(),e={};return{get:function(c,d){var e=a(c,!1);return e===q?q:e[d]},set:function(c,d,e){if(e!==q||a(c,!1)!==q)a(c,!0)[d]=e},clear:function(a){var b=a[d];return b?(delete e[b],a[d]=null,!0):!1},D:function(){return c++ + -d}}};a.b("utils.domData",a.a.f);a.b("utils.domData.clear",a.a.f.clear);a.a.C=new function(){function b(b,c){var e=a.a.f.get(b,d);e===q&&c&&(e=[],a.a.f.set(b,d,e));return e}function c(d){var e=b(d,!1);if(e)for(var e=e.slice(0),m=0;m",""]||!d.indexOf("",""]||(!d.indexOf("",""]||[0,"",""];b="ignored
"+d[1]+b+d[2]+"
";for("function"==typeof y.innerShiv?c.appendChild(y.innerShiv(b)):c.innerHTML=b;d[0]--;)c=c.lastChild;c=a.a.Q(c.lastChild.childNodes)}return c};a.a.Ka=function(b,c){a.a.wa(b);c=a.a.c(c);if(null!==c&&c!==q)if("string"!=typeof c&&(c=c.toString()),"undefined"!=typeof u)u(b).html(c);else for(var d=a.a.Fa(c),e=0;ec[0]?l+c[0]:c[0]),l);for(var l=1===n?l:Math.min(b+(c[1]||0),l),n=b+n-2,r=Math.max(l,n),v=2;bc;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.tb(b);return a.a.Na(b,c,d)};d.prototype={save:function(b,c){var d=a.a.l(this.keys,b);0<=d?this.Qa[d]=c:(this.keys.push(b),this.Qa.push(c))},get:function(b){b=a.a.l(this.keys,b);return 0<=b?this.Qa[b]:q}}})();a.b("toJS",a.tb);a.b("toJSON",a.toJSON);(function(){a.k={o:function(b){switch(a.a.v(b)){case "option":return!0=== -b.__ko__hasDomDataOptionValue__?a.a.f.get(b,a.d.options.Ea):7>=a.a.ja?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.k.o(b.options[b.selectedIndex]):q;default:return b.value}},na:function(b,c){switch(a.a.v(b)){case "option":switch(typeof c){case "string":a.a.f.set(b,a.d.options.Ea,q);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.f.set(b,a.d.options.Ea,c),b.__ko__hasDomDataOptionValue__= -!0,b.value="number"===typeof c?c:""}break;case "select":""===c&&(c=q);if(null===c||c===q)b.selectedIndex=-1;for(var d=b.options.length-1;0<=d;d--)if(a.k.o(b.options[d])==c){b.selectedIndex=d;break}1=n){k&&c.push(l?{key:k,value:l.join("")}:{unknown:k});k=l=n=0;continue}}else if(58===t){if(!l)continue}else if(47===t&&r&&1=a.a.ja&&c in M?(c=M[c],h?b.removeAttribute(c):b[c]=d):h||b.setAttribute(c, -d.toString());"name"===c&&a.a.pb(b,h?"":d.toString())})}};(function(){a.d.checked={after:["value","attr"],init:function(b,c,d){function e(){return d.has("checkedValue")?a.a.c(d.get("checkedValue")):b.value}function g(){var k=b.checked,g=s?e():k;if(l&&(!m||k)){var h=a.i.p(c);f?p!==g?(k&&(a.a.V(h,g,!0),a.a.V(h,p,!1)),p=g):a.a.V(h,g,k):a.g.oa(h,d,"checked",g,!0)}}function h(){var d=a.a.c(c());b.checked=f?0<=a.a.l(d,e()):k?d:e()===d}var k="checkbox"==b.type,m="radio"==b.type;if(k||m){var f=k&&a.a.c(c())instanceof -Array,p=f?e():q,s=m||f,l=!1;m&&!b.name&&a.d.uniqueName.init(b,function(){return!0});a.h(g,null,{I:b});a.a.r(b,"click",g);a.h(h,null,{I:b});l=!0}}};a.g.U.checked=!0;a.d.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.d.css={update:function(b,c){var d=a.a.c(c());"object"==typeof d?a.a.K(d,function(c,d){d=a.a.c(d);a.a.ma(b,c,d)}):(d=String(d||""),a.a.ma(b,b.__ko__cssValue,!1),b.__ko__cssValue=d,a.a.ma(b,d,!0))}};a.d.enable={update:function(b,c){var d=a.a.c(c());d&&b.disabled?b.removeAttribute("disabled"): -d||b.disabled||(b.disabled=!0)}};a.d.disable={update:function(b,c){a.d.enable.update(b,function(){return!a.a.c(c())})}};a.d.event={init:function(b,c,d,e,g){var h=c()||{};a.a.K(h,function(k){"string"==typeof k&&a.a.r(b,k,function(b){var f,h=c()[k];if(h){try{var s=a.a.Q(arguments);e=g.$data;s.unshift(e);f=h.apply(e,s)}finally{!0!==f&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(k+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.d.foreach={hb:function(b){return function(){var c= -b(),d=a.a.Ha(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.J.Aa};a.a.c(c);return{foreach:d.data,as:d.as,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.J.Aa}}},init:function(b,c){return a.d.template.init(b,a.d.foreach.hb(c))},update:function(b,c,d,e,g){return a.d.template.update(b,a.d.foreach.hb(c),d,e,g)}};a.g.Y.foreach=!1;a.e.P.foreach=!0;a.d.hasfocus= -{init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var g=b.ownerDocument;if("activeElement"in g){var f;try{f=g.activeElement}catch(h){f=g.body}e=f===b}g=c();a.g.oa(g,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var g=e.bind(null,!0),h=e.bind(null,!1);a.a.r(b,"focus",g);a.a.r(b,"focusin",g);a.a.r(b,"blur",h);a.a.r(b,"focusout",h)},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===d||(d?b.focus():b.blur(),a.i.p(a.a.da, -null,[b,d?"focusin":"focusout"]))}};a.g.U.hasfocus=!0;a.d.hasFocus=a.d.hasfocus;a.g.U.hasFocus=!0;a.d.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Ka(b,c())}};var L=a.a.f.D();H("if");H("ifnot",!1,!0);H("with",!0,!1,function(a,c){return a.createChildContext(c)});a.d.options={init:function(b){if("select"!==a.a.v(b))throw Error("options binding applies only to SELECT elements");for(;0a.a.ja?0:b.nodes)?b.nodes():null;if(c)return a.a.Q(c.cloneNode(!0).childNodes);b=b.text();return a.a.Fa(b)};a.J.Aa= -new a.J;a.La(a.J.Aa);a.b("nativeTemplateEngine",a.J);(function(){a.Ba=function(){var a=this.Rb=function(){if("undefined"==typeof u||!u.tmpl)return 0;try{if(0<=u.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,g){g=g||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var h=b.data("precompiled");h||(h=b.text()||"",h=u.template(null,"{{ko_with $item.koBindingContext}}"+h+ -"{{/ko_with}}"),b.data("precompiled",h));b=[e.$data];e=u.extend({koBindingContext:e},g.templateOptions);e=u.tmpl(h,b,e);e.appendTo(w.createElement("div"));u.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){w.write("