ref: 5c31e0c3415a6e2b308a3953bc0056a55c15c333
parent: 7c30e2cbb08fdf0e61f80c7f1aa29909aeca4211
parent: ecf5e081b5540e69f4af330233f39a07baf53846
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Sun Oct 15 06:20:55 EDT 2017
Merge commit 'ecf5e081b5540e69f4af330233f39a07baf53846'
--- a/docs/content/commands/hugo.md
+++ b/docs/content/commands/hugo.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T17:09:31-05:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo"
slug: hugo
url: /commands/hugo/
@@ -25,48 +25,50 @@
### Options
```
- -b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
- -D, --buildDrafts include content marked as draft
- -E, --buildExpired include expired content
- -F, --buildFuture include content with publishdate in the future
- --cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
- --canonifyURLs if true, all relative URLs will be canonicalized using baseURL
- --cleanDestinationDir remove files from destination not found in static directories
- --config string config file (default is path/config.yaml|json|toml)
- -c, --contentDir string filesystem path to content directory
- --debug debug output
- -d, --destination string filesystem path to write files to
- --disable404 do not render 404 page
- --disableKinds stringSlice disable different kind of pages (home, RSS etc.)
- --disableRSS do not build RSS files
- --disableSitemap do not build Sitemap file
- --enableGitInfo add Git revision, date and author info to the pages
- --forceSyncStatic copy all files when static is changed.
- -h, --help help for hugo
- --i18n-warnings print missing translations
- --ignoreCache ignores the cache directory
- -l, --layoutDir string filesystem path to layout directory
- --log enable Logging
- --logFile string log File path (if set, logging enabled automatically)
- --noChmod don't sync permission mode of files
- --noTimes don't sync modification time of files
- --pluralizeListTitles pluralize titles in lists using inflect (default true)
- --preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")- --quiet build in quiet mode
- --renderToMemory render to memory (only useful for benchmark testing)
- -s, --source string filesystem path to read files relative from
- --stepAnalysis display memory and timing of different steps of the program
- --templateMetrics display metrics about template executions
- -t, --theme string theme to use (located in /themes/THEMENAME/)
- --themesDir string filesystem path to themes directory
- --uglyURLs if true, use /filename.html instead of /filename/
- -v, --verbose verbose output
- --verboseLog verbose logging
- -w, --watch watch filesystem for changes and recreate as needed
+ -b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
+ -D, --buildDrafts include content marked as draft
+ -E, --buildExpired include expired content
+ -F, --buildFuture include content with publishdate in the future
+ --cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
+ --canonifyURLs if true, all relative URLs will be canonicalized using baseURL
+ --cleanDestinationDir remove files from destination not found in static directories
+ --config string config file (default is path/config.yaml|json|toml)
+ -c, --contentDir string filesystem path to content directory
+ --debug debug output
+ -d, --destination string filesystem path to write files to
+ --disable404 do not render 404 page
+ --disableKinds strings disable different kind of pages (home, RSS etc.)
+ --disableRSS do not build RSS files
+ --disableSitemap do not build Sitemap file
+ --enableGitInfo add Git revision, date and author info to the pages
+ --forceSyncStatic copy all files when static is changed.
+ -h, --help help for hugo
+ --i18n-warnings print missing translations
+ --ignoreCache ignores the cache directory
+ -l, --layoutDir string filesystem path to layout directory
+ --log enable Logging
+ --logFile string log File path (if set, logging enabled automatically)
+ --noChmod don't sync permission mode of files
+ --noTimes don't sync modification time of files
+ --pluralizeListTitles pluralize titles in lists using inflect (default true)
+ --preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")+ --quiet build in quiet mode
+ --renderToMemory render to memory (only useful for benchmark testing)
+ -s, --source string filesystem path to read files relative from
+ --stepAnalysis display memory and timing of different steps of the program
+ --templateMetrics display metrics about template executions
+ --templateMetricsHints calculate some improvement hints when combined with --templateMetrics
+ -t, --theme string theme to use (located in /themes/THEMENAME/)
+ --themesDir string filesystem path to themes directory
+ --uglyURLs if true, use /filename.html instead of /filename/
+ -v, --verbose verbose output
+ --verboseLog verbose logging
+ -w, --watch watch filesystem for changes and recreate as needed
```
### SEE ALSO
* [hugo benchmark](/commands/hugo_benchmark/) - Benchmark Hugo by building a site a number of times.
+* [hugo check](/commands/hugo_check/) - Contains some verification checks
* [hugo config](/commands/hugo_config/) - Print the site configuration
* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats
* [hugo env](/commands/hugo_env/) - Print Hugo version and environment info
@@ -78,4 +80,4 @@
* [hugo undraft](/commands/hugo_undraft/) - Undraft resets the content's draft status
* [hugo version](/commands/hugo_version/) - Print the version number of Hugo
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_benchmark.md
+++ b/docs/content/commands/hugo_benchmark.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo benchmark"
slug: hugo_benchmark
url: /commands/hugo_benchmark/
@@ -21,39 +21,40 @@
### Options
```
- -b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
- -D, --buildDrafts include content marked as draft
- -E, --buildExpired include expired content
- -F, --buildFuture include content with publishdate in the future
- --cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
- --canonifyURLs if true, all relative URLs will be canonicalized using baseURL
- --cleanDestinationDir remove files from destination not found in static directories
- -c, --contentDir string filesystem path to content directory
- -n, --count int number of times to build the site (default 13)
- --cpuprofile string path/filename for the CPU profile file
- -d, --destination string filesystem path to write files to
- --disable404 do not render 404 page
- --disableKinds stringSlice disable different kind of pages (home, RSS etc.)
- --disableRSS do not build RSS files
- --disableSitemap do not build Sitemap file
- --enableGitInfo add Git revision, date and author info to the pages
- --forceSyncStatic copy all files when static is changed.
- -h, --help help for benchmark
- --i18n-warnings print missing translations
- --ignoreCache ignores the cache directory
- -l, --layoutDir string filesystem path to layout directory
- --memprofile string path/filename for the memory profile file
- --noChmod don't sync permission mode of files
- --noTimes don't sync modification time of files
- --pluralizeListTitles pluralize titles in lists using inflect (default true)
- --preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")- --renderToMemory render to memory (only useful for benchmark testing)
- -s, --source string filesystem path to read files relative from
- --stepAnalysis display memory and timing of different steps of the program
- --templateMetrics display metrics about template executions
- -t, --theme string theme to use (located in /themes/THEMENAME/)
- --themesDir string filesystem path to themes directory
- --uglyURLs if true, use /filename.html instead of /filename/
+ -b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
+ -D, --buildDrafts include content marked as draft
+ -E, --buildExpired include expired content
+ -F, --buildFuture include content with publishdate in the future
+ --cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
+ --canonifyURLs if true, all relative URLs will be canonicalized using baseURL
+ --cleanDestinationDir remove files from destination not found in static directories
+ -c, --contentDir string filesystem path to content directory
+ -n, --count int number of times to build the site (default 13)
+ --cpuprofile string path/filename for the CPU profile file
+ -d, --destination string filesystem path to write files to
+ --disable404 do not render 404 page
+ --disableKinds strings disable different kind of pages (home, RSS etc.)
+ --disableRSS do not build RSS files
+ --disableSitemap do not build Sitemap file
+ --enableGitInfo add Git revision, date and author info to the pages
+ --forceSyncStatic copy all files when static is changed.
+ -h, --help help for benchmark
+ --i18n-warnings print missing translations
+ --ignoreCache ignores the cache directory
+ -l, --layoutDir string filesystem path to layout directory
+ --memprofile string path/filename for the memory profile file
+ --noChmod don't sync permission mode of files
+ --noTimes don't sync modification time of files
+ --pluralizeListTitles pluralize titles in lists using inflect (default true)
+ --preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")+ --renderToMemory render to memory (only useful for benchmark testing)
+ -s, --source string filesystem path to read files relative from
+ --stepAnalysis display memory and timing of different steps of the program
+ --templateMetrics display metrics about template executions
+ --templateMetricsHints calculate some improvement hints when combined with --templateMetrics
+ -t, --theme string theme to use (located in /themes/THEMENAME/)
+ --themesDir string filesystem path to themes directory
+ --uglyURLs if true, use /filename.html instead of /filename/
```
### Options inherited from parent commands
@@ -71,4 +72,4 @@
### SEE ALSO
* [hugo](/commands/hugo/) - hugo builds your site
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_check.md
+++ b/docs/content/commands/hugo_check.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo check"
slug: hugo_check
url: /commands/hugo_check/
@@ -35,4 +35,4 @@
* [hugo](/commands/hugo/) - hugo builds your site
* [hugo check ulimit](/commands/hugo_check_ulimit/) - Check system ulimit settings
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_check_ulimit.md
+++ b/docs/content/commands/hugo_check_ulimit.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo check ulimit"
slug: hugo_check_ulimit
url: /commands/hugo_check_ulimit/
@@ -39,4 +39,4 @@
### SEE ALSO
* [hugo check](/commands/hugo_check/) - Contains some verification checks
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_config.md
+++ b/docs/content/commands/hugo_config.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo config"
slug: hugo_config
url: /commands/hugo_config/
@@ -38,4 +38,4 @@
### SEE ALSO
* [hugo](/commands/hugo/) - hugo builds your site
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_convert.md
+++ b/docs/content/commands/hugo_convert.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo convert"
slug: hugo_convert
url: /commands/hugo_convert/
@@ -42,4 +42,4 @@
* [hugo convert toTOML](/commands/hugo_convert_totoml/) - Convert front matter to TOML
* [hugo convert toYAML](/commands/hugo_convert_toyaml/) - Convert front matter to YAML
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_convert_toJSON.md
+++ b/docs/content/commands/hugo_convert_toJSON.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo convert toJSON"
slug: hugo_convert_toJSON
url: /commands/hugo_convert_tojson/
@@ -42,4 +42,4 @@
### SEE ALSO
* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_convert_toTOML.md
+++ b/docs/content/commands/hugo_convert_toTOML.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo convert toTOML"
slug: hugo_convert_toTOML
url: /commands/hugo_convert_totoml/
@@ -42,4 +42,4 @@
### SEE ALSO
* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_convert_toYAML.md
+++ b/docs/content/commands/hugo_convert_toYAML.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo convert toYAML"
slug: hugo_convert_toYAML
url: /commands/hugo_convert_toyaml/
@@ -42,4 +42,4 @@
### SEE ALSO
* [hugo convert](/commands/hugo_convert/) - Convert your content to different formats
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_env.md
+++ b/docs/content/commands/hugo_env.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo env"
slug: hugo_env
url: /commands/hugo_env/
@@ -38,4 +38,4 @@
### SEE ALSO
* [hugo](/commands/hugo/) - hugo builds your site
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_gen.md
+++ b/docs/content/commands/hugo_gen.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo gen"
slug: hugo_gen
url: /commands/hugo_gen/
@@ -38,4 +38,4 @@
* [hugo gen doc](/commands/hugo_gen_doc/) - Generate Markdown documentation for the Hugo CLI.
* [hugo gen man](/commands/hugo_gen_man/) - Generate man pages for the Hugo CLI
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_gen_autocomplete.md
+++ b/docs/content/commands/hugo_gen_autocomplete.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo gen autocomplete"
slug: hugo_gen_autocomplete
url: /commands/hugo_gen_autocomplete/
@@ -56,4 +56,4 @@
### SEE ALSO
* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators.
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_gen_chromastyles.md
+++ b/docs/content/commands/hugo_gen_chromastyles.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo gen chromastyles"
slug: hugo_gen_chromastyles
url: /commands/hugo_gen_chromastyles/
@@ -43,4 +43,4 @@
### SEE ALSO
* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators.
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_gen_doc.md
+++ b/docs/content/commands/hugo_gen_doc.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo gen doc"
slug: hugo_gen_doc
url: /commands/hugo_gen_doc/
@@ -45,4 +45,4 @@
### SEE ALSO
* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators.
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_gen_man.md
+++ b/docs/content/commands/hugo_gen_man.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo gen man"
slug: hugo_gen_man
url: /commands/hugo_gen_man/
@@ -41,4 +41,4 @@
### SEE ALSO
* [hugo gen](/commands/hugo_gen/) - A collection of several useful generators.
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_import.md
+++ b/docs/content/commands/hugo_import.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo import"
slug: hugo_import
url: /commands/hugo_import/
@@ -37,4 +37,4 @@
* [hugo](/commands/hugo/) - hugo builds your site
* [hugo import jekyll](/commands/hugo_import_jekyll/) - hugo import from Jekyll
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_import_jekyll.md
+++ b/docs/content/commands/hugo_import_jekyll.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo import jekyll"
slug: hugo_import_jekyll
url: /commands/hugo_import_jekyll/
@@ -41,4 +41,4 @@
### SEE ALSO
* [hugo import](/commands/hugo_import/) - Import your site from others.
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_list.md
+++ b/docs/content/commands/hugo_list.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo list"
slug: hugo_list
url: /commands/hugo_list/
@@ -40,4 +40,4 @@
* [hugo list expired](/commands/hugo_list_expired/) - List all posts already expired
* [hugo list future](/commands/hugo_list_future/) - List all posts dated in the future
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_list_drafts.md
+++ b/docs/content/commands/hugo_list_drafts.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo list drafts"
slug: hugo_list_drafts
url: /commands/hugo_list_drafts/
@@ -39,4 +39,4 @@
### SEE ALSO
* [hugo list](/commands/hugo_list/) - Listing out various types of content
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_list_expired.md
+++ b/docs/content/commands/hugo_list_expired.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo list expired"
slug: hugo_list_expired
url: /commands/hugo_list_expired/
@@ -40,4 +40,4 @@
### SEE ALSO
* [hugo list](/commands/hugo_list/) - Listing out various types of content
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_list_future.md
+++ b/docs/content/commands/hugo_list_future.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo list future"
slug: hugo_list_future
url: /commands/hugo_list_future/
@@ -40,4 +40,4 @@
### SEE ALSO
* [hugo list](/commands/hugo_list/) - Listing out various types of content
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_new.md
+++ b/docs/content/commands/hugo_new.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo new"
slug: hugo_new
url: /commands/hugo_new/
@@ -48,4 +48,4 @@
* [hugo new site](/commands/hugo_new_site/) - Create a new site (skeleton)
* [hugo new theme](/commands/hugo_new_theme/) - Create a new theme
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_new_site.md
+++ b/docs/content/commands/hugo_new_site.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo new site"
slug: hugo_new_site
url: /commands/hugo_new_site/
@@ -43,4 +43,4 @@
### SEE ALSO
* [hugo new](/commands/hugo_new/) - Create new content for your site
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_new_theme.md
+++ b/docs/content/commands/hugo_new_theme.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo new theme"
slug: hugo_new_theme
url: /commands/hugo_new_theme/
@@ -42,4 +42,4 @@
### SEE ALSO
* [hugo new](/commands/hugo_new/) - Create new content for your site
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_server.md
+++ b/docs/content/commands/hugo_server.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo server"
slug: hugo_server
url: /commands/hugo_server/
@@ -31,46 +31,48 @@
### Options
```
- --appendPort append port to baseURL (default true)
- -b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
- --bind string interface to which the server will bind (default "127.0.0.1")
- -D, --buildDrafts include content marked as draft
- -E, --buildExpired include expired content
- -F, --buildFuture include content with publishdate in the future
- --cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
- --canonifyURLs if true, all relative URLs will be canonicalized using baseURL
- --cleanDestinationDir remove files from destination not found in static directories
- -c, --contentDir string filesystem path to content directory
- -d, --destination string filesystem path to write files to
- --disable404 do not render 404 page
- --disableKinds stringSlice disable different kind of pages (home, RSS etc.)
- --disableLiveReload watch without enabling live browser reload on rebuild
- --disableRSS do not build RSS files
- --disableSitemap do not build Sitemap file
- --enableGitInfo add Git revision, date and author info to the pages
- --forceSyncStatic copy all files when static is changed.
- -h, --help help for server
- --i18n-warnings print missing translations
- --ignoreCache ignores the cache directory
- -l, --layoutDir string filesystem path to layout directory
- --liveReloadPort int port for live reloading (i.e. 443 in HTTPS proxy situations) (default -1)
- --meminterval string interval to poll memory usage (requires --memstats), valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". (default "100ms")
- --memstats string log memory usage to this file
- --navigateToChanged navigate to changed content file on live browser reload
- --noChmod don't sync permission mode of files
- --noHTTPCache prevent HTTP caching
- --noTimes don't sync modification time of files
- --pluralizeListTitles pluralize titles in lists using inflect (default true)
- -p, --port int port on which the server will listen (default 1313)
- --preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")- --renderToDisk render to Destination path (default is render to memory & serve from there)
- -s, --source string filesystem path to read files relative from
- --stepAnalysis display memory and timing of different steps of the program
- --templateMetrics display metrics about template executions
- -t, --theme string theme to use (located in /themes/THEMENAME/)
- --themesDir string filesystem path to themes directory
- --uglyURLs if true, use /filename.html instead of /filename/
- -w, --watch watch filesystem for changes and recreate as needed (default true)
+ --appendPort append port to baseURL (default true)
+ -b, --baseURL string hostname (and path) to the root, e.g. http://spf13.com/
+ --bind string interface to which the server will bind (default "127.0.0.1")
+ -D, --buildDrafts include content marked as draft
+ -E, --buildExpired include expired content
+ -F, --buildFuture include content with publishdate in the future
+ --cacheDir string filesystem path to cache directory. Defaults: $TMPDIR/hugo_cache/
+ --canonifyURLs if true, all relative URLs will be canonicalized using baseURL
+ --cleanDestinationDir remove files from destination not found in static directories
+ -c, --contentDir string filesystem path to content directory
+ -d, --destination string filesystem path to write files to
+ --disable404 do not render 404 page
+ --disableFastRender enables full re-renders on changes
+ --disableKinds strings disable different kind of pages (home, RSS etc.)
+ --disableLiveReload watch without enabling live browser reload on rebuild
+ --disableRSS do not build RSS files
+ --disableSitemap do not build Sitemap file
+ --enableGitInfo add Git revision, date and author info to the pages
+ --forceSyncStatic copy all files when static is changed.
+ -h, --help help for server
+ --i18n-warnings print missing translations
+ --ignoreCache ignores the cache directory
+ -l, --layoutDir string filesystem path to layout directory
+ --liveReloadPort int port for live reloading (i.e. 443 in HTTPS proxy situations) (default -1)
+ --meminterval string interval to poll memory usage (requires --memstats), valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". (default "100ms")
+ --memstats string log memory usage to this file
+ --navigateToChanged navigate to changed content file on live browser reload
+ --noChmod don't sync permission mode of files
+ --noHTTPCache prevent HTTP caching
+ --noTimes don't sync modification time of files
+ --pluralizeListTitles pluralize titles in lists using inflect (default true)
+ -p, --port int port on which the server will listen (default 1313)
+ --preserveTaxonomyNames preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")+ --renderToDisk render to Destination path (default is render to memory & serve from there)
+ -s, --source string filesystem path to read files relative from
+ --stepAnalysis display memory and timing of different steps of the program
+ --templateMetrics display metrics about template executions
+ --templateMetricsHints calculate some improvement hints when combined with --templateMetrics
+ -t, --theme string theme to use (located in /themes/THEMENAME/)
+ --themesDir string filesystem path to themes directory
+ --uglyURLs if true, use /filename.html instead of /filename/
+ -w, --watch watch filesystem for changes and recreate as needed (default true)
```
### Options inherited from parent commands
@@ -88,4 +90,4 @@
### SEE ALSO
* [hugo](/commands/hugo/) - hugo builds your site
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_undraft.md
+++ b/docs/content/commands/hugo_undraft.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo undraft"
slug: hugo_undraft
url: /commands/hugo_undraft/
@@ -40,4 +40,4 @@
### SEE ALSO
* [hugo](/commands/hugo/) - hugo builds your site
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/commands/hugo_version.md
+++ b/docs/content/commands/hugo_version.md
@@ -1,5 +1,5 @@
---
-date: 2017-09-26T21:11:49+02:00
+date: 2017-10-15T10:19:48+02:00
title: "hugo version"
slug: hugo_version
url: /commands/hugo_version/
@@ -38,4 +38,4 @@
### SEE ALSO
* [hugo](/commands/hugo/) - hugo builds your site
-###### Auto generated by spf13/cobra on 26-Sep-2017
+###### Auto generated by spf13/cobra on 15-Oct-2017
--- a/docs/content/content-management/cross-references.md
+++ b/docs/content/content-management/cross-references.md
@@ -1,5 +1,5 @@
---
-title: Cross References
+title: Links and Cross References
description: Hugo makes it easy to link documents together.
date: 2017-02-01
publishdate: 2017-02-01
--- a/docs/content/content-management/menus.md
+++ b/docs/content/content-management/menus.md
@@ -18,7 +18,7 @@
---
{{% note "Lazy Blogger"%}}-If all you want is a simple menu for your sections, see the ["Section Menu for Lazy Bloggers" in Menu Templates](/templates/menu-templates/#section-menu-for-lazy-blogger).
+If all you want is a simple menu for your sections, see the ["Section Menu for Lazy Bloggers" in Menu Templates](/templates/menu-templates/#section-menu-for-lazy-bloggers).
{{% /note %}}You can do this:
--- a/docs/content/content-management/syntax-highlighting.md
+++ b/docs/content/content-management/syntax-highlighting.md
@@ -22,7 +22,7 @@
The example below shows a simple code snippet from the Hugo source highlighted with the `highlight` shortcode. Note that the gohugo.io site is generated with `pygmentsUseClasses=true` (see [Generate Syntax Highlighter CSS](#generate-syntax-highlighter-css)).
-* `linenos=inline` turns on line numbers. Note that the `inline` value only has an effect in Pygments.
+* `linenos=inline` or `linenos=table` (`table` will give copy-and-paste friendly code blocks) turns on line numbers.
* `hl_lines` lists a set of line numbers or line number ranges to be highlighted. Note that the hyphen range syntax is only supported for Chroma.
* `linenostart=199` starts the line number count from 199.
@@ -29,7 +29,7 @@
With that, this:
```
-{{</* highlight go "linenos=inline,hl_lines=8 15-17,linenostart=199" */>}}+{{</* highlight go "linenos=table,hl_lines=8 15-17,linenostart=199" */>}}// ... code
{{</* / highlight */>}}```
@@ -36,7 +36,7 @@
Gives this:
-{{< highlight go "linenos=inline,hl_lines=8 15-17,linenostart=199" >}}+{{< highlight go "linenos=table,hl_lines=8 15-17,linenostart=199" >}}// GetTitleFunc returns a func that can be used to transform a string to
// title case.
//
@@ -106,7 +106,7 @@
## Generate Syntax Highlighter CSS
-If you run with `pygmentsUseClassic=true` in your site config, you need a style sheet.
+If you run with `pygmentsUseClasses=true` in your site config, you need a style sheet.
You can generate one with Hugo:
--- a/docs/content/content-management/toc.md
+++ b/docs/content/content-management/toc.md
@@ -45,6 +45,10 @@
The built-in `.TableOfContents` variables outputs a `<nav id="TableOfContents">` element with a child `<ul>`, whose child `<li>` elements begin with any `<h1>`'s (i.e., `#` in markdown) inside your content.'
+{{% note "Table of contents not available for MMark" %}}+Hugo documents created in the [MMark](/content-management/formats/#mmark) Markdown dialect do not currently display TOCs. TOCs are, however, compatible with all other supported Markdown formats.
+{{% /note %}}+
## Template Example: Basic TOC
The following is an example of a very basic [single page template][]:
--- a/docs/content/functions/ref.md
+++ b/docs/content/functions/ref.md
@@ -11,7 +11,7 @@
docs:
parent: "functions"
keywords: [cross references, anchors]
-signature: ["ref PAGE CONTENT"]
+signature: ["ref CONTENT"]
workson: []
hugoversion:
relatedfuncs: [relref]
@@ -19,10 +19,10 @@
aliases: []
---
-`ref` and `relRef` look up a content page by relative path (`relref`) or logical name (`ref`) to return the permalink. Both functions require a `Page` object (usually satisfied with a "`.`"):
+`ref` and `relRef` look up a content page by relative path (`relref`) or logical name (`ref`) to return the permalink:
```
-{{ relref . "about.md" }}+{{ ref "about.md" }}```
These functions are used in two of Hugo's built-in shortcodes. You can see basic usage examples of both `ref` and `relref` in the [shortcode documentation](/content-management/shortcodes/#ref-and-relref).
--- a/docs/content/functions/relref.md
+++ b/docs/content/functions/relref.md
@@ -11,7 +11,7 @@
docs:
parent: "functions"
keywords: [cross references, anchors]
-signature: ["relref PAGE CONTENT"]
+signature: ["relref CONTENT"]
workson: []
hugoversion:
relatedfuncs: [relref]
@@ -19,10 +19,10 @@
aliases: []
---
-`ref` and `relRef` look up a content page by relative path (`relref`) or logical name (`ref`) to return the permalink. Both functions require a `Page` object (usually satisfied with a "`.`"):
+`ref` and `relRef` look up a content page by relative path (`relref`) or logical name (`ref`) to return the permalink:
```
-{{ relref . "about.md" }}+{{ relref "about.md" }}```
These functions are used in two of Hugo's built-in shortcodes. You can see basic usage examples of both `ref` and `relref` in the [shortcode documentation](/content-management/shortcodes/#ref-and-relref).
--- a/docs/content/getting-started/configuration.md
+++ b/docs/content/getting-started/configuration.md
@@ -34,10 +34,9 @@
## YAML Configuration
-The following is a typical example of a YAML configuration file. Note the document opens with 3 hyphens and closes with 3 periods. The values nested under `params:` will populate the [`.Site.Params`][] variable for use in [templates][]:
+The following is a typical example of a YAML configuration file. The values nested under `params:` will populate the [`.Site.Params`][] variable for use in [templates][]:
{{< code file="config.yml">}}----
baseURL: "https://yoursite.example.com/"
title: "My Hugo Site"
footnoteReturnLinkContents: "↩"
@@ -51,7 +50,6 @@
- "foo1"
- "foo2"
SidebarRecentLimit: 5
-...
{{< /code >}}### All Variables, YAML
@@ -59,7 +57,6 @@
The following is the full list of Hugo-defined variables in an example YAML file. The values provided in this example represent the default values used by Hugo.
{{< code file="config.yml" download="config.yml" >}}----
archetypeDir: "archetypes"
# hostname (and path) to the root, e.g. http://spf13.com/
baseURL: ""
@@ -174,7 +171,6 @@
taxonomies:
- category: "categories"
- tag: "tags"
----
{{< /code >}}## TOML Configuration
@@ -181,7 +177,7 @@
The following is an example of a TOML configuration file. The values under `[params]` will populate the `.Site.Params` variable for use in [templates][]:
-```
+{{< code file="config.toml">}}contentDir = "content"
layoutDir = "layouts"
publishDir = "public"
@@ -197,7 +193,7 @@
[params]
subtitle = "Hugo is Absurdly Fast!"
author = "John Doe"
-```
+{{< /code >}}### All Variables, TOML
@@ -204,7 +200,6 @@
The following is the full list of Hugo-defined variables in an example TOML file. The values provided in this example represent the default values used by Hugo.
{{< code file="config.toml" download="config.toml">}}-+++
archetypeDir = "archetypes"
# hostname (and path) to the root, e.g. http://spf13.com/
baseURL = ""
@@ -313,14 +308,18 @@
[taxonomies]
category = "categories"
tag = "tags"
-+++
{{< /code >}} {{% note %}}If you are developing your site on a \*nix machine, here is a handy shortcut for finding a configuration option from the command line:
```
-~/sites/yourhugosite
+cd ~/sites/yourhugosite
hugo config | grep emoji
+```
+
+which shows output like
+
+```
enableemoji: true
```
{{% /note %}}--- a/docs/content/templates/robots.md
+++ b/docs/content/templates/robots.md
@@ -29,7 +29,7 @@
The [lookup order][lookup] for the `robots.txt` template is as follows:
* `/layouts/robots.txt`
-* `/themes/<THEME>/layout/robots.txt`
+* `/themes/<THEME>/layouts/robots.txt`
{{% note %}}If you do not want Hugo to create a default `robots.txt` or leverage the `robots.txt` template, you can hand code your own and place the file in `static`. Remember that everything in the [static directory](/getting-started/directory-structure/) is copied over as-is when Hugo builds your site.
@@ -51,4 +51,4 @@
[config]: /getting-started/configuration/
[lookup]: /templates/lookup-order/
-[robots]: http://www.robotstxt.org/
\ No newline at end of file
+[robots]: http://www.robotstxt.org/
--- a/docs/content/tools/starter-kits.md
+++ b/docs/content/tools/starter-kits.md
@@ -27,6 +27,7 @@
* [GOHUGO AMP][]. GoHugo AMP is a starter theme that aims to make it easy to adopt [Google's AMP Project][amp]. The starter kit comes with 40+ shortcodes and partials plus automatic structured data. The project also includes a [separate site with extensive documentation][gohugodocs].
* [Blaupause][]. Blaupause is a developer-friendly Hugo starter kit based on Gulp tasks. It comes ES6-ready with several helpers for SVG and fonts and basic structure for HTML, SCSS, and JavaScript.
* [hugulp][]. hugulp is a tool to optimize the assets of a Hugo website. The main idea is to recreate the famous Ruby on Rails Asset Pipeline, which minifies, concatenates and fingerprints the assets used in your website.
+* [Atlas][]. Atlas is a Hugo boilerplate designed to speed up development with support for Netlify, Netlify CMS, Gulp, Linting, SCSS, ES6 & more. It's actively maintained and contributions are always welcome.
[addkit]: https://github.com/gohugoio/hugo/edit/master/docs/content/tools/starter-kits.md
@@ -35,4 +36,5 @@
[GOHUGO AMP]: https://github.com/wildhaber/gohugo-amp
[gohugodocs]: https://gohugo-amp.gohugohq.com/
[hugulp]: https://github.com/jbrodriguez/hugulp
-[Victor Hugo]: https://github.com/netlify/victor-hugo
\ No newline at end of file
+[Victor Hugo]: https://github.com/netlify/victor-hugo
+[Atlas]: https://github.com/indigotree/atlas
\ No newline at end of file
--- a/docs/content/variables/git.md
+++ b/docs/content/variables/git.md
@@ -51,4 +51,8 @@
`.Subject`
: commit message subject (e.g., `tpl: Add custom index function`)
+## `.Lastmod`
+
+If the `.GitInfo` feature is enabled, **and** if the `lastmod` field in the content's front matter is not set, `.Lastmod` (on `Page`) is fetched from Git i.e. `.GitInfo.AuthorDate`.
+
[configuration]: /getting-started/configuration/
--- a/docs/content/variables/page.md
+++ b/docs/content/variables/page.md
@@ -79,8 +79,13 @@
`config`.
`.Lastmod`
-: the date the content was last modified; `.Lastmod` pulls from the `lastmod` field in a content's front matter. If `lastmod` is not set, Hugo will default to the `date` field. See also `.ExpiryDate`, `.Date`, and `.PublishDate`.
+: the date the content was last modified. `.Lastmod` pulls from the `lastmod` field in a content's front matter.
+ - If `lastmod` is not set, and `.GitInfo` feature is disabled, the front matter `date` field will be used.
+ - If `lastmod` is not set, and `.GitInfo` feature is enabled, `.GitInfo.AuthorDate` will be used instead.
+
+See also `.ExpiryDate`, `.Date`, `.PublishDate`, and [`.GitInfo`][gitinfo].
+
`.LinkTitle`
: access when creating links to the content. If set, Hugo will use the `linktitle` from the front matter before `title`.
@@ -266,3 +271,5 @@
{{ $.Param "favorites.flavor" }}=> vanilla
```
+
+[gitinfo]: /variables/git/
--- a/docs/data/docs.json
+++ b/docs/data/docs.json
@@ -352,6 +352,21 @@
"tpl": { "funcs": { "cast": {+ "ToFloat": {+ "Description": "ToFloat converts the given value to a float.",
+ "Args": [
+ "v"
+ ],
+ "Aliases": [
+ "float"
+ ],
+ "Examples": [
+ [
+ "{{ \"1234\" | float | printf \"%T\" }}",+ "float64"
+ ]
+ ]
+ },
"ToInt": {"Description": "ToInt converts the given value to an int.",
"Args": [
@@ -888,6 +903,22 @@
}
},
"fmt": {+ "Errorf": {+ "Description": "",
+ "Args": [
+ "format",
+ "a"
+ ],
+ "Aliases": [
+ "errorf"
+ ],
+ "Examples": [
+ [
+ "{{ errorf \"%s.\" \"failed\" }}",+ "failed."
+ ]
+ ]
+ },
"Print": {"Description": "Print returns string representation of the passed arguments.",
"Args": [
@@ -920,7 +951,7 @@
]
},
"Println": {- "Description": "Print returns string representation of the passed arguments ending with a newline.",
+ "Description": "Println returns string representation of the passed arguments ending with a newline.",
"Args": [
"a"
],
@@ -1068,6 +1099,19 @@
]
]
},
+ "Ceil": {+ "Description": "Ceil returns the least integer value greater than or equal to x.",
+ "Args": [
+ "x"
+ ],
+ "Aliases": null,
+ "Examples": [
+ [
+ "{{math.Ceil 2.1}}",+ "3"
+ ]
+ ]
+ },
"Div": {"Description": "Div divides two numbers.",
"Args": [
@@ -1084,6 +1128,19 @@
]
]
},
+ "Floor": {+ "Description": "Floor returns the greatest integer value less than or equal to x.",
+ "Args": [
+ "x"
+ ],
+ "Aliases": null,
+ "Examples": [
+ [
+ "{{math.Floor 1.9}}",+ "1"
+ ]
+ ]
+ },
"Log": {"Description": "Log returns the natural logarithm of a number.",
"Args": [
@@ -1145,6 +1202,19 @@
]
]
},
+ "Round": {+ "Description": "Round returns the nearest integer, rounding half away from zero.",
+ "Args": [
+ "x"
+ ],
+ "Aliases": null,
+ "Examples": [
+ [
+ "{{math.Round 1.5}}",+ "2"
+ ]
+ ]
+ },
"Sub": {"Description": "Sub subtracts two numbers.",
"Args": [
@@ -1163,6 +1233,21 @@
}
},
"os": {+ "FileExists": {+ "Description": "FileExists checks whether a file exists under the given path.",
+ "Args": [
+ "i"
+ ],
+ "Aliases": [
+ "fileExists"
+ ],
+ "Examples": [
+ [
+ "{{ fileExists \"foo.txt\" }}",+ "false"
+ ]
+ ]
+ },
"Getenv": {"Description": "Getenv retrieves the value of the environment variable named by the key.\nIt returns the value, which will be empty if the variable is not present.",
"Args": [
@@ -1220,6 +1305,18 @@
"\u003ctitle\u003eHugo Rocks!\u003c/title\u003e"
]
]
+ },
+ "IncludeCached": {+ "Description": "IncludeCached executes and caches partial templates. An optional variant\nstring parameter (a string slice actually, but be only use a variadic\nargument to make it optional) can be passed so that a given partial can have\nmultiple uses. The cache is created with name+variant as the key.",
+ "Args": [
+ "name",
+ "context",
+ "variant"
+ ],
+ "Aliases": [
+ "partialCached"
+ ],
+ "Examples": []
}
},
"safe": {@@ -1837,6 +1934,12 @@
"absURL"
],
"Examples": []
+ },
+ "Parse": {+ "Description": "",
+ "Args": null,
+ "Aliases": null,
+ "Examples": null
},
"Ref": {"Description": "Ref returns the absolute URL path to a given content item.",
binary files /dev/null b/docs/static/images/blog/hugo-30-poster.png differ
--- a/docs/themes/gohugoioTheme/layouts/_default/baseof.html
+++ b/docs/themes/gohugoioTheme/layouts/_default/baseof.html
@@ -44,7 +44,7 @@
{{ block "main" . }}{{ end }}</main>
- {{ block "footer" . }}{{ partial "site-footer.html" . }}{{ end }}+ {{ block "footer" . }}{{ partialCached "site-footer.html" . }}{{ end }} {{ block "scripts" . }}{{- partial "site-scripts.html" . -}}{{ end }}</body>
--- a/docs/themes/gohugoioTheme/layouts/partials/site-nav.html
+++ b/docs/themes/gohugoioTheme/layouts/partials/site-nav.html
@@ -29,7 +29,7 @@
</div>
<span class="absolute mt1 mt2-l pr3 right-0 top-0">
- {{- partial "social-follow.html" . -}}+ {{- partialCached "social-follow.html" . -}}</span>
</div>
--- a/docs/themes/gohugoioTheme/src/css/_chroma2.css
+++ b/docs/themes/gohugoioTheme/src/css/_chroma2.css
@@ -1,6 +1,9 @@
/* Background */ .chroma { background-color: #f0f0f0 } /* Error */ .chroma .err { }+/* LineTableTD */ .chroma .lntd { ; vertical-align: top; padding: 0; margin: 0; border: 0; }+/* LineTable */ .chroma .lntable { ; border-spacing: 0; padding: 0; margin: 0; border: 0; width: 100%; overflow: auto; display: block; } /* LineHighlight */ .chroma .hl { background-color: #ffffcc; display: block; width: 100% }+/* LineNumbersTable */ .chroma .lnt { ; margin-right: 0.4em; padding: 0 0.4em 0 0.4em; display: block; } /* LineNumbers */ .chroma .ln { ; margin-right: 0.4em; padding: 0 0.4em 0 0.4em; } /* Keyword */ .chroma .k { color: #007020; font-weight: bold } /* KeywordConstant */ .chroma .kc { color: #007020; font-weight: bold }--- a/docs/themes/gohugoioTheme/src/css/_code.css
+++ b/docs/themes/gohugoioTheme/src/css/_code.css
@@ -1,3 +1,14 @@
+.chroma .lntable pre {+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+.chroma .lntable pre code {+ padding: 0;
+ margin: 0;
+}
+
pre, .pre {overflow-x: auto;
overflow-y: hidden;
--- a/docs/themes/gohugoioTheme/static/dist/app.bundle.js
+++ b/docs/themes/gohugoioTheme/static/dist/app.bundle.js
@@ -1,11 +1,8346 @@
-!function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=10)}([function(t,e,n){"use strict";var r=function(t){var e=document.createElement("a");return e.className="header-link",e.href="#"+t,e.innerHTML=' <svg class="fill-current o-60 hover-accent-color-light" height="22px" viewBox="0 0 24 24" width="22px" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>',e},i=function(t,e){for(var n=e.getElementsByTagName("h"+t),i=0;i<n.length;i++){var o=n[i];void 0!==o.id&&""!==o.id&&o.appendChild(r(o.id))}};document.onreadystatechange=function(){if("complete"===this.readyState){var t=document.getElementsByClassName("prose")[0];if(!t)return;for(var e=2;e<=2;e++)i(e,t)}}},function(t,e,n){"use strict";function r(t,e){t.setAttribute("class","copied bg-primary-color-dark f6 absolute top-0 right-0 lh-solid hover-bg-primary-color-dark bn white ph3 pv2"),t.setAttribute("aria-label",e)}function i(t,e){var n="cut"===e?"X":"C";return isMac?"Press ⌘-"+n:"Press Ctrl-"+n}new(n(11))(".copy",{target:function(t){return t.nextElementSibling}}).on("success",function(t){r(t.trigger,"Copied!"),t.clearSelection()}).on("error",function(t){r(t.trigger,i(t.action))})},function(t,e,n){"use strict";var r=function(){function t(t,e){var n=[],r=!0,i=!1,o=void 0;try{for(var s,a=t[Symbol.iterator]();!(r=(s=a.next()).done)&&(n.push(s.value),!e||n.length!==e);r=!0);}catch(t){i=!0,o=t}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=document.getElementById("prose");if(i){var o=i.getElementsByTagName("code"),s=!0,a=!1,u=void 0;try{for(var c,l=Object.entries(o)[Symbol.iterator]();!(s=(c=l.next()).done);s=!0){var h=c.value,f=r(h,2),p=(f[0],f[1]);p.scrollWidth-p.clientWidth>0&&p.parentNode.classList.add("expand")}}catch(t){a=!0,u=t}finally{try{!s&&l.return&&l.return()}finally{if(a)throw u}}}},function(t,e,n){"use strict";n(12)({apiKey:"167e7998590aebda7f9fedcf86bc4a55",indexName:"hugodocs",inputSelector:"#search-input",debug:!0})},function(t,e,n){"use strict";n(13)},function(t,e,n){"use strict";function r(){for(var t=this.dataset.target.split(" "),e=document.querySelector(".mobilemenu:not(.dn)"),n=document.querySelector(".desktopmenu:not(.dn)"),r=document.querySelector(".desktopmenu:not(.dn)"),i=0;i<t.length;i++){var o=document.querySelectorAll(t[i]);[].forEach.call(o,function(t){return t.classList.contains("dn")?t.classList.remove("dn"):t.classList.add("dn"),!1}),e&&e.classList.add("dn"),n&&n.classList.add("dn"),r&&r.classList.remove("db")}}for(var i=document.getElementsByClassName("js-toggle"),o=0;o<i.length;o++)i[o].addEventListener("click",r,!1)},function(t,e,n){"use strict";document.documentElement.className=document.documentElement.className.replace(/\bno-js\b/,"js")},function(t,e,n){"use strict";n(14)},function(t,e,n){"use strict";!function(){if("querySelector"in document&&"addEventListener"in window&&Array.prototype.forEach){var t=function(t,e){var n,r=window.pageYOffset,i=t.offsetTop,o=i-r,s=o/(e/16),a=function(){window.scrollBy(0,s),n()};n=s>=0?function(){var t=window.pageYOffset;(t>=i-s||window.innerHeight+t>=document.body.offsetHeight)&&clearInterval(u)}:function(){window.pageYOffset<=(i||0)&&clearInterval(u)};var u=setInterval(a,16)},e=document.querySelectorAll("#TableOfContents ul li a");[].forEach\ No newline at end of file
+/******/ (function(modules) { // webpackBootstrap+/******/ // The module cache
+/******/ var installedModules = {};+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // identity function for calling harmony imports with the correct context
+/******/ __webpack_require__.i = function(value) { return value; };+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {+/******/ if(!__webpack_require__.o(exports, name)) {+/******/ Object.defineProperty(exports, name, {+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :+/******/ function getModuleExports() { return module; };+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 10);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+/**
+* Anchor for ID BPNY
+**/
+var anchorForId = function anchorForId(id) {+ var anchor = document.createElement("a");+ anchor.className = "header-link";
+ anchor.href = "#" + id;
+ anchor.innerHTML = ' <svg class="fill-current o-60 hover-accent-color-light" height="22px" viewBox="0 0 24 24" width="22px" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>';
+ return anchor;
+};
+
+var linkifyAnchors = function linkifyAnchors(level, containingElement) {+ var headers = containingElement.getElementsByTagName("h" + level);+ for (var h = 0; h < headers.length; h++) {+ var header = headers[h];
+
+ if (typeof header.id !== "undefined" && header.id !== "") {+ header.appendChild(anchorForId(header.id));
+ }
+ }
+};
+
+document.onreadystatechange = function () {+ if (this.readyState === "complete") {+ var contentBlock = document.getElementsByClassName("prose")[0];+ if (!contentBlock) {+ return;
+ }
+ for (var level = 2; level <= 2; level++) {+ linkifyAnchors(level, contentBlock);
+ }
+ }
+};
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var Clipboard = __webpack_require__(11);
+new Clipboard('.copy', {+ target: function target(trigger) {+ return trigger.nextElementSibling;
+ }
+}).on('success', function (e) {+ successMessage(e.trigger, 'Copied!');
+ e.clearSelection();
+}).on('error', function (e) {+ successMessage(e.trigger, fallbackMessage(e.action));
+});
+
+function successMessage(elem, msg) {+ elem.setAttribute('class', 'copied bg-primary-color-dark f6 absolute top-0 right-0 lh-solid hover-bg-primary-color-dark bn white ph3 pv2');+ elem.setAttribute('aria-label', msg);+}
+
+function fallbackMessage(elem, action) {+ var actionMsg = '';
+ var actionKey = action === 'cut' ? 'X' : 'C';
+ if (isMac) {+ actionMsg = 'Press ⌘-' + actionKey;
+ } else {+ actionMsg = 'Press Ctrl-' + actionKey;
+ }
+ return actionMsg;
+}
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();+
+var article = document.getElementById('prose');+
+if (article) {+ var codeBlocks = article.getElementsByTagName('code');+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {+ for (var _iterator = Object.entries(codeBlocks)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {+ var _ref = _step.value;
+
+ var _ref2 = _slicedToArray(_ref, 2);
+
+ var key = _ref2[0];
+ var codeBlock = _ref2[1];
+
+ var widthDif = codeBlock.scrollWidth - codeBlock.clientWidth;
+ if (widthDif > 0) codeBlock.parentNode.classList.add('expand');+ }
+ } catch (err) {+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {+ try {+ if (!_iteratorNormalCompletion && _iterator.return) {+ _iterator.return();
+ }
+ } finally {+ if (_didIteratorError) {+ throw _iteratorError;
+ }
+ }
+ }
+}
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var docsearch = __webpack_require__(12);
+docsearch({+ apiKey: '167e7998590aebda7f9fedcf86bc4a55',
+ indexName: 'hugodocs',
+ inputSelector: '#search-input',
+ debug: true // Set debug to true if you want to inspect the dropdown
+});
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var lazysizes = __webpack_require__(13);
+// var lsnoscript = require('lazysizes/plugins/noscript/ls.noscript.js');+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+// Grab any element that has the 'js-toggle' class and add an event listner for the toggleClass function
+var toggleBtns = document.getElementsByClassName('js-toggle');+for (var i = 0; i < toggleBtns.length; i++) {+ toggleBtns[i].addEventListener('click', toggleClass, false);+}
+
+function toggleClass() {+ // Define the data target via the dataset "target" (e.g. data-target=".docsmenu")
+ var content = this.dataset.target.split(' ');+ // Find any menu items that are open
+ var mobileCurrentlyOpen = document.querySelector('.mobilemenu:not(.dn)');+ var desktopCurrentlyOpen = document.querySelector('.desktopmenu:not(.dn)');+ var desktopActive = document.querySelector('.desktopmenu:not(.dn)');+
+ // Loop through the targets' divs
+ for (var i = 0; i < content.length; i++) {+ var matches = document.querySelectorAll(content[i]);
+ //for each, if the div has the 'dn' class (which is "display:none;"), remove it, otherwise, add that class
+ [].forEach.call(matches, function (dom) {+ dom.classList.contains('dn') ? dom.classList.remove('dn') : dom.classList.add('dn');+ return false;
+ });
+ // close the currently open menu items
+ if (mobileCurrentlyOpen) mobileCurrentlyOpen.classList.add('dn');+ if (desktopCurrentlyOpen) desktopCurrentlyOpen.classList.add('dn');+ if (desktopActive) desktopActive.classList.remove('db');+ }
+}
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/, 'js');
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var scrollDir = __webpack_require__(14);
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+// query selector targets Hugo TOC
+(function () {+
+ 'use strict';
+
+ // Feature Test
+
+ if ('querySelector' in document && 'addEventListener' in window && Array.prototype.forEach) {+
+ // Function to animate the scroll
+ var smoothScroll = function smoothScroll(anchor, duration) {+
+ // Calculate how far and how fast to scroll
+ var startLocation = window.pageYOffset;
+ var endLocation = anchor.offsetTop;
+ var distance = endLocation - startLocation;
+ var increments = distance / (duration / 16);
+ var stopAnimation;
+
+ // Scroll the page by an increment, and check if it's time to stop
+ var animateScroll = function animateScroll() {+ window.scrollBy(0, increments);
+ stopAnimation();
+ };
+
+ // If scrolling down
+ if (increments >= 0) {+ // Stop animation when you reach the anchor OR the bottom of the page
+ stopAnimation = function stopAnimation() {+ var travelled = window.pageYOffset;
+ if (travelled >= endLocation - increments || window.innerHeight + travelled >= document.body.offsetHeight) {+ clearInterval(runAnimation);
+ }
+ };
+ }
+ // If scrolling up
+ else {+ // Stop animation when you reach the anchor OR the top of the page
+ stopAnimation = function stopAnimation() {+ var travelled = window.pageYOffset;
+ if (travelled <= (endLocation || 0)) {+ clearInterval(runAnimation);
+ }
+ };
+ }
+
+ // Loop the animation function
+ var runAnimation = setInterval(animateScroll, 16);
+ };
+
+ // Define smooth scroll links
+ var scrollToggle = document.querySelectorAll('#TableOfContents ul li a');+
+ // For each smooth scroll link
+ [].forEach.call(scrollToggle, function (toggle) {+
+ // When the smooth scroll link is clicked
+ toggle.addEventListener('click', function (e) {+
+ // Prevent the default link behavior
+ e.preventDefault();
+
+ // Get anchor link and calculate distance from the top
+ var dataID = toggle.getAttribute('href');+ var dataTarget = document.querySelector(dataID);
+ var dataSpeed = toggle.getAttribute('data-speed');+
+ // If the anchor exists
+ if (dataTarget) {+ // Scroll to the anchor
+ smoothScroll(dataTarget, dataSpeed || 500);
+ }
+ }, false);
+ });
+ }
+})();
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var _main = __webpack_require__(9);
+
+var _main2 = _interopRequireDefault(_main);
+
+__webpack_require__(0);
+
+__webpack_require__(1);
+
+__webpack_require__(2);
+
+__webpack_require__(3);
+
+__webpack_require__(4);
+
+__webpack_require__(5);
+
+__webpack_require__(7);
+
+__webpack_require__(8);
+
+__webpack_require__(6);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {+
+var require;var require;/*!
.call(e,function(e){e.addEventListener("click",function(n){n.preventDefault();var r=e.getAttribute("href"),i=document.querySelector(r),o=e.getAttribute("data-speed");i&&t(i,o||500)},!1)})}}()},function(t,e){},function(t,e,n){"use strict";var r=n(9);!function(t){t&&t.__esModule}(r);n(0),n(1),n(2),n(3),n(4),n(5),n(7),n(8),n(6)},function(t,e,n){var r,r;/*!* clipboard.js v1.7.1
* https://zenorocha.github.io/clipboard.js
*
* Licensed MIT © Zeno Rocha
-"),i=document.querySelector(r),o=e.getAttribute("data-speed");i&&t(i,o||500)},!1)})}}()},function(t,e){},function(t,e,n){"use strict";var r=n(9);!function(t){t&&t.__esModule}(r);n(0),n(1),n(2),n(3),n(4),n(5),n(7),n(8),n(6)},function(t,e,n){var r,r;/*!- * clipboard.js v1.7.1
+(function(f){if(true){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Clipboard = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return require(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){+var DOCUMENT_NODE_TYPE = 9;
+
+/**
+ * A polyfill for Element.matches()
+ */
+if (typeof Element !== 'undefined' && !Element.prototype.matches) {+ var proto = Element.prototype;
+
+ proto.matches = proto.matchesSelector ||
+ proto.mozMatchesSelector ||
+ proto.msMatchesSelector ||
+ proto.oMatchesSelector ||
+ proto.webkitMatchesSelector;
+}
+
+/**
+ * Finds the closest parent that matches a selector.
+ *
+ * @param {Element} element+ * @param {String} selector+ * @return {Function}+ */
+function closest (element, selector) {+ while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {+ if (typeof element.matches === 'function' &&
+ element.matches(selector)) {+ return element;
+ }
+ element = element.parentNode;
+ }
+}
+
+module.exports = closest;
+
+},{}],2:[function(require,module,exports){+var closest = require('./closest');+
+/**
+ * Delegates event to a selector.
+ *
+ * @param {Element} element+ * @param {String} selector+ * @param {String} type+ * @param {Function} callback+ * @param {Boolean} useCapture+ * @return {Object}+ */
+function delegate(element, selector, type, callback, useCapture) {+ var listenerFn = listener.apply(this, arguments);
+
+ element.addEventListener(type, listenerFn, useCapture);
+
+ return {+ destroy: function() {+ element.removeEventListener(type, listenerFn, useCapture);
+ }
+ }
+}
+
+/**
+ * Finds closest match and invokes callback.
+ *
+ * @param {Element} element+ * @param {String} selector+ * @param {String} type+ * @param {Function} callback+ * @return {Function}+ */
+function listener(element, selector, type, callback) {+ return function(e) {+ e.delegateTarget = closest(e.target, selector);
+
+ if (e.delegateTarget) {+ callback.call(element, e);
+ }
+ }
+}
+
+module.exports = delegate;
+
+},{"./closest":1}],3:[function(require,module,exports){+/**
+ * Check if argument is a HTML element.
+ *
+ * @param {Object} value+ * @return {Boolean}+ */
+exports.node = function(value) {+ return value !== undefined
+ && value instanceof HTMLElement
+ && value.nodeType === 1;
+};
+
+/**
+ * Check if argument is a list of HTML elements.
+ *
+ * @param {Object} value+ * @return {Boolean}+ */
+exports.nodeList = function(value) {+ var type = Object.prototype.toString.call(value);
+
+ return value !== undefined
+ && (type === '[object NodeList]' || type === '[object HTMLCollection]')
+ && ('length' in value)+ && (value.length === 0 || exports.node(value[0]));
+};
+
+/**
+ * Check if argument is a string.
+ *
+ * @param {Object} value+ * @return {Boolean}+ */
+exports.string = function(value) {+ return typeof value === 'string'
+ || value instanceof String;
+};
+
+/**
+ * Check if argument is a function.
+ *
+ * @param {Object} value+ * @return {Boolean}+ */
+exports.fn = function(value) {+ var type = Object.prototype.toString.call(value);
+
+ return type === '[object Function]';
+};
+
+},{}],4:[function(require,module,exports){+var is = require('./is');+var delegate = require('delegate');+
+/**
+ * Validates all params and calls the right
+ * listener function based on its target type.
+ *
+ * @param {String|HTMLElement|HTMLCollection|NodeList} target+ * @param {String} type+ * @param {Function} callback+ * @return {Object}+ */
+function listen(target, type, callback) {+ if (!target && !type && !callback) {+ throw new Error('Missing required arguments');+ }
+
+ if (!is.string(type)) {+ throw new TypeError('Second argument must be a String');+ }
+
+ if (!is.fn(callback)) {+ throw new TypeError('Third argument must be a Function');+ }
+
+ if (is.node(target)) {+ return listenNode(target, type, callback);
+ }
+ else if (is.nodeList(target)) {+ return listenNodeList(target, type, callback);
+ }
+ else if (is.string(target)) {+ return listenSelector(target, type, callback);
+ }
+ else {+ throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');+ }
+}
+
+/**
+ * Adds an event listener to a HTML element
+ * and returns a remove listener function.
+ *
+ * @param {HTMLElement} node+ * @param {String} type+ * @param {Function} callback+ * @return {Object}+ */
+function listenNode(node, type, callback) {+ node.addEventListener(type, callback);
+
+ return {+ destroy: function() {+ node.removeEventListener(type, callback);
+ }
+ }
+}
+
+/**
+ * Add an event listener to a list of HTML elements
+ * and returns a remove listener function.
+ *
+ * @param {NodeList|HTMLCollection} nodeList+ * @param {String} type+ * @param {Function} callback+ * @return {Object}+ */
+function listenNodeList(nodeList, type, callback) {+ Array.prototype.forEach.call(nodeList, function(node) {+ node.addEventListener(type, callback);
+ });
+
+ return {+ destroy: function() {+ Array.prototype.forEach.call(nodeList, function(node) {+ node.removeEventListener(type, callback);
+ });
+ }
+ }
+}
+
+/**
+ * Add an event listener to a selector
+ * and returns a remove listener function.
+ *
+ * @param {String} selector+ * @param {String} type+ * @param {Function} callback+ * @return {Object}+ */
+function listenSelector(selector, type, callback) {+ return delegate(document.body, selector, type, callback);
+}
+
+module.exports = listen;
+
+},{"./is":3,"delegate":2}],5:[function(require,module,exports){+function select(element) {+ var selectedText;
+
+ if (element.nodeName === 'SELECT') {+ element.focus();
+
+ selectedText = element.value;
+ }
+ else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {+ var isReadOnly = element.hasAttribute('readonly');+
+ if (!isReadOnly) {+ element.setAttribute('readonly', '');+ }
+
+ element.select();
+ element.setSelectionRange(0, element.value.length);
+
+ if (!isReadOnly) {+ element.removeAttribute('readonly');+ }
+
+ selectedText = element.value;
+ }
+ else {+ if (element.hasAttribute('contenteditable')) {+ element.focus();
+ }
+
+ var selection = window.getSelection();
+ var range = document.createRange();
+
+ range.selectNodeContents(element);
+ selection.removeAllRanges();
+ selection.addRange(range);
+
+ selectedText = selection.toString();
+ }
+
+ return selectedText;
+}
+
+module.exports = select;
+
+},{}],6:[function(require,module,exports){+function E () {+ // Keep this empty so it's easier to inherit from
+ // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
+}
+
+E.prototype = {+ on: function (name, callback, ctx) {+ var e = this.e || (this.e = {});+
+ (e[name] || (e[name] = [])).push({+ fn: callback,
+ ctx: ctx
+ });
+
+ return this;
+ },
+
+ once: function (name, callback, ctx) {+ var self = this;
+ function listener () {+ self.off(name, listener);
+ callback.apply(ctx, arguments);
+ };
+
+ listener._ = callback
+ return this.on(name, listener, ctx);
+ },
+
+ emit: function (name) {+ var data = [].slice.call(arguments, 1);
+ var evtArr = ((this.e || (this.e = {}))[name] || []).slice();+ var i = 0;
+ var len = evtArr.length;
+
+ for (i; i < len; i++) {+ evtArr[i].fn.apply(evtArr[i].ctx, data);
+ }
+
+ return this;
+ },
+
+ off: function (name, callback) {+ var e = this.e || (this.e = {});+ var evts = e[name];
+ var liveEvents = [];
+
+ if (evts && callback) {+ for (var i = 0, len = evts.length; i < len; i++) {+ if (evts[i].fn !== callback && evts[i].fn._ !== callback)
+ liveEvents.push(evts[i]);
+ }
+ }
+
+ // Remove event from queue to prevent memory leak
+ // Suggested by https://github.com/lazd
+ // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
+
+ (liveEvents.length)
+ ? e[name] = liveEvents
+ : delete e[name];
+
+ return this;
+ }
+};
+
+module.exports = E;
+
+},{}],7:[function(require,module,exports){+(function (global, factory) {+ if (typeof define === "function" && define.amd) {+ define(['module', 'select'], factory);
+ } else if (typeof exports !== "undefined") {+ factory(module, require('select'));+ } else {+ var mod = {+ exports: {}+ };
+ factory(mod, global.select);
+ global.clipboardAction = mod.exports;
+ }
+})(this, function (module, _select) {+ 'use strict';
+
+ var _select2 = _interopRequireDefault(_select);
+
+ function _interopRequireDefault(obj) {+ return obj && obj.__esModule ? obj : {+ default: obj
+ };
+ }
+
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {+ return typeof obj;
+ } : function (obj) {+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+
+ function _classCallCheck(instance, Constructor) {+ if (!(instance instanceof Constructor)) {+ throw new TypeError("Cannot call a class as a function");+ }
+ }
+
+ var _createClass = function () {+ function defineProperties(target, props) {+ for (var i = 0; i < props.length; i++) {+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ return function (Constructor, protoProps, staticProps) {+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ }();
+
+ var ClipboardAction = function () {+ /**
+ * @param {Object} options+ */
+ function ClipboardAction(options) {+ _classCallCheck(this, ClipboardAction);
+
+ this.resolveOptions(options);
+ this.initSelection();
+ }
+
+ /**
+ * Defines base properties passed from constructor.
+ * @param {Object} options+ */
+
+
+ _createClass(ClipboardAction, [{+ key: 'resolveOptions',
+ value: function resolveOptions() {+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};+
+ this.action = options.action;
+ this.container = options.container;
+ this.emitter = options.emitter;
+ this.target = options.target;
+ this.text = options.text;
+ this.trigger = options.trigger;
+
+ this.selectedText = '';
+ }
+ }, {+ key: 'initSelection',
+ value: function initSelection() {+ if (this.text) {+ this.selectFake();
+ } else if (this.target) {+ this.selectTarget();
+ }
+ }
+ }, {+ key: 'selectFake',
+ value: function selectFake() {+ var _this = this;
+
+ var isRTL = document.documentElement.getAttribute('dir') == 'rtl';+
+ this.removeFake();
+
+ this.fakeHandlerCallback = function () {+ return _this.removeFake();
+ };
+ this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;+
+ this.fakeElem = document.createElement('textarea');+ // Prevent zooming on iOS
+ this.fakeElem.style.fontSize = '12pt';
+ // Reset box model
+ this.fakeElem.style.border = '0';
+ this.fakeElem.style.padding = '0';
+ this.fakeElem.style.margin = '0';
+ // Move element out of screen horizontally
+ this.fakeElem.style.position = 'absolute';
+ this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';
+ // Move element to the same position vertically
+ var yPosition = window.pageYOffset || document.documentElement.scrollTop;
+ this.fakeElem.style.top = yPosition + 'px';
+
+ this.fakeElem.setAttribute('readonly', '');+ this.fakeElem.value = this.text;
+
+ this.container.appendChild(this.fakeElem);
+
+ this.selectedText = (0, _select2.default)(this.fakeElem);
+ this.copyText();
+ }
+ }, {+ key: 'removeFake',
+ value: function removeFake() {+ if (this.fakeHandler) {+ this.container.removeEventListener('click', this.fakeHandlerCallback);+ this.fakeHandler = null;
+ this.fakeHandlerCallback = null;
+ }
+
+ if (this.fakeElem) {+ this.container.removeChild(this.fakeElem);
+ this.fakeElem = null;
+ }
+ }
+ }, {+ key: 'selectTarget',
+ value: function selectTarget() {+ this.selectedText = (0, _select2.default)(this.target);
+ this.copyText();
+ }
+ }, {+ key: 'copyText',
+ value: function copyText() {+ var succeeded = void 0;
+
+ try {+ succeeded = document.execCommand(this.action);
+ } catch (err) {+ succeeded = false;
+ }
+
+ this.handleResult(succeeded);
+ }
+ }, {+ key: 'handleResult',
+ value: function handleResult(succeeded) {+ this.emitter.emit(succeeded ? 'success' : 'error', {+ action: this.action,
+ text: this.selectedText,
+ trigger: this.trigger,
+ clearSelection: this.clearSelection.bind(this)
+ });
+ }
+ }, {+ key: 'clearSelection',
+ value: function clearSelection() {+ if (this.trigger) {+ this.trigger.focus();
+ }
+
+ window.getSelection().removeAllRanges();
+ }
+ }, {+ key: 'destroy',
+ value: function destroy() {+ this.removeFake();
+ }
+ }, {+ key: 'action',
+ set: function set() {+ var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';
+
+ this._action = action;
+
+ if (this._action !== 'copy' && this._action !== 'cut') {+ throw new Error('Invalid "action" value, use either "copy" or "cut"');+ }
+ },
+ get: function get() {+ return this._action;
+ }
+ }, {+ key: 'target',
+ set: function set(target) {+ if (target !== undefined) {+ if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {+ if (this.action === 'copy' && target.hasAttribute('disabled')) {+ throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');+ }
+
+ if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {+ throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');+ }
+
+ this._target = target;
+ } else {+ throw new Error('Invalid "target" value, use a valid Element');+ }
+ }
+ },
+ get: function get() {+ return this._target;
+ }
+ }]);
+
+ return ClipboardAction;
+ }();
+
+ module.exports = ClipboardAction;
+});
+
+},{"select":5}],8:[function(require,module,exports){+(function (global, factory) {+ if (typeof define === "function" && define.amd) {+ define(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], factory);
+ } else if (typeof exports !== "undefined") {+ factory(module, require('./clipboard-action'), require('tiny-emitter'), require('good-listener'));+ } else {+ var mod = {+ exports: {}+ };
+ factory(mod, global.clipboardAction, global.tinyEmitter, global.goodListener);
+ global.clipboard = mod.exports;
+ }
+})(this, function (module, _clipboardAction, _tinyEmitter, _goodListener) {+ 'use strict';
+
+ var _clipboardAction2 = _interopRequireDefault(_clipboardAction);
+
+ var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter);
+
+ var _goodListener2 = _interopRequireDefault(_goodListener);
+
+ function _interopRequireDefault(obj) {+ return obj && obj.__esModule ? obj : {+ default: obj
+ };
+ }
+
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {+ return typeof obj;
+ } : function (obj) {+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+
+ function _classCallCheck(instance, Constructor) {+ if (!(instance instanceof Constructor)) {+ throw new TypeError("Cannot call a class as a function");+ }
+ }
+
+ var _createClass = function () {+ function defineProperties(target, props) {+ for (var i = 0; i < props.length; i++) {+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ return function (Constructor, protoProps, staticProps) {+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ }();
+
+ function _possibleConstructorReturn(self, call) {+ if (!self) {+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");+ }
+
+ return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits(subClass, superClass) {+ if (typeof superClass !== "function" && superClass !== null) {+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {+ constructor: {+ value: subClass,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
+ }
+
+ var Clipboard = function (_Emitter) {+ _inherits(Clipboard, _Emitter);
+
+ /**
+ * @param {String|HTMLElement|HTMLCollection|NodeList} trigger+ * @param {Object} options+ */
+ function Clipboard(trigger, options) {+ _classCallCheck(this, Clipboard);
+
+ var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));
+
+ _this.resolveOptions(options);
+ _this.listenClick(trigger);
+ return _this;
+ }
+
+ /**
+ * Defines if attributes would be resolved using internal setter functions
+ * or custom functions that were passed in the constructor.
+ * @param {Object} options+ */
+
+
+ _createClass(Clipboard, [{+ key: 'resolveOptions',
+ value: function resolveOptions() {+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};+
+ this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
+ this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
+ this.text = typeof options.text === 'function' ? options.text : this.defaultText;
+ this.container = _typeof(options.container) === 'object' ? options.container : document.body;
+ }
+ }, {+ key: 'listenClick',
+ value: function listenClick(trigger) {+ var _this2 = this;
+
+ this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) {+ return _this2.onClick(e);
+ });
+ }
+ }, {+ key: 'onClick',
+ value: function onClick(e) {+ var trigger = e.delegateTarget || e.currentTarget;
+
+ if (this.clipboardAction) {+ this.clipboardAction = null;
+ }
+
+ this.clipboardAction = new _clipboardAction2.default({+ action: this.action(trigger),
+ target: this.target(trigger),
+ text: this.text(trigger),
+ container: this.container,
+ trigger: trigger,
+ emitter: this
+ });
+ }
+ }, {+ key: 'defaultAction',
+ value: function defaultAction(trigger) {+ return getAttributeValue('action', trigger);+ }
+ }, {+ key: 'defaultTarget',
+ value: function defaultTarget(trigger) {+ var selector = getAttributeValue('target', trigger);+
+ if (selector) {+ return document.querySelector(selector);
+ }
+ }
+ }, {+ key: 'defaultText',
+ value: function defaultText(trigger) {+ return getAttributeValue('text', trigger);+ }
+ }, {+ key: 'destroy',
+ value: function destroy() {+ this.listener.destroy();
+
+ if (this.clipboardAction) {+ this.clipboardAction.destroy();
+ this.clipboardAction = null;
+ }
+ }
+ }], [{+ key: 'isSupported',
+ value: function isSupported() {+ var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
+
+ var actions = typeof action === 'string' ? [action] : action;
+ var support = !!document.queryCommandSupported;
+
+ actions.forEach(function (action) {+ support = support && !!document.queryCommandSupported(action);
+ });
+
+ return support;
+ }
+ }]);
+
+ return Clipboard;
+ }(_tinyEmitter2.default);
+
+ /**
+ * Helper function to retrieve attribute value.
+ * @param {String} suffix+ * @param {Element} element+ */
+ function getAttributeValue(suffix, element) {+ var attribute = 'data-clipboard-' + suffix;
+
+ if (!element.hasAttribute(attribute)) {+ return;
+ }
+
+ return element.getAttribute(attribute);
+ }
+
+ module.exports = Clipboard;
+});
+
+},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)+});
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {+
+/*! docsearch 2.4.1 | © Algolia | github.com/algolia/docsearch */
+(function webpackUniversalModuleDefinition(root, factory) {+ if(true)
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define([], factory);
+ else if(typeof exports === 'object')
+ exports["docsearch"] = factory();
+ else
+ root["docsearch"] = factory();
+})(this, function() {+return /******/ (function(modules) { // webpackBootstrap+/******/ // The module cache
+/******/ var installedModules = {};+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+/******/
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // identity function for calling harmony imports with the correct context
+/******/ __webpack_require__.i = function(value) { return value; };+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {+/******/ if(!__webpack_require__.o(exports, name)) {+/******/ Object.defineProperty(exports, name, {+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :+/******/ function getModuleExports() { return module; };+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 46);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var DOM = __webpack_require__(1);
+
+function escapeRegExp(str) {+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');+}
+
+module.exports = {+ // those methods are implemented differently
+ // depending on which build it is, using
+ // $... or angular... or Zepto... or require(...)
+ isArray: null,
+ isFunction: null,
+ isObject: null,
+ bind: null,
+ each: null,
+ map: null,
+ mixin: null,
+
+ isMsie: function() {+ // from https://github.com/ded/bowser/blob/master/bowser.js
+ return (/(msie|trident)/i).test(navigator.userAgent) ?
+ navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
+ },
+
+ // http://stackoverflow.com/a/6969486
+ escapeRegExChars: function(str) {+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');+ },
+
+ isNumber: function(obj) { return typeof obj === 'number'; },+
+ toStr: function toStr(s) {+ return s === undefined || s === null ? '' : s + '';
+ },
+
+ cloneDeep: function cloneDeep(obj) {+ var clone = this.mixin({}, obj);+ var self = this;
+ this.each(clone, function(value, key) {+ if (value) {+ if (self.isArray(value)) {+ clone[key] = [].concat(value);
+ } else if (self.isObject(value)) {+ clone[key] = self.cloneDeep(value);
+ }
+ }
+ });
+ return clone;
+ },
+
+ error: function(msg) {+ throw new Error(msg);
+ },
+
+ every: function(obj, test) {+ var result = true;
+ if (!obj) {+ return result;
+ }
+ this.each(obj, function(val, key) {+ result = test.call(null, val, key, obj);
+ if (!result) {+ return false;
+ }
+ });
+ return !!result;
+ },
+
+ any: function(obj, test) {+ var found = false;
+ if (!obj) {+ return found;
+ }
+ this.each(obj, function(val, key) {+ if (test.call(null, val, key, obj)) {+ found = true;
+ return false;
+ }
+ });
+ return found;
+ },
+
+ getUniqueId: (function() {+ var counter = 0;
+ return function() { return counter++; };+ })(),
+
+ templatify: function templatify(obj) {+ if (this.isFunction(obj)) {+ return obj;
+ }
+ var $template = DOM.element(obj);
+ if ($template.prop('tagName') === 'SCRIPT') {+ return function template() { return $template.text(); };+ }
+ return function template() { return String(obj); };+ },
+
+ defer: function(fn) { setTimeout(fn, 0); },+
+ noop: function() {},+
+ formatPrefix: function(prefix, noPrefix) {+ return noPrefix ? '' : prefix + '-';
+ },
+
+ className: function(prefix, clazz, skipDot) {+ return (skipDot ? '' : '.') + prefix + clazz;
+ },
+
+ escapeHighlightedString: function(str, highlightPreTag, highlightPostTag) {+ highlightPreTag = highlightPreTag || '<em>';
+ var pre = document.createElement('div');+ pre.appendChild(document.createTextNode(highlightPreTag));
+
+ highlightPostTag = highlightPostTag || '</em>';
+ var post = document.createElement('div');+ post.appendChild(document.createTextNode(highlightPostTag));
+
+ var div = document.createElement('div');+ div.appendChild(document.createTextNode(str));
+ return div.innerHTML
+ .replace(RegExp(escapeRegExp(pre.innerHTML), 'g'), highlightPreTag)
+ .replace(RegExp(escapeRegExp(post.innerHTML), 'g'), highlightPostTag);
+ }
+};
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+module.exports = {+ element: null
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports) {+
+
+var hasOwn = Object.prototype.hasOwnProperty;
+var toString = Object.prototype.toString;
+
+module.exports = function forEach (obj, fn, ctx) {+ if (toString.call(fn) !== '[object Function]') {+ throw new TypeError('iterator must be a function');+ }
+ var l = obj.length;
+ if (l === +l) {+ for (var i = 0; i < l; i++) {+ fn.call(ctx, obj[i], i, obj);
+ }
+ } else {+ for (var k in obj) {+ if (hasOwn.call(obj, k)) {+ fn.call(ctx, obj[k], k, obj);
+ }
+ }
+ }
+};
+
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+ return this;
+})();
+
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+ // This works if the window reference is available
+ if(typeof window === "object")
+ g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {+
+module.exports = function clone(obj) {+ return JSON.parse(JSON.stringify(obj));
+};
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+// This file hosts our error definitions
+// We use custom error "types" so that we can act on them when we need it
+// e.g.: if error instanceof errors.UnparsableJSON then..
+
+var inherits = __webpack_require__(20);
+
+function AlgoliaSearchError(message, extraProperties) {+ var forEach = __webpack_require__(2);
+
+ var error = this;
+
+ // try to get a stacktrace
+ if (typeof Error.captureStackTrace === 'function') {+ Error.captureStackTrace(this, this.constructor);
+ } else {+ error.stack = (new Error()).stack || 'Cannot get a stacktrace, browser is too old';
+ }
+
+ this.name = 'AlgoliaSearchError';
+ this.message = message || 'Unknown error';
+
+ if (extraProperties) {+ forEach(extraProperties, function addToErrorObject(value, key) {+ error[key] = value;
+ });
+ }
+}
+
+inherits(AlgoliaSearchError, Error);
+
+function createCustomError(name, message) {+ function AlgoliaSearchCustomError() {+ var args = Array.prototype.slice.call(arguments, 0);
+
+ // custom message not set, use default
+ if (typeof args[0] !== 'string') {+ args.unshift(message);
+ }
+
+ AlgoliaSearchError.apply(this, args);
+ this.name = 'AlgoliaSearch' + name + 'Error';
+ }
+
+ inherits(AlgoliaSearchCustomError, AlgoliaSearchError);
+
+ return AlgoliaSearchCustomError;
+}
+
+// late exports to let various fn defs and inherits take place
+module.exports = {+ AlgoliaSearchError: AlgoliaSearchError,
+ UnparsableJSON: createCustomError(
+ 'UnparsableJSON',
+ 'Could not parse the incoming response as JSON, see err.more for details'
+ ),
+ RequestTimeout: createCustomError(
+ 'RequestTimeout',
+ 'Request timedout before getting a response'
+ ),
+ Network: createCustomError(
+ 'Network',
+ 'Network issue, see err.more for details'
+ ),
+ JSONPScriptFail: createCustomError(
+ 'JSONPScriptFail',
+ '<script> was loaded but did not call our provided callback'
+ ),
+ JSONPScriptError: createCustomError(
+ 'JSONPScriptError',
+ '<script> unable to load due to an `error` event on it'
+ ),
+ Unknown: createCustomError(
+ 'Unknown',
+ 'Unknown error occured'
+ )
+};
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {+
+/* WEBPACK VAR INJECTION */(function(process) {+/**
+ * This is the web browser implementation of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+exports = module.exports = __webpack_require__(50);
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = 'undefined' != typeof chrome
+ && 'undefined' != typeof chrome.storage
+ ? chrome.storage.local
+ : localstorage();
+
+/**
+ * Colors.
+ */
+
+exports.colors = [
+ 'lightseagreen',
+ 'forestgreen',
+ 'goldenrod',
+ 'dodgerblue',
+ 'darkorchid',
+ 'crimson'
+];
+
+/**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+
+function useColors() {+ // is webkit? http://stackoverflow.com/a/16459606/376773
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+ return (typeof document !== 'undefined' && 'WebkitAppearance' in document.documentElement.style) ||
+ // is firebug? http://stackoverflow.com/a/398120/376773
+ (window.console && (console.firebug || (console.exception && console.table))) ||
+ // is firefox >= v31?
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+ (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31);
+}
+
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+exports.formatters.j = function(v) {+ try {+ return JSON.stringify(v);
+ } catch (err) {+ return '[UnexpectedJSONParseError]: ' + err.message;
+ }
+};
+
+
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs() {+ var args = arguments;
+ var useColors = this.useColors;
+
+ args[0] = (useColors ? '%c' : '')
+ + this.namespace
+ + (useColors ? ' %c' : ' ')
+ + args[0]
+ + (useColors ? '%c ' : ' ')
+ + '+' + exports.humanize(this.diff);
+
+ if (!useColors) return args;
+
+ var c = 'color: ' + this.color;
+ args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));
+
+ // the final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
+ var index = 0;
+ var lastC = 0;
+ args[0].replace(/%[a-z%]/g, function(match) {+ if ('%%' === match) return;+ index++;
+ if ('%c' === match) {+ // we only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+
+ args.splice(lastC, 0, c);
+ return args;
+}
+
+/**
+ * Invokes `console.log()` when available.
+ * No-op when `console.log` is not a "function".
+ *
+ * @api public
+ */
+
+function log() {+ // this hackery is required for IE8/9, where
+ // the `console.log` function doesn't have 'apply'
+ return 'object' === typeof console
+ && console.log
+ && Function.prototype.apply.call(console.log, console, arguments);
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces+ * @api private
+ */
+
+function save(namespaces) {+ try {+ if (null == namespaces) {+ exports.storage.removeItem('debug');+ } else {+ exports.storage.debug = namespaces;
+ }
+ } catch(e) {}+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes+ * @api private
+ */
+
+function load() {+ var r;
+ try {+ return exports.storage.debug;
+ } catch(e) {}+
+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+ if (typeof process !== 'undefined' && 'env' in process) {+ return __webpack_require__.i({"NODE_ENV":"production"}).DEBUG;+ }
+}
+
+/**
+ * Enable namespaces listed in `localStorage.debug` initially.
+ */
+
+exports.enable(load());
+
+/**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}+ * @api private
+ */
+
+function localstorage(){+ try {+ return window.localStorage;
+ } catch (e) {}+}
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {+
+var foreach = __webpack_require__(2);
+
+module.exports = function map(arr, fn) {+ var newArr = [];
+ foreach(arr, function(item, itemIndex) {+ newArr.push(fn(item, itemIndex, arr));
+ });
+ return newArr;
+};
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var _ = __webpack_require__(0);
+
+var css = {+ wrapper: {+ position: 'relative',
+ display: 'inline-block'
+ },
+ hint: {+ position: 'absolute',
+ top: '0',
+ left: '0',
+ borderColor: 'transparent',
+ boxShadow: 'none',
+ // #741: fix hint opacity issue on iOS
+ opacity: '1'
+ },
+ input: {+ position: 'relative',
+ verticalAlign: 'top',
+ backgroundColor: 'transparent'
+ },
+ inputWithNoHint: {+ position: 'relative',
+ verticalAlign: 'top'
+ },
+ dropdown: {+ position: 'absolute',
+ top: '100%',
+ left: '0',
+ zIndex: '100',
+ display: 'none'
+ },
+ suggestions: {+ display: 'block'
+ },
+ suggestion: {+ whiteSpace: 'nowrap',
+ cursor: 'pointer'
+ },
+ suggestionChild: {+ whiteSpace: 'normal'
+ },
+ ltr: {+ left: '0',
+ right: 'auto'
+ },
+ rtl: {+ left: 'auto',
+ right: '0'
+ },
+ defaultClasses: {+ root: 'algolia-autocomplete',
+ prefix: 'aa',
+ noPrefix: false,
+ dropdownMenu: 'dropdown-menu',
+ input: 'input',
+ hint: 'hint',
+ suggestions: 'suggestions',
+ suggestion: 'suggestion',
+ cursor: 'cursor',
+ dataset: 'dataset',
+ empty: 'empty'
+ },
+ // will be merged with the default ones if appendTo is used
+ appendTo: {+ wrapper: {+ position: 'absolute',
+ zIndex: '100',
+ display: 'none'
+ },
+ input: {},+ inputWithNoHint: {},+ dropdown: {+ display: 'block'
+ }
+ }
+};
+
+// ie specific styling
+if (_.isMsie()) {+ // ie6-8 (and 9?) doesn't fire hover and click events for elements with
+ // transparent backgrounds, for a workaround, use 1x1 transparent gif
+ _.mixin(css.input, {+ backgroundImage: 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)'
+ });
+}
+
+// ie7 and under specific styling
+if (_.isMsie() && _.isMsie() <= 7) {+ // if someone can tell me why this is necessary to align
+ // the hint with the query in ie7, i'll send you $5 - @JakeHarding
+ _.mixin(css.input, {marginTop: '-1px'});+}
+
+module.exports = css;
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var immediate = __webpack_require__(56);
+var splitter = /\s+/;
+
+module.exports = {+ onSync: onSync,
+ onAsync: onAsync,
+ off: off,
+ trigger: trigger
+};
+
+function on(method, types, cb, context) {+ var type;
+
+ if (!cb) {+ return this;
+ }
+
+ types = types.split(splitter);
+ cb = context ? bindContext(cb, context) : cb;
+
+ this._callbacks = this._callbacks || {};+
+ while (type = types.shift()) {+ this._callbacks[type] = this._callbacks[type] || {sync: [], async: []};+ this._callbacks[type][method].push(cb);
+ }
+
+ return this;
+}
+
+function onAsync(types, cb, context) {+ return on.call(this, 'async', types, cb, context);
+}
+
+function onSync(types, cb, context) {+ return on.call(this, 'sync', types, cb, context);
+}
+
+function off(types) {+ var type;
+
+ if (!this._callbacks) {+ return this;
+ }
+
+ types = types.split(splitter);
+
+ while (type = types.shift()) {+ delete this._callbacks[type];
+ }
+
+ return this;
+}
+
+function trigger(types) {+ var type;
+ var callbacks;
+ var args;
+ var syncFlush;
+ var asyncFlush;
+
+ if (!this._callbacks) {+ return this;
+ }
+
+ types = types.split(splitter);
+ args = [].slice.call(arguments, 1);
+
+ while ((type = types.shift()) && (callbacks = this._callbacks[type])) { // eslint-disable-line+ syncFlush = getFlush(callbacks.sync, this, [type].concat(args));
+ asyncFlush = getFlush(callbacks.async, this, [type].concat(args));
+
+ if (syncFlush()) {+ immediate(asyncFlush);
+ }
+ }
+
+ return this;
+}
+
+function getFlush(callbacks, context, args) {+ return flush;
+
+ function flush() {+ var cancelled;
+
+ for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {+ // only cancel if the callback explicitly returns false
+ cancelled = callbacks[i].apply(context, args) === false;
+ }
+
+ return !cancelled;
+ }
+}
+
+function bindContext(fn, context) {+ return fn.bind ?
+ fn.bind(context) :
+ function() { fn.apply(context, [].slice.call(arguments, 0)); };+}
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports) {+
+var toString = {}.toString;+
+module.exports = Array.isArray || function (arr) {+ return toString.call(arr) == '[object Array]';
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports) {+
+// shim for using process in browser
+var process = module.exports = {};+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {+ throw new Error('setTimeout has not been defined');+}
+function defaultClearTimeout () {+ throw new Error('clearTimeout has not been defined');+}
+(function () {+ try {+ if (typeof setTimeout === 'function') {+ cachedSetTimeout = setTimeout;
+ } else {+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {+ if (typeof clearTimeout === 'function') {+ cachedClearTimeout = clearTimeout;
+ } else {+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {+ if (cachedSetTimeout === setTimeout) {+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){+ try {+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {+ if (cachedClearTimeout === clearTimeout) {+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){+ try {+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {+ if (!draining || !currentQueue) {+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {+ queue = currentQueue.concat(queue);
+ } else {+ queueIndex = -1;
+ }
+ if (queue.length) {+ drainQueue();
+ }
+}
+
+function drainQueue() {+ if (draining) {+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {+ if (currentQueue) {+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {+ for (var i = 1; i < arguments.length; i++) {+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};+
+function noop() {}+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+
+process.binding = function (name) {+ throw new Error('process.binding is not supported');+};
+
+process.cwd = function () { return '/' };+process.chdir = function (dir) {+ throw new Error('process.chdir is not supported');+};
+process.umask = function() { return 0; };+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {+
+module.exports = buildSearchMethod;
+
+var errors = __webpack_require__(5);
+
+/**
+ * Creates a search method to be used in clients
+ * @param {string} queryParam the name of the attribute used for the query+ * @param {string} url the url+ * @return {function} the search method+ */
+function buildSearchMethod(queryParam, url) {+ /**
+ * The search method. Prepares the data and send the query to Algolia.
+ * @param {string} query the string used for query search+ * @param {object} args additional parameters to send with the search+ * @param {function} [callback] the callback to be called with the client gets the answer+ * @return {undefined|Promise} If the callback is not provided then this methods returns a Promise+ */
+ return function search(query, args, callback) {+ // warn V2 users on how to search
+ if (typeof query === 'function' && typeof args === 'object' ||
+ typeof callback === 'object') {+ // .search(query, params, cb)
+ // .search(cb, params)
+ throw new errors.AlgoliaSearchError('index.search usage is index.search(query, params, cb)');+ }
+
+ // Normalizing the function signature
+ if (arguments.length === 0 || typeof query === 'function') {+ // Usage : .search(), .search(cb)
+ callback = query;
+ query = '';
+ } else if (arguments.length === 1 || typeof args === 'function') {+ // Usage : .search(query/args), .search(query, cb)
+ callback = args;
+ args = undefined;
+ }
+ // At this point we have 3 arguments with values
+
+ // Usage : .search(args) // careful: typeof null === 'object'
+ if (typeof query === 'object' && query !== null) {+ args = query;
+ query = undefined;
+ } else if (query === undefined || query === null) { // .search(undefined/null)+ query = '';
+ }
+
+ var params = '';
+
+ if (query !== undefined) {+ params += queryParam + '=' + encodeURIComponent(query);
+ }
+
+ var additionalUA;
+ if (args !== undefined) {+ if (args.additionalUA) {+ additionalUA = args.additionalUA;
+ delete args.additionalUA;
+ }
+ // `_getSearchParams` will augment params, do not be fooled by the = versus += from previous if
+ params = this.as._getSearchParams(args, params);
+ }
+
+
+ return this._search(params, url, callback, additionalUA);
+ };
+}
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var namespace = 'autocomplete:';
+
+var _ = __webpack_require__(0);
+var DOM = __webpack_require__(1);
+
+// constructor
+// -----------
+
+function EventBus(o) {+ if (!o || !o.el) {+ _.error('EventBus initialized without el');+ }
+
+ this.$el = DOM.element(o.el);
+}
+
+// instance methods
+// ----------------
+
+_.mixin(EventBus.prototype, {+
+ // ### public
+
+ trigger: function(type) {+ var args = [].slice.call(arguments, 1);
+
+ var event = _.Event(namespace + type);
+ this.$el.trigger(event, args);
+ return event;
+ }
+});
+
+module.exports = EventBus;
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+module.exports = {+ wrapper: '<span class="%ROOT%"></span>',
+ dropdown: '<span class="%PREFIX%%DROPDOWN_MENU%"></span>',
+ dataset: '<div class="%PREFIX%%DATASET%-%CLASS%"></div>',
+ suggestions: '<span class="%PREFIX%%SUGGESTIONS%"></span>',
+ suggestion: '<div class="%PREFIX%%SUGGESTION%"></div>'
+};
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+module.exports = function parseAlgoliaClientVersion(agent) {+ var parsed = agent.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);
+ if (parsed) return [parsed[1], parsed[2], parsed[3]];
+ return undefined;
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports) {+
+module.exports = "0.28.0";
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports) {+
+/* istanbul ignore next */
+/* Zepto v1.2.0 - zepto event assets data - zeptojs.com/license */
+(function(global, factory) {+ module.exports = factory(global);
+}(/* this ##### UPDATED: here we want to use window/global instead of this which is the current file context ##### */ window, function(window) { + var Zepto = (function() {+ var undefined, key, $, classList, emptyArray = [], concat = emptyArray.concat, filter = emptyArray.filter, slice = emptyArray.slice,
+ document = window.document,
+ elementDisplay = {}, classCache = {},+ cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 },+ fragmentRE = /^\s*<(\w+|!)[^>]*>/,
+ singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+ tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+ rootNodeRE = /^(?:body|html)$/i,
+ capitalRE = /([A-Z])/g,
+
+ // special attributes that should be get/set via method calls
+ methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],
+
+ adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ],
+ table = document.createElement('table'),+ tableRow = document.createElement('tr'),+ containers = {+ 'tr': document.createElement('tbody'),+ 'tbody': table, 'thead': table, 'tfoot': table,
+ 'td': tableRow, 'th': tableRow,
+ '*': document.createElement('div')+ },
+ readyRE = /complete|loaded|interactive/,
+ simpleSelectorRE = /^[\w-]*$/,
+ class2type = {},+ toString = class2type.toString,
+ zepto = {},+ camelize, uniq,
+ tempParent = document.createElement('div'),+ propMap = {+ 'tabindex': 'tabIndex',
+ 'readonly': 'readOnly',
+ 'for': 'htmlFor',
+ 'class': 'className',
+ 'maxlength': 'maxLength',
+ 'cellspacing': 'cellSpacing',
+ 'cellpadding': 'cellPadding',
+ 'rowspan': 'rowSpan',
+ 'colspan': 'colSpan',
+ 'usemap': 'useMap',
+ 'frameborder': 'frameBorder',
+ 'contenteditable': 'contentEditable'
+ },
+ isArray = Array.isArray ||
+ function(object){ return object instanceof Array }+
+ zepto.matches = function(element, selector) {+ if (!selector || !element || element.nodeType !== 1) return false
+ var matchesSelector = element.matches || element.webkitMatchesSelector ||
+ element.mozMatchesSelector || element.oMatchesSelector ||
+ element.matchesSelector
+ if (matchesSelector) return matchesSelector.call(element, selector)
+ // fall back to performing a selector:
+ var match, parent = element.parentNode, temp = !parent
+ if (temp) (parent = tempParent).appendChild(element)
+ match = ~zepto.qsa(parent, selector).indexOf(element)
+ temp && tempParent.removeChild(element)
+ return match
+ }
+
+ function type(obj) {+ return obj == null ? String(obj) :
+ class2type[toString.call(obj)] || "object"
+ }
+
+ function isFunction(value) { return type(value) == "function" }+ function isWindow(obj) { return obj != null && obj == obj.window }+ function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }+ function isObject(obj) { return type(obj) == "object" }+ function isPlainObject(obj) {+ return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype
+ }
+
+ function likeArray(obj) {+ var length = !!obj && 'length' in obj && obj.length,
+ type = $.type(obj)
+
+ return 'function' != type && !isWindow(obj) && (
+ 'array' == type || length === 0 ||
+ (typeof length == 'number' && length > 0 && (length - 1) in obj)
+ )
+ }
+
+ function compact(array) { return filter.call(array, function(item){ return item != null }) }+ function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array }+ camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) }+ function dasherize(str) {+ return str.replace(/::/g, '/')
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
+ .replace(/([a-z\d])([A-Z])/g, '$1_$2')
+ .replace(/_/g, '-')
+ .toLowerCase()
+ }
+ uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) }+
+ function classRE(name) {+ return name in classCache ?
+ classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)'))+ }
+
+ function maybeAddPx(name, value) {+ return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value
+ }
+
+ function defaultDisplay(nodeName) {+ var element, display
+ if (!elementDisplay[nodeName]) {+ element = document.createElement(nodeName)
+ document.body.appendChild(element)
+ display = getComputedStyle(element, '').getPropertyValue("display")+ element.parentNode.removeChild(element)
+ display == "none" && (display = "block")
+ elementDisplay[nodeName] = display
+ }
+ return elementDisplay[nodeName]
+ }
+
+ function children(element) {+ return 'children' in element ?
+ slice.call(element.children) :
+ $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node })+ }
+
+ function Z(dom, selector) {+ var i, len = dom ? dom.length : 0
+ for (i = 0; i < len; i++) this[i] = dom[i]
+ this.length = len
+ this.selector = selector || ''
+ }
+
+ // `$.zepto.fragment` takes a html string and an optional tag name
+ // to generate DOM nodes from the given html string.
+ // The generated DOM nodes are returned as an array.
+ // This function can be overridden in plugins for example to make
+ // it compatible with browsers that don't support the DOM fully.
+ zepto.fragment = function(html, name, properties) {+ var dom, nodes, container
+
+ // A special case optimization for a single tag
+ if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))
+
+ if (!dom) {+ if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>")
+ if (name === undefined) name = fragmentRE.test(html) && RegExp.$1
+ if (!(name in containers)) name = '*'
+
+ container = containers[name]
+ container.innerHTML = '' + html
+ dom = $.each(slice.call(container.childNodes), function(){+ container.removeChild(this)
+ })
+ }
+
+ if (isPlainObject(properties)) {+ nodes = $(dom)
+ $.each(properties, function(key, value) {+ if (methodAttributes.indexOf(key) > -1) nodes[key](value)
+ else nodes.attr(key, value)
+ })
+ }
+
+ return dom
+ }
+
+ // `$.zepto.Z` swaps out the prototype of the given `dom` array
+ // of nodes with `$.fn` and thus supplying all the Zepto functions
+ // to the array. This method can be overridden in plugins.
+ zepto.Z = function(dom, selector) {+ return new Z(dom, selector)
+ }
+
+ // `$.zepto.isZ` should return `true` if the given object is a Zepto
+ // collection. This method can be overridden in plugins.
+ zepto.isZ = function(object) {+ return object instanceof zepto.Z
+ }
+
+ // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and
+ // takes a CSS selector and an optional context (and handles various
+ // special cases).
+ // This method can be overridden in plugins.
+ zepto.init = function(selector, context) {+ var dom
+ // If nothing given, return an empty Zepto collection
+ if (!selector) return zepto.Z()
+ // Optimize for string selectors
+ else if (typeof selector == 'string') {+ selector = selector.trim()
+ // If it's a html fragment, create nodes from it
+ // Note: In both Chrome 21 and Firefox 15, DOM error 12
+ // is thrown if the fragment doesn't begin with <
+ if (selector[0] == '<' && fragmentRE.test(selector))
+ dom = zepto.fragment(selector, RegExp.$1, context), selector = null
+ // If there's a context, create a collection on that context first, and select
+ // nodes from there
+ else if (context !== undefined) return $(context).find(selector)
+ // If it's a CSS selector, use it to select nodes.
+ else dom = zepto.qsa(document, selector)
+ }
+ // If a function is given, call it when the DOM is ready
+ else if (isFunction(selector)) return $(document).ready(selector)
+ // If a Zepto collection is given, just return it
+ else if (zepto.isZ(selector)) return selector
+ else {+ // normalize array if an array of nodes is given
+ if (isArray(selector)) dom = compact(selector)
+ // Wrap DOM nodes.
+ else if (isObject(selector))
+ dom = [selector], selector = null
+ // If it's a html fragment, create nodes from it
+ else if (fragmentRE.test(selector))
+ dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null
+ // If there's a context, create a collection on that context first, and select
+ // nodes from there
+ else if (context !== undefined) return $(context).find(selector)
+ // And last but no least, if it's a CSS selector, use it to select nodes.
+ else dom = zepto.qsa(document, selector)
+ }
+ // create a new Zepto collection from the nodes found
+ return zepto.Z(dom, selector)
+ }
+
+ // `$` will be the base `Zepto` object. When calling this
+ // function just call `$.zepto.init, which makes the implementation
+ // details of selecting nodes and creating Zepto collections
+ // patchable in plugins.
+ $ = function(selector, context){+ return zepto.init(selector, context)
+ }
+
+ function extend(target, source, deep) {+ for (key in source)
+ if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {+ if (isPlainObject(source[key]) && !isPlainObject(target[key]))
+ target[key] = {}+ if (isArray(source[key]) && !isArray(target[key]))
+ target[key] = []
+ extend(target[key], source[key], deep)
+ }
+ else if (source[key] !== undefined) target[key] = source[key]
+ }
+
+ // Copy all but undefined properties from one or more
+ // objects to the `target` object.
+ $.extend = function(target){+ var deep, args = slice.call(arguments, 1)
+ if (typeof target == 'boolean') {+ deep = target
+ target = args.shift()
+ }
+ args.forEach(function(arg){ extend(target, arg, deep) })+ return target
+ }
+
+ // `$.zepto.qsa` is Zepto's CSS selector implementation which
+ // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.
+ // This method can be overridden in plugins.
+ zepto.qsa = function(element, selector){+ var found,
+ maybeID = selector[0] == '#',
+ maybeClass = !maybeID && selector[0] == '.',
+ nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked
+ isSimple = simpleSelectorRE.test(nameOnly)
+ return (element.getElementById && isSimple && maybeID) ? // Safari DocumentFragment doesn't have getElementById
+ ( (found = element.getElementById(nameOnly)) ? [found] : [] ) :
+ (element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] :
+ slice.call(
+ isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName
+ maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class
+ element.getElementsByTagName(selector) : // Or a tag
+ element.querySelectorAll(selector) // Or it's not simple, and we need to query all
+ )
+ }
+
+ function filtered(nodes, selector) {+ return selector == null ? $(nodes) : $(nodes).filter(selector)
+ }
+
+ $.contains = document.documentElement.contains ?
+ function(parent, node) {+ return parent !== node && parent.contains(node)
+ } :
+ function(parent, node) {+ while (node && (node = node.parentNode))
+ if (node === parent) return true
+ return false
+ }
+
+ function funcArg(context, arg, idx, payload) {+ return isFunction(arg) ? arg.call(context, idx, payload) : arg
+ }
+
+ function setAttribute(node, name, value) {+ value == null ? node.removeAttribute(name) : node.setAttribute(name, value)
+ }
+
+ // access className property while respecting SVGAnimatedString
+ function className(node, value){+ var klass = node.className || '',
+ svg = klass && klass.baseVal !== undefined
+
+ if (value === undefined) return svg ? klass.baseVal : klass
+ svg ? (klass.baseVal = value) : (node.className = value)
+ }
+
+ // "true" => true
+ // "false" => false
+ // "null" => null
+ // "42" => 42
+ // "42.5" => 42.5
+ // "08" => "08"
+ // JSON => parse if valid
+ // String => self
+ function deserializeValue(value) {+ try {+ return value ?
+ value == "true" ||
+ ( value == "false" ? false :
+ value == "null" ? null :
+ +value + "" == value ? +value :
+ /^[\[\{]/.test(value) ? $.parseJSON(value) :+ value )
+ : value
+ } catch(e) {+ return value
+ }
+ }
+
+ $.type = type
+ $.isFunction = isFunction
+ $.isWindow = isWindow
+ $.isArray = isArray
+ $.isPlainObject = isPlainObject
+
+ $.isEmptyObject = function(obj) {+ var name
+ for (name in obj) return false
+ return true
+ }
+
+ $.isNumeric = function(val) {+ var num = Number(val), type = typeof val
+ return val != null && type != 'boolean' &&
+ (type != 'string' || val.length) &&
+ !isNaN(num) && isFinite(num) || false
+ }
+
+ $.inArray = function(elem, array, i){+ return emptyArray.indexOf.call(array, elem, i)
+ }
+
+ $.camelCase = camelize
+ $.trim = function(str) {+ return str == null ? "" : String.prototype.trim.call(str)
+ }
+
+ // plugin compatibility
+ $.uuid = 0
+ $.support = { }+ $.expr = { }+ $.noop = function() {}+
+ $.map = function(elements, callback){+ var value, values = [], i, key
+ if (likeArray(elements))
+ for (i = 0; i < elements.length; i++) {+ value = callback(elements[i], i)
+ if (value != null) values.push(value)
+ }
+ else
+ for (key in elements) {+ value = callback(elements[key], key)
+ if (value != null) values.push(value)
+ }
+ return flatten(values)
+ }
+
+ $.each = function(elements, callback){+ var i, key
+ if (likeArray(elements)) {+ for (i = 0; i < elements.length; i++)
+ if (callback.call(elements[i], i, elements[i]) === false) return elements
+ } else {+ for (key in elements)
+ if (callback.call(elements[key], key, elements[key]) === false) return elements
+ }
+
+ return elements
+ }
+
+ $.grep = function(elements, callback){+ return filter.call(elements, callback)
+ }
+
+ if (window.JSON) $.parseJSON = JSON.parse
+
+ // Populate the class2type map
+ $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {+ class2type[ "[object " + name + "]" ] = name.toLowerCase()
+ })
+
+ // Define methods that will be available on all
+ // Zepto collections
+ $.fn = {+ constructor: zepto.Z,
+ length: 0,
+
+ // Because a collection acts like an array
+ // copy over these useful array functions.
+ forEach: emptyArray.forEach,
+ reduce: emptyArray.reduce,
+ push: emptyArray.push,
+ sort: emptyArray.sort,
+ splice: emptyArray.splice,
+ indexOf: emptyArray.indexOf,
+ concat: function(){+ var i, value, args = []
+ for (i = 0; i < arguments.length; i++) {+ value = arguments[i]
+ args[i] = zepto.isZ(value) ? value.toArray() : value
+ }
+ return concat.apply(zepto.isZ(this) ? this.toArray() : this, args)
+ },
+
+ // `map` and `slice` in the jQuery API work differently
+ // from their array counterparts
+ map: function(fn){+ return $($.map(this, function(el, i){ return fn.call(el, i, el) }))+ },
+ slice: function(){+ return $(slice.apply(this, arguments))
+ },
+
+ ready: function(callback){+ // need to check if document.body exists for IE as that browser reports
+ // document ready when it hasn't yet created the body element
+ if (readyRE.test(document.readyState) && document.body) callback($)
+ else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false)+ return this
+ },
+ get: function(idx){+ return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length]
+ },
+ toArray: function(){ return this.get() },+ size: function(){+ return this.length
+ },
+ remove: function(){+ return this.each(function(){+ if (this.parentNode != null)
+ this.parentNode.removeChild(this)
+ })
+ },
+ each: function(callback){+ emptyArray.every.call(this, function(el, idx){+ return callback.call(el, idx, el) !== false
+ })
+ return this
+ },
+ filter: function(selector){+ if (isFunction(selector)) return this.not(this.not(selector))
+ return $(filter.call(this, function(element){+ return zepto.matches(element, selector)
+ }))
+ },
+ add: function(selector,context){+ return $(uniq(this.concat($(selector,context))))
+ },
+ is: function(selector){+ return this.length > 0 && zepto.matches(this[0], selector)
+ },
+ not: function(selector){+ var nodes=[]
+ if (isFunction(selector) && selector.call !== undefined)
+ this.each(function(idx){+ if (!selector.call(this,idx)) nodes.push(this)
+ })
+ else {+ var excludes = typeof selector == 'string' ? this.filter(selector) :
+ (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)
+ this.forEach(function(el){+ if (excludes.indexOf(el) < 0) nodes.push(el)
+ })
+ }
+ return $(nodes)
+ },
+ has: function(selector){+ return this.filter(function(){+ return isObject(selector) ?
+ $.contains(this, selector) :
+ $(this).find(selector).size()
+ })
+ },
+ eq: function(idx){+ return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1)
+ },
+ first: function(){+ var el = this[0]
+ return el && !isObject(el) ? el : $(el)
+ },
+ last: function(){+ var el = this[this.length - 1]
+ return el && !isObject(el) ? el : $(el)
+ },
+ find: function(selector){+ var result, $this = this
+ if (!selector) result = $()
+ else if (typeof selector == 'object')
+ result = $(selector).filter(function(){+ var node = this
+ return emptyArray.some.call($this, function(parent){+ return $.contains(parent, node)
+ })
+ })
+ else if (this.length == 1) result = $(zepto.qsa(this[0], selector))
+ else result = this.map(function(){ return zepto.qsa(this, selector) })+ return result
+ },
+ closest: function(selector, context){+ var nodes = [], collection = typeof selector == 'object' && $(selector)
+ this.each(function(_, node){+ while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))
+ node = node !== context && !isDocument(node) && node.parentNode
+ if (node && nodes.indexOf(node) < 0) nodes.push(node)
+ })
+ return $(nodes)
+ },
+ parents: function(selector){+ var ancestors = [], nodes = this
+ while (nodes.length > 0)
+ nodes = $.map(nodes, function(node){+ if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {+ ancestors.push(node)
+ return node
+ }
+ })
+ return filtered(ancestors, selector)
+ },
+ parent: function(selector){+ return filtered(uniq(this.pluck('parentNode')), selector)+ },
+ children: function(selector){+ return filtered(this.map(function(){ return children(this) }), selector)+ },
+ contents: function() {+ return this.map(function() { return this.contentDocument || slice.call(this.childNodes) })+ },
+ siblings: function(selector){+ return filtered(this.map(function(i, el){+ return filter.call(children(el.parentNode), function(child){ return child!==el })+ }), selector)
+ },
+ empty: function(){+ return this.each(function(){ this.innerHTML = '' })+ },
+ // `pluck` is borrowed from Prototype.js
+ pluck: function(property){+ return $.map(this, function(el){ return el[property] })+ },
+ show: function(){+ return this.each(function(){+ this.style.display == "none" && (this.style.display = '')
+ if (getComputedStyle(this, '').getPropertyValue("display") == "none")+ this.style.display = defaultDisplay(this.nodeName)
+ })
+ },
+ replaceWith: function(newContent){+ return this.before(newContent).remove()
+ },
+ wrap: function(structure){+ var func = isFunction(structure)
+ if (this[0] && !func)
+ var dom = $(structure).get(0),
+ clone = dom.parentNode || this.length > 1
+
+ return this.each(function(index){+ $(this).wrapAll(
+ func ? structure.call(this, index) :
+ clone ? dom.cloneNode(true) : dom
+ )
+ })
+ },
+ wrapAll: function(structure){+ if (this[0]) {+ $(this[0]).before(structure = $(structure))
+ var children
+ // drill down to the inmost element
+ while ((children = structure.children()).length) structure = children.first()
+ $(structure).append(this)
+ }
+ return this
+ },
+ wrapInner: function(structure){+ var func = isFunction(structure)
+ return this.each(function(index){+ var self = $(this), contents = self.contents(),
+ dom = func ? structure.call(this, index) : structure
+ contents.length ? contents.wrapAll(dom) : self.append(dom)
+ })
+ },
+ unwrap: function(){+ this.parent().each(function(){+ $(this).replaceWith($(this).children())
+ })
+ return this
+ },
+ clone: function(){+ return this.map(function(){ return this.cloneNode(true) })+ },
+ hide: function(){+ return this.css("display", "none")+ },
+ toggle: function(setting){+ return this.each(function(){+ var el = $(this)
+ ;(setting === undefined ? el.css("display") == "none" : setting) ? el.show() : el.hide()+ })
+ },
+ prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') },+ next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') },+ html: function(html){+ return 0 in arguments ?
+ this.each(function(idx){+ var originHtml = this.innerHTML
+ $(this).empty().append( funcArg(this, html, idx, originHtml) )
+ }) :
+ (0 in this ? this[0].innerHTML : null)
+ },
+ text: function(text){+ return 0 in arguments ?
+ this.each(function(idx){+ var newText = funcArg(this, text, idx, this.textContent)
+ this.textContent = newText == null ? '' : ''+newText
+ }) :
+ (0 in this ? this.pluck('textContent').join("") : null)+ },
+ attr: function(name, value){+ var result
+ return (typeof name == 'string' && !(1 in arguments)) ?
+ (0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) :
+ this.each(function(idx){+ if (this.nodeType !== 1) return
+ if (isObject(name)) for (key in name) setAttribute(this, key, name[key])
+ else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))
+ })
+ },
+ removeAttr: function(name){+ return this.each(function(){ this.nodeType === 1 && name.split(' ').forEach(function(attribute){+ setAttribute(this, attribute)
+ }, this)})
+ },
+ prop: function(name, value){+ name = propMap[name] || name
+ return (1 in arguments) ?
+ this.each(function(idx){+ this[name] = funcArg(this, value, idx, this[name])
+ }) :
+ (this[0] && this[0][name])
+ },
+ removeProp: function(name){+ name = propMap[name] || name
+ return this.each(function(){ delete this[name] })+ },
+ data: function(name, value){+ var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase()
+
+ var data = (1 in arguments) ?
+ this.attr(attrName, value) :
+ this.attr(attrName)
+
+ return data !== null ? deserializeValue(data) : undefined
+ },
+ val: function(value){+ if (0 in arguments) {+ if (value == null) value = ""
+ return this.each(function(idx){+ this.value = funcArg(this, value, idx, this.value)
+ })
+ } else {+ return this[0] && (this[0].multiple ?
+ $(this[0]).find('option').filter(function(){ return this.selected }).pluck('value') :+ this[0].value)
+ }
+ },
+ offset: function(coordinates){+ if (coordinates) return this.each(function(index){+ var $this = $(this),
+ coords = funcArg(this, coordinates, index, $this.offset()),
+ parentOffset = $this.offsetParent().offset(),
+ props = {+ top: coords.top - parentOffset.top,
+ left: coords.left - parentOffset.left
+ }
+
+ if ($this.css('position') == 'static') props['position'] = 'relative'+ $this.css(props)
+ })
+ if (!this.length) return null
+ if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0]))
+ return {top: 0, left: 0}+ var obj = this[0].getBoundingClientRect()
+ return {+ left: obj.left + window.pageXOffset,
+ top: obj.top + window.pageYOffset,
+ width: Math.round(obj.width),
+ height: Math.round(obj.height)
+ }
+ },
+ css: function(property, value){+ if (arguments.length < 2) {+ var element = this[0]
+ if (typeof property == 'string') {+ if (!element) return
+ return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property)
+ } else if (isArray(property)) {+ if (!element) return
+ var props = {}+ var computedStyle = getComputedStyle(element, '')
+ $.each(property, function(_, prop){+ props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop))
+ })
+ return props
+ }
+ }
+
+ var css = ''
+ if (type(property) == 'string') {+ if (!value && value !== 0)
+ this.each(function(){ this.style.removeProperty(dasherize(property)) })+ else
+ css = dasherize(property) + ":" + maybeAddPx(property, value)
+ } else {+ for (key in property)
+ if (!property[key] && property[key] !== 0)
+ this.each(function(){ this.style.removeProperty(dasherize(key)) })+ else
+ css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'
+ }
+
+ return this.each(function(){ this.style.cssText += ';' + css })+ },
+ index: function(element){+ return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0])
+ },
+ hasClass: function(name){+ if (!name) return false
+ return emptyArray.some.call(this, function(el){+ return this.test(className(el))
+ }, classRE(name))
+ },
+ addClass: function(name){+ if (!name) return this
+ return this.each(function(idx){+ if (!('className' in this)) return+ classList = []
+ var cls = className(this), newName = funcArg(this, name, idx, cls)
+ newName.split(/\s+/g).forEach(function(klass){+ if (!$(this).hasClass(klass)) classList.push(klass)
+ }, this)
+ classList.length && className(this, cls + (cls ? " " : "") + classList.join(" "))+ })
+ },
+ removeClass: function(name){+ return this.each(function(idx){+ if (!('className' in this)) return+ if (name === undefined) return className(this, '')
+ classList = className(this)
+ funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass){+ classList = classList.replace(classRE(klass), " ")
+ })
+ className(this, classList.trim())
+ })
+ },
+ toggleClass: function(name, when){+ if (!name) return this
+ return this.each(function(idx){+ var $this = $(this), names = funcArg(this, name, idx, className(this))
+ names.split(/\s+/g).forEach(function(klass){+ (when === undefined ? !$this.hasClass(klass) : when) ?
+ $this.addClass(klass) : $this.removeClass(klass)
+ })
+ })
+ },
+ scrollTop: function(value){+ if (!this.length) return
+ var hasScrollTop = 'scrollTop' in this[0]
+ if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset
+ return this.each(hasScrollTop ?
+ function(){ this.scrollTop = value } :+ function(){ this.scrollTo(this.scrollX, value) })+ },
+ scrollLeft: function(value){+ if (!this.length) return
+ var hasScrollLeft = 'scrollLeft' in this[0]
+ if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset
+ return this.each(hasScrollLeft ?
+ function(){ this.scrollLeft = value } :+ function(){ this.scrollTo(value, this.scrollY) })+ },
+ position: function() {+ if (!this.length) return
+
+ var elem = this[0],
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent(),
+ // Get correct offsets
+ offset = this.offset(),
+ parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset()+
+ // Subtract element margins
+ // note: when an element has margin: auto the offsetLeft and marginLeft
+ // are the same in Safari causing offset.left to incorrectly be 0
+ offset.top -= parseFloat( $(elem).css('margin-top') ) || 0+ offset.left -= parseFloat( $(elem).css('margin-left') ) || 0+
+ // Add offsetParent borders
+ parentOffset.top += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0+ parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0+
+ // Subtract the two offsets
+ return {+ top: offset.top - parentOffset.top,
+ left: offset.left - parentOffset.left
+ }
+ },
+ offsetParent: function() {+ return this.map(function(){+ var parent = this.offsetParent || document.body
+ while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css("position") == "static")+ parent = parent.offsetParent
+ return parent
+ })
+ }
+ }
+
+ // for now
+ $.fn.detach = $.fn.remove
+
+ // Generate the `width` and `height` functions
+ ;['width', 'height'].forEach(function(dimension){+ var dimensionProperty =
+ dimension.replace(/./, function(m){ return m[0].toUpperCase() })+
+ $.fn[dimension] = function(value){+ var offset, el = this[0]
+ if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] :
+ isDocument(el) ? el.documentElement['scroll' + dimensionProperty] :
+ (offset = this.offset()) && offset[dimension]
+ else return this.each(function(idx){+ el = $(this)
+ el.css(dimension, funcArg(this, value, idx, el[dimension]()))
+ })
+ }
+ })
+
+ function traverseNode(node, fun) {+ fun(node)
+ for (var i = 0, len = node.childNodes.length; i < len; i++)
+ traverseNode(node.childNodes[i], fun)
+ }
+
+ // Generate the `after`, `prepend`, `before`, `append`,
+ // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.
+ adjacencyOperators.forEach(function(operator, operatorIndex) {+ var inside = operatorIndex % 2 //=> prepend, append
+
+ $.fn[operator] = function(){+ // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings
+ var argType, nodes = $.map(arguments, function(arg) {+ var arr = []
+ argType = type(arg)
+ if (argType == "array") {+ arg.forEach(function(el) {+ if (el.nodeType !== undefined) return arr.push(el)
+ else if ($.zepto.isZ(el)) return arr = arr.concat(el.get())
+ arr = arr.concat(zepto.fragment(el))
+ })
+ return arr
+ }
+ return argType == "object" || arg == null ?
+ arg : zepto.fragment(arg)
+ }),
+ parent, copyByClone = this.length > 1
+ if (nodes.length < 1) return this
+
+ return this.each(function(_, target){+ parent = inside ? target : target.parentNode
+
+ // convert all methods to a "before" operation
+ target = operatorIndex == 0 ? target.nextSibling :
+ operatorIndex == 1 ? target.firstChild :
+ operatorIndex == 2 ? target :
+ null
+
+ var parentInDocument = $.contains(document.documentElement, parent)
+
+ nodes.forEach(function(node){+ if (copyByClone) node = node.cloneNode(true)
+ else if (!parent) return $(node).remove()
+
+ parent.insertBefore(node, target)
+ if (parentInDocument) traverseNode(node, function(el){+ if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' &&
+ (!el.type || el.type === 'text/javascript') && !el.src){+ var target = el.ownerDocument ? el.ownerDocument.defaultView : window
+ target['eval'].call(target, el.innerHTML)
+ }
+ })
+ })
+ })
+ }
+
+ // after => insertAfter
+ // prepend => prependTo
+ // before => insertBefore
+ // append => appendTo
+ $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){+ $(html)[operator](this)
+ return this
+ }
+ })
+
+ zepto.Z.prototype = Z.prototype = $.fn
+
+ // Export internal API functions in the `$.zepto` namespace
+ zepto.uniq = uniq
+ zepto.deserializeValue = deserializeValue
+ $.zepto = zepto
+
+ return $
+})()
+
+;(function($){+ var _zid = 1, undefined,
+ slice = Array.prototype.slice,
+ isFunction = $.isFunction,
+ isString = function(obj){ return typeof obj == 'string' },+ handlers = {},+ specialEvents={},+ focusinSupported = 'onfocusin' in window,
+ focus = { focus: 'focusin', blur: 'focusout' },+ hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' }+
+ specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'
+
+ function zid(element) {+ return element._zid || (element._zid = _zid++)
+ }
+ function findHandlers(element, event, fn, selector) {+ event = parse(event)
+ if (event.ns) var matcher = matcherFor(event.ns)
+ return (handlers[zid(element)] || []).filter(function(handler) {+ return handler
+ && (!event.e || handler.e == event.e)
+ && (!event.ns || matcher.test(handler.ns))
+ && (!fn || zid(handler.fn) === zid(fn))
+ && (!selector || handler.sel == selector)
+ })
+ }
+ function parse(event) {+ var parts = ('' + event).split('.')+ return {e: parts[0], ns: parts.slice(1).sort().join(' ')}+ }
+ function matcherFor(ns) {+ return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)')+ }
+
+ function eventCapture(handler, captureSetting) {+ return handler.del &&
+ (!focusinSupported && (handler.e in focus)) ||
+ !!captureSetting
+ }
+
+ function realEvent(type) {+ return hover[type] || (focusinSupported && focus[type]) || type
+ }
+
+ function add(element, events, fn, data, selector, delegator, capture){+ var id = zid(element), set = (handlers[id] || (handlers[id] = []))
+ events.split(/\s/).forEach(function(event){+ if (event == 'ready') return $(document).ready(fn)
+ var handler = parse(event)
+ handler.fn = fn
+ handler.sel = selector
+ // emulate mouseenter, mouseleave
+ if (handler.e in hover) fn = function(e){+ var related = e.relatedTarget
+ if (!related || (related !== this && !$.contains(this, related)))
+ return handler.fn.apply(this, arguments)
+ }
+ handler.del = delegator
+ var callback = delegator || fn
+ handler.proxy = function(e){+ e = compatible(e)
+ if (e.isImmediatePropagationStopped()) return
+ e.data = data
+ var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args))
+ if (result === false) e.preventDefault(), e.stopPropagation()
+ return result
+ }
+ handler.i = set.length
+ set.push(handler)
+ if ('addEventListener' in element)+ element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))
+ })
+ }
+ function remove(element, events, fn, selector, capture){+ var id = zid(element)
+ ;(events || '').split(/\s/).forEach(function(event){+ findHandlers(element, event, fn, selector).forEach(function(handler){+ delete handlers[id][handler.i]
+ if ('removeEventListener' in element)+ element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))
+ })
+ })
+ }
+
+ $.event = { add: add, remove: remove }+
+ $.proxy = function(fn, context) {+ var args = (2 in arguments) && slice.call(arguments, 2)
+ if (isFunction(fn)) {+ var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) }+ proxyFn._zid = zid(fn)
+ return proxyFn
+ } else if (isString(context)) {+ if (args) {+ args.unshift(fn[context], fn)
+ return $.proxy.apply(null, args)
+ } else {+ return $.proxy(fn[context], fn)
+ }
+ } else {+ throw new TypeError("expected function")+ }
+ }
+
+ $.fn.bind = function(event, data, callback){+ return this.on(event, data, callback)
+ }
+ $.fn.unbind = function(event, callback){+ return this.off(event, callback)
+ }
+ $.fn.one = function(event, selector, data, callback){+ return this.on(event, selector, data, callback, 1)
+ }
+
+ var returnTrue = function(){return true},+ returnFalse = function(){return false},+ ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,
+ eventMethods = {+ preventDefault: 'isDefaultPrevented',
+ stopImmediatePropagation: 'isImmediatePropagationStopped',
+ stopPropagation: 'isPropagationStopped'
+ }
+
+ function compatible(event, source) {+ if (source || !event.isDefaultPrevented) {+ source || (source = event)
+
+ $.each(eventMethods, function(name, predicate) {+ var sourceMethod = source[name]
+ event[name] = function(){+ this[predicate] = returnTrue
+ return sourceMethod && sourceMethod.apply(source, arguments)
+ }
+ event[predicate] = returnFalse
+ })
+
+ event.timeStamp || (event.timeStamp = Date.now())
+
+ if (source.defaultPrevented !== undefined ? source.defaultPrevented :
+ 'returnValue' in source ? source.returnValue === false :
+ source.getPreventDefault && source.getPreventDefault())
+ event.isDefaultPrevented = returnTrue
+ }
+ return event
+ }
+
+ function createProxy(event) {+ var key, proxy = { originalEvent: event }+ for (key in event)
+ if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key]
+
+ return compatible(proxy, event)
+ }
+
+ $.fn.delegate = function(selector, event, callback){+ return this.on(event, selector, callback)
+ }
+ $.fn.undelegate = function(selector, event, callback){+ return this.off(event, selector, callback)
+ }
+
+ $.fn.live = function(event, callback){+ $(document.body).delegate(this.selector, event, callback)
+ return this
+ }
+ $.fn.die = function(event, callback){+ $(document.body).undelegate(this.selector, event, callback)
+ return this
+ }
+
+ $.fn.on = function(event, selector, data, callback, one){+ var autoRemove, delegator, $this = this
+ if (event && !isString(event)) {+ $.each(event, function(type, fn){+ $this.on(type, selector, data, fn, one)
+ })
+ return $this
+ }
+
+ if (!isString(selector) && !isFunction(callback) && callback !== false)
+ callback = data, data = selector, selector = undefined
+ if (callback === undefined || data === false)
+ callback = data, data = undefined
+
+ if (callback === false) callback = returnFalse
+
+ return $this.each(function(_, element){+ if (one) autoRemove = function(e){+ remove(element, e.type, callback)
+ return callback.apply(this, arguments)
+ }
+
+ if (selector) delegator = function(e){+ var evt, match = $(e.target).closest(selector, element).get(0)
+ if (match && match !== element) {+ evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element})+ return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)))
+ }
+ }
+
+ add(element, event, callback, data, selector, delegator || autoRemove)
+ })
+ }
+ $.fn.off = function(event, selector, callback){+ var $this = this
+ if (event && !isString(event)) {+ $.each(event, function(type, fn){+ $this.off(type, selector, fn)
+ })
+ return $this
+ }
+
+ if (!isString(selector) && !isFunction(callback) && callback !== false)
+ callback = selector, selector = undefined
+
+ if (callback === false) callback = returnFalse
+
+ return $this.each(function(){+ remove(this, event, callback, selector)
+ })
+ }
+
+ $.fn.trigger = function(event, args){+ event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event)
+ event._args = args
+ return this.each(function(){+ // handle focus(), blur() by calling them directly
+ if (event.type in focus && typeof this[event.type] == "function") this[event.type]()
+ // items in the collection might not be DOM elements
+ else if ('dispatchEvent' in this) this.dispatchEvent(event)+ else $(this).triggerHandler(event, args)
+ })
+ }
+
+ // triggers event handlers on current element just as if an event occurred,
+ // doesn't trigger an actual event, doesn't bubble
+ $.fn.triggerHandler = function(event, args){+ var e, result
+ this.each(function(i, element){+ e = createProxy(isString(event) ? $.Event(event) : event)
+ e._args = args
+ e.target = element
+ $.each(findHandlers(element, event.type || event), function(i, handler){+ result = handler.proxy(e)
+ if (e.isImmediatePropagationStopped()) return false
+ })
+ })
+ return result
+ }
+
+ // shortcut methods for `.bind(event, fn)` for each event type
+ ;('focusin focusout focus blur load resize scroll unload click dblclick '++ 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+
+ 'change select keydown keypress keyup error').split(' ').forEach(function(event) {+ $.fn[event] = function(callback) {+ return (0 in arguments) ?
+ this.bind(event, callback) :
+ this.trigger(event)
+ }
+ })
+
+ $.Event = function(type, props) {+ if (!isString(type)) props = type, type = props.type
+ var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true
+ if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name])
+ event.initEvent(type, bubbles, true)
+ return compatible(event)
+ }
+
+})(Zepto)
+
+;(function($){+ var cache = [], timeout
+
+ $.fn.remove = function(){+ return this.each(function(){+ if(this.parentNode){+ if(this.tagName === 'IMG'){+ cache.push(this)
+ this.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
+ if (timeout) clearTimeout(timeout)
+ timeout = setTimeout(function(){ cache = [] }, 60000)+ }
+ this.parentNode.removeChild(this)
+ }
+ })
+ }
+})(Zepto)
+
+;(function($){+ var data = {}, dataAttr = $.fn.data, camelize = $.camelCase,+ exp = $.expando = 'Zepto' + (+new Date()), emptyArray = []
+
+ // Get value from node:
+ // 1. first try key as given,
+ // 2. then try camelized key,
+ // 3. fall back to reading "data-*" attribute.
+ function getData(node, name) {+ var id = node[exp], store = id && data[id]
+ if (name === undefined) return store || setData(node)
+ else {+ if (store) {+ if (name in store) return store[name]
+ var camelName = camelize(name)
+ if (camelName in store) return store[camelName]
+ }
+ return dataAttr.call($(node), name)
+ }
+ }
+
+ // Store value under camelized key on node
+ function setData(node, name, value) {+ var id = node[exp] || (node[exp] = ++$.uuid),
+ store = data[id] || (data[id] = attributeData(node))
+ if (name !== undefined) store[camelize(name)] = value
+ return store
+ }
+
+ // Read all "data-*" attributes from a node
+ function attributeData(node) {+ var store = {}+ $.each(node.attributes || emptyArray, function(i, attr){+ if (attr.name.indexOf('data-') == 0)+ store[camelize(attr.name.replace('data-', ''))] =+ $.zepto.deserializeValue(attr.value)
+ })
+ return store
+ }
+
+ $.fn.data = function(name, value) {+ return value === undefined ?
+ // set multiple values via object
+ $.isPlainObject(name) ?
+ this.each(function(i, node){+ $.each(name, function(key, value){ setData(node, key, value) })+ }) :
+ // get value from first element
+ (0 in this ? getData(this[0], name) : undefined) :
+ // set value on all elements
+ this.each(function(){ setData(this, name, value) })+ }
+
+ $.data = function(elem, name, value) {+ return $(elem).data(name, value)
+ }
+
+ $.hasData = function(elem) {+ var id = elem[exp], store = id && data[id]
+ return store ? !$.isEmptyObject(store) : false
+ }
+
+ $.fn.removeData = function(names) {+ if (typeof names == 'string') names = names.split(/\s+/)
+ return this.each(function(){+ var id = this[exp], store = id && data[id]
+ if (store) $.each(names || store, function(key){+ delete store[names ? camelize(this) : key]
+ })
+ })
+ }
+
+ // Generate extended `remove` and `empty` functions
+ ;['remove', 'empty'].forEach(function(methodName){+ var origFn = $.fn[methodName]
+ $.fn[methodName] = function() {+ var elements = this.find('*')+ if (methodName === 'remove') elements = elements.add(this)
+ elements.removeData()
+ return origFn.call(this)
+ }
+ })
+})(Zepto)
+ return Zepto
+}))
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {+ value: true
+});
+exports.default = '2.4.1';
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {+ value: true
+});
+
+var _zepto = __webpack_require__(17);
+
+var _zepto2 = _interopRequireDefault(_zepto);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }+
+exports.default = _zepto2.default;
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports) {+
+if (typeof Object.create === 'function') {+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {+ constructor: {+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {+ ctor.super_ = superCtor
+ var TempCtor = function () {}+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {+ value: true
+});
+
+var _toFactory = __webpack_require__(66);
+
+var _toFactory2 = _interopRequireDefault(_toFactory);
+
+var _DocSearch = __webpack_require__(47);
+
+var _DocSearch2 = _interopRequireDefault(_DocSearch);
+
+var _version = __webpack_require__(18);
+
+var _version2 = _interopRequireDefault(_version);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }+
+var docsearch = (0, _toFactory2.default)(_DocSearch2.default);
+docsearch.version = _version2.default;
+
+exports.default = docsearch;
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {+
+module.exports = AlgoliaSearchCore;
+
+var errors = __webpack_require__(5);
+var exitPromise = __webpack_require__(31);
+var IndexCore = __webpack_require__(23);
+var store = __webpack_require__(35);
+
+// We will always put the API KEY in the JSON body in case of too long API KEY,
+// to avoid query string being too long and failing in various conditions (our server limit, browser limit,
+// proxies limit)
+var MAX_API_KEY_LENGTH = 500;
+var RESET_APP_DATA_TIMER =
+ __webpack_require__.i({"NODE_ENV":"production"}).RESET_APP_DATA_TIMER && parseInt(__webpack_require__.i({"NODE_ENV":"production"}).RESET_APP_DATA_TIMER, 10) ||+ 60 * 2 * 1000; // after 2 minutes reset to first host
+
+/*
+ * Algolia Search library initialization
+ * https://www.algolia.com/
+ *
+ * @param {string} applicationID - Your applicationID, found in your dashboard+ * @param {string} apiKey - Your API key, found in your dashboard+ * @param {Object} [opts]+ * @param {number} [opts.timeout=2000] - The request timeout set in milliseconds,+ * another request will be issued after this timeout
+ * @param {string} [opts.protocol='http:'] - The protocol used to query Algolia Search API.+ * Set to 'https:' to force using https.
+ * Default to document.location.protocol in browsers
+ * @param {Object|Array} [opts.hosts={+ * read: [this.applicationID + '-dsn.algolia.net'].concat([
+ * this.applicationID + '-1.algolianet.com',
+ * this.applicationID + '-2.algolianet.com',
+ * this.applicationID + '-3.algolianet.com']
+ * ]),
+ * write: [this.applicationID + '.algolia.net'].concat([
+ * this.applicationID + '-1.algolianet.com',
+ * this.applicationID + '-2.algolianet.com',
+ * this.applicationID + '-3.algolianet.com']
+ * ]) - The hosts to use for Algolia Search API.
+ * If you provide them, you will less benefit from our HA implementation
+ */
+function AlgoliaSearchCore(applicationID, apiKey, opts) {+ var debug = __webpack_require__(6)('algoliasearch');+
+ var clone = __webpack_require__(4);
+ var isArray = __webpack_require__(10);
+ var map = __webpack_require__(7);
+
+ var usage = 'Usage: algoliasearch(applicationID, apiKey, opts)';
+
+ if (opts._allowEmptyCredentials !== true && !applicationID) {+ throw new errors.AlgoliaSearchError('Please provide an application ID. ' + usage);+ }
+
+ if (opts._allowEmptyCredentials !== true && !apiKey) {+ throw new errors.AlgoliaSearchError('Please provide an API key. ' + usage);+ }
+
+ this.applicationID = applicationID;
+ this.apiKey = apiKey;
+
+ this.hosts = {+ read: [],
+ write: []
+ };
+
+ opts = opts || {};+
+ var protocol = opts.protocol || 'https:';
+ this._timeouts = opts.timeouts || {+ connect: 1 * 1000, // 500ms connect is GPRS latency
+ read: 2 * 1000,
+ write: 30 * 1000
+ };
+
+ // backward compat, if opts.timeout is passed, we use it to configure all timeouts like before
+ if (opts.timeout) {+ this._timeouts.connect = this._timeouts.read = this._timeouts.write = opts.timeout;
+ }
+
+ // while we advocate for colon-at-the-end values: 'http:' for `opts.protocol`
+ // we also accept `http` and `https`. It's a common error.
+ if (!/:$/.test(protocol)) {+ protocol = protocol + ':';
+ }
+
+ if (opts.protocol !== 'http:' && opts.protocol !== 'https:') {+ throw new errors.AlgoliaSearchError('protocol must be `http:` or `https:` (was `' + opts.protocol + '`)');+ }
+
+ this._checkAppIdData();
+
+ if (!opts.hosts) {+ var defaultHosts = map(this._shuffleResult, function(hostNumber) {+ return applicationID + '-' + hostNumber + '.algolianet.com';
+ });
+
+ // no hosts given, compute defaults
+ this.hosts.read = [this.applicationID + '-dsn.algolia.net'].concat(defaultHosts);
+ this.hosts.write = [this.applicationID + '.algolia.net'].concat(defaultHosts);
+ } else if (isArray(opts.hosts)) {+ // when passing custom hosts, we need to have a different host index if the number
+ // of write/read hosts are different.
+ this.hosts.read = clone(opts.hosts);
+ this.hosts.write = clone(opts.hosts);
+ } else {+ this.hosts.read = clone(opts.hosts.read);
+ this.hosts.write = clone(opts.hosts.write);
+ }
+
+ // add protocol and lowercase hosts
+ this.hosts.read = map(this.hosts.read, prepareHost(protocol));
+ this.hosts.write = map(this.hosts.write, prepareHost(protocol));
+
+ this.extraHeaders = [];
+
+ // In some situations you might want to warm the cache
+ this.cache = opts._cache || {};+
+ this._ua = opts._ua;
+ this._useCache = opts._useCache === undefined || opts._cache ? true : opts._useCache;
+ this._useFallback = opts.useFallback === undefined ? true : opts.useFallback;
+
+ this._setTimeout = opts._setTimeout;
+
+ debug('init done, %j', this);+}
+
+/*
+ * Get the index object initialized
+ *
+ * @param indexName the name of index
+ * @param callback the result callback with one argument (the Index instance)
+ */
+AlgoliaSearchCore.prototype.initIndex = function(indexName) {+ return new IndexCore(this, indexName);
+};
+
+/**
+* Add an extra field to the HTTP request
+*
+* @param name the header field name
+* @param value the header field value
+*/
+AlgoliaSearchCore.prototype.setExtraHeader = function(name, value) {+ this.extraHeaders.push({+ name: name.toLowerCase(), value: value
+ });
+};
+
+/**
+* Augment sent x-algolia-agent with more data, each agent part
+* is automatically separated from the others by a semicolon;
+*
+* @param algoliaAgent the agent to add
+*/
+AlgoliaSearchCore.prototype.addAlgoliaAgent = function(algoliaAgent) {+ if (this._ua.indexOf(';' + algoliaAgent) === -1) {+ this._ua += ';' + algoliaAgent;
+ }
+};
+
+/*
+ * Wrapper that try all hosts to maximize the quality of service
+ */
+AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) {+ this._checkAppIdData();
+
+ var requestDebug = __webpack_require__(6)('algoliasearch:' + initialOpts.url);+
+ var body;
+ var additionalUA = initialOpts.additionalUA || '';
+ var cache = initialOpts.cache;
+ var client = this;
+ var tries = 0;
+ var usingFallback = false;
+ var hasFallback = client._useFallback && client._request.fallback && initialOpts.fallback;
+ var headers;
+
+ if (
+ this.apiKey.length > MAX_API_KEY_LENGTH &&
+ initialOpts.body !== undefined &&
+ (initialOpts.body.params !== undefined || // index.search()
+ initialOpts.body.requests !== undefined) // client.search()
+ ) {+ initialOpts.body.apiKey = this.apiKey;
+ headers = this._computeRequestHeaders(additionalUA, false);
+ } else {+ headers = this._computeRequestHeaders(additionalUA);
+ }
+
+ if (initialOpts.body !== undefined) {+ body = safeJSONStringify(initialOpts.body);
+ }
+
+ requestDebug('request start');+ var debugData = [];
+
+ function doRequest(requester, reqOpts) {+ client._checkAppIdData();
+
+ var startTime = new Date();
+ var cacheID;
+
+ if (client._useCache) {+ cacheID = initialOpts.url;
+ }
+
+ // as we sometime use POST requests to pass parameters (like query='aa'),
+ // the cacheID must also include the body to be different between calls
+ if (client._useCache && body) {+ cacheID += '_body_' + reqOpts.body;
+ }
+
+ // handle cache existence
+ if (client._useCache && cache && cache[cacheID] !== undefined) {+ requestDebug('serving response from cache');+ return client._promise.resolve(JSON.parse(cache[cacheID]));
+ }
+
+ // if we reached max tries
+ if (tries >= client.hosts[initialOpts.hostType].length) {+ if (!hasFallback || usingFallback) {+ requestDebug('could not get any response');+ // then stop
+ return client._promise.reject(new errors.AlgoliaSearchError(
+ 'Cannot connect to the AlgoliaSearch API.' +
+ ' Send an email to support@algolia.com to report and resolve the issue.' +
+ ' Application id was: ' + client.applicationID, {debugData: debugData}+ ));
+ }
+
+ requestDebug('switching to fallback');+
+ // let's try the fallback starting from here
+ tries = 0;
+
+ // method, url and body are fallback dependent
+ reqOpts.method = initialOpts.fallback.method;
+ reqOpts.url = initialOpts.fallback.url;
+ reqOpts.jsonBody = initialOpts.fallback.body;
+ if (reqOpts.jsonBody) {+ reqOpts.body = safeJSONStringify(reqOpts.jsonBody);
+ }
+ // re-compute headers, they could be omitting the API KEY
+ headers = client._computeRequestHeaders(additionalUA);
+
+ reqOpts.timeouts = client._getTimeoutsForRequest(initialOpts.hostType);
+ client._setHostIndexByType(0, initialOpts.hostType);
+ usingFallback = true; // the current request is now using fallback
+ return doRequest(client._request.fallback, reqOpts);
+ }
+
+ var currentHost = client._getHostByType(initialOpts.hostType);
+
+ var url = currentHost + reqOpts.url;
+ var options = {+ body: reqOpts.body,
+ jsonBody: reqOpts.jsonBody,
+ method: reqOpts.method,
+ headers: headers,
+ timeouts: reqOpts.timeouts,
+ debug: requestDebug
+ };
+
+ requestDebug('method: %s, url: %s, headers: %j, timeouts: %d',+ options.method, url, options.headers, options.timeouts);
+
+ if (requester === client._request.fallback) {+ requestDebug('using fallback');+ }
+
+ // `requester` is any of this._request or this._request.fallback
+ // thus it needs to be called using the client as context
+ return requester.call(client, url, options).then(success, tryFallback);
+
+ function success(httpResponse) {+ // compute the status of the response,
+ //
+ // When in browser mode, using XDR or JSONP, we have no statusCode available
+ // So we rely on our API response `status` property.
+ // But `waitTask` can set a `status` property which is not the statusCode (it's the task status)
+ // So we check if there's a `message` along `status` and it means it's an error
+ //
+ // That's the only case where we have a response.status that's not the http statusCode
+ var status = httpResponse && httpResponse.body && httpResponse.body.message && httpResponse.body.status ||
+
+ // this is important to check the request statusCode AFTER the body eventual
+ // statusCode because some implementations (jQuery XDomainRequest transport) may
+ // send statusCode 200 while we had an error
+ httpResponse.statusCode ||
+
+ // When in browser mode, using XDR or JSONP
+ // we default to success when no error (no response.status && response.message)
+ // If there was a JSON.parse() error then body is null and it fails
+ httpResponse && httpResponse.body && 200;
+
+ requestDebug('received response: statusCode: %s, computed statusCode: %d, headers: %j',+ httpResponse.statusCode, status, httpResponse.headers);
+
+ var httpResponseOk = Math.floor(status / 100) === 2;
+
+ var endTime = new Date();
+ debugData.push({+ currentHost: currentHost,
+ headers: removeCredentials(headers),
+ content: body || null,
+ contentLength: body !== undefined ? body.length : null,
+ method: reqOpts.method,
+ timeouts: reqOpts.timeouts,
+ url: reqOpts.url,
+ startTime: startTime,
+ endTime: endTime,
+ duration: endTime - startTime,
+ statusCode: status
+ });
+
+ if (httpResponseOk) {+ if (client._useCache && cache) {+ cache[cacheID] = httpResponse.responseText;
+ }
+
+ return httpResponse.body;
+ }
+
+ var shouldRetry = Math.floor(status / 100) !== 4;
+
+ if (shouldRetry) {+ tries += 1;
+ return retryRequest();
+ }
+
+ requestDebug('unrecoverable error');+
+ // no success and no retry => fail
+ var unrecoverableError = new errors.AlgoliaSearchError(
+ httpResponse.body && httpResponse.body.message, {debugData: debugData, statusCode: status}+ );
+
+ return client._promise.reject(unrecoverableError);
+ }
+
+ function tryFallback(err) {+ // error cases:
+ // While not in fallback mode:
+ // - CORS not supported
+ // - network error
+ // While in fallback mode:
+ // - timeout
+ // - network error
+ // - badly formatted JSONP (script loaded, did not call our callback)
+ // In both cases:
+ // - uncaught exception occurs (TypeError)
+ requestDebug('error: %s, stack: %s', err.message, err.stack);+
+ var endTime = new Date();
+ debugData.push({+ currentHost: currentHost,
+ headers: removeCredentials(headers),
+ content: body || null,
+ contentLength: body !== undefined ? body.length : null,
+ method: reqOpts.method,
+ timeouts: reqOpts.timeouts,
+ url: reqOpts.url,
+ startTime: startTime,
+ endTime: endTime,
+ duration: endTime - startTime
+ });
+
+ if (!(err instanceof errors.AlgoliaSearchError)) {+ err = new errors.Unknown(err && err.message, err);
+ }
+
+ tries += 1;
+
+ // stop the request implementation when:
+ if (
+ // we did not generate this error,
+ // it comes from a throw in some other piece of code
+ err instanceof errors.Unknown ||
+
+ // server sent unparsable JSON
+ err instanceof errors.UnparsableJSON ||
+
+ // max tries and already using fallback or no fallback
+ tries >= client.hosts[initialOpts.hostType].length &&
+ (usingFallback || !hasFallback)) {+ // stop request implementation for this command
+ err.debugData = debugData;
+ return client._promise.reject(err);
+ }
+
+ // When a timeout occured, retry by raising timeout
+ if (err instanceof errors.RequestTimeout) {+ return retryRequestWithHigherTimeout();
+ }
+
+ return retryRequest();
+ }
+
+ function retryRequest() {+ requestDebug('retrying request');+ client._incrementHostIndex(initialOpts.hostType);
+ return doRequest(requester, reqOpts);
+ }
+
+ function retryRequestWithHigherTimeout() {+ requestDebug('retrying request with higher timeout');+ client._incrementHostIndex(initialOpts.hostType);
+ client._incrementTimeoutMultipler();
+ reqOpts.timeouts = client._getTimeoutsForRequest(initialOpts.hostType);
+ return doRequest(requester, reqOpts);
+ }
+ }
+
+ var promise = doRequest(
+ client._request, {+ url: initialOpts.url,
+ method: initialOpts.method,
+ body: body,
+ jsonBody: initialOpts.body,
+ timeouts: client._getTimeoutsForRequest(initialOpts.hostType)
+ }
+ );
+
+ // either we have a callback
+ // either we are using promises
+ if (initialOpts.callback) {+ promise.then(function okCb(content) {+ exitPromise(function() {+ initialOpts.callback(null, content);
+ }, client._setTimeout || setTimeout);
+ }, function nookCb(err) {+ exitPromise(function() {+ initialOpts.callback(err);
+ }, client._setTimeout || setTimeout);
+ });
+ } else {+ return promise;
+ }
+};
+
+/*
+* Transform search param object in query string
+* @param {object} args arguments to add to the current query string+* @param {string} params current query string+* @return {string} the final query string+*/
+AlgoliaSearchCore.prototype._getSearchParams = function(args, params) {+ if (args === undefined || args === null) {+ return params;
+ }
+ for (var key in args) {+ if (key !== null && args[key] !== undefined && args.hasOwnProperty(key)) {+ params += params === '' ? '' : '&';
+ params += key + '=' + encodeURIComponent(Object.prototype.toString.call(args[key]) === '[object Array]' ? safeJSONStringify(args[key]) : args[key]);
+ }
+ }
+ return params;
+};
+
+AlgoliaSearchCore.prototype._computeRequestHeaders = function(additionalUA, withAPIKey) {+ var forEach = __webpack_require__(2);
+
+ var ua = additionalUA ?
+ this._ua + ';' + additionalUA :
+ this._ua;
+
+ var requestHeaders = {+ 'x-algolia-agent': ua,
+ 'x-algolia-application-id': this.applicationID
+ };
+
+ // browser will inline headers in the url, node.js will use http headers
+ // but in some situations, the API KEY will be too long (big secured API keys)
+ // so if the request is a POST and the KEY is very long, we will be asked to not put
+ // it into headers but in the JSON body
+ if (withAPIKey !== false) {+ requestHeaders['x-algolia-api-key'] = this.apiKey;
+ }
+
+ if (this.userToken) {+ requestHeaders['x-algolia-usertoken'] = this.userToken;
+ }
+
+ if (this.securityTags) {+ requestHeaders['x-algolia-tagfilters'] = this.securityTags;
+ }
+
+ if (this.extraHeaders) {+ forEach(this.extraHeaders, function addToRequestHeaders(header) {+ requestHeaders[header.name] = header.value;
+ });
+ }
+
+ return requestHeaders;
+};
+
+/**
+ * Search through multiple indices at the same time
+ * @param {Object[]} queries An array of queries you want to run.+ * @param {string} queries[].indexName The index name you want to target+ * @param {string} [queries[].query] The query to issue on this index. Can also be passed into `params`+ * @param {Object} queries[].params Any search param like hitsPerPage, ..+ * @param {Function} callback Callback to be called+ * @return {Promise|undefined} Returns a promise if no callback given+ */
+AlgoliaSearchCore.prototype.search = function(queries, opts, callback) {+ var isArray = __webpack_require__(10);
+ var map = __webpack_require__(7);
+
+ var usage = 'Usage: client.search(arrayOfQueries[, callback])';
+
+ if (!isArray(queries)) {+ throw new Error(usage);
+ }
+
+ if (typeof opts === 'function') {+ callback = opts;
+ opts = {};+ } else if (opts === undefined) {+ opts = {};+ }
+
+ var client = this;
+
+ var postObj = {+ requests: map(queries, function prepareRequest(query) {+ var params = '';
+
+ // allow query.query
+ // so we are mimicing the index.search(query, params) method
+ // {indexName:, query:, params:}+ if (query.query !== undefined) {+ params += 'query=' + encodeURIComponent(query.query);
+ }
+
+ return {+ indexName: query.indexName,
+ params: client._getSearchParams(query.params, params)
+ };
+ })
+ };
+
+ var JSONPParams = map(postObj.requests, function prepareJSONPParams(request, requestId) {+ return requestId + '=' +
+ encodeURIComponent(
+ '/1/indexes/' + encodeURIComponent(request.indexName) + '?' +
+ request.params
+ );
+ }).join('&');+
+ var url = '/1/indexes/*/queries';
+
+ if (opts.strategy !== undefined) {+ url += '?strategy=' + opts.strategy;
+ }
+
+ return this._jsonRequest({+ cache: this.cache,
+ method: 'POST',
+ url: url,
+ body: postObj,
+ hostType: 'read',
+ fallback: {+ method: 'GET',
+ url: '/1/indexes/*',
+ body: {+ params: JSONPParams
+ }
+ },
+ callback: callback
+ });
+};
+
+/**
+ * Set the extra security tagFilters header
+ * @param {string|array} tags The list of tags defining the current security filters+ */
+AlgoliaSearchCore.prototype.setSecurityTags = function(tags) {+ if (Object.prototype.toString.call(tags) === '[object Array]') {+ var strTags = [];
+ for (var i = 0; i < tags.length; ++i) {+ if (Object.prototype.toString.call(tags[i]) === '[object Array]') {+ var oredTags = [];
+ for (var j = 0; j < tags[i].length; ++j) {+ oredTags.push(tags[i][j]);
+ }
+ strTags.push('(' + oredTags.join(',') + ')');+ } else {+ strTags.push(tags[i]);
+ }
+ }
+ tags = strTags.join(',');+ }
+
+ this.securityTags = tags;
+};
+
+/**
+ * Set the extra user token header
+ * @param {string} userToken The token identifying a uniq user (used to apply rate limits)+ */
+AlgoliaSearchCore.prototype.setUserToken = function(userToken) {+ this.userToken = userToken;
+};
+
+/**
+ * Clear all queries in client's cache
+ * @return undefined
+ */
+AlgoliaSearchCore.prototype.clearCache = function() {+ this.cache = {};+};
+
+/**
+* Set the number of milliseconds a request can take before automatically being terminated.
+* @deprecated
+* @param {Number} milliseconds+*/
+AlgoliaSearchCore.prototype.setRequestTimeout = function(milliseconds) {+ if (milliseconds) {+ this._timeouts.connect = this._timeouts.read = this._timeouts.write = milliseconds;
+ }
+};
+
+/**
+* Set the three different (connect, read, write) timeouts to be used when requesting
+* @param {Object} timeouts+*/
+AlgoliaSearchCore.prototype.setTimeouts = function(timeouts) {+ this._timeouts = timeouts;
+};
+
+/**
+* Get the three different (connect, read, write) timeouts to be used when requesting
+* @param {Object} timeouts+*/
+AlgoliaSearchCore.prototype.getTimeouts = function() {+ return this._timeouts;
+};
+
+AlgoliaSearchCore.prototype._getAppIdData = function() {+ var data = store.get(this.applicationID);
+ if (data !== null) this._cacheAppIdData(data);
+ return data;
+};
+
+AlgoliaSearchCore.prototype._setAppIdData = function(data) {+ data.lastChange = (new Date()).getTime();
+ this._cacheAppIdData(data);
+ return store.set(this.applicationID, data);
+};
+
+AlgoliaSearchCore.prototype._checkAppIdData = function() {+ var data = this._getAppIdData();
+ var now = (new Date()).getTime();
+ if (data === null || now - data.lastChange > RESET_APP_DATA_TIMER) {+ return this._resetInitialAppIdData(data);
+ }
+
+ return data;
+};
+
+AlgoliaSearchCore.prototype._resetInitialAppIdData = function(data) {+ var newData = data || {};+ newData.hostIndexes = {read: 0, write: 0};+ newData.timeoutMultiplier = 1;
+ newData.shuffleResult = newData.shuffleResult || shuffle([1, 2, 3]);
+ return this._setAppIdData(newData);
+};
+
+AlgoliaSearchCore.prototype._cacheAppIdData = function(data) {+ this._hostIndexes = data.hostIndexes;
+ this._timeoutMultiplier = data.timeoutMultiplier;
+ this._shuffleResult = data.shuffleResult;
+};
+
+AlgoliaSearchCore.prototype._partialAppIdDataUpdate = function(newData) {+ var foreach = __webpack_require__(2);
+ var currentData = this._getAppIdData();
+ foreach(newData, function(value, key) {+ currentData[key] = value;
+ });
+
+ return this._setAppIdData(currentData);
+};
+
+AlgoliaSearchCore.prototype._getHostByType = function(hostType) {+ return this.hosts[hostType][this._getHostIndexByType(hostType)];
+};
+
+AlgoliaSearchCore.prototype._getTimeoutMultiplier = function() {+ return this._timeoutMultiplier;
+};
+
+AlgoliaSearchCore.prototype._getHostIndexByType = function(hostType) {+ return this._hostIndexes[hostType];
+};
+
+AlgoliaSearchCore.prototype._setHostIndexByType = function(hostIndex, hostType) {+ var clone = __webpack_require__(4);
+ var newHostIndexes = clone(this._hostIndexes);
+ newHostIndexes[hostType] = hostIndex;
+ this._partialAppIdDataUpdate({hostIndexes: newHostIndexes});+ return hostIndex;
+};
+
+AlgoliaSearchCore.prototype._incrementHostIndex = function(hostType) {+ return this._setHostIndexByType(
+ (this._getHostIndexByType(hostType) + 1) % this.hosts[hostType].length, hostType
+ );
+};
+
+AlgoliaSearchCore.prototype._incrementTimeoutMultipler = function() {+ var timeoutMultiplier = Math.max(this._timeoutMultiplier + 1, 4);
+ return this._partialAppIdDataUpdate({timeoutMultiplier: timeoutMultiplier});+};
+
+AlgoliaSearchCore.prototype._getTimeoutsForRequest = function(hostType) {+ return {+ connect: this._timeouts.connect * this._timeoutMultiplier,
+ complete: this._timeouts[hostType] * this._timeoutMultiplier
+ };
+};
+
+function prepareHost(protocol) {+ return function prepare(host) {+ return protocol + '//' + host.toLowerCase();
+ };
+}
+
+// Prototype.js < 1.7, a widely used library, defines a weird
+// Array.prototype.toJSON function that will fail to stringify our content
+// appropriately
+// refs:
+// - https://groups.google.com/forum/#!topic/prototype-core/E-SAVvV_V9Q
+// - https://github.com/sstephenson/prototype/commit/038a2985a70593c1a86c230fadbdfe2e4898a48c
+// - http://stackoverflow.com/a/3148441/147079
+function safeJSONStringify(obj) {+ /* eslint no-extend-native:0 */
+
+ if (Array.prototype.toJSON === undefined) {+ return JSON.stringify(obj);
+ }
+
+ var toJSON = Array.prototype.toJSON;
+ delete Array.prototype.toJSON;
+ var out = JSON.stringify(obj);
+ Array.prototype.toJSON = toJSON;
+
+ return out;
+}
+
+function shuffle(array) {+ var currentIndex = array.length;
+ var temporaryValue;
+ var randomIndex;
+
+ // While there remain elements to shuffle...
+ while (currentIndex !== 0) {+ // Pick a remaining element...
+ randomIndex = Math.floor(Math.random() * currentIndex);
+ currentIndex -= 1;
+
+ // And swap it with the current element.
+ temporaryValue = array[currentIndex];
+ array[currentIndex] = array[randomIndex];
+ array[randomIndex] = temporaryValue;
+ }
+
+ return array;
+}
+
+function removeCredentials(headers) {+ var newHeaders = {};+
+ for (var headerName in headers) {+ if (Object.prototype.hasOwnProperty.call(headers, headerName)) {+ var value;
+
+ if (headerName === 'x-algolia-api-key' || headerName === 'x-algolia-application-id') {+ value = '**hidden for security purposes**';
+ } else {+ value = headers[headerName];
+ }
+
+ newHeaders[headerName] = value;
+ }
+ }
+
+ return newHeaders;
+}
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {+
+var buildSearchMethod = __webpack_require__(12);
+var deprecate = __webpack_require__(29);
+var deprecatedMessage = __webpack_require__(30);
+
+module.exports = IndexCore;
+
+/*
+* Index class constructor.
+* You should not use this method directly but use initIndex() function
+*/
+function IndexCore(algoliasearch, indexName) {+ this.indexName = indexName;
+ this.as = algoliasearch;
+ this.typeAheadArgs = null;
+ this.typeAheadValueOption = null;
+
+ // make sure every index instance has it's own cache
+ this.cache = {};+}
+
+/*
+* Clear all queries in cache
+*/
+IndexCore.prototype.clearCache = function() {+ this.cache = {};+};
+
+/*
+* Search inside the index using XMLHttpRequest request (Using a POST query to
+* minimize number of OPTIONS queries: Cross-Origin Resource Sharing).
+*
+* @param {string} [query] the full text query+* @param {object} [args] (optional) if set, contains an object with query parameters:+* - page: (integer) Pagination parameter used to select the page to retrieve.
+* Page is zero-based and defaults to 0. Thus,
+* to retrieve the 10th page you need to set page=9
+* - hitsPerPage: (integer) Pagination parameter used to select the number of hits per page. Defaults to 20.
+* - attributesToRetrieve: a string that contains the list of object attributes
+* you want to retrieve (let you minimize the answer size).
+* Attributes are separated with a comma (for example "name,address").
+* You can also use an array (for example ["name","address"]).
+* By default, all attributes are retrieved. You can also use '*' to retrieve all
+* values when an attributesToRetrieve setting is specified for your index.
+* - attributesToHighlight: a string that contains the list of attributes you
+* want to highlight according to the query.
+* Attributes are separated by a comma. You can also use an array (for example ["name","address"]).
+* If an attribute has no match for the query, the raw value is returned.
+* By default all indexed text attributes are highlighted.
+* You can use `*` if you want to highlight all textual attributes.
+* Numerical attributes are not highlighted.
+* A matchLevel is returned for each highlighted attribute and can contain:
+* - full: if all the query terms were found in the attribute,
+* - partial: if only some of the query terms were found,
+* - none: if none of the query terms were found.
+* - attributesToSnippet: a string that contains the list of attributes to snippet alongside
+* the number of words to return (syntax is `attributeName:nbWords`).
+* Attributes are separated by a comma (Example: attributesToSnippet=name:10,content:10).
+* You can also use an array (Example: attributesToSnippet: ['name:10','content:10']).
+* By default no snippet is computed.
+* - minWordSizefor1Typo: the minimum number of characters in a query word to accept one typo in this word.
+* Defaults to 3.
+* - minWordSizefor2Typos: the minimum number of characters in a query word
+* to accept two typos in this word. Defaults to 7.
+* - getRankingInfo: if set to 1, the result hits will contain ranking
+* information in _rankingInfo attribute.
+* - aroundLatLng: search for entries around a given
+* latitude/longitude (specified as two floats separated by a comma).
+* For example aroundLatLng=47.316669,5.016670).
+* You can specify the maximum distance in meters with the aroundRadius parameter (in meters)
+* and the precision for ranking with aroundPrecision
+* (for example if you set aroundPrecision=100, two objects that are distant of
+* less than 100m will be considered as identical for "geo" ranking parameter).
+* At indexing, you should specify geoloc of an object with the _geoloc attribute
+* (in the form {"_geoloc":{"lat":48.853409, "lng":2.348800}})+* - insideBoundingBox: search entries inside a given area defined by the two extreme points
+* of a rectangle (defined by 4 floats: p1Lat,p1Lng,p2Lat,p2Lng).
+* For example insideBoundingBox=47.3165,4.9665,47.3424,5.0201).
+* At indexing, you should specify geoloc of an object with the _geoloc attribute
+* (in the form {"_geoloc":{"lat":48.853409, "lng":2.348800}})+* - numericFilters: a string that contains the list of numeric filters you want to
+* apply separated by a comma.
+* The syntax of one filter is `attributeName` followed by `operand` followed by `value`.
+* Supported operands are `<`, `<=`, `=`, `>` and `>=`.
+* You can have multiple conditions on one attribute like for example numericFilters=price>100,price<1000.
+* You can also use an array (for example numericFilters: ["price>100","price<1000"]).
+* - tagFilters: filter the query by a set of tags. You can AND tags by separating them by commas.
+* To OR tags, you must add parentheses. For example, tags=tag1,(tag2,tag3) means tag1 AND (tag2 OR tag3).
+* You can also use an array, for example tagFilters: ["tag1",["tag2","tag3"]]
+* means tag1 AND (tag2 OR tag3).
+* At indexing, tags should be added in the _tags** attribute
+* of objects (for example {"_tags":["tag1","tag2"]}).+* - facetFilters: filter the query by a list of facets.
+* Facets are separated by commas and each facet is encoded as `attributeName:value`.
+* For example: `facetFilters=category:Book,author:John%20Doe`.
+* You can also use an array (for example `["category:Book","author:John%20Doe"]`).
+* - facets: List of object attributes that you want to use for faceting.
+* Comma separated list: `"category,author"` or array `['category','author']`
+* Only attributes that have been added in **attributesForFaceting** index setting
+* can be used in this parameter.
+* You can also use `*` to perform faceting on all attributes specified in **attributesForFaceting**.
+* - queryType: select how the query words are interpreted, it can be one of the following value:
+* - prefixAll: all query words are interpreted as prefixes,
+* - prefixLast: only the last word is interpreted as a prefix (default behavior),
+* - prefixNone: no query word is interpreted as a prefix. This option is not recommended.
+* - optionalWords: a string that contains the list of words that should
+* be considered as optional when found in the query.
+* Comma separated and array are accepted.
+* - distinct: If set to 1, enable the distinct feature (disabled by default)
+* if the attributeForDistinct index setting is set.
+* This feature is similar to the SQL "distinct" keyword: when enabled
+* in a query with the distinct=1 parameter,
+* all hits containing a duplicate value for the attributeForDistinct attribute are removed from results.
+* For example, if the chosen attribute is show_name and several hits have
+* the same value for show_name, then only the best
+* one is kept and others are removed.
+* - restrictSearchableAttributes: List of attributes you want to use for
+* textual search (must be a subset of the attributesToIndex index setting)
+* either comma separated or as an array
+* @param {function} [callback] the result callback called with two arguments:+* error: null or Error('message'). If false, the content contains the error.+* content: the server answer that contains the list of results.
+*/
+IndexCore.prototype.search = buildSearchMethod('query');+
+/*
+* -- BETA --
+* Search a record similar to the query inside the index using XMLHttpRequest request (Using a POST query to
+* minimize number of OPTIONS queries: Cross-Origin Resource Sharing).
+*
+* @param {string} [query] the similar query+* @param {object} [args] (optional) if set, contains an object with query parameters.+* All search parameters are supported (see search function), restrictSearchableAttributes and facetFilters
+* are the two most useful to restrict the similar results and get more relevant content
+*/
+IndexCore.prototype.similarSearch = buildSearchMethod('similarQuery');+
+/*
+* Browse index content. The response content will have a `cursor` property that you can use
+* to browse subsequent pages for this query. Use `index.browseFrom(cursor)` when you want.
+*
+* @param {string} query - The full text query+* @param {Object} [queryParameters] - Any search query parameter+* @param {Function} [callback] - The result callback called with two arguments+* error: null or Error('message')+* content: the server answer with the browse result
+* @return {Promise|undefined} Returns a promise if no callback given+* @example
+* index.browse('cool songs', {+* tagFilters: 'public,comments',
+* hitsPerPage: 500
+* }, callback);
+* @see {@link https://www.algolia.com/doc/rest_api#Browse|Algolia REST API Documentation}+*/
+IndexCore.prototype.browse = function(query, queryParameters, callback) {+ var merge = __webpack_require__(32);
+
+ var indexObj = this;
+
+ var page;
+ var hitsPerPage;
+
+ // we check variadic calls that are not the one defined
+ // .browse()/.browse(fn)
+ // => page = 0
+ if (arguments.length === 0 || arguments.length === 1 && typeof arguments[0] === 'function') {+ page = 0;
+ callback = arguments[0];
+ query = undefined;
+ } else if (typeof arguments[0] === 'number') {+ // .browse(2)/.browse(2, 10)/.browse(2, fn)/.browse(2, 10, fn)
+ page = arguments[0];
+ if (typeof arguments[1] === 'number') {+ hitsPerPage = arguments[1];
+ } else if (typeof arguments[1] === 'function') {+ callback = arguments[1];
+ hitsPerPage = undefined;
+ }
+ query = undefined;
+ queryParameters = undefined;
+ } else if (typeof arguments[0] === 'object') {+ // .browse(queryParameters)/.browse(queryParameters, cb)
+ if (typeof arguments[1] === 'function') {+ callback = arguments[1];
+ }
+ queryParameters = arguments[0];
+ query = undefined;
+ } else if (typeof arguments[0] === 'string' && typeof arguments[1] === 'function') {+ // .browse(query, cb)
+ callback = arguments[1];
+ queryParameters = undefined;
+ }
+
+ // otherwise it's a .browse(query)/.browse(query, queryParameters)/.browse(query, queryParameters, cb)
+
+ // get search query parameters combining various possible calls
+ // to .browse();
+ queryParameters = merge({}, queryParameters || {}, {+ page: page,
+ hitsPerPage: hitsPerPage,
+ query: query
+ });
+
+ var params = this.as._getSearchParams(queryParameters, '');
+
+ return this.as._jsonRequest({+ method: 'POST',
+ url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/browse',
+ body: {params: params},+ hostType: 'read',
+ callback: callback
+ });
+};
+
+/*
+* Continue browsing from a previous position (cursor), obtained via a call to `.browse()`.
+*
+* @param {string} query - The full text query+* @param {Object} [queryParameters] - Any search query parameter+* @param {Function} [callback] - The result callback called with two arguments+* error: null or Error('message')+* content: the server answer with the browse result
+* @return {Promise|undefined} Returns a promise if no callback given+* @example
+* index.browseFrom('14lkfsakl32', callback);+* @see {@link https://www.algolia.com/doc/rest_api#Browse|Algolia REST API Documentation}+*/
+IndexCore.prototype.browseFrom = function(cursor, callback) {+ return this.as._jsonRequest({+ method: 'POST',
+ url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/browse',
+ body: {cursor: cursor},+ hostType: 'read',
+ callback: callback
+ });
+};
+
+/*
+* Search for facet values
+* https://www.algolia.com/doc/rest-api/search#search-for-facet-values
+*
+* @param {string} params.facetName Facet name, name of the attribute to search for values in.+* Must be declared as a facet
+* @param {string} params.facetQuery Query for the facet search+* @param {string} [params.*] Any search parameter of Algolia,+* see https://www.algolia.com/doc/api-client/javascript/search#search-parameters
+* Pagination is not supported. The page and hitsPerPage parameters will be ignored.
+* @param callback (optional)
+*/
+IndexCore.prototype.searchForFacetValues = function(params, callback) {+ var clone = __webpack_require__(4);
+ var omit = __webpack_require__(33);
+ var usage = 'Usage: index.searchForFacetValues({facetName, facetQuery, ...params}[, callback])';+
+ if (params.facetName === undefined || params.facetQuery === undefined) {+ throw new Error(usage);
+ }
+
+ var facetName = params.facetName;
+ var filteredParams = omit(clone(params), function(keyName) {+ return keyName === 'facetName';
+ });
+ var searchParameters = this.as._getSearchParams(filteredParams, '');
+
+ return this.as._jsonRequest({+ method: 'POST',
+ url: '/1/indexes/' +
+ encodeURIComponent(this.indexName) + '/facets/' + encodeURIComponent(facetName) + '/query',
+ hostType: 'read',
+ body: {params: searchParameters},+ callback: callback
+ });
+};
+
+IndexCore.prototype.searchFacet = deprecate(function(params, callback) {+ return this.searchForFacetValues(params, callback);
+}, deprecatedMessage(
+ 'index.searchFacet(params[, callback])',
+ 'index.searchForFacetValues(params[, callback])'
+));
+
+IndexCore.prototype._search = function(params, url, callback, additionalUA) {+ return this.as._jsonRequest({+ cache: this.cache,
+ method: 'POST',
+ url: url || '/1/indexes/' + encodeURIComponent(this.indexName) + '/query',
+ body: {params: params},+ hostType: 'read',
+ fallback: {+ method: 'GET',
+ url: '/1/indexes/' + encodeURIComponent(this.indexName),
+ body: {params: params}+ },
+ callback: callback,
+ additionalUA: additionalUA
+ });
+};
+
+/*
+* Get an object from this index
+*
+* @param objectID the unique identifier of the object to retrieve
+* @param attrs (optional) if set, contains the array of attribute names to retrieve
+* @param callback (optional) the result callback called with two arguments
+* error: null or Error('message')+* content: the object to retrieve or the error message if a failure occured
+*/
+IndexCore.prototype.getObject = function(objectID, attrs, callback) {+ var indexObj = this;
+
+ if (arguments.length === 1 || typeof attrs === 'function') {+ callback = attrs;
+ attrs = undefined;
+ }
+
+ var params = '';
+ if (attrs !== undefined) {+ params = '?attributes=';
+ for (var i = 0; i < attrs.length; ++i) {+ if (i !== 0) {+ params += ',';
+ }
+ params += attrs[i];
+ }
+ }
+
+ return this.as._jsonRequest({+ method: 'GET',
+ url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(objectID) + params,
+ hostType: 'read',
+ callback: callback
+ });
+};
+
+/*
+* Get several objects from this index
+*
+* @param objectIDs the array of unique identifier of objects to retrieve
+*/
+IndexCore.prototype.getObjects = function(objectIDs, attributesToRetrieve, callback) {+ var isArray = __webpack_require__(10);
+ var map = __webpack_require__(7);
+
+ var usage = 'Usage: index.getObjects(arrayOfObjectIDs[, callback])';
+
+ if (!isArray(objectIDs)) {+ throw new Error(usage);
+ }
+
+ var indexObj = this;
+
+ if (arguments.length === 1 || typeof attributesToRetrieve === 'function') {+ callback = attributesToRetrieve;
+ attributesToRetrieve = undefined;
+ }
+
+ var body = {+ requests: map(objectIDs, function prepareRequest(objectID) {+ var request = {+ indexName: indexObj.indexName,
+ objectID: objectID
+ };
+
+ if (attributesToRetrieve) {+ request.attributesToRetrieve = attributesToRetrieve.join(',');+ }
+
+ return request;
+ })
+ };
+
+ return this.as._jsonRequest({+ method: 'POST',
+ url: '/1/indexes/*/objects',
+ hostType: 'read',
+ body: body,
+ callback: callback
+ });
+};
+
+IndexCore.prototype.as = null;
+IndexCore.prototype.indexName = null;
+IndexCore.prototype.typeAheadArgs = null;
+IndexCore.prototype.typeAheadValueOption = null;
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var AlgoliaSearchCore = __webpack_require__(22);
+var createAlgoliasearch = __webpack_require__(25);
+
+module.exports = createAlgoliasearch(AlgoliaSearchCore, '(lite) ');
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var global = __webpack_require__(52);
+var Promise = global.Promise || __webpack_require__(51).Promise;
+
+// This is the standalone browser build entry point
+// Browser implementation of the Algolia Search JavaScript client,
+// using XMLHttpRequest, XDomainRequest and JSONP as fallback
+module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) {+ var inherits = __webpack_require__(20);
+ var errors = __webpack_require__(5);
+ var inlineHeaders = __webpack_require__(27);
+ var jsonpRequest = __webpack_require__(28);
+ var places = __webpack_require__(34);
+ uaSuffix = uaSuffix || '';
+
+ if (false) {+ require('debug').enable('algoliasearch*');+ }
+
+ function algoliasearch(applicationID, apiKey, opts) {+ var cloneDeep = __webpack_require__(4);
+
+ var getDocumentProtocol = __webpack_require__(26);
+
+ opts = cloneDeep(opts || {});+
+ if (opts.protocol === undefined) {+ opts.protocol = getDocumentProtocol();
+ }
+
+ opts._ua = opts._ua || algoliasearch.ua;
+
+ return new AlgoliaSearchBrowser(applicationID, apiKey, opts);
+ }
+
+ algoliasearch.version = __webpack_require__(36);
+ algoliasearch.ua = 'Algolia for vanilla JavaScript ' + uaSuffix + algoliasearch.version;
+ algoliasearch.initPlaces = places(algoliasearch);
+
+ // we expose into window no matter how we are used, this will allow
+ // us to easily debug any website running algolia
+ global.__algolia = {+ debug: __webpack_require__(6),
+ algoliasearch: algoliasearch
+ };
+
+ var support = {+ hasXMLHttpRequest: 'XMLHttpRequest' in global,
+ hasXDomainRequest: 'XDomainRequest' in global
+ };
+
+ if (support.hasXMLHttpRequest) {+ support.cors = 'withCredentials' in new XMLHttpRequest();
+ }
+
+ function AlgoliaSearchBrowser() {+ // call AlgoliaSearch constructor
+ AlgoliaSearch.apply(this, arguments);
+ }
+
+ inherits(AlgoliaSearchBrowser, AlgoliaSearch);
+
+ AlgoliaSearchBrowser.prototype._request = function request(url, opts) {+ return new Promise(function wrapRequest(resolve, reject) {+ // no cors or XDomainRequest, no request
+ if (!support.cors && !support.hasXDomainRequest) {+ // very old browser, not supported
+ reject(new errors.Network('CORS not supported'));+ return;
+ }
+
+ url = inlineHeaders(url, opts.headers);
+
+ var body = opts.body;
+ var req = support.cors ? new XMLHttpRequest() : new XDomainRequest();
+ var reqTimeout;
+ var timedOut;
+ var connected = false;
+
+ reqTimeout = setTimeout(onTimeout, opts.timeouts.connect);
+ // we set an empty onprogress listener
+ // so that XDomainRequest on IE9 is not aborted
+ // refs:
+ // - https://github.com/algolia/algoliasearch-client-js/issues/76
+ // - https://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified?forum=iewebdevelopment
+ req.onprogress = onProgress;
+ if ('onreadystatechange' in req) req.onreadystatechange = onReadyStateChange;+ req.onload = onLoad;
+ req.onerror = onError;
+
+ // do not rely on default XHR async flag, as some analytics code like hotjar
+ // breaks it and set it to false by default
+ if (req instanceof XMLHttpRequest) {+ req.open(opts.method, url, true);
+ } else {+ req.open(opts.method, url);
+ }
+
+ // headers are meant to be sent after open
+ if (support.cors) {+ if (body) {+ if (opts.method === 'POST') {+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requests
+ req.setRequestHeader('content-type', 'application/x-www-form-urlencoded');+ } else {+ req.setRequestHeader('content-type', 'application/json');+ }
+ }
+ req.setRequestHeader('accept', 'application/json');+ }
+
+ req.send(body);
+
+ // event object not received in IE8, at least
+ // but we do not use it, still important to note
+ function onLoad(/* event */) {+ // When browser does not supports req.timeout, we can
+ // have both a load and timeout event, since handled by a dumb setTimeout
+ if (timedOut) {+ return;
+ }
+
+ clearTimeout(reqTimeout);
+
+ var out;
+
+ try {+ out = {+ body: JSON.parse(req.responseText),
+ responseText: req.responseText,
+ statusCode: req.status,
+ // XDomainRequest does not have any response headers
+ headers: req.getAllResponseHeaders && req.getAllResponseHeaders() || {}+ };
+ } catch (e) {+ out = new errors.UnparsableJSON({+ more: req.responseText
+ });
+ }
+
+ if (out instanceof errors.UnparsableJSON) {+ reject(out);
+ } else {+ resolve(out);
+ }
+ }
+
+ function onError(event) {+ if (timedOut) {+ return;
+ }
+
+ clearTimeout(reqTimeout);
+
+ // error event is trigerred both with XDR/XHR on:
+ // - DNS error
+ // - unallowed cross domain request
+ reject(
+ new errors.Network({+ more: event
+ })
+ );
+ }
+
+ function onTimeout() {+ timedOut = true;
+ req.abort();
+
+ reject(new errors.RequestTimeout());
+ }
+
+ function onConnect() {+ connected = true;
+ clearTimeout(reqTimeout);
+ reqTimeout = setTimeout(onTimeout, opts.timeouts.complete);
+ }
+
+ function onProgress() {+ if (!connected) onConnect();
+ }
+
+ function onReadyStateChange() {+ if (!connected && req.readyState > 1) onConnect();
+ }
+ });
+ };
+
+ AlgoliaSearchBrowser.prototype._request.fallback = function requestFallback(url, opts) {+ url = inlineHeaders(url, opts.headers);
+
+ return new Promise(function wrapJsonpRequest(resolve, reject) {+ jsonpRequest(url, opts, function jsonpRequestDone(err, content) {+ if (err) {+ reject(err);
+ return;
+ }
+
+ resolve(content);
+ });
+ });
+ };
+
+ AlgoliaSearchBrowser.prototype._promise = {+ reject: function rejectPromise(val) {+ return Promise.reject(val);
+ },
+ resolve: function resolvePromise(val) {+ return Promise.resolve(val);
+ },
+ delay: function delayPromise(ms) {+ return new Promise(function resolveOnTimeout(resolve/* , reject*/) {+ setTimeout(resolve, ms);
+ });
+ }
+ };
+
+ return algoliasearch;
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+module.exports = getDocumentProtocol;
+
+function getDocumentProtocol() {+ var protocol = window.document.location.protocol;
+
+ // when in `file:` mode (local html file), default to `http:`
+ if (protocol !== 'http:' && protocol !== 'https:') {+ protocol = 'http:';
+ }
+
+ return protocol;
+}
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+module.exports = inlineHeaders;
+
+var encode = __webpack_require__(65);
+
+function inlineHeaders(url, headers) {+ if (/\?/.test(url)) {+ url += '&';
+ } else {+ url += '?';
+ }
+
+ return url + encode(headers);
+}
+
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+module.exports = jsonpRequest;
+
+var errors = __webpack_require__(5);
+
+var JSONPCounter = 0;
+
+function jsonpRequest(url, opts, cb) {+ if (opts.method !== 'GET') {+ cb(new Error('Method ' + opts.method + ' ' + url + ' is not supported by JSONP.'));+ return;
+ }
+
+ opts.debug('JSONP: start');+
+ var cbCalled = false;
+ var timedOut = false;
+
+ JSONPCounter += 1;
+ var head = document.getElementsByTagName('head')[0];+ var script = document.createElement('script');+ var cbName = 'algoliaJSONP_' + JSONPCounter;
+ var done = false;
+
+ window[cbName] = function(data) {+ removeGlobals();
+
+ if (timedOut) {+ opts.debug('JSONP: Late answer, ignoring');+ return;
+ }
+
+ cbCalled = true;
+
+ clean();
+
+ cb(null, {+ body: data/* ,
+ // We do not send the statusCode, there's no statusCode in JSONP, it will be
+ // computed using data.status && data.message like with XDR
+ statusCode*/
+ });
+ };
+
+ // add callback by hand
+ url += '&callback=' + cbName;
+
+ // add body params manually
+ if (opts.jsonBody && opts.jsonBody.params) {+ url += '&' + opts.jsonBody.params;
+ }
+
+ var ontimeout = setTimeout(timeout, opts.timeouts.complete);
+
+ // script onreadystatechange needed only for
+ // <= IE8
+ // https://github.com/angular/angular.js/issues/4523
+ script.onreadystatechange = readystatechange;
+ script.onload = success;
+ script.onerror = error;
+
+ script.async = true;
+ script.defer = true;
+ script.src = url;
+ head.appendChild(script);
+
+ function success() {+ opts.debug('JSONP: success');+
+ if (done || timedOut) {+ return;
+ }
+
+ done = true;
+
+ // script loaded but did not call the fn => script loading error
+ if (!cbCalled) {+ opts.debug('JSONP: Fail. Script loaded but did not call the callback');+ clean();
+ cb(new errors.JSONPScriptFail());
+ }
+ }
+
+ function readystatechange() {+ if (this.readyState === 'loaded' || this.readyState === 'complete') {+ success();
+ }
+ }
+
+ function clean() {+ clearTimeout(ontimeout);
+ script.onload = null;
+ script.onreadystatechange = null;
+ script.onerror = null;
+ head.removeChild(script);
+ }
+
+ function removeGlobals() {+ try {+ delete window[cbName];
+ delete window[cbName + '_loaded'];
+ } catch (e) {+ window[cbName] = window[cbName + '_loaded'] = undefined;
+ }
+ }
+
+ function timeout() {+ opts.debug('JSONP: Script timeout');+ timedOut = true;
+ clean();
+ cb(new errors.RequestTimeout());
+ }
+
+ function error() {+ opts.debug('JSONP: Script error');+
+ if (done || timedOut) {+ return;
+ }
+
+ clean();
+ cb(new errors.JSONPScriptError());
+ }
+}
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports) {+
+module.exports = function deprecate(fn, message) {+ var warned = false;
+
+ function deprecated() {+ if (!warned) {+ /* eslint no-console:0 */
+ console.log(message);
+ warned = true;
+ }
+
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+};
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports) {+
+module.exports = function deprecatedMessage(previousUsage, newUsage) {+ var githubAnchorLink = previousUsage.toLowerCase()
+ .replace('.', '')+ .replace('()', '');+
+ return 'algoliasearch: `' + previousUsage + '` was replaced by `' + newUsage +
+ '`. Please see https://github.com/algolia/algoliasearch-client-js/wiki/Deprecated#' + githubAnchorLink;
+};
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports) {+
+// Parse cloud does not supports setTimeout
+// We do not store a setTimeout reference in the client everytime
+// We only fallback to a fake setTimeout when not available
+// setTimeout cannot be override globally sadly
+module.exports = function exitPromise(fn, _setTimeout) {+ _setTimeout(fn, 0);
+};
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {+
+var foreach = __webpack_require__(2);
+
+module.exports = function merge(destination/* , sources */) {+ var sources = Array.prototype.slice.call(arguments);
+
+ foreach(sources, function(source) {+ for (var keyName in source) {+ if (source.hasOwnProperty(keyName)) {+ if (typeof destination[keyName] === 'object' && typeof source[keyName] === 'object') {+ destination[keyName] = merge({}, destination[keyName], source[keyName]);+ } else if (source[keyName] !== undefined) {+ destination[keyName] = source[keyName];
+ }
+ }
+ }
+ });
+
+ return destination;
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {+
+module.exports = function omit(obj, test) {+ var keys = __webpack_require__(63);
+ var foreach = __webpack_require__(2);
+
+ var filtered = {};+
+ foreach(keys(obj), function doFilter(keyName) {+ if (test(keyName) !== true) {+ filtered[keyName] = obj[keyName];
+ }
+ });
+
+ return filtered;
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {+
+module.exports = createPlacesClient;
+
+var buildSearchMethod = __webpack_require__(12);
+
+function createPlacesClient(algoliasearch) {+ return function places(appID, apiKey, opts) {+ var cloneDeep = __webpack_require__(4);
+
+ opts = opts && cloneDeep(opts) || {};+ opts.hosts = opts.hosts || [
+ 'places-dsn.algolia.net',
+ 'places-1.algolianet.com',
+ 'places-2.algolianet.com',
+ 'places-3.algolianet.com'
+ ];
+
+ // allow initPlaces() no arguments => community rate limited
+ if (arguments.length === 0 || typeof appID === 'object' || appID === undefined) {+ appID = '';
+ apiKey = '';
+ opts._allowEmptyCredentials = true;
+ }
+
+ var client = algoliasearch(appID, apiKey, opts);
+ var index = client.initIndex('places');+ index.search = buildSearchMethod('query', '/1/places/query');+ return index;
+ };
+}
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __webpack_require__) {+
+/* WEBPACK VAR INJECTION */(function(global) {var debug = __webpack_require__(6)('algoliasearch:src/hostIndexState.js');+var localStorageNamespace = 'algoliasearch-client-js';
+
+var store;
+var moduleStore = {+ state: {},+ set: function(key, data) {+ this.state[key] = data;
+ return this.state[key];
+ },
+ get: function(key) {+ return this.state[key] || null;
+ }
+};
+
+var localStorageStore = {+ set: function(key, data) {+ moduleStore.set(key, data); // always replicate localStorageStore to moduleStore in case of failure
+
+ try {+ var namespace = JSON.parse(global.localStorage[localStorageNamespace]);
+ namespace[key] = data;
+ global.localStorage[localStorageNamespace] = JSON.stringify(namespace);
+ return namespace[key];
+ } catch (e) {+ return localStorageFailure(key, e);
+ }
+ },
+ get: function(key) {+ try {+ return JSON.parse(global.localStorage[localStorageNamespace])[key] || null;
+ } catch (e) {+ return localStorageFailure(key, e);
+ }
+ }
+};
+
+function localStorageFailure(key, e) {+ debug('localStorage failed with', e);+ cleanup();
+ store = moduleStore;
+ return store.get(key);
+}
+
+store = supportsLocalStorage() ? localStorageStore : moduleStore;
+
+module.exports = {+ get: getOrSet,
+ set: getOrSet,
+ supportsLocalStorage: supportsLocalStorage
+};
+
+function getOrSet(key, data) {+ if (arguments.length === 1) {+ return store.get(key);
+ }
+
+ return store.set(key, data);
+}
+
+function supportsLocalStorage() {+ try {+ if ('localStorage' in global &&+ global.localStorage !== null) {+ if (!global.localStorage[localStorageNamespace]) {+ // actual creation of the namespace
+ global.localStorage.setItem(localStorageNamespace, JSON.stringify({}));+ }
+ return true;
+ }
+
+ return false;
+ } catch (_) {+ return false;
+ }
+}
+
+// In case of any error on localStorage, we clean our own namespace, this should handle
+// quota errors when a lot of keys + data are used
+function cleanup() {+ try {+ global.localStorage.removeItem(localStorageNamespace);
+ } catch (_) {+ // nothing to do
+ }
+}
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+module.exports = '3.22.1';
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+module.exports = __webpack_require__(45);
+
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var datasetKey = 'aaDataset';
+var valueKey = 'aaValue';
+var datumKey = 'aaDatum';
+
+var _ = __webpack_require__(0);
+var DOM = __webpack_require__(1);
+var html = __webpack_require__(14);
+var css = __webpack_require__(8);
+var EventEmitter = __webpack_require__(9);
+
+// constructor
+// -----------
+
+function Dataset(o) {+ o = o || {};+ o.templates = o.templates || {};+
+ if (!o.source) {+ _.error('missing source');+ }
+
+ if (o.name && !isValidName(o.name)) {+ _.error('invalid dataset name: ' + o.name);+ }
+
+ // tracks the last query the dataset was updated for
+ this.query = null;
+ this._isEmpty = true;
+
+ this.highlight = !!o.highlight;
+ this.name = typeof o.name === 'undefined' || o.name === null ? _.getUniqueId() : o.name;
+
+ this.source = o.source;
+ this.displayFn = getDisplayFn(o.display || o.displayKey);
+
+ this.templates = getTemplates(o.templates, this.displayFn);
+
+ this.css = _.mixin({}, css, o.appendTo ? css.appendTo : {});+ this.cssClasses = o.cssClasses = _.mixin({}, css.defaultClasses, o.cssClasses || {});+ this.cssClasses.prefix =
+ o.cssClasses.formattedPrefix || _.formatPrefix(this.cssClasses.prefix, this.cssClasses.noPrefix);
+
+ var clazz = _.className(this.cssClasses.prefix, this.cssClasses.dataset);
+ this.$el = o.$menu && o.$menu.find(clazz + '-' + this.name).length > 0 ?
+ DOM.element(o.$menu.find(clazz + '-' + this.name)[0]) :
+ DOM.element(
+ html.dataset.replace('%CLASS%', this.name)+ .replace('%PREFIX%', this.cssClasses.prefix)+ .replace('%DATASET%', this.cssClasses.dataset)+ );
+
+ this.$menu = o.$menu;
+}
+
+// static methods
+// --------------
+
+Dataset.extractDatasetName = function extractDatasetName(el) {+ return DOM.element(el).data(datasetKey);
+};
+
+Dataset.extractValue = function extractValue(el) {+ return DOM.element(el).data(valueKey);
+};
+
+Dataset.extractDatum = function extractDatum(el) {+ var datum = DOM.element(el).data(datumKey);
+ if (typeof datum === 'string') {+ // Zepto has an automatic deserialization of the
+ // JSON encoded data attribute
+ datum = JSON.parse(datum);
+ }
+ return datum;
+};
+
+// instance methods
+// ----------------
+
+_.mixin(Dataset.prototype, EventEmitter, {+
+ // ### private
+
+ _render: function render(query, suggestions) {+ if (!this.$el) {+ return;
+ }
+ var that = this;
+
+ var hasSuggestions;
+ var renderArgs = [].slice.call(arguments, 2);
+ this.$el.empty();
+
+ hasSuggestions = suggestions && suggestions.length;
+ this._isEmpty = !hasSuggestions;
+
+ if (!hasSuggestions && this.templates.empty) {+ this.$el
+ .html(getEmptyHtml.apply(this, renderArgs))
+ .prepend(that.templates.header ? getHeaderHtml.apply(this, renderArgs) : null)
+ .append(that.templates.footer ? getFooterHtml.apply(this, renderArgs) : null);
+ } else if (hasSuggestions) {+ this.$el
+ .html(getSuggestionsHtml.apply(this, renderArgs))
+ .prepend(that.templates.header ? getHeaderHtml.apply(this, renderArgs) : null)
+ .append(that.templates.footer ? getFooterHtml.apply(this, renderArgs) : null);
+ }
+
+ if (this.$menu) {+ this.$menu.addClass(
+ this.cssClasses.prefix + (hasSuggestions ? 'with' : 'without') + '-' + this.name
+ ).removeClass(
+ this.cssClasses.prefix + (hasSuggestions ? 'without' : 'with') + '-' + this.name
+ );
+ }
+
+ this.trigger('rendered', query);+
+ function getEmptyHtml() {+ var args = [].slice.call(arguments, 0);
+ args = [{query: query, isEmpty: true}].concat(args);+ return that.templates.empty.apply(this, args);
+ }
+
+ function getSuggestionsHtml() {+ var args = [].slice.call(arguments, 0);
+ var $suggestions;
+ var nodes;
+ var self = this;
+
+ var suggestionsHtml = html.suggestions.
+ replace('%PREFIX%', this.cssClasses.prefix).+ replace('%SUGGESTIONS%', this.cssClasses.suggestions);+ $suggestions = DOM
+ .element(suggestionsHtml)
+ .css(this.css.suggestions);
+
+ // jQuery#append doesn't support arrays as the first argument
+ // until version 1.8, see http://bugs.jquery.com/ticket/11231
+ nodes = _.map(suggestions, getSuggestionNode);
+ $suggestions.append.apply($suggestions, nodes);
+
+ return $suggestions;
+
+ function getSuggestionNode(suggestion) {+ var $el;
+
+ var suggestionHtml = html.suggestion.
+ replace('%PREFIX%', self.cssClasses.prefix).+ replace('%SUGGESTION%', self.cssClasses.suggestion);+ $el = DOM.element(suggestionHtml)
+ .attr({+ role: 'option',
+ id: ['option', Math.floor(Math.random() * 100000000)].join('-')+ })
+ .append(that.templates.suggestion.apply(this, [suggestion].concat(args)));
+
+ $el.data(datasetKey, that.name);
+ $el.data(valueKey, that.displayFn(suggestion) || undefined); // this led to undefined return value
+ $el.data(datumKey, JSON.stringify(suggestion));
+ $el.children().each(function() { DOM.element(this).css(self.css.suggestionChild); });+
+ return $el;
+ }
+ }
+
+ function getHeaderHtml() {+ var args = [].slice.call(arguments, 0);
+ args = [{query: query, isEmpty: !hasSuggestions}].concat(args);+ return that.templates.header.apply(this, args);
+ }
+
+ function getFooterHtml() {+ var args = [].slice.call(arguments, 0);
+ args = [{query: query, isEmpty: !hasSuggestions}].concat(args);+ return that.templates.footer.apply(this, args);
+ }
+ },
+
+ // ### public
+
+ getRoot: function getRoot() {+ return this.$el;
+ },
+
+ update: function update(query) {+ var that = this;
+
+ this.query = query;
+ this.canceled = false;
+ this.source(query, render);
+
+ function render(suggestions) {+ // if the update has been canceled or if the query has changed
+ // do not render the suggestions as they've become outdated
+ if (!that.canceled && query === that.query) {+ // concat all the other arguments that could have been passed
+ // to the render function, and forward them to _render
+ var args = [].slice.call(arguments, 1);
+ args = [query, suggestions].concat(args);
+ that._render.apply(that, args);
+ }
+ }
+ },
+
+ cancel: function cancel() {+ this.canceled = true;
+ },
+
+ clear: function clear() {+ this.cancel();
+ this.$el.empty();
+ this.trigger('rendered', '');+ },
+
+ isEmpty: function isEmpty() {+ return this._isEmpty;
+ },
+
+ destroy: function destroy() {+ this.$el = null;
+ }
+});
+
+// helper functions
+// ----------------
+
+function getDisplayFn(display) {+ display = display || 'value';
+
+ return _.isFunction(display) ? display : displayFn;
+
+ function displayFn(obj) {+ return obj[display];
+ }
+}
+
+function getTemplates(templates, displayFn) {+ return {+ empty: templates.empty && _.templatify(templates.empty),
+ header: templates.header && _.templatify(templates.header),
+ footer: templates.footer && _.templatify(templates.footer),
+ suggestion: templates.suggestion || suggestionTemplate
+ };
+
+ function suggestionTemplate(context) {+ return '<p>' + displayFn(context) + '</p>';
+ }
+}
+
+function isValidName(str) {+ // dashes, underscores, letters, and numbers
+ return (/^[_a-zA-Z0-9-]+$/).test(str);
+}
+
+module.exports = Dataset;
+
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var _ = __webpack_require__(0);
+var DOM = __webpack_require__(1);
+var EventEmitter = __webpack_require__(9);
+var Dataset = __webpack_require__(38);
+var css = __webpack_require__(8);
+
+// constructor
+// -----------
+
+function Dropdown(o) {+ var that = this;
+ var onSuggestionClick;
+ var onSuggestionMouseEnter;
+ var onSuggestionMouseLeave;
+
+ o = o || {};+
+ if (!o.menu) {+ _.error('menu is required');+ }
+
+ if (!_.isArray(o.datasets) && !_.isObject(o.datasets)) {+ _.error('1 or more datasets required');+ }
+ if (!o.datasets) {+ _.error('datasets is required');+ }
+
+ this.isOpen = false;
+ this.isEmpty = true;
+ this.minLength = o.minLength || 0;
+ this.templates = {};+ this.appendTo = o.appendTo || false;
+ this.css = _.mixin({}, css, o.appendTo ? css.appendTo : {});+ this.cssClasses = o.cssClasses = _.mixin({}, css.defaultClasses, o.cssClasses || {});+ this.cssClasses.prefix =
+ o.cssClasses.formattedPrefix || _.formatPrefix(this.cssClasses.prefix, this.cssClasses.noPrefix);
+
+ // bound functions
+ onSuggestionClick = _.bind(this._onSuggestionClick, this);
+ onSuggestionMouseEnter = _.bind(this._onSuggestionMouseEnter, this);
+ onSuggestionMouseLeave = _.bind(this._onSuggestionMouseLeave, this);
+
+ var cssClass = _.className(this.cssClasses.prefix, this.cssClasses.suggestion);
+ this.$menu = DOM.element(o.menu)
+ .on('click.aa', cssClass, onSuggestionClick)+ .on('mouseenter.aa', cssClass, onSuggestionMouseEnter)+ .on('mouseleave.aa', cssClass, onSuggestionMouseLeave);+
+ this.$container = o.appendTo ? o.wrapper : this.$menu;
+
+ if (o.templates && o.templates.header) {+ this.templates.header = _.templatify(o.templates.header);
+ this.$menu.prepend(this.templates.header());
+ }
+
+ if (o.templates && o.templates.empty) {+ this.templates.empty = _.templatify(o.templates.empty);
+ this.$empty = DOM.element('<div class="' ++ _.className(this.cssClasses.prefix, this.cssClasses.empty, true) + '">' +
+ '</div>');
+ this.$menu.append(this.$empty);
+ }
+
+ this.datasets = _.map(o.datasets, function(oDataset) {+ return initializeDataset(that.$menu, oDataset, o.cssClasses);
+ });
+ _.each(this.datasets, function(dataset) {+ var root = dataset.getRoot();
+ if (root && root.parent().length === 0) {+ that.$menu.append(root);
+ }
+ dataset.onSync('rendered', that._onRendered, that);+ });
+
+ if (o.templates && o.templates.footer) {+ this.templates.footer = _.templatify(o.templates.footer);
+ this.$menu.append(this.templates.footer());
+ }
+
+ var self = this;
+ DOM.element(window).resize(function() {+ self._redraw();
+ });
+}
+
+// instance methods
+// ----------------
+
+_.mixin(Dropdown.prototype, EventEmitter, {+
+ // ### private
+
+ _onSuggestionClick: function onSuggestionClick($e) {+ this.trigger('suggestionClicked', DOM.element($e.currentTarget));+ },
+
+ _onSuggestionMouseEnter: function onSuggestionMouseEnter($e) {+ var elt = DOM.element($e.currentTarget);
+ if (elt.hasClass(_.className(this.cssClasses.prefix, this.cssClasses.cursor, true))) {+ // we're already on the cursor
+ // => we're probably entering it again after leaving it for a nested div
+ return;
+ }
+ this._removeCursor();
+ this._setCursor(elt, false);
+ },
+
+ _onSuggestionMouseLeave: function onSuggestionMouseLeave($e) {+ // $e.relatedTarget is the `EventTarget` the pointing device entered to
+ if ($e.relatedTarget) {+ var elt = DOM.element($e.relatedTarget);
+ if (elt.closest('.' + _.className(this.cssClasses.prefix, this.cssClasses.cursor, true)).length > 0) {+ // our father is a cursor
+ // => it means we're just leaving the suggestion for a nested div
+ return;
+ }
+ }
+ this._removeCursor();
+ this.trigger('cursorRemoved');+ },
+
+ _onRendered: function onRendered(e, query) {+ this.isEmpty = _.every(this.datasets, isDatasetEmpty);
+
+ if (this.isEmpty) {+ if (query.length >= this.minLength) {+ this.trigger('empty');+ }
+
+ if (this.$empty) {+ if (query.length < this.minLength) {+ this._hide();
+ } else {+ var html = this.templates.empty({+ query: this.datasets[0] && this.datasets[0].query
+ });
+ this.$empty.html(html);
+ this._show();
+ }
+ } else if (_.any(this.datasets, hasEmptyTemplate)) {+ if (query.length < this.minLength) {+ this._hide();
+ } else {+ this._show();
+ }
+ } else {+ this._hide();
+ }
+ } else if (this.isOpen) {+ if (this.$empty) {+ this.$empty.empty();
+ }
+
+ if (query.length >= this.minLength) {+ this._show();
+ } else {+ this._hide();
+ }
+ }
+
+ this.trigger('datasetRendered');+
+ function isDatasetEmpty(dataset) {+ return dataset.isEmpty();
+ }
+
+ function hasEmptyTemplate(dataset) {+ return dataset.templates && dataset.templates.empty;
+ }
+ },
+
+ _hide: function() {+ this.$container.hide();
+ },
+
+ _show: function() {+ // can't use jQuery#show because $menu is a span element we want
+ // display: block; not dislay: inline;
+ this.$container.css('display', 'block');+
+ this._redraw();
+
+ this.trigger('shown');+ },
+
+ _redraw: function redraw() {+ if (!this.isOpen || !this.appendTo) return;
+
+ this.trigger('redrawn');+ },
+
+ _getSuggestions: function getSuggestions() {+ return this.$menu.find(_.className(this.cssClasses.prefix, this.cssClasses.suggestion));
+ },
+
+ _getCursor: function getCursor() {+ return this.$menu.find(_.className(this.cssClasses.prefix, this.cssClasses.cursor)).first();
+ },
+
+ _setCursor: function setCursor($el, updateInput) {+ $el.first()
+ .addClass(_.className(this.cssClasses.prefix, this.cssClasses.cursor, true))
+ .attr('aria-selected', 'true');+ this.trigger('cursorMoved', updateInput);+ },
+
+ _removeCursor: function removeCursor() {+ this._getCursor()
+ .removeClass(_.className(this.cssClasses.prefix, this.cssClasses.cursor, true))
+ .removeAttr('aria-selected');+ },
+
+ _moveCursor: function moveCursor(increment) {+ var $suggestions;
+ var $oldCursor;
+ var newCursorIndex;
+ var $newCursor;
+
+ if (!this.isOpen) {+ return;
+ }
+
+ $oldCursor = this._getCursor();
+ $suggestions = this._getSuggestions();
+
+ this._removeCursor();
+
+ // shifting before and after modulo to deal with -1 index
+ newCursorIndex = $suggestions.index($oldCursor) + increment;
+ newCursorIndex = (newCursorIndex + 1) % ($suggestions.length + 1) - 1;
+
+ if (newCursorIndex === -1) {+ this.trigger('cursorRemoved');+
+ return;
+ } else if (newCursorIndex < -1) {+ newCursorIndex = $suggestions.length - 1;
+ }
+
+ this._setCursor($newCursor = $suggestions.eq(newCursorIndex), true);
+
+ // in the case of scrollable overflow
+ // make sure the cursor is visible in the menu
+ this._ensureVisible($newCursor);
+ },
+
+ _ensureVisible: function ensureVisible($el) {+ var elTop;
+ var elBottom;
+ var menuScrollTop;
+ var menuHeight;
+
+ elTop = $el.position().top;
+ elBottom = elTop + $el.height() +
+ parseInt($el.css('margin-top'), 10) ++ parseInt($el.css('margin-bottom'), 10);+ menuScrollTop = this.$menu.scrollTop();
+ menuHeight = this.$menu.height() +
+ parseInt(this.$menu.css('paddingTop'), 10) ++ parseInt(this.$menu.css('paddingBottom'), 10);+
+ if (elTop < 0) {+ this.$menu.scrollTop(menuScrollTop + elTop);
+ } else if (menuHeight < elBottom) {+ this.$menu.scrollTop(menuScrollTop + (elBottom - menuHeight));
+ }
+ },
+
+ // ### public
+
+ close: function close() {+ if (this.isOpen) {+ this.isOpen = false;
+
+ this._removeCursor();
+ this._hide();
+
+ this.trigger('closed');+ }
+ },
+
+ open: function open() {+ if (!this.isOpen) {+ this.isOpen = true;
+
+ if (!this.isEmpty) {+ this._show();
+ }
+
+ this.trigger('opened');+ }
+ },
+
+ setLanguageDirection: function setLanguageDirection(dir) {+ this.$menu.css(dir === 'ltr' ? this.css.ltr : this.css.rtl);
+ },
+
+ moveCursorUp: function moveCursorUp() {+ this._moveCursor(-1);
+ },
+
+ moveCursorDown: function moveCursorDown() {+ this._moveCursor(+1);
+ },
+
+ getDatumForSuggestion: function getDatumForSuggestion($el) {+ var datum = null;
+
+ if ($el.length) {+ datum = {+ raw: Dataset.extractDatum($el),
+ value: Dataset.extractValue($el),
+ datasetName: Dataset.extractDatasetName($el)
+ };
+ }
+
+ return datum;
+ },
+
+ getCurrentCursor: function getCurrentCursor() {+ return this._getCursor().first();
+ },
+
+ getDatumForCursor: function getDatumForCursor() {+ return this.getDatumForSuggestion(this._getCursor().first());
+ },
+
+ getDatumForTopSuggestion: function getDatumForTopSuggestion() {+ return this.getDatumForSuggestion(this._getSuggestions().first());
+ },
+
+ cursorTopSuggestion: function cursorTopSuggestion() {+ this._setCursor(this._getSuggestions().first(), false);
+ },
+
+ update: function update(query) {+ _.each(this.datasets, updateDataset);
+
+ function updateDataset(dataset) {+ dataset.update(query);
+ }
+ },
+
+ empty: function empty() {+ _.each(this.datasets, clearDataset);
+ this.isEmpty = true;
+
+ function clearDataset(dataset) {+ dataset.clear();
+ }
+ },
+
+ isVisible: function isVisible() {+ return this.isOpen && !this.isEmpty;
+ },
+
+ destroy: function destroy() {+ this.$menu.off('.aa');+
+ this.$menu = null;
+
+ _.each(this.datasets, destroyDataset);
+
+ function destroyDataset(dataset) {+ dataset.destroy();
+ }
+ }
+});
+
+// helper functions
+// ----------------
+Dropdown.Dataset = Dataset;
+
+function initializeDataset($menu, oDataset, cssClasses) {+ return new Dropdown.Dataset(_.mixin({$menu: $menu, cssClasses: cssClasses}, oDataset));+}
+
+module.exports = Dropdown;
+
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var specialKeyCodeMap;
+
+specialKeyCodeMap = {+ 9: 'tab',
+ 27: 'esc',
+ 37: 'left',
+ 39: 'right',
+ 13: 'enter',
+ 38: 'up',
+ 40: 'down'
+};
+
+var _ = __webpack_require__(0);
+var DOM = __webpack_require__(1);
+var EventEmitter = __webpack_require__(9);
+
+// constructor
+// -----------
+
+function Input(o) {+ var that = this;
+ var onBlur;
+ var onFocus;
+ var onKeydown;
+ var onInput;
+
+ o = o || {};+
+ if (!o.input) {+ _.error('input is missing');+ }
+
+ // bound functions
+ onBlur = _.bind(this._onBlur, this);
+ onFocus = _.bind(this._onFocus, this);
+ onKeydown = _.bind(this._onKeydown, this);
+ onInput = _.bind(this._onInput, this);
+
+ this.$hint = DOM.element(o.hint);
+ this.$input = DOM.element(o.input)
+ .on('blur.aa', onBlur)+ .on('focus.aa', onFocus)+ .on('keydown.aa', onKeydown);+
+ // if no hint, noop all the hint related functions
+ if (this.$hint.length === 0) {+ this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;
+ }
+
+ // ie7 and ie8 don't support the input event
+ // ie9 doesn't fire the input event when characters are removed
+ // not sure if ie10 is compatible
+ if (!_.isMsie()) {+ this.$input.on('input.aa', onInput);+ } else {+ this.$input.on('keydown.aa keypress.aa cut.aa paste.aa', function($e) {+ // if a special key triggered this, ignore it
+ if (specialKeyCodeMap[$e.which || $e.keyCode]) {+ return;
+ }
+
+ // give the browser a chance to update the value of the input
+ // before checking to see if the query changed
+ _.defer(_.bind(that._onInput, that, $e));
+ });
+ }
+
+ // the query defaults to whatever the value of the input is
+ // on initialization, it'll most likely be an empty string
+ this.query = this.$input.val();
+
+ // helps with calculating the width of the input's value
+ this.$overflowHelper = buildOverflowHelper(this.$input);
+}
+
+// static methods
+// --------------
+
+Input.normalizeQuery = function(str) {+ // strips leading whitespace and condenses all whitespace
+ return (str || '').replace(/^\s*/g, '').replace(/\s{2,}/g, ' ');+};
+
+// instance methods
+// ----------------
+
+_.mixin(Input.prototype, EventEmitter, {+
+ // ### private
+
+ _onBlur: function onBlur() {+ this.resetInputValue();
+ this.$input.removeAttr('aria-activedescendant');+ this.trigger('blurred');+ },
+
+ _onFocus: function onFocus() {+ this.trigger('focused');+ },
+
+ _onKeydown: function onKeydown($e) {+ // which is normalized and consistent (but not for ie)
+ var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
+
+ this._managePreventDefault(keyName, $e);
+ if (keyName && this._shouldTrigger(keyName, $e)) {+ this.trigger(keyName + 'Keyed', $e);
+ }
+ },
+
+ _onInput: function onInput() {+ this._checkInputValue();
+ },
+
+ _managePreventDefault: function managePreventDefault(keyName, $e) {+ var preventDefault;
+ var hintValue;
+ var inputValue;
+
+ switch (keyName) {+ case 'tab':
+ hintValue = this.getHint();
+ inputValue = this.getInputValue();
+
+ preventDefault = hintValue &&
+ hintValue !== inputValue &&
+ !withModifier($e);
+ break;
+
+ case 'up':
+ case 'down':
+ preventDefault = !withModifier($e);
+ break;
+
+ default:
+ preventDefault = false;
+ }
+
+ if (preventDefault) {+ $e.preventDefault();
+ }
+ },
+
+ _shouldTrigger: function shouldTrigger(keyName, $e) {+ var trigger;
+
+ switch (keyName) {+ case 'tab':
+ trigger = !withModifier($e);
+ break;
+
+ default:
+ trigger = true;
+ }
+
+ return trigger;
+ },
+
+ _checkInputValue: function checkInputValue() {+ var inputValue;
+ var areEquivalent;
+ var hasDifferentWhitespace;
+
+ inputValue = this.getInputValue();
+ areEquivalent = areQueriesEquivalent(inputValue, this.query);
+ hasDifferentWhitespace = areEquivalent && this.query ?
+ this.query.length !== inputValue.length : false;
+
+ this.query = inputValue;
+
+ if (!areEquivalent) {+ this.trigger('queryChanged', this.query);+ } else if (hasDifferentWhitespace) {+ this.trigger('whitespaceChanged', this.query);+ }
+ },
+
+ // ### public
+
+ focus: function focus() {+ this.$input.focus();
+ },
+
+ blur: function blur() {+ this.$input.blur();
+ },
+
+ getQuery: function getQuery() {+ return this.query;
+ },
+
+ setQuery: function setQuery(query) {+ this.query = query;
+ },
+
+ getInputValue: function getInputValue() {+ return this.$input.val();
+ },
+
+ setInputValue: function setInputValue(value, silent) {+ if (typeof value === 'undefined') {+ value = this.query;
+ }
+ this.$input.val(value);
+
+ // silent prevents any additional events from being triggered
+ if (silent) {+ this.clearHint();
+ } else {+ this._checkInputValue();
+ }
+ },
+
+ expand: function expand() {+ this.$input.attr('aria-expanded', 'true');+ },
+
+ collapse: function collapse() {+ this.$input.attr('aria-expanded', 'false');+ },
+
+ setActiveDescendant: function setActiveDescendant(activedescendantId) {+ this.$input.attr('aria-activedescendant', activedescendantId);+ },
+
+ removeActiveDescendant: function removeActiveDescendant() {+ this.$input.removeAttr('aria-activedescendant');+ },
+
+ resetInputValue: function resetInputValue() {+ this.setInputValue(this.query, true);
+ },
+
+ getHint: function getHint() {+ return this.$hint.val();
+ },
+
+ setHint: function setHint(value) {+ this.$hint.val(value);
+ },
+
+ clearHint: function clearHint() {+ this.setHint('');+ },
+
+ clearHintIfInvalid: function clearHintIfInvalid() {+ var val;
+ var hint;
+ var valIsPrefixOfHint;
+ var isValid;
+
+ val = this.getInputValue();
+ hint = this.getHint();
+ valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
+ isValid = val !== '' && valIsPrefixOfHint && !this.hasOverflow();
+
+ if (!isValid) {+ this.clearHint();
+ }
+ },
+
+ getLanguageDirection: function getLanguageDirection() {+ return (this.$input.css('direction') || 'ltr').toLowerCase();+ },
+
+ hasOverflow: function hasOverflow() {+ // 2 is arbitrary, just picking a small number to handle edge cases
+ var constraint = this.$input.width() - 2;
+
+ this.$overflowHelper.text(this.getInputValue());
+
+ return this.$overflowHelper.width() >= constraint;
+ },
+
+ isCursorAtEnd: function() {+ var valueLength;
+ var selectionStart;
+ var range;
+
+ valueLength = this.$input.val().length;
+ selectionStart = this.$input[0].selectionStart;
+
+ if (_.isNumber(selectionStart)) {+ return selectionStart === valueLength;
+ } else if (document.selection) {+ // NOTE: this won't work unless the input has focus, the good news
+ // is this code should only get called when the input has focus
+ range = document.selection.createRange();
+ range.moveStart('character', -valueLength);+
+ return valueLength === range.text.length;
+ }
+
+ return true;
+ },
+
+ destroy: function destroy() {+ this.$hint.off('.aa');+ this.$input.off('.aa');+
+ this.$hint = this.$input = this.$overflowHelper = null;
+ }
+});
+
+// helper functions
+// ----------------
+
+function buildOverflowHelper($input) {+ return DOM.element('<pre aria-hidden="true"></pre>')+ .css({+ // position helper off-screen
+ position: 'absolute',
+ visibility: 'hidden',
+ // avoid line breaks and whitespace collapsing
+ whiteSpace: 'pre',
+ // use same font css as input to calculate accurate width
+ fontFamily: $input.css('font-family'),+ fontSize: $input.css('font-size'),+ fontStyle: $input.css('font-style'),+ fontVariant: $input.css('font-variant'),+ fontWeight: $input.css('font-weight'),+ wordSpacing: $input.css('word-spacing'),+ letterSpacing: $input.css('letter-spacing'),+ textIndent: $input.css('text-indent'),+ textRendering: $input.css('text-rendering'),+ textTransform: $input.css('text-transform')+ })
+ .insertAfter($input);
+}
+
+function areQueriesEquivalent(a, b) {+ return Input.normalizeQuery(a) === Input.normalizeQuery(b);
+}
+
+function withModifier($e) {+ return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;
+}
+
+module.exports = Input;
+
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var attrsKey = 'aaAttrs';
+
+var _ = __webpack_require__(0);
+var DOM = __webpack_require__(1);
+var EventBus = __webpack_require__(13);
+var Input = __webpack_require__(40);
+var Dropdown = __webpack_require__(39);
+var html = __webpack_require__(14);
+var css = __webpack_require__(8);
+
+// constructor
+// -----------
+
+// THOUGHT: what if datasets could dynamically be added/removed?
+function Typeahead(o) {+ var $menu;
+ var $hint;
+
+ o = o || {};+
+ if (!o.input) {+ _.error('missing input');+ }
+
+ this.isActivated = false;
+ this.debug = !!o.debug;
+ this.autoselect = !!o.autoselect;
+ this.autoselectOnBlur = !!o.autoselectOnBlur;
+ this.openOnFocus = !!o.openOnFocus;
+ this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
+ this.autoWidth = (o.autoWidth === undefined) ? true : !!o.autoWidth;
+
+ o.hint = !!o.hint;
+
+ if (o.hint && o.appendTo) {+ throw new Error('[autocomplete.js] hint and appendTo options can\'t be used at the same time');+ }
+
+ this.css = o.css = _.mixin({}, css, o.appendTo ? css.appendTo : {});+ this.cssClasses = o.cssClasses = _.mixin({}, css.defaultClasses, o.cssClasses || {});+ this.cssClasses.prefix =
+ o.cssClasses.formattedPrefix = _.formatPrefix(this.cssClasses.prefix, this.cssClasses.noPrefix);
+ this.listboxId = o.listboxId = [this.cssClasses.root, 'listbox', _.getUniqueId()].join('-');+
+ var domElts = buildDom(o);
+
+ this.$node = domElts.wrapper;
+ var $input = this.$input = domElts.input;
+ $menu = domElts.menu;
+ $hint = domElts.hint;
+
+ if (o.dropdownMenuContainer) {+ DOM.element(o.dropdownMenuContainer)
+ .css('position', 'relative') // ensure the container has a relative position+ .append($menu.css('top', '0')); // override the top: 100%+ }
+
+ // #705: if there's scrollable overflow, ie doesn't support
+ // blur cancellations when the scrollbar is clicked
+ //
+ // #351: preventDefault won't cancel blurs in ie <= 8
+ $input.on('blur.aa', function($e) {+ var active = document.activeElement;
+ if (_.isMsie() && ($menu[0] === active || $menu[0].contains(active))) {+ $e.preventDefault();
+ // stop immediate in order to prevent Input#_onBlur from
+ // getting exectued
+ $e.stopImmediatePropagation();
+ _.defer(function() { $input.focus(); });+ }
+ });
+
+ // #351: prevents input blur due to clicks within dropdown menu
+ $menu.on('mousedown.aa', function($e) { $e.preventDefault(); });+
+ this.eventBus = o.eventBus || new EventBus({el: $input});+
+ this.dropdown = new Typeahead.Dropdown({+ appendTo: o.appendTo,
+ wrapper: this.$node,
+ menu: $menu,
+ datasets: o.datasets,
+ templates: o.templates,
+ cssClasses: o.cssClasses,
+ minLength: this.minLength
+ })
+ .onSync('suggestionClicked', this._onSuggestionClicked, this)+ .onSync('cursorMoved', this._onCursorMoved, this)+ .onSync('cursorRemoved', this._onCursorRemoved, this)+ .onSync('opened', this._onOpened, this)+ .onSync('closed', this._onClosed, this)+ .onSync('shown', this._onShown, this)+ .onSync('empty', this._onEmpty, this)+ .onSync('redrawn', this._onRedrawn, this)+ .onAsync('datasetRendered', this._onDatasetRendered, this);+
+ this.input = new Typeahead.Input({input: $input, hint: $hint})+ .onSync('focused', this._onFocused, this)+ .onSync('blurred', this._onBlurred, this)+ .onSync('enterKeyed', this._onEnterKeyed, this)+ .onSync('tabKeyed', this._onTabKeyed, this)+ .onSync('escKeyed', this._onEscKeyed, this)+ .onSync('upKeyed', this._onUpKeyed, this)+ .onSync('downKeyed', this._onDownKeyed, this)+ .onSync('leftKeyed', this._onLeftKeyed, this)+ .onSync('rightKeyed', this._onRightKeyed, this)+ .onSync('queryChanged', this._onQueryChanged, this)+ .onSync('whitespaceChanged', this._onWhitespaceChanged, this);+
+ this._bindKeyboardShortcuts(o);
+
+ this._setLanguageDirection();
+}
+
+// instance methods
+// ----------------
+
+_.mixin(Typeahead.prototype, {+ // ### private
+
+ _bindKeyboardShortcuts: function(options) {+ if (!options.keyboardShortcuts) {+ return;
+ }
+ var $input = this.$input;
+ var keyboardShortcuts = [];
+ _.each(options.keyboardShortcuts, function(key) {+ if (typeof key === 'string') {+ key = key.toUpperCase().charCodeAt(0);
+ }
+ keyboardShortcuts.push(key);
+ });
+ DOM.element(document).keydown(function(event) {+ var elt = (event.target || event.srcElement);
+ var tagName = elt.tagName;
+ if (elt.isContentEditable || tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {+ // already in an input
+ return;
+ }
+
+ var which = event.which || event.keyCode;
+ if (keyboardShortcuts.indexOf(which) === -1) {+ // not the right shortcut
+ return;
+ }
+
+ $input.focus();
+ event.stopPropagation();
+ event.preventDefault();
+ });
+ },
+
+ _onSuggestionClicked: function onSuggestionClicked(type, $el) {+ var datum;
+
+ if (datum = this.dropdown.getDatumForSuggestion($el)) {+ this._select(datum);
+ }
+ },
+
+ _onCursorMoved: function onCursorMoved(event, updateInput) {+ var datum = this.dropdown.getDatumForCursor();
+ var currentCursorId = this.dropdown.getCurrentCursor().attr('id');+ this.input.setActiveDescendant(currentCursorId);
+
+ if (datum) {+ if (updateInput) {+ this.input.setInputValue(datum.value, true);
+ }
+
+ this.eventBus.trigger('cursorchanged', datum.raw, datum.datasetName);+ }
+ },
+
+ _onCursorRemoved: function onCursorRemoved() {+ this.input.resetInputValue();
+ this._updateHint();
+ this.eventBus.trigger('cursorremoved');+ },
+
+ _onDatasetRendered: function onDatasetRendered() {+ this._updateHint();
+
+ this.eventBus.trigger('updated');+ },
+
+ _onOpened: function onOpened() {+ this._updateHint();
+ this.input.expand();
+
+ this.eventBus.trigger('opened');+ },
+
+ _onEmpty: function onEmpty() {+ this.eventBus.trigger('empty');+ },
+
+ _onRedrawn: function onRedrawn() {+ this.$node.css('top', 0 + 'px');+ this.$node.css('left', 0 + 'px');+
+ var inputRect = this.$input[0].getBoundingClientRect();
+
+ if (this.autoWidth) {+ this.$node.css('width', inputRect.width + 'px');+ }
+
+ var wrapperRect = this.$node[0].getBoundingClientRect();
+
+ var top = inputRect.bottom - wrapperRect.top;
+ this.$node.css('top', top + 'px');+ var left = inputRect.left - wrapperRect.left;
+ this.$node.css('left', left + 'px');+
+ this.eventBus.trigger('redrawn');+ },
+
+ _onShown: function onShown() {+ this.eventBus.trigger('shown');+ if (this.autoselect) {+ this.dropdown.cursorTopSuggestion();
+ }
+ },
+
+ _onClosed: function onClosed() {+ this.input.clearHint();
+ this.input.removeActiveDescendant();
+ this.input.collapse();
+
+ this.eventBus.trigger('closed');+ },
+
+ _onFocused: function onFocused() {+ this.isActivated = true;
+
+ if (this.openOnFocus) {+ var query = this.input.getQuery();
+ if (query.length >= this.minLength) {+ this.dropdown.update(query);
+ } else {+ this.dropdown.empty();
+ }
+
+ this.dropdown.open();
+ }
+ },
+
+ _onBlurred: function onBlurred() {+ var cursorDatum;
+ var topSuggestionDatum;
+
+ cursorDatum = this.dropdown.getDatumForCursor();
+ topSuggestionDatum = this.dropdown.getDatumForTopSuggestion();
+
+ if (!this.debug) {+ if (this.autoselectOnBlur && cursorDatum) {+ this._select(cursorDatum);
+ } else if (this.autoselectOnBlur && topSuggestionDatum) {+ this._select(topSuggestionDatum);
+ } else {+ this.isActivated = false;
+ this.dropdown.empty();
+ this.dropdown.close();
+ }
+ }
+ },
+
+ _onEnterKeyed: function onEnterKeyed(type, $e) {+ var cursorDatum;
+ var topSuggestionDatum;
+
+ cursorDatum = this.dropdown.getDatumForCursor();
+ topSuggestionDatum = this.dropdown.getDatumForTopSuggestion();
+
+ if (cursorDatum) {+ this._select(cursorDatum);
+ $e.preventDefault();
+ } else if (this.autoselect && topSuggestionDatum) {+ this._select(topSuggestionDatum);
+ $e.preventDefault();
+ }
+ },
+
+ _onTabKeyed: function onTabKeyed(type, $e) {+ var datum;
+
+ if (datum = this.dropdown.getDatumForCursor()) {+ this._select(datum);
+ $e.preventDefault();
+ } else {+ this._autocomplete(true);
+ }
+ },
+
+ _onEscKeyed: function onEscKeyed() {+ this.dropdown.close();
+ this.input.resetInputValue();
+ },
+
+ _onUpKeyed: function onUpKeyed() {+ var query = this.input.getQuery();
+
+ if (this.dropdown.isEmpty && query.length >= this.minLength) {+ this.dropdown.update(query);
+ } else {+ this.dropdown.moveCursorUp();
+ }
+
+ this.dropdown.open();
+ },
+
+ _onDownKeyed: function onDownKeyed() {+ var query = this.input.getQuery();
+
+ if (this.dropdown.isEmpty && query.length >= this.minLength) {+ this.dropdown.update(query);
+ } else {+ this.dropdown.moveCursorDown();
+ }
+
+ this.dropdown.open();
+ },
+
+ _onLeftKeyed: function onLeftKeyed() {+ if (this.dir === 'rtl') {+ this._autocomplete();
+ }
+ },
+
+ _onRightKeyed: function onRightKeyed() {+ if (this.dir === 'ltr') {+ this._autocomplete();
+ }
+ },
+
+ _onQueryChanged: function onQueryChanged(e, query) {+ this.input.clearHintIfInvalid();
+
+ if (query.length >= this.minLength) {+ this.dropdown.update(query);
+ } else {+ this.dropdown.empty();
+ }
+
+ this.dropdown.open();
+ this._setLanguageDirection();
+ },
+
+ _onWhitespaceChanged: function onWhitespaceChanged() {+ this._updateHint();
+ this.dropdown.open();
+ },
+
+ _setLanguageDirection: function setLanguageDirection() {+ var dir = this.input.getLanguageDirection();
+
+ if (this.dir !== dir) {+ this.dir = dir;
+ this.$node.css('direction', dir);+ this.dropdown.setLanguageDirection(dir);
+ }
+ },
+
+ _updateHint: function updateHint() {+ var datum;
+ var val;
+ var query;
+ var escapedQuery;
+ var frontMatchRegEx;
+ var match;
+
+ datum = this.dropdown.getDatumForTopSuggestion();
+
+ if (datum && this.dropdown.isVisible() && !this.input.hasOverflow()) {+ val = this.input.getInputValue();
+ query = Input.normalizeQuery(val);
+ escapedQuery = _.escapeRegExChars(query);
+
+ // match input value, then capture trailing text
+ frontMatchRegEx = new RegExp('^(?:' + escapedQuery + ')(.+$)', 'i');+ match = frontMatchRegEx.exec(datum.value);
+
+ // clear hint if there's no trailing text
+ if (match) {+ this.input.setHint(val + match[1]);
+ } else {+ this.input.clearHint();
+ }
+ } else {+ this.input.clearHint();
+ }
+ },
+
+ _autocomplete: function autocomplete(laxCursor) {+ var hint;
+ var query;
+ var isCursorAtEnd;
+ var datum;
+
+ hint = this.input.getHint();
+ query = this.input.getQuery();
+ isCursorAtEnd = laxCursor || this.input.isCursorAtEnd();
+
+ if (hint && query !== hint && isCursorAtEnd) {+ datum = this.dropdown.getDatumForTopSuggestion();
+ if (datum) {+ this.input.setInputValue(datum.value);
+ }
+
+ this.eventBus.trigger('autocompleted', datum.raw, datum.datasetName);+ }
+ },
+
+ _select: function select(datum) {+ if (typeof datum.value !== 'undefined') {+ this.input.setQuery(datum.value);
+ }
+ this.input.setInputValue(datum.value, true);
+
+ this._setLanguageDirection();
+
+ var event = this.eventBus.trigger('selected', datum.raw, datum.datasetName);+ if (event.isDefaultPrevented() === false) {+ this.dropdown.close();
+
+ // #118: allow click event to bubble up to the body before removing
+ // the suggestions otherwise we break event delegation
+ _.defer(_.bind(this.dropdown.empty, this.dropdown));
+ }
+ },
+
+ // ### public
+
+ open: function open() {+ // if the menu is not activated yet, we need to update
+ // the underlying dropdown menu to trigger the search
+ // otherwise we're not gonna see anything
+ if (!this.isActivated) {+ var query = this.input.getInputValue();
+ if (query.length >= this.minLength) {+ this.dropdown.update(query);
+ } else {+ this.dropdown.empty();
+ }
+ }
+ this.dropdown.open();
+ },
+
+ close: function close() {+ this.dropdown.close();
+ },
+
+ setVal: function setVal(val) {+ // expect val to be a string, so be safe, and coerce
+ val = _.toStr(val);
+
+ if (this.isActivated) {+ this.input.setInputValue(val);
+ } else {+ this.input.setQuery(val);
+ this.input.setInputValue(val, true);
+ }
+
+ this._setLanguageDirection();
+ },
+
+ getVal: function getVal() {+ return this.input.getQuery();
+ },
+
+ destroy: function destroy() {+ this.input.destroy();
+ this.dropdown.destroy();
+
+ destroyDomStructure(this.$node, this.cssClasses);
+
+ this.$node = null;
+ },
+
+ getWrapper: function getWrapper() {+ return this.dropdown.$container[0];
+ }
+});
+
+function buildDom(options) {+ var $input;
+ var $wrapper;
+ var $dropdown;
+ var $hint;
+
+ $input = DOM.element(options.input);
+ $wrapper = DOM
+ .element(html.wrapper.replace('%ROOT%', options.cssClasses.root))+ .css(options.css.wrapper);
+
+ // override the display property with the table-cell value
+ // if the parent element is a table and the original input was a block
+ // -> https://github.com/algolia/autocomplete.js/issues/16
+ if (!options.appendTo && $input.css('display') === 'block' && $input.parent().css('display') === 'table') {+ $wrapper.css('display', 'table-cell');+ }
+ var dropdownHtml = html.dropdown.
+ replace('%PREFIX%', options.cssClasses.prefix).+ replace('%DROPDOWN_MENU%', options.cssClasses.dropdownMenu);+ $dropdown = DOM.element(dropdownHtml)
+ .css(options.css.dropdown)
+ .attr({+ role: 'listbox',
+ id: options.listboxId
+ });
+ if (options.templates && options.templates.dropdownMenu) {+ $dropdown.html(_.templatify(options.templates.dropdownMenu)());
+ }
+ $hint = $input.clone().css(options.css.hint).css(getBackgroundStyles($input));
+
+ $hint
+ .val('')+ .addClass(_.className(options.cssClasses.prefix, options.cssClasses.hint, true))
+ .removeAttr('id name placeholder required')+ .prop('readonly', true)+ .attr({+ 'aria-hidden': 'true',
+ autocomplete: 'off',
+ spellcheck: 'false',
+ tabindex: -1
+ });
+ if ($hint.removeData) {+ $hint.removeData();
+ }
+
+ // store the original values of the attrs that get modified
+ // so modifications can be reverted on destroy
+ $input.data(attrsKey, {+ 'aria-autocomplete': $input.attr('aria-autocomplete'),+ 'aria-expanded': $input.attr('aria-expanded'),+ 'aria-owns': $input.attr('aria-owns'),+ autocomplete: $input.attr('autocomplete'),+ dir: $input.attr('dir'),+ role: $input.attr('role'),+ spellcheck: $input.attr('spellcheck'),+ style: $input.attr('style'),+ type: $input.attr('type')+ });
+
+ $input
+ .addClass(_.className(options.cssClasses.prefix, options.cssClasses.input, true))
+ .attr({+ autocomplete: 'off',
+ spellcheck: false,
+
+ // Accessibility features
+ // Give the field a presentation of a "select".
+ // Combobox is the combined presentation of a single line textfield
+ // with a listbox popup.
+ // https://www.w3.org/WAI/PF/aria/roles#combobox
+ role: 'combobox',
+ // Let the screen reader know the field has an autocomplete
+ // feature to it.
+ 'aria-autocomplete': (options.datasets && options.datasets[0] && options.datasets[0].displayKey ? 'both' : 'list'),
+ // Indicates whether the dropdown it controls is currently expanded or collapsed
+ 'aria-expanded': 'false',
+ // If a placeholder is set, label this field with itself, which in this case,
+ // is an explicit pointer to use the placeholder attribute value.
+ 'aria-labelledby': ($input.attr('placeholder') ? $input.attr('id') : null),+ // Explicitly point to the listbox,
+ // which is a list of suggestions (aka options)
+ 'aria-owns': options.listboxId
+ })
+ .css(options.hint ? options.css.input : options.css.inputWithNoHint);
+
+ // ie7 does not like it when dir is set to auto
+ try {+ if (!$input.attr('dir')) {+ $input.attr('dir', 'auto');+ }
+ } catch (e) {+ // ignore
+ }
+
+ $wrapper = options.appendTo
+ ? $wrapper.appendTo(DOM.element(options.appendTo).eq(0)).eq(0)
+ : $input.wrap($wrapper).parent();
+
+ $wrapper
+ .prepend(options.hint ? $hint : null)
+ .append($dropdown);
+
+ return {+ wrapper: $wrapper,
+ input: $input,
+ hint: $hint,
+ menu: $dropdown
+ };
+}
+
+function getBackgroundStyles($el) {+ return {+ backgroundAttachment: $el.css('background-attachment'),+ backgroundClip: $el.css('background-clip'),+ backgroundColor: $el.css('background-color'),+ backgroundImage: $el.css('background-image'),+ backgroundOrigin: $el.css('background-origin'),+ backgroundPosition: $el.css('background-position'),+ backgroundRepeat: $el.css('background-repeat'),+ backgroundSize: $el.css('background-size')+ };
+}
+
+function destroyDomStructure($node, cssClasses) {+ var $input = $node.find(_.className(cssClasses.prefix, cssClasses.input));
+
+ // need to remove attrs that weren't previously defined and
+ // revert attrs that originally had a value
+ _.each($input.data(attrsKey), function(val, key) {+ if (val === undefined) {+ $input.removeAttr(key);
+ } else {+ $input.attr(key, val);
+ }
+ });
+
+ $input
+ .detach()
+ .removeClass(_.className(cssClasses.prefix, cssClasses.input, true))
+ .insertAfter($node);
+ if ($input.removeData) {+ $input.removeData(attrsKey);
+ }
+
+ $node.remove();
+}
+
+Typeahead.Dropdown = Dropdown;
+Typeahead.Input = Input;
+Typeahead.sources = __webpack_require__(43);
+
+module.exports = Typeahead;
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var _ = __webpack_require__(0);
+var version = __webpack_require__(16);
+var parseAlgoliaClientVersion = __webpack_require__(15);
+
+module.exports = function search(index, params) {+ var algoliaVersion = parseAlgoliaClientVersion(index.as._ua);
+ if (algoliaVersion && algoliaVersion[0] >= 3 && algoliaVersion[1] > 20) {+ params = params || {};+ params.additionalUA = 'autocomplete.js ' + version;
+ }
+ return sourceFn;
+
+ function sourceFn(query, cb) {+ index.search(query, params, function(error, content) {+ if (error) {+ _.error(error.message);
+ return;
+ }
+ cb(content.hits, content);
+ });
+ }
+};
+
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+module.exports = {+ hits: __webpack_require__(42),
+ popularIn: __webpack_require__(44)
+};
+
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var _ = __webpack_require__(0);
+var version = __webpack_require__(16);
+var parseAlgoliaClientVersion = __webpack_require__(15);
+
+module.exports = function popularIn(index, params, details, options) {+ var algoliaVersion = parseAlgoliaClientVersion(index.as._ua);
+ if (algoliaVersion && algoliaVersion[0] >= 3 && algoliaVersion[1] > 20) {+ params = params || {};+ params.additionalUA = 'autocomplete.js ' + version;
+ }
+ if (!details.source) {+ return _.error("Missing 'source' key");+ }
+ var source = _.isFunction(details.source) ? details.source : function(hit) { return hit[details.source]; };+
+ if (!details.index) {+ return _.error("Missing 'index' key");+ }
+ var detailsIndex = details.index;
+
+ options = options || {};+
+ return sourceFn;
+
+ function sourceFn(query, cb) {+ index.search(query, params, function(error, content) {+ if (error) {+ _.error(error.message);
+ return;
+ }
+
+ if (content.hits.length > 0) {+ var first = content.hits[0];
+
+ var detailsParams = _.mixin({hitsPerPage: 0}, details);+ delete detailsParams.source; // not a query parameter
+ delete detailsParams.index; // not a query parameter
+
+ var detailsAlgoliaVersion = parseAlgoliaClientVersion(detailsIndex.as._ua);
+ if (detailsAlgoliaVersion && detailsAlgoliaVersion[0] >= 3 && detailsAlgoliaVersion[1] > 20) {+ params.additionalUA = 'autocomplete.js ' + version;
+ }
+
+ detailsIndex.search(source(first), detailsParams, function(error2, content2) {+ if (error2) {+ _.error(error2.message);
+ return;
+ }
+
+ var suggestions = [];
+
+ // add the 'all department' entry before others
+ if (options.includeAll) {+ var label = options.allTitle || 'All departments';
+ suggestions.push(_.mixin({+ facet: {value: label, count: content2.nbHits}+ }, _.cloneDeep(first)));
+ }
+
+ // enrich the first hit iterating over the facets
+ _.each(content2.facets, function(values, facet) {+ _.each(values, function(count, value) {+ suggestions.push(_.mixin({+ facet: {facet: facet, value: value, count: count}+ }, _.cloneDeep(first)));
+ });
+ });
+
+ // append all other hits
+ for (var i = 1; i < content.hits.length; ++i) {+ suggestions.push(content.hits[i]);
+ }
+
+ cb(suggestions, content);
+ });
+
+ return;
+ }
+
+ cb([]);
+ });
+ }
+};
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+// this will inject Zepto in window, unfortunately no easy commonJS zepto build
+var zepto = __webpack_require__(17);
+
+// setup DOM element
+var DOM = __webpack_require__(1);
+DOM.element = zepto;
+
+// setup utils functions
+var _ = __webpack_require__(0);
+_.isArray = zepto.isArray;
+_.isFunction = zepto.isFunction;
+_.isObject = zepto.isPlainObject;
+_.bind = zepto.proxy;
+_.each = function(collection, cb) {+ // stupid argument order for jQuery.each
+ zepto.each(collection, reverseArgs);
+ function reverseArgs(index, value) {+ return cb(value, index);
+ }
+};
+_.map = zepto.map;
+_.mixin = zepto.extend;
+_.Event = zepto.Event;
+
+var typeaheadKey = 'aaAutocomplete';
+var Typeahead = __webpack_require__(41);
+var EventBus = __webpack_require__(13);
+
+function autocomplete(selector, options, datasets, typeaheadObject) {+ datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 2);
+
+ var inputs = zepto(selector).each(function(i, input) {+ var $input = zepto(input);
+ var eventBus = new EventBus({el: $input});+ var typeahead = typeaheadObject || new Typeahead({+ input: $input,
+ eventBus: eventBus,
+ dropdownMenuContainer: options.dropdownMenuContainer,
+ hint: options.hint === undefined ? true : !!options.hint,
+ minLength: options.minLength,
+ autoselect: options.autoselect,
+ autoselectOnBlur: options.autoselectOnBlur,
+ openOnFocus: options.openOnFocus,
+ templates: options.templates,
+ debug: options.debug,
+ cssClasses: options.cssClasses,
+ datasets: datasets,
+ keyboardShortcuts: options.keyboardShortcuts,
+ appendTo: options.appendTo,
+ autoWidth: options.autoWidth
+ });
+ $input.data(typeaheadKey, typeahead);
+ });
+
+ // expose all methods in the `autocomplete` attribute
+ inputs.autocomplete = {};+ _.each(['open', 'close', 'getVal', 'setVal', 'destroy', 'getWrapper'], function(method) {+ inputs.autocomplete[method] = function() {+ var methodArguments = arguments;
+ var result;
+ inputs.each(function(j, input) {+ var typeahead = zepto(input).data(typeaheadKey);
+ result = typeahead[method].apply(typeahead, methodArguments);
+ });
+ return result;
+ };
+ });
+
+ return inputs;
+}
+
+autocomplete.sources = Typeahead.sources;
+autocomplete.escapeHighlightedString = _.escapeHighlightedString;
+
+var wasAutocompleteSet = 'autocomplete' in window;
+var oldAutocomplete = window.autocomplete;
+autocomplete.noConflict = function noConflict() {+ if (wasAutocompleteSet) {+ window.autocomplete = oldAutocomplete;
+ } else {+ delete window.autocomplete;
+ }
+ return autocomplete;
+};
+
+module.exports = autocomplete;
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var _main = __webpack_require__(21);
+
+var _main2 = _interopRequireDefault(_main);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }+
+module.exports = _main2.default; /* eslint-disable import/no-commonjs */
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {+ value: true
+});
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();+
+var _hogan = __webpack_require__(54);
+
+var _hogan2 = _interopRequireDefault(_hogan);
+
+var _lite = __webpack_require__(24);
+
+var _lite2 = _interopRequireDefault(_lite);
+
+var _autocomplete = __webpack_require__(37);
+
+var _autocomplete2 = _interopRequireDefault(_autocomplete);
+
+var _templates = __webpack_require__(48);
+
+var _templates2 = _interopRequireDefault(_templates);
+
+var _utils = __webpack_require__(49);
+
+var _utils2 = _interopRequireDefault(_utils);
+
+var _version = __webpack_require__(18);
+
+var _version2 = _interopRequireDefault(_version);
+
+var _zepto = __webpack_require__(19);
+
+var _zepto2 = _interopRequireDefault(_zepto);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }+
+/**
+ * Adds an autocomplete dropdown to an input field
+ * @function DocSearch
+ * @param {string} options.apiKey Read-only API key+ * @param {string} options.indexName Name of the index to target+ * @param {string} options.inputSelector CSS selector that targets the input+ * @param {string} [options.appId] Lets you override the applicationId used.+ * If using the default Algolia Crawler, you should not have to change this
+ * value.
+ * @param {Object} [options.algoliaOptions] Options to pass the underlying Algolia client+ * @param {Object} [options.autocompleteOptions] Options to pass to the underlying autocomplete instance+ * @return {Object}+ */
+var usage = 'Usage:\n documentationSearch({\n apiKey,\n indexName,\n inputSelector,\n [ appId ],\n [ algoliaOptions.{hitsPerPage} ]\n [ autocompleteOptions.{hint,debug} ]\n})';+
+var DocSearch = function () {+ function DocSearch(_ref) {+ var apiKey = _ref.apiKey,
+ indexName = _ref.indexName,
+ inputSelector = _ref.inputSelector,
+ _ref$appId = _ref.appId,
+ appId = _ref$appId === undefined ? 'BH4D9OD16A' : _ref$appId,
+ _ref$debug = _ref.debug,
+ debug = _ref$debug === undefined ? false : _ref$debug,
+ _ref$algoliaOptions = _ref.algoliaOptions,
+ algoliaOptions = _ref$algoliaOptions === undefined ? {} : _ref$algoliaOptions,+ _ref$autocompleteOpti = _ref.autocompleteOptions,
+ autocompleteOptions = _ref$autocompleteOpti === undefined ? {+ debug: false,
+ hint: false,
+ autoselect: true
+ } : _ref$autocompleteOpti,
+ _ref$transformData = _ref.transformData,
+ transformData = _ref$transformData === undefined ? false : _ref$transformData,
+ _ref$queryHook = _ref.queryHook,
+ queryHook = _ref$queryHook === undefined ? false : _ref$queryHook,
+ _ref$handleSelected = _ref.handleSelected,
+ handleSelected = _ref$handleSelected === undefined ? false : _ref$handleSelected,
+ _ref$enhancedSearchIn = _ref.enhancedSearchInput,
+ enhancedSearchInput = _ref$enhancedSearchIn === undefined ? false : _ref$enhancedSearchIn,
+ _ref$layout = _ref.layout,
+ layout = _ref$layout === undefined ? 'collumns' : _ref$layout;
+
+ _classCallCheck(this, DocSearch);
+
+ DocSearch.checkArguments({+ apiKey: apiKey,
+ indexName: indexName,
+ inputSelector: inputSelector,
+ debug: debug,
+ algoliaOptions: algoliaOptions,
+ autocompleteOptions: autocompleteOptions,
+ transformData: transformData,
+ queryHook: queryHook,
+ handleSelected: handleSelected,
+ enhancedSearchInput: enhancedSearchInput,
+ layout: layout
+ });
+
+ this.apiKey = apiKey;
+ this.appId = appId;
+ this.indexName = indexName;
+ this.input = DocSearch.getInputFromSelector(inputSelector);
+ this.algoliaOptions = _extends({ hitsPerPage: 5 }, algoliaOptions);+ var autocompleteOptionsDebug = autocompleteOptions && autocompleteOptions.debug ? autocompleteOptions.debug : false;
+ autocompleteOptions.debug = debug || autocompleteOptionsDebug;
+ this.autocompleteOptions = autocompleteOptions;
+ this.autocompleteOptions.cssClasses = {+ prefix: 'ds'
+ };
+
+ handleSelected = handleSelected || this.handleSelected;
+
+ this.isSimpleLayout = layout === 'simple';
+
+ this.client = (0, _lite2.default)(this.appId, this.apiKey);
+ this.client.addAlgoliaAgent('docsearch.js ' + _version2.default);+
+ if (enhancedSearchInput) {+ this.input = DocSearch.injectSearchBox(this.input);
+ }
+
+ this.autocomplete = (0, _autocomplete2.default)(this.input, autocompleteOptions, [{+ source: this.getAutocompleteSource(transformData, queryHook),
+ templates: {+ suggestion: DocSearch.getSuggestionTemplate(this.isSimpleLayout),
+ footer: _templates2.default.footer,
+ empty: DocSearch.getEmptyTemplate()
+ }
+ }]);
+ this.autocomplete.on('autocomplete:selected', handleSelected.bind(null, this.autocomplete.autocomplete));+ this.autocomplete.on('autocomplete:shown', this.handleShown.bind(null, this.input));+
+ if (enhancedSearchInput) {+ DocSearch.bindSearchBoxEvent();
+ }
+ }
+
+ /**
+ * Checks that the passed arguments are valid. Will throw errors otherwise
+ * @function checkArguments
+ * @param {object} args Arguments as an option object+ * @returns {void}+ */
+
+
+ _createClass(DocSearch, [{+ key: 'getAutocompleteSource',
+
+
+ /**
+ * Returns the `source` method to be passed to autocomplete.js. It will query
+ * the Algolia index and call the callbacks with the formatted hits.
+ * @function getAutocompleteSource
+ * @param {function} transformData An optional function to transform the hits+ * @param {function} queryHook An optional function to transform the query+ * @returns {function} Method to be passed as the `source` option of+ * autocomplete
+ */
+ value: function getAutocompleteSource(transformData, queryHook) {+ var _this = this;
+
+ return function (query, callback) {+ if (queryHook) {+ query = queryHook(query) || query;
+ }
+
+ _this.client.search([{+ indexName: _this.indexName,
+ query: query,
+ params: _this.algoliaOptions
+ }]).then(function (data) {+ var hits = data.results[0].hits;
+ if (transformData) {+ hits = transformData(hits) || hits;
+ }
+ callback(DocSearch.formatHits(hits));
+ });
+ };
+ }
+
+ // Given a list of hits returned by the API, will reformat them to be used in
+ // a Hogan template
+
+ }, {+ key: 'handleSelected',
+ value: function handleSelected(input, event, suggestion) {+ input.setVal('');+ window.location.href = suggestion.url;
+ }
+ }, {+ key: 'handleShown',
+ value: function handleShown(input) {+ var middleOfInput = input.offset().left + input.width() / 2;
+ var middleOfWindow = (0, _zepto2.default)(document).width() / 2;
+
+ if (isNaN(middleOfWindow)) {+ middleOfWindow = 900;
+ }
+
+ var alignClass = middleOfInput - middleOfWindow >= 0 ? 'algolia-autocomplete-right' : 'algolia-autocomplete-left';
+ var otherAlignClass = middleOfInput - middleOfWindow < 0 ? 'algolia-autocomplete-right' : 'algolia-autocomplete-left';
+
+ var autocompleteWrapper = (0, _zepto2.default)('.algolia-autocomplete');+ if (!autocompleteWrapper.hasClass(alignClass)) {+ autocompleteWrapper.addClass(alignClass);
+ }
+
+ if (autocompleteWrapper.hasClass(otherAlignClass)) {+ autocompleteWrapper.removeClass(otherAlignClass);
+ }
+ }
+ }], [{+ key: 'checkArguments',
+ value: function checkArguments(args) {+ if (!args.apiKey || !args.indexName) {+ throw new Error(usage);
+ }
+
+ if (!DocSearch.getInputFromSelector(args.inputSelector)) {+ throw new Error('Error: No input element in the page matches ' + args.inputSelector);+ }
+ }
+ }, {+ key: 'injectSearchBox',
+ value: function injectSearchBox(input) {+ input.before(_templates2.default.searchBox);
+ var newInput = input.prev().prev().find('input');+ input.remove();
+ return newInput;
+ }
+ }, {+ key: 'bindSearchBoxEvent',
+ value: function bindSearchBoxEvent() {+ (0, _zepto2.default)('.searchbox [type="reset"]').on('click', function () {+ (0, _zepto2.default)('input#docsearch').focus();+ (0, _zepto2.default)(this).addClass('hide');+ _autocomplete2.default.autocomplete.setVal('');+ });
+
+ (0, _zepto2.default)('input#docsearch').on('keyup', function () {+ var searchbox = document.querySelector('input#docsearch');+ var reset = document.querySelector('.searchbox [type="reset"]');+ reset.className = 'searchbox__reset';
+ if (searchbox.value.length === 0) {+ reset.className += ' hide';
+ }
+ });
+ }
+
+ /**
+ * Returns the matching input from a CSS selector, null if none matches
+ * @function getInputFromSelector
+ * @param {string} selector CSS selector that matches the search+ * input of the page
+ * @returns {void}+ */
+
+ }, {+ key: 'getInputFromSelector',
+ value: function getInputFromSelector(selector) {+ var input = (0, _zepto2.default)(selector).filter('input');+ return input.length ? (0, _zepto2.default)(input[0]) : null;
+ }
+ }, {+ key: 'formatHits',
+ value: function formatHits(receivedHits) {+ var clonedHits = _utils2.default.deepClone(receivedHits);
+ var hits = clonedHits.map(function (hit) {+ if (hit._highlightResult) {+ hit._highlightResult = _utils2.default.mergeKeyWithParent(hit._highlightResult, 'hierarchy');
+ }
+ return _utils2.default.mergeKeyWithParent(hit, 'hierarchy');
+ });
+
+ // Group hits by category / subcategory
+ var groupedHits = _utils2.default.groupBy(hits, 'lvl0');
+ _zepto2.default.each(groupedHits, function (level, collection) {+ var groupedHitsByLvl1 = _utils2.default.groupBy(collection, 'lvl1');
+ var flattenedHits = _utils2.default.flattenAndFlagFirst(groupedHitsByLvl1, 'isSubCategoryHeader');
+ groupedHits[level] = flattenedHits;
+ });
+ groupedHits = _utils2.default.flattenAndFlagFirst(groupedHits, 'isCategoryHeader');
+
+ // Translate hits into smaller objects to be send to the template
+ return groupedHits.map(function (hit) {+ var url = DocSearch.formatURL(hit);
+ var category = _utils2.default.getHighlightedValue(hit, 'lvl0');
+ var subcategory = _utils2.default.getHighlightedValue(hit, 'lvl1') || category;
+ var displayTitle = _utils2.default.compact([_utils2.default.getHighlightedValue(hit, 'lvl2') || subcategory, _utils2.default.getHighlightedValue(hit, 'lvl3'), _utils2.default.getHighlightedValue(hit, 'lvl4'), _utils2.default.getHighlightedValue(hit, 'lvl5'), _utils2.default.getHighlightedValue(hit, 'lvl6')]).join('<span class="aa-suggestion-title-separator" aria-hidden="true"> › </span>');+ var text = _utils2.default.getSnippetedValue(hit, 'content');
+ var isTextOrSubcatoryNonEmpty = subcategory && subcategory !== '' || displayTitle && displayTitle !== '';
+ var isLvl1EmptyOrDuplicate = !subcategory || subcategory === '' || subcategory === category;
+ var isLvl2 = displayTitle && displayTitle !== '' && displayTitle !== subcategory;
+ var isLvl1 = !isLvl2 && subcategory && subcategory !== '' && subcategory !== category;
+ var isLvl0 = !isLvl1 && !isLvl2;
+
+ return {+ isLvl0: isLvl0,
+ isLvl1: isLvl1,
+ isLvl2: isLvl2,
+ isLvl1EmptyOrDuplicate: isLvl1EmptyOrDuplicate,
+ isCategoryHeader: hit.isCategoryHeader,
+ isSubCategoryHeader: hit.isSubCategoryHeader,
+ isTextOrSubcatoryNonEmpty: isTextOrSubcatoryNonEmpty,
+ category: category,
+ subcategory: subcategory,
+ title: displayTitle,
+ text: text,
+ url: url
+ };
+ });
+ }
+ }, {+ key: 'formatURL',
+ value: function formatURL(hit) {+ var url = hit.url,
+ anchor = hit.anchor;
+
+ if (url) {+ var containsAnchor = url.indexOf('#') !== -1;+ if (containsAnchor) return url;else if (anchor) return hit.url + '#' + hit.anchor;
+ return url;
+ } else if (anchor) return '#' + hit.anchor;
+ /* eslint-disable */
+ console.warn('no anchor nor url for : ', JSON.stringify(hit));+ /* eslint-enable */
+ return null;
+ }
+ }, {+ key: 'getEmptyTemplate',
+ value: function getEmptyTemplate() {+ return function (args) {+ return _hogan2.default.compile(_templates2.default.empty).render(args);
+ };
+ }
+ }, {+ key: 'getSuggestionTemplate',
+ value: function getSuggestionTemplate(isSimpleLayout) {+ var stringTemplate = isSimpleLayout ? _templates2.default.suggestionSimple : _templates2.default.suggestion;
+ var template = _hogan2.default.compile(stringTemplate);
+ return function (suggestion) {+ return template.render(suggestion);
+ };
+ }
+ }]);
+
+ return DocSearch;
+}();
+
+exports.default = DocSearch;
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {+ value: true
+});
+var prefix = 'algolia-docsearch';
+var suggestionPrefix = prefix + '-suggestion';
+var footerPrefix = prefix + '-footer';
+
+/* eslint-disable max-len */
+
+var templates = {+ suggestion: '\n <div class="' + suggestionPrefix + '\n {{#isCategoryHeader}}' + suggestionPrefix + '__main{{/isCategoryHeader}}\n {{#isSubCategoryHeader}}' + suggestionPrefix + '__secondary{{/isSubCategoryHeader}}\n ">\n <div class="' + suggestionPrefix + '--category-header">\n <span class="' + suggestionPrefix + '--category-header-lvl0">{{{category}}}</span>\n </div>\n <div class="' + suggestionPrefix + '--wrapper">\n <div class="' + suggestionPrefix + '--subcategory-column">\n <span class="' + suggestionPrefix + '--subcategory-column-text">{{{subcategory}}}</span>\n </div>\n {{#isTextOrSubcatoryNonEmpty}}\n <div class="' + suggestionPrefix + '--content">\n <div class="' + suggestionPrefix + '--subcategory-inline">{{{subcategory}}}</div>\n <div class="' + suggestionPrefix + '--title">{{{title}}}</div>\n {{#text}}<div class="' + suggestionPrefix + '--text">{{{text}}}</div>{{/text}}\n </div>\n {{/isTextOrSubcatoryNonEmpty}}\n </div>\n </div>\n ',+ suggestionSimple: '\n <div class="' + suggestionPrefix + '\n {{#isCategoryHeader}}' + suggestionPrefix + '__main{{/isCategoryHeader}}\n {{#isSubCategoryHeader}}' + suggestionPrefix + '__secondary{{/isSubCategoryHeader}}\n suggestion-layout-simple\n ">\n <div class="' + suggestionPrefix + '--category-header">\n {{^isLvl0}}\n <span class="' + suggestionPrefix + '--category-header-lvl0 ' + suggestionPrefix + '--category-header-item">{{{category}}}</span>\n {{^isLvl1}}\n {{^isLvl1EmptyOrDuplicate}}\n <span class="' + suggestionPrefix + '--category-header-lvl1 ' + suggestionPrefix + '--category-header-item">\n {{{subcategory}}}\n </span>\n {{/isLvl1EmptyOrDuplicate}}\n {{/isLvl1}}\n {{/isLvl0}}\n <div class="' + suggestionPrefix + '--title ' + suggestionPrefix + '--category-header-item">\n {{#isLvl2}}\n {{{title}}}\n {{/isLvl2}}\n {{#isLvl1}}\n {{{subcategory}}}\n {{/isLvl1}}\n {{#isLvl0}}\n {{{category}}}\n {{/isLvl0}}\n </div>\n </div>\n <div class="' + suggestionPrefix + '--wrapper">\n {{#text}}\n <div class="' + suggestionPrefix + '--content">\n <div class="' + suggestionPrefix + '--text">{{{text}}}</div>\n </div>\n {{/text}}\n </div>\n </div>\n ',+ footer: '\n <div class="' + footerPrefix + '">\n Search by <a class="' + footerPrefix + '--logo" href="https://www.algolia.com/docsearch">Algolia</a>\n </div>\n ',
+ empty: '\n <div class="' + suggestionPrefix + '">\n <div class="' + suggestionPrefix + '--wrapper">\n <div class="' + suggestionPrefix + '--content ' + suggestionPrefix + '--no-results">\n <div class="' + suggestionPrefix + '--title">\n <div class="' + suggestionPrefix + '--text">\n No results found for query <b>"{{query}}"</b>\n </div>\n </div>\n </div>\n </div>\n </div>\n ',+ searchBox: '\n <form novalidate="novalidate" onsubmit="return false;" class="searchbox">\n <div role="search" class="searchbox__wrapper">\n <input id="docsearch" type="search" name="search" placeholder="Search the docs" autocomplete="off" required="required" class="searchbox__input"/>\n <button type="submit" title="Submit your search query." class="searchbox__submit" >\n <svg width=12 height=12 role="img" aria-label="Search">\n <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-search-13"></use>\n </svg>\n </button>\n <button type="reset" title="Clear the search query." class="searchbox__reset hide">\n <svg width=12 height=12 role="img" aria-label="Reset">\n <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-clear-3"></use>\n </svg>\n </button>\n </div>\n</form>\n\n<div class="svg-icons" style="height: 0; width: 0; position: absolute; visibility: hidden">\n <svg xmlns="http://www.w3.org/2000/svg">\n <symbol id="sbx-icon-clear-3" viewBox="0 0 40 40"><path d="M16.228 20L1.886 5.657 0 3.772 3.772 0l1.885 1.886L20 16.228 34.343 1.886 36.228 0 40 3.772l-1.886 1.885L23.772 20l14.342 14.343L40 36.228 36.228 40l-1.885-1.886L20 23.772 5.657 38.114 3.772 40 0 36.228l1.886-1.885L16.228 20z" fill-rule="evenodd"></symbol>\n <symbol id="sbx-icon-search-13" viewBox="0 0 40 40"><path d="M26.806 29.012a16.312 16.312 0 0 1-10.427 3.746C7.332 32.758 0 25.425 0 16.378 0 7.334 7.333 0 16.38 0c9.045 0 16.378 7.333 16.378 16.38 0 3.96-1.406 7.593-3.746 10.426L39.547 37.34c.607.608.61 1.59-.004 2.203a1.56 1.56 0 0 1-2.202.004L26.807 29.012zm-10.427.627c7.322 0 13.26-5.938 13.26-13.26 0-7.324-5.938-13.26-13.26-13.26-7.324 0-13.26 5.936-13.26 13.26 0 7.322 5.936 13.26 13.26 13.26z" fill-rule="evenodd"></symbol>\n </svg>\n</div>\n '
+};
+
+exports.default = templates;
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {+ value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };+
+var _zepto = __webpack_require__(19);
+
+var _zepto2 = _interopRequireDefault(_zepto);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }+
+var utils = {+ /*
+ * Move the content of an object key one level higher.
+ * eg.
+ * {+ * name: 'My name',
+ * hierarchy: {+ * lvl0: 'Foo',
+ * lvl1: 'Bar'
+ * }
+ * }
+ * Will be converted to
+ * {+ * name: 'My name',
+ * lvl0: 'Foo',
+ * lvl1: 'Bar'
+ * }
+ * @param {Object} object Main object+ * @param {String} property Main object key to move up+ * @return {Object}+ * @throws Error when key is not an attribute of Object or is not an object itself
+ */
+ mergeKeyWithParent: function mergeKeyWithParent(object, property) {+ if (object[property] === undefined) {+ return object;
+ }
+ if (_typeof(object[property]) !== 'object') {+ return object;
+ }
+ var newObject = _zepto2.default.extend({}, object, object[property]);+ delete newObject[property];
+ return newObject;
+ },
+
+ /*
+ * Group all objects of a collection by the value of the specified attribute
+ * If the attribute is a string, use the lowercase form.
+ *
+ * eg.
+ * groupBy([
+ * {name: 'Tim', category: 'dev'},+ * {name: 'Vincent', category: 'dev'},+ * {name: 'Ben', category: 'sales'},+ * {name: 'Jeremy', category: 'sales'},+ * {name: 'AlexS', category: 'dev'},+ * {name: 'AlexK', category: 'sales'}+ * ], 'category');
+ * =>
+ * {+ * 'devs': [
+ * {name: 'Tim', category: 'dev'},+ * {name: 'Vincent', category: 'dev'},+ * {name: 'AlexS', category: 'dev'}+ * ],
+ * 'sales': [
+ * {name: 'Ben', category: 'sales'},+ * {name: 'Jeremy', category: 'sales'},+ * {name: 'AlexK', category: 'sales'}+ * ]
+ * }
+ * @param {array} collection Array of objects to group+ * @param {String} property The attribute on which apply the grouping+ * @return {array}+ * @throws Error when one of the element does not have the specified property
+ */
+ groupBy: function groupBy(collection, property) {+ var newCollection = {};+ _zepto2.default.each(collection, function (index, item) {+ if (item[property] === undefined) {+ throw new Error('[groupBy]: Object has no key ' + property);+ }
+ var key = item[property];
+ if (typeof key === 'string') {+ key = key.toLowerCase();
+ }
+ // fix #171 the given data type of docsearch hits might be conflict with the properties of the native Object,
+ // such as the constructor, so we need to do this check.
+ if (!Object.prototype.hasOwnProperty.call(newCollection, key)) {+ newCollection[key] = [];
+ }
+ newCollection[key].push(item);
+ });
+ return newCollection;
+ },
+
+ /*
+ * Return an array of all the values of the specified object
+ * eg.
+ * values({+ * foo: 42,
+ * bar: true,
+ * baz: 'yep'
+ * })
+ * =>
+ * [42, true, yep]
+ * @param {object} object Object to extract values from+ * @return {array}+ */
+ values: function values(object) {+ return Object.keys(object).map(function (key) {+ return object[key];
+ });
+ },
+
+ /*
+ * Flattens an array
+ * eg.
+ * flatten([1, 2, [3, 4], [5, 6]])
+ * =>
+ * [1, 2, 3, 4, 5, 6]
+ * @param {array} array Array to flatten+ * @return {array}+ */
+ flatten: function flatten(array) {+ var results = [];
+ array.forEach(function (value) {+ if (!Array.isArray(value)) {+ results.push(value);
+ return;
+ }
+ value.forEach(function (subvalue) {+ results.push(subvalue);
+ });
+ });
+ return results;
+ },
+
+ /*
+ * Flatten all values of an object into an array, marking each first element of
+ * each group with a specific flag
+ * eg.
+ * flattenAndFlagFirst({+ * 'devs': [
+ * {name: 'Tim', category: 'dev'},+ * {name: 'Vincent', category: 'dev'},+ * {name: 'AlexS', category: 'dev'}+ * ],
+ * 'sales': [
+ * {name: 'Ben', category: 'sales'},+ * {name: 'Jeremy', category: 'sales'},+ * {name: 'AlexK', category: 'sales'}+ * ]
+ * , 'isTop');
+ * =>
+ * [
+ * {name: 'Tim', category: 'dev', isTop: true},+ * {name: 'Vincent', category: 'dev', isTop: false},+ * {name: 'AlexS', category: 'dev', isTop: false},+ * {name: 'Ben', category: 'sales', isTop: true},+ * {name: 'Jeremy', category: 'sales', isTop: false},+ * {name: 'AlexK', category: 'sales', isTop: false}+ * ]
+ * @param {object} object Object to flatten+ * @param {string} flag Flag to set to true on first element of each group+ * @return {array}+ */
+ flattenAndFlagFirst: function flattenAndFlagFirst(object, flag) {+ var values = this.values(object).map(function (collection) {+ return collection.map(function (item, index) {+ item[flag] = index === 0;
+ return item;
+ });
+ });
+ return this.flatten(values);
+ },
+
+ /*
+ * Removes all empty strings, null, false and undefined elements array
+ * eg.
+ * compact([42, false, null, undefined, '', [], 'foo']);
+ * =>
+ * [42, [], 'foo']
+ * @param {array} array Array to compact+ * @return {array}+ */
+ compact: function compact(array) {+ var results = [];
+ array.forEach(function (value) {+ if (!value) {+ return;
+ }
+ results.push(value);
+ });
+ return results;
+ },
+
+ /*
+ * Returns the highlighted value of the specified key in the specified object.
+ * If no highlighted value is available, will return the key value directly
+ * eg.
+ * getHighlightedValue({+ * _highlightResult: {+ * text: {+ * value: '<mark>foo</mark>'
+ * }
+ * },
+ * text: 'foo'
+ * }, 'text');
+ * =>
+ * '<mark>foo</mark>'
+ * @param {object} object Hit object returned by the Algolia API+ * @param {string} property Object key to look for+ * @return {string}+ **/
+ getHighlightedValue: function getHighlightedValue(object, property) {+ if (object._highlightResult && object._highlightResult.hierarchy_camel && object._highlightResult.hierarchy_camel[property] && object._highlightResult.hierarchy_camel[property].matchLevel && object._highlightResult.hierarchy_camel[property].matchLevel !== 'none' && object._highlightResult.hierarchy_camel[property].value) {+ return object._highlightResult.hierarchy_camel[property].value;
+ }
+ if (object._highlightResult && object._highlightResult && object._highlightResult[property] && object._highlightResult[property].value) {+ return object._highlightResult[property].value;
+ }
+ return object[property];
+ },
+
+ /*
+ * Returns the snippeted value of the specified key in the specified object.
+ * If no highlighted value is available, will return the key value directly.
+ * Will add starting and ending ellipsis (…) if we detect that a sentence is
+ * incomplete
+ * eg.
+ * getSnippetedValue({+ * _snippetResult: {+ * text: {+ * value: '<mark>This is an unfinished sentence</mark>'
+ * }
+ * },
+ * text: 'This is an unfinished sentence'
+ * }, 'text');
+ * =>
+ * '<mark>This is an unefinished sentenced</mark>…'
+ * @param {object} object Hit object returned by the Algolia API+ * @param {string} property Object key to look for+ * @return {string}+ **/
+ getSnippetedValue: function getSnippetedValue(object, property) {+ if (!object._snippetResult || !object._snippetResult[property] || !object._snippetResult[property].value) {+ return object[property];
+ }
+ var snippet = object._snippetResult[property].value;
+
+ if (snippet[0] !== snippet[0].toUpperCase()) {+ snippet = '\u2026' + snippet;
+ }
+ if (['.', '!', '?'].indexOf(snippet[snippet.length - 1]) === -1) {+ snippet = snippet + '\u2026';
+ }
+ return snippet;
+ },
+
+ /*
+ * Deep clone an object.
+ * Note: This will not clone functions and dates
+ * @param {object} object Object to clone+ * @return {object}+ */
+ deepClone: function deepClone(object) {+ return JSON.parse(JSON.stringify(object));
+ }
+};
+
+exports.default = utils;
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {+
+
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+exports = module.exports = debug.debug = debug;
+exports.coerce = coerce;
+exports.disable = disable;
+exports.enable = enable;
+exports.enabled = enabled;
+exports.humanize = __webpack_require__(62);
+
+/**
+ * The currently active debug mode names, and names to skip.
+ */
+
+exports.names = [];
+exports.skips = [];
+
+/**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lowercased letter, i.e. "n".
+ */
+
+exports.formatters = {};+
+/**
+ * Previously assigned color.
+ */
+
+var prevColor = 0;
+
+/**
+ * Previous log timestamp.
+ */
+
+var prevTime;
+
+/**
+ * Select a color.
+ *
+ * @return {Number}+ * @api private
+ */
+
+function selectColor() {+ return exports.colors[prevColor++ % exports.colors.length];
+}
+
+/**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace+ * @return {Function}+ * @api public
+ */
+
+function debug(namespace) {+
+ // define the `disabled` version
+ function disabled() {+ }
+ disabled.enabled = false;
+
+ // define the `enabled` version
+ function enabled() {+
+ var self = enabled;
+
+ // set `diff` timestamp
+ var curr = +new Date();
+ var ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+
+ // add the `color` if not set
+ if (null == self.useColors) self.useColors = exports.useColors();
+ if (null == self.color && self.useColors) self.color = selectColor();
+
+ var args = new Array(arguments.length);
+ for (var i = 0; i < args.length; i++) {+ args[i] = arguments[i];
+ }
+
+ args[0] = exports.coerce(args[0]);
+
+ if ('string' !== typeof args[0]) {+ // anything else let's inspect with %o
+ args = ['%o'].concat(args);
+ }
+
+ // apply any `formatters` transformations
+ var index = 0;
+ args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {+ // if we encounter an escaped % then don't increase the array index
+ if (match === '%%') return match;
+ index++;
+ var formatter = exports.formatters[format];
+ if ('function' === typeof formatter) {+ var val = args[index];
+ match = formatter.call(self, val);
+
+ // now we need to remove `args[index]` since it's inlined in the `format`
+ args.splice(index, 1);
+ index--;
+ }
+ return match;
+ });
+
+ // apply env-specific formatting
+ args = exports.formatArgs.apply(self, args);
+
+ var logFn = enabled.log || exports.log || console.log.bind(console);
+ logFn.apply(self, args);
+ }
+ enabled.enabled = true;
+
+ var fn = exports.enabled(namespace) ? enabled : disabled;
+
+ fn.namespace = namespace;
+
+ return fn;
+}
+
+/**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces+ * @api public
+ */
+
+function enable(namespaces) {+ exports.save(namespaces);
+
+ var split = (namespaces || '').split(/[\s,]+/);
+ var len = split.length;
+
+ for (var i = 0; i < len; i++) {+ if (!split[i]) continue; // ignore empty strings
+ namespaces = split[i].replace(/[\\^$+?.()|[\]{}]/g, '\\$&').replace(/\*/g, '.*?');+ if (namespaces[0] === '-') {+ exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));+ } else {+ exports.names.push(new RegExp('^' + namespaces + '$'));+ }
+ }
+}
+
+/**
+ * Disable debug output.
+ *
+ * @api public
+ */
+
+function disable() {+ exports.enable('');+}
+
+/**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name+ * @return {Boolean}+ * @api public
+ */
+
+function enabled(name) {+ var i, len;
+ for (i = 0, len = exports.skips.length; i < len; i++) {+ if (exports.skips[i].test(name)) {+ return false;
+ }
+ }
+ for (i = 0, len = exports.names.length; i < len; i++) {+ if (exports.names[i].test(name)) {+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val+ * @return {Mixed}+ * @api private
+ */
+
+function coerce(val) {+ if (val instanceof Error) return val.stack || val.message;
+ return val;
+}
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __webpack_require__) {+
+/* WEBPACK VAR INJECTION */(function(process, global) {var require;/*! eError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function u(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var c=i(e),l=i(n),h=i(r),f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},p=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),d=function(t){function e(t,n){o(this,e);var r=s(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return r.resolveOptions(n),r.listenClick(t),r}return a(e,t),p(e,[{key:"resolveOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===f(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,h.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new c.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(l.default);t.exports=d})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)})},function(t,e,n){/*! docsearch 2.4.1 | © Algolia | github.com/algolia/docsearch */ !function(e,n){t.exports=n()}(0,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=46)}([function(t,e,n){"use strict";function r(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var i=n(1);t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(){return!!/(msie|trident)/i.test(navigator.userAgent)&&navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return void 0===t||null===t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,function(t,r){t&&(n.isArray(t)?e[r]=[].concat(t):n.isObject(t)&&(e[r]=n.cloneDeep(t)))}),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,function(r,i){if(!(n=e.call(null,r,i,t)))return!1}),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,function(r,i){if(e.call(null,r,i,t))return n=!0,!1}),n):n},getUniqueId:function(){var t=0;return function(){return t++}}(),templatify:function(t){if(this.isFunction(t))return t;var e=i.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"<em>";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"</em>";var o=document.createElement("div");o.appendChild(document.createTextNode(n));var s=document.createElement("div");return s.appendChild(document.createTextNode(t)),s.innerHTML.replace(RegExp(r(i.innerHTML),"g"),e).replace(RegExp(r(o.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var o=t.length;if(o===+o)for(var s=0;s<o;s++)e.call(i,t[s],s,t);else for(var a in t)n.call(t,a)&&e.call(i,t[a],a,t)}},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t){return JSON.parse(JSON.stringify(t))}},function(t,e,n){"use strict";function r(t,e){var r=n(2),i=this;"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):i.stack=(new Error).stack||"Cannot get a stacktrace, browser is too old",this.name="AlgoliaSearchError",this.message=t||"Unknown error",e&&r(e,function(t,e){i[e]=t})}function i(t,e){function n(){var n=Array.prototype.slice.call(arguments,0);"string"!=typeof n[0]&&n.unshift(e),r.apply(this,n),this.name="AlgoliaSearch"+t+"Error"}return o(n,r),n}var o=n(20);o(r,Error),t.exports={AlgoliaSearchError:r,UnparsableJSON:i("UnparsableJSON","Could not parse the incoming response as JSON, see err.more for details"),RequestTimeout:i("RequestTimeout","Request timedout before getting a response"),Network:i("Network","Network issue, see err.more for details"),JSONPScriptFail:i("JSONPScriptFail","<script> was loaded but did not call our provided callback"),JSONPScriptError:i("JSONPScriptError","<script> unable to load due to an `error` event on it"),Unknown:i("Unknown","Unknown error occured")}},function(t,e,n){(function(r){function i(){return"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.excep\ No newline at end of file
* @overview es6-promise - a tiny implementation of Promises/A+.
@@ -12,7 +8347,3355 @@
function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function u(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var c=i(e),l=i(n),h=i(r),f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},p=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),d=function(t){function e(t,n){o(this,e);var r=s(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return r.resolveOptions(n),r.listenClick(t),r}return a(e,t),p(e,[{key:"resolveOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===f(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,h.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new c.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(l.default);t.exports=d})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)})},function(t,e,n){/*! docsearch 2.4.1 | © Algolia | github.com/algolia/docsearch */ !function(e,n){t.exports=n()}(0,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=46)}([function(t,e,n){"use strict";function r(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var i=n(1);t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(){return!!/(msie|trident)/i.test(navigator.userAgent)&&navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return void 0===t||null===t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,function(t,r){t&&(n.isArray(t)?e[r]=[].concat(t):n.isObject(t)&&(e[r]=n.cloneDeep(t)))}),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,function(r,i){if(!(n=e.call(null,r,i,t)))return!1}),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,function(r,i){if(e.call(null,r,i,t))return n=!0,!1}),n):n},getUniqueId:function(){var t=0;return function(){return t++}}(),templatify:function(t){if(this.isFunction(t))return t;var e=i.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"<em>";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"</em>";var o=document.createElement("div");o.appendChild(document.createTextNode(n));var s=document.createElement("div");return s.appendChild(document.createTextNode(t)),s.innerHTML.replace(RegExp(r(i.innerHTML),"g"),e).replace(RegExp(r(o.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var o=t.length;if(o===+o)for(var s=0;s<o;s++)e.call(i,t[s],s,t);else for(var a in t)n.call(t,a)&&e.call(i,t[a],a,t)}},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t){return JSON.parse(JSON.stringify(t))}},function(t,e,n){"use strict";function r(t,e){var r=n(2),i=this;"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):i.stack=(new Error).stack||"Cannot get a stacktrace, browser is too old",this.name="AlgoliaSearchError",this.message=t||"Unknown error",e&&r(e,function(t,e){i[e]=t})}function i(t,e){function n(){var n=Array.prototype.slice.call(arguments,0);"string"!=typeof n[0]&&n.unshift(e),r.apply(this,n),this.name="AlgoliaSearch"+t+"Error"}return o(n,r),n}var o=n(20);o(r,Error),t.exports={AlgoliaSearchError:r,UnparsableJSON:i("UnparsableJSON","Could not parse the incoming response as JSON, see err.more for details"),RequestTimeout:i("RequestTimeout","Request timedout before getting a response"),Network:i("Network","Network issue, see err.more for details"),JSONPScriptFail:i("JSONPScriptFail","<script> was loaded but did not call our provided callback"),JSONPScriptError:i("JSONPScriptError","<script> unable to load due to an `error` event on it"),Unknown:i("Unknown","Unknown error occured")}},function(t,e,n){(function(r){function i(){return"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.excep\ No newline at end of file
* @overview es6-promise - a tiny implementation of Promises/A+.
-configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function u(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var c=i(e),l=i(n),h=i(r),f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},p=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),d=function(t){function e(t,n){o(this,e);var r=s(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return r.resolveOptions(n),r.listenClick(t),r}return a(e,t),p(e,[{key:"resolveOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===f(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,h.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new c.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(l.default);t.exports=d})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)})},function(t,e,n){/*! docsearch 2.4.1 | © Algolia | github.com/algolia/docsearch */+
+(function (global, factory) {+ true ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global.ES6Promise = factory());
+}(this, (function () { 'use strict';+
+function objectOrFunction(x) {+ return typeof x === 'function' || typeof x === 'object' && x !== null;
+}
+
+function isFunction(x) {+ return typeof x === 'function';
+}
+
+var _isArray = undefined;
+if (!Array.isArray) {+ _isArray = function (x) {+ return Object.prototype.toString.call(x) === '[object Array]';
+ };
+} else {+ _isArray = Array.isArray;
+}
+
+var isArray = _isArray;
+
+var len = 0;
+var vertxNext = undefined;
+var customSchedulerFn = undefined;
+
+var asap = function asap(callback, arg) {+ queue[len] = callback;
+ queue[len + 1] = arg;
+ len += 2;
+ if (len === 2) {+ // If len is 2, that means that we need to schedule an async flush.
+ // If additional callbacks are queued before the queue is flushed, they
+ // will be processed by this flush that we are scheduling.
+ if (customSchedulerFn) {+ customSchedulerFn(flush);
+ } else {+ scheduleFlush();
+ }
+ }
+};
+
+function setScheduler(scheduleFn) {+ customSchedulerFn = scheduleFn;
+}
+
+function setAsap(asapFn) {+ asap = asapFn;
+}
+
+var browserWindow = typeof window !== 'undefined' ? window : undefined;
+var browserGlobal = browserWindow || {};+var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
+var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';+
+// test for web worker but not in IE10
+var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
+
+// node
+function useNextTick() {+ // node version 0.10.x displays a deprecation warning when nextTick is used recursively
+ // see https://github.com/cujojs/when/issues/410 for details
+ return function () {+ return process.nextTick(flush);
+ };
+}
+
+// vertx
+function useVertxTimer() {+ if (typeof vertxNext !== 'undefined') {+ return function () {+ vertxNext(flush);
+ };
+ }
+
+ return useSetTimeout();
+}
+
+function useMutationObserver() {+ var iterations = 0;
+ var observer = new BrowserMutationObserver(flush);
+ var node = document.createTextNode('');+ observer.observe(node, { characterData: true });+
+ return function () {+ node.data = iterations = ++iterations % 2;
+ };
+}
+
+// web worker
+function useMessageChannel() {+ var channel = new MessageChannel();
+ channel.port1.onmessage = flush;
+ return function () {+ return channel.port2.postMessage(0);
+ };
+}
+
+function useSetTimeout() {+ // Store setTimeout reference so es6-promise will be unaffected by
+ // other code modifying setTimeout (like sinon.useFakeTimers())
+ var globalSetTimeout = setTimeout;
+ return function () {+ return globalSetTimeout(flush, 1);
+ };
+}
+
+var queue = new Array(1000);
+function flush() {+ for (var i = 0; i < len; i += 2) {+ var callback = queue[i];
+ var arg = queue[i + 1];
+
+ callback(arg);
+
+ queue[i] = undefined;
+ queue[i + 1] = undefined;
+ }
+
+ len = 0;
+}
+
+function attemptVertx() {+ try {+ var r = require;
+ var vertx = __webpack_require__(67);
+ vertxNext = vertx.runOnLoop || vertx.runOnContext;
+ return useVertxTimer();
+ } catch (e) {+ return useSetTimeout();
+ }
+}
+
+var scheduleFlush = undefined;
+// Decide what async method to use to triggering processing of queued callbacks:
+if (isNode) {+ scheduleFlush = useNextTick();
+} else if (BrowserMutationObserver) {+ scheduleFlush = useMutationObserver();
+} else if (isWorker) {+ scheduleFlush = useMessageChannel();
+} else if (browserWindow === undefined && "function" === 'function') {+ scheduleFlush = attemptVertx();
+} else {+ scheduleFlush = useSetTimeout();
+}
+
+function then(onFulfillment, onRejection) {+ var _arguments = arguments;
+
+ var parent = this;
+
+ var child = new this.constructor(noop);
+
+ if (child[PROMISE_ID] === undefined) {+ makePromise(child);
+ }
+
+ var _state = parent._state;
+
+ if (_state) {+ (function () {+ var callback = _arguments[_state - 1];
+ asap(function () {+ return invokeCallback(_state, child, callback, parent._result);
+ });
+ })();
+ } else {+ subscribe(parent, child, onFulfillment, onRejection);
+ }
+
+ return child;
+}
+
+/**
+ `Promise.resolve` returns a promise that will become resolved with the
+ passed `value`. It is shorthand for the following:
+
+ ```javascript
+ let promise = new Promise(function(resolve, reject){+ resolve(1);
+ });
+
+ promise.then(function(value){+ // value === 1
+ });
+ ```
+
+ Instead of writing the above, your code now simply becomes the following:
+
+ ```javascript
+ let promise = Promise.resolve(1);
+
+ promise.then(function(value){+ // value === 1
+ });
+ ```
+
+ @method resolve
+ @static
+ @param {Any} value value that the returned promise will be resolved with+ Useful for tooling.
+ @return {Promise} a promise that will become fulfilled with the given+ `value`
+*/
+function resolve(object) {+ /*jshint validthis:true */
+ var Constructor = this;
+
+ if (object && typeof object === 'object' && object.constructor === Constructor) {+ return object;
+ }
+
+ var promise = new Constructor(noop);
+ _resolve(promise, object);
+ return promise;
+}
+
+var PROMISE_ID = Math.random().toString(36).substring(16);
+
+function noop() {}+
+var PENDING = void 0;
+var FULFILLED = 1;
+var REJECTED = 2;
+
+var GET_THEN_ERROR = new ErrorObject();
+
+function selfFulfillment() {+ return new TypeError("You cannot resolve a promise with itself");+}
+
+function cannotReturnOwn() {+ return new TypeError('A promises callback cannot return that same promise.');+}
+
+function getThen(promise) {+ try {+ return promise.then;
+ } catch (error) {+ GET_THEN_ERROR.error = error;
+ return GET_THEN_ERROR;
+ }
+}
+
+function tryThen(then, value, fulfillmentHandler, rejectionHandler) {+ try {+ then.call(value, fulfillmentHandler, rejectionHandler);
+ } catch (e) {+ return e;
+ }
+}
+
+function handleForeignThenable(promise, thenable, then) {+ asap(function (promise) {+ var sealed = false;
+ var error = tryThen(then, thenable, function (value) {+ if (sealed) {+ return;
+ }
+ sealed = true;
+ if (thenable !== value) {+ _resolve(promise, value);
+ } else {+ fulfill(promise, value);
+ }
+ }, function (reason) {+ if (sealed) {+ return;
+ }
+ sealed = true;
+
+ _reject(promise, reason);
+ }, 'Settle: ' + (promise._label || ' unknown promise'));
+
+ if (!sealed && error) {+ sealed = true;
+ _reject(promise, error);
+ }
+ }, promise);
+}
+
+function handleOwnThenable(promise, thenable) {+ if (thenable._state === FULFILLED) {+ fulfill(promise, thenable._result);
+ } else if (thenable._state === REJECTED) {+ _reject(promise, thenable._result);
+ } else {+ subscribe(thenable, undefined, function (value) {+ return _resolve(promise, value);
+ }, function (reason) {+ return _reject(promise, reason);
+ });
+ }
+}
+
+function handleMaybeThenable(promise, maybeThenable, then$$) {+ if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) {+ handleOwnThenable(promise, maybeThenable);
+ } else {+ if (then$$ === GET_THEN_ERROR) {+ _reject(promise, GET_THEN_ERROR.error);
+ } else if (then$$ === undefined) {+ fulfill(promise, maybeThenable);
+ } else if (isFunction(then$$)) {+ handleForeignThenable(promise, maybeThenable, then$$);
+ } else {+ fulfill(promise, maybeThenable);
+ }
+ }
+}
+
+function _resolve(promise, value) {+ if (promise === value) {+ _reject(promise, selfFulfillment());
+ } else if (objectOrFunction(value)) {+ handleMaybeThenable(promise, value, getThen(value));
+ } else {+ fulfill(promise, value);
+ }
+}
+
+function publishRejection(promise) {+ if (promise._onerror) {+ promise._onerror(promise._result);
+ }
+
+ publish(promise);
+}
+
+function fulfill(promise, value) {+ if (promise._state !== PENDING) {+ return;
+ }
+
+ promise._result = value;
+ promise._state = FULFILLED;
+
+ if (promise._subscribers.length !== 0) {+ asap(publish, promise);
+ }
+}
+
+function _reject(promise, reason) {+ if (promise._state !== PENDING) {+ return;
+ }
+ promise._state = REJECTED;
+ promise._result = reason;
+
+ asap(publishRejection, promise);
+}
+
+function subscribe(parent, child, onFulfillment, onRejection) {+ var _subscribers = parent._subscribers;
+ var length = _subscribers.length;
+
+ parent._onerror = null;
+
+ _subscribers[length] = child;
+ _subscribers[length + FULFILLED] = onFulfillment;
+ _subscribers[length + REJECTED] = onRejection;
+
+ if (length === 0 && parent._state) {+ asap(publish, parent);
+ }
+}
+
+function publish(promise) {+ var subscribers = promise._subscribers;
+ var settled = promise._state;
+
+ if (subscribers.length === 0) {+ return;
+ }
+
+ var child = undefined,
+ callback = undefined,
+ detail = promise._result;
+
+ for (var i = 0; i < subscribers.length; i += 3) {+ child = subscribers[i];
+ callback = subscribers[i + settled];
+
+ if (child) {+ invokeCallback(settled, child, callback, detail);
+ } else {+ callback(detail);
+ }
+ }
+
+ promise._subscribers.length = 0;
+}
+
+function ErrorObject() {+ this.error = null;
+}
+
+var TRY_CATCH_ERROR = new ErrorObject();
+
+function tryCatch(callback, detail) {+ try {+ return callback(detail);
+ } catch (e) {+ TRY_CATCH_ERROR.error = e;
+ return TRY_CATCH_ERROR;
+ }
+}
+
+function invokeCallback(settled, promise, callback, detail) {+ var hasCallback = isFunction(callback),
+ value = undefined,
+ error = undefined,
+ succeeded = undefined,
+ failed = undefined;
+
+ if (hasCallback) {+ value = tryCatch(callback, detail);
+
+ if (value === TRY_CATCH_ERROR) {+ failed = true;
+ error = value.error;
+ value = null;
+ } else {+ succeeded = true;
+ }
+
+ if (promise === value) {+ _reject(promise, cannotReturnOwn());
+ return;
+ }
+ } else {+ value = detail;
+ succeeded = true;
+ }
+
+ if (promise._state !== PENDING) {+ // noop
+ } else if (hasCallback && succeeded) {+ _resolve(promise, value);
+ } else if (failed) {+ _reject(promise, error);
+ } else if (settled === FULFILLED) {+ fulfill(promise, value);
+ } else if (settled === REJECTED) {+ _reject(promise, value);
+ }
+}
+
+function initializePromise(promise, resolver) {+ try {+ resolver(function resolvePromise(value) {+ _resolve(promise, value);
+ }, function rejectPromise(reason) {+ _reject(promise, reason);
+ });
+ } catch (e) {+ _reject(promise, e);
+ }
+}
+
+var id = 0;
+function nextId() {+ return id++;
+}
+
+function makePromise(promise) {+ promise[PROMISE_ID] = id++;
+ promise._state = undefined;
+ promise._result = undefined;
+ promise._subscribers = [];
+}
+
+function Enumerator(Constructor, input) {+ this._instanceConstructor = Constructor;
+ this.promise = new Constructor(noop);
+
+ if (!this.promise[PROMISE_ID]) {+ makePromise(this.promise);
+ }
+
+ if (isArray(input)) {+ this._input = input;
+ this.length = input.length;
+ this._remaining = input.length;
+
+ this._result = new Array(this.length);
+
+ if (this.length === 0) {+ fulfill(this.promise, this._result);
+ } else {+ this.length = this.length || 0;
+ this._enumerate();
+ if (this._remaining === 0) {+ fulfill(this.promise, this._result);
+ }
+ }
+ } else {+ _reject(this.promise, validationError());
+ }
+}
+
+function validationError() {+ return new Error('Array Methods must be provided an Array');+};
+
+Enumerator.prototype._enumerate = function () {+ var length = this.length;
+ var _input = this._input;
+
+ for (var i = 0; this._state === PENDING && i < length; i++) {+ this._eachEntry(_input[i], i);
+ }
+};
+
+Enumerator.prototype._eachEntry = function (entry, i) {+ var c = this._instanceConstructor;
+ var resolve$$ = c.resolve;
+
+ if (resolve$$ === resolve) {+ var _then = getThen(entry);
+
+ if (_then === then && entry._state !== PENDING) {+ this._settledAt(entry._state, i, entry._result);
+ } else if (typeof _then !== 'function') {+ this._remaining--;
+ this._result[i] = entry;
+ } else if (c === Promise) {+ var promise = new c(noop);
+ handleMaybeThenable(promise, entry, _then);
+ this._willSettleAt(promise, i);
+ } else {+ this._willSettleAt(new c(function (resolve$$) {+ return resolve$$(entry);
+ }), i);
+ }
+ } else {+ this._willSettleAt(resolve$$(entry), i);
+ }
+};
+
+Enumerator.prototype._settledAt = function (state, i, value) {+ var promise = this.promise;
+
+ if (promise._state === PENDING) {+ this._remaining--;
+
+ if (state === REJECTED) {+ _reject(promise, value);
+ } else {+ this._result[i] = value;
+ }
+ }
+
+ if (this._remaining === 0) {+ fulfill(promise, this._result);
+ }
+};
+
+Enumerator.prototype._willSettleAt = function (promise, i) {+ var enumerator = this;
+
+ subscribe(promise, undefined, function (value) {+ return enumerator._settledAt(FULFILLED, i, value);
+ }, function (reason) {+ return enumerator._settledAt(REJECTED, i, reason);
+ });
+};
+
+/**
+ `Promise.all` accepts an array of promises, and returns a new promise which
+ is fulfilled with an array of fulfillment values for the passed promises, or
+ rejected with the reason of the first passed promise to be rejected. It casts all
+ elements of the passed iterable to promises as it runs this algorithm.
+
+ Example:
+
+ ```javascript
+ let promise1 = resolve(1);
+ let promise2 = resolve(2);
+ let promise3 = resolve(3);
+ let promises = [ promise1, promise2, promise3 ];
+
+ Promise.all(promises).then(function(array){+ // The array here would be [ 1, 2, 3 ];
+ });
+ ```
+
+ If any of the `promises` given to `all` are rejected, the first promise
+ that is rejected will be given as an argument to the returned promises's
+ rejection handler. For example:
+
+ Example:
+
+ ```javascript
+ let promise1 = resolve(1);
+ let promise2 = reject(new Error("2"));+ let promise3 = reject(new Error("3"));+ let promises = [ promise1, promise2, promise3 ];
+
+ Promise.all(promises).then(function(array){+ // Code here never runs because there are rejected promises!
+ }, function(error) {+ // error.message === "2"
+ });
+ ```
+
+ @method all
+ @static
+ @param {Array} entries array of promises+ @param {String} label optional string for labeling the promise.+ Useful for tooling.
+ @return {Promise} promise that is fulfilled when all `promises` have been+ fulfilled, or rejected if any of them become rejected.
+ @static
+*/
+function all(entries) {+ return new Enumerator(this, entries).promise;
+}
+
+/**
+ `Promise.race` returns a new promise which is settled in the same way as the
+ first passed promise to settle.
+
+ Example:
+
+ ```javascript
+ let promise1 = new Promise(function(resolve, reject){+ setTimeout(function(){+ resolve('promise 1');+ }, 200);
+ });
+
+ let promise2 = new Promise(function(resolve, reject){+ setTimeout(function(){+ resolve('promise 2');+ }, 100);
+ });
+
+ Promise.race([promise1, promise2]).then(function(result){+ // result === 'promise 2' because it was resolved before promise1
+ // was resolved.
+ });
+ ```
+
+ `Promise.race` is deterministic in that only the state of the first
+ settled promise matters. For example, even if other promises given to the
+ `promises` array argument are resolved, but the first settled promise has
+ become rejected before the other promises became fulfilled, the returned
+ promise will become rejected:
+
+ ```javascript
+ let promise1 = new Promise(function(resolve, reject){+ setTimeout(function(){+ resolve('promise 1');+ }, 200);
+ });
+
+ let promise2 = new Promise(function(resolve, reject){+ setTimeout(function(){+ reject(new Error('promise 2'));+ }, 100);
+ });
+
+ Promise.race([promise1, promise2]).then(function(result){+ // Code here never runs
+ }, function(reason){+ // reason.message === 'promise 2' because promise 2 became rejected before
+ // promise 1 became fulfilled
+ });
+ ```
+
+ An example real-world use case is implementing timeouts:
+
+ ```javascript
+ Promise.race([ajax('foo.json'), timeout(5000)])+ ```
+
+ @method race
+ @static
+ @param {Array} promises array of promises to observe+ Useful for tooling.
+ @return {Promise} a promise which settles in the same way as the first passed+ promise to settle.
+*/
+function race(entries) {+ /*jshint validthis:true */
+ var Constructor = this;
+
+ if (!isArray(entries)) {+ return new Constructor(function (_, reject) {+ return reject(new TypeError('You must pass an array to race.'));+ });
+ } else {+ return new Constructor(function (resolve, reject) {+ var length = entries.length;
+ for (var i = 0; i < length; i++) {+ Constructor.resolve(entries[i]).then(resolve, reject);
+ }
+ });
+ }
+}
+
+/**
+ `Promise.reject` returns a promise rejected with the passed `reason`.
+ It is shorthand for the following:
+
+ ```javascript
+ let promise = new Promise(function(resolve, reject){+ reject(new Error('WHOOPS'));+ });
+
+ promise.then(function(value){+ // Code here doesn't run because the promise is rejected!
+ }, function(reason){+ // reason.message === 'WHOOPS'
+ });
+ ```
+
+ Instead of writing the above, your code now simply becomes the following:
+
+ ```javascript
+ let promise = Promise.reject(new Error('WHOOPS'));+
+ promise.then(function(value){+ // Code here doesn't run because the promise is rejected!
+ }, function(reason){+ // reason.message === 'WHOOPS'
+ });
+ ```
+
+ @method reject
+ @static
+ @param {Any} reason value that the returned promise will be rejected with.+ Useful for tooling.
+ @return {Promise} a promise rejected with the given `reason`.+*/
+function reject(reason) {+ /*jshint validthis:true */
+ var Constructor = this;
+ var promise = new Constructor(noop);
+ _reject(promise, reason);
+ return promise;
+}
+
+function needsResolver() {+ throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');+}
+
+function needsNew() {+ throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");+}
+
+/**
+ Promise objects represent the eventual result of an asynchronous operation. The
+ primary way of interacting with a promise is through its `then` method, which
+ registers callbacks to receive either a promise's eventual value or the reason
+ why the promise cannot be fulfilled.
+
+ Terminology
+ -----------
+
+ - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
+ - `thenable` is an object or function that defines a `then` method.
+ - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
+ - `exception` is a value that is thrown using the throw statement.
+ - `reason` is a value that indicates why a promise was rejected.
+ - `settled` the final resting state of a promise, fulfilled or rejected.
+
+ A promise can be in one of three states: pending, fulfilled, or rejected.
+
+ Promises that are fulfilled have a fulfillment value and are in the fulfilled
+ state. Promises that are rejected have a rejection reason and are in the
+ rejected state. A fulfillment value is never a thenable.
+
+ Promises can also be said to *resolve* a value. If this value is also a
+ promise, then the original promise's settled state will match the value's
+ settled state. So a promise that *resolves* a promise that rejects will
+ itself reject, and a promise that *resolves* a promise that fulfills will
+ itself fulfill.
+
+
+ Basic Usage:
+ ------------
+
+ ```js
+ let promise = new Promise(function(resolve, reject) {+ // on success
+ resolve(value);
+
+ // on failure
+ reject(reason);
+ });
+
+ promise.then(function(value) {+ // on fulfillment
+ }, function(reason) {+ // on rejection
+ });
+ ```
+
+ Advanced Usage:
+ ---------------
+
+ Promises shine when abstracting away asynchronous interactions such as
+ `XMLHttpRequest`s.
+
+ ```js
+ function getJSON(url) {+ return new Promise(function(resolve, reject){+ let xhr = new XMLHttpRequest();
+
+ xhr.open('GET', url);+ xhr.onreadystatechange = handler;
+ xhr.responseType = 'json';
+ xhr.setRequestHeader('Accept', 'application/json');+ xhr.send();
+
+ function handler() {+ if (this.readyState === this.DONE) {+ if (this.status === 200) {+ resolve(this.response);
+ } else {+ reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));+ }
+ }
+ };
+ });
+ }
+
+ getJSON('/posts.json').then(function(json) {+ // on fulfillment
+ }, function(reason) {+ // on rejection
+ });
+ ```
+
+ Unlike callbacks, promises are great composable primitives.
+
+ ```js
+ Promise.all([
+ getJSON('/posts'),+ getJSON('/comments')+ ]).then(function(values){+ values[0] // => postsJSON
+ values[1] // => commentsJSON
+
+ return values;
+ });
+ ```
+
+ @class Promise
+ @param {function} resolver+ Useful for tooling.
+ @constructor
+*/
+function Promise(resolver) {+ this[PROMISE_ID] = nextId();
+ this._result = this._state = undefined;
+ this._subscribers = [];
+
+ if (noop !== resolver) {+ typeof resolver !== 'function' && needsResolver();
+ this instanceof Promise ? initializePromise(this, resolver) : needsNew();
+ }
+}
+
+Promise.all = all;
+Promise.race = race;
+Promise.resolve = resolve;
+Promise.reject = reject;
+Promise._setScheduler = setScheduler;
+Promise._setAsap = setAsap;
+Promise._asap = asap;
+
+Promise.prototype = {+ constructor: Promise,
+
+ /**
+ The primary way of interacting with a promise is through its `then` method,
+ which registers callbacks to receive either a promise's eventual value or the
+ reason why the promise cannot be fulfilled.
+
+ ```js
+ findUser().then(function(user){+ // user is available
+ }, function(reason){+ // user is unavailable, and you are given the reason why
+ });
+ ```
+
+ Chaining
+ --------
+
+ The return value of `then` is itself a promise. This second, 'downstream'
+ promise is resolved with the return value of the first promise's fulfillment
+ or rejection handler, or rejected if the handler throws an exception.
+
+ ```js
+ findUser().then(function (user) {+ return user.name;
+ }, function (reason) {+ return 'default name';
+ }).then(function (userName) {+ // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
+ // will be `'default name'`
+ });
+
+ findUser().then(function (user) {+ throw new Error('Found user, but still unhappy');+ }, function (reason) {+ throw new Error('`findUser` rejected and we're unhappy');+ }).then(function (value) {+ // never reached
+ }, function (reason) {+ // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
+ // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
+ });
+ ```
+ If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
+
+ ```js
+ findUser().then(function (user) {+ throw new PedagogicalException('Upstream error');+ }).then(function (value) {+ // never reached
+ }).then(function (value) {+ // never reached
+ }, function (reason) {+ // The `PedgagocialException` is propagated all the way down to here
+ });
+ ```
+
+ Assimilation
+ ------------
+
+ Sometimes the value you want to propagate to a downstream promise can only be
+ retrieved asynchronously. This can be achieved by returning a promise in the
+ fulfillment or rejection handler. The downstream promise will then be pending
+ until the returned promise is settled. This is called *assimilation*.
+
+ ```js
+ findUser().then(function (user) {+ return findCommentsByAuthor(user);
+ }).then(function (comments) {+ // The user's comments are now available
+ });
+ ```
+
+ If the assimliated promise rejects, then the downstream promise will also reject.
+
+ ```js
+ findUser().then(function (user) {+ return findCommentsByAuthor(user);
+ }).then(function (comments) {+ // If `findCommentsByAuthor` fulfills, we'll have the value here
+ }, function (reason) {+ // If `findCommentsByAuthor` rejects, we'll have the reason here
+ });
+ ```
+
+ Simple Example
+ --------------
+
+ Synchronous Example
+
+ ```javascript
+ let result;
+
+ try {+ result = findResult();
+ // success
+ } catch(reason) {+ // failure
+ }
+ ```
+
+ Errback Example
+
+ ```js
+ findResult(function(result, err){+ if (err) {+ // failure
+ } else {+ // success
+ }
+ });
+ ```
+
+ Promise Example;
+
+ ```javascript
+ findResult().then(function(result){+ // success
+ }, function(reason){+ // failure
+ });
+ ```
+
+ Advanced Example
+ --------------
+
+ Synchronous Example
+
+ ```javascript
+ let author, books;
+
+ try {+ author = findAuthor();
+ books = findBooksByAuthor(author);
+ // success
+ } catch(reason) {+ // failure
+ }
+ ```
+
+ Errback Example
+
+ ```js
+
+ function foundBooks(books) {+
+ }
+
+ function failure(reason) {+
+ }
+
+ findAuthor(function(author, err){+ if (err) {+ failure(err);
+ // failure
+ } else {+ try {+ findBoooksByAuthor(author, function(books, err) {+ if (err) {+ failure(err);
+ } else {+ try {+ foundBooks(books);
+ } catch(reason) {+ failure(reason);
+ }
+ }
+ });
+ } catch(error) {+ failure(err);
+ }
+ // success
+ }
+ });
+ ```
+
+ Promise Example;
+
+ ```javascript
+ findAuthor().
+ then(findBooksByAuthor).
+ then(function(books){+ // found books
+ }).catch(function(reason){+ // something went wrong
+ });
+ ```
+
+ @method then
+ @param {Function} onFulfilled+ @param {Function} onRejected+ Useful for tooling.
+ @return {Promise}+ */
+ then: then,
+
+ /**
+ `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
+ as the catch block of a try/catch statement.
+
+ ```js
+ function findAuthor(){+ throw new Error('couldn't find that author');+ }
+
+ // synchronous
+ try {+ findAuthor();
+ } catch(reason) {+ // something went wrong
+ }
+
+ // async with promises
+ findAuthor().catch(function(reason){+ // something went wrong
+ });
+ ```
+
+ @method catch
+ @param {Function} onRejection+ Useful for tooling.
+ @return {Promise}+ */
+ 'catch': function _catch(onRejection) {+ return this.then(null, onRejection);
+ }
+};
+
+function polyfill() {+ var local = undefined;
+
+ if (typeof global !== 'undefined') {+ local = global;
+ } else if (typeof self !== 'undefined') {+ local = self;
+ } else {+ try {+ local = Function('return this')();+ } catch (e) {+ throw new Error('polyfill failed because global object is unavailable in this environment');+ }
+ }
+
+ var P = local.Promise;
+
+ if (P) {+ var promiseToString = null;
+ try {+ promiseToString = Object.prototype.toString.call(P.resolve());
+ } catch (e) {+ // silently ignored
+ }
+
+ if (promiseToString === '[object Promise]' && !P.cast) {+ return;
+ }
+ }
+
+ local.Promise = Promise;
+}
+
+// Strange compat..
+Promise.polyfill = polyfill;
+Promise.Promise = Promise;
+
+return Promise;
+
+})));
+//# sourceMappingURL=es6-promise.map
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11), __webpack_require__(3)))
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {+
+/* WEBPACK VAR INJECTION */(function(global) {if (typeof window !== "undefined") {+ module.exports = window;
+} else if (typeof global !== "undefined") {+ module.exports = global;
+} else if (typeof self !== "undefined"){+ module.exports = self;
+} else {+ module.exports = {};+}
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {+
+/*
+ * Copyright 2011 Twitter, Inc.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function (Hogan) {+ // Setup regex assignments
+ // remove whitespace according to Mustache spec
+ var rIsWhitespace = /\S/,
+ rQuot = /\"/g,
+ rNewline = /\n/g,
+ rCr = /\r/g,
+ rSlash = /\\/g,
+ rLineSep = /\u2028/,
+ rParagraphSep = /\u2029/;
+
+ Hogan.tags = {+ '#': 1, '^': 2, '<': 3, '$': 4,
+ '/': 5, '!': 6, '>': 7, '=': 8, '_v': 9,
+ '{': 10, '&': 11, '_t': 12+ };
+
+ Hogan.scan = function scan(text, delimiters) {+ var len = text.length,
+ IN_TEXT = 0,
+ IN_TAG_TYPE = 1,
+ IN_TAG = 2,
+ state = IN_TEXT,
+ tagType = null,
+ tag = null,
+ buf = '',
+ tokens = [],
+ seenTag = false,
+ i = 0,
+ lineStart = 0,
+ otag = '{{',+ ctag = '}}';
+
+ function addBuf() {+ if (buf.length > 0) {+ tokens.push({tag: '_t', text: new String(buf)});+ buf = '';
+ }
+ }
+
+ function lineIsWhitespace() {+ var isAllWhitespace = true;
+ for (var j = lineStart; j < tokens.length; j++) {+ isAllWhitespace =
+ (Hogan.tags[tokens[j].tag] < Hogan.tags['_v']) ||
+ (tokens[j].tag == '_t' && tokens[j].text.match(rIsWhitespace) === null);
+ if (!isAllWhitespace) {+ return false;
+ }
+ }
+
+ return isAllWhitespace;
+ }
+
+ function filterLine(haveSeenTag, noNewLine) {+ addBuf();
+
+ if (haveSeenTag && lineIsWhitespace()) {+ for (var j = lineStart, next; j < tokens.length; j++) {+ if (tokens[j].text) {+ if ((next = tokens[j+1]) && next.tag == '>') {+ // set indent to token value
+ next.indent = tokens[j].text.toString()
+ }
+ tokens.splice(j, 1);
+ }
+ }
+ } else if (!noNewLine) {+ tokens.push({tag:'\n'});+ }
+
+ seenTag = false;
+ lineStart = tokens.length;
+ }
+
+ function changeDelimiters(text, index) {+ var close = '=' + ctag,
+ closeIndex = text.indexOf(close, index),
+ delimiters = trim(
+ text.substring(text.indexOf('=', index) + 1, closeIndex)+ ).split(' ');+
+ otag = delimiters[0];
+ ctag = delimiters[delimiters.length - 1];
+
+ return closeIndex + close.length - 1;
+ }
+
+ if (delimiters) {+ delimiters = delimiters.split(' ');+ otag = delimiters[0];
+ ctag = delimiters[1];
+ }
+
+ for (i = 0; i < len; i++) {+ if (state == IN_TEXT) {+ if (tagChange(otag, text, i)) {+ --i;
+ addBuf();
+ state = IN_TAG_TYPE;
+ } else {+ if (text.charAt(i) == '\n') {+ filterLine(seenTag);
+ } else {+ buf += text.charAt(i);
+ }
+ }
+ } else if (state == IN_TAG_TYPE) {+ i += otag.length - 1;
+ tag = Hogan.tags[text.charAt(i + 1)];
+ tagType = tag ? text.charAt(i + 1) : '_v';
+ if (tagType == '=') {+ i = changeDelimiters(text, i);
+ state = IN_TEXT;
+ } else {+ if (tag) {+ i++;
+ }
+ state = IN_TAG;
+ }
+ seenTag = i;
+ } else {+ if (tagChange(ctag, text, i)) {+ tokens.push({tag: tagType, n: trim(buf), otag: otag, ctag: ctag,+ i: (tagType == '/') ? seenTag - otag.length : i + ctag.length});
+ buf = '';
+ i += ctag.length - 1;
+ state = IN_TEXT;
+ if (tagType == '{') {+ if (ctag == '}}') {+ i++;
+ } else {+ cleanTripleStache(tokens[tokens.length - 1]);
+ }
+ }
+ } else {+ buf += text.charAt(i);
+ }
+ }
+ }
+
+ filterLine(seenTag, true);
+
+ return tokens;
+ }
+
+ function cleanTripleStache(token) {+ if (token.n.substr(token.n.length - 1) === '}') {+ token.n = token.n.substring(0, token.n.length - 1);
+ }
+ }
+
+ function trim(s) {+ if (s.trim) {+ return s.trim();
+ }
+
+ return s.replace(/^\s*|\s*$/g, '');
+ }
+
+ function tagChange(tag, text, index) {+ if (text.charAt(index) != tag.charAt(0)) {+ return false;
+ }
+
+ for (var i = 1, l = tag.length; i < l; i++) {+ if (text.charAt(index + i) != tag.charAt(i)) {+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ // the tags allowed inside super templates
+ var allowedInSuper = {'_t': true, '\n': true, '$': true, '/': true};+
+ function buildTree(tokens, kind, stack, customTags) {+ var instructions = [],
+ opener = null,
+ tail = null,
+ token = null;
+
+ tail = stack[stack.length - 1];
+
+ while (tokens.length > 0) {+ token = tokens.shift();
+
+ if (tail && tail.tag == '<' && !(token.tag in allowedInSuper)) {+ throw new Error('Illegal content in < super tag.');+ }
+
+ if (Hogan.tags[token.tag] <= Hogan.tags['$'] || isOpener(token, customTags)) {+ stack.push(token);
+ token.nodes = buildTree(tokens, token.tag, stack, customTags);
+ } else if (token.tag == '/') {+ if (stack.length === 0) {+ throw new Error('Closing tag without opener: /' + token.n);+ }
+ opener = stack.pop();
+ if (token.n != opener.n && !isCloser(token.n, opener.n, customTags)) {+ throw new Error('Nesting error: ' + opener.n + ' vs. ' + token.n);+ }
+ opener.end = token.i;
+ return instructions;
+ } else if (token.tag == '\n') {+ token.last = (tokens.length == 0) || (tokens[0].tag == '\n');
+ }
+
+ instructions.push(token);
+ }
+
+ if (stack.length > 0) {+ throw new Error('missing closing tag: ' + stack.pop().n);+ }
+
+ return instructions;
+ }
+
+ function isOpener(token, tags) {+ for (var i = 0, l = tags.length; i < l; i++) {+ if (tags[i].o == token.n) {+ token.tag = '#';
+ return true;
+ }
+ }
+ }
+
+ function isCloser(close, open, tags) {+ for (var i = 0, l = tags.length; i < l; i++) {+ if (tags[i].c == close && tags[i].o == open) {+ return true;
+ }
+ }
+ }
+
+ function stringifySubstitutions(obj) {+ var items = [];
+ for (var key in obj) {+ items.push('"' + esc(key) + '": function(c,p,t,i) {' + obj[key] + '}');+ }
+ return "{ " + items.join(",") + " }";+ }
+
+ function stringifyPartials(codeObj) {+ var partials = [];
+ for (var key in codeObj.partials) {+ partials.push('"' + esc(key) + '":{name:"' + esc(codeObj.partials[key].name) + '", ' + stringifyPartials(codeObj.partials[key]) + "}");+ }
+ return "partials: {" + partials.join(",") + "}, subs: " + stringifySubstitutions(codeObj.subs);+ }
+
+ Hogan.stringify = function(codeObj, text, options) {+ return "{code: function (c,p,i) { " + Hogan.wrapMain(codeObj.code) + " }," + stringifyPartials(codeObj) + "}";+ }
+
+ var serialNo = 0;
+ Hogan.generate = function(tree, text, options) {+ serialNo = 0;
+ var context = { code: '', subs: {}, partials: {} };+ Hogan.walk(tree, context);
+
+ if (options.asString) {+ return this.stringify(context, text, options);
+ }
+
+ return this.makeTemplate(context, text, options);
+ }
+
+ Hogan.wrapMain = function(code) {+ return 'var t=this;t.b(i=i||"");' + code + 'return t.fl();';
+ }
+
+ Hogan.template = Hogan.Template;
+
+ Hogan.makeTemplate = function(codeObj, text, options) {+ var template = this.makePartials(codeObj);
+ template.code = new Function('c', 'p', 'i', this.wrapMain(codeObj.code));+ return new this.template(template, text, this, options);
+ }
+
+ Hogan.makePartials = function(codeObj) {+ var key, template = {subs: {}, partials: codeObj.partials, name: codeObj.name};+ for (key in template.partials) {+ template.partials[key] = this.makePartials(template.partials[key]);
+ }
+ for (key in codeObj.subs) {+ template.subs[key] = new Function('c', 'p', 't', 'i', codeObj.subs[key]);+ }
+ return template;
+ }
+
+ function esc(s) {+ return s.replace(rSlash, '\\\\')
+ .replace(rQuot, '\\\"')
+ .replace(rNewline, '\\n')
+ .replace(rCr, '\\r')
+ .replace(rLineSep, '\\u2028')
+ .replace(rParagraphSep, '\\u2029');
+ }
+
+ function chooseMethod(s) {+ return (~s.indexOf('.')) ? 'd' : 'f';+ }
+
+ function createPartial(node, context) {+ var prefix = "<" + (context.prefix || "");
+ var sym = prefix + node.n + serialNo++;
+ context.partials[sym] = {name: node.n, partials: {}};+ context.code += 't.b(t.rp("' + esc(sym) + '",c,p,"' + (node.indent || '') + '"));';+ return sym;
+ }
+
+ Hogan.codegen = {+ '#': function(node, context) {+ context.code += 'if(t.s(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,1),' ++ 'c,p,0,' + node.i + ',' + node.end + ',"' + node.otag + " " + node.ctag + '")){' ++ 't.rs(c,p,' + 'function(c,p,t){';+ Hogan.walk(node.nodes, context);
+ context.code += '});c.pop();}';
+ },
+
+ '^': function(node, context) {+ context.code += 'if(!t.s(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,1),c,p,1,0,0,"")){';+ Hogan.walk(node.nodes, context);
+ context.code += '};';
+ },
+
+ '>': createPartial,
+ '<': function(node, context) {+ var ctx = {partials: {}, code: '', subs: {}, inPartial: true};+ Hogan.walk(node.nodes, ctx);
+ var template = context.partials[createPartial(node, context)];
+ template.subs = ctx.subs;
+ template.partials = ctx.partials;
+ },
+
+ '$': function(node, context) {+ var ctx = {subs: {}, code: '', partials: context.partials, prefix: node.n};+ Hogan.walk(node.nodes, ctx);
+ context.subs[node.n] = ctx.code;
+ if (!context.inPartial) {+ context.code += 't.sub("' + esc(node.n) + '",c,p,i);';+ }
+ },
+
+ '\n': function(node, context) {+ context.code += write('"\\n"' + (node.last ? '' : ' + i'));+ },
+
+ '_v': function(node, context) {+ context.code += 't.b(t.v(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,0)));';+ },
+
+ '_t': function(node, context) {+ context.code += write('"' + esc(node.text) + '"');+ },
+
+ '{': tripleStache,+
+ '&': tripleStache
+ }
+
+ function tripleStache(node, context) {+ context.code += 't.b(t.t(t.' + chooseMethod(node.n) + '("' + esc(node.n) + '",c,p,0)));';+ }
+
+ function write(s) {+ return 't.b(' + s + ');';+ }
+
+ Hogan.walk = function(nodelist, context) {+ var func;
+ for (var i = 0, l = nodelist.length; i < l; i++) {+ func = Hogan.codegen[nodelist[i].tag];
+ func && func(nodelist[i], context);
+ }
+ return context;
+ }
+
+ Hogan.parse = function(tokens, text, options) {+ options = options || {};+ return buildTree(tokens, '', [], options.sectionTags || []);
+ }
+
+ Hogan.cache = {};+
+ Hogan.cacheKey = function(text, options) {+ return [text, !!options.asString, !!options.disableLambda, options.delimiters, !!options.modelGet].join('||');+ }
+
+ Hogan.compile = function(text, options) {+ options = options || {};+ var key = Hogan.cacheKey(text, options);
+ var template = this.cache[key];
+
+ if (template) {+ var partials = template.partials;
+ for (var name in partials) {+ delete partials[name].instance;
+ }
+ return template;
+ }
+
+ template = this.generate(this.parse(this.scan(text, options.delimiters), text, options), text, options);
+ return this.cache[key] = template;
+ }
+})( true ? exports : Hogan);
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {+
+/*
+ * Copyright 2011 Twitter, Inc.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// This file is for use with Node.js. See dist/ for browser files.
+
+var Hogan = __webpack_require__(53);
+Hogan.Template = __webpack_require__(55).Template;
+Hogan.template = Hogan.Template;
+module.exports = Hogan;
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {+
+/*
+ * Copyright 2011 Twitter, Inc.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var Hogan = {};+
+(function (Hogan) {+ Hogan.Template = function (codeObj, text, compiler, options) {+ codeObj = codeObj || {};+ this.r = codeObj.code || this.r;
+ this.c = compiler;
+ this.options = options || {};+ this.text = text || '';
+ this.partials = codeObj.partials || {};+ this.subs = codeObj.subs || {};+ this.buf = '';
+ }
+
+ Hogan.Template.prototype = {+ // render: replaced by generated code.
+ r: function (context, partials, indent) { return ''; },+
+ // variable escaping
+ v: hoganEscape,
+
+ // triple stache
+ t: coerceToString,
+
+ render: function render(context, partials, indent) {+ return this.ri([context], partials || {}, indent);+ },
+
+ // render internal -- a hook for overrides that catches partials too
+ ri: function (context, partials, indent) {+ return this.r(context, partials, indent);
+ },
+
+ // ensurePartial
+ ep: function(symbol, partials) {+ var partial = this.partials[symbol];
+
+ // check to see that if we've instantiated this partial before
+ var template = partials[partial.name];
+ if (partial.instance && partial.base == template) {+ return partial.instance;
+ }
+
+ if (typeof template == 'string') {+ if (!this.c) {+ throw new Error("No compiler available.");+ }
+ template = this.c.compile(template, this.options);
+ }
+
+ if (!template) {+ return null;
+ }
+
+ // We use this to check whether the partials dictionary has changed
+ this.partials[symbol].base = template;
+
+ if (partial.subs) {+ // Make sure we consider parent template now
+ if (!partials.stackText) partials.stackText = {};+ for (key in partial.subs) {+ if (!partials.stackText[key]) {+ partials.stackText[key] = (this.activeSub !== undefined && partials.stackText[this.activeSub]) ? partials.stackText[this.activeSub] : this.text;
+ }
+ }
+ template = createSpecializedPartial(template, partial.subs, partial.partials,
+ this.stackSubs, this.stackPartials, partials.stackText);
+ }
+ this.partials[symbol].instance = template;
+
+ return template;
+ },
+
+ // tries to find a partial in the current scope and render it
+ rp: function(symbol, context, partials, indent) {+ var partial = this.ep(symbol, partials);
+ if (!partial) {+ return '';
+ }
+
+ return partial.ri(context, partials, indent);
+ },
+
+ // render a section
+ rs: function(context, partials, section) {+ var tail = context[context.length - 1];
+
+ if (!isArray(tail)) {+ section(context, partials, this);
+ return;
+ }
+
+ for (var i = 0; i < tail.length; i++) {+ context.push(tail[i]);
+ section(context, partials, this);
+ context.pop();
+ }
+ },
+
+ // maybe start a section
+ s: function(val, ctx, partials, inverted, start, end, tags) {+ var pass;
+
+ if (isArray(val) && val.length === 0) {+ return false;
+ }
+
+ if (typeof val == 'function') {+ val = this.ms(val, ctx, partials, inverted, start, end, tags);
+ }
+
+ pass = !!val;
+
+ if (!inverted && pass && ctx) {+ ctx.push((typeof val == 'object') ? val : ctx[ctx.length - 1]);
+ }
+
+ return pass;
+ },
+
+ // find values with dotted names
+ d: function(key, ctx, partials, returnFound) {+ var found,
+ names = key.split('.'),+ val = this.f(names[0], ctx, partials, returnFound),
+ doModelGet = this.options.modelGet,
+ cx = null;
+
+ if (key === '.' && isArray(ctx[ctx.length - 2])) {+ val = ctx[ctx.length - 1];
+ } else {+ for (var i = 1; i < names.length; i++) {+ found = findInScope(names[i], val, doModelGet);
+ if (found !== undefined) {+ cx = val;
+ val = found;
+ } else {+ val = '';
+ }
+ }
+ }
+
+ if (returnFound && !val) {+ return false;
+ }
+
+ if (!returnFound && typeof val == 'function') {+ ctx.push(cx);
+ val = this.mv(val, ctx, partials);
+ ctx.pop();
+ }
+
+ return val;
+ },
+
+ // find values with normal names
+ f: function(key, ctx, partials, returnFound) {+ var val = false,
+ v = null,
+ found = false,
+ doModelGet = this.options.modelGet;
+
+ for (var i = ctx.length - 1; i >= 0; i--) {+ v = ctx[i];
+ val = findInScope(key, v, doModelGet);
+ if (val !== undefined) {+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {+ return (returnFound) ? false : "";
+ }
+
+ if (!returnFound && typeof val == 'function') {+ val = this.mv(val, ctx, partials);
+ }
+
+ return val;
+ },
+
+ // higher order templates
+ ls: function(func, cx, partials, text, tags) {+ var oldTags = this.options.delimiters;
+
+ this.options.delimiters = tags;
+ this.b(this.ct(coerceToString(func.call(cx, text)), cx, partials));
+ this.options.delimiters = oldTags;
+
+ return false;
+ },
+
+ // compile text
+ ct: function(text, cx, partials) {+ if (this.options.disableLambda) {+ throw new Error('Lambda features disabled.');+ }
+ return this.c.compile(text, this.options).render(cx, partials);
+ },
+
+ // template result buffering
+ b: function(s) { this.buf += s; },+
+ fl: function() { var r = this.buf; this.buf = ''; return r; },+
+ // method replace section
+ ms: function(func, ctx, partials, inverted, start, end, tags) {+ var textSource,
+ cx = ctx[ctx.length - 1],
+ result = func.call(cx);
+
+ if (typeof result == 'function') {+ if (inverted) {+ return true;
+ } else {+ textSource = (this.activeSub && this.subsText && this.subsText[this.activeSub]) ? this.subsText[this.activeSub] : this.text;
+ return this.ls(result, cx, partials, textSource.substring(start, end), tags);
+ }
+ }
+
+ return result;
+ },
+
+ // method replace variable
+ mv: function(func, ctx, partials) {+ var cx = ctx[ctx.length - 1];
+ var result = func.call(cx);
+
+ if (typeof result == 'function') {+ return this.ct(coerceToString(result.call(cx)), cx, partials);
+ }
+
+ return result;
+ },
+
+ sub: function(name, context, partials, indent) {+ var f = this.subs[name];
+ if (f) {+ this.activeSub = name;
+ f(context, partials, this, indent);
+ this.activeSub = false;
+ }
+ }
+
+ };
+
+ //Find a key in an object
+ function findInScope(key, scope, doModelGet) {+ var val;
+
+ if (scope && typeof scope == 'object') {+
+ if (scope[key] !== undefined) {+ val = scope[key];
+
+ // try lookup with get for backbone or similar model data
+ } else if (doModelGet && scope.get && typeof scope.get == 'function') {+ val = scope.get(key);
+ }
+ }
+
+ return val;
+ }
+
+ function createSpecializedPartial(instance, subs, partials, stackSubs, stackPartials, stackText) {+ function PartialTemplate() {};+ PartialTemplate.prototype = instance;
+ function Substitutions() {};+ Substitutions.prototype = instance.subs;
+ var key;
+ var partial = new PartialTemplate();
+ partial.subs = new Substitutions();
+ partial.subsText = {}; //hehe. substext.+ partial.buf = '';
+
+ stackSubs = stackSubs || {};+ partial.stackSubs = stackSubs;
+ partial.subsText = stackText;
+ for (key in subs) {+ if (!stackSubs[key]) stackSubs[key] = subs[key];
+ }
+ for (key in stackSubs) {+ partial.subs[key] = stackSubs[key];
+ }
+
+ stackPartials = stackPartials || {};+ partial.stackPartials = stackPartials;
+ for (key in partials) {+ if (!stackPartials[key]) stackPartials[key] = partials[key];
+ }
+ for (key in stackPartials) {+ partial.partials[key] = stackPartials[key];
+ }
+
+ return partial;
+ }
+
+ var rAmp = /&/g,
+ rLt = /</g,
+ rGt = />/g,
+ rApos = /\'/g,
+ rQuot = /\"/g,
+ hChars = /[&<>\"\']/;
+
+ function coerceToString(val) {+ return String((val === null || val === undefined) ? '' : val);
+ }
+
+ function hoganEscape(str) {+ str = coerceToString(str);
+ return hChars.test(str) ?
+ str
+ .replace(rAmp, '&')
+ .replace(rLt, '<')
+ .replace(rGt, '>')
+ .replace(rApos, ''')
+ .replace(rQuot, '"') :
+ str;
+ }
+
+ var isArray = Array.isArray || function(a) {+ return Object.prototype.toString.call(a) === '[object Array]';
+ };
+
+})( true ? exports : Hogan);
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+var types = [
+ __webpack_require__(59),
+ __webpack_require__(58),
+ __webpack_require__(57),
+ __webpack_require__(60),
+ __webpack_require__(61)
+];
+var draining;
+var currentQueue;
+var queueIndex = -1;
+var queue = [];
+var scheduled = false;
+function cleanUpNextTick() {+ if (!draining || !currentQueue) {+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {+ queue = currentQueue.concat(queue);
+ } else {+ queueIndex = -1;
+ }
+ if (queue.length) {+ nextTick();
+ }
+}
+
+//named nextTick for less confusing stack traces
+function nextTick() {+ if (draining) {+ return;
+ }
+ scheduled = false;
+ draining = true;
+ var len = queue.length;
+ var timeout = setTimeout(cleanUpNextTick);
+ while (len) {+ currentQueue = queue;
+ queue = [];
+ while (currentQueue && ++queueIndex < len) {+ currentQueue[queueIndex].run();
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ queueIndex = -1;
+ draining = false;
+ clearTimeout(timeout);
+}
+var scheduleDrain;
+var i = -1;
+var len = types.length;
+while (++i < len) {+ if (types[i] && types[i].test && types[i].test()) {+ scheduleDrain = types[i].install(nextTick);
+ break;
+ }
+}
+// v8 likes predictible objects
+function Item(fun, array) {+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {+ var fun = this.fun;
+ var array = this.array;
+ switch (array.length) {+ case 0:
+ return fun();
+ case 1:
+ return fun(array[0]);
+ case 2:
+ return fun(array[0], array[1]);
+ case 3:
+ return fun(array[0], array[1], array[2]);
+ default:
+ return fun.apply(null, array);
+ }
+
+};
+module.exports = immediate;
+function immediate(task) {+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {+ for (var i = 1; i < arguments.length; i++) {+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(task, args));
+ if (!scheduled && !draining) {+ scheduled = true;
+ scheduleDrain();
+ }
+}
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {+
+exports.test = function () {+ if (global.setImmediate) {+ // we can only get here in IE10
+ // which doesn't handel postMessage well
+ return false;
+ }
+ return typeof global.MessageChannel !== 'undefined';
+};
+
+exports.install = function (func) {+ var channel = new global.MessageChannel();
+ channel.port1.onmessage = func;
+ return function () {+ channel.port2.postMessage(0);
+ };
+};
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {+//based off rsvp https://github.com/tildeio/rsvp.js
+//license https://github.com/tildeio/rsvp.js/blob/master/LICENSE
+//https://github.com/tildeio/rsvp.js/blob/master/lib/rsvp/asap.js
+
+var Mutation = global.MutationObserver || global.WebKitMutationObserver;
+
+exports.test = function () {+ return Mutation;
+};
+
+exports.install = function (handle) {+ var called = 0;
+ var observer = new Mutation(handle);
+ var element = global.document.createTextNode('');+ observer.observe(element, {+ characterData: true
+ });
+ return function () {+ element.data = (called = ++called % 2);
+ };
+};
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process) {+exports.test = function () {+ // Don't get fooled by e.g. browserify environments.
+ return (typeof process !== 'undefined') && !process.browser;
+};
+
+exports.install = function (func) {+ return function () {+ process.nextTick(func);
+ };
+};
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11)))
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {+
+exports.test = function () {+ return 'document' in global && 'onreadystatechange' in global.document.createElement('script');+};
+
+exports.install = function (handle) {+ return function () {+
+ // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
+ // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
+ var scriptEl = global.document.createElement('script');+ scriptEl.onreadystatechange = function () {+ handle();
+
+ scriptEl.onreadystatechange = null;
+ scriptEl.parentNode.removeChild(scriptEl);
+ scriptEl = null;
+ };
+ global.document.documentElement.appendChild(scriptEl);
+
+ return handle;
+ };
+};
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+exports.test = function () {+ return true;
+};
+
+exports.install = function (t) {+ return function () {+ setTimeout(t, 0);
+ };
+};
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports) {+
+/**
+ * Helpers.
+ */
+
+var s = 1000
+var m = s * 60
+var h = m * 60
+var d = h * 24
+var y = d * 365.25
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val+ * @param {Object} options+ * @throws {Error} throw an error if val is not a non-empty string or a number+ * @return {String|Number}+ * @api public
+ */
+
+module.exports = function (val, options) {+ options = options || {}+ var type = typeof val
+ if (type === 'string' && val.length > 0) {+ return parse(val)
+ } else if (type === 'number' && isNaN(val) === false) {+ return options.long ?
+ fmtLong(val) :
+ fmtShort(val)
+ }
+ throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val))+}
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str+ * @return {Number}+ * @api private
+ */
+
+function parse(str) {+ str = String(str)
+ if (str.length > 10000) {+ return
+ }
+ var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str)
+ if (!match) {+ return
+ }
+ var n = parseFloat(match[1])
+ var type = (match[2] || 'ms').toLowerCase()
+ switch (type) {+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n
+ default:
+ return undefined
+ }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms+ * @return {String}+ * @api private
+ */
+
+function fmtShort(ms) {+ if (ms >= d) {+ return Math.round(ms / d) + 'd'
+ }
+ if (ms >= h) {+ return Math.round(ms / h) + 'h'
+ }
+ if (ms >= m) {+ return Math.round(ms / m) + 'm'
+ }
+ if (ms >= s) {+ return Math.round(ms / s) + 's'
+ }
+ return ms + 'ms'
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms+ * @return {String}+ * @api private
+ */
+
+function fmtLong(ms) {+ return plural(ms, d, 'day') ||
+ plural(ms, h, 'hour') ||
+ plural(ms, m, 'minute') ||
+ plural(ms, s, 'second') ||
+ ms + ' ms'
+}
+
+/**
+ * Pluralization helper.
+ */
+
+function plural(ms, n, name) {+ if (ms < n) {+ return
+ }
+ if (ms < n * 1.5) {+ return Math.floor(ms / n) + ' ' + name
+ }
+ return Math.ceil(ms / n) + ' ' + name + 's'
+}
+
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+// modified from https://github.com/es-shims/es5-shim
+var has = Object.prototype.hasOwnProperty;
+var toStr = Object.prototype.toString;
+var slice = Array.prototype.slice;
+var isArgs = __webpack_require__(64);
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');+var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');+var dontEnums = [
+ 'toString',
+ 'toLocaleString',
+ 'valueOf',
+ 'hasOwnProperty',
+ 'isPrototypeOf',
+ 'propertyIsEnumerable',
+ 'constructor'
+];
+var equalsConstructorPrototype = function (o) {+ var ctor = o.constructor;
+ return ctor && ctor.prototype === o;
+};
+var excludedKeys = {+ $console: true,
+ $external: true,
+ $frame: true,
+ $frameElement: true,
+ $frames: true,
+ $innerHeight: true,
+ $innerWidth: true,
+ $outerHeight: true,
+ $outerWidth: true,
+ $pageXOffset: true,
+ $pageYOffset: true,
+ $parent: true,
+ $scrollLeft: true,
+ $scrollTop: true,
+ $scrollX: true,
+ $scrollY: true,
+ $self: true,
+ $webkitIndexedDB: true,
+ $webkitStorageInfo: true,
+ $window: true
+};
+var hasAutomationEqualityBug = (function () {+ /* global window */
+ if (typeof window === 'undefined') { return false; }+ for (var k in window) {+ try {+ if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {+ try {+ equalsConstructorPrototype(window[k]);
+ } catch (e) {+ return true;
+ }
+ }
+ } catch (e) {+ return true;
+ }
+ }
+ return false;
+}());
+var equalsConstructorPrototypeIfNotBuggy = function (o) {+ /* global window */
+ if (typeof window === 'undefined' || !hasAutomationEqualityBug) {+ return equalsConstructorPrototype(o);
+ }
+ try {+ return equalsConstructorPrototype(o);
+ } catch (e) {+ return false;
+ }
+};
+
+var keysShim = function keys(object) {+ var isObject = object !== null && typeof object === 'object';
+ var isFunction = toStr.call(object) === '[object Function]';
+ var isArguments = isArgs(object);
+ var isString = isObject && toStr.call(object) === '[object String]';
+ var theKeys = [];
+
+ if (!isObject && !isFunction && !isArguments) {+ throw new TypeError('Object.keys called on a non-object');+ }
+
+ var skipProto = hasProtoEnumBug && isFunction;
+ if (isString && object.length > 0 && !has.call(object, 0)) {+ for (var i = 0; i < object.length; ++i) {+ theKeys.push(String(i));
+ }
+ }
+
+ if (isArguments && object.length > 0) {+ for (var j = 0; j < object.length; ++j) {+ theKeys.push(String(j));
+ }
+ } else {+ for (var name in object) {+ if (!(skipProto && name === 'prototype') && has.call(object, name)) {+ theKeys.push(String(name));
+ }
+ }
+ }
+
+ if (hasDontEnumBug) {+ var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
+
+ for (var k = 0; k < dontEnums.length; ++k) {+ if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {+ theKeys.push(dontEnums[k]);
+ }
+ }
+ }
+ return theKeys;
+};
+
+keysShim.shim = function shimObjectKeys() {+ if (Object.keys) {+ var keysWorksWithArguments = (function () {+ // Safari 5.0 bug
+ return (Object.keys(arguments) || '').length === 2;
+ }(1, 2));
+ if (!keysWorksWithArguments) {+ var originalKeys = Object.keys;
+ Object.keys = function keys(object) {+ if (isArgs(object)) {+ return originalKeys(slice.call(object));
+ } else {+ return originalKeys(object);
+ }
+ };
+ }
+ } else {+ Object.keys = keysShim;
+ }
+ return Object.keys || keysShim;
+};
+
+module.exports = keysShim;
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var toStr = Object.prototype.toString;
+
+module.exports = function isArguments(value) {+ var str = toStr.call(value);
+ var isArgs = str === '[object Arguments]';
+ if (!isArgs) {+ isArgs = str !== '[object Array]' &&
+ value !== null &&
+ typeof value === 'object' &&
+ typeof value.length === 'number' &&
+ value.length >= 0 &&
+ toStr.call(value.callee) === '[object Function]';
+ }
+ return isArgs;
+};
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+var stringifyPrimitive = function(v) {+ switch (typeof v) {+ case 'string':
+ return v;
+
+ case 'boolean':
+ return v ? 'true' : 'false';
+
+ case 'number':
+ return isFinite(v) ? v : '';
+
+ default:
+ return '';
+ }
+};
+
+module.exports = function(obj, sep, eq, name) {+ sep = sep || '&';
+ eq = eq || '=';
+ if (obj === null) {+ obj = undefined;
+ }
+
+ if (typeof obj === 'object') {+ return map(objectKeys(obj), function(k) {+ var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+ if (isArray(obj[k])) {+ return map(obj[k], function(v) {+ return ks + encodeURIComponent(stringifyPrimitive(v));
+ }).join(sep);
+ } else {+ return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+
+ }
+
+ if (!name) return '';
+ return encodeURIComponent(stringifyPrimitive(name)) + eq +
+ encodeURIComponent(stringifyPrimitive(obj));
+};
+
+var isArray = Array.isArray || function (xs) {+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
+
+function map (xs, f) {+ if (xs.map) return xs.map(f);
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {+ res.push(f(xs[i], i));
+ }
+ return res;
+}
+
+var objectKeys = Object.keys || function (obj) {+ var res = [];
+ for (var key in obj) {+ if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+ }
+ return res;
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {+
+"use strict";
+
+
+var _bind = Function.prototype.bind;
+function toFactory(Class) {+ var Factory = function Factory() {+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {+ args[_key] = arguments[_key];
+ }
+
+ return new (_bind.apply(Class, [null].concat(args)))();
+ };
+ Factory.__proto__ = Class;
+ Factory.prototype = Class.prototype;
+ return Factory;
+}
+
+module.exports = toFactory;
+
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports) {+
+/* (ignored) */
+
+/***/ })
+/******/ ]);
+});
+//# sourceMappingURL=docsearch.js.map
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {+
+(function(window, factory) {+ var lazySizes = factory(window, window.document);
+ window.lazySizes = lazySizes;
+ if(typeof module == 'object' && module.exports){+ module.exports = lazySizes;
+ }
+}(window, function l(window, document) {+ 'use strict';
+ /*jshint eqnull:true */
+ if(!document.getElementsByClassName){return;}+
+ var lazySizesConfig;
+
+ var docElem = document.documentElement;
+
+ var Date = window.Date;
+
+ var supportPicture = window.HTMLPictureElement;
+
+ var _addEventListener = 'addEventListener';
+
+ var _getAttribute = 'getAttribute';
+
+ var addEventListener = window[_addEventListener];
+
+ var setTimeout = window.setTimeout;
+
+ var requestAnimationFrame = window.requestAnimationFrame || setTimeout;
+
+ var requestIdleCallback = window.requestIdleCallback;
+
+ var regPicture = /^picture$/i;
+
+ var loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];
+
+ var regClassCache = {};+
+ var forEach = Array.prototype.forEach;
+
+ var hasClass = function(ele, cls) {+ if(!regClassCache[cls]){+ regClassCache[cls] = new RegExp('(\\s|^)'+cls+'(\\s|$)');+ }
+ return regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];+ };
+
+ var addClass = function(ele, cls) {+ if (!hasClass(ele, cls)){+ ele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);+ }
+ };
+
+ var removeClass = function(ele, cls) {+ var reg;
+ if ((reg = hasClass(ele,cls))) {+ ele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));+ }
+ };
+
+ var addRemoveLoadEvents = function(dom, fn, add){+ var action = add ? _addEventListener : 'removeEventListener';
+ if(add){+ addRemoveLoadEvents(dom, fn);
+ }
+ loadEvents.forEach(function(evt){+ dom[action](evt, fn);
+ });
+ };
+
+ var triggerEvent = function(elem, name, detail, noBubbles, noCancelable){+ var event = document.createEvent('CustomEvent');+
+ event.initCustomEvent(name, !noBubbles, !noCancelable, detail || {});+
+ elem.dispatchEvent(event);
+ return event;
+ };
+
+ var updatePolyfill = function (el, full){+ var polyfill;
+ if( !supportPicture && ( polyfill = (window.picturefill || lazySizesConfig.pf) ) ){+ polyfill({reevaluate: true, elements: [el]});+ } else if(full && full.src){+ el.src = full.src;
+ }
+ };
+
+ var getCSS = function (elem, style){+ return (getComputedStyle(elem, null) || {})[style];+ };
+
+ var getWidth = function(elem, parent, width){+ width = width || elem.offsetWidth;
+
+ while(width < lazySizesConfig.minSize && parent && !elem._lazysizesWidth){+ width = parent.offsetWidth;
+ parent = parent.parentNode;
+ }
+
+ return width;
+ };
+
+ var rAF = (function(){+ var running, waiting;
+ var firstFns = [];
+ var secondFns = [];
+ var fns = firstFns;
+
+ var run = function(){+ var runFns = fns;
+
+ fns = firstFns.length ? secondFns : firstFns;
+
+ running = true;
+ waiting = false;
+
+ while(runFns.length){+ runFns.shift()();
+ }
+
+ running = false;
+ };
+
+ var rafBatch = function(fn, queue){+ if(running && !queue){+ fn.apply(this, arguments);
+ } else {+ fns.push(fn);
+
+ if(!waiting){+ waiting = true;
+ (document.hidden ? setTimeout : requestAnimationFrame)(run);
+ }
+ }
+ };
+
+ rafBatch._lsFlush = run;
+
+ return rafBatch;
+ })();
+
+ var rAFIt = function(fn, simple){+ return simple ?
+ function() {+ rAF(fn);
+ } :
+ function(){+ var that = this;
+ var args = arguments;
+ rAF(function(){+ fn.apply(that, args);
+ });
+ }
+ ;
+ };
+
+ var throttle = function(fn){+ var running;
+ var lastTime = 0;
+ var gDelay = 125;
+ var RIC_DEFAULT_TIMEOUT = 666;
+ var rICTimeout = RIC_DEFAULT_TIMEOUT;
+ var run = function(){+ running = false;
+ lastTime = Date.now();
+ fn();
+ };
+ var idleCallback = requestIdleCallback ?
+ function(){+ requestIdleCallback(run, {timeout: rICTimeout});+ if(rICTimeout !== RIC_DEFAULT_TIMEOUT){+ rICTimeout = RIC_DEFAULT_TIMEOUT;
+ }
+ }:
+ rAFIt(function(){+ setTimeout(run);
+ }, true)
+ ;
+
+ return function(isPriority){+ var delay;
+ if((isPriority = isPriority === true)){+ rICTimeout = 44;
+ }
+
+ if(running){+ return;
+ }
+
+ running = true;
+
+ delay = gDelay - (Date.now() - lastTime);
+
+ if(delay < 0){+ delay = 0;
+ }
+
+ if(isPriority || (delay < 9 && requestIdleCallback)){+ idleCallback();
+ } else {+ setTimeout(idleCallback, delay);
+ }
+ };
+ };
+
+ //based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html
+ var debounce = function(func) {+ var timeout, timestamp;
+ var wait = 99;
+ var run = function(){+ timeout = null;
+ func();
+ };
+ var later = function() {+ var last = Date.now() - timestamp;
+
+ if (last < wait) {+ setTimeout(later, wait - last);
+ } else {+ (requestIdleCallback || run)(run);
+ }
+ };
+
+ return function() {+ timestamp = Date.now();
+
+ if (!timeout) {+ timeout = setTimeout(later, wait);
+ }
+ };
+ };
+
+
+ var loader = (function(){+ var lazyloadElems, preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;
+
+ var eLvW, elvH, eLtop, eLleft, eLright, eLbottom;
+
+ var defaultExpand, preloadExpand, hFac;
+
+ var regImg = /^img$/i;
+ var regIframe = /^iframe$/i;
+
+ var supportScroll = ('onscroll' in window) && !(/glebot/.test(navigator.userAgent));+
+ var shrinkExpand = 0;
+ var currentExpand = 0;
+
+ var isLoading = 0;
+ var lowRuns = -1;
+
+ var resetPreloading = function(e){+ isLoading--;
+ if(e && e.target){+ addRemoveLoadEvents(e.target, resetPreloading);
+ }
+
+ if(!e || isLoading < 0 || !e.target){+ isLoading = 0;
+ }
+ };
+
+ var isNestedVisible = function(elem, elemExpand){+ var outerRect;
+ var parent = elem;
+ var visible = getCSS(document.body, 'visibility') == 'hidden' || getCSS(elem, 'visibility') != 'hidden';
+
+ eLtop -= elemExpand;
+ eLbottom += elemExpand;
+ eLleft -= elemExpand;
+ eLright += elemExpand;
+
+ while(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){+ visible = ((getCSS(parent, 'opacity') || 1) > 0);
+
+ if(visible && getCSS(parent, 'overflow') != 'visible'){+ outerRect = parent.getBoundingClientRect();
+ visible = eLright > outerRect.left &&
+ eLleft < outerRect.right &&
+ eLbottom > outerRect.top - 1 &&
+ eLtop < outerRect.bottom + 1
+ ;
+ }
+ }
+
+ return visible;
+ };
+
+ var checkElements = function() {+ var eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, beforeExpandVal;
+
+ if((loadMode = lazySizesConfig.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){+
+ i = 0;
+
+ lowRuns++;
+
+ if(preloadExpand == null){+ if(!('expand' in lazySizesConfig)){+ lazySizesConfig.expand = docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370;
+ }
+
+ defaultExpand = lazySizesConfig.expand;
+ preloadExpand = defaultExpand * lazySizesConfig.expFactor;
+ }
+
+ if(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){+ currentExpand = preloadExpand;
+ lowRuns = 0;
+ } else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){+ currentExpand = defaultExpand;
+ } else {+ currentExpand = shrinkExpand;
+ }
+
+ for(; i < eLlen; i++){+
+ if(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}+
+ if(!supportScroll){unveilElement(lazyloadElems[i]);continue;}+
+ if(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){+ elemExpand = currentExpand;
+ }
+
+ if(beforeExpandVal !== elemExpand){+ eLvW = innerWidth + (elemExpand * hFac);
+ elvH = innerHeight + elemExpand;
+ elemNegativeExpand = elemExpand * -1;
+ beforeExpandVal = elemExpand;
+ }
+
+ rect = lazyloadElems[i].getBoundingClientRect();
+
+ if ((eLbottom = rect.bottom) >= elemNegativeExpand &&
+ (eLtop = rect.top) <= elvH &&
+ (eLright = rect.right) >= elemNegativeExpand * hFac &&
+ (eLleft = rect.left) <= eLvW &&
+ (eLbottom || eLright || eLleft || eLtop) &&
+ ((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){+ unveilElement(lazyloadElems[i]);
+ loadedSomething = true;
+ if(isLoading > 9){break;}+ } else if(!loadedSomething && isCompleted && !autoLoadElem &&
+ isLoading < 4 && lowRuns < 4 && loadMode > 2 &&
+ (preloadElems[0] || lazySizesConfig.preloadAfterLoad) &&
+ (preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesConfig.sizesAttr) != 'auto')))){+ autoLoadElem = preloadElems[0] || lazyloadElems[i];
+ }
+ }
+
+ if(autoLoadElem && !loadedSomething){+ unveilElement(autoLoadElem);
+ }
+ }
+ };
+
+ var throttledCheckElements = throttle(checkElements);
+
+ var switchLoadingClass = function(e){+ addClass(e.target, lazySizesConfig.loadedClass);
+ removeClass(e.target, lazySizesConfig.loadingClass);
+ addRemoveLoadEvents(e.target, rafSwitchLoadingClass);
+ };
+ var rafedSwitchLoadingClass = rAFIt(switchLoadingClass);
+ var rafSwitchLoadingClass = function(e){+ rafedSwitchLoadingClass({target: e.target});+ };
+
+ var changeIframeSrc = function(elem, src){+ try {+ elem.contentWindow.location.replace(src);
+ } catch(e){+ elem.src = src;
+ }
+ };
+
+ var handleSources = function(source){+ var customMedia, parent;
+
+ var sourceSrcset = source[_getAttribute](lazySizesConfig.srcsetAttr);
+
+ if( (customMedia = lazySizesConfig.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){+ source.setAttribute('media', customMedia);+ }
+
+ if(sourceSrcset){+ source.setAttribute('srcset', sourceSrcset);+ }
+
+ //https://bugzilla.mozilla.org/show_bug.cgi?id=1170572
+ if(customMedia){+ parent = source.parentNode;
+ parent.insertBefore(source.cloneNode(), source);
+ parent.removeChild(source);
+ }
+ };
+
+ var lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){+ var src, srcset, parent, isPicture, event, firesLoad;
+
+ if(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){+
+ if(sizes){+ if(isAuto){+ addClass(elem, lazySizesConfig.autosizesClass);
+ } else {+ elem.setAttribute('sizes', sizes);+ }
+ }
+
+ srcset = elem[_getAttribute](lazySizesConfig.srcsetAttr);
+ src = elem[_getAttribute](lazySizesConfig.srcAttr);
+
+ if(isImg) {+ parent = elem.parentNode;
+ isPicture = parent && regPicture.test(parent.nodeName || '');
+ }
+
+ firesLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));+
+ event = {target: elem};+
+ if(firesLoad){+ addRemoveLoadEvents(elem, resetPreloading, true);
+ clearTimeout(resetPreloadingTimer);
+ resetPreloadingTimer = setTimeout(resetPreloading, 2500);
+
+ addClass(elem, lazySizesConfig.loadingClass);
+ addRemoveLoadEvents(elem, rafSwitchLoadingClass, true);
+ }
+
+ if(isPicture){+ forEach.call(parent.getElementsByTagName('source'), handleSources);+ }
+
+ if(srcset){+ elem.setAttribute('srcset', srcset);+ } else if(src && !isPicture){+ if(regIframe.test(elem.nodeName)){+ changeIframeSrc(elem, src);
+ } else {+ elem.src = src;
+ }
+ }
+
+ if(srcset || isPicture){+ updatePolyfill(elem, {src: src});+ }
+ }
+
+ if(elem._lazyRace){+ delete elem._lazyRace;
+ }
+ removeClass(elem, lazySizesConfig.lazyClass);
+
+ rAF(function(){+ if( !firesLoad || (elem.complete && elem.naturalWidth > 1)){+ if(firesLoad){+ resetPreloading(event);
+ } else {+ isLoading--;
+ }
+ switchLoadingClass(event);
+ }
+ }, true);
+ });
+
+ var unveilElement = function (elem){+ var detail;
+
+ var isImg = regImg.test(elem.nodeName);
+
+ //allow using sizes="auto", but don't use. it's invalid. Use data-sizes="auto" or a valid value for sizes instead (i.e.: sizes="80vw")
+ var sizes = isImg && (elem[_getAttribute](lazySizesConfig.sizesAttr) || elem[_getAttribute]('sizes'));+ var isAuto = sizes == 'auto';
+
+ if( (isAuto || !isCompleted) && isImg && (elem.src || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesConfig.errorClass)){return;}+
+ detail = triggerEvent(elem, 'lazyunveilread').detail;
+
+ if(isAuto){+ autoSizer.updateElem(elem, true, elem.offsetWidth);
+ }
+
+ elem._lazyRace = true;
+ isLoading++;
+
+ lazyUnveil(elem, detail, isAuto, sizes, isImg);
+ };
+
+ var onload = function(){+ if(isCompleted){return;}+ if(Date.now() - started < 999){+ setTimeout(onload, 999);
+ return;
+ }
+ var afterScroll = debounce(function(){+ lazySizesConfig.loadMode = 3;
+ throttledCheckElements();
+ });
+
+ isCompleted = true;
+
+ lazySizesConfig.loadMode = 3;
+
+ throttledCheckElements();
+
+ addEventListener('scroll', function(){+ if(lazySizesConfig.loadMode == 3){+ lazySizesConfig.loadMode = 2;
+ }
+ afterScroll();
+ }, true);
+ };
+
+ return {+ _: function(){+ started = Date.now();
+
+ lazyloadElems = document.getElementsByClassName(lazySizesConfig.lazyClass);
+ preloadElems = document.getElementsByClassName(lazySizesConfig.lazyClass + ' ' + lazySizesConfig.preloadClass);
+ hFac = lazySizesConfig.hFac;
+
+ addEventListener('scroll', throttledCheckElements, true);+
+ addEventListener('resize', throttledCheckElements, true);+
+ if(window.MutationObserver){+ new MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );+ } else {+ docElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);+ docElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);+ setInterval(throttledCheckElements, 999);
+ }
+
+ addEventListener('hashchange', throttledCheckElements, true);+
+ //, 'fullscreenchange'
+ ['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend', 'webkitAnimationEnd'].forEach(function(name){+ document[_addEventListener](name, throttledCheckElements, true);
+ });
+
+ if((/d$|^c/.test(document.readyState))){+ onload();
+ } else {+ addEventListener('load', onload);+ document[_addEventListener]('DOMContentLoaded', throttledCheckElements);+ setTimeout(onload, 20000);
+ }
+
+ if(lazyloadElems.length){+ checkElements();
+ rAF._lsFlush();
+ } else {+ throttledCheckElements();
+ }
+ },
+ checkElems: throttledCheckElements,
+ unveil: unveilElement
+ };
+ })();
+
+
+ var autoSizer = (function(){+ var autosizesElems;
+
+ var sizeElement = rAFIt(function(elem, parent, event, width){+ var sources, i, len;
+ elem._lazysizesWidth = width;
+ width += 'px';
+
+ elem.setAttribute('sizes', width);+
+ if(regPicture.test(parent.nodeName || '')){+ sources = parent.getElementsByTagName('source');+ for(i = 0, len = sources.length; i < len; i++){+ sources[i].setAttribute('sizes', width);+ }
+ }
+
+ if(!event.detail.dataAttr){+ updatePolyfill(elem, event.detail);
+ }
+ });
+ var getSizeElement = function (elem, dataAttr, width){+ var event;
+ var parent = elem.parentNode;
+
+ if(parent){+ width = getWidth(elem, parent, width);
+ event = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});+
+ if(!event.defaultPrevented){+ width = event.detail.width;
+
+ if(width && width !== elem._lazysizesWidth){+ sizeElement(elem, parent, event, width);
+ }
+ }
+ }
+ };
+
+ var updateElementsSizes = function(){+ var i;
+ var len = autosizesElems.length;
+ if(len){+ i = 0;
+
+ for(; i < len; i++){+ getSizeElement(autosizesElems[i]);
+ }
+ }
+ };
+
+ var debouncedUpdateElementsSizes = debounce(updateElementsSizes);
+
+ return {+ _: function(){+ autosizesElems = document.getElementsByClassName(lazySizesConfig.autosizesClass);
+ addEventListener('resize', debouncedUpdateElementsSizes);+ },
+ checkElems: debouncedUpdateElementsSizes,
+ updateElem: getSizeElement
+ };
+ })();
+
+ var init = function(){+ if(!init.i){+ init.i = true;
+ autoSizer._();
+ loader._();
+ }
+ };
+
+ (function(){+ var prop;
+
+ var lazySizesDefaults = {+ lazyClass: 'lazyload',
+ loadedClass: 'lazyloaded',
+ loadingClass: 'lazyloading',
+ preloadClass: 'lazypreload',
+ errorClass: 'lazyerror',
+ //strictClass: 'lazystrict',
+ autosizesClass: 'lazyautosizes',
+ srcAttr: 'data-src',
+ srcsetAttr: 'data-srcset',
+ sizesAttr: 'data-sizes',
+ //preloadAfterLoad: false,
+ minSize: 40,
+ customMedia: {},+ init: true,
+ expFactor: 1.5,
+ hFac: 0.8,
+ loadMode: 2
+ };
+
+ lazySizesConfig = window.lazySizesConfig || window.lazysizesConfig || {};+
+ for(prop in lazySizesDefaults){+ if(!(prop in lazySizesConfig)){+ lazySizesConfig[prop] = lazySizesDefaults[prop];
+ }
+ }
+
+ window.lazySizesConfig = lazySizesConfig;
+
+ setTimeout(function(){+ if(lazySizesConfig.init){+ init();
+ }
+ });
+ })();
+
+ return {+ cfg: lazySizesConfig,
+ autoSizer: autoSizer,
+ loader: loader,
+ init: init,
+ uP: updatePolyfill,
+ aC: addClass,
+ rC: removeClass,
+ hC: hasClass,
+ fire: triggerEvent,
+ gW: getWidth,
+ rAF: rAF,
+ };
+}
+));
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {+
+/**
urn String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"<em>";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"</em>";var o=document.createElement("div");o.appendChild(document.createTextNode(n));var s=document.createElement("div");return s.appendChild(document.createTextNode(t)),s.innerHTML.replace(RegExp(r(i.innerHTML),"g"),e).replace(RegExp(r(o.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var o=t.length;if(o===+o)for(var s=0;s<o;s++)e.call(i,t[s],s,t);else for(var a in t)n.call(t,a)&&e.call(i,t[a],a,t)}},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t){return JSON.parse(JSON.stringify(t))}},function(t,e,n){"use strict";function r(t,e){var r=n(2),i=this;"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):i.stack=(new Error).stack||"Cannot get a stacktrace, browser is too old",this.name="AlgoliaSearchError",this.message=t||"Unknown error",e&&r(e,function(t,e){i[e]=t})}function i(t,e){function n(){var n=Array.prototype.slice.call(arguments,0);"string"!=typeof n[0]&&n.unshift(e),r.apply(this,n),this.name="AlgoliaSearch"+t+"Error"}return o(n,r),n}var o=n(20);o(r,Error),t.exports={AlgoliaSearchError:r,UnparsableJSON:i("UnparsableJSON","Could not parse the incoming response as JSON, see err.more for details"),RequestTimeout:i("RequestTimeout","Request timedout before getting a response"),Network:i("Network","Network issue, see err.more for details"),JSONPScriptFail:i("JSONPScriptFail","<script> was loaded but did not call our provided callback"),JSONPScriptError:i("JSONPScriptError","<script> unable to load due to an `error` event on it"),Unknown:i("Unknown","Unknown error occured")}},function(t,e,n){(function(r){function i(){return"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}function o(){var t=arguments,n=this.useColors;if(t[0]=(n?"%c":"")+this.namespace+(n?" %c":" ")+t[0]+(n?"%c ":" ")+"+"+e.humanize(this.diff),!n)return t;var r="color: "+this.color;t=[t[0],r,"color: inherit"].concat(Array.prototype.slice.call(t,1));var i=0,o=0;return t[0].replace(/%[a-z%]/g,function(t){"%%"!==t&&(i++,"%c"===t&&(o=i))}),t.splice(o,0,r),t}function s(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(t){try{null==t?e.storage.removeItem("debug"):e.storage.debug=t}catch(t){}}function u(){try{return e.storage.debug}catch(t){}if(void 0!==r&&"env"in r)return n.i({NODE_ENV:"production"}).DEBUG}e=t.exports=n(50),e.log=s,e.formatArgs=o,e.save=a,e.load=u,e.useColors=i,e.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},e.enable(u())}).call(e,n(11))},function(t,e,n){var r=n(2);t.exports=function(t,e){var n=[];return r(t,function(r,i){n.push(e(r,i,t))}),n}},function(t,e,n){"use strict";var r=n(0),i={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left\ No newline at end of file
* @overview es6-promise - a tiny implementation of Promises/A+.
* @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
@@ -19,4 +11702,7 @@
unction(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"<em>";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"</em>";var o=document.createElement("div");o.appendChild(document.createTextNode(n));var s=document.createElement("div");return s.appendChild(document.createTextNode(t)),s.innerHTML.replace(RegExp(r(i.innerHTML),"g"),e).replace(RegExp(r(o.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var o=t.length;if(o===+o)for(var s=0;s<o;s++)e.call(i,t[s],s,t);else for(var a in t)n.call(t,a)&&e.call(i,t[a],a,t)}},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t){return JSON.parse(JSON.stringify(t))}},function(t,e,n){"use strict";function r(t,e){var r=n(2),i=this;"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):i.stack=(new Error).stack||"Cannot get a stacktrace, browser is too old",this.name="AlgoliaSearchError",this.message=t||"Unknown error",e&&r(e,function(t,e){i[e]=t})}function i(t,e){function n(){var n=Array.prototype.slice.call(arguments,0);"string"!=typeof n[0]&&n.unshift(e),r.apply(this,n),this.name="AlgoliaSearch"+t+"Error"}return o(n,r),n}var o=n(20);o(r,Error),t.exports={AlgoliaSearchError:r,UnparsableJSON:i("UnparsableJSON","Could not parse the incoming response as JSON, see err.more for details"),RequestTimeout:i("RequestTimeout","Request timedout before getting a response"),Network:i("Network","Network issue, see err.more for details"),JSONPScriptFail:i("JSONPScriptFail","<script> was loaded but did not call our provided callback"),JSONPScriptError:i("JSONPScriptError","<script> unable to load due to an `error` event on it"),Unknown:i("Unknown","Unknown error occured")}},function(t,e,n){(function(r){function i(){return"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}function o(){var t=arguments,n=this.useColors;if(t[0]=(n?"%c":"")+this.namespace+(n?" %c":" ")+t[0]+(n?"%c ":" ")+"+"+e.humanize(this.diff),!n)return t;var r="color: "+this.color;t=[t[0],r,"color: inherit"].concat(Array.prototype.slice.call(t,1));var i=0,o=0;return t[0].replace(/%[a-z%]/g,function(t){"%%"!==t&&(i++,"%c"===t&&(o=i))}),t.splice(o,0,r),t}function s(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(t){try{null==t?e.storage.removeItem("debug"):e.storage.debug=t}catch(t){}}function u(){try{return e.storage.debug}catch(t){}if(void 0!==r&&"env"in r)return n.i({NODE_ENV:"production"}).DEBUG}e=t.exports=n(50),e.log=s,e.formatArgs=o,e.save=a,e.load=u,e.useColors=i,e.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},e.enable(u())}).call(e,n(11))},function(t,e,n){var r=n(2);t.exports=function(t,e){var n=[];return r(t,function(r,i){n.push(e(r,i,t))}),n}},function(t,e,n){"use strict";var r=n(0),i={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionCh\ No newline at end of file
* @overview es6-promise - a tiny implementation of Promises/A+.
* @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
-(t,e,n){e=e||"<em>";var i=document.createElement("div");i.appendChild(document.createTextNode(e)),n=n||"</em>";var o=document.createElement("div");o.appendChild(document.createTextNode(n));var s=document.createElement("div");return s.appendChild(document.createTextNode(t)),s.innerHTML.replace(RegExp(r(i.innerHTML),"g"),e).replace(RegExp(r(o.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var o=t.length;if(o===+o)for(var s=0;s<o;s++)e.call(i,t[s],s,t);else for(var a in t)n.call(t,a)&&e.call(i,t[a],a,t)}},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t){return JSON.parse(JSON.stringify(t))}},function(t,e,n){"use strict";function r(t,e){var r=n(2),i=this;"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):i.stack=(new Error).stack||"Cannot get a stacktrace, browser is too old",this.name="AlgoliaSearchError",this.message=t||"Unknown error",e&&r(e,function(t,e){i[e]=t})}function i(t,e){function n(){var n=Array.prototype.slice.call(arguments,0);"string"!=typeof n[0]&&n.unshift(e),r.apply(this,n),this.name="AlgoliaSearch"+t+"Error"}return o(n,r),n}var o=n(20);o(r,Error),t.exports={AlgoliaSearchError:r,UnparsableJSON:i("UnparsableJSON","Could not parse the incoming response as JSON, see err.more for details"),RequestTimeout:i("RequestTimeout","Request timedout before getting a response"),Network:i("Network","Network issue, see err.more for details"),JSONPScriptFail:i("JSONPScriptFail","<script> was loaded but did not call our provided callback"),JSONPScriptError:i("JSONPScriptError","<script> unable to load due to an `error` event on it"),Unknown:i("Unknown","Unknown error occured")}},function(t,e,n){(function(r){function i(){return"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}function o(){var t=arguments,n=this.useColors;if(t[0]=(n?"%c":"")+this.namespace+(n?" %c":" ")+t[0]+(n?"%c ":" ")+"+"+e.humanize(this.diff),!n)return t;var r="color: "+this.color;t=[t[0],r,"color: inherit"].concat(Array.prototype.slice.call(t,1));var i=0,o=0;return t[0].replace(/%[a-z%]/g,function(t){"%%"!==t&&(i++,"%c"===t&&(o=i))}),t.splice(o,0,r),t}function s(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(t){try{null==t?e.storage.removeItem("debug"):e.storage.debug=t}catch(t){}}function u(){try{return e.storage.debug}catch(t){}if(void 0!==r&&"env"in r)return n.i({NODE_ENV:"production"}).DEBUG}e=t.exports=n(50),e.log=s,e.formatArgs=o,e.save=a,e.load=u,e.useColors=i,e.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},e.enable(u())}).call(e,n(11))},function(t,e,n){var r=n(2);t.exports=function(t,e){var n=[];return r(t,function(r,i){n.push(e(r,i,t))}),n}},function(t,e,n){"use strict";var r=n(0),i={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto\ No newline at end of file
+!function(t,e){ true?e():"function"==typeof define&&define.amd?define(e):e()}(0,function(){"use strict";function t(){var t=o.scrollY||o.pageYOffset,e=l.timeStamp,i="down"===d?Math.max:Math.min,p=f.offsetHeight-o.innerHeight;if(t=Math.max(0,t),t=Math.min(p,t),c.unshift({y:t,t:e}),c.pop(),t===i(m,t))return v=e,void(m=t);var b=e-u;if(b>v){m=t;for(var w=0;w<a&&(c[w]&&!(c[w].t<b));w+=1)m=i(m,c[w].y)}Math.abs(t-m)>s&&(m=t,v=e,d="down"===d?"up":"down",n.setAttribute(r,d))}function e(e){return l=e,o.requestAnimationFrame(t)}var i={el:document.documentElement,win:window,attribute:"data-scrolldir",dir:"down"},n=void 0,o=void 0,r=void 0,d=void 0,f=document.body,a=32,u=512,s=64,c=Array(a),l=void 0,m=void 0,v=0;!function(t){n=t&&t.el||i.el,o=t&&t.win||i.win,r=t&&t.attribute||i.attribute,d=t&&t.direction||i.dir,t&&!0===t.off?(n.setAttribute(r,"off"),o.removeEventListener("scroll",e)):(m=o.scrollY||o.pageYOffset,n.setAttribute(r,d),o.addEventListener("scroll",e))}()});+
+/***/ })
+/******/ ]);
\ No newline at end of file
--
⑨